前言
本文訓練數(shù)據(jù)部分參考:https://blog.csdn.net/ruyulin/article/details/89046148
只能識別字母與數(shù)字比較正的圖片內(nèi)容侮腹,不正的基本無法識別,就算訓練也是一樣
這種基本能識別:
需要更精準的識別广恢,可以使用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文件夾下
-
添加環(huán)境變量:TESSDATA_PREFIX糠聪,路徑為:tesseract-ocr的tessdata文件夾
將tesseract-ocr目錄加入path
3.安裝pytesseract模塊
pip install pytesseract
- 在Python安裝目錄下,找到pytesseract.py 文件
- 修改pytesseract.py文件的第二十七行tesseract_cmd的值為實際安裝路徑:
注意:需要使用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ù):
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é)果圖片:
(二)處理數(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.shapetablecombine_tessdata VeriCode.(得到訓練結(jié)果:VeriCode.traineddata文件)
注意VeriCode后面有個點號
2.遷移訓練結(jié)果
復制VeriCode.traineddata,放到tessdata(Tesseract安裝目錄的一個文件夾)文件夾下
3.訓練數(shù)據(jù)注意事項
- 生成tif尾綴文件時费韭,嚴格按照name.fontname.expNum命名茧球,否則會報加載字體錯誤
- 不要漏掉重命名文件的步驟
- 如果自己把步驟加入bat文件中自動執(zhí)行,需要確定文件路勁與文件名是否正確
4.如何訓練數(shù)據(jù)
4.1合并出tif尾綴文件星持,用于產(chǎn)生box文件(訓練用)
tesseract VeriCode.font.exp1.tif VeriCode.font.exp1 batch.nochop makebox
4.1產(chǎn)生box文件用于訓練
- 打開cmd矾飞,切換到存放tr尾綴文件的目錄
- 執(zhí)行tesseract VeriCode.font.exp1.tif VeriCode.font.exp1 batch.nochop makebox
執(zhí)行指令圖:
結(jié)果圖
4.3 打開tr尾綴文件
4.4訓練詳細步驟
4.4.1修改char值
雙擊需要修改值的char,修改之后需要回車
4.4.2修改單個char的坐標與參數(shù)
- 鼠標選中需要修改的char行
- 點擊character的>>
- 鼠標選中需要修改的參數(shù)剂习,上下方向鍵修改(鼠標點擊變化一個數(shù)據(jù)就消失了)
4.4.3預覽修改數(shù)據(jù)
- 紅色方框內(nèi)的小綠色框就是設置的字符寬度傻谁,可以用于查看寬度是否合適
-
點擊不同數(shù)字,可以切換到不同的字符view頁
4.4.4字符的合并损痰、分割福侈、插入、刪除
例如卢未,該D字符肪凛,寬度很寬堰汉,占據(jù)多個字符位置,可以使用分割split伟墙,分割成多個再刪除不需要的翘鸭,或者修改寬度,再調(diào)整坐標
四戳葵、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)
2.使用注意
若未安裝:tesseract生蚁,則會報錯
pytesseract.pytesseract.TesseractNotFoundError: tesseract is not installed or it's not in your PATH. See README file for more information.