WebUI智能識別驗證碼之tesseract

前言

本文訓練數(shù)據(jù)部分參考:https://blog.csdn.net/ruyulin/article/details/89046148

只能識別字母與數(shù)字比較正的圖片內(nèi)容侮腹,不正的基本無法識別,就算訓練也是一樣

這種就無法識別:
image.png

這種基本能識別:
image.png

需要更精準的識別广恢,可以使用tensorflow框架凯旋,進行模型建立及訓練呀潭,但是需要學習的東西會比較多钉迷。

一、環(huán)境準備

1.安裝jTessBoxEditor

官網(wǎng):https://sourceforge.net/projects/vietocr/files/jTessBoxEditor/

  • 下載jTessBoxEditor钠署,我是在腳本之家下載的(網(wǎng)上隨便找的)
  • 解壓jTessBoxEditor放在自己的軟件目錄
  • 將jTessBoxEditorFX的tesseract-ocr文件夾內(nèi)容清空(用于安裝tesseract)
    我的路徑(E盤根目錄下):E:\jTessBoxEditorFX

注意:

  • 使用此軟件需要安裝JDK
  • 啟動文件train.bat

2.安裝tesseract

官網(wǎng):https://digi.bib.uni-mannheim.de/tesseract/

  • 下載tesseract

  • 安裝到jTessBoxEditorFX的tesseract-ocr文件夾下


    image.png
  • 添加環(huán)境變量:TESSDATA_PREFIX糠聪,路徑為:tesseract-ocr的tessdata文件夾


    image.png
  • 將tesseract-ocr目錄加入path

image.png

3.安裝pytesseract模塊

pip install pytesseract

  • 在Python安裝目錄下,找到pytesseract.py 文件
image.png
  • 修改pytesseract.py文件的第二十七行tesseract_cmd的值為實際安裝路徑:
    image.png

    注意:需要使用r轉(zhuǎn)為原始字符串谐鼎,或者使用雙\


    若未安裝tesseract舰蟆,在Python中使用時會出現(xiàn)如下錯誤信息提示:
    pytesseract.pytesseract.TesseractNotFoundError: tesseract is not installed or it's not in your PATH. See README file for more information.

二、準備數(shù)據(jù)

(一)獲取數(shù)據(jù)

以古詩文網(wǎng)的登錄頁面為例狸棍,獲取驗證碼數(shù)據(jù):


image.png
from PIL import Image
import pytesseract
import re

from selenium import webdriver
driver=webdriver.Chrome()
driver.maximize_window()
driver.get('https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx')
for i in range(10):
    #注意拼接路徑身害,前面的點號 . 表示相對當前路徑
    driver.find_element_by_xpath('//*[@id="imgCode"]').screenshot('.\\verification_code\\' + 'code' + str(i) + '.png')
    driver.refresh()

結(jié)果圖片:

image.png

(二)處理數(shù)據(jù)

三、訓練數(shù)據(jù)

1.訓練數(shù)據(jù)

  • 打開 jTessBoxEditor(啟動文件為train.bat)草戈,合并圖片產(chǎn)生一個tif文件

  • 產(chǎn)生一個box文件用于訓練
    tesseract VeriCode.font.exp1.tif VeriCode.font.exp1 batch.nochop makebox

  • 人工檢查不能識別的數(shù)據(jù)塌鸯,進行修正。具體如何訓練查看其他文章

  • 產(chǎn)生一個tr尾綴文件
    tesseract VeriCode.font.exp1.tif VeriCode.font.exp1 nobatch box.train

  • 新建一個名為font_properties的文件(注意:不需要尾綴)唐片,內(nèi)容為:font 0 0 0 0 0

  • 生成一個unicharset文件
    unicharset_extractor VeriCode.font.exp1.box

  • 生成一個shapetable文件
    shapeclustering -F font_properties -U unicharset VeriCode.font.exp1.tr

  • 生成字符特征文件(得到inttemp丙猬,pffmtable)
    mftraining -F font_properties -U unicharset -O unicharset VeriCode.font.exp1.tr

  • 合并處理后的tr尾綴文件(得到normproto)
    cntraining VeriCode.font.exp1.tr
    注意:合并多個直接后面加空格再加文件名就行

  • 修改文件名
    rename normproto VeriCode.normproto
    rename unicharset VeriCode.unicharset
    rename inttemp VeriCode.inttemp
    rename pffmtable VeriCode.pffmtable
    rename shapetable VeriCode.shapetable

  • combine_tessdata VeriCode.(得到訓練結(jié)果:VeriCode.traineddata文件)
    注意VeriCode后面有個點號

2.遷移訓練結(jié)果

復制VeriCode.traineddata,放到tessdata(Tesseract安裝目錄的一個文件夾)文件夾下

image.png

3.訓練數(shù)據(jù)注意事項

  • 生成tif尾綴文件時费韭,嚴格按照name.fontname.expNum命名茧球,否則會報加載字體錯誤
  • 不要漏掉重命名文件的步驟
  • 如果自己把步驟加入bat文件中自動執(zhí)行,需要確定文件路勁與文件名是否正確
image.png

4.如何訓練數(shù)據(jù)

4.1合并出tif尾綴文件星持,用于產(chǎn)生box文件(訓練用)

image.png

tesseract VeriCode.font.exp1.tif VeriCode.font.exp1 batch.nochop makebox


image.png

