tesseract-ocr使用以及訓(xùn)練方法
本人最近在做字符識(shí)別,所以自行在網(wǎng)上尋找方法,接觸到tesseract,自己按照網(wǎng)上方法做的時(shí)候,也遇到一些問題,解決了一些。所以我決定寫下我第一個(gè)博客,一是方便自己以后查看,更新學(xué)習(xí)。二是方便和網(wǎng)友交流學(xué)習(xí)。
Tesseract介紹
Tesseract是一個(gè)開源的OCR(Optical Character Recognition,光學(xué)字符識(shí)別)引擎,可以識(shí)別多種格式的圖像文件并將其轉(zhuǎn)換成文本,目前已支持60多種語言(包括中文)。 Tesseract最初由HP公司開發(fā),后來由Google維護(hù),目前發(fā)布在Googel Project上。
安裝Tesseract,從http://code.google.com/p/tesseract-ocr/downloads/list下載Tesseract,3.01上的版本支持中文。安裝后在電腦上會(huì)有一個(gè)Tesseract-OCR目錄,通過目錄錄下的tesseract.exe程序就可以對圖像的字符進(jìn)行識(shí)別??紤]到萬一有人上不了谷歌,這個(gè)Tesseract-OCR文件夾我也上傳了,地址:點(diǎn)擊打開鏈接。文件夾中除了Tesseract的相應(yīng)文件外,還有一個(gè)tesseract-vs2013-include-lib-dll文件,這個(gè)是VS2013用來調(diào)用API的配置文件,后面的博客會(huì)寫到。打開如圖所示。

使用默認(rèn)的語言庫識(shí)別
準(zhǔn)備一張待識(shí)別的圖片,我選取一段《成都》的歌詞。

接著就可以打開命令行,進(jìn)入Tesseract-OCR的目錄,輸入:
tesseract.exe gc.jpg result -l chi_sim
其中result表示輸出結(jié)果文件txt名稱,chi_sim表示用以識(shí)別的語言文件為英文。執(zhí)行后文件夾中會(huì)多一個(gè)result.txt。

效果非常不好,因?yàn)楹芏酀h字是左右結(jié)構(gòu),比如:眼淚。所以我要自己訓(xùn)練自己的中文庫。
訓(xùn)練樣本
訓(xùn)練樣本需要一個(gè)工具,jTessBoxEditor,下載地址:點(diǎn)擊打開鏈接。這個(gè)工具是用java開發(fā)的,需要jre7以上的版本支持。
1、獲取訓(xùn)練的圖片,為了方便我使用了原來的圖片一張,樣本當(dāng)然是越多越好。
2、合并樣本文件,打開jTessBoxEditor,點(diǎn)開train.bat。在菜單欄中Tools->Merge TIFF。在彈出的窗口中可以選擇多張樣本圖片(網(wǎng)上之前有說要.tif格式的圖片,測試.jpg格式的也行),我這邊就用了一張樣本圖片。

一張或者多張圖片可以合成一張tif文件。

3、生成box文件, 打開命令行,輸入:
tesseract.exe gc.font.exp1.tif gc.font.exp1 batch.nochop makebox
生成的BOX文件為gc.font.exp1.box,BOX文件為Tessercat識(shí)別出的文字和其坐標(biāo)。Make BOX的命名的個(gè)數(shù)為:
tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] batch.nochop makebox
其中l(wèi)ang為語言名稱,fontname為字體名稱,num為序號,可以隨便定義。有些博客說對于這個(gè)命名無所謂,但是我嘗試到后免出錯(cuò)了,是tr文件名的問題,在下面我會(huì)貼出報(bào)錯(cuò)圖。讀者也可以試試,不知是不是我之前步驟哪里做錯(cuò)了。
4、文字矯正,打開jTessBoxEditor工具,打開gc.font.exp1.tif文件(必須將上一步生成的.box和.tif樣本文件放在同一目錄),如下圖所示??梢钥闯鲇行┳址指詈妥R(shí)別都不正確,可以通過該工具手動(dòng)對每張圖片中識(shí)別錯(cuò)誤的字符進(jìn)行校正。校正完成后保存即可。(注:發(fā)現(xiàn)中文打不上去,在菜單Setting->Font中可以修改,改為宋體即可)

對于標(biāo)定的方框以及識(shí)別的字符進(jìn)行修改。

選擇兩個(gè)或兩個(gè)以上的框,Merge可進(jìn)行合并;Split將框進(jìn)行拆分;Insert插入框,如果圖片上一個(gè)框也沒有,那無法進(jìn)行插入;Delete刪除框。選擇要修改的字符框,在Character中輸入想要修改的字,再點(diǎn)擊齒輪,即可修改。修改后,如下圖所示:

