Tesseract OCR字元訓練工具及方法

2021-07-23 11:49:56 字數 3789 閱讀 1901

主題

概要tesseract-ocr

tesseract-ocr訓練工具

編輯時間

新建20161008

更正訓練步驟序號

20161225

序號參考資料

第一張是比較正規的,下面主要以它們為例講解這個工具的實現思路。

網上關於tesseract-ocr的訓練工具都是清一色的jtessboxeditor,但這工具對於中文字元的訓練太過繁瑣,特別是像這種廣告牌,有背景,有藝術字,根本就找不到對應的box,就算找到了還要自己人工輸入打標籤,而且工具對utf-8格式的漢字還不能正常顯示。

為了一勞永逸的解決這種問題,花了幾天工夫寫了個訓練工具,雖然還是會有大量手工的操作,但是這些步驟都是必不可少的,已經找不到太好的方法省掉了。

首先看下工具的輸入和輸出:

輸入是大量的從廣告素材中剪下下來的:

輸出是tesseract-ocr需要的box和tif檔案:

box檔案中是標籤和位置資訊:

tif中是歸一化後的字元資訊:

用jtessboxeditor器開啟這個box,觀察可看出結果非常好:

有了這個box檔案和tif檔案,接下來就能用tesseract進行訓練了,訓練步驟網上有很多,下面主要說下這個工具的實現思路,說穿了就一文不值。

這個工具分成兩個階段。

第一階段從廣告牌中切出包含文字的部分,對於中文只能一行一行的切,而對於英文可以多行多行的切,這是因為兩者使用的提取演算法不一樣導致的。這部分需要手工去操作。

第一階段輸出的結果是二值化後的黑底白字的單個字元塊:

第二個階段就是以這些黑底白字的字元作為輸入,需要給每個字元打上標籤,即以這個字元開頭重新命名,第乙個字元就代表了這個字元的標籤。輸出就是前文提到的box檔案和tiff檔案。這一階段也是需要人工費時的去做,一方面需要乙個乙個正確的打標籤,一方面對於有些第一階段切下來的字元,效果不好的要去掉。

下面來分析,拿到一張,比如:

這張,是怎麼樣把字元切割開來並寫入到box檔案和tif裡面的?

這個過程涉及到了簡單的影象處理,需要用到opencv庫。

首先把進行灰度化、均衡化,最後進行大津閥值二值化:

二值化的結果統一轉化成黑底白字。

下面要把文中的字元切割開來,對於英文和數字,直接取輪廓操作,並取最小外接矩形就行。對於中文,由於存在上下、左右結構,輪廓不連續,需要特殊處理。

處理步驟說來也簡單,通過統計中每列畫素為1的個數,從左到右掃瞄,遇到畫素為1的個數大於某個值(我設為3個),就假定為乙個字元的左邊界;遇到畫素為1的個數小於等於某個值(我設為3個),就假定為乙個字元的右邊界;字元的上下邊界還是使用原來的邊界。遇到左右結構的漢字時,這樣可能會把偏旁部首分開,因此需要把前面個字元的右邊界和後面個字元的左邊界間隔小於某個閥值(2或3畫素)的合併成乙個字元。

接著遍歷每個確定好左右邊界的字元,從上到下掃瞄確定字元的上邊界,從下到上掃瞄確定字元的下邊界。也是通過統計畫素為1的個數來確定。

邊界確定好後,通過opencv取出roi區域並輸出即可,作為第一階段的結果,如下圖所示:

對於第二階段,給上面第一階段輸出的字元打好標籤並後怎麼輸出tesseract訓練需要的box和tif檔案?

先分析box檔案的內容,第一列指定了該字元的標籤,後面數字指定該字元在tif中的座標位置和長寬資訊。因而工具要做的工作就是,每當輸出乙個字元在tif中,就同時輸出該字元的資訊在box檔案中。需要注意的是,第一階段輸出的字元是黑底白字,需要把它轉為白底黑字輸出到tif中,效果更好。另外,第一階段的字元標籤在vs中文環境中使用的是ansi編碼,輸出到box檔案中的時候需轉換為utf-8編碼。

利用工具分別得到中文、英文(包含數字)的box和tif檔案,分別命名為:

len.ennormal.exp0.tif、len.ennormal.exp0.box、lcn.cnnormal.exp0.tif、lcn.cnnormal.exp0.box。

在pc上安裝好tesseract-ocr,並切換到工作目錄,按下列步驟進行訓練即可得到合併的字型檔。

進行box train,得到tr特徵檔案

tesseract len.ennormal.exp0.tif len.ennormal.exp0 nobatch box.train

tesseract lcn.cnnormal.exp0.tif lcn.cnnormal.exp0 nobatch box.train

可以看到英文和中文分別多出了len.ennormal.exp0.tr lcn.cnnormal.exp0.tr特徵檔案。

2.獲取中英文的字符集

unicharset_extractor len.ennormal.exp0.box lcn.cnnormal.exp0.box

3.定義字型特徵檔案

在目錄下新建乙個名字為「font_properties」的檔案,並且輸入文字 :

ennormal 0 1 0 0 0

cnnormal 0 1 0 0 0

表示中英文字型檔案,其中1表示為粗體。

4.聚集字元特徵(inttemp、pffmtable、normproto)

mftraining –f font_properties -u unicharset len.ennormal.exp0.tr lcn.cnnormal.exp0.tr

5.clustering,產生字元形狀正常化特徵檔案normproto

cntraining len.ennormal.exp0.tr lcn.cnnormal.exp0.tr

6.合併訓練檔案

此時,在目錄下應該生成若干個檔案了,把unicharset, inttemp, normproto, pffmtable這四個檔案加上字首「lshao.」(可任意)。然後 合併訓練檔案

輸入命令:

combine_tessdata lshao.

注意箭頭所指的行不為-1,即代表訓練成功。

把訓練好的lshao.traineddata壓縮成zip格式並放到android工程的assets目錄中即可。

最後識別結果還是不盡人意,猜測是缺少了進行影象預處理的過程。

Tesseract OCR引擎 入門

ocr optical character recognition 光學字元識別,是指對檔案中的文字進行分析識別,獲取的過程。tesseract 開源的ocr識別引擎,初期tesseract引擎由hp實驗室研發,後來貢獻給了開源軟體業,後經由google進行改進,消除bug,優化,重新發布。當前版本...

Tesseract OCR引擎 入門

ocr optical character recognition 光學字元識別,是指對檔案中的文字進行分析識別,獲取的過程。tesseract 開源的ocr識別引擎,初期tesseract引擎由hp實驗室研發,後來貢獻給了開源軟體業,後經由google進行改進,消除bug,優化,重新發布。當前版本...

Tesseract OCR引擎 入門

ocr optical character recognition 光學字元識別,是指對檔案中的文字進行分析識別,獲取的過程。tesseract 開源的ocr識別引擎,初期tesseract引擎由hp實驗室研發,後來貢獻給了開源軟體業,後經由google進行改進,消除bug,優化,重新發布。當前版本...