4.1產(chǎn)生box文件用于訓練

  • 打開cmd矾飞,切換到存放tr尾綴文件的目錄
  • 執(zhí)行tesseract VeriCode.font.exp1.tif VeriCode.font.exp1 batch.nochop makebox
    執(zhí)行指令圖:
    image.png

    結(jié)果圖
    image.png

4.3 打開tr尾綴文件

image.png

4.4訓練詳細步驟

image.png

4.4.1修改char值

雙擊需要修改值的char,修改之后需要回車

4.4.2修改單個char的坐標與參數(shù)

image.png
  • 鼠標選中需要修改的char行
  • 點擊character的>>
  • 鼠標選中需要修改的參數(shù)剂习,上下方向鍵修改(鼠標點擊變化一個數(shù)據(jù)就消失了)

4.4.3預覽修改數(shù)據(jù)

  • 紅色方框內(nèi)的小綠色框就是設置的字符寬度傻谁,可以用于查看寬度是否合適
  • 點擊不同數(shù)字,可以切換到不同的字符view頁


    image.png

4.4.4字符的合并损痰、分割福侈、插入、刪除

例如卢未,該D字符肪凛,寬度很寬堰汉,占據(jù)多個字符位置,可以使用分割split伟墙,分割成多個再刪除不需要的翘鸭,或者修改寬度,再調(diào)整坐標


image.png

image.png

image.png

image.png

四戳葵、Python中使用

前面步驟全部完成就乓,我們就可以使用pytesseract進行圖片識別了

from PIL import Image
import pytesseract
import re

from selenium import webdriver
#下面兩個函數(shù)用于處理圖片,進行灰度處理拱烁,與降噪
def clear_image(image):
    image = image.convert('RGB')
    width = image.size[0]
    height = image.size[1]
    noise_color = get_noise_color(image)

    for x in range(width):
        for y in range(height):
            # 清除邊框和干擾色
            rgb = image.getpixel((x, y))
            if (x == 0 or y == 0 or x == width - 1 or y == height - 1
                    or rgb == noise_color or rgb[1] > 100):
                image.putpixel((x, y), (255, 255, 255))
    return image


def get_noise_color(image):
    for y in range(1, image.size[1] - 1):
        # 獲取第2列非白的顏色
        (r, g, b) = image.getpixel((2, y))
        if r < 255 and g < 255 and b < 255:
            return (r, g, b)


driver=webdriver.Chrome()
driver.maximize_window()
driver.get('https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx')
driver.find_element_by_xpath('//*[@id="imgCode"]').screenshot('verification_code.png')

image = Image.open('verification_code.png')
image = clear_image(image)
# 轉(zhuǎn)化為灰度圖
imgry = image.convert('L')
imgry.save('verification_code_grey.png')
print('未使用訓練數(shù)據(jù)源處理之前:')
code=pytesseract.image_to_string('verification_code_grey.png')
print(code)
print('使用訓練數(shù)據(jù)源處理之后:')
text=pytesseract.image_to_string('verification_code_grey.png',lang='VeriCode')
print('使用訓練數(shù)據(jù)源處理之后:未使用正則處理')
print(text)
#正則表達式提取
print('使用訓練數(shù)據(jù)源處理之后:使用正則處理')
result=re.findall(r'[\dA-Za-z]{4}',text)
print(result)
image.png
image.png

2.使用注意

若未安裝:tesseract生蚁,則會報錯
pytesseract.pytesseract.TesseractNotFoundError: tesseract is not installed or it's not in your PATH. See README file for more information.

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市戏自,隨后出現(xiàn)的幾起案子邦投,更是在濱河造成了極大的恐慌,老刑警劉巖擅笔,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件志衣,死亡現(xiàn)場離奇詭異,居然都是意外死亡猛们,警方通過查閱死者的電腦和手機念脯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來弯淘,“玉大人绿店,你說我怎么就攤上這事《ィ” “怎么了惯吕?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長怕午。 經(jīng)常有香客問我废登,道長,這世上最難降的妖魔是什么郁惜? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任堡距,我火速辦了婚禮,結(jié)果婚禮上兆蕉,老公的妹妹穿的比我還像新娘羽戒。我一直安慰自己,他們只是感情好虎韵,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布易稠。 她就那樣靜靜地躺著,像睡著了一般包蓝。 火紅的嫁衣襯著肌膚如雪驶社。 梳的紋絲不亂的頭發(fā)上企量,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機與錄音亡电,去河邊找鬼届巩。 笑死,一個胖子當著我的面吹牛份乒,可吹牛的內(nèi)容都是我干的恕汇。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼或辖,長吁一口氣:“原來是場噩夢啊……” “哼瘾英!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起孝凌,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤方咆,失蹤者是張志新(化名)和其女友劉穎月腋,沒想到半個月后蟀架,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡榆骚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年片拍,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妓肢。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡捌省,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出碉钠,到底是詐尸還是另有隱情纲缓,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布喊废,位于F島的核電站祝高,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏污筷。R本人自食惡果不足惜工闺,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瓣蛀。 院中可真熱鬧陆蟆,春花似錦、人聲如沸惋增。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诈皿。三九已至林束,卻和暖如春钩杰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背诊县。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工讲弄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人依痊。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓避除,卻偏偏與公主長得像,于是被迫代替她去往敵國和親胸嘁。 傳聞我的和親對象是個殘疾皇子瓶摆,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容