python 利用jTessBoxEditor工具進行樣本訓練,提高驗證碼識別率

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.
複製代碼

以上 來源:http://www.cnblogs.com/zhongtang/p/5555950.html


補充 版訓練生成的字典,如何跟老字典合併,不能合併從網絡中下載的新字典,智能合成自己訓練的字典

只需要.box 文件就可以

第一步

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

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

第二部

unicharset_extractor langyp.fontyp.exp0.box langyp.fontyp.exp1.box   合併box 產生了一個unicharset文件

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

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

cntraining langyp.fontyp.exp0.tr  langyp.fontyp.exp1.tr

第三步
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.


python識別驗證碼代碼

# coding=utf-8
import os
import random
import sys, time
import pytesseract

from PIL import Image, ImageEnhance
path = 'D:\ddrrr'  # 文件夾目錄
files = os.listdir(path)  # 得到文件夾下的所有文件名稱
s = []
for file in files:  # 遍歷文件夾
    if not os.path.isdir(file):  # 判斷是否是文件夾,不是文件夾纔打開
        # print file
        s.append(file)  # 每個文件的文本存到list中
print len(s)  # 打印結果
ok = 0
no = 0
for num in s:
    file_name = str(num)
    im = Image.open(path + "/" + file_name)
    imgry = im.convert("L")  # 灰色
    sharpness = ImageEnhance.Contrast(imgry)  # 提高識別
    sharp_img = sharpness.enhance(1.5)
    image2string = pytesseract.image_to_string(sharp_img,lang='fontyp', config="-psm 7").replace(" ","").upper()
    if file_name.find(image2string) >= 0 and image2string != None and image2string!="":
        print file_name + "/OK/" + image2string
        ok = ok + 1;
    else:
        if image2string!=None:
            sharp_img.save('d:/ddrrr2/' + file_name.replace(".png", ".tif"))
        print file_name + "/NO/" + image2string
        no = no + 1;

print ok
print no

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