1.Tesseract 安裝及使用
一款由HP實驗室開發由Google維護的開源OCR(Optical Character Recognition , 光學字符識別)引擎,與Microsoft Office Document Imaging(MODI)相比,我們可以不斷的訓練的庫,使圖像轉換文本的能力不斷增強;如果團隊深度需要,還可以以它為模板,開發出符合自身需求的OCR引擎。
源碼地址為:https://github.com/tesseract-ocr/tesseract;
tesseract下載地址:https://digi.bib.uni-mannheim.de/tesseract/
接下來,我們將在Windows環境下安裝Tesseract並實現簡單的轉換和訓練:
進入下載頁面,可以看到有各種.exe文件的下載列表,這里可以選擇下載3.0版本。
其中文件名中帶有dev的為開發版本,不帶dev的為穩定版本,可以選擇下載不帶dev的版本,例如可以選擇下載tesseract-ocr-setup-3.05.02.exe。
下載完成后雙擊,此時會出現如下圖所示的頁面。
此時可以勾選Additional language data(download)選項來安裝OCR識別支持的語言包,這樣OCR便可以識別多國語言,默認只有英語。然后一路點擊Next按鈕即可。
配置環境變量
為了在全局使用方便,比如安裝路徑為C:\Program Files (x86)\Tesseract-OCR,將該路徑添加到環境變量的Path中。
還有一個環境變量要添加:TESSDATA_PREFIX 指向C:\Program Files (x86)\Tesseract-OCR\tessdata 這個是用於語言包的。
測試是否安裝成功:在cmd中輸入tesseract ,將出現以下界面代表成功:
2.Tesseract的使用
方式一:直接在命令行調用:
tesseract d:\6.png d:\result
第一個參數為圖片路徑,第二個參數為輸出結果路徑。6.png的圖片如下:
識別結果result.txt的內容為:
有2個數字誤識別。
而使用比較標准的文字,如:
是可以完全識別的。大家可以自己試試。
方式二:在Python中調用
要在python中使用,需要安裝:
Python :官網安裝地址:https://www.python.org/downloads/
PIL :用於python圖像格式處理,安裝完python之后執行一下命令即可安裝:pip install Pillow
Pytesser3: python開源項目,封裝了tesseract庫,也是在python安裝完后使用pip命令安裝:pip install pytesser3
然后新建一個記事本文件改名為orc.py,內容如下:
from pytesser3 import image_to_string from PIL import Image text = image_to_string(Image.open(r'D:\6.png')) print(text)
用python執行一下:(我用PyCharm執行的)
3.Tesseract訓練:
大體流程為:安裝jTessBoxEditor -> 獲取樣本文件 -> Merge樣本文件 –> 生成BOX文件 -> 定義字符配置文件 -> 字符矯正 -> 執行批處理文件 -> 將生成的traineddata放入tessdata中
安裝jTessBoxEditor
下載jTessBoxEditor,地址https://sourceforge.net/projects/vietocr/files/jTessBoxEditor/;解壓后得到jTessBoxEditor,由於這是由Java開發的,所以我們應該確保在運行jTessBoxEditor前先安裝JRE(Java Runtime Environment,Java運行環境)。
獲取樣本文件
我們可以用畫圖工具繪制樣本文件,數量越多越好,我自己畫了5張圖,如圖:
【注意】:樣本圖像文件格式必須為tif\tiff格式,否則在Merge樣本文件的過程中會出現 Couldn’t Seek 的錯誤。
Merge樣本文件
打開jTessBoxEditor,Tools->Merge TIFF,將樣本文件全部選上,並將合並文件保存為num.font.exp0.tif
生成BOX文件
打開命令行並切換至num.font.exp0.tif所在目錄,輸入,生成文件名為num.font.exp0.box
tesseract num.font.exp0.tif num.font.exp0 batch.nochop makebox
【語法】:tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] batch.nochop makebox
lang為語言名稱,fontname為字體名稱,num為序號;在tesseract中,一定要注意格式。
定義字符配置文件
在目標文件夾內生成一個名為font_properties的文本文件,內容為
font 0 0 0 0 0
【語法】:<fontname> <italic> <bold> <fixed> <serif> <fraktur>
fontname為字體名稱,italic為斜體,bold為黑體字,fixed為默認字體,serif為襯線字體,fraktur德文黑字體,1和0代表有和無,精細區分時可使用。
字符矯正
打開jTessBoxEditor,BOX Editor -> Open,打開num.font.exp0.tif;矯正<Char>上的字符,記得<Page>有好多頁噢!
修改后記得保存。
執行批處理文件
在目標目錄下生成一個批處理文件
rem 執行改批處理前先要目錄下創建font_properties文件
echo Run Tesseract for Training.. tesseract.exe num.font.exp0.tif num.font.exp0 nobatch box.train echo Compute the Character Set.. unicharset_extractor.exe num.font.exp0.box mftraining -F font_properties -U unicharset -O num.unicharset num.font.exp0.tr echo Clustering.. cntraining.exe num.font.exp0.tr echo Rename Files.. rename normproto num.normproto rename inttemp num.inttemp rename pffmtable num.pffmtable rename shapetable num.shapetable echo Create Tessdata.. combine_tessdata.exe num.
echo. & pause
保存后執行即可,執行結果如圖:
最終文件夾內會有以下文件,如圖:
將生成的traineddata放入tessdata中
最后將num.trainddata復制到Tesseract-OCR中tessdata文件夾即可。
4.最后的測試
按照之前步驟,使用命令行輸入
tesseract test.png output_2 -l num
我們可以看到新生成的文件output_2的內容為762408,內容完全正確。細心的人會發現,最后一句指令,我們使用了指令[-l num]而不是[-l eng]。這說明,最后一次轉換我們使用的是新生成的num語言的匹配庫而不是默認的eng語言匹配庫。
我們可以看到,經過簡單的訓練,我們對於數字數據的轉換准確率提高了很多。Tesseract的優點除了可以不斷學習以外,還因為是使用C++寫的開源程序,可以使用C#或者C++調用以及修改,很關鍵!
Tesseract已經有多個語言的版本:
C#版本:https://github.com/charlesw/tesseract
Java版本:https://github.com/bytedeco/javacpp-presets/tree/master/tesseract
Python版本:https://github.com/sirfz/tesserocr
PHP版本:https://github.com/thiagoalessio/tesseract-ocr-for-php
Tesseract的其他語言版本見:https://github.com/tesseract-ocr/tesseract/wiki/AddOns#tesseract-wrappers