本文主要參考以下幾篇文章改編而成:
http://ask.touchelf.net/ask/article/43.html
https://zhuanlan.zhihu.com/p/77013854
https://blog.csdn.net/yasi_xi/article/details/8763385
簡介
OCR(Optical Character Recognition):光學字符識別,是指電子設備(例如掃描儀或數碼相機)檢查紙上打印的字符,通過檢測暗、亮的模式確定其形狀,然后用字符識別方法將形狀翻譯成計算機文字的過程。
Tesseract:開源的OCR識別引擎,初期Tesseract引擎由HP實驗室研發,后來貢獻給了開源軟件業,后由Google進行改進、修改bug、優化,重新發布。
聲明
本文僅適用於Tesseract-OCR5.0的環境;如果安裝的是Tesseract-OCR4.0版本,訓練過程請參考:http://ask.touchelf.net/ask/article/43.html
如果使用Java的Tess4J插件,建議使用Tesseract-OCR4.0版本制作訓練包;因為根據本人實測,Tesseract-OCR5.0做出來的訓練包,在tess4j-3.4.8版本上,無法測試通過。
下載與安裝
1、Tesseract-OCR的Windows版本下載地址:https://digi.bib.uni-mannheim.de/tesseract/,本文用的版本是tesseract-ocr-w64-setup-v5.0.0-alpha.20210811.exe。
注意:安裝完成之后,需要把安裝目錄(通常是:C:\Program Files\Tesseract-OCR)加入Path環境變量之中,以方便后面執行命令行工具。
注意:Tesseract-OCR4.0版本,默認安裝於C:\Program Files (x86)\Tesseract-OCR目錄。我用的是Tesseract-OCR5.0,64位版本。
注意:Tesseract-OCR4.0安裝之后,需要設置TESSDATA_PREFIX環境變量,指向C:\Program Files (x86)\Tesseract-OCR\tessdata;Tesseract-OCR5.0,64位版本則不需要此操作。
2、各版本對應字庫下載地址:https://github.com/tesseract-ocr/tessdata_best,要識別簡體中文需要下載chi_sim.traindata字庫。
注意:一定要用從上述鏈接中下載.traineddata文件;如果從原有tesseract-OCR中的.traineddata文件提取.lstm文件,會造成無法進行訓練。我這里下載的是eng.traineddata,因為我不用它來識別中文。
3、下載工具jTessBoxEditor,地址:https://sourceforge.net/projects/vietocr/files/jTessBoxEditor/,將之解壓縮到C盤某個目錄。這個工具是用來訓練樣本用的,由於該工具是用JAVA開發的,需要安裝JAVA虛擬機才能運行。
注意:帶FX的版本才支持中文。
初步測試
假定工作目錄為:D:\Work\testlang,在此目錄里面有一張測試圖片:3024.jpg;假定Tesseract-OCR安裝目錄為:C:\Program Files\Tesseract-OCR,已經將此目錄加入到Path環境變量中。
打開命令行工具(我是以管理員身份打開的,沒試過其它方式),切換到工作目錄,執行:
tesseract 3024.jpg result -l eng
從資源管理器打開工作目錄下的result.txt,里面的內容為:3M 2 A;顯然,識別率不是很高。
注意:-l 參數表明用何種語言包;如果是eng,則可以省略。
訓練
步驟一、首先,准備足夠多的訓練圖片
將這些圖片存放到工作目錄\orgin子目錄,本文全部為JPG格式的圖片。
步驟二,通過畫圖軟件,把這些圖片轉換為TIF格式
保存完之后,原先的JPG圖片已經無效,可以刪除。
步驟三、通過jTessBoxEditor,將這些TIF合並成一個文件
資源管理器打開jTessBoxEditor解壓縮目錄,執行:train.bat;窗口打開之后,單擊:Tools->Merge Tiff ,按住Shift鍵選擇工作目錄\orgin下面的TIF文件,並把合並生成的TIF文件放到工作目錄中,重新命名。我這里命名為:num.font.exp0.tif
tif文件命名格式:[lang].[fontname].exp[num].tif
tif命名規則:lang為語言名稱,fontname為字體名稱,num為圖片序號;
步驟四、生成box文件
切換到命令行工具,在工作目錄下執行:
tesseract num.font.exp0.tif num.font.exp0 batch.nochop makebox
Make Box File的命令格式:tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] batch.nochop makebox
其中lang為語言名稱,fontname為字體名稱,num為序號,可以隨便定義。
注意:tif文件名必須與box文件名保持一致,且位於同一個目錄。這么理解吧:TIF文件用來保存圖像(可以保存多張圖片,用Page來分頁);BOX文件用來保存圖像中文字的位置信息(每個字符的X、Y坐標,寬度、高度)。
步驟五、文字校正(這一步是真正自己做的工作)
運行jTessBoxEditor工具(如果已經打開,切換過去),點擊Box Editor->Open,打開num.font.exp0.tif文件,如下圖所示。可以看出有些字符識別不正確,需要對每張圖片中識別錯誤的字符進行校正。
窗口下方有翻頁按鈕;通過工具欄右上角的微調按鈕,修正每個字符的X、Y坐標,寬度、高度。不要的點刪除,增加有用的點(Delete、Insert)。
校正完成,保存即可,建議每頁修改完畢都按一次保存按鈕,避免意外。至此,jTessBoxEditorg工具的使命完成。
有文章說,如果jTessBoxEditor char列出現亂碼,點擊setting->font,然后選擇宋體。我沒試過,因為我識別英文。有此問題的同學,不妨試一下。
步驟六、利用.tif和.box文件生成.lstmf文件用於lstm訓練
在工作目錄,命令行工具執行:
tesseract num.font.exp0.tif num.font.exp0 --psm 6 lstm.train
參數含義:
- num.font.exp0.tif 上一步生成的.tif 格式的文件
- num.font.exp0 指明要生成的.lstmf文件的名稱
- -l eng 表示用到的語言,我這里訓練的是英語,故省略
- --psm 6 表示采用的識別模式,通常6 效果會好些
運行后工作目錄會多出一個num.font.exp0.lstmf文件
步驟七、從已有的.traineddata中提取.lstm文件
將下載好的.traineddata文件拷貝到工作目錄(為什么用下載的,而不用Tesseract-OCR自帶的,原因參考前面),我這里是eng.traineddata,命令行工具執行:
combine_tessdata -e eng.traineddata eng.lstm
注意:如果你是中文語言包,請自行下載。
步驟八、創建num.training_files.txt文件,里邊的內容為.lstmf文件的路徑地址
我這里是:D:\Work\testlang\num.font.exp0.lstmf
步驟九、進行訓練
在工作目錄創建output子目錄,命令行工具執行:
lstmtraining --model_output="D:\Work\testlang\output\output" --continue_from="D:\Work\testlang\eng.lstm" --train_listfile="D:\Work\testlang\num.training_files.txt" --traineddata="D:\Work\testlang\eng.traineddata" --debug_interval -1 --max_iterations 800
參數含義:
- --modeloutput 模型訓練輸出的路徑
- --continue_from 訓練從哪里繼續,這里指定從上面提取的 eng.lstm文件,
- --train_listfile 指定上一步創建的文件的路徑
- --traineddata 指定.traineddata文件的路徑
- --debug_interval 當值為-1時,訓練結束,會顯示訓練的一些結果參數
- --max_iterations 指明訓練遍歷次數
此時命令窗口中會有滾動的訓練歷程,這一步操作比較耗費時間。訓練結束后,在output文件夾中會生成i一個output_checkpoint文件和多個類似output0.012_3.checkpoint的.checkpoint文件。
步驟十、將checkpoint文件和.traineddata文件合並成新的.traineddata文件
在工作目錄,命令行工具執行:
lstmtraining --stop_training --continue_from="D:\Work\testlang\output\output_checkpoint" --traineddata="D:\Work\testlang\eng.traineddata" --model_output="D:\Work\testlang\output\num.traineddata"
參數含義:
- --stop_training 默認要有的
- --continue_from 上一步生成的output_checkpoint文件路徑
- --traineddata 第4步中下載的.traineddata文件的路徑
- --model_output zth.traineddata 輸出的路徑
然后,將新生成的num.traineddata文件拷貝到tesseract-OCR\tessdata文件夾下,通過代碼進行識別。
進一步測試
在工作目錄,命令行工具執行:
tesseract 3024.jpg result -l num
注意:語言包,必須選擇剛剛創建的num。打開工作目錄下的result.txt,里面的內容為:3024;至此,訓練告一段落。