CTPN算法的提出,出於如下幾點:git
假設文本是水平的github
文本能夠看作由每個"字母「組成的。這裏的字母能夠認爲是小片斷算法
之因此有這樣的想法,是由於基於通用目標檢測的算法難以適應文字檢測的場景,如上圖中的文字,長度方面變化幅度很大。所以做者將文本在水平方向解耦,分紅每個小片,而後將文本行的檢測轉化爲小片的檢測,最後利用規則將屬於同一水平行的小片組合成文本行。化繁爲簡。網絡
CTPN的創新點主要由如下三點:ide
將文本行拆分爲slice進行檢測,這樣在檢測過程當中只須要對文本的高度進行先驗性的設置anchor。編碼
做者認爲文本具備時序性,即和閱讀習慣一直,從左到右。所以做者加入RNN獲取這種語義性。3d
後處理算法:文本鏈接算法cdn
如上圖所示,做圖爲RPN,右圖爲CTPN的網絡結構。能夠看到,CTPN自己就是RPN,惟一不一樣的是加入了雙向LSTM獲取時序方向的信息,使得模型能夠序列性的預測文本的小片。固然這裏的不一樣之處主要有如下幾點:blog
雙向LSTM對文本行方向編碼get
標籤構造方式不一樣:CTPN使用水平方向的切片框做爲迴歸目標
具體還需根據如下圖進行理解:
CTPN的總體結構:
骨幹網絡爲VGG16,其輸出爲conv5層的輸出,stride爲16。也就是featur map中的一個像素對應原圖的16像素。
feature map編碼輸入BLSTM。對於conv5的輸出(N, C, H, W), W方向做爲時序方向,所以須要reshape獲得(N, W, H*C)做爲LSTM的輸入。
BILSTM的輸出輸入至FC中,最終模型三個輸出:文本小片的座標偏移(y, h)。這裏做者沒有對起始座標進行預測,由於這部分在標籤構造過程有固定的偏移,所以只須要知道文本的y, h,利用固定的偏移能夠構造出完整的文本行。
邊界校準:由於模型沒有對文本的起始作約束,所以會存在文本頭和尾的小片的預測會多多少少的超出來。所以須要作小部分的微調。
如上圖所示,給定一個文本的標註框,這裏爲(x, y, w, h)。做者沿着水平方向進行切分,偏移爲16個像素。這樣就獲得了一系列的文本小片。這裏左右標記爲紅色的小片,做者將他們(落在左右兩端50像素之內的小片)做爲side refinement時候的標籤,用來約束網絡對文本起始和終止點的矯正。至於這裏取偏移爲16的緣由,是由於conv5的stride爲16,至關於feature map中的一個像素對應標籤的16的寬度。固然,這裏關於感覺野,conv5中的感覺野爲228x228,所以文本行anchor的高度最大不能超過228,若是超出則網絡不能很好的進行預測。
其中,豎直方向座標的構造以下面式子所示:
這裏C爲anchor的中心座標,h爲anchor的高度。上下兩行分別對應預測值與anchor的相對位置,真值與anchor的相對位置。
邊界anchor的矯正:
除了全部的小片迴歸y, h;其中紅色的anchor還需額外的迴歸水平座標x,式子以下:
原理與上述豎直方向的計算方式相似,只針對處於邊界的anchor進行計算。
文本線的圖參考至知乎專欄https://zhuanlan.zhihu.com/p/34757009。
CTPN中的雙向LSTM過於笨重,所以咱們須要思考如何替代它。發現有人使用conv1x7替代雙向LSTM,親手實驗了一下,以上是效果圖。CTPN的算法雖然是2016的算法,可是其針對水平長行的檢測如今也是工業級的,算法魯棒。而這個算法也是文字檢測領域對RPN的應用之一。CTPN就講解這麼多,具體還須要閱讀論文,閱讀代碼。
代碼連接以及文章連接以下: