Tesseract 3 語言數據的訓練方法


OCR,光學字符識別

  光學字符識別(OCR,Optical Character Recognition)是指對文本資料進行掃描,然后對圖像文件進行分析處理,獲取文字及版面信息的過程。OCR技術非常專業,一般多是印刷、打印行業的從業人員使用,可以快速的將紙質資料轉換為電子資料。關於中文OCR,目前國內水平較高的有清華文通、漢王、尚書,其產品各有千秋,價格不菲。國外OCR發展較早,像一些大公司,如IBM、微軟、HP等,即使沒有推出單獨的OCR產品,但是他們的研發團隊早已掌握核心技術,將OCR功能植入了自身的軟件系統。對於我們程序員來說,一般用不到那么高級的,主要在開發中能夠集成基本的OCR功能就可以了。這兩天我查找了很多免費OCR軟件、類庫,特地整理一下,今天首先來談談Tesseract,下一次將討論下Onenote 2010中的OCR API實現。可以在這里查看OCR技術的發展簡史。

 

1、Tesseract概述

Tesseract的OCR引擎最先由HP實驗室於1985年開始研發,至1995年時已經成為OCR業內最准確的三款識別引擎之一。然而,HP不久便決定放棄OCR業務,Tesseract也從此塵封。

數年以后,HP意識到,與其將Tesseract束之高閣,不如貢獻給開源軟件業,讓其重煥新生--2005年,Tesseract由美國內華達州信息技術研究所獲得,並求諸於Google對Tesseract進行改進、消除Bug、優化工作。

Tesseract目前已作為開源項目發布在Google Project,其項目主頁在這里查看,其最新版本3.0已經支持中文OCR,並提供了一個命令行工具。本次我們來測試一下Tesseract 3.0,由於命令行對最終用戶不太友好,我用WPF簡單封裝了一下,就可以方便的進行中文OCR了。

 

1.准備:

  • 安裝Tesseract , 我這里用的是 tesseract 3.02.02
  • 下載圖片,保存到本地, 
  • 下載工具jTessBoxEditor. http://sourceforge.net/projects/vietocr/files/jTessBoxEditor/,這個工具是用來訓練樣本用的,由於該工具     是用JAVA開發的,需要安裝JAVA虛擬機才能運行。

   

 


 

 

2.合並樣本圖像

運行jTessBoxEditor工具,在點擊菜單欄中Tools--->Merge TIFF。在彈出的對話框中選擇樣本圖像(按Shift選擇多張),合並成total.tif文件。

 

3.Make Box Files。

在total.tif所在的目錄下打開一個命令行,產生相應的Box文件(*.box)

輸入:

 

tesseract mjoren.normal.exp0.tif mjoren.normal.exp0   batch.nochop makebox

來生成一個box文件,該文件記錄了tesseract識別出來的每一個字和其位置坐標。

 屏幕輸出如下

E:\data\Users\Administrator\Desktop\ocrBuider2>tesseract mjoren.normal.exp0.tif
mjoren.normal.exp0   batch.nochop makebox
Tesseract Open Source OCR Engine v3.02 with Leptonica
Page 1 of 3
Page 2 of 3
Empty page!!
Empty page!!
Page 3 of 3
Empty page!!
Empty page!!

 

這時目錄多出了一個 mjoren.normal.exp0.box和mjoren.normal.exp0.txt 文件

 

4.使用jTessBoxEditor打開total.tif文件,

需要記住的是第2步生成的mjoren.normal.exp0.box要和這個mjoren.normal.exp0.tif文件同在一個目錄下。逐個校正文字,后保存。

  

 


 

 

4.Run Tesseract for Training。輸入命令:

   產生字符特征文件(*.tr)

tesseract mjoren.normal.exp0.tif mjoren.normal.exp0 nobatch box.train

 

屏幕輸出如下:

E:\data\Users\Administrator\Desktop\ocrBuider2>tesseract mjoren.normal.exp0.tif
mjoren.normal.exp0 nobatch box.train
Tesseract Open Source OCR Engine v3.02 with Leptonica
Page 1 of 3
APPLY_BOXES:
   Boxes read from boxfile:       7
   Found 7 good blobs.
TRAINING ... Font name = normal
Generated training data for 1 words
Page 2 of 3
Empty page!!
Empty page!!
Page 3 of 3
Empty page!!
Empty page!!

 

這時目錄會多出2個文件: mjoren.normal.exp0.tr

 

5.Compute the Character Set。輸入命令:

  產生計算字符集(unicharset)

unicharset_extractor  mjoren.normal.exp0.box

 執行結果:

E:\data\Users\Administrator\Desktop\ocrBuider2>unicharset_extractor  mjoren.norm
al.exp0.box
Extracting unicharset from mjoren.normal.exp0.box
Wrote unicharset file ./unicharset.

 

