- 蘇格團隊
- 做者:MaDaima
前段時間工做中發現若是可以將一些相同標準的圖片中文字識別出來,能提高很多咱們的用戶體驗。因而就看了一下圖片文字識別相關的功能。linux
首先就是了解了一下各大廠的api,那識別率天然是很高,效果很是的不錯,但問題就是,限制調用次數而且模型不受本身的控制,或者就須要充錢使你變強。 (這裏貼一個別人的分享吧:Java-基於百度API的圖片文字識別(支持中文,英文和中英文混合) - TheLoveFromWSK - CSDN博客)git
而後就本身瞭解了下ocr和tesseract。本文主要是一個helloworld版本的tesseract入門使用教程...因此還請大佬輕拍github
OCR:光學字符識別(英語:Optical Character Recognition,OCR)是指對文本資料的圖像文件進行分析識別處理,獲取文字及版面信息的過程。windows
本文主要講的是Tesseract-OCR:Tesseract是Ray Smith於1985到1995年間在惠普布里斯托實驗室開發的一個OCR引擎,曾經在1995 UNLV精確度測試中名列前茅。但1996年後基本中止了開發。2006年,Google邀請Smith加盟,重啓該項目。目前項目的許可證是Apache 2.0。該項目目前支持Windows、Linux和Mac OS 等主流平臺。但做爲一個引擎,它只提供命令行工具。api
有興趣研究源碼的同窗能夠看下GitHub地址:GitHub - tesseract-ocr/tesseract: Tesseract Open Source OCR Engine (main repository) 下載連接,mac、windows、linux都有,可取所需:Downloads · tesseract-ocr/tesseract Wiki · GitHubbash
在Path中新增環境變量,地址是Tesseract-ocr的安裝目錄 編輯器
在系統變量中添加TESSDATA_PREFIX,變量值爲Tesseract-ocr目錄中的tessdata文件夾 工具
tesseract -v
複製代碼
出現如上圖同樣的東西那就是安裝ok啦,第一步也就搞完了
安裝成功以後呢,天然是要try一下的 1.準備個圖片PNG,JPG都是能夠的(具體支持哪些格式就不一一列舉了,這裏我就用png了) 測試
2.而後敲命令tesseract imagename outputbase [-l lang] [--oem ocrenginemode] [--psm pagesegmode] [configfiles...]
複製代碼
這裏解釋一下,就是tesseract [圖片的地址+名字+後綴] [輸出的地址+名字] 例如: 字體
3.這樣就會在目錄下申城一個DemoAnswer.txt的文件
ok,結果正確可是這裏若是是中文呢?重複上面的操做試下
4.中文識別
這裏會發現重複上面的操做,中文丟失了tesseract imagename outputbase [-l lang]
複製代碼
這句命令中的 [-l lang] 是設置識別語言的,默認是英語,因此若是須要識別中文還須要去下載中文的字庫 (其實細心的同窗可能在安裝的時候有注意到,就已經自動安裝了字庫) 去到tesseract-ocr的安裝目錄中的tessdata目錄下查看***.traineddata就是字庫
4.1下載中文字庫若是安裝的時候沒有下載的話,能夠來這裏找本身須要的字庫下載 Data Files · tesseract-ocr/tesseract Wiki · GitHub
將下載的字庫放到tessdata目錄中便可
4.2敲命令
tesseract HelloWorldDemo.png DemoAnswer -l chi_sim
複製代碼
這裏就出現了一點點的瑕疵,中文識別的有問題
這是由於使用的字庫跟咱們的字體是有差別的,因此若是須要能識別咱們圖片中的字體,須要去訓練咱們本身的字庫
步驟:(轉自tesseract的github)
Prepare training text. 準備你的訓練文本
Render text to image + box file. (Or create hand-made box files for existing image data.) 將文本轉爲image+box文件.(若是你已經有image文件的話,只須要手動生成box文件)
Make unicharset file. 生成unicharset文件
Optionally make dictionary data. 有選擇性的生成字典數據
Run tesseract to process image + box file to make training data set. 運行tesseract來處理以前的image+box文件生成一個訓練數據集合
Run training on training data set. 在訓練數據集合的基礎上進行訓練
Combine data files. 合併數據文件
1.將圖片的命名改成[lang].[fontname].exp[num].tif(改後綴建議經過另存爲的方法來選擇tif)
例如:BlackLang.HelloWorldDemo.exp0.tif
2.生成box文件
提一張官網的圖
輸入路徑和輸出路徑文件名爲了方便我這裏就保持一直了 由於咱們訓練的是中文,因此加上-l chi_sim,這樣減小咱們在調整的時候的差別。實際的命令:tesseract BlackLang.HelloWorldDemo.exp0.tif BlackLang.HelloWorldDemo.exp0 -l chi_sim batch.nochop makebox
複製代碼
這樣就會在目標目錄中生成一個.box的文件,以下圖
好奇的同窗能夠點開.box的文件看下,其實裏面就是每一個字的座標之類的東西3.使用jTessBoxEditor
這裏爲了方便咱們矯正box文件,這裏使用一個工具jTessBoxEditor: VietOCR - Browse /jTessBoxEditor at SourceForge.net
安裝好了以後,打開jTessBoxEditor,點擊open,選擇對應的tif(若是這裏tif和box不在一個目錄中會有問題哦)
3.1在Box Coordinates中經過調整x、y、w、h來框住對應的字,而後再char中輸入正確的字3.2在Box View中能夠看到每一個字的放大圖,來確認是否徹底選中
這樣將每一個字都校驗一遍後,點擊save便可:4.訓練
4.1生成tr文件
輸入命令:tesseract.exe [tif圖片文件名] [生成的tr文件名] nobatch box.train t
tesseract.exe BlackLang.HelloWorldDemo.exp0.tif BlackLang.HelloWorldDemo.exp0 nobatch box.train
複製代碼
4.2生成unicharset文件
輸入命令:unicharset_extractor.exe [box文件名]
unicharset_extractor.exe BlackLang.HelloWorldDemo.exp0.box
複製代碼
這裏若是你有多個圖片須要去生成字庫的話,就須要合併成一個char集合
輸入命令:unicharset_extractor.exe [第一個box文件名] [第二個box文件名] ··· 這裏演示demo就只用一個box
4.3定義字體特徵文件font_properties
<fontname> <italic> <bold> <fixed> <serif> <fraktur>
複製代碼
這裏的tontname必需要和[lang].[fontname].exp[num].box保持一致; <italic> 、<bold> 、<fixed> 、<serif>、<fraktur>的取值爲1或0,表示字體是否具備這些屬性。
這裏咱們在目錄中建立一個名字爲font_properties的文件,內容以下:
HelloWorldDemo 0 0 0 0 0
複製代碼
這是咱們的目錄中的文件以下: 一個目標圖片.tif,一個分析.box,一個訓練結果.tr,一個字符集unicharset,一個特徵文件font_properties
4.4生成字典 輸入命令:
mftraining.exe -F font_properties -U unicharset -O BlackLang.unicharset BlackLang.HelloWorldDemo.exp0.tr
#這裏若是有多個tr就連在後面寫多個tr便可
複製代碼
cntraining.exe BlackLang.HelloWorldDemo.exp0.tr
#這裏若是有多個tr就連在後面寫多個tr便可
複製代碼
如圖:
執行完成以後,發現多了5個文件。而後講這5個文件都改爲lang開頭,即[lang].XXX (inttemp、pffmtable、normproto、shapetable;BlackLang.unicharset已是了就不用改了)有興趣的同窗能夠經過編輯器打開看看裏面都是啥,會發現裏面都是一些蠻有意思的亂碼哈哈哈
4.5 合併文件 輸入命令:
combine_tessdata BlackLang.
#combine_tessdata [lang].
複製代碼
這裏須要注意的是[lang]後面還有個點,很關鍵 而後是執行的結果中,一、三、四、五、13這些都不是-1,這樣一個新的語言文件就生成了,或者說是一個新的字體文件---[lang].traineddata
而後將剛剛生成的[lang].traineddata複製到tesseract-ocr的tessdata中 再來執行命令:
tesseract HelloWorldDemo.png answer -l BlackLang
複製代碼
這樣本來的圖片就能解析成功了
這只是一個很是demo的訓練,正常如今生產中使用這個仍是萬萬不夠的,須要對某個字體的所有的漢子進行大量的訓練才行 總的來講,tesseract對中文的識別能力仍是不好的,更別說是手寫的中文了,那識別率基本是沒有。可是對英文還有數字的識別率仍是很可觀的。 這裏也只是一個簡單的對於tesseract分享記錄而已~
如今已經有不少被封裝後的ocr例如pyocr啊,tess4J啊之類的,或者各大廠提供的api這些的識別率就很高了畢竟模型已經訓練的很好了,這些就下次再說吧