關於使用tesseract-ocr開發簡單的圖文識別(轉)

關於使用tesseract-ocr開發簡單的圖文識別(轉)

使用OCR圖文識別庫識別數字和字母

最近在做身份證號碼識別,在網上搜尋的一番後發現目前開源的OCR中tesseract-ocr算是比較強大的了,它由HP於1985年到1995年間開發,後來由google直接負責,經過谷歌進一步開發後,目前的tesseract-ocr有了顯著的改進。

tesseract-ocr和Leptonica影象庫一起工作,它可以讀取多種影象格式,並將其轉換成超過60種語言的文字。可以工作在Linux,Windows,Mac OSX等系統上,並且可以在android和iphone平臺上編譯。

目前android版本在這個地址:https://code.google.com/p/tesseract-android-tools/, 這個版本需要自己下載很多關聯的庫檔案,我在編譯的時候出了很多問題,後來沒辦法又在網上找到了這個專案:https://github.com/rmtheis/tess-two,說是tesseract-ocr-tool的一個分支,這個版本的好處是很多相關的庫都已經為我們配置好了,我們只要git clone下來編譯下就行了,github上相關介紹說的很詳細,編譯的過程這裡就不做介紹了,我在編譯的時候出現了permission許可權的問題,檔案的許可權用chmod 777 ./ 這個命令修改下就Ok了。最後編譯好的在libs下的so檔案就是我們開發所需要的庫檔案。

android中tesseract-ocr的使用在tess-two這個專案中有例子程式,不過寫的都比較簡單,這裡有個開源的識別專案,做的很好:https://github.com/rmtheis/android-ocr, 我借鑑的就是這個專案來開發的,但是用過後發現,對於身份證識別的效果並不好,識別率不是很高,而且經常識別不出來。OCR用到的識別庫:https://code.google.com/p/tesseract-ocr/downloads/list,其實我們可以根據自己的需求來訓練一套自己的識別庫的,比方說我們要識別驗證碼,識別身份證號碼等,我們就可以用下面的方法來訓練一套識別庫。

網上關於OCR訓練的方法很多,http://my.oschina.net/lixinspace/blog/60124http://blog.wudilabs.org/entry/f25efc5f/這兩篇文章都是比較好的教程,我也是參照這兩篇文章來訓練的,下面結合我的操作經驗來說下訓練的過程。


所需工具

  • tesseract-ocr-3.01
  • jTessBoxEditor, 該工具是用java寫的box編輯器

1、先新建一個trainocr資料夾,將上面兩個檔案拷貝進來,然後解壓這兩個檔案,我們進入Tesseract-ocr資料夾下新建一個temp資料夾

2、接下來我們準備好我們需要訓練的素材如下圖
這裡寫圖片描述

要想提高識別率,我們需要提供多張像上面這樣的圖片,我訓練身份證號碼識別庫是用了50多張圖片,等訓練完了我眼睛也花了,圖片格式需要為tiff格式的,可以通過windows自帶的畫圖工具來另存為tiff格式,準備好多張圖tiff圖片後,開啟jTessBoxEditor.jar,如下圖
這裡寫圖片描述

在此之前我們需要在第1步建立的temp資料夾下新建一個custom.tif的檔案,接下來我們選擇tool–>Merge TIFF 然後選擇準備好的多張tiff圖片,注意這裡是全部選中,然後點選開啟,然後選中我們剛剛建立的custom.tif檔案,點選儲存,這樣我們就將多張tiff圖片merge到了一個檔案裡面了。

3、接下來我們開始生成box檔案了,cmd命令列進入temp資料夾下,然後輸入如下命令

D:\Trainocr\Tesseract-ocr\temp>..\tesseract.exe custom.tif custom batch.nochop makebox

輸入完後會在temp資料夾下多了個custom.box檔案,該檔案記錄了識別出來的每個字和它對應的位置座標。

4、接下來就開始矯正了,同樣使用jTessBoxEditor工具,我們切換到Box Editor,然後open開啟custom.tif,如圖
這裡寫圖片描述

通過右上角的X,Y,W,H對每個需要改正的字元進行調整,注意調整好後別忘記儲存。

5、接下來是計算字符集,輸入如下命令

D:\Trainocr\Tesseract-ocr\temp>..\unicharset_extractor.exe custom.box

6、接下來我們需要在temp資料夾下建一個font_properties檔案,3.01版本的OCR需要這個檔案,該檔案的目的是提供輸出時識別出來的字型樣式資訊,檔案的格式為

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

timesitalic 1 0 0 1 0

我們可以根據實際情況新建font_properties,我寫的是

custom 0 0 0 0 0

意思是普通字型,沒有任何格式。

6 生成.tr訓練檔案
E:\Tesseract-ocr\tesseract.exe custom.tif custom nobatch box.train

然後執行以下命令

D:\Trainocr\Tesseract-ocr\temp>..\mftraining.exe -F font_properties -U unicharset custom.tr

8、Clustering,輸入命令

D:\Trainocr\Tesseract-ocr\temp>..\cntraining.exe custom.tr

9、此時在temp資料夾下已經有很多檔案了,需要把inttemp,Microfeat,normproto,pffmtable,unicharset這幾個檔案加上字首custom. (注意有個點號),然後輸入以下命令

D:\Trainocr\Tesseract-ocr\temp>..\combine_tessdata.exe custom.

必須確定的是第2、4、5、6行的資料不是-1,那麼一個新的字典就算生成了。這樣我們就可以用這個新字典來識別了,將生成的custom.traineddata檔案拷貝到tessdata資料夾下,然後( test.jpg這個圖片放在新建temp資料夾下)

tesseract.exe test.jpg result –l custom

就可以通過新的字典來識別,測試結果表明,識別率確實提高了。現實應用中我們需要使用多張圖片來通過上面的步驟來生成我們需要的識別庫,這樣識別率才能提高。

ps:文章轉自http://www.longdw.com/android-tesseract-ocr/