標籤:

CTPN論文解讀

1. 區別

本文工作基於faster RCNN , 區別在於

  1. 改進了rpn,anchor產生的window的寬度固定為3。
  2. rpn後面不是直接接全連接+分類/回歸,而是再通過一個LSTM,再接全連接層。
  3. 坐標僅僅回歸一個y,而不是x1, y1, x2, y2
  4. 添加 side-refinement offsets(可能這個就是4個回歸值中的其中2個)

2. 問題分析

  1. 文字目標的特殊性,一個很大的先驗是,文字總是水平排列的。
  2. 文字的特徵總感覺體現在edge上。
  3. 自然場景文字檢測的難點在於:小目標,遮擋,仿射畸變。本文使用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的條件:
  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的寬度和水平位置會導致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無縫結合的方法提高了檢測精度。

    特點

    • 不是在字的級別,最終輸出是在行的級別
    • 對每一行,每一個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):香港樓市早已進入牛三│脫苦海

    TAG:論文 | 解讀 |