宜信OCR技術探索與實踐|完整視頻回放
分享實錄
一、OCR概述
1.1 OCR技術演進
-
傳統圖像,岡薩雷斯的圖像處理。
-
信號處理、頻域分析以及各類算法:SIFT、HOG、HOUGH、Harris、Canny…都很贊。
-
從2016年以後業界基本上都已經轉向深度了,因爲效果真的特別好。
1.2 OCR技術商業服務
-
身份證卡證類相對容易些,但是要做到複雜場景的,也不是那麼容易。
-
發票、業務單據相對複雜,除了識別,更重要的是版面分析。
-
最近表格識別比較火,各家都在努力實現,微軟的開放tablebank數據集
-
移動端backboneMobileNet,或者是tesseract+opencv
二、我們的業務場景
2.1 業務需求
滿足業務是第一需要,不同於大廠,對外服務API,要求大併發那麼強,多樣性品類完備,我們更強調單品要做到儘量達到業務要求,更強調定製化,可以分佈走,業務上可以給反饋不斷改進。
2.2 識別過程中需要解決的問題
三、OCR算法詳解
3.1 算法概述——分享原則
大家一定要自己弄細節,讀代碼、甚至自己動手擼,自己訓練,調參,排錯,纔能有真正的體會和理解,只講我認爲每個算法裏面不太好理解,重點,以及容易忽略的點,跟同行一起交流,溝通。
一個模型,要全面深入瞭解,需要:
-
目標、目的、意義是啥?
-
網絡結構啥樣?
-
loss是啥?
-
樣本咋做?
-
後處理幹了啥
3.2 算法概述——三大板塊
-
文字檢測:把文字框住,縮小到最小範圍內,從而降低識別難度。
-
文字識別:檢測出文字後,就可以通過識別工具(算法)來識別出文字,如中間圖。
-
版面分析:當文字識別出來後,我們得出的是文字和相應的座標,可是當真正業務中要得到的不僅僅是這個,需要有一個結構,如何通過識別出的文字排版成爲一個有邏輯結構的單據或者內容,這個工作也超級複雜。關於版面分析這方面,後面會有團隊裏面經驗非常豐富的夥伴和大家分享。
3.3 算法概述——檢測算法
-
表中從下往上的檢測算法排序按照效果:越來越好
-
從anchorbased(也就是右邊所示的最下面的那張圖),現在逐漸轉向pixel-based(像素級別)(右邊所示的中間的那張圖),主要是語義分割的技術效果實在是太好了。
CTPN:找框的一個算法。
預測最終結果是:10個anchor的y座標偏移,和高度的調整值,還有它是不是前景的概率。輸出是前後景概率[N,10,2],y、w調整值[N,10,2]。它只適合橫向,或者縱向,不能同時。
-
一個模型主要從以下幾個方面理解
-
亮點和核心思路是:預測框和文本線構造算法
-
loss是啥(損失函數):anchor前後景概率、y、w調整
-
label怎麼做:大框,弄成小框,然後正負樣本均衡
-
後處理
-
算法被命名爲EAST(Efficient and Accuracy Scene Text),因爲它是一個高效和準確的場景文本檢測pipeline。
-
首先,將圖像送到FCN網絡結構中並且生成單通道像素級的文本分數特徵圖和多通道幾何圖形特徵圖。文本區域採用了兩種幾何形狀:旋轉框(RBOX)和水平(QUAD),併爲每個幾何形狀設計了不同的損失函數;然後,將閾值應用於每個預測區域,其中評分超過預定閾值的幾何形狀被認爲是有效的,並且保存以用於隨後的非極大抑制。NMS之後的結果被認爲是pipeline的最終結果。
-
最後預測:scoremap,textbox,textrotation
-
標註是:一個蒙版mask,一個4張圖,上下左右的距離,還有個角度:一共3個。
-
對應就可以出loss了。每個點預測出來,加上角度,就是1個框,太多了框,所以要做LANMS(合併算法)的合併。爲何不直接用socremap,我認爲是置信度不夠,所以要再加上bbox來加強驗證。
PSENet是一種新的實例分割網絡,它有兩方面的優勢。首先,psenet作爲一種基於分割的方法,能夠對任意形狀的文本進行定位.其次,該模型提出了一種漸進的尺度擴展算法,該算法可以成功地識別相鄰文本實例。
-
FPN,左面用resnet50。爲何是resnet50,原因是效果不錯,參數適中。
-
論文裏是6個尺度,一個不行麼?我理解是徹底分開不同行,逐漸擴大,漸進尺度可以防止彼此交叉哈
-
FPN和UNET都是concat,FCN是add,這個細節。
- 使用DB模塊之後,二值化操作就變成了可微的,可以加到網絡裏一起訓練。
網絡輸出
-
probabilitymap,代表像素點是文本的概率
-
thresholdmap,每個像素點的閾值
-
binarymap,由1,2計算得到,計算公式爲DB公式
label製作
-
probabilitymap, 按照pse的方式製作即可,收縮比例設置爲0.4
-
thresholdmap, 將文本框分別向內向外收縮和擴張d(根據第一步收縮時計算得到)個像素,然後計算收縮框和擴張框之間差集部分裏每個像素點到原始圖像邊界的歸一化距離。
3.4 算法概述——識別算法
- Atttenion:Attention-basedExtraction of Structured Information from Street View Imagery-2017最早的嘗試
非常經典的算法,主要的核心是CTC算法:Connectionist Temporal Classification (CTC)適合那種不知道輸入輸出是否對齊的情況使用的算法,所以CTC適合語音識別和手寫字符識別的任務。
缺點:不能精確地聯繫特徵向量與輸入圖像中對應的目標區域,這種現象稱爲attention drift。
Muturaltraining:
-
我們知道什麼?什麼字符,第幾個?這個信息!
-
哪個字符?找到那個字符,第幾個?然後和樣本里的順序比
-
第幾個是啥字符?和對應位置的字符比
-
所以樣本中不能存在重複字符。
四、我們的實踐
4.1 實踐之路
-
非單據:寬高比,白像素比例等
-
旋轉角整:前面講過了,通過旋轉模型,以及投影分佈
-
多單據:多張單據在一起,通過投影,閾值超參配置
-
表格識別:採用mask-rcnn的方法,來找出大表邊緣
-
後處理:通過NLP糾錯,後面會詳細的講
4.2 實踐之路——旋轉模型
大方向判斷
第一版:
-
VGG做backbone,全連接,四分類
-
樣本:人工標註、增強
-
正確率90%
第二版:
-
做切割,256x256
-
使用MSER找備選
-
訓練小圖
-
衆數選出最可能方向
-
正確率99.7%
微調
-
每旋轉1°做縱向投影
-
方差最大的角度爲微調角度
4.3 我們遇到的坑
-
把crnn論文論文中的自定義cnn網絡,換成resnet,但是resnet是縮小32倍,所以要拉長一些,到512。
-
首先是:樣本集是1000萬 (50萬張,置信度單字95%+)100萬真實 +100萬常用字(造) + 200萬數字時間英文(造)+ 600萬其他漢字(造)大概需要3-4天
-
接下來進行訓練:Resnet50,5-6天;Resize擴大,1024,=>512x8,256x8
過程中需要對greedy算法進行改進:
=>beam_search/merge_repeated=True
單獨測是有問題,但是在置信度很高的情況下,兩者差距很小,但是得到了極大的速度改進,28秒=>10秒,batch=128,size是512x32
-
因爲有crnn的prob,所以糾錯就有的放矢,把懷疑的字,替換成某個字,
-
Prob有個細節,如果是挨着的字,“__ 我 我 __”,就取最大的prob,
-
是根據一個字畫相近度,對懷疑字替換的原則,是和原來識別字筆畫最相近的,又是通過編輯距離。
4.4 我們的經驗
1、 開發經驗
2、生產經驗
Tensorflow容器
-
模型部署使用官方推薦的tensorflowserving,容器方式
-
沒有開啓Batching,自己控制batch
-
宿主機只需要顯卡驅動•容器內包含CUDA、cuDNN,免去版本適配
服務容器:
-
自己定義了Web容器基礎鏡像
-
自動構建容器、動態編排
本文作者:宜信技術學院 劉創