WebUI智能识别验证码之tesseract

前言

本文训练数据部分参考:https://blog.csdn.net/ruyulin/article/details/89046148

只能识别字母与数字比较正的图片内容,不正的基本无法识别,就算训练也是一样

这种就无法识别:
image.png

这种基本能识别:
image.png

需要更精准的识别,可以使用tensorflow框架,进行模型建立及训练,但是需要学习的东西会比较多。

一、环境准备

1.安装jTessBoxEditor

官网:https://sourceforge.net/projects/vietocr/files/jTessBoxEditor/

  • 下载jTessBoxEditor,我是在脚本之家下载的(网上随便找的)
  • 解压jTessBoxEditor放在自己的软件目录
  • 将jTessBoxEditorFX的tesseract-ocr文件夹内容清空(用于安装tesseract)
    我的路径(E盘根目录下):E:\jTessBoxEditorFX

注意:

  • 使用此软件需要安装JDK
  • 启动文件train.bat

2.安装tesseract

官网:https://digi.bib.uni-mannheim.de/tesseract/

  • 下载tesseract

  • 安装到jTessBoxEditorFX的tesseract-ocr文件夹下


    image.png
  • 添加环境变量: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转为原始字符串,或者使用双\


    若未安装tesseract,在Python中使用时会出现如下错误信息提示:
    pytesseract.pytesseract.TesseractNotFoundError: tesseract is not installed or it's not in your PATH. See README file for more information.

二、准备数据

(一)获取数据

以古诗文网的登录页面为例,获取验证码数据:


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()

结果图片:

image.png

(二)处理数据

三、训练数据

1.训练数据

  • 打开 jTessBoxEditor(启动文件为train.bat),合并图片产生一个tif文件

  • 产生一个box文件用于训练
    tesseract VeriCode.font.exp1.tif VeriCode.font.exp1 batch.nochop makebox

  • 人工检查不能识别的数据,进行修正。具体如何训练查看其他文章

  • 产生一个tr尾缀文件
    tesseract VeriCode.font.exp1.tif VeriCode.font.exp1 nobatch box.train

  • 新建一个名为font_properties的文件(注意:不需要尾缀),内容为: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.(得到训练结果:VeriCode.traineddata文件)
    注意VeriCode后面有个点号

2.迁移训练结果

复制VeriCode.traineddata,放到tessdata(Tesseract安装目录的一个文件夹)文件夹下

image.png

3.训练数据注意事项

  • 生成tif尾缀文件时,严格按照name.fontname.expNum命名,否则会报加载字体错误
  • 不要漏掉重命名文件的步骤
  • 如果自己把步骤加入bat文件中自动执行,需要确定文件路劲与文件名是否正确
image.png

4.如何训练数据

4.1合并出tif尾缀文件,用于产生box文件(训练用)

image.png

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


image.png

4.1产生box文件用于训练

  • 打开cmd,切换到存放tr尾缀文件的目录
  • 执行tesseract VeriCode.font.exp1.tif VeriCode.font.exp1 batch.nochop makebox
    执行指令图:
    image.png

    结果图
    image.png

4.3 打开tr尾缀文件

image.png

4.4训练详细步骤

image.png

4.4.1修改char值

双击需要修改值的char,修改之后需要回车

4.4.2修改单个char的坐标与参数

image.png
  • 鼠标选中需要修改的char行
  • 点击character的>>
  • 鼠标选中需要修改的参数,上下方向键修改(鼠标点击变化一个数据就消失了)

4.4.3预览修改数据

  • 红色方框内的小绿色框就是设置的字符宽度,可以用于查看宽度是否合适
  • 点击不同数字,可以切换到不同的字符view页


    image.png

4.4.4字符的合并、分割、插入、删除

例如,该D字符,宽度很宽,占据多个字符位置,可以使用分割split,分割成多个再删除不需要的,或者修改宽度,再调整坐标


image.png

image.png

image.png

image.png

四、Python中使用

前面步骤全部完成,我们就可以使用pytesseract进行图片识别了

from PIL import Image
import pytesseract
import re

from selenium import webdriver
#下面两个函数用于处理图片,进行灰度处理,与降噪
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)
# 转化为灰度图
imgry = image.convert('L')
imgry.save('verification_code_grey.png')
print('未使用训练数据源处理之前:')
code=pytesseract.image_to_string('verification_code_grey.png')
print(code)
print('使用训练数据源处理之后:')
text=pytesseract.image_to_string('verification_code_grey.png',lang='VeriCode')
print('使用训练数据源处理之后:未使用正则处理')
print(text)
#正则表达式提取
print('使用训练数据源处理之后:使用正则处理')
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.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,158评论 4 370
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,600评论 1 307
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,785评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,655评论 0 220
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,075评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,002评论 1 225
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,146评论 2 318
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,918评论 0 211
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,671评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,838评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,318评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,636评论 3 263
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,343评论 3 244
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,187评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,982评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,126评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,934评论 2 279

推荐阅读更多精彩内容