1. 程式人生 > >tesseract-ocr使用以及訓練方法

tesseract-ocr使用以及訓練方法

本人最近在做字元識別,所以自行在網上尋找方法,接觸到tesseract,自己按照網上方法做的時候,也遇到一些問題,解決了一些。所以我決定寫下我第一個部落格,一是方便自己以後檢視,更新學習。二是方便和網友交流學習。

Tesseract介紹

         Tesseract是一個開源的OCR(Optical Character Recognition,光學字元識別)引擎,可以識別多種格式的影象檔案並將其轉換成文字,目前已支援60多種語言(包括中文)。 Tesseract最初由HP公司開發,後來由Google維護,目前釋出在Googel Project上。

       安裝Tesseract,從

http://code.google.com/p/tesseract-ocr/downloads/list下載Tesseract,3.01上的版本支援中文。安裝後在電腦上會有一個Tesseract-OCR目錄,通過目錄錄下的tesseract.exe程式就可以對影象的字元進行識別。考慮到萬一有人上不了谷歌,這個Tesseract-OCR資料夾我也上傳了,地址:點選開啟連結。資料夾中除了Tesseract的相應檔案外,還有一個tesseract-vs2013-include-lib-dll檔案,這個是VS2013用來呼叫API的配置檔案,後面的部落格會寫到。開啟如圖所示。

使用預設的語言庫識別

     準備一張待識別的圖片,我選取一段《成都》的歌詞。

     接著就可以開啟命令列,進入Tesseract-OCR的目錄,輸入:

tesseract.exe gc.jpg result -l chi_sim

    其中result表示輸出結果檔案txt名稱,chi_sim表示用以識別的語言檔案為英文。執行後文件夾中會多一個result.txt。

    效果非常不好,因為很多漢字是左右結構,比如:眼淚。所以我要自己訓練自己的中文庫。

訓練樣本

     訓練樣本需要一個工具,jTessBoxEditor,下載地址:點選開啟連結。這個工具是用java開發的,需要jre7以上的版本支援。   

    1、獲取訓練的圖片,為了方便我使用了原來的圖片一張,樣本當然是越多越好。

    2、合併樣本檔案,開啟jTessBoxEditor,點開train.bat。在選單欄中Tools->Merge TIFF。在彈出的視窗中可以選擇多張樣本圖片(網上之前有說要.tif格式的圖片,測試.jpg格式的也行),我這邊就用了一張樣本圖片。

      一張或者多張圖片可以合成一張tif檔案。

      3、生成box檔案, 開啟命令列,輸入:

tesseract.exe gc.font.exp1.tif gc.font.exp1 batch.nochop makebox

      生成的BOX檔案為gc.font.exp1.box,BOX檔案為Tessercat識別出的文字和其座標。Make BOX的命名的個數為:

tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] batch.nochop makebox

      其中lang為語言名稱,fontname為字型名稱,num為序號,可以隨便定義。有些部落格說對於這個命名無所謂,但是我嘗試到後免出錯了,是tr檔名的問題,在下面我會貼出報錯圖。讀者也可以試試,不知是不是我之前步驟哪裡做錯了。

      4、文字矯正,開啟jTessBoxEditor工具,開啟gc.font.exp1.tif檔案(必須將上一步生成的.box和.tif樣本檔案放在同一目錄),如下圖所示。可以看出有些字元分割和識別都不正確,可以通過該工具手動對每張圖片中識別錯誤的字元進行校正。校正完成後儲存即可。(注:發現中文打不上去,在選單Setting->Font中可以修改,改為宋體即可)

         對於標定的方框以及識別的字元進行修改。

        選擇兩個或兩個以上的框,Merge可進行合併;Split將框進行拆分;Insert插入框,如果圖片上一個框也沒有,那無法進行插入;Delete刪除框。選擇要修改的字元框,在Character中輸入想要修改的字,再點選齒輪,即可修改。修改後,如下圖所示:

         5、生成.tr檔案,在命令列中輸入:

tesseract gc.font.exp1.tif  gc.font.exp1  nobatch box.train

         6、計算字符集,從生成的box檔案中提取,繼續輸入:

unicharset_extractor gc.font.exp1.box

         7、生成字型特徵檔案,在當前資料夾中新建任意名稱的檔案,裡面格式為:

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

        例如:我建了一個名為font的檔案,裡面內容為:font 0 0 0 0 0 

        這個檔案可以是手動生成的txt檔案,也可以在在命令列中輸入:

echo font 0 0 0 0 0 >font

        即可。

        8、特徵訓練,繼續在命令列輸入:

mftraining -F font -U unicharset gc.font.exp1.tr

        在這一步我出現了好幾個錯誤,如下圖

       (1)Failed to load unicharset from file uncharset,這是因為剛剛的font的檔案,如果是在txt中寫的,一定要寫成font.txt,加上字尾。

      (2)feature training for Tesseract已停止工作。命令列顯現:

      Reading num.tr …       Font id = -1/0, class id = 1/13 on sample 0

      font_id >= 0 && font_id < font_id_map_.SparseSiz..\..\classify\trainingsampleset.cpp, line 622

       這個問題就是上面命名所導致的,所以還是規範命名。

       9、聚集tesseract識別的訓練檔案,命令列輸入:

cntraining gc.font.exp1.tr

        有人會說其他還有一條shapeclustering語句,說下這個步驟可有可無,這個是在3.02中新加的,主要針對印度語,所以我們在做的時候會有一個警告warning No shape table file present。

        這時候資料夾中會多了四個檔案,在unicharset,inttemp,normproto,pfftable檔名前面加上font.。如下圖所示:

      10、最後,合併相關檔案,生成字典檔案,輸入:

combine_tessdata font.

       所有輸入命令如下圖所示

        最終,在當前目錄中會產生一個為font.traineddata檔案,將其拷到tessdata資料夾中,再測試一下。

         雖然不是全部識別出來,但是較之前的識別率提高了很多,這個和樣本數量也是有關係的,而且這句話中左右結構的字特別多,原圖26個字,卻識別出31個字出來了,這個問題,我還沒想到什麼方法,單個字訓練?。我也試了其他字元訓練,效果還可以

          這是我第一次寫部落格,想到哪裡寫到哪裡,如果哪些地方寫的不恰當的,還請大神指出來,謝謝。