OCR深度實踐系列(三):文本檢測

https://mp.weixin.qq.com/s?__biz=MzI5MjYzNzAyMw==&mid=2247484216&idx=1&sn=619ea106f11af6bd3d0f851fd57add9e&chksm=ec7f1308db089a1e6dd201e5da662e4951382178331f94d5af3b08c4af8c2f58c6eec1f9e49d&scene=178&cur_album_id=1604852641946271744#rd

目前OCR的研究集中在自然場景文本理解這一領域,其應用包括安全智能監控如車牌識別、智能穿戴設備應用如智能閱讀、手機拍攝應用如關鍵字提取和智能搜索以及身份證/銀行卡的關鍵信息識別。

本文是OCR深度實踐系列的第三篇,主要介紹OCR的關鍵環節-文本檢測,首先列出傳統方法和深度學習方法,隨後介紹深度學習的兩種典型網絡CTPN和CRAFT,最後給出這兩種網絡的實戰演示。

本文項目地址:https://github.com/Vincent131499/Chinese-OCR3/tree/master/text_detection

場景文本檢測的發展歷程與絕大多數的計算機視覺任務相似,分爲傳統文本檢測方法和基於深度學習的文本檢測方法。

1.傳統文本檢測方法

傳統的檢測方法可分爲兩類:基於連通域的方法和基於滑動窗口的方法。

連通區域(Connected Component)一般是指圖像中具有相同像素值且位置相鄰的前景像素點組成的圖像區域。

基於連通域的自然場景文本檢測方法是通過提取圖像中的連通區域獲得文本候選區域,極大地縮小了搜索範圍。然而這類方法大量依賴文本連通區域的檢測結果,對文本檢測召回率和文本輪廓的準確性的影響很大,所以對於該類方法,需要在保證文本連通區域檢測高召回率的前提下,進一步思考如何獲得準確的文本輪廓,從而提高文本檢測的整體性能。然而在真實的場景中,由於光照變化、褪色、噪聲干擾等因素,圖像處理往往十分複雜,很難從中準確的檢測出文本連通區域。

基於滑動窗口的文本檢測方法是指在圖像中滑動一個子窗口,同時在滑窗的各個位置應用檢測算法。該類方法通常是基於單個字符的分類器,將滑動窗口作用於候選框,當場景很複雜時,比如光照、陰影的影響,導致字符分類穩定性變差,尤其是在不同場景下的檢測。此外,文本行的排列較爲隨意,橫的、豎的、斜的這些都會使得檢測窗口的選取和後期文本行的生成難度增加。與此同時,如何選取合適的檢測窗口滑動步長也是一個很繁瑣的問題。

2.基於深度學習的文本檢測方法

本篇重點介紹基於深度學習的文本檢測方法。在深度學習出現之前,場景文本檢測的主要趨勢是自下而上的,且大多數使用手工提取特徵(例如MSER 或 SWT)作爲基礎的組件。近年來,通過採用流行的物體檢測/分割方法,如SSD,Faster R-CNN和FCN,提出了基於深度學習的文本檢測器。

該方法使用效果更加穩定的高層語義特徵,利用更多的數據去擬合更復雜、泛化能力更強的模型,在場景圖片文本檢測中取得了突破性的進展。具體可劃分爲兩類方法:基於迴歸的方法、基於圖像分割的方法。

2.1 基於迴歸的方法

針對基於迴歸的文本檢測方法,其基本思路是先利用若干個Default Boxes(也稱Anchor)產生大量的候選文本框,直接進行NMS後處理或者進一步精調再進行NMS後處理得到最終的檢測結果。此處重點介紹CTPN網絡模型,模型架構如下所示。

圖片

具體包括7個步驟:

1)使用VGG16位backbone提取空間特徵,取VGG的conv5層輸出feature map;

2)使用3*3的滑窗針對feature map提取空間特徵形成新的feature map;

3)將這個新的feature map進行reshape,輸入到雙向LSTM提取每一行的序列特徵;

4)將雙向LSTM的輸出重新reshape,在經過一個FC卷積層;

5)經過類似Faster R-CNN的RPN網絡獲得text proposals;

6)使用NMS進行後處理,過濾多餘的文本框;

7)假如理想的話(文本水平),會將上述得到的一個文本小框使用文本線構造方法合成一個完整文本行,如果還有些傾斜,會做一個矯正的操作。

連接文本提議網絡CTPN(Connectionist Text Proposal Network)將文字沿文本行方向切割成更小且寬度固定的Proposal,極大的提高了檢測定位的精度。同時,考慮到文本水平行的語義上下文信息,使用雙向LSTM編碼水平行的文本信息,進一步提高了網絡的文本特徵表示能力。爲了解決文本任意方向排列的問題,引入方向信息將文本框劃分爲若干個Segment(可以是一個字符、一個單詞,或幾個字符)。

