1. 程式人生 > >SegLink(Detecting Oriented Text in Natural Images by Linking Segments)演算法詳解

SegLink(Detecting Oriented Text in Natural Images by Linking Segments)演算法詳解

《Detecting Oriented Text in Natural Images by Linking Segments》是和EAST同年的一篇發表在CVPR2017的OCR論文。程式碼地址:https://github.com/bgshih/seglink,這是該文章其中一個作者提供的tensorflow版本程式碼,網上還有其他實現(我看的是pixellink作者的一個實現https://github.com/dengdan/seglink)。

下面將詳細講解該演算法。

一、網路輸入輸出及網路架構

網路輸入輸出
在介紹網路之前先介紹一下該網路的輸入和輸出,這部分算是這個篇文章的一個主要創新點。

首先是輸入,因為網路全部採用卷積結構,所有對輸入圖片大小沒有要求,可以是任意大小和任意長寬比,這點比較好理解。這裡假定輸入圖片大小為 w I × h I w_{I}\times h_{I}

然後是輸出,輸出文章稱為segments和links。segments可以理解為是一個一個的小框,這些小框類似於SSD中的default boxes,它們不一定一個框能框一個字,可能就框一個字的一部分,這點要明確。一個segment用公式 b = ( x b

, y b , w b , h b , θ b ) b=(x_{b},y_{b},w_{b},h_{b}, \theta_{b}) 表示,其中 x b , y y x_{b},y_{y} 表示segment的中心, w b , h b w_{b},h_{b} 表示segment的寬和高, θ b \theta_{b} 表示該segment的旋轉角。links就是將segments連線起來,說白了就是兩個框是不是同一個文字的一個概率值。

至於segmens和links從哪裡輸出以及輸出的是什麼東西下面會詳細介紹。

網路結構
如下圖所示,網路的backbone採用的是VGG-16,將VGG中所有的全連線層改為卷積層(fc6、fc7改為conv6、conv7),並在conv7後面還加了若干個卷積層(conv8_1 - conv11),訓練與檢測的網路結構類似於SSD,只是這裡的feature map是從conv4_3,conv7,conv8_2,conv9_2,conv10_2,conv11這6個層中提取出來的。提取出的6個層依次另命名為 l t h l-th ( l = 1 , . . . , 6 ) (l = 1, ..., 6) 層。

圖1.png

得到這六層feature map後,每個feature map經過卷積處理得到segments和links,下面介紹一下關於segments和links的檢測方法。

Segment的檢測方法
上面提到segment的表示方法為 b = ( x b , y b , w b , h b , θ b ) b=(x_{b},y_{b},w_{b},h_{b}, \theta_{b}) 。檢測一個segment那麼網路需要輸出segment的置信度和segment相對於default boxes的五個引數的一個迴歸偏移量。default boxes的位置可以這樣理解,相對於每一個卷積出來的feature map中的每個點都可以找到在原圖中的對應點,這個對應於feature map上的在原圖中的點就是default boxes的位置,而他們的大小定義如下(注意,default boxes都是沒有旋轉角的矩形)。

因為提取出的6層feature map,每層都要輸出segments,對於大小為 w l × h l w_{l}\times h_{l} l t h l-th 層feature map來說,一個點在feature map上的座標為 ( x , y ) (x,y) ,對應原圖是座標為 ( x a , y a ) (x_{a},y_{a}) 的點,那一個default box的中心座標為 ( x a , y a ) (x_{a},y_{a}) ,由下式表示
x a = w I w l ( x + 0.5 ) x_{a}=\frac{w_{I}}{w_l}(x + 0.5)
y a = h I h l ( y + 0.5 ) y_{a}=\frac{h_{I}}{h_l}(y + 0.5)
default box的長寬都設為同一常數 a l a_{l} ,該數值的計算方式是個經驗等式,如下式所示
a l = γ w I w l a_{l}=\gamma\frac{w_I}{w_l} ,這裡 γ = 1.5 \gamma = 1.5

注意,上述是default box的計算方法,而實際我們需要通過default box的資訊以及feature map再次進過卷積輸出的資訊,迴歸出segment的資訊。

來看看提取出的feature map需要輸出什麼資訊,每個feature map經過卷積後輸出的通道數為7,其中兩個通道表示segment的置信度值為(0,1),剩下的五個通道為segment相對於對應位置的default box的五個偏移量,用 ( Δ x s , Δ y s , Δ w s , Δ h s , Δ θ s ) (\Delta x_{s},\Delta y_{s},\Delta w_{s},\Delta h_{s}, \Delta \theta_{s}) 表示。通過這五個偏移量和之前得到的default box的資訊就可以求出segment的位置,計算方法如下:
x s = a l Δ x s + x a x_{s} = a_{l}\Delta x_{s} + x_{a}
y s = a l Δ y s + y a y_{s} = a_{l}\Delta y_{s} + y_{a}
w s = a l e x p ( Δ w s ) w_{s} = a_{l}exp(\Delta w_{s})