文本檢測之PixelLink

文本檢測之PixelLink

來自專欄小石頭的碼瘋窩28 人贊了文章

簡介

論文題目:PixelLink: Detecting Scene Text via Instance Segmentation

論文地址:arxiv.org/abs/1801.0131

代碼實現:github.com/ZJULearning/

PixelLink放棄了邊框回歸的思想,採用實例分割的方法,分割出文本行區域,然後直接找對應文本行的外接矩形框.

論文關鍵idea

  • 提出了通過實例分割(Instance Segmentation)來實現文本檢測
  • 提出了基於DNN的兩種pixel-wise預測:文本/非文本預測和link預測

Pipeline

論文中給出了兩種網路結構:PixelLink+VGG16 2sPixelLink+VGG16 4s

對於PixelLink+VGG16 2s網路結構:其融合的特徵層包括:{conv2_2, conv3_3, conv4_3, conv5_3, fc_7},得到的特徵圖解析度為原圖的二分之一

對於PixelLink+VGG16 4s網路結構:其融合的特徵層包括:{conv3_3,conv4_3, conv5_3, fc_7},得到的特徵圖解析度為原圖的四分之一

整個實現過程包括兩部分:先通過深度學習網路預測pixel positive和link positive,並根據link positive連接pixel positive得到文本實例分割圖,然後從分割圖中直接提取文本行的bbox.具體步驟如下:

  • 主幹網路是沿用了SSD網路結構.具體來說:首先用VGG16作為base net,並將VGG16的最後兩個全連接層改成卷積層.
  • 提取不同層的feature map,對於PixelLink+VGG16 2s網路結構:提取了conv2_2, conv3_3, conv4_3, conv5_3, fc_7.
  • 對已提取的特徵層,採用自頂向下的方法進行融合,融合操作包括先向上採樣,然後再進行add操作.注意:這裡包含了兩種操作:pixel cls和pixel link,對應的卷積核個數分別為2和16
  • 對於網路輸出層,包括文本/非文本預測和Link預測.

    這裡給出PixelLink+VGG16 2s的網路結構圖:

具體實現細節

實例分割和語義分割的區別

先簡單介紹下實例分割(Instance Segmentation)和語義分割(Semantic Segmentation)的區別.語義分割對圖像中的每個像素都劃分出對應的類別,即實現像素級別的分類;而實例分割不但要進行像素級別的分類,還需在具體的類別基礎上區別開不同的實例.為了更好地理解語義分割和實例分割,這裡給出了具體的示例圖(該圖來源於arxiv.org/pdf/1405.0312),下圖中左下角是語義分割,右下角是實例分割:

連接像素(Linking Pixels Together)

通過設定兩個不同的閾值,可以得到pixel positive集合和link positive集合,然後根據link positive將pixel positive進行連接,得到CCs(conected compoents)集合,集合中的每個元素代表的就是文本實例.這裡需要特別注意:給定兩個相鄰的pixel positive,它們之間的link預測是由當前兩個pixel共同決定的.而當前兩個pixel需要連接(即兩個像素屬於同一個文本實例)的前提條件:two link中至少有一個link positive.連接的規則採用的是Disjoint set data structure(並查集)的方法.

提取文本行的bounding box

基於上述語義分割的結果(即上述的CCs),直接通過opencv的minAreaRext提取文本的帶方向信息的外接矩形框(即帶角度信息),具體的格式為((x,y),(w,h),θ),分別表示中心點坐標,當前bbox的寬和高,旋轉角度.

這裡和SegLink的關鍵區別:PixelLink是直接從分割結果中提取bbox,而SegLink採用的是邊框回歸

實例分割的後處理

之所以要進行後處理,是因為在pixel進行連接的時候不可避免地會引入雜訊.文中主要是對已檢測的bbox通過一些簡單的幾何形狀判斷(包括bbox的寬,高,面積及寬高比等,這些主要是在對應的訓練集上進行統計的出來的)進行filter.經過後處理後,可以提升文本行檢出的準確率.

訓練

  • 如何生成訓練數據的ground truth

    像素的生成規則:在文本行bbox內的pixel被標註成positive,如果存在重疊文本時,則非重疊的文本框區域內的像素被標註成positive,否則被標註成negative

    像素間的link生成規則:給定一個像素,若其與鄰域的8像素都屬於同一個文本實例,則將其link標註為positive,否則標註為negative

    這裡值得注意的是:ground truth的計算是在縮放後(具體縮放的比例與其預測的feature map大小一致)的原圖上進行的
  • 損失函數

    網路的損失函數包含兩個部分:pixels loss和links loss,具體的損失函數公式如下:

