OCR算法:CNN+BLSTM+CTC架构(VS15)
原文鏈接:OCR算法-CNN+BLSTM+CTC架構(gòu)
由于作者使用了Boost1.57-Vc14,而1.57的VC14版本作者沒(méi)有給出下載鏈接,因此需要自行編譯,建議換掉作者的第三方庫(kù),使用其他的庫(kù),比如:這篇文章:VS編譯Caffe非常簡(jiǎn)單。網(wǎng)盤(pán):3rdlibVC14。
有少量的改動(dòng),如有疑問(wèn),請(qǐng)移步原文,直接到作者GitHub界面...鏈接:https://github.com/senlinuc/caffe_ocr
另外一篇使用TensorFlow-LSTM的方法:TensorFlow-LSTM+CTC方法;代碼在Github上。
實(shí)驗(yàn)結(jié)果:
?????? 實(shí)測(cè)結(jié)果inception的準(zhǔn)確率要比resnet高一些,ResNet把熱情識(shí)別為然情,把溫柔識(shí)別成溫采.
主流ocr算法研究實(shí)驗(yàn)性的項(xiàng)目,目前實(shí)現(xiàn)了CNN+BLSTM+CTC架構(gòu)
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
簡(jiǎn)介
caffe_ocr是一個(gè)對(duì)現(xiàn)有主流ocr算法研究實(shí)驗(yàn)性的項(xiàng)目,目前實(shí)現(xiàn)了CNN+BLSTM+CTC的識(shí)別架構(gòu),并在數(shù)據(jù)準(zhǔn)備、網(wǎng)絡(luò)設(shè)計(jì)、調(diào)參等方面進(jìn)行了諸多的實(shí)驗(yàn)。代碼包含了對(duì)lstm、warp-ctc、multi-label等的適配和修改,還有基于inception、restnet、densenet的網(wǎng)絡(luò)結(jié)構(gòu)。代碼是針對(duì)windows平臺(tái)的,linux平臺(tái)下只需要合并相關(guān)的修改到caffe代碼中即可。
caffe代碼修改
?1. data layer增加了對(duì)multi-label的支持
?2. lstm使用的是junhyukoh實(shí)現(xiàn)的lstm版本(lstm_layer_Junhyuk.cpp/cu),原版不支持變長(zhǎng)輸入的識(shí)別。輸入的shape由(TxN)xH改為T(mén)xNxH以適應(yīng)ctc的輸入結(jié)構(gòu)。
?3. WarpCTCLossLayer去掉了對(duì)sequence indicators依賴(訓(xùn)練時(shí)CNN輸出的結(jié)構(gòu)是固定的),簡(jiǎn)化了網(wǎng)絡(luò)結(jié)構(gòu)(不需要sequence indicator layer)。
?4. densenet修改了對(duì)Reshape沒(méi)有正確響應(yīng)的bug,實(shí)現(xiàn)了對(duì)變長(zhǎng)輸入預(yù)測(cè)的支持。
?5. 增加transpose_layer、reverse_layer,實(shí)現(xiàn)對(duì)CNN feature map與lstm輸入shape的適配
編譯
? 1. 安裝opencv,boost,cuda,其它依賴庫(kù)在3rdparty下(包含debug版的lib:http://pan.baidu.com/s/1nvIFojJ)
? 2. caffe-vsproj下為vs2015的工程,配置好依賴庫(kù)的路徑即可編譯,編譯后會(huì)在tools_bin目錄下生成訓(xùn)練程序caffe.exe
? 3. 相關(guān)的依賴dll可從百度網(wǎng)盤(pán)下載(http://pan.baidu.com/s/1boOiscJ)
實(shí)驗(yàn)
?(1)VGG Synthetic Word Dataset
?(2)合成的中文數(shù)據(jù)(http://pan.baidu.com/s/1c2fHpvE?)(包含中文語(yǔ)料庫(kù))
????
- ? 數(shù)據(jù)為利用中文語(yǔ)料庫(kù)(新聞+文言文),通過(guò)字體、大小、灰度、模糊、透視、拉伸等變化隨機(jī)生成。
- ? 字典中包含漢字、標(biāo)點(diǎn)、英文、數(shù)字共5990個(gè)字符(語(yǔ)料字頻統(tǒng)計(jì),全角半角合并)
- ? 每個(gè)樣本固定10個(gè)字符,字符隨機(jī)截取自語(yǔ)料庫(kù)中的句子
- ? 圖片分辨率統(tǒng)一為280x32
- ? 共生成約360萬(wàn)張圖片,按9:1分成訓(xùn)練集、驗(yàn)證集(暫時(shí)沒(méi)有分測(cè)試集)
- 英文數(shù)據(jù)集 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 |
- 中文數(shù)據(jù)集:
| 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 |
中文數(shù)據(jù)集上訓(xùn)練好的模型:http://pan.baidu.com/s/1i5d5zdN
說(shuō)明:
- ? CPU是Xeon E3 1230, GPU是1080TI
- ? densenet使用的是memory-efficient版本,其CPU代碼并沒(méi)有使用blas庫(kù),只是實(shí)現(xiàn)了原始的卷積操作,速度非常慢,待優(yōu)化后再做對(duì)比。
- ? “res-blstm”表示殘差形式的blstm,“no-blstm”表示沒(méi)有l(wèi)stm層,CNN直接對(duì)接CTC
- ? 準(zhǔn)確率是指整串正確的比例,在驗(yàn)證集上統(tǒng)計(jì),"準(zhǔn)確率-no lexicon"表示沒(méi)用詞典的準(zhǔn)確率,"準(zhǔn)確率-lexicon-minctcloss"指先在詞典中查找Edit Distance <=2的單詞,再選擇ctcloss最小的單詞作為識(shí)別結(jié)果
- ? predict-CPU/GPU為單張圖片的預(yù)測(cè)時(shí)間,predict-CPU的后端是openblas,MKL比openblas快約一倍。中文數(shù)據(jù)集上圖片分辨率為280x32,英文數(shù)據(jù)集100x32
- ? densenet-sum-blstm-full-res-blstm相對(duì)于densenet-res-blstm有兩點(diǎn)改動(dòng):(1)兩個(gè)lstm結(jié)合成blstm的方式由concat改為sum;(2)兩層blstm都采用殘差方式連接(CNN最后的Channel數(shù)改為與blstm結(jié)點(diǎn)數(shù)相同),最后得到了最高的準(zhǔn)確率。
- ? densenet-no-blstm-vertical-feature相對(duì)于densenet-no-blstm去掉了1x4的pooling層,使得CNN最后一層的feature maps的高度為4,更好的保留筆畫(huà)在垂直方向的變化信息,再reshape BxCxHxW --> Bx(CxH)x1xW串成高度為1的feature maps, 最后準(zhǔn)確率上略好于之前的最好結(jié)果,可見(jiàn)CNN feature方面還有很多可挖掘的地方。
?(1) 殘差形式的blstm可顯著提升準(zhǔn)確率,中文數(shù)據(jù)集上0.94-->0.965,兩層BLSTM都用殘差后又提升到了0.9805
?(2) 網(wǎng)絡(luò)的CNN部分相對(duì)于BLSTM部分可以設(shè)置更高的學(xué)習(xí)率,這樣可以顯著增加收斂速度
?(1)去掉blstm,直接用CNN+CTC的結(jié)構(gòu),在中文數(shù)據(jù)集上也可以取得很高的準(zhǔn)確率(densenet-no-blstm),為什么?
? ? ?可能的原因:a)CNN最后一層得到的特征對(duì)于字符級(jí)別的建模已經(jīng)具有很好表征,b)lstm收斂較慢,需要更長(zhǎng)的時(shí)間才能達(dá)到相同的精度。
?(1)寬度較小的數(shù)字、英文字符會(huì)出現(xiàn)丟字的情況,如“11”、“l(fā)l”,應(yīng)該是因?yàn)镃NN特征感受野過(guò)大沒(méi)有看到文字間隙的緣故。
提高準(zhǔn)確率TODO
?1. 數(shù)據(jù)方面: 增大數(shù)據(jù)量,語(yǔ)料庫(kù)均勻采樣(https://yq.aliyun.com/articles/109555?t=t1)
?2. 網(wǎng)絡(luò)方面:增大網(wǎng)絡(luò)(train、test loss很接近,現(xiàn)有網(wǎng)絡(luò)沒(méi)有過(guò)擬合),Attention,STN,輔助loss
引用
總結(jié)
以上是生活随笔為你收集整理的OCR算法:CNN+BLSTM+CTC架构(VS15)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 三维重建:三维空间中平面的旋转公式
- 下一篇: 怪物猎人歼世灭尽龙怎么打