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)。
下面將詳細講解該演算法。
一、網路輸入輸出及網路架構
網路輸入輸出
在介紹網路之前先介紹一下該網路的輸入和輸出,這部分算是這個篇文章的一個主要創新點。
首先是輸入,因為網路全部採用卷積結構,所有對輸入圖片大小沒有要求,可以是任意大小和任意長寬比,這點比較好理解。這裡假定輸入圖片大小為
然後是輸出,輸出文章稱為segments和links。segments可以理解為是一個一個的小框,這些小框類似於SSD中的default boxes,它們不一定一個框能框一個字,可能就框一個字的一部分,這點要明確。一個segment用公式 表示,其中 表示segment的中心, 表示segment的寬和高, 表示該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個層依次另命名為
層。
得到這六層feature map後,每個feature map經過卷積處理得到segments和links,下面介紹一下關於segments和links的檢測方法。
Segment的檢測方法
上面提到segment的表示方法為
。檢測一個segment那麼網路需要輸出segment的置信度和segment相對於default boxes的五個引數的一個迴歸偏移量。default boxes的位置可以這樣理解,相對於每一個卷積出來的feature map中的每個點都可以找到在原圖中的對應點,這個對應於feature map上的在原圖中的點就是default boxes的位置,而他們的大小定義如下(注意,default boxes都是沒有旋轉角的矩形)。
因為提取出的6層feature map,每層都要輸出segments,對於大小為
的
層feature map來說,一個點在feature map上的座標為
,對應原圖是座標為
的點,那一個default box的中心座標為
,由下式表示
default box的長寬都設為同一常數
,該數值的計算方式是個經驗等式,如下式所示
,這裡
注意,上述是default box的計算方法,而實際我們需要通過default box的資訊以及feature map再次進過卷積輸出的資訊,迴歸出segment的資訊。
來看看提取出的feature map需要輸出什麼資訊,每個feature map經過卷積後輸出的通道數為7,其中兩個通道表示segment的置信度值為(0,1),剩下的五個通道為segment相對於對應位置的default box的五個偏移量,用
表示。通過這五個偏移量和之前得到的default box的資訊就可以求出segment的位置,計算方法如下: