https://zhuanlan.zhihu.com/p/334340972
(一)圖像預處理
(二)數據生成
(三)文本檢測
最近在攻關法律領域的類案檢索系統,這幾天正好忙完了,得空繼續寫《OCR深度實踐系列》這一專題的文章。前面三章依次介紹了圖像預處理、數據生成以及文本檢測三個模塊,本章將介紹第四個關鍵模塊:文本識別。
本文項目地址:https://github.com/Vincent131499/Chinese-OCR3/tree/master/text_recognize
經過文字檢測之後我們就可以獲得文字區域的位置,此時就可以藉助各類文字識別算法來轉譯這些文字區域的內容。在以前的OCR任務中,識別過程分爲兩步:單字分割和分類任務,即:首先利用投影法將一連串文字切割出單個字體然後再送入CNN裏面進行文字分類。而現在流行的基於深度學習的端到端文字識別方法不需要文字切割這個環節,它將文字識別轉換成序列學習問題,雖然輸入圖像尺度和文本長度不同,但經過特徵網絡處理後就可以對整個文本圖像進行識別(文字切割融入到深度學習中)。
近年來隨着深度學習的迅猛發展,針對**場景文字識別(Scene Text Recognition,STR)**逐漸形成兩種主流方法:一種是基於CTC的方法,典型代表是CRNN,即CRNN-OCR;另一種是基於Attention的方法,即Attention-OCR。其實這兩類方法主要區別在於最後的輸出層,即如何將網絡學習到的序列特徵信息轉化爲最終的識別結果。這兩類方法在特徵學習階段都採用了CNN+RNN的網絡結構,而CRNN-OCR在對齊時採用的是CTC算法,而Attention-OCR採用的是attention機制。
本文作爲入門篇,主要介紹應用較爲廣泛的經典算法模型,包括CRNN、RATE以及端到端的兩個模型。
1.CRNN模型
CRNN(Convolutional Recurrent Neural Network)[1]是目前最爲流行的文本識別模型之一,可以識別不定長文本序列。如下圖所示,網絡結構包含三個部分,從下到上依次爲:
- 卷積層:使用CNN從輸入圖像中提取特徵序列;
- BiLSTM序列層:用BiLSTM將特徵向量進行融合以提取字符序列的上下文特徵,然後得到每列特徵的概率分佈;
- 轉錄層:使用CTC把從BiLSTM獲取的標籤分佈通過去重整合等操作轉換成最終的識別結果。
2.RARE模型
RARE(Robust text renognizer with Automatic Rectification)模型[2]在識別變形的圖像文本時效果很好。網絡流程如下圖所示,針對輸入圖像,模型首先對其進行空間變換網絡處理達到矯正的目的,隨後將矯正過的圖像送入序列識別網絡中得到文本預測結果。
其中,空間變換網絡結構如下圖所示,內部包括定位網絡、網格生成器、採樣器三個子結構。經過訓練後,它可以根據輸入圖像的特徵圖動態地產生空間變換網格,然後採樣器根據變換網格核函數從原始圖像中採樣獲得一個矩形的文本圖像。RARE中支持一種稱爲TPS(thin-plate splines)的空間變換,從而能夠比較準確地識別透視變換過的文本、以及彎曲的文本。
3.端到端模型
對於現有的字符識別任務來說,若字符區域不充滿整張圖片,那麼字符識別的效果將會出現災難性的下滑,因此仍然需要字符檢測任務作爲字符識別的前置任務,檢測結果的好壞直接決定識別結果的好壞。但是檢測模型與識別模型是兩個獨立的模型,因此計算量和消耗的時間會大幅增加。近年來,有學者嘗試將兩個任務合併到一起實現,這不僅可以使多任務模型相互補足,也能使計算量得到一定程度的降低。
(1)FOTS Rotation-Sensitive Regression
FOTS(Fast Oriented Text Spotting)是圖像文本檢測與識別同步訓練、端到端可學習的網絡模型。檢測和識別任務共享卷積特徵層,既節省了計算時間,也比兩階段訓練方式學習到更多圖像特徵。引入了旋轉敏感區域,可以從卷積特徵圖中產生定向得到文本區域,從而支持傾斜文本的識別。
(2)STN-OCR模型
STN-OCR同樣是端到端的集成圖像文本檢測和識別的可學習模型。模型架構如下圖所示,檢測部分嵌入了一個空間變換網絡(STN)來對原始輸入圖像進行仿射(affine)變換。利用這個空間變換網絡,可以對檢測到的多個文本塊分別執行旋轉、縮放和傾斜等圖形矯正動作,進而促進後面的文本識別取得更好的識別精度。在訓練上STN-OCR屬於半監督學習方法,只需要提供文本內容標註,而不要求文本定位信息。作者也提到,如果從頭開始訓練則網絡收斂速度較慢,因此建議漸進地增加訓練難度。STN-OCR已經開放了工程源代碼和預訓練模型。
4.實戰演示
接下來本文將以經典的CRNN模型爲例講解文本識別的訓練-推理實戰演示。
該項目位於Chinese-OCR3/text_recognize/crnn_chinese。
(1)數據集
step1:下載訓練數據(下載地址:鏈接:https://pan.baidu.com/s/16oM4qlWu-SUCu8A-b_PDug 提取碼:phhy )
step2:下載標籤數據(下載地址:鏈接:https://pan.baidu.com/s/14gagbl60tyC2w3qsaRSAQw 提取碼:n52k)
step3:修改配置文件lib/config/360CC_config.yaml,將訓練數據集的根目錄換成本地數據集的路徑
DATASET
ROOT: 'to/your/images/path'
step4:將下載的標籤數據中的char_std_5900.txt放入lib/dataset/txt/
step5:將下載的標籤數據中的train.txt和test.txt放入lib/dataset/txt/
數據簡介:
- 共約364萬張圖片,按照99:1劃分成訓練集和驗證集。
- 數據利用中文語料庫(新聞 + 文言文),通過字體、大小、灰度、模糊、透視、拉伸等變化隨機生成
- 包含漢字、英文字母、數字和標點共5990個字符(字符集合:https://github.com/YCG09/chinese_ocr/blob/master/train/char_std_5990.txt )
- 每個樣本固定10個字符,字符隨機截取自語料庫中的句子
- 圖片分辨率統一爲280x32
(2)訓練
訓練命令:
python train.py --cfg lib/config/360CC_config.yaml
查看訓練過程的loss變化:
cd output/360CC/crnn/xxxx-xx-xx-xx-xx/
tensorboard --logdir log
注意:支持定長訓練。但是可以修改數據加載器以支持隨機長度訓練。
(3)推理
運行命令:
python demo.py --image_path readme_images/test.png --checkpoint output/checkpoints/mixed_second_finetune_acc_97P7.pth
(4)自定義數據集
若想使用自己的數據來訓練一個CRNN文本識別模型,只需更改配置文件即可。
step1:編輯配置文件lib/config/OWN_config.yaml,將訓練數據集的根目錄換成本地數據集的路徑
DATASET:
ROOT: 'to/your/images/path'
step2:將訓練集train_own.txt和測試集test_own.txt放入lib/dataset/txt/
數據集樣例:test_own.txt
20456343_4045240981.jpg 你好啊!祖國!
20457281_3395886438.jpg 晚安啊!世界!
...
隨後就可以繼續上面的訓練和推理。