ctpn:圖像文字檢測方法
點擊上方“小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時間送達(dá)
本文工作基于faster RCNN , 區(qū)別在于
1. 改進(jìn)了rpn,anchor產(chǎn)生的window的寬度固定為3。
2. rpn后面不是直接接全連接+分類/回歸,而是再通過一個LSTM,再接全連接層。
3. 坐標(biāo)僅僅回歸一個y,而不是x1, y1, x2, y2
4. 添加 side-refinement offsets(可能這個就是4個回歸值中的其中2個)
1. 文字目標(biāo)的特殊性,一個很大的先驗是,文字總是水平排列的。
2. 文字的特征總感覺體現(xiàn)在edge上。
3. 自然場景文字檢測的難點在于:小目標(biāo),遮擋,仿射畸變。本文使用VGG16,只使用conv5,可能對小文字的檢測效果不好。
CTPN用在ICDAR2017中文檢測數(shù)據(jù)集上的結(jié)果:AP=0.18
論文的關(guān)鍵idea
文本檢測的其中一個難點就在于文本行的長度變化是非常劇烈的。因此如果是采用基于faster rcnn等通用物體檢測框架的算法都會面臨一個問題:怎么生成好的text proposal。這個問題實際上是比較難解決的。
Detecting Text in Natural Image with Connectionist Text Proposal Network在這篇文章中作者提供了另外一個思路,檢測一個一個小的,固定寬度的文本段,然后再后處理部分再將這些小的文本段連接起來,得到文本行。檢測到的文本段的示意圖如下圖所示。

具體的說,作者的基本想法就是去預(yù)測文本的豎直方向上的位置,水平方向的位置不預(yù)測。因此作者提出了一個vertical anchor的方法。與faster rcnn中的anchor類似,但是不同的是,vertical anchor的寬度都是固定好的了,論文中的大小是16個像素。而高度則從11像素到273像素變化,總共10個anchor.
同時,對于水平的文本行,其中的每一個文本段之間都是有聯(lián)系的,因此作者采用了CNN+RNN的一種網(wǎng)絡(luò)結(jié)構(gòu),檢測結(jié)果更加魯棒。RNN和CNN的無縫結(jié)合可以提高檢測精度。CNN用來提取深度特征,RNN用來序列的特征識別(2類),二者無縫結(jié)合,用在檢測上性能更好。
Top-down(先檢測文本區(qū)域,再找出文本線)的文本檢測方法比傳統(tǒng)的bottom-up的檢測方法(先檢測字符,再串成文本線)更好。自底向上的方法的缺點在于(這點在作者的另一篇文章中說的更清楚),總結(jié)起來就是沒有考慮上下文,不夠魯棒,系統(tǒng)需要太多子模塊,太復(fù)雜且誤差逐步積累,性能受限。
基于檢測的方法能很好地解決水平文字的檢測問題,缺點是對于非水平的文字不能檢測。具體的做法可以參考Detecting Text in Natural Image with Connectionist Text Proposal Network,ECCV16的一篇論文,網(wǎng)絡(luò)結(jié)構(gòu)為RPN,針對文字檢測的特點做了一些修改,最重要的有兩點,一是改變了判斷正負(fù)樣本的方法,不同于物體檢測,文字檢測中proposal如果只框住了一行文字中的幾個文字其實也算正樣本,而用IOU計算的話會被當(dāng)成負(fù)樣本,所以判斷正負(fù)樣本只需要計算proposal與ground truth高度的overlap就可以了。第二點是anchor的選取,既然我們判斷正負(fù)樣本的時候不考慮寬度,自然選anchor的時候也不用選擇不同寬度的了,只需要固定寬度然后根據(jù)具體任務(wù)選擇幾個合適的高度就可以了。其他地方和RPN基本一樣。
整個算法的流程主要有以下幾個步驟:(參見下圖)

