文字檢測之MaskTextSpotter
簡介
- 論文題目:Mask TextSpotter: An End-to-End Trainable Neural Network for Spotting Text with Arbitrary Shapes
- 論文地址: ofollow,noindex"> https:// arxiv.org/abs/1807.0224 2
- 程式碼實現: 暫未開源
傳統的文字識別系統一般分為兩類:1).基於one-stage,這部分方法一般是先檢測文字,然後在檢測文字的基礎上進行識別;這類方法需要對檢測和識別模組分別調優,並沒有充分發揮兩者高度相關又互補的關係;2).基於end-to-end,這部分是檢測和識別是一起訓練,但現有的方法存在兩個缺陷:a).並不能實現端到端的方式進行訓練,一方面是因為文字識別的訓練需要精確的定位,而早期迭代中的定位往往不精確,另一方面相比於CNN,LSTM和CTC loss難優化;b).真實世界中的文字是以各種形態呈現的,而現有的方法只適用於水平和多方向文字上,並未涉及不規則形狀文字(如曲線文字).
針對上述存在的問題,受Mask RCNN的啟發,本文提出了端到端的Sence Text Spotter(包含文字檢測和文字識別),用於識別任意形狀的文字.
論文關鍵idea
- 提出了端到端的場景文字識別演算法MaskTextSpotter
- 該方法可以用於識別任意形狀的文字,包括水平、多方向和曲線文字
- 相比於之前的方法,本文提出了通過語義分割來實現精確的文字檢測和文字識別
- 該方法在多個數據集的文字檢測和文字識別任務中取得了當前最優
Pipeline
整個網路結構沿用了Mask RCNN,包括四個元件:1).特徵提取主幹網路,採用的是ResNet+FPN;2).候選區域生成RPN;3).Fast RCNN迴歸邊框;4).mask分支,用於文字例項分割和字元分割;相比原生的Mask RCNN, MaskTextSpotter的創新點 在於修改了mask分支的輸出,使其包含全域性文字例項分割和字元分割
在訓練階段,RPN先生成大量的文字候選框,接著將候選框的RoI特徵分別送入Fast RCNN分支和mask分支 ,用於生成準確的文字候選框和文字例項分割圖及字元分割圖;
在測試階段,先使用Fast RCNN分支生成文字候選框(因為相比於RPN,它的輸出更為精確),然後再將其送入到mask分支 生成文字例項分割圖和字元分割圖
整個網路結構圖如下:

具體實現細節
Mask分支
相比於Mask RCNN中的mask分支,該 分支包含了兩個輸出:全部文字例項分割和字元分割 .具體的網路結構圖如下,從下圖可以看出,輸入的RoI特徵圖大小為 ,經過4個卷積核(即256個核大小為
)和1個反捲積,最後輸出38個圖(大小為
),包括1個全域性文字例項分割圖(即任意形狀文字的精確位置)、36個字元分割圖(1-9,a-z)、1個背景分割圖(用於後處理)
其mask分支的結構圖如下:

標籤生成(Label generation)
給定訓練圖片及對應的ground truth(這裡的標註資訊是一個多邊形,具體參看mask rcnn的標註資訊),這裡需要為RPN、Fast RCNN、mask分支生成對應的訓練資料.假設文字行ground truth的多邊形標註資訊用 表示,字元的類別及位置資訊用
表示 ,其中
表示類別,
表示字元位置資訊.當然如果只訓練文字檢測,C的標註資訊可以略去.
具體步驟如下:首先將多邊形標註資訊P轉化成最小水平外接矩形框,然後為PRN和Fast RCNN生成對應的target,具體的做法參看Faster RCNN.對於Mask分支,它的輸入是RPN產生的候選框,需要生成兩類目標圖(1個對應於上述的P,一個對應於上述的C(當然這個僅在文字識別時候用到)).給定一個候選區域框,先用匹配機制來獲取最佳匹配的水平矩形,進一步獲取到其對應的多邊形區域;接著將已匹配的多邊形與候選框通過平移和縮放進行對齊,最終的目標圖( )的計算公式如下:

其中 和
分別表示更新後的和原始的多邊形的頂點,
表示候選區域的頂點
優化
該模型使用的是一個多工損失函式,包含3個部分:rpn網路的損失、fast rcnn分支的損失和mask分支的損失,具體公式如下:

其中mask分支的損失包含了全域性文字分割損失和字元分割損失,具體展開公式為: ,
是一個平均二值交叉函式,
是一個空間加權soft-max損失函式,這裡
分別設定為1.0
-
全域性文字例項分割損失
其公式如下:

