OCR算法:CNN+BLSTM+CTC架构(VS15)
原文鏈接:OCR算法-CNN+BLSTM+CTC架構
由于作者使用了Boost1.57-Vc14,而1.57的VC14版本作者沒有給出下載鏈接,因此需要自行編譯,建議換掉作者的第三方庫,使用其他的庫,比如:這篇文章:VS編譯Caffe非常簡單。網盤:3rdlibVC14。
有少量的改動,如有疑問,請移步原文,直接到作者GitHub界面...鏈接:https://github.com/senlinuc/caffe_ocr
另外一篇使用TensorFlow-LSTM的方法:TensorFlow-LSTM+CTC方法;代碼在Github上。
實驗結果:
?????? 實測結果inception的準確率要比resnet高一些,ResNet把熱情識別為然情,把溫柔識別成溫采.
主流ocr算法研究實驗性的項目,目前實現了CNN+BLSTM+CTC架構
ocrlstmctcres-lstmdensenet
- ?41?commits
- ?1?branch
- ?0?releases
- ?1?contributor
C++Cuda Other
Clone or download Find file
Latest commit?93775fd?4 days ago
?senlinuc?Update README.md
| ? | 3rdparty | 1. add openblas; 2.add vs2015 project | a month ago |
| ? | caffe-vsproj | remove ctc_loss_layer | a month ago |
| ? | examples | add full-res-blstm network | a month ago |
| ? | include | fix reshape bug (batch size change) | 5 days ago |
| ? | src | fix reshape bug (batch size change) | 6 days ago |
| ? | tools | commit main code | a month ago |
| ? | README.md | Update README.md | 4 days ago |
?README.md
簡介
caffe_ocr是一個對現有主流ocr算法研究實驗性的項目,目前實現了CNN+BLSTM+CTC的識別架構,并在數據準備、網絡設計、調參等方面進行了諸多的實驗。代碼包含了對lstm、warp-ctc、multi-label等的適配和修改,還有基于inception、restnet、densenet的網絡結構。代碼是針對windows平臺的,linux平臺下只需要合并相關的修改到caffe代碼中即可。
caffe代碼修改
?1. data layer增加了對multi-label的支持
?2. lstm使用的是junhyukoh實現的lstm版本(lstm_layer_Junhyuk.cpp/cu),原版不支持變長輸入的識別。輸入的shape由(TxN)xH改為TxNxH以適應ctc的輸入結構。
?3. WarpCTCLossLayer去掉了對sequence indicators依賴(訓練時CNN輸出的結構是固定的),簡化了網絡結構(不需要sequence indicator layer)。
?4. densenet修改了對Reshape沒有正確響應的bug,實現了對變長輸入預測的支持。
?5. 增加transpose_layer、reverse_layer,實現對CNN feature map與lstm輸入shape的適配
編譯
? 1. 安裝opencv,boost,cuda,其它依賴庫在3rdparty下(包含debug版的lib:http://pan.baidu.com/s/1nvIFojJ)
? 2. caffe-vsproj下為vs2015的工程,配置好依賴庫的路徑即可編譯,編譯后會在tools_bin目錄下生成訓練程序caffe.exe
? 3. 相關的依賴dll可從百度網盤下載(http://pan.baidu.com/s/1boOiscJ)
實驗
?(1)VGG Synthetic Word Dataset
?(2)合成的中文數據(http://pan.baidu.com/s/1c2fHpvE?)(包含中文語料庫)
????
- ? 數據為利用中文語料庫(新聞+文言文),通過字體、大小、灰度、模糊、透視、拉伸等變化隨機生成。
- ? 字典中包含漢字、標點、英文、數字共5990個字符(語料字頻統計,全角半角合并)
- ? 每個樣本固定10個字符,字符隨機截取自語料庫中的句子
- ? 圖片分辨率統一為280x32
- ? 共生成約360萬張圖片,按9:1分成訓練集、驗證集(暫時沒有分測試集)
- 英文數據集 VGG Synthetic Word Dataset:
| crnn | 67.13ms | 10.28ms | 0.8435 | 0.9163 | 32MB |
| inception-bn-res-blstm | 41.62ms | 8.68ms | 0.7353 | 0.8609 | 15MB |
| densenet-res-blstm | N/A | 6.07ms | 0.7548 | 0.893 | 11MB |
- 中文數據集:
| inception-bn-res-blstm | 65.4ms | 11.2ms | 0.92 | 26.9MB |
| resnet-res-blstm | 64ms | 10.75ms | 0.91 | 23.2MB |
| densenet-res-blstm | N/A | 7.73ms | 0.965 | 22.9MB |
| densenet-no-blstm | N/A | 2.4ms | 0.97 | 5.6MB |
| densenet-sum-blstm-full-res-blstm | N/A | 7.83ms | 0.9805 | 15.5MB |
| densenet-no-blstm-vertical-feature | N/A | 3.05ms | 0.9816 | 9.6MB |
中文數據集上訓練好的模型:http://pan.baidu.com/s/1i5d5zdN
說明:
- ? CPU是Xeon E3 1230, GPU是1080TI
- ? densenet使用的是memory-efficient版本,其CPU代碼并沒有使用blas庫,只是實現了原始的卷積操作,速度非常慢,待優化后再做對比。
- ? “res-blstm”表示殘差形式的blstm,“no-blstm”表示沒有lstm層,CNN直接對接CTC
- ? 準確率是指整串正確的比例,在驗證集上統計,"準確率-no lexicon"表示沒用詞典的準確率,"準確率-lexicon-minctcloss"指先在詞典中查找Edit Distance <=2的單詞,再選擇ctcloss最小的單詞作為識別結果
- ? predict-CPU/GPU為單張圖片的預測時間,predict-CPU的后端是openblas,MKL比openblas快約一倍。中文數據集上圖片分辨率為280x32,英文數據集100x32
- ? densenet-sum-blstm-full-res-blstm相對于densenet-res-blstm有兩點改動:(1)兩個lstm結合成blstm的方式由concat改為sum;(2)兩層blstm都采用殘差方式連接(CNN最后的Channel數改為與blstm結點數相同),最后得到了最高的準確率。
- ? densenet-no-blstm-vertical-feature相對于densenet-no-blstm去掉了1x4的pooling層,使得CNN最后一層的feature maps的高度為4,更好的保留筆畫在垂直方向的變化信息,再reshape BxCxHxW --> Bx(CxH)x1xW串成高度為1的feature maps, 最后準確率上略好于之前的最好結果,可見CNN feature方面還有很多可挖掘的地方。
?(1) 殘差形式的blstm可顯著提升準確率,中文數據集上0.94-->0.965,兩層BLSTM都用殘差后又提升到了0.9805
?(2) 網絡的CNN部分相對于BLSTM部分可以設置更高的學習率,這樣可以顯著增加收斂速度
?(1)去掉blstm,直接用CNN+CTC的結構,在中文數據集上也可以取得很高的準確率(densenet-no-blstm),為什么?
? ? ?可能的原因:a)CNN最后一層得到的特征對于字符級別的建模已經具有很好表征,b)lstm收斂較慢,需要更長的時間才能達到相同的精度。
?(1)寬度較小的數字、英文字符會出現丟字的情況,如“11”、“ll”,應該是因為CNN特征感受野過大沒有看到文字間隙的緣故。
提高準確率TODO
?1. 數據方面: 增大數據量,語料庫均勻采樣(https://yq.aliyun.com/articles/109555?t=t1)
?2. 網絡方面:增大網絡(train、test loss很接近,現有網絡沒有過擬合),Attention,STN,輔助loss
引用
總結
以上是生活随笔為你收集整理的OCR算法:CNN+BLSTM+CTC架构(VS15)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三维重建:三维空间中平面的旋转公式
- 下一篇: OpenCV:简单计算曲线弧度-弓形弧度