曾參考此處->:https://blog.csdn.net/qq_30110069/article/details/98742701
Tesseract-OCR 4.1 LSTM訓練流程 (win10環境)
一、配置tesseract 4.1版本
可通過自行編譯源碼或者下載安裝文件安裝tesseract。最新的tesseract 4.1 LSTM版無法找到安裝文件,通過編譯源碼生成如下目錄:
下載源碼VS2017自行編譯tesseract 4.1教程: https://blog.csdn.net/kds0714/article/details/90755691
配置環境變量
1、將bin目錄加到系統變量Path
2、將tessdata(訓練的字庫文件) 加到管理員用戶變量,變量名TESSDATA_PREFIX,變量值爲tessdata目錄的路徑
測試環境:
Win+R 分別輸入:
tesseract --version
tesseract --list-langs
查看版本和當前含有的語言庫,有返回值即可
二、訓練流程
基本流程:
(1) jTessBoxEditor將樣本合成tif文件
(2) 用已有的庫識別tif文件,產生記錄着數字內容,左上角座標,寬高的.box文件。已有的庫可以是下載的,也可以是自己訓練出的
(3) 用jTessBoxEditor工具標註樣本,調整.box文件數字內容和位置
(4) 在已有庫的基礎上訓練樣本,合成訓練文件。
(5) 將合成後的文件放在tessdata文件夾中,通過代碼調用來識別,測試識別率。
訓練可迭代:如用eng爲基礎,訓練樣本生成nml,nml仍含有eng的效果,但按理說效果可能會減弱些。所以可以加上不同種類的樣本訓練成一個大字庫。
準備:
訓練目錄下,至少應含有合成的.tif文件。需要作爲基礎字庫的原.traineddata文件,如eng.traineddata
以官方下載的eng爲例,訓練nml.num.exp0
1、用jTessBoxEditor工具,將樣本文件合併成.tif文件。規定如下命名格式:[lang].[fontname].exp[num].tif
如nml.num.exp0.tif,nml是語言名,num是字體名,exp0是版本號。訓練過程應保持這種命名習慣
jTessBoxEditor工具的使用:
Tools -> Merge TIFF,選擇文件類型爲all the images,選中所有圖片 -> 命名爲***.tif 合併爲.tif文件
2、在訓練目錄下打開cmd,用現有的字體庫識別.tif文件,生成對應的.box文件。比如,用eng庫識別樣本,生成.box文件:
tesseract nml.num.exp0.tif nml.num.exp0 -l eng --psm 6 batch.nochop makebox
輸入命令後,會生成nml.um.exp0.box文件。
其中命令參數含義:
nml.num.exp0.tif 上一步生成的.tif 格式的文件
nml.num.exp0 指明要生成的.box文件的名稱
-l eng表示識別使用的語言是eng,
–psm表示採用的識別模式,通常6比較好。可通過tesseract --help-psm查看所有的識別模式。6指的是假設去識別一個單一的文本塊。
3、jTessBoxEditor調整.box文件
Box Editor -> Open打開.tif文件,會關聯同名的.box文件。調整數字時對應修改.box文件。
4、利用.tif和.box文件,生成.lstmf文件用於lstm訓練
tesseract nml.num.exp0.tif nml.num.exp0 -l eng --psm 6 lstm.train
其中每個參數的意義爲
nml.num.exp0.tif 上一步生成的.tif 格式的文件
nml.num.exp0 指明要生成的.lstmf文件的名稱
運行後會多出一個nml.num.exp0.lstmf文件
5、用已有的或官方下載的.traineddata文件中提取.lstm文件
https://github.com/tesseract-ocr/tessdata_best 從該鏈接中下載所需語言的.traineddata文件
注:一定要用從上述鏈接中下載的.traineddata文件,其他的.traineddata文件中提取.lstm文件無法進行訓練。
將下載好的.traineddata文件拷貝到訓練文件夾下
combine_tessdata -e eng.traineddata eng.lstm
運行上述代碼,會從.traineddata文件中提取出eng.lstm 文件
6. 創建文件,裏邊的內容爲.lstmf文件的路徑地址
7、進行訓練
lstmtraining --model_output="F:\Test\AMyWork\ImgSampleLib\nomal\samples\CTCCB24\output\output" --continue_from=F:\Test\AMyWork\ImgSampleLib\nomal\samples\CTCCB24\eng.lstm"
--train_listfile="F:\Test\AMyWork\ImgSampleLib\nomal\samples\CTCCB24\eng.training_files.txt" --traineddata="F:\Test\AMyWork\ImgSampleLib\nomal\samples\CTCCB24\eng.traineddata"
--debug_interval -1 --max_iterations 2000
各個參數的意義:
–model_output 模型訓練輸出的路徑,命令中我的訓練目錄是CTCCB24,新建output\output存放訓練階段文件和最終的字庫
–continue_from 訓練從哪裏開始,這裏指定從第4步中提取的eng.lstm文件。也可從之前訓練生成的階段文件output_checkpoint開始。
–train_listfile 指定上一步創建的eng.training_files.txt文件路徑
–traineddata 第4步中下載的.traineddata文件的路徑
–debug_interval 當值爲-1時,訓練結束,會顯示訓練的一些結果參數
–max_iterations 指明訓練遍歷次數。最好使用這個參數:–target_error_rate 0.01 訓練至錯誤率低於0.01
訓練結束後,在output文件夾中會生成一個output_checkpoint文件和多個類似output0.012_3.checkpoint的.checkpoint文件
8、將checkpoint文件和.traineddata文件合併成新的.traineddata文件
lstmtraining --stop_training --continue_from="F:\Test\AMyWork\ImgSampleLib\nomal\samples\CTCCB24\output\output_checkpoint"
--traineddata="F:\Test\AMyWork\ImgSampleLib\nomal\samples\CTCCB24\eng.traineddata" --model_output="F:\Test\AMyWork\ImgSampleLib\nomal\samples\CTCCB24\output\nml.traineddata"
各個參數的意義:
–stop_training 默認要有
–continue_from 上一步生成的output_checkpoint文件路徑
–traineddata 第4步中下載的已有.traineddata文件的路徑
–model_output zth.traineddata 輸出的路徑
9、將新生成的nml.traineddata文件拷貝到tessdata文件夾下,通過代碼進行識別
注意:VS項目要配置好tesseract4.1的頭文件、庫目錄,指定tessdata目錄
一些質量不好的圖片可能仍然需要二值化、濾波等預處理操作
bozhu不是大佬,各位看官可以結合其他博客使用。。。
項目過去了就沒有及時覆盤…有時間定會繼續研究。
當然每人的問題可能跟環境等都有問題,當時是自己用VS2017編譯的源碼,後期會提供編譯後文件。
當時調用時遇到過奇怪的問題:
當時是因爲在自己電腦上編譯,在硬件垃圾的服務器上調用。
出現 應用程序無法運行0xc000001d的問題,查找issues找到原因:編譯tesseract時makefile文件默認開啓cpu的AVX2指令集加速。但調用時若不支持AVX2指令集,就會報這個錯誤。
只有3代以上cpu才支持AVX2指令集
若有這種問題請移步:
https://blog.csdn.net/Hu_helloworld/article/details/102612794
有問題建議先查找issues,總能找到答案:
https://github.com/tesseract-ocr/tesseract/issues