天天看點

2 Tesseract-ocr 系列 : Tesseract-ocr training (訓練)

關于Tesseract-ocr 訓練的詳細資訊可以參照:

tesseract-ocr Wiki:TrainingTesseract

https://github.com/tesseract-ocr/tesseract/wiki/TrainingTesseract

或者:

ubuntu下使用Tesseract-ocr(編譯、安裝、使用、訓練新的語言庫)

http://blog.csdn.net/yimingsilence/article/details/51353772

以下是執行步驟的簡略版

  1. 生成訓練圖檔: 此步結果生成 ~.tif 和 ~.box 檔案。

    此步有兩種方法:

    方法一:使用含有要識别字元的 text(~.txt) 檔案和已在系統安裝成功的字型檔案(~.ttf)生成所需圖檔 ~.tif 和 ~ .box ;

    方法二:使用 jTessBoxEditor 直接将用作訓練素材的帶字型格式的圖檔轉化為 ~.tif 格式,之後再由 ~.tif 檔案生成~ .box 檔案。

    這裡先說方法一,方法二見另一篇部落格。

    方法一: 由 ~.txt 和 ~.ttf 檔案直接生成 ~.tif 和 ~.box 檔案。

    a. 建立training_text.txt 檔案(裡面包含要識别的所有字元,且其中字元的頻率與要識别的字元頻率相對應,具體要求可以參照:Requirements for text input files:

    https://github.com/tesseract-ocr/tesseract/wiki/Training-Tesseract);

    b. 使用 text2train 訓練工具進行訓練,生成一張包含這些文字字型格式的的圖檔 .tif,以及字元在這張圖上的位置資訊 .box;

    指令格式:

    其中:

    -text:要進行訓練的文本檔案

    -outputbase:[lang]指定語言, [fontname]指定字型類型圖,即字型名稱;

    -font: 字型名稱(字型檔案以.ttf為擴充名)

    -fonts_dir:字型目錄

如:Ubuntu系統中/usr/share/fonts/truetype/freefont/目錄下有一個FreeMono.ttf字型

//執行成功會生成兩個檔案

eng.freemono.exp0.tif: 包含training_text.txt文字的圖檔檔案

eng.freemono.exp0.box:文本檔案,記錄各字元在這個圖檔檔案中的位置資訊。

2.開始訓練

訓練指令為:

使用前面生成的tif及box檔案就是:

//執行成功會生成兩個檔案: eng.freemono.exp0.tr:前者對應于box檔案中各字元在tif圖檔檔案中的形狀資訊,記錄的方式實際上是将一個字元看成是一個多邊形,而tr檔案記錄的就是多邊形每條邊的位置、方向、長度等資訊。

eng.freemono.exp0.txt:後者隻有一些換行符。 // 在我的環境中沒有發現該檔案,因為以後的步驟中不會用到,是以沒有影響。

3.生成字元集資訊

需要用到一個叫unicharset_extractor的訓練工具。

指令格式:

unicharset_extractor lang.fontname.exp0.box lang.fontname.exp1.box …
           

前面隻生成了1個box檔案,是以有:

//執行成功會生成1個文本檔案:

unicharset,正如其名字表明的,這個檔案記錄的是一個字元集,它存有box檔案裡面不重複的字元資訊,每個單獨字元占一行。

4.建立字型資訊檔案 font_properties

使用vi 手動建立 font_properties //.txt格式的檔案,但是不帶字尾 .txt

由于我們可以訓練tesseract識别同一種語言的不同字型(這裡隻訓練一種字型),我們需要提供字型相關的特性,這是通過一個叫做font_properties的文本檔案标明的。這個檔案的每一行以如下格式記錄了一個字型的資訊:

指令格式:

在<字型>是一個字元串命名的字型 ; <斜體>,<加粗>,<固定>,<襯線>和<哥特體>都是簡單的0或1标志訓示字型是與否的屬性。

本文的訓練中使用了名為FreeMono的字型,是以font_properties裡面需要有一行以FreeMono開頭的字型資訊。

除了手動建立這個檔案外,tesseract-ocr源碼中也提供了一個這樣的font_properties檔案(training/langdata/font_properties), 并且裡面已經有了很多字型的資訊,是以這裡就不許要手動建立了,後面的步驟要用的這個檔案的時候,直接指定使用這個檔案就行了。源代碼中的font_properties檔案關于FreeMono字型的資訊是:

FreeMono 0 0 1 1 0
           

5.聚合

shapeclustering, mftraining及cntraining的用法

指令格式:

shapeclustering -F font_properties -U unicharset lang.fontname.exp0.tr lang.fontname.exp1.tr …
           
mftraining -F font_properties -U unicharset -O lang.unicharset lang.fontname.exp0.tr lang.fontname.exp1.tr …
           
cntraining lang.fontname.exp0.tr lang.fontname.exp1.tr …
           

1) shapeclustering

// 執行成功會生成1個文本檔案:shapetable,下一步的mftraining會自動在目前目錄加載這個檔案。

2) mftraining

//執行成功輸出結果有警告,但不影響,會生成3個檔案:

eng.unicharset

inttemp

pffmtable

3) cntraining

6.檔案重命名:

将前面生成的幾個檔案(包括shapetable, normproto, inttemp, pffmtable) 更名為以lang.開頭的檔案(在這裡,就是以eng.開頭,比如eng.shapetable, eng.normproto等等)

mv  inttemp eng. inttemp
    mv normproto eng.normproto
    mv pffmtable eng.pffmtable
    mv shapetable eng.shapetable
           
  1. 合并生成traineddata檔案

    然後執行以下指令将它們合并成一個traineddata檔案(eng.traineddata)

combine_tessdata eng.
           
//執行成功會生成1個文本檔案: eng.traineddata    
           

8.将生成的lang.traineddata 檔案拷貝到系統中 ~/tessdata/目錄下.

如我的tessdata目錄為: /usr/local/share/tessdata/

sudo cp /local/path/eng.traineddata /usr/local/share/tessdata/
           

訓練完畢,可以用以上步驟生成的 eng.traineddata 來進行識别。

需要注意的是,根據本文的訓練生成的traineddata隻能識别本文最初建立的training_data.txt中存在的字元,并且隻能識别字型與FreeMono接近的文字。

9.測試

如我自己進行訓練生成的語言檔案定義為 lang=num1 則有:

tesseract invoice2b.jpg invoice2bnum1 -l num1
           

識别對象:

2 Tesseract-ocr 系列 : Tesseract-ocr training (訓練)

識别結果:

2 Tesseract-ocr 系列 : Tesseract-ocr training (訓練)