营业执照识别项目记录--CTPN使用
文章目錄
- 1. 校驗--判別用戶上傳圖片是否為營業執照
- 2. 文字區域檢測---CTPN算法
- 2.1 CTPN算法原理
- 2.2 直接使用CTPN預訓練模型
- 參考
1. 校驗–判別用戶上傳圖片是否為營業執照
這一部分目前有兩個已實現的方案:
所以,目前的想法是同時使用兩個方法,當這兩個方法均投票負類時,才將該圖片判別為負類,否則就開始檢測步驟。
2. 文字區域檢測—CTPN算法
2.1 CTPN算法原理
首先,放上原論文鏈接,有興趣的小伙伴可以看一下原文。還有一個中英文對照版本的可以參考。
與faster RCNN不同的是,faster RCNN做的是物體檢測,而CTPN方法做文本檢測的其中一個難點就在于文本行的長度變化是非常劇烈的。因此如果是采用基于faster rcnn等通用物體檢測框架的算法都會面臨一個問題?怎么生成好的text proposal?這個問題實際上是比較難解決的。
CTPN文章作者轉換思路,首先考慮文字目標的特殊性,一個很大的先驗是,文字總是水平排列的。作者認為預測文本水平方向的位置比預測豎直方向上的位置要困難得多。所以檢測的過程中 不妨引入一個類似數學上“微分”的思想,如下圖所示,先檢測一個個小的、固定寬度的文本段。在后處理部分再將這些小文本段連接起來,得到文本行。
具體的說,作者的基本想法就是去預測文本的豎直方向上的位置,水平方向的位置不預測。因此作者提出了一個vertical anchor的方法。與faster rcnn中的anchor類似,但是不同的是,vertical anchor的寬度都是固定好的了,論文中的大小是16個像素。而高度則從11像素到273像素變化,總共10個anchor。
整體流程:
- 首先,使用VGG16作為base net提取特征,得到conv5_3的特征作為feature map,大小是W×H×C。(這里說一下,feature map 的大小一般為batchWHC,但是LSTM的輸入是batchmax_length*word_dim,這里怎么對應起來的呢?從圖中可以看出,將feature map的H作為是batch,也就是一行是一個batch, 將W作為是max_length, 而C作為word_dim.)
- 然后在這個feature map上做滑窗,窗口大小是3×3。也就是每個窗口都能得到一個長度為3×3×C的特征向量。這個特征向量將用來預測和10個anchor之間的偏移距離,也就是說每一個窗口中心都會預測出10個text propsoal。
- 將上一步得到的特征輸入到一個雙向的LSTM中,得到長度為W×256的輸出,然后接一個512的全連接層,準備輸出。
- 輸出層部分主要有三個輸出:
- 2k個vertical coordinate,因為一個anchor用的是中心位置的高(y坐標)和矩形框的高度兩個值表示的,所以一個用2k個輸出(k=10,對應第二步中的10個anchor)。(注意這里輸出的是相對anchor的偏移)。
- 2k個score,因為預測了k個text proposal,所以有2k個分數,text和non-text各有一個分數。
- k個side-refinement,這部分主要是用來精修文本行的兩個端點的,表示的是每個proposal的水平平移量。
- 這是會得到密集預測的text proposal,所以會使用一個標準的非極大值抑制算法來濾除多余的box。
- 最后使用基于圖的文本行構造算法,將得到的一個一個的文本段合并成文本行。
一些細節:
-
vertical anchor
① k個anchor的設置如下:寬度都是16像素,高度從11~273像素變化(每次乘以1.4)
② 預測的k個vertical coordinate的坐標如下:
回歸的高度和bounding box的中心的y坐標如下,帶*的表示是groundTruth,帶a的表示是anchor
③ score閾值設置:0.7 (+NMS)
④ 與真值IoU大于0.7的anchor作為正樣本,與真值IoU最大的那個anchor也定義為正樣本,這個時候不考慮IoU大小有沒有到0.7,這樣做有助于檢測出小文本。
⑤ 與真值IoU小于0.5的anchor定義為負樣本。
⑥ 只保留score大于0.7的proposal -
BLSTM
① 文章使用了雙向的LSTM,每個LSTM有128個隱層
② 加了RNN之后,整個檢測將更加魯棒 -
Side-refinement
① 文本線構造算法(多個細長的proposal合并成一條文本線)
主要思想:每兩個相近的proposal組成一個pair,合并不同的pair直到無法再合并為止(沒有公共元素)
判斷兩個proposal,Bi和Bj組成pair的條件:
Bj->Bi, 且Bi->Bj。(Bj->Bi表示Bj是Bi的最好鄰居)
Bj->Bi 條件1:Bj是Bi的鄰居中距離Bi最近的,且該距離小于50個像素
Bj->Bi 條件2:Bj和Bi的vertical overlap大于0.7
固定要regression的box的寬度和水平位置會導致predict的box的水平位置不準確,所以作者引入了side-refinement,用于水平位置的regression。where xside is the predicted x-coordinate of the nearest horizontal side (e.g., left or right side) to current anchor. x? side is the ground truth (GT) side coordinate in x-axis, which is pre-computed from the GT bounding box and anchor location. cax is the center of anchor in x-axis. wa is the width of anchor, which is fixed, wa = 16
-
訓練
① 對于每一張訓練圖片,總共抽取128個樣本,64正64負,如果正樣本不夠就用負樣本補齊。這個和faster rcnn的做法是一樣的。
② 訓練圖片都將短邊放縮到600像素。 -
總結
這篇文章的方法最大亮點在于把RNN引入檢測問題(以前一般做識別)。文本檢測,先用CNN得到深度特征,然后用固定寬度的anchor來檢測text proposal(文本線的一部分),并把同一行anchor對應的特征串成序列,輸入到RNN中,最后用全連接層來分類或回歸,并將正確的text proposal進行合并成文本線。這種把RNN和CNN無縫結合的方法提高了檢測精度。 -
問題
① 沒有很好地處理多方向的文本行
② 訓練的時候由于有regression和LSTM,需要小心控制梯度爆炸。
2.2 直接使用CTPN預訓練模型
CTPN論文的作者公開的代碼是基于caffe框架的:代碼鏈接;B站視頻的講解是基于pytorch的,他的代碼放在百度云上(鏈接: https://pan.baidu.com/s/1wToAbOulqpLxFhtOV5wdhg 提取碼: 6y24 (配套視頻請添加微信digexiaozhushou))他的其他資料可以在github上查找;后來有大神基于tensorflow實現了CTPN算法(代碼鏈接),基本上所有基于tensorflow的都是基于此代碼進行的,本文也是基于此代碼進行的。
如果想直接使用eragonruan寫的CTPN模型進行文本區域定位,可以依照以下步驟進行:
備注:gcc與g++也要求在6.0以上,否則會報錯。
(解釋一下為什么main,nets,utils每個包都有兩個,因為python import自己寫的其他模塊時,需要該模塊在包里面,而不是文件夾中。python中嚴格區分包和文件夾。包的定義就是包含__init__.py的文件夾。如果沒有__init__.py,那么就是普通的文件夾。)
原圖:
輸出圖片:
備注:CTPN對水平文字的檢測效果不錯,但是對于豎直和傾斜文字的檢測效果不佳,這是由于程序中對于標簽數據進行的水平切分(寬為16的矩形框),在利用rnn進行文本行合并時,一直是水平方向導致的。
輸出文本:
其中每一行對應一個文本框,八個整數分別對應從左上角開始的(x,y)坐標,按順時針旋轉。最后一個小數數值是概率。
參考
總結
以上是生活随笔為你收集整理的营业执照识别项目记录--CTPN使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据库知识点总结归纳
- 下一篇: 【第126期】游戏策划:给@毛毛团的简历