宜信OCR技術探索與實踐​|直播速記

宜信技術學院發表於2020-07-30

宜信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容器基礎映象

  • 自動構建容器、動態編排

本文作者:宜信技術學院 劉創

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69918724/viewspace-2707980/,如需轉載,請註明出處,否則將追究法律責任。

相關文章