6.定義字體特征文件並聚集字符特征

新建文件“font_properties”。那么需要在目錄下新建一個名字為“font_properties”的文件,並且輸入文本 :

注意:這里  normal 必須與訓練名中的名稱保持一致,填入下面內容 ,這里全取值為0,表示字體不是粗體、斜體等等。

normal 0 0 0 0 0 

聚集字符特征(inttemp、pffmtable、normproto)

執行命令:

mftraining -F font_properties  -U unicharset mjoren.normal.exp0.tr

執行結果

E:\data\Users\Administrator\Desktop\ocrBuider2>mftraining  -F font_properties  -U unicharset  mjoren.normal.exp0.tr
Warning: No shape table file present: shapetable
Reading mjoren.normal.exp0.tr ...
Flat shape table summary: Number of shapes = 7 max unichars = 1 number with mult
iple unichars = 0
Warning: no protos/configs for j in CreateIntTemplates()
Warning: no protos/configs forin CreateIntTemplates()
Warning: no protos/configs for a in CreateIntTemplates()
Done!

 

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

<fontname> <italic> <bold> <fixed> <serif> <fraktur>  

其中fontname為字體名稱,必須與[lang].[fontname].exp[num].box中的名稱保持一致。<italic> 、<bold> 、<fixed> 、<serif>、 <fraktur>的取值為1或0,表示字體是否具有這些屬性。

 

7.Clustering。產生字符形狀正常化特征文件normproto

輸入命令:

cntraining  mjoren.normal.exp0.tr

執行結果:

E:\data\Users\Administrator\Desktop\ocrBuider2>cntraining  mjoren.normal.exp0.tr

Reading mjoren.normal.exp0.tr ...
Clustering ...

Writing normproto ...

8.此時,在目錄下應該生成若干個文件了,把unicharset, inttemp, normproto, pffmtable這四個文件加上前綴“normal.”。然后 合並訓練文件

輸入命令:

combine_tessdata normal.

 執行結果如下:

E:\data\Users\Administrator\Desktop\ocrBuider2>combine_tessdata normal.
Combining tessdata files
TessdataManager combined tesseract data files.
Offset for type 0 is -1
Offset for type 1 is 140
Offset for type 2 is -1
Offset for type 3 is 792
Offset for type 4 is 128180
Offset for type 5 is 128262
Offset for type 6 is -1
Offset for type 7 is -1
Offset for type 8 is -1
Offset for type 9 is -1
Offset for type 10 is -1
Offset for type 11 is -1
Offset for type 12 is -1
Offset for type 13 is -1
Offset for type 14 is -1
Offset for type 15 is -1
Offset for type 16 is -1

必須確定的是第2、4、5、6行的數據不是-1,那么一個新的字典就算生成了。

此時目錄下“normal.traineddata”的文件拷貝到tesseract程序目錄下的“tessdata”目錄。

 

以后就可以使用該該字典來識別了,例如:

tesseract mjoren.normal.exp0.tif result  -l normal

 

通過訓練出來的新語言,識別率提高了不少。

  

E:\data\Users\Administrator\Desktop\ocrBuider2>tesseract mjoren.normal.exp0.tif
result  -l normal
Tesseract Open Source OCR Engine v3.02 with Leptonica
Page 1 of 3
Page 2 of 3
Empty page!!
Empty page!!
Page 3 of 3
Empty page!!
Empty page!!

 

糾正出來的結果

1234567

 

 

 

特別說明:

    在訓練的過程中,初次接觸的人容易犯一些小錯誤,這些錯誤雖然小,但很可能讓你陷入困惑和痛苦中。那位師妹就是因為小問題困惑不已才找我幫忙的。下面簡單的羅列一下幾點需要注意的地方:

  1. 前面提到的normal可以被你想要的任何字符串代替,主要是為了給你訓練的庫取個名字。
  2. 第二步產生的Box文件,需要手動修改,一定要以Unicode模式保存。修改的時候要注意方法和含義,詳細的說明Google原文中有說明。
  3. 第五步程序自動產生的文件是只有擴展名的,需要你自己手動將名字改成前綴一致。后面產生的可選文件也依照此法操作。
  4. 所有的這些文件都准備好了之后,需要放到同一目錄下,執行combine_tessdata進行合並的時候,注意要切換到文件所在的目錄執行,否則將會報錯,提示找不到文件。
  5. 合並成功之后,要記得將訓練好的文件(normal.traineddata)放到程序的tessdata子目錄下,否則測試就會提示找不到語言庫文件。

 好了,到這里,基本上所有的問題都能解決了。

 


免責聲明!

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



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