由於links是在positive pixel基礎上進行的預測的,所以這裡pixel loss比link loss顯得更為重要,論文中將λ=2.0

    • pixel loss

      對於positive pixel:由於文本行的aspect ratio變化範圍廣泛(即文本行的面積各不相等),若在計算loss的時候,對所有的pixel positive給予相同的權重,這對小面積的文本行是非常不公平的(即會偏向大面積的文本行),針對上述問題,論文中提出了Instance-Balanced Cross-Entropy Loss,具體的做法是給每個文本實例相同的權重Bi(公式如下圖),對於第i個面積為Si文本實,其內部的每個像素的權重為 w_{i}=frac{B_{i}}{S_{i}}

    • 對於negative pixel:論文中採用OHEM來選擇negative pixel.具體做法是根據negative-positive比例r (文中設置為3),文本行實例的總面積S,選擇loss倒序後的前r*S個negative pixel. 具體的pixel loss公式如下:

其中W為positive pixel和negative pixel的權重矩陣,是文本/非文本的cross-entrpy loss,經過上述公式,小面積的文本行可以得到較大的權重,大面積的文本行得到較小的權重,這樣就可以讓所有的文本行在loss中貢獻一樣

    • links loss

      論文中只對positive pixel分別計算positive links loss和negative links loss,具體公式如下:

總的link loss是class-balanced cross-entropy loss,具體公式如下:

  • 網路的輸出

    網路的輸出包括:文本/非文本( 1	imes2=2 )和Link預測( 8	imes2=16個),所以對網路總的輸出維度為: 2+2	imes8=18

    注意:對於link的輸出feature map,其排列的順序為:top-left,top,top-rignt,left,right,bottom-left,bottom,bottom-right,這裡給出一個可視化的順序圖(即下圖中的12345678):

  • 數據增廣

    數據增廣的方式和SSD相似,在SSD數據增廣上增加了隨機旋轉步驟.具體的做法是輸入圖像先以0.2的概率進行隨機旋轉,旋轉的角度範圍值為[0,π=2, π,3π=2];然後在進行crop操作(面積範圍在0.1-1之間,aspect ratio為0.5-2);最後統一將圖像縮放到 512	imes512 .

    經過數據增廣後,對於文本行的短邊小於10個像素的和文本實例小於20%的進行忽略.對於忽略的文本實例在計算損失函數的時候權重設置為0

在ICDAR2015上的評測結果

使用PixelLink訓練自己的數據

score map與link map的可視化圖

  • 原圖:

  • score map

    這裡所說的score map就是所說的實例分割的得分圖,其結果如下:

  • link map

    這裡的link map圖就是當前像素與其8領域的link得分圖,其結果如下:

檢測結果

這裡給出了幾張檢測結果圖:

總結及困惑

總結

  • 與CTPN,EAST,SegLink相比,PixelLink放棄了邊框回歸方法來檢測文本行的bbox,而是採用實例分割方法,直接從分割的文本行區域得到文本行的bbox.PixelLink可以以更少額數據和更快地速度進行訓練.
  • 假設提取特徵的主幹網路結構採用VGG16(當然你也可以採用其它主幹網路結構),PixelLink不需要在imagenet預訓練的模型上進行fine-tuned(即直接從頭開始訓練),而CTPN,EAST,SegLink都需要在imagenet預訓練的模型上進行fine-tuned
  • 與CTPN,EAST,SegLink相比,PixelLink對感受野的要求更少,因為每個神經元值只負責預測自己及其鄰域內的狀態.
  • 與SegLink一樣,不能檢測很大的文本,這是因為link主要是用於連接相鄰的segments,而不能用於檢測相距較遠的文本行

困惑

  • 每個神經元只負責自己及其鄰域內的狀態,而文本行檢測中需要考慮上下文信息,這裡會不會引入一些false positive?
  • 對於後處理模塊,雖然簡單,但是可能比較依賴訓練數據的分布(那些閾值是在其基礎上統計出來的),如果訓練數據沒有很好地覆蓋真實應用場景,可能會造成漏檢或者誤檢.

文人文筆粗淺,以上是個人對這篇文章的理解,若有理解錯誤的地方,歡迎指正.


推薦閱讀:

TAG:深度學習DeepLearning | OCR光學字元識別 | 計算機視覺 |