由於tesseract的中文語言包“chi_sim”對中文手寫字體或者環境比較復雜的圖片,識別正確率不高,因此需要針對特定情況用自己的樣本進行訓練,提高識別率,通過訓練,也可以形成自己的語言庫。
對其他語言庫有興趣的:https://github.com/tesseract-ocr/tessdata
mac安裝:brew install tesseract
1.前期准備工作:
1. 安裝 jdk1.8或以上 配置jdk環境變量
2. 安裝 tesseract-ocr 4.0
下載地址:https://digi.bib.uni-mannheim.de/tesseract/
配置環境變量:系統變量path添加 C:\Program Files (x86)\Tesseract-OCR; D:\Tesseract-OCR(對應自己的tesseract安裝目錄)
3. jTessBoxEditor2.0工具,用於調整圖片上文字的內容和位置,
下載地址:https://sourceforge.net/projects/vietocr/files/jTessBoxEditor/
安裝包解壓后雙擊里邊的“jTessBoxEditor.jar”,或者雙擊該目錄下的“train.bat”腳本文件,就可以打開該工具了。
4.准備Tess4J-3.4.8 下載: https://sourceforge.net/projects/tess4j/files/tess4j/
解壓即可得到 tessdata訓練庫(后面自定義的語言庫會用到)
2.樣本圖片准備:(進行訓練的樣本圖片數量越多越好)
這里只准備2種不同字體樣本進行測試:
3.使用jTessBoxEditor生成訓練樣本的的合並tif圖片:
(1)打開jTessBoxEditor,選擇Tools->Merge TIFF,進入訓練樣本所在文件夾,選中要參與訓練的樣本圖片:
(2)點擊 “打開” 后彈出保存對話框,選擇保存在當前路徑下,文件命名為 “zwp.test.exp0.tif” ,格式只有一種 “TIFF” 可選。
tif文面命名格式[lang].[fontname].exp[num].tif
lang是語言,fontname是字體,num為自定義數字。
比如我們要訓練自定義字庫 zwp,字體名test,那么我們把圖片文件命名為 zwp.test.exp0.tif
4.使用tesseract生成.box文件:
在上一步驟生成的“zwp.test.exp0.tif”文件所在目錄下打開命令行程序,執行下面命令,執行完之后會生成zwp.test.exp0.box文件。
執行如下命令 : tesseract zwp.test.exp0.tif zwp.test.exp0 batch.nochop makebox
5.使用jTessBoxEditor矯正.box文件的錯誤:
.box文件記錄了每個字符在圖片上的位置和識別出的內容,訓練前需要使用jTessBoxEditor調整字符的位置和內容。
打開jTessBoxEditor點擊Box Editor ->Open,打開步驟2中生成的“zwp.test.exp0.tif”,會自動關聯到“zwp.test.exp0.box”文件,這兩文件要求在同一目錄下。調整完點擊“save”保存修改。
注意采坑點:1.修改文字是亂碼
解決方法: jtessboxeditor的setting ---> Font 里改字體為宋體,regular就可以了。
2.修改文字必須是白底黑字,要不然訓練時會出現錯誤
6.生成font_properties文件:(該文件沒有后綴名)
(1)執行如下命令: echo test 0 0 0 0 0 >font_properties
(2)也可以手工新建一個名為font_properties的文本文件,輸入內容 “test 0 0 0 0 0” 表示字體test的粗體、傾斜等共計5個屬性。這里的“test”必須與“zwp.test.exp0.box”中的“test”名稱一致。
7、使用tesseract生成.tr訓練文件:
執行下面命令,執行完之后,會在當前目錄生成zwp.test.exp0.tr文件。
執行如下命令: tesseract zwp.test.exp0.tif zwp.test.exp0 nobatch box.train
8.生成字符集文件:
執行下面命令:執行完之后會在當前目錄生成一個名為“unicharset”的文件。
執行命令: unicharset_extractor zwp.test.exp0.box
9、生成shape文件:
執行下面命令,執行完之后,會生成 shapetable 和 zwp.unicharset 兩個文件。
執行命令: shapeclustering -F font_properties -U unicharset -O zwp.unicharset zwp.test.exp0.tr
10、生成聚字符特征文件:
執行下面命令,會生成 inttemp、pffmtable、shapetable和zwp.unicharset四個文件。
執行命令: mftraining -F font_properties -U unicharset -O zwp.unicharset zwp.test.exp0.tr
11、生成字符正常化特征文件:
執行下面命令,會生成 normproto 文件。
執行命令: cntraining zwp.test.exp0.tr
12、文件重命名:
重新命名inttemp、pffmtable、shapetable和normproto這四個文件的名字為[lang].xxx。
這里修改為zwp.inttemp、zwp.pffmtable、zwp.shapetable和zwp.normproto
執行下面命令:
rename normproto zwp.normproto
rename inttemp zwp.inttemp
rename pffmtable zwp.pffmtable
rename shapetable zwp.shapetable
13、合並訓練文件:
執行下面命令,會生成zwp.traineddata文件。
執行命令: combine_tessdata zwp.
Log輸出中的Offset 1、3、4、5、13這些項不是-1,表示新的語言包生成成功。
將生成的“zwp.traineddata”語言包文件復制到Tesseract-OCR 安裝目錄下的tessdata文件夾中,就可以使用訓練生成的語言包進行圖像文字識別了。
三、代碼測試
1.maven 依賴 (依賴過程有點兒漫長→_→)
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>net.sourceforge.tess4j</groupId>
<artifactId>tess4j</artifactId>
<version>3.4.0</version>
<exclusions>
<exclusion>
<groupId>com.sun.jna</groupId>
<artifactId>jna</artifactId>
</exclusion>
</exclusions>
</dependency>
2.測試代碼
public void testOCR()throws Exception {
//你的圖片路徑 51.png 為我自定義圖片名字 其實使用的就是 上面的測試圖片
File imageFile =new File("C:\\Users\\ljf\\Desktop\\51.png");
//你訓練庫的路徑 tessdata
instance.setDatapath("C:\\Users\\ljf\\Desktop\\tessdata");
//你剛剛新建的語言庫 zwp (還記得嗎?)
instance.setLanguage("zwp");
String result =instance.doOCR(imageFile);
System.out.println(result);
}
3.輸出結果