文本檢測之PixelLink
來自專欄小石頭的碼瘋窩28 人贊了文章
簡介
論文題目:PixelLink: Detecting Scene Text via Instance Segmentation
論文地址:https://arxiv.org/abs/1801.01315 代碼實現:https://github.com/ZJULearning/pixel_link PixelLink放棄了邊框回歸的思想,採用實例分割的方法,分割出文本行區域,然後直接找對應文本行的外接矩形框.論文關鍵idea
- 提出了通過實例分割(Instance Segmentation)來實現文本檢測
- 提出了基於DNN的兩種pixel-wise預測:文本/非文本預測和link預測
Pipeline
論文中給出了兩種網路結構:PixelLink+VGG16 2s和PixelLink+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)的區別.語義分割對圖像中的每個像素都劃分出對應的類別,即實現像素級別的分類;而實例分割不但要進行像素級別的分類,還需在具體的類別基礎上區別開不同的實例.為了更好地理解語義分割和實例分割,這裡給出了具體的示例圖(該圖來源於https://arxiv.org/pdf/1405.0312.pdf),下圖中左下角是語義分割,右下角是實例分割:
連接像素(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,具體的損失函數公式如下:
- pixel loss 對於positive pixel:由於文本行的aspect ratio變化範圍廣泛(即文本行的面積各不相等),若在計算loss的時候,對所有的pixel positive給予相同的權重,這對小面積的文本行是非常不公平的(即會偏向大面積的文本行),針對上述問題,論文中提出了Instance-Balanced Cross-Entropy Loss,具體的做法是給每個文本實例相同的權重Bi(公式如下圖),對於第i個面積為Si文本實,其內部的每個像素的權重為
- 對於negative pixel:論文中採用OHEM來選擇negative pixel.具體做法是根據negative-positive比例r (文中設置為3),文本行實例的總面積S,選擇loss倒序後的前r*S個negative pixel. 具體的pixel loss公式如下:
- links loss 論文中只對positive pixel分別計算positive links loss和negative links loss,具體公式如下:
總的link loss是class-balanced cross-entropy loss,具體公式如下:
- 網路的輸出
網路的輸出包括:文本/非文本( )和Link預測( 個),所以對網路總的輸出維度為:
注意:對於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);最後統一將圖像縮放到 .經過數據增廣後,對於文本行的短邊小於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光學字元識別 | 計算機視覺 |