EVN: Ubuntu16.04
1.安裝 tessract-orc
1.1.tesseract-ocr安裝 ( 默認安裝路徑:/usr/share/tesseract-ocr/4.00/tessdata)
sudo add-apt-repository ppa:alex-p/tesseract-ocr
sudo apt-get update
sudo apt-get install tesseract-ocr
sudo apt-get install tesseract-ocr-eng tesseract-ocr-chi-sim tesseract-ocr-equ
1.3.下載:jTessBoxEditorFX
jTessBoxEditor2.0工具,用於調整圖片上文字的內容和位置,
下載地址:https://sourceforge.net/projects/vietocr/files/jTessBoxEditor/
安裝包解壓后“ java -jar jTessBoxEditor.jar”,或者雙擊該目錄下的“train.bat”腳本文件,就可以打開該工具了。
2.准備訓練數(自己准備多一些)
3.將圖片轉為TIF格式 (點擊tools->Merge Tiff)
為了進行后續的操作,合並后的文件名需要按照一定的規則來命令:
[lang].[fontname].exp[num].tif
其中:
- lang表示語言名稱;
- fontname表示字體名稱;
- num表示序號
在這里,我們將TIF的文件名保存為了:cqc.font.exp0.tif
4、生成TIF圖片的box盒子文件
生成box盒子文件是為了標識出圖片中文字的具體位置。如果要訓練進行訓練,我們必須得准備tif/box這一文件對。在此,我們通過Tesseract的makebox命令來生成box盒子文件,其命令為
tesseract cqc.font.exp0.tif cqc.font.exp0 -l chi_sim batch.nochop makebox
在命令行中運行此命令,我們將會得到一個和TIF文件同名的box文件:cqc.font.exp0.box
補充和修正box盒子文件
Tesseract4.0與之前版本對於box盒子文件要求的區別在於,在Tesseract4.0中,不再要求box盒子文件中對文本的框選精確到單個字符,只需要將框的位置覆蓋到一行文本即可。
但是為了便於訓練,我們還是選擇對單個字符進行框選。同時,makebox命令生成的box盒子文件不一定是完全無誤的,有一些圖片可能就沒有識別出盒子框來,而jTessBoxEditor這個軟件只能對已存在的box信息進行處理,沒有辦法在缺失box信息的圖片上新增box。
5、調整 box盒子文件
打開之前的JTessBoxEdit軟件, 點擊“Box Editor”選項卡,open 加載TIF文件對box進行修改(box文件和tif文件需要在同一個文件夾下):
圖片上面一共有5列,分別為:字符名稱、X軸坐標、Y軸坐標、字符寬度、字符高度,點擊可以調整,
操作完,記得點擊save
box修改好之后。我們就可以進行下一步了。
6、生成lstmf文件
這一步,我們通過TIF圖像文件和box盒子文件生成進行LSTM訓練所需的lstmf文件,使用到的命令如下所示:
tesseract cqc.font.exp0.tif cqc.font.exp0 -l chi_sim --psm 6 lstm.train
運行之后,我們的文件夾下會生成一個名為cqc.font.exp0.lstmf的文件。
7、提取語言的LSTM文件
接着從tesseract_best(https://github.com/tesseract-ocr/tessdata_best)下載相應語言的traineddata文件。
這里選擇chi_sim.traineddata文件。 (必須是在這下載來的,不要用安裝時的,否則報錯)
下載好之后,我們需要從中提取中它的LSTM文件,使用的命令如下所示:
(此處可以使用之前已有的chi_sim.traineddata提取 chi_sim.lstm,訓練時指定用這個,最后合並是tarineddata 也用之前的chi_sim.traineddata,這樣合並后的數據會有原有的基因,並且原始基因影響最小)
combine_tessdata -e chi_sim.traineddata chi_sim.lstm
運行上述命令,我們的文件夾下會生成一個名為chi_sim.lstm的文件。
新建一個名為chi_sim.training_files.txt的文本文件,在里面填入 第六步 生成的cqc.font.exp0.lstmf文件的絕對路徑。
8、訓練
使用下面的命令就可以開始訓練:
lstmtraining \ --model_output="/home/sea/Desktop/orc/output/output" \ --continue_from="/home/sea/Desktop/orc/train/chi_sim.lstm" \ --train_listfile="/home/sea/Desktop/orc/chi_sim.training_files.txt" \ --traineddata="/home/sea/Desktop/orc/train/chi_sim.traineddata" \ --debug_interval -1 \ --max_iterations 4000
說明:
--modeloutput 模型訓練輸出的路徑(新建了一個名為output的文件夾用來存輸出的文件) --continue_from 訓練從哪里繼續(從tesseract_best下載的.traineddata,提取語言的LSTM文件)(建議用已有的data,提取lstm) --train_listfile 指定上一步創建的文件的路徑(里面包含訓練圖片生成lstmf文件的絕對路徑) --traineddata 必須tesseract_best下載的.traineddata文件的路徑 (chi_sim.traineddata) --debug_interval 當值為-1時,訓練結束,會顯示訓練的一些結果參數 --max_iterations 指明訓練遍歷次數
訓練結束后,在output文件夾中會生成一個 output_checkpoint 文件和多個類似output0.012_3.checkpoint的.checkpoint文件
9、合並數據
我們接着使用命令把這些文件和之前的eng.traineddata合成為新的traineddata文件,使用命令如下:
lstmtraining \ --stop_training \ --continue_from="/home/sea/Desktop/orc/output/output_checkpoint" \ --traineddata="/home/sea/Desktop/orc/train/chi_sim.traineddata" \ --model_output="/home/sea/Desktop/orc/sea.traineddata"
各個參數的意義: --stop_training 默認必須有 --continue_from 上一步生成的output_checkpoint文件路徑 --traineddata 從tesseract_best下載的chi_sim.traineddata文件的路徑 (建議直接使用之前已有的數據,這樣新數據會保留之前的基因) --model_output sea.traineddata 輸出的路徑 (名字可以隨意修改,)
10、測試:
拷貝數據 /home/sea/Desktop/orc/sea.traineddata 到 /usr/share/tesseract-ocr/4.00/tessdata/下
img = Image.open("/home/sea/Desktop/orc/2.png") # tess_data_dir_conf = '--tessdata-dir "/home/sea/tesseract-ocr/tessdata-main"' # pytesseract.pytesseract.tesseract_cmd = "/usr/bin/tesseract" # text = pytesseract.image_to_string(img, config=tess_data_dir_conf, lang="chi_sim") text = pytesseract.image_to_string(img, lang="sea") print(text)