當然,CTPN也有一個很明顯的缺點:對於非水平的文本的檢測效果並不好。CTPN論文中給出的文本檢測效果圖都是文本位於水平方向的,顯然CTPN並沒有針對多方向的文本檢測有深入的探討。

2.2 基於圖像分割的方法

對於基於圖像分割的文本檢測,其基本思路是通過分割網絡結構進行像素級別的語義分割,進而基於分割的結果構建文本行。此處重點介紹CRAFT網絡模型,模型架構如下圖所示。

圖片

 

大多文本檢測方法使用嚴格的word-level邊界框進行訓練,在表示任意形狀的文本區域時會有所限制,而CRAFT則改進了這一點。CRAFT的網絡結構如圖。看起來並不複雜,基於VGG16的結構,整體類似UNet,是一個標準的分割模型,最終的輸出有兩個通道作爲score map:Region Score 和 Affinity Score。Region Score表示該像素點是文字中心的概率,Affinity Score可以認爲是該像素點是兩個字符之間的中心的概率。這個結構還是比較簡單的,其實大部分基於分割的模型網絡結構都比較簡單,主要是後處理與訓練數據。

訓練數據生成:

CRAFT的訓練數據label不是二值化的圖像,而是採用了類似熱力圖的圖像,這也對應了上面說的,表示的是該位置在文字中心的概率。

圖片

 

上圖是訓練數據的label的生成示意圖。首先看左邊,有了一個字符級的標註(第二個圖的紅框, Character Boxes),這個字符的四個點(第一個圖綠邊)構成一個四邊形,做對角線,構成兩個三角形(第一個圖藍邊),取三角形的中心,兩個框之間就有四個點,構成了一個新的邊框,這個邊框就是用來表示兩個字符之間的連接的label的(Affinity Boxes)。第三個圖是根據Box生成Label的過程,先生成一個2D的高斯圖,通過透視變換,映射成與box相同的形狀,最後粘到對應的背景上。

後處理

在網絡輸出score map之後,下面就要把這些像素級的label合成box,這篇論文裏用的方法並不複雜,首先是通過閾值過濾score map,進行二值化,然後接一個連通域分析(Connected Component Labeling ),接下來通過連通域畫出最終的QuadBox,可以看一下它的示意圖:

圖片

3.實戰

本文以上面提及的CTPN和CRAFT爲例針對輸入圖片進行文本檢測。輸入圖片爲:

圖片

3.1 CTPN演示

該項目在Chinese-OCR3/text_detection/ctpn_detection目錄下。

Step1:構建所需的運行庫

 

cd utils/bboxchomod +x make.sh./make.sh

Step2:下載預訓練文件

百度雲鏈接:鏈接:https://pan.baidu.com/s/1vMal539YjUr3EkLLUvhquw 提取碼:l5sb

Step3:將下載的預訓練文件checkpointsmlt放在ctpndetection/目錄下

Step4:運行demo

python ./main/demo.py

生成效果如下:

圖片

3.2 CRAFT演示

該項目在Chinese-OCR3/text_detection/craft_detection目錄下。

分爲兩種方式使用:

方式1:直接使用CRAFT的預訓練模型測試自己的文本圖像

step1:下載CRAFT預訓練權重文件craftmlt25k.pth(鏈接:https://pan.baidu.com/s/1sISrSV8Y-Zz7HxlPgPTtiA 提取碼:svva)並將該權重文件放入pretrained目錄下。
step2:將需要檢測的圖像全部放入imgs目錄下。
step3:運行代碼:

python test.py --trained_model ./pretrained/craft_mlt_25k.pth

step4:檢測的結果將保存在result文件夾中供查看。

生成效果如下:

圖片

方式2:基於預訓練模型在自己的數據集上繼續訓練,遷移學習

step1:標註自己的數據集,使用標註工具labelme:,我們進行字符級別的標註,即對每個字符順時針標註4個點構成一個多邊形框,如下圖所示:

圖片

 

然後我們給這個多邊形框標註對應的字符,方便之後如果要做文本識別時使用。

step2:假設我們數據集的根目錄是blw,目錄中有圖片blw1.jpg和標註blw1.json兩種文件,此時運行generatescoremap.py(注意修改main函數中的name = 你的根目錄名稱),運行完之後,你的目錄中除了上面兩種.jpg和.json外,會多了blwregion1.npy和blwaffinity1.npy兩種,分別對應了CRAFT中的regionmap和affinitymap。

step3:將生成的四種文件分別放入data對應的子目錄下

python file_construct.py

•如下所示:
data:affinity:blwaffinity1.npy
anno:blw1.json
img:blw1.jpg
region:blwregion1.npy

 step4:此時我們自己的數據集就準備好了。運行train.py(注意修改main函數中的參數設置),訓練好的模型默認存放在./models中。

step5:使用訓練好的模型進行文本檢測

python test.py --trained_model ./models/5.pth
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章