1、背景
前文已經簡要介紹tesseract ocr引擎的安裝及基本使用,其中提到使用-l eng參數來限定語言庫,可以提高識別准確率及識別效率。
本文將針對某個網站的驗證碼進行樣本訓練,形成自己的語言庫,來提高驗證碼識別率。
2、准備工具
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官網),運行界面如下:
3、使用實例
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 <DIR> . 2016-06-03 14:37 <DIR> .. 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 <DIR> . 2016-06-03 16:34 <DIR> .. 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 <DIR> . 2016-06-03 16:41 <DIR> .. 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 <DIR> . 2016-06-03 17:24 <DIR> .. 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
4、總結:
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.
以上!