OCR-Tesseract系列學習——利用jTessBoxEditor工具進行樣本訓練,提高識別率

1 聲明

前段時間忙於複試,時間緊湊,沒來得及整理相關材料。今藉機梳理。能力有限,註明轉載出處。
https://www.cnblogs.com/zhongtang/p/5555950.html

2 背景

前文已經簡要介紹tesseract ocr引擎的安裝及基本使用,其中提到使用-l eng參數來限定語言庫,可以提高識別準確率及識別效率。本文將針對某個網站的驗證碼進行樣本訓練,形成自己的語言庫,來提高驗證碼識別率。

3 準備工具

tesseract樣本訓練有一個官方流程說明,https://github.com/tesseract-ocr/tesseract/wiki/TrainingTesseract#run-tesseract-for-training,不過都是英文的,個人認爲這個地址適合於查找細節問題,全程看E文對大衆還是有一定的困難。

具體的方法有兩種:1-利用三方工具,2-完全命令行操作,三方工具主要在https://github.com/tesseract-ocr/tesseract/wiki/AddOns下載,本文將用到jTessBoxEditor這個工具,我們先給他下載到本地。

需要特別說明,這個工具是基於java虛擬機運行的,所以我們還要下載並安裝一個java虛擬機,下載地址:http://download.oracle.com/otn-pub/java/jdk/8u91-b14/jdk-8u91-windows-x64.exe?AuthParam=1463733597_1161f2d895aa7606ed260b43b83d5f86。

總結一下:

1、工具2 java虛擬機 Ver 1.8.0_91 64位版本 (oracle官網)

2、工具1 jtessboxeditor Ver 1.5版本 (jtessboxeditor官網),運行界面如下:

4 使用實例

1)、準備樣本圖片

手動刷新某網站驗證碼,手動或者寫程序,保存了101個驗證碼樣本文件,分別命名成:1.png,2.png,……,101.png。

該驗證碼有幾個特點:a、定長4位,b、都是數字,c、有背景干擾,但比較簡單,d、字體爲紅色。

爲了提高識別率,首先做了一個工作就是灰度化處理,並全部轉換成tif文件,分別命名成:1.tif,2.tif,……,101.tif,統一存放在d:\python\lnypcg下。

2)、合併樣本圖片

打開jtessboxeditor,點擊Tools->Merge Tiff ,按住shift鍵選擇前文提到的101個tif文件,並把生成的tif合併到新目錄d:\python\lnypcg\new下,命名爲langyp.fontyp.exp0.tif。

注意:langyp 是本人定義的語言名稱,fontyp是本人定義的字體名稱,後續都會用到,你可以修改成你喜歡的名字。

3)、生成box文件

執行命令生成langyp.fontyp.exp0.box文件

tesseract langyp.fontyp.exp0.tif langyp.fontyp.exp0 -l eng -psm 7 batch.nochop makebox

複製代碼
D:\python\lnypcg\new>tesseract langyp.fontyp.exp0.tif langyp.fontyp.exp0 -l eng -psm 7 batch.nochop makebox
Tesseract Open Source OCR Engine v3.02 with Leptonica
Page 1 of 101
Page 2 of 101
Page 3 of 101
……
Page 101 of 101

D:\python\lnypcg\new>dir
驅動器 D 中的卷沒有標籤。
卷的序列號是 36D9-CDC7

D:\python\lnypcg\new 的目錄

2016-06-03 14:37

.
2016-06-03 14:37
2016-06-03 14:30 6,327 langyp.fontyp.exp0.box
2016-06-03 13:07 126,056 langyp.fontyp.exp0.tif
2 個文件 132,383 字節
2 個目錄 24,869,994,496 可用字節
複製代碼

4)、修改box文件

切換到jTessBoxEditor工具的Box Editor頁,點擊open,打開前面的tiff文件langyp.fontyp.exp0.tif,工具會自動加載對應的box文件。

檢查box數據,如下圖所示,數字8被誤認成字母H,手工修改H成8,並保存。

點擊下圖紅色框的按鈕,逐個覈對tif文件的box數據,全部檢查結束並保存。

5)、生成font_properties

執行echo命令生成font_properties。

echo fontyp 0 0 0 0 0 >font_properties

也可以手工新建一個名爲font_properties的文本文件(注意該文件沒有擴展名),內容爲字體名fontyp,後面帶5個0,分別代表字體的粗體、斜體等屬性,這裏全部是0

D:\python\lnypcg\new>echo fontyp 0 0 0 0 0 >font_properties

D:\python\lnypcg\new>type font_properties
fontyp 0 0 0 0 0

6)、生成訓練文件

執行命令,生成langyp.fontyp.exp0.tr訓練文件

tesseract langyp.fontyp.exp0.tif langyp.fontyp.exp0 -l eng -psm 7 nobatch box.train