5、生成.tr文件,在命令行中輸入:
tesseract gc.font.exp1.tif gc.font.exp1 nobatch box.train
6、計(jì)算字符集,從生成的box文件中提取,繼續(xù)輸入:
unicharset_extractor gc.font.exp1.box
7、生成字體特征文件,在當(dāng)前文件夾中新建任意名稱的文件,里面格式為:
<span><fontname> <italic> <bold> <fixed> <serif> <fraktur> </span>
例如:我建了一個(gè)名為font的文件,里面內(nèi)容為:font 0 0 0 0 0
這個(gè)文件可以是手動(dòng)生成的txt文件,也可以在在命令行中輸入:
echo font 0 0 0 0 0 >font
即可。
8、特征訓(xùn)練,繼續(xù)在命令行輸入:
mftraining -F font -U unicharset gc.font.exp1.tr
在這一步我出現(xiàn)了好幾個(gè)錯(cuò)誤,如下圖
(1)Failed to load unicharset from file uncharset,這是因?yàn)閯倓偟膄ont的文件,如果是在txt中寫的,一定要寫成font.txt,加上后綴。

(2)feature training for Tesseract已停止工作。命令行顯現(xiàn):
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

這個(gè)問題就是上面命名所導(dǎo)致的,所以還是規(guī)范命名。
9、聚集tesseract識(shí)別的訓(xùn)練文件,命令行輸入:
cntraining gc.font.exp1.tr
有人會(huì)說其他還有一條shapeclustering語句,說下這個(gè)步驟可有可無,這個(gè)是在3.02中新加的,主要針對印度語,所以我們在做的時(shí)候會(huì)有一個(gè)警告 warning No shape table file present。
這時(shí)候文件夾中會(huì)多了四個(gè)文件,在unicharset,inttemp,normproto,pfftable文件名前面加上font.。如下圖所示:
10、最后,合并相關(guān)文件,生成字典文件,輸入:
combine_tessdata font.
所有輸入命令如下圖所示

最終,在當(dāng)前目錄中會(huì)產(chǎn)生一個(gè)為font.traineddata文件,將其拷到tessdata文件夾中,再測試一下。

雖然不是全部識(shí)別出來,但是較之前的識(shí)別率提高了很多,這個(gè)和樣本數(shù)量也是有關(guān)系的,而且這句話中左右結(jié)構(gòu)的字特別多,原圖26個(gè)字,卻識(shí)別出31個(gè)字出來了,這個(gè)問題,我還沒想到什么方法,單個(gè)字訓(xùn)練?。我也試了其他字符訓(xùn)練,效果還可以
PS:tesseract-ocr還可從github下載:https://github.com/tesseract-ocr/
相關(guān)文章
Django中模版的子目錄與include標(biāo)簽的使用方法
這篇文章主要介紹了Django中模版的子目錄與include標(biāo)簽的使用方法,有利于Python的Django框架的模版布局,需要的朋友可以參考下2015-07-07
python調(diào)用ffmpeg命令行工具便捷操作視頻示例實(shí)現(xiàn)過程
現(xiàn)在短視頻很流行,有很多視頻編輯軟件,功能豐富,而我們需要的只是裁剪功能,而且需要用編程的方式調(diào)用,那么最合適的莫過于ffmpeg了2021-11-11
Python列表去重的4種核心方法與實(shí)戰(zhàn)指南詳解
在Python開發(fā)中,處理列表數(shù)據(jù)時(shí)經(jīng)常需要去除重復(fù)元素,本文將詳細(xì)介紹4種最實(shí)用的列表去重方法,有需要的小伙伴可以根據(jù)自己的需要進(jìn)行選擇2025-04-04
基于numpy.random.randn()與rand()的區(qū)別詳解
下面小編就為大家分享一篇基于numpy.random.randn()與rand()的區(qū)別詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04
python正則表達(dá)式re.sub各個(gè)參數(shù)的超詳細(xì)講解
Python 的 re 模塊提供了re.sub用于替換字符串中的匹配項(xiàng),下面這篇文章主要給大家介紹了關(guān)于python正則表達(dá)式re.sub各個(gè)參數(shù)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07
Python在后臺(tái)自動(dòng)解壓各種壓縮文件的實(shí)現(xiàn)方法
這篇文章主要介紹了Python在后臺(tái)自動(dòng)解壓各種壓縮文件的實(shí)現(xiàn)方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11

