图像处理黑科技—破解文档识别难题(PS检测、弯曲拉平、切边切片、摩尔纹)
一、文檔識別難題
我們通過視覺、聽覺、觸覺、嗅覺來認知周圍環境客觀物體。眼睛是我們探測周圍物體光線的接收器,它探測了物體的明暗、顏色、形狀和空間關系,人類對世界的感知 80% 是通過眼睛獲取,相比聽覺和觸覺來說,視覺更有沖擊力。
利用眼睛理解外部事物的過程通常就是視覺感知,視覺感知是人工智能當中特別重要的問題之一,在視覺感知中,文檔文字識別是非常重要的計算機視覺技術,因為文字是我們感知這個世界最重要的手段,文字可以說是人類文明的標志,是信息交流的途徑,學習知識的重要渠道,是記錄歷史、思想、文化的載體。
我們把 OCR 比做 AI 技術的一雙慧眼,幫助人工智能看清所有需要處理的文字內容、符號信息,然而目前低質文檔圖像的識別問題似乎已經成為 AI 技術落地中的瓶頸,文檔圖像作為一種非結構化數據,其分析識別面臨一些技術難點:
低質文檔圖像難以識別:圖文混合、區域形狀不規則、變形文檔質量退化嚴重,如下圖產生了極大的摩爾紋,為圖像識別帶來極大困難;
場景文本的文字檢測及版面分析困難:自然場景圖像的背景復雜、光照和拍照視角變化、文本行方向和形狀變化、字體風格和顏色變化等,,如下圖手機拍照時角度傾斜,視角奇葩,文本準確定位提取非常困難;
無法檢測過濾 PS 技術篡改:身份證、護照、行駛證、駕駛證、港澳通信證等證照類別,及增值稅發票、普通發票、小票、合同等文檔篡改后無法檢測出是否真實,PS 智能檢測在反欺詐、合規風控等領域意義重大。如下圖證件修改過字和有效期數字,這為識別帶來了新的困難;
二、技術分析
2.1、切邊切片增強
2.1.1、技術介紹
目前自帶的數碼相機已經成為了手機等移動設備的標準配置,這些數字成像設備經常被用來拍攝各種文本圖像,由于拍攝習慣,取景需求等的不同,用戶拍攝到的文本圖像,一般是包含有背景的,而用戶需要的圖像,通常是去掉了背景區域的圖像。在票據識別、PPT 拍攝、名片識別、文稿備份時就需要用到切邊切片技術。如下圖所示:切邊后圖像可以更好的展示并提升下游任務(OCR 識別,信息抽取等)的準確率。
2.1.2、原理分析
對普通圖像的切邊切片的步驟如下:1.加載圖像;2.對圖像進行灰度化;3.邊緣檢測;4.輪廓發現;5.找出符合目標的最大外接矩形,并使用矩形的四個坐標點繪制線;6 切除 ROI(感興趣區域);7.顯示 ROI 區域。
對旋轉圖像的切邊切片的步驟如下:1.加載原圖;2.對圖像進行灰度化;3.邊緣檢測;4.輪廓發現;5.找出圖像旋轉角度(a.找出旋轉矩形的最大寬和最大高 b.找出這個目標矩形的旋轉角度及旋轉矩形。c.把此矩形繪制出來);6.根據圖片中心點及旋轉角度,制作目標旋轉矩陣;7.利用仿射變換 + 第 6 步的旋轉矩陣實現最終的旋轉(仿射變換在圖像還原、圖像局部變化處理方面有重要意義);8.顯示最終圖像。
仿射變換是指在向量空間中進行一次線性變換和一次平移變換到另一個向量空間的過程,仿射變換可以通過一系列的原子變換的復合來實現,包括:平移、旋轉和翻折;縮放、錯切。沒有平移或者平移量為 0 的所有仿射變換都可以叫線性變換,線性變換可以用如下變換矩陣描述:
[x′y′]=[abcd][xy]\left[\begin{array}{l} x^{\prime} \\ y^{\prime} \end{array}\right]=\left[\begin{array}{ll} a & b \\ c & d \end{array}\right]\left[\begin{array}{l} x \\ y \end{array}\right][x′y′?]=[ac?bd?][xy?]
不同變換對應的 a,b,c,d 約束不同,可以看上式,比如尺度變換的約束 a 就是 α,約束 d 就是 β,b 和 c 為 0,這樣 x‘=αx,y’=βy 就是將圖像沿著 x 軸放縮 α 倍,沿 y 軸放縮 β 倍。
而為了涵蓋平移變換,需要給矩陣加一個維度,如下:
[x′y′1]=[abcdef001][xy1]\left[\begin{array}{l} x^{\prime} \\ y^{\prime} \\ 1 \end{array}\right]=\left[\begin{array}{lll} a & b & c \\ d & e & f \\ 0 & 0 & 1 \end{array}\right]\left[\begin{array}{l} x \\ y \\ 1 \end{array}\right]???x′y′1????=???ad0?be0?cf1???????xy1????
對應的約束有:a,b,c,d,e,f,即具有 6 個自由度,不同基礎變換的 a,b,c,d,e,f 約束不同。平移變換時,b=0,d=0,a=1,b=1,c=λ,f=θ,那么 x‘=x+λ,y‘=y+θ,就是將圖像沿 x 軸平移 λ 位,將圖像沿 y 軸平移 θ 位。
為了使圖像能夠旋轉,我們加入了三角函數,最終的矩陣變換我們定義為:
[scos?(θ)?ssin?(θ)txssin?(θ)scos?(θ)ty001][xy1]=[x′y′1]\left[\begin{array}{ccc} s \cos (\theta) & -s \sin (\theta) & t_{x} \\ s \sin (\theta) & s \cos (\theta) & t_{y} \\ 0 & 0 & 1 \end{array}\right]\left[\begin{array}{l} x \\ y \\ 1 \end{array}\right]=\left[\begin{array}{l} x^{\prime} \\ y^{\prime} \\ 1 \end{array}\right]???scos(θ)ssin(θ)0??ssin(θ)scos(θ)0?tx?ty?1???????xy1????=???x′y′1????
最終的仿射變換就是線性變換和平移變換如此疊加而來的,仿射變換能夠給予圖片放縮、旋轉、平移、偏移等幾何變換功能。
2.2、彎曲矯正拉平
2.2.1、技術介紹
不同于平面掃描儀獲得的文檔圖像,由手持鏡頭拍照得到的文檔圖像往往含有幾何形變以及環境背景的干擾。這會使得現有文檔信息抽取和內容分析系統的性能下降。如紙張的內容歪斜扭曲,部分紙張本身就不平整,存在過折疊、皺紋的畸變問題且本身厚度造成拍照過程中存在的圖像的彎曲畸變。如下圖所示形變矯正后圖像能夠更好的展示,并能顯著提升下游任務(OCR 識別,版面分析/還原等)的準確率。
2.2.2、原理分析
DocUNet:具有中間監督的堆疊圖像解扭曲網絡
DocUNet 依賴于卷積神經網絡(CNN)進行端到端圖像恢復。模型由兩個 U-Net 組成。其中,U-Net 是一個完全卷積網絡,它包含一系列下采樣層和一系列上采樣層。特征圖在下采樣層和上采樣層之間連接。然而,單個 U-Net 的輸出無法完成工作,受連續預測和漸進精化工作的啟發,文章將另一個 U-Net 作為精化器疊加在第一個 U-Net 的輸出端。第一個 U-Net 在最后一個反褶積層之后分裂,而第一個 U-Net 和中間預測 y1 的反卷積特征被連接在一起作為第二個 U-Net 的輸入。第二個 U-Net 最終給出精確的預測。
DewarpNet:使用堆疊的 3D 和 2D 回歸網絡對單圖像文檔進行解扭曲
DewarpNet 由兩個子網絡組成:形狀網絡和紋理映射網絡。此外,文章還提出了一個用于光照效果調整的后處理增強細化網絡,該模塊可以在視覺上改善未旋轉的圖像。
形狀網絡:將此回歸任務表述為圖像到圖像的轉換問題。形狀網絡將 I 的每個像素轉換為 3D 坐標圖,C∈ Rh×w×3,其中每個像素值(X,Y,Z)對應于文檔形狀的 3D 坐標。在設計形狀網絡時,文章使用跳連接的 U-Net 型編碼器-解碼器架構。
紋理映射網絡:以三維坐標映射 C 為輸入,輸出后向映射 B。在紋理映射網絡中,采用了一種多 DenseNet 塊的編解碼結構。
細化網絡:作為后處理組件以調整校正圖像中的照明效果。該網絡不僅提高了結果的感知質量,而且提高了 OCR 性能。文章利用 Doc3D 數據集中的額外地面真實信息(即表面法線和反照率地圖)來訓練細化網絡。細化網絡有兩個 U-Net 型編碼器解碼器:一個用于預測曲面法線 N∈ ×3 給定輸入圖像 I;另一個以 I 和對應的 N 作為輸入并估計陰影圖 S∈ Rh×w×3.S 描述陰影強度和顏色。
2.3、摩爾紋去除
2.3.1、技術介紹
當感光元件像素的空間頻率與影像中條紋的空間頻率接近時,可能產生一種新的波浪形的干擾圖案,即所謂的摩爾紋,最形象來說,我們用手機拍攝電腦、電視上的畫面,或者拍攝條紋和格子的衣服時,拍出來的照片上總是有奇奇怪怪的彩色條紋,這些紋理由摩爾效應引起的。摩爾效應是一種特殊的光學現象,它是兩條線或兩個物體之間以固定的角度和頻率發生干涉后產生的視覺效果。如下圖所示:
而摩爾紋去除,可以幫助消除屏幕紋對畫質的干擾,提高圖像、文字清晰度,如下圖運用摩爾紋去除網絡后,圖像質量明顯提升:
2.3.2、原理分析
基于多分辨率卷積神經網絡的摩爾紋圖像恢復
網絡架構如上圖所示,其中包括不同分辨率的多個并行分支,圖像輸入為 2562563,使用非線性激活函數 + 卷積核。可以看到:
(1)網絡中不采用池化層,通過步長為 2 的卷積核來代替池化操作。
(2)下采樣過程中大量使用 3*3 卷積核,步長為 1。
(3)在反卷積過程中,增大了圖像分辨率,生成 3 通道像素圖,最后通過疊加完成輸出。
頂部的分支以輸入圖像的原始分辨率處理特征映射,而其他分支處理越來越粗糙的特征映射。每個分支中的前兩個卷積層形成一個組,在所有分支的前兩個卷積層之后生成的特征圖可以堆疊在一起以形成倒置金字塔。金字塔使用非線性“濾波器”(即卷積核 + 非線性激活函數)計算。然后通過將輸入圖像轉換為不同分辨率的多個特征圖,在輸入圖像中顯示不同級別的細節。更重要的是,在網絡中,每個分辨率都與一個網絡分支相關聯,其中六個堆疊卷積層保持相同的分辨率。 這樣的網絡分支能夠執行復雜的非線性變換(例如去除特定頻帶內的摩爾紋),并且比 U-Net 中的跳過連接(Skip Connection)更強大。
在每個分支內,前兩層的輸出特征圖被饋送到級聯卷積層序列中。這些卷積層保持相同的輸入和輸出分辨率,并且不執行任何下采樣或池操作。他們負責消除與該分支的特定頻帶相關的莫爾效應的核心任務,另外在這個序列中放置了多個卷積層(通常為 5 個),每個卷積層具有 3×3 個核和 64 個通道。
為了將所有并行分支的變換結果組合到一個完整的輸出圖像中,需要將級聯卷積層生成的特征圖的分辨率提高到除第一個分支外的每個分支內輸入圖像的原始分辨率。在從頂部開始的第 i 個分支中,模型使用一組 i?1 個反卷積層來實現這一目標。每個反卷積層使輸入分辨率加倍。在每個分支內的反褶積層之后有一個額外的卷積層。這個額外的層生成一個只有 3 個通道的特征圖。該特征圖基本上消除了與該分支的頻帶相關聯的摩爾圖案(在輸入圖像中)的分量。最后,來自所有分支的最終 3 通道特征圖被簡單地相加在一起,以產生去除莫爾紋圖案的最終輸出圖像。
三、黑科技體驗
日前舉行的 2022 中國圖像圖形大會《ocr 前沿技術與產業應用》論壇上,合合信息公司自然語言算法研發總監丁凱博士介紹的該公司智能文字識別及圖像處理技術,被參加論壇的中科院、北京大學、聯想研究院等頂尖科研機構的專家,一致認為是破解難題的“鑰匙”。
經過體驗,合合信息公司智能文字識別及圖像處理技術,通過引入ai(人工智能)技術,能夠幫助各應用領域簡化下游文檔處理任務,提升文字識別效率與準確性。
筆者在研究圖像處理時也深入體驗了一次他們的黑科技。
3.1、功能介紹
官網提供了高精準度的智能文字識別引擎及場景化產品,支持多種部署方式,可以幫助提升文檔處理流程的效率。包括證件識別、圖像切邊切片、PS 檢測、自動擦除手寫文章、去除摩爾紋、圖像矯正、水印去除、文檔轉換等等。
下面我們挑選最感興趣的文檔圖像切邊矯正和 PS 檢測進行體驗。
3.2、文檔圖像切邊矯正
文檔圖像切邊矯正功能可以智能定位圖像中文檔主體的邊緣,并進行背景切除 (文檔提取),對形變文檔進行矯正。
官網提供了 API 調用的接口和文檔:
請求 URL:https://api.textin.com/ai/service/v1/dewarp
HTTP 請求方法:HTTP POST
請求頭說明(Request Header)
URL 參數
請求體說明(Request Body)
Content-Type: application/octet-stream
要上傳的圖片,目前支持 jpg, png, bmp, pdf, tiff, 單幀 gif 等大部分格式.
響應體說明(Response Data)
Content-Type: application/json。JSON 結構說明如下:
JSON結構示例
于是,我們可以使用 html 代碼調用接口:
<!doctype html> <html lang="zh-CN"> <head><meta charset="UTF-8"><title>服務集成演示</title> </head> <body><h2>上傳文件</h2> <div><input type="file" id="file"> </div><script>document.querySelector('#file').addEventListener('change', function(e) {var file = e.target.files[0] // 上傳文件的 File 對象var reader = new FileReader()reader.readAsArrayBuffer(file) // 讀取成二進制reader.onload = function (e) {var fileData = this.resultvar xhr = new XMLHttpRequest()// --------------------------------------------------------------------var appId = 'c81f*************************e9ff'// 請登錄后前往 “工作臺-賬號設置-開發者信息” 查看 x-ti-secret-code// 示例代碼中 x-ti-secret-code 非真實數據var secretCode = '5508***********************1c17'// 文檔圖像切邊矯正 服務URLvar url = 'https://api.textin.com/ai/service/v1/dewarp'xhr.open('POST', url)xhr.setRequestHeader('x-ti-app-id', appId)xhr.setRequestHeader('x-ti-secret-code', secretCode)xhr.onreadystatechange = function () {if (xhr.readyState === 4) {xhr.onreadystatechange = nullvar response = xhr.responsevar obj = {}try {obj = JSON.parse(response) // 轉化為對象} catch (e) {}if (!obj.result) returnvar list = obj.result.item_listif (!list || !list.length) returnconsole.log(list)}}xhr.send(fileData)}})</script> </body> </html>我們使用一副傾斜角度的圖像進行測試:
上傳圖片后,顯示成功調用 API,JSON 對象返回如下,message:success 表示成功,result image 表示的是修正后的圖像的 base64 表示。
我們使用
解碼 base64 格式的字符串,得到圖像,發現調用成功,圖像被成功矯正了
3.2、PS 檢測
另外一個很牛的就是 PS 檢測系統,基于行業領先的自研篡改檢測系統,可判斷圖片是否被篡改,支持身份證、護照、行駛證、駕駛證、港澳通信證等證照類別,及增值稅發票、普通發票、小票、合同等文檔類別。
網站提供了豐富的 API 調用接口和文檔
請求 URL:https://api.textin.com/ai/service/v1/manipulation_detection
HTTP 請求方法:HTTP POST
請求頭說明(Request Header)
URL 參數
請求體說明(Request Body)
Content-Type: application/octet-stream
要上傳的圖片,目前支持 jpg, png, bmp, pdf, tiff, webp, 單幀 gif 等大部分格式
響應體說明(Response Data)
JSON 結構說明如下:
JSON結構示例
{"code": 200,"message": "success","version": "1.0.1","duration": 100,"result": {"image_width": 1024,"image_height": 1024,"image_property": {"ps": {"image": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBD","is_tampered": 1,"positions": [[38,88,42,8,42,12,38,12],[48,88,52,8,52,12,48,12]]}}} }這次我們使用 java 代碼調用接口:
import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.io.IOException;public class Main {public static void main(String[] args) throws Exception {// PS檢測String url = "https://api.textin.com/ai/service/v1/manipulation_detection";// 請登錄后前往 “工作臺-賬號設置-開發者信息” 查看 x-ti-app-id// 示例代碼中 x-ti-app-id 非真實數據String appId = "c81f*************************e9ff";// 請登錄后前往 “工作臺-賬號設置-開發者信息” 查看 x-ti-secret-code// 示例代碼中 x-ti-secret-code 非真實數據String secretCode = "5508***********************1c17";BufferedReader in = null;DataOutputStream out = null;String result = "";try {byte[] imgData = readfile("example.jpg"); // imageURL realUrl = new URL(url);HttpURLConnection conn = (HttpURLConnection)realUrl.openConnection();conn.setRequestProperty("connection", "Keep-Alive");conn.setRequestProperty("Content-Type", "application/octet-stream");conn.setRequestProperty("x-ti-app-id", appId);conn.setRequestProperty("x-ti-secret-code", secretCode);conn.setDoOutput(true);conn.setDoInput(true);conn.setRequestMethod("POST"); // 設置請求方式out = new DataOutputStream(conn.getOutputStream());out.write(imgData);out.flush();out.close();in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));String line;while ((line = in.readLine()) != null) {result += line;}} catch (Exception e) {System.out.println("發送 POST 請求出現異常!" + e);e.printStackTrace();}finally {try {if (out != null) {out.close();}if (in != null) {in.close();}} catch (IOException ex) {ex.printStackTrace();}}System.out.println(result);}public static byte[] readfile(String path){String imgFile = path;InputStream in = null;byte[] data = null;try{in = new FileInputStream(imgFile);data = new byte[in.available()];in.read(data);in.close();}catch (IOException e) {e.printStackTrace();}return data;}}同樣,我們使用一張被 PS 篡改過后的圖像進行測試,調用接口運行后,返回 json 為:
我們打開 imageproperty,查找 ps 中的 is_tampered,代碼顯示為 1,即表明檢測到這幅圖像被 PS 修改過,返回 image 圖像為檢測到修改的地方的圖像。
四、總結
經過技術分析,目前低質文檔圖像的識別問題似乎已經成為 AI 技術落地中的瓶頸,文檔圖像作為一種非結構化數據,其分析識別確實存在不少技術難點。
合合信息專注于智能文字識別、圖像處理、自然語言處理(NLP)、知識圖譜、大數據挖掘等技術。基于自主研發的領先的智能文字識別及商業大數據核心技術,為全球 C 端用戶和多元行業 B 端客戶提供數字化、智能化的產品及服務。
合合信息 C 端產品方面的落地非常成熟,掃描全能王(智能掃描及文字識別 APP)、名片全能王(智能名片及人脈管理 APP)、啟信寶(企業商業信息查詢 APP)這些耳熟能詳的產品覆蓋了全球百余個國家和地區的億級用戶;
而 B 端業務如合合旗下智能文字識別服務平臺 TextIn,為面向企業客戶提供以智能文字識別、商業大數據為核心的服務,形成了包括基礎技術服務、標準化服務和場景化解決方案的業務矩陣,滿足客戶降本增效、風險管理、智能營銷等多元需求。
在體驗過程中,TextIn 智能文字識別引擎可以從圖像和 PDF 文檔中提取印刷、手寫、印章、公式、表格、圖片等富文本信息,支持 50+ 多語言識別,眾多文檔類型,包括商業文件、發票、賬單、收據、名片和海報。在財務共享系統中可以從混貼的發票中切分、分類、提取字段信息,支持發票中錯行、傾斜、重疊、遮擋、形變、光照不均等復雜場景;在證件識別系統中支持 13 類國家證件識別,覆蓋個人和企業所需的 200+ 種證件識別;在人機結合系統中實現精準 100% 識別,遠超越人類的辨識度;此外引擎提供了豐富的方便的 API 調用方法和文檔,且在通用場景中平均 1s 處理完一張文本圖像,用起來非常便捷迅速。
總結
以上是生活随笔為你收集整理的图像处理黑科技—破解文档识别难题(PS检测、弯曲拉平、切边切片、摩尔纹)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java学习资料--网盘分享
- 下一篇: C语言 冒泡排序