宜信OCR技術探索與實踐|完整視頻回放html
1、OCR概述
1.1 OCR技術演進

- 傳統圖像,岡薩雷斯的圖像處理。
- 信號處理、頻域分析以及各種算法:SIFT、HOG、HOUGH、Harris、Canny…都很贊。
- 從2016年之後業界基本上都已經轉向深度了,由於效果然的特別好。
1.2 OCR技術商業服務

- 身份證卡證類相對容易些,可是要作到複雜場景的,也不是那麼容易。
- 發票、業務單據相對複雜,除了識別,更重要的是版面分析。
- 最近表格識別比較火,各家都在努力實現,微軟的開放tablebank數據集
- 移動端backboneMobileNet,或者是tesseract+opencv
2、咱們的業務場景
2.1 業務需求

知足業務是第一須要,不一樣於大廠,對外服務API,要求大併發那麼強,多樣性品類完備,咱們更強調單品要作到儘可能達到業務要求,更強調定製化,能夠分佈走,業務上能夠給反饋不斷改進。算法
2.2 識別過程當中須要解決的問題

3、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做爲一種基於分割的方法,可以對任意形狀的文本進行定位.其次,該模型提出了一種漸進的尺度擴展算法,該算法能夠成功地識別相鄰文本實例。spa
- FPN,左面用resnet50。爲什麼是resnet50,緣由是效果不錯,參數適中。
- 論文裏是6個尺度,一個不行麼?我理解是完全分開不一樣行,逐漸擴大,漸進尺度能夠防止彼此交叉哈
- FPN和UNET都是concat,FCN是add,這個細節。

- 使用DB模塊以後,二值化操做就變成了可微的,能夠加到網絡裏一塊兒訓練。
網絡輸出設計
- probabilitymap,表明像素點是文本的機率
- thresholdmap,每一個像素點的閾值
- binarymap,由1,2計算獲得,計算公式爲DB公式
label製做3d
- 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適合語音識別和手寫字符識別的任務。code

缺點:不能精確地聯繫特徵向量與輸入圖像中對應的目標區域,這種現象稱爲attention drift。

Muturaltraining:
- 咱們知道什麼?什麼字符,第幾個?這個信息!
- 哪一個字符?找到那個字符,第幾個?而後和樣本里的順序比
- 第幾個是啥字符?和對應位置的字符比
- 因此樣本中不能存在重複字符。
4、咱們的實踐
4.1 實踐之路


- 非單據:寬高比,白像素比例等
- 旋轉角整:前面講過了,經過旋轉模型,以及投影分佈
- 多單據:多張單據在一塊兒,經過投影,閾值超參配置
- 表格識別:採用mask-rcnn的方法,來找出大表邊緣
- 後處理:經過NLP糾錯,後面會詳細的講
4.2 實踐之路——旋轉模型
大方向判斷
初版:
- VGG作backbone,全鏈接,四分類
- 樣本:人工標註、加強
- 正確率90%
第二版:
- 作切割,256x256
- 使用MSER找備選
- 訓練小圖
- 衆數選出最可能方向
- 正確率99.7%
微調
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 咱們的經驗
一、 開發經驗

二、生產經驗
Tensorflow容器
- 模型部署使用官方推薦的tensorflowserving,容器方式
- 沒有開啓Batching,本身控制batch
- 宿主機只須要顯卡驅動•容器內包含CUDA、cuDNN,免去版本適配
服務容器:
- 本身定義了Web容器基礎鏡像
- 自動構建容器、動態編排
本文做者:宜信技術學院 劉創