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 for 摟 in 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
特別說明:
在訓練的過程中,初次接觸的人容易犯一些小錯誤,這些錯誤雖然小,但很可能讓你陷入困惑和痛苦中。那位師妹就是因為小問題困惑不已才找我幫忙的。下面簡單的羅列一下幾點需要注意的地方:
- 前面提到的normal可以被你想要的任何字符串代替,主要是為了給你訓練的庫取個名字。
- 第二步產生的Box文件,需要手動修改,一定要以Unicode模式保存。修改的時候要注意方法和含義,詳細的說明Google原文中有說明。
- 第五步程序自動產生的文件是只有擴展名的,需要你自己手動將名字改成前綴一致。后面產生的可選文件也依照此法操作。
- 所有的這些文件都准備好了之后,需要放到同一目錄下,執行combine_tessdata進行合並的時候,注意要切換到文件所在的目錄執行,否則將會報錯,提示找不到文件。
- 合並成功之后,要記得將訓練好的文件(normal.traineddata)放到程序的tessdata子目錄下,否則測試就會提示找不到語言庫文件。
好了,到這里,基本上所有的問題都能解決了。