Tesseract-ocr自己做訓練樣本庫來進行字符識別


Tesseract-ocr自己做訓練樣本庫來進行字符識別

使用默認的語言庫識別

1.安裝Tesseract

        從 http://code.google.com/p/tesseract-ocr/downloads/list下載Tesseract,目前版本為Tesseract3.02。因為只是測試使用,這里直接下載winodws下的安裝文件tesseract-ocr-setup-3.02.02.exe。安裝成功后會在相應磁盤上生成一個Tesseract-OCR目錄。通過目錄下的tesseract.exe程序就可以對圖像字符進行識別了。
2.准備一副待識別的圖像,這里用畫圖工具隨便寫了一串數字,保存為11111.jpg,如下圖所示:
3.  開始菜單打開命令行,定位到Tesseract-OCR目錄,輸入命令:
其中result表示輸出結果文件txt名稱,eng表示用以識別的語言文件為英文,7表示把圖像看作一個單文本行。
3.  打開Tesseract-OCR目錄下的result.txt文件,看到識別的結果為764-2316857,有2個字符識別錯誤,識別率還不是很高,那有沒有什么方法來提供識別率呢?Tesseract提供了一套訓練樣本的方法,用以生成自己所需的識別語言庫。下面介紹一下具體訓練樣本的方法。
 

訓練樣本

關於如何訓練樣本,Tesseract-OCR官網有詳細的介紹 http://code.google.com/p/tesseract-ocr/wiki/TrainingTesseract3。這里通過我自己做的例子來介紹一下如何進行樣本訓練。
1.下載工具jTessBoxEditor.  http://sourceforge.net/projects/vietocr/files/jTessBoxEditor/,這個工具是用來訓練樣本用的,由於該工具是用JAVA開發的,需要安裝JDK,才能運行。可以在http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html 下載Java SE Development Kit 7u71,看你電腦的具體需求環境。
 
2.把所有的需要訓練的圖片合並為一張tiff格式的圖片,如何合並呢?通過jTessBoxEditor中的Merge Tiff 來完成,不過他的小缺點就是只能合並多張tiff格式的,如果你的圖片是jpg的,需要先通過格式工廠轉換為tif。
 
3.合並圖像。運行jTessBoxEditor工具,在點擊菜單欄中Tools--->Merge TIFF。在彈出的對話框中選擇樣本圖像(按Shift選擇多張),合並成new.font.exp0.tif文件。
 
4.生成Box File文件。在new.font.exp0.tif所在的目錄下打開一個命令行,輸入:
 生成的BOX文件為new.font.exp0.box,該文件記錄了tesseract識別出來的每一個字和其位置坐標。
注:Make Box File的命令格式為:
tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] batch.nochop makebox  
其中lang為語言名稱,fontname為字體名稱,num為序號,可以隨便定義。
注意:在使用中發現,在上述識別生成box文件的過程中需要加上適當的參數才能保證識別率,否則真的是慘不忍睹啊!
  -lng eng   (指定使用英文字庫識別樣本中的驗證碼。注意:一個減號)
  --psm 7   (強調圖像中為單行文字,很重要!注意:兩個減號)
  digits   (字符集中只含字母數字,有沒有效果需要實驗,前面不需要加引號,與上面的參數用空格隔開就行)
 
5.文字校正。使用jTessBoxEditor中的Box Editor打開new.font.exp0.tif文件,需要記住的是第4步生成的new.font.exp0.box要和這個new.font.exp0.tif文件同在一個目錄下。如下圖所示,可以看出有些字符識別的不正確,可以通過該工具手動對每張圖片中識別錯誤的字符進行校正。校正完成后保存即可。
 
 
6.定義字體特征文件。Tesseract-OCR3.01以上的版本在訓練之前需要創建一個名稱為font_properties的字體特征文件。

font_properties不含有BOM頭,文件內容格式如下:

<fontname> <italic> <bold> <fixed> <serif> <fraktur>  
其中fontname為字體名稱,必須與[lang].[fontname].exp[num].box中的名稱保持一致。<italic> 、<bold> 、<fixed> 、<serif>、 <fraktur>的取值為1或0,表示字體是否具有這些屬性。
在樣本圖片所在目錄下創建一個名稱為font_properties的文件,
.
用記事本打開,輸入以下下內容:
 
這里全取值為0,表示字體不是粗體、斜體等等。
 
7.生成語言文件
在樣本圖片所在目錄下創建一個批處理文件rem,
輸入如下內容:
echo Run Tesseract for Training..  
tesseract.exe new.font.exp0.tif new.font.exp0 nobatch box.train  
echo Compute the Character Set..  
unicharset_extractor.exe new.font.exp0.box  
mftraining -F font_properties -U unicharset -O new.unicharset new.font.exp0.tr  
echo Clustering..  
cntraining.exe new.font.exp0.tr  
echo Rename Files..  
rename normproto new.normproto  
rename inttemp new.inttemp  
rename pffmtable new.pffmtable  
rename shapetable new.shapetable   
echo Create Tessdata..  
combine_tessdata.exe new.     ( 這里new后面的 . 不能缺少
 
最后把批處理文件rem的后綴改為.bat 。
將批處理通過命令行執行(call rem)。執行后的結果如下:
必須確定的是Offset 1、3、4、5、13的數據不是-1,那么一個新的字典就算生成了。
 
new.traineddata是最終生成的字典。將生成的new.traineddata拷貝到Tesseract-OCR-->tessdata目錄下。以后就可以使用該該字典來識別了,例如:
 
需要注意的是:因為這時是使用自己的材料庫來進行識別,所以調用時就不要在后面加 digits 參數了,否則你會懷疑上面的訓練是不是白做了!
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM