前面曾提到過CTPN,這里就學習一下,首先還是老套路,從論文學起吧。這里給出英文原文論文網址供大家閱讀:https://arxiv.org/abs/1609.03605。
CTPN,以前一直認為縮寫一般是從題目的開始依次排序選取首字母的,怕是孤陋寡聞了,全稱是“ Detecting Text in Natural Image with Connectionist Text Proposal Network”,翻譯過來是基於連接Proposal(直譯太難受!!)網絡的文本檢測。
作者在論文中描述了,根據他們提出的方法可以對圖片中的文本行進行准確的定位。他的基本做法是直接在卷積獲得的feature map上生成的一系列適當尺寸的文本proposals進行文本行的檢測。
本文的一個亮點是作者提出了一個垂直anchor的機制,可以同時預測出固定寬度proposal的位置以及文本/非文本的分數,可以大幅度提高精度。這里有個小問題,既然用到proposals,那他們是從哪里來的呢,
作者告訴我們這些有序的proposals是由RNN(循環神經網絡)得到的,RNN可以很好的結合CNN,形成一個end-to-end的可訓練模型。作者也很自覺的提到了,用RNN如此操作的好處是可以使CTPN探索豐富的圖像上下文的信息,能夠檢測模糊的文本,貌似不賴啊。。。亮出CTPN的優點吧,據作者說,CTPN是可以在多尺度和多語言文本中進行檢測的。而且比較方便的是,他並不需要后期的處理。
作者提出的垂直anchor可以以適當的規模准正確的預測文本的位置。然后,提出的網內循環結構,可以將較大尺寸的文本proposal有序的連接,這樣做的好處是可以對上下文豐富的文本信息進行編碼。
針對物體檢測可以大致地認為。如果檢測到邊界框與groundtruth的重疊大於0.5,則可以從圖片的主要部分很簡單的認出物體。文本檢測需要覆蓋文本行或單詞的整個區域。作者提到了文本檢測的一個用的比較多的評估標准,就是Wolf標准。作者是通過擴展RPN的結構來准確的對文本行進行定位。
作者表態,他們的工作主要由四個部分:第一部分,作者將文本檢測的問題轉化為定位一系列合適尺寸的文本proposals的問題。個人感覺將問題分散化了(將復雜問題轉為簡單問題的思想值得借鑒)。因此,為了實現上述過程,作者提出了一個anchor回歸機制,通過這個方式,可以同時預測出每個文本proposal的垂直方向的位置和文本/非文本的分數值,以便獲得更好的定位。相比之下,RPN貌似提供的定位就差強人意了。。
接下來,大佬們又提出了一種in-network 循環機制,可以直接在CNN的feature map 上建立連續的文本proposals。這波操作看可以對文本行上下文的信息進行有意義的探索。第三,大佬又強調,上述兩種方法可以很好的符合文本序列的本質,形成end-to-end的可訓練模型。第四是一些大佬們取得的成績,這里感興趣的同學可以從論文里查看,這里就不贅述了。
傳統的文本檢測方法大體可以分為兩類,一類為連接組件(CC),另一類為滑動窗口。CC是通過使用fast filter 對文本/非文本像素進行區分,然后通過使用(強度,顏色,漸變)等低級屬性將文本像素分為筆畫或者候選字符。而 滑動窗口是通過在圖像上密集的移動多尺寸的窗口。字符/非字符窗口通過預訓練的分類器,使用手動設計的特征或CNN靠后層的特征進行區分。當然,作者指明了上述兩種方法的弊端,就是在接下來的組件filter和文本行的構建過程中,出現的錯誤會進行累積,最終會產生較大的誤差。此外,很好的將非字符組件排除同時較准確的檢測文本行是比較困難的。滑動窗口有一個比較大的問題,就是計算上比較費錢,因為需要在大量的窗口上運行分類器。
作者告訴我們在物體檢測中,一種比較普遍的方式是通過一些低級特征產生一些proposals,然后送到卷積網絡里進行進一步的分類和修改。其中,通過選擇性搜索(SS)可以產生proposals,目前應用的比較廣泛。在faster R-CNN中又有RPN,直接從CNNN的feature map中獲得proposals。由於共享卷積,因此RPN的運算速度是比較快的。但是RPN是不具有區別性的,需要進一步的分類和修復。
重點來了,這里介紹CTPN的結構,這個網絡的三個關鍵是:一是在fine-scale 的proposals中檢測文本,二是循環連接的文本proposals,最后是輔助細化操作。接下來我們就按順序看看作者們是如何實現的吧。
Detecting Text in Fine-scale Proposals
作者告訴我們CTPN與RPN相似的地方是,也是一個完整的卷積網絡,也可以允許任意大小的圖像的輸入。前面也提到過了,CTPN通過在CNN的feature map 上密集的移動窗口來檢測文本行,輸出的是一系列的適當尺寸(固定寬度16像素,可以從上圖右側看出,長度還是可以調整的)的文本proposal。作者以VGG16進行說明,(為什么要選用VGG16原因是VGG16是由大規模數據訓練得到的模型,我們日常生活中的數據相比訓練VGG16的數據集要差好幾個級別,所以,一般以VGG16進行遷移學習,進行微調)。作者使用大小為3*3的空間窗口,在最后一層卷積(VGG16的conv5)的feature map上滑動窗口。conv5的 feature map 的大小是由輸入圖像的大小決定的。而總步長和感受野分別為16和228個像素。他們都是有網絡結構決定的固定的范圍。這里有個隱含的問題那就是,前面提到過滑動窗口需要耗費大量的計算,但這里卻又可以,為什么呢?原因是在卷積層中滑動窗口可以共享卷積,這樣可以減少計算成本。采用不同尺寸的滑動窗口可以檢測不同大小的物體。出色的是,Ren提出了anchor 回歸機制允許RPN可以使用單尺度窗口檢測多尺度的對象。這個想法的核心是通過使用一些靈活的anchors在大尺度和縱橫比的范圍內對物體進行預測。
這里作者進行了提示,就是文本檢測不同於物體檢測。文本檢測沒有一個明顯封閉邊界,同時是一個序列,可能在筆畫,字符,單詞,文本行和文本等多級組件之間沒有明確的區分。因此,文本檢測是定義在文本或文本行上的。
由上圖可以看到RPN進行的單詞檢測很難准確的進行水平預測,是因為單詞中的每個字符都是分離的,對文本的頭和尾無法很好的區分。因此,作者認為將文本行視為一系列縮放文本proposals,每個proposal通常代表文本行的一小部分。作者又覺得,每次僅預測每個proposal垂直位置會更准確,因為水平的不好預測。。。由於RPN預測的是對象的四個坐標,從而減少了搜索空間。
作者們提出了一種垂直anchor的機制,可以同時預測每個proposal的文本/非文本分數和y軸的位置。檢測固定寬度的文本proposal比檢測單個或分離的字符更容易。為了讓在一系列固定寬度的文本proposal上檢測文本行也可以應對多個比例和縱橫比的文本。作者們親自 設計文本proposals。首先,detector密集的搜索conv5中的每個空間位置。文本Proposal具有16個像素的固定寬度是有意義的(密集的through conv5中的feature map)總步長恰好為16個像素。接下倆,又給每個proposal設計了k個垂直anchor用來預測每個點的y坐標。這k個anchor 具有固定16個像素的水平位置,但垂直位置在k個不同的高度上變化,這里作者使用的是10個anchors。高度在11-273個像素變化,垂直坐標是如何計算的呢,作者告訴我們是通過 一個proposal 邊界框的高度和y軸的中心計算得到的。有關預測anchor邊界框的相對的垂直坐標的計算是由下式得到,
參數說明:V={Vc,Vh},V*={Vc*,Vh*}分別為預測的坐標和groundTruth。Cy 和Ha是anchor box的y軸的中心和高度,可以根據輸入圖像提前計算得到。因此,每個預測的文本proposal有一個大小為h*16的邊界框(如上述右圖),大體上,文本proposal相對於228*228的感受野來說小很多。
這里總結一下檢測的處理過程,給定一張圖片,這里由一個W*H*C 的conv5的feature map,detector通過一個大小為3*3的窗口密集的滑動conv5,每個滑動窗口用一個3*3*C的feature map用於進行預測。對每個預測來說,水平位置和k個anchors的位置是固定的,這個是由輸入圖像在conv5的feature map上窗口的位置預先計算得到的。detector 輸出每個窗口位置處k個anchor的文本/非文本分數和預測的y的坐標。生成的文本proposals 是由文本/非文本分數值大於0.7(通過使用NMS)的anchor生成的。通過使用垂直anchor和fine-scale 策略,detector可以處理各種比例和縱橫比的文本行,進一步節省了計算量和時間。
第一部分介紹完了,接下來就是 Reccurrent Connectionist Text Proposals
為了提高精度,作者將文本行分割為一個fine-scale的序列文本Proposal,並分別對他們中的每一個進行預測。為什么文本proposal要為序列,原因是將獨立的proposal單獨考慮並不周全,容易將圖片中和文本類似的結構(作者舉了個小栗子:磚塊)預測為文本,這就造成了錯誤。同時也為了防止忽略含文本信息較少的情況。
有序和無序的比較如下圖:
作者 提出這個結構想要達到的目標是直接在卷積層上編碼上下文信息,形成一個緊密的網絡內部連接。RNN使用可以使用隱藏層對信息進行循環編碼。理所當然的,作者在conv5上設計了一個RNN層,將每個窗口的卷積特性作為連續輸入,並在RNN的隱藏層H中循環更新其內部狀態,公式如下:
參數說明:其中Xt代表來自第t個滑動窗口的輸入conv5的特征,滑動窗口是從左至右滑動,產生每行1....W的順序features。W是conv5的寬度。Ht是由當前輸入Xt與以前的狀態Ht-1一起計算得到的當前內部狀態。作者用LSTM作為RNN層。在CTPN中,作者使用雙向LSTM進一步擴展RNN,允許其在兩個方向上對上下文進行編碼,使連接感受野能夠覆蓋圖像的整個寬度。對每個LSTM用128D的隱藏層,雙向的RNN就問256D,在Ht隱藏層的狀態被映射到接下來的全連接層,輸出層,用於計算第t個proposal的預測。由上圖可以看出,作者們的付出還是得到回報的。
大部分已經介紹完了,然后就大體說一下Side-refinement吧。
據作者表示,借助於連接連續的文本proposal的文本/非文本分數大於0.7,文本行的構建非常easy。
文本行的建立過程:首先,介紹一個定義, 第一個條件是當Bj是離Bi水平距離最近的區域,第二個條件是該距離小於50個像素,第三個條件是垂直重疊要大於0.7,這樣滿足三個條件才可以將Bj定義為Bi的一個相鄰域記作 Bj->Bi。概念問題解決后,作者強調,如果Bi->B j,Bj->Bi,則可以將兩個proposal划為一對,這樣通過順序連接相同的propsoals可以構建文本行。精確的檢測和RNN連接可以准確的預測垂直方向的位置。水平方向上,圖像被分成一系列像素為16的等寬的proposal。當兩個水平方向的proposal沒有被ground truth的文本行覆蓋時,會導致預測的位置不准確,
上述問題對物體檢測影響不大,但在文本檢測尤其是小文本的檢測來說是不容忽視的。因此,side-refinement 就是為了解決此問題而提出的,這個方法可以准確估計左右兩側水平方向上每個anchor/proposal 的偏移量。偏移量的計算如下:
Xside為離當前anchor距離最近的水平邊(左邊或者右邊)的坐標。X*side是水平方向GT坐標,由GT邊界框和anchor的位置計算得到。Cx_a是水平方向anchor的中心。Wa是anchor的寬(固定為16)。當將一系列檢測到的文本proposals連接成一個文本行時。side-proposal被定義為proposals的開頭和結尾(終於明白side的由來了)。作者只使用side-proposal 的偏移量來重新定義左中的文本行的邊界框。
論文的主要部分差不多了,接下來讓我們看看這個CTPN的輸出和他的損失函數吧。
CTPN的三個輸出都被一起連接到全連接層上。這三個輸出同時預測文本/非文本分數,垂直坐標和side-refinement的偏移量。采用k個anchor對他們三個分別預測,依次在輸出層產生2k,2k,和k個參數。作者采用多任務學習來聯合優化模型參數,目標函數如下:
每一個anchor是一個訓練樣本。i是一個anchor在一個minibatch的序列。Si是anchor i 預測是一個真文本的概率,S*是GT{0,1},j是用於y坐標回歸的有效anchor集合中的anchor的索引,他的定義是
一個有效的anchor被定義為positivate anchor S*j=1,或者是與GT的文本proposal 大於0.5的重疊。Vj和Vl*是第j個anchor的y軸方向的預測值和GT.k為side-anchor的標號,side-anchor為一系列離grount Truth文本行框從左至右在水平距離范圍內(這里為32個像素)的anchors。Ok和Ok*是x軸上第K個anchor的預測的和GT的偏移量。Ls為區分文本/非文本的Softmax損失,Lv和Lo都為回歸損失,其中lamda1,lamda2為損失權重,根據經驗設置為1.0和2.0。
CTPN可以用標准的反向傳播和隨機梯度下降進行end-to-end的訓練。與RPN相同的是訓練樣本為anchors,其位置可以由輸入的圖片預先計算,所以每個anchor訓練的標簽可以根據GTbox計算得到。
針對文本/非文本的分類,二進制的標簽被分給每一個正anchor(文本)和負anchor(非文本),正負anchor是由IOU與GT邊界重疊計算得到的。正的anchor被定義為:IOU與GTbox 的重疊大於0.7的或者最高(集是一個很小的文本pattern也會被分為一個正的anchor)的anchor。負的anchor是IOU小於0.5產生的。CTPN的理論大體討論到這里,后面還有作者做的實驗結果並進行了討論,可以參考前面給出的論文地址進行進一步的學習。