其中N表示全域性圖的總畫素個數, 表示畫素的標籤(
),
表示輸出畫素值
-
字元分割損失
字元分割總共輸出37個特徵圖,對應37個類別(即36個字元類別和1個背景類別),其公式如下:

其中N表示每個特徵圖的畫素總數,T表示字元總類別數,所以對於一個輸出圖X,它可以看成一個 的矩陣,
用於平衡正(字元類別)負(背景類別)樣本
測試
在PineLine中已經闡述了訓練和測試的流程,這裡就不重複敘述了.這裡主要講一下測試的詳細流程:首先將輸入影象通過Fast RCNN網路得到一堆的輸出框,然後經過NMS去除一些冗餘框;接著將保留的輸出框送入mask分支生成全域性圖和字元圖;最後通過在全域性圖上計算文字區域的輪廓直接獲取預測文字的多邊形框,在字元圖上由本文提出的 pixel voting 演算法生成字元序列。
-
畫素投票(pixel voting)
通過畫素投票機制將輸出的字元分割圖解碼成字元序列.首先將背景分割圖進行二值化(閾值為192);接著在二值化影象上找字元的連通區域並計算對應的字元分割圖上每個連通區域的均值(該值對應為該區域的字元概率);將具有最大均值概率對應的字元分配給該區域;最後採用從左至右的方式確定當前文字區域對應的文字序列.具體的畫素投票機制演算法如下:

-
加權編輯距離
編輯距離主要是用於在給定詞典裡查詢當前預測序列的最佳單詞.但是可能同時存在多個與最小距離匹配的單詞,而演算法並不能決定哪個是最佳匹配結果.因為在原生的編輯距離中,所有的操作(包括插入、刪除、替換)具有相同的代價.
本文提出的加權編輯距離與原生的編輯距離不同,它的操作代價是根據當前投票後的字元概率來確定.從數學角度闡述,假設給定兩個字串a和b,它們的長度分別是和
,則他們之間的加權距離用
,其具體的計算公式如下:




表示替換操作
下面給出編輯距離與加權編輯距離的的操作代價示意圖:

訓練引數
- 資料集
SynthText、ICDAR2013、ICDAR2015、Total-Text - 訓練
整個訓練包含兩個步驟:先在SynthText上進行預訓練,再在真實資料集上進行finetune.
在預訓練階段:batch_size為8,所有訓練圖片的短邊縮放到800同時保持原始影象的寬高比.RPN的batch_size為256,Fast RCNN的batch_size為512,兩者的輸入都保持1:3的正負樣本比例.Mask分支的batch_size為16.在finetune階段,會採用資料增廣(將輸入圖片隨機旋轉[−15◦~15◦]、隨機修改色度、亮度和對比度 )和多尺度訓練(將圖片短邊縮短到600、800、1000),RPN和Fast RCNN的batch_size和預訓練階段一致,mask分支的batch_size設定為64.
採用的是SGD優化器(decay為0.0001、moment為0.9).在預訓練階段,前170次迭代初始的學習率為0.005,在第120k次迭代後學習率降低10倍;在微調階段,初始學習率為0.001,在第40k次迭代後學習率為0.0001,在第80k次迭代後終止訓練.
整個實驗原始碼採用的是caffe2,GPU型號為Titan Xp,並行訓練,單GPU進行測試.對於一張720P的輸入圖片,其檢測速度為6.9FPS
在經典資料集上的測試結果
在ICDAR2013上的識別結果:

在ICDAR2015上的識別結果:

在ICDAR2013和ICDAR2015上的檢測結果如下:

在TotalText曲線文字的檢測結果如下:

總結
- 本文提出了端到端訓練的Text Spotting方法(MaskTextSpotter),該方法可以用於檢測和識別任意形狀的文字,包括水平文字、垂直文字、曲線文字.
- MaskTextSpotter中文字檢測模組採用的基於文字的例項分割(還有一些文字檢測方法也是採用例項分割,如PixelLink、PSENet等),識別模組採用的是基於字元的識別方法.
- 在字元識別時,因為本文只提供了數字和英文字元的識別,並未實現中文的識別.但是在真實場景中,中文識別普遍存在,如果按照論文的方法,如果要想識別中文,需要修改mask分支的輸出,如果沒記錯的話,常用的中文字就有5000個,那mask分支的最終輸出為5038張特徵圖;而且在標註資料的時候,還需要生成對每個中文進行bbox標註,工程量還是挺大的.(這是個人想法,如果理解錯誤了,望提醒)
- 這篇文章主題的思路其實就是一個mask rcnn,增加了mask分支的輸出.
文人文筆粗淺,以上是個人對這篇文章的理解,若有理解錯誤的地方,歡迎指正.