複製代碼
D:\python\lnypcg\new>tesseract langyp.fontyp.exp0.tif langyp.fontyp.exp0 -l eng -psm 7 nobatch box.train
Tesseract Open Source OCR Engine v3.02 with Leptonica
Page 1 of 101
row xheight=8.66667, but median xheight = 10
APPLY_BOXES:
Boxes read from boxfile: 4
Found 4 good blobs.
Generated training data for 1 words
……
……
……
Page 101 of 101
row xheight=8.66667, but median xheight = 10
APPLY_BOXES:
Boxes read from boxfile: 4
Found 4 good blobs.
Generated training data for 1 words

D:\python\lnypcg\new 的目錄

2016-06-03 16:34

.
2016-06-03 16:34
2016-06-03 16:05 16 font_properties
2016-06-03 14:30 6,327 langyp.fontyp.exp0.box
2016-06-03 13:07 126,056 langyp.fontyp.exp0.tif
2016-06-03 16:20 618,844 langyp.fontyp.exp0.tr
2016-06-03 16:20 202 langyp.fontyp.exp0.txt
5 個文件 751,445 字節
2 個目錄 24,869,101,568 可用字節
複製代碼

7)、生成字符集文件

執行命令,生成名爲unicharset的字符集文件。

unicharset_extractor langyp.fontyp.exp0.box

複製代碼
D:\python\lnypcg\new>unicharset_extractor langyp.fontyp.exp0.box
Extracting unicharset from langyp.fontyp.exp0.box
Wrote unicharset file ./unicharset.

D:\python\lnypcg\new>dir
驅動器 D 中的卷沒有標籤。
卷的序列號是 36D9-CDC7

D:\python\lnypcg\new 的目錄

2016-06-03 16:41

.
2016-06-03 16:41
2016-06-03 16:05 16 font_properties
2016-06-03 14:30 6,327 langyp.fontyp.exp0.box
2016-06-03 13:07 126,056 langyp.fontyp.exp0.tif
2016-06-03 16:20 618,844 langyp.fontyp.exp0.tr
2016-06-03 16:20 202 langyp.fontyp.exp0.txt
2016-06-03 16:41 712 unicharset
6 個文件 752,157 字節
2 個目錄 24,869,171,200 可用字節
複製代碼

8)、生成shape文件

執行命令,生成shape文件

shapeclustering -F font_properties -U unicharset -O langyp.unicharset langyp.fontyp.exp0.tr

複製代碼
D:\python\lnypcg\new>shapeclustering -F font_properties -U unicharset -O langyp.unicharset langyp.fontyp.exp0.tr
Reading langyp.fontyp.exp0.tr
Building master shape table
Computing shape distances…
Stopped with 0 merged, min dist 999.000000
Computing shape distances… 0
Stopped with 0 merged, min dist 999.000000
Computing shape distances… 0
Stopped with 0 merged, min dist 999.000000
Computing shape distances… 0
Stopped with 0 merged, min dist 999.000000
Computing shape distances… 0
Stopped with 0 merged, min dist 999.000000
Computing shape distances… 0
Stopped with 0 merged, min dist 999.000000
Computing shape distances… 0
Stopped with 0 merged, min dist 999.000000
Computing shape distances… 0
Stopped with 0 merged, min dist 999.000000
Computing shape distances… 0
Stopped with 0 merged, min dist 999.000000
Computing shape distances… 0
Stopped with 0 merged, min dist 999.000000
Computing shape distances… 0
Stopped with 0 merged, min dist 999.000000
Computing shape distances… 0
Stopped with 0 merged, min dist 999.000000
Computing shape distances…
Stopped with 0 merged, min dist 999.000000
Computing shape distances…
Stopped with 0 merged, min dist 999.000000
Computing shape distances… 0 1 2 3 4 5 6 7 8 9 10
Stopped with 0 merged, min dist 0.057803
Master shape_table:Number of shapes = 11 max unichars = 1 number with multiple unichars = 0

D:\python\lnypcg\new>dir
驅動器 D 中的卷沒有標籤。
卷的序列號是 36D9-CDC7

D:\python\lnypcg\new 的目錄

2016-06-03 17:24

.
2016-06-03 17:24
2016-06-03 17:20 19 font_properties
2016-06-03 14:30 6,327 langyp.fontyp.exp0.box
2016-06-03 13:07 126,056 langyp.fontyp.exp0.tif
2016-06-03 17:23 618,844 langyp.fontyp.exp0.tr
2016-06-03 17:23 202 langyp.fontyp.exp0.txt
2016-06-03 17:24 723 langyp.unicharset
2016-06-03 17:24 202 shapetable
2016-06-03 17:24 712 unicharset
8 個文件 753,085 字節
2 個目錄 24,868,278,272 可用字節
複製代碼

9)、生成聚集字符特徵文件

執行命令,生成3個特徵字符文件,unicharset、inttemp、pffmtable

mftraining -F font_properties -U unicharset -O langyp.unicharset langyp.fontyp.exp0.tr

D:\python\lnypcg\new>mftraining -F font_properties -U unicharset -O langyp.unicharset langyp.fontyp.exp0.tr
Read shape table shapetable of 11 shapes
Reading langyp.fontyp.exp0.tr
Done!

10)、生成字符正常化特徵文件

執行命令,生成正常化特徵文件normproto。

cntraining langyp.fontyp.exp0.tr

