CTPN論文解讀
03-06
1. 區別
本文工作基於faster RCNN , 區別在於
- 改進了rpn,anchor產生的window的寬度固定為3。
- rpn後面不是直接接全連接+分類/回歸,而是再通過一個LSTM,再接全連接層。
- 坐標僅僅回歸一個y,而不是x1, y1, x2, y2
- 添加 side-refinement offsets(可能這個就是4個回歸值中的其中2個)
2. 問題分析
- 文字目標的特殊性,一個很大的先驗是,文字總是水平排列的。
- 文字的特徵總感覺體現在edge上。
- 自然場景文字檢測的難點在於:小目標,遮擋,仿射畸變。本文使用VGG16,只使用conv5,可能對小文字的檢測效果不好。
3. 實驗
CTPN用在ICDAR2017中文檢測數據集上的結果:AP=0.18
論文的關鍵idea
- 文本檢測的其中一個難點就在於文本行的長度變化是非常劇烈的。因此如果是採用基於faster rcnn等通用物體檢測框架的演算法都會面臨一個問題?怎麼生成好的text proposal?這個問題實際上是比較難解決的。因此在這篇文章中作者提供了另外一個思路,檢測一個一個小的,固定寬度的文本段,然後再後處理部分再將這些小的文本段連接起來,得到文本行。檢測到的文本段的示意圖如下圖所示。
- 具體的說,作者的基本想法就是去預測文本的豎直方向上的位置,水平方向的位置不預測。因此作者提出了一個vertical anchor的方法。與faster rcnn中的anchor類似,但是不同的是,vertical anchor的寬度都是固定好的了,論文中的大小是16個像素。而高度則從11像素到273像素變化,總共10個anchor.
- 同時,對於水平的文本行,其中的每一個文本段之間都是有聯繫的,因此作者採用了CNN+RNN的一種網路結構,檢測結果更加魯棒。RNN和CNN的無縫結合可以提高檢測精度。CNN用來提取深度特徵,RNN用來序列的特徵識別(2類),二者無縫結合,用在檢測上性能更好。
- Top-down(先檢測文本區域,再找出文本線)的文本檢測方法比傳統的bottom-up的檢測方法(先檢測字元,再串成文本線)更好。總結起來就是沒有考慮上下文,不夠魯棒,系統需要太多子模塊,太複雜且誤差逐步積累,性能受限。
- 基於檢測的方法能很好地解決水平文字的檢測問題,缺點是對於非水平的文字不能檢測。具體的做法可以參考Detecting Text in Natural Image with Connectionist Text Proposal Network,ECCV16的一篇論文,網路結構為RPN,針對文字檢測的特點做了一些修改,最重要的有兩點,一是改變了判斷正負樣本的方法,不同於物體檢測,文字檢測中proposal如果只框住了一行文字中的幾個文字其實也算正樣本,而用IOU計算的話會被當成負樣本,所以判斷正負樣本只需要計算proposal與ground truth高度的overlap就可以了。第二點是anchor的選取,既然我們判斷正負樣本的時候不考慮寬度,自然選anchor的時候也不用選擇不同寬度的了,只需要固定寬度然後根據具體任務選擇幾個合適的高度就可以了。其他地方和RPN基本一樣。
pipeline
整個演算法的流程主要有以下幾個步驟:(參見下圖)
- 首先,使用VGG16作為base net提取特徵,得到conv5_3的特徵作為feature map,大小是W×H×C
- 然後在這個feature map上做滑窗,窗口大小是3×3。也就是每個窗口都能得到一個長度為3×3×C的特徵向量。這個特徵向量將用來預測和10個anchor之間的偏移距離,也就是說每一個窗口中心都會預測出10個text propsoal。
- 將上一步得到的特徵輸入到一個雙向的LSTM中,得到長度為W×256的輸出,然後接一個512的全連接層,準備輸出。
- 輸出層部分主要有三個輸出。2k個vertical coordinate,因為一個anchor用的是中心位置的高(y坐標)和矩形框的高度兩個值表示的,所以一個用2k個輸出。(注意這裡輸出的是相對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
訓練
- 對於每一張訓練圖片,總共抽取128個樣本,64正64負,如果正樣本不夠就用負樣本補齊。這個和faster rcnn的做法是一樣的。
- 訓練圖片都將短邊放縮到600像素。
總結
這篇文章的方法最大亮點在於把RNN引入檢測問題(以前一般做識別)。文本檢測,先用CNN得到深度特徵,然後用固定寬度的anchor來檢測text proposal(文本線的一部分),並把同一行anchor對應的特徵串成序列,輸入到RNN中,最後用全連接層來分類或回歸,並將正確的text proposal進行合併成文本線。這種把RNN和CNN無縫結合的方法提高了檢測精度。
特點
- 不是在字的級別,最終輸出是在行的級別
- 對每一行,每一個feature map位置,固定需要回歸的框的寬度為16像素,需要預測k個anchor的高度和數值方向
- side-refinement用來預測每一個anchor的x的坐標,準確率有效得到提升
代碼
- 正如上文所提的,這個網路預測的是一些固定寬度的text proposal,所以真值也應該按照這樣來標註。但是一般資料庫給的都是整個文本行或者單詞級別的標註。因此需要把這些標註轉換成一系列固定寬度的box。代碼在prepare_training_data這個文件夾。
- 整個repo是基於RBG大神的faster rcnn改的,所以根據他的輸入要求。要再將數據轉換為voc的標註形式,這部分代碼也在prepare_training_data這個文件夾。
問題
1沒有很好地處理多方向的文本行
2訓練的時候由於有regression和LSTM,需要小心控制梯度爆炸。
推薦閱讀:
※我們到底該怎麼去解讀動漫?
※房市解讀(23):資料及印象碎片無助分析問題│脫苦海
※房市解讀(26):恆基賣麵包買麵粉│脫苦海
※房市解讀(24):香港樓市早已進入牛三│脫苦海