首先,使用VGG16作為base net提取特征,得到conv5_3的特征作為feature map,大小是W×H×C
然后在這個feature map上做滑窗,窗口大小是3×3。也就是每個窗口都能得到一個長度為3×3×C的特征向量。這個特征向量將用來預(yù)測和10個anchor之間的偏移距離,也就是說每一個窗口中心都會預(yù)測出10個text propsoal。
將上一步得到的特征輸入到一個雙向的LSTM中,得到長度為W×256的輸出,然后接一個512的全連接層,準(zhǔn)備輸出。
輸出層部分主要有三個輸出。2k個vertical coordinate,因為一個anchor用的是中心位置的高(y坐標(biāo))和矩形框的高度兩個值表示的,所以一個用2k個輸出。(注意這里輸出的是相對anchor的偏移)。2k個score,因為預(yù)測了k個text proposal,所以有2k個分?jǐn)?shù),text和non-text各有一個分?jǐn)?shù)。k個side-refinement,這部分主要是用來精修文本行的兩個端點的,表示的是每個proposal的水平平移量。
這是會得到密集預(yù)測的text proposal,所以會使用一個標(biāo)準(zhǔn)的非極大值抑制算法來濾除多余的box。
最后使用基于圖的文本行構(gòu)造算法,將得到的一個一個的文本段合并成文本行。
4.1 vertical anchor
k個anchor的設(shè)置如下:寬度都是16像素,高度從11~273像素變化(每次乘以1.4)
預(yù)測的k個vertical coordinate的坐標(biāo)如下:
回歸的高度和bounding box的中心的y坐標(biāo)如下,帶*的表示是groundTruth,帶a的表示是anchor
score閾值設(shè)置:0.7 (+NMS)
與真值IoU大于0.7的anchor作為正樣本,與真值IoU最大的那個anchor也定義為正樣本,這個時候不考慮IoU大小有沒有到0.7,這樣做有助于檢測出小文本。
與真值IoU小于0.5的anchor定義為負(fù)樣本。
只保留score大于0.7的proposal
4.2?BLSTM
?文章使用了雙向的LSTM,每個LSTM有128個隱層
加了RNN之后,整個檢測將更加魯棒,

4.3 Side-refinement

文本線構(gòu)造算法(多個細(xì)長的proposal合并成一條文本線)
主要思想:每兩個相近的proposal組成一個pair,合并不同的pair直到無法再合并為止(沒有公共元素)
判斷兩個proposal,Bi和Bj組成pair的條件:
? ? 1. Bj->Bi, 且Bi->Bj。(Bj->Bi表示Bj是Bi的最好鄰居)
? ? 2. Bj->Bi條件1:Bj是Bi的鄰居中距離Bi最近的,且該距離小于50個像素
? ? 3. Bj->Bi條件2:Bj和Bi的vertical overlap大于0.7
固定要regression的box的寬度和水平位置會導(dǎo)致predict的box的水平位置不準(zhǔn)確,所以作者引入了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?
??
?對于每一張訓(xùn)練圖片,總共抽取128個樣本,64正64負(fù),如果正樣本不夠就用負(fù)樣本補(bǔ)齊。這個和faster rcnn的做法是一樣的。
訓(xùn)練圖片都將短邊放縮到600像素。
這篇文章的方法最大亮點在于把RNN引入檢測問題(以前一般做識別)。文本檢測,先用CNN得到深度特征,然后用固定寬度的anchor來檢測text proposal(文本線的一部分),并把同一行anchor對應(yīng)的特征串成序列,輸入到RNN中,最后用全連接層來分類或回歸,并將正確的text proposal進(jìn)行合并成文本線。這種把RNN和CNN無縫結(jié)合的方法提高了檢測精度。
不是在字的級別,最終輸出是在行的級別
對每一行,每一個feature map位置,固定需要回歸的框的寬度為16像素,需要預(yù)測k個anchor的高度和數(shù)值方向
side-refinement用來預(yù)測每一個anchor的x的坐標(biāo),準(zhǔn)確率有效得到提升
沒有很好地處理多方向的文本行;
訓(xùn)練的時候由于有regression和LSTM,需要小心控制梯度爆炸。
?
END
交流群
歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計算攝影、檢測、分割、識別、醫(yī)學(xué)影像、GAN、算法競賽等微信群(以后會逐漸細(xì)分),請掃描下面微信號加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三?+?上海交大?+?視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進(jìn)入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~