D:\python\lnypcg\new>cntraining langyp.fontyp.exp0.tr
Reading langyp.fontyp.exp0.tr
Clustering …

11)、更名

執行命令,把步驟9,步驟10生成的特徵文件進行更名。

rename normproto fontyp.normproto
rename inttemp fontyp.inttemp
rename pffmtable fontyp.pffmtable
rename unicharset fontyp.unicharset
rename shapetable fontyp.shapetable

複製代碼
D:\python\lnypcg\new>rename normproto fontyp.normproto

D:\python\lnypcg\new>rename inttemp fontyp.inttemp

D:\python\lnypcg\new>rename pffmtable fontyp.pffmtable

D:\python\lnypcg\new>rename unicharset fontyp.unicharset

D:\python\lnypcg\new>rename shapetable fontyp.shapetable
複製代碼

12)、合併訓練文件

執行命令,生成fontyp.traineddata文件。

combine_tessdata fontyp.

注意:

a、fontyp.traineddata文件最終要拷貝tesseract安裝目錄的tessdata目錄下,才能被tesseract找到。

b、命令行最後必須帶一個點。

c、執行結果中,1,3,4,5,13這幾行必須有數值,才代表命令執行成功。

複製代碼
D:\python\lnypcg\new>combine_tessdata fontyp.
Combining tessdata files
TessdataManager combined tesseract data files.
Offset for type 0 is -1
Offset for type 1 is 140
Offset for type 2 is -1
Offset for type 3 is 852
Offset for type 4 is 137760
Offset for type 5 is 137850
Offset for type 6 is -1
Offset for type 7 is -1
Offset for type 8 is -1
Offset for type 9 is -1
Offset for type 10 is -1
Offset for type 11 is -1
Offset for type 12 is -1
Offset for type 13 is 139352
Offset for type 14 is -1
Offset for type 15 is -1
Offset for type 16 is -1
複製代碼

13)測試使用

譬如前文的28.tif中8被誤認爲字母S,用新的字體看是否還出錯。

複製代碼
D:\python\lnypcg>tesseract 28.tif output -l eng -psm 7
Tesseract Open Source OCR Engine v3.02 with Leptonica

D:\python\lnypcg>type output.txt
S094
#1調用默認的eng語言,8被識別成S

D:\python\lnypcg>tesseract 28.tif output -l fontyp -psm 7
Error opening data file C:\Program Files (x86)\Tesseract-OCR\tessdata/fontyp.traineddata
Please make sure the TESSDATA_PREFIX environment variable is set to the parent directory of your “tessdata” directory.
Failed loading language ‘fontyp’
Tesseract couldn’t load any languages!
Could not initialize tesseract.
#2條用新的fontyp語言,tesseract找不到fontyp語言。

D:\python\lnypcg>copy .\new\fontyp.traineddata “C:\Program Files (x86)\Tesseract-OCR\tessdata”
已複製 1 個文件。
#3複製fontyp.traineddata到tesseract的安裝目錄的tessdata子目錄下

D:\python\lnypcg>tesseract 28.tif output -l fontyp -psm 7
Tesseract Open Source OCR Engine v3.02 with Leptonica

D:\python\lnypcg>type output.txt
8094
#使用fontyp語言成功識別8094
複製代碼

5 總結:

Anyway,jtessboxeditor 工具其實是一個基本成型的三方樣本訓練工具,它的功能就是自動執行上述腳本命令,但是在實際使用中,還存在不夠完善的地方,譬如不能加psm參數,生成shape時經常程序異常崩潰,所以本文操作還是以命令行爲主。

tesseract是一個非常強大的ocr引擎,尤其是做了針對性訓練之後,驗證碼識別率幾乎可以達到95%以上,再在程序中增加一些判斷機制,基本上可以滿足爬蟲自動登陸需求了,回頭寫一個某東的自動識別驗證碼的爬蟲程序。

把前文提的簡化一下,綜合成如下步驟列表:

複製代碼
1、合併圖片
2、生成box文件
tesseract langyp.fontyp.exp0.tif langyp.fontyp.exp0 -l eng -psm 7 batch.nochop makebox
3、修改box文件
4、生成font_properties
echo fontyp 0 0 0 0 0 >font_properties
5、生成訓練文件
tesseract langyp.fontyp.exp0.tif langyp.fontyp.exp0 -l eng -psm 7 nobatch box.train
6、生成字符集文件
unicharset_extractor langyp.fontyp.exp0.box
7、生成shape文件
shapeclustering -F font_properties -U unicharset -O langyp.unicharset langyp.fontyp.exp0.tr
8、生成聚集字符特徵文件
mftraining -F font_properties -U unicharset -O langyp.unicharset langyp.fontyp.exp0.tr
9、生成字符正常化特徵文件
cntraining langyp.fontyp.exp0.tr
10、更名
rename normproto fontyp.normproto
rename inttemp fontyp.inttemp
rename pffmtable fontyp.pffmtable
rename unicharset fontyp.unicharset
rename shapetable fontyp.shapetable
11、合併訓練文件,生成fontyp.traineddata
combine_tessdata fontyp.
複製代碼
以上!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章