案例:一二三四
五、字符验证码的逆向(???)
1、案例插曲_验证码识别ocr库
(1) 字符验证码特点
-
字符验证码 :指用数字、字母、汉字和标点符号等字符作为元素的图片验证码,主要由数字、大写字母、彩色斜线、彩色噪点和彩色背景组成,图像分为3层,最底层为背景色,字符(数字和大写字母)层在背景色之上,干扰(斜线和噪点)层则在最上面,如以下验证码; -
计算型验证码 :计算型验证码在字符验证码的基础上增加了数学运算,它也是将人类视觉和计算机视觉的差异作为区分用户的依据,如以下验证码 -
难点 :部分验证码带有彩色背景斜线、噪点、字符扭曲、角度旋转和文字重叠,图片中的字符颜色与背景颜色并没有强烈的反差 -
解决方法 :降低斜线和噪点对文字的干扰,增强背景色与字符颜色的反差,也就是对图片进行灰度处理(去掉彩色)和二值化处理(降低干扰、增强颜色反差) -
二值化处理 :其实是根据阈值调整原图的像素值,将大于阈值的像素点颜色改为白色,小于阈值的像素点改为黑色,这样就能够达到增强颜反差的目的
(1) pytesseract / tesserocr安装与使用(不推荐)
-
此类ocr识别不是很推荐,毕竟依赖了tesseract-ocr.exe,可作为了解 -
tesserocr需安装依赖tesseract-ocr.exe,可用于识别字母中文,中文需指定参数lang=‘chi_sim’ pip install tesserocr -i https://mirrors.aliyun.com/pypi/simple
-
tesserocr识别之python解析使用如下,有两种二选一 import tesserocr
code = tesserocr.file_to_text('img_3.jpg')
print(code)
import tesserocr
from PIL import Image
code = tesserocr.image_to_text(Image.open('img_3.jpg'))
print(code)
code = tesserocr.image_to_text(Image.open('img_4.jpg'), lang='chi_sim')
print(code)
-
pytesseract需安装依赖tesseract-ocr.exe,可用于识别字母中文,中文需指定参数lang=‘chi_sim’ pip install pytesseract -i https://mirrors.aliyun.com/pypi/simple
-
pytesseract识别之python解析使用如下 import pytesseract
from PIL import Image
code = pytesseract.image_to_string(Image.open('img_3.jpg'))
print(code)
code = pytesseract.image_to_string(Image.open('img_4.jpg'), lang='chi_sim')
print(code)
-
可以选择训练字体模型 : 起因:看一张原图识别如下,有部分错别字,所以我们需要训练字体进行优化,可以生成一套自己的字体
- 如何训练,点击参考这篇文章,最终将生成的zwp.traineddata文件放到tessdata下面,然后识别的时候语言选择该字体。生成box文件原文章中的改成这个
tesseract zwp.test.exp0.tif zwp.test.exp0 -l chi_sim --psm 7 batch.nochop makebox ,双击jTessBoxEditorFX的.bat文件要等几秒才出现 - 实践训练出来识别也是失败的,暂未知原因,不管了,哈哈,差不多是这么个流程。
最后不推荐这种训练,我们看下面的模块更好用
(2) muggle-ocr安装与使用(推荐)
- 官方文档https://pypi.org/project/muggle-ocr/已经下架,目前可以通过下面的方法安装;可用于识别字母数字中文
pip install muggle-ocr -i https://mirrors.aliyun.com/pypi/simple
- muggle-ocr识别之python解析使用如下
import muggle_ocr
class ImageIdentify:
@staticmethod
def muggle_identify(captcha_bytes, ocr=False):
"""
使用预置模型,预置模型包含了[ModelType.OCR, ModelType.Captcha] 两种
其中 ModelType.OCR 用于识别普通印刷文本, ModelType.Captcha 用于识别4-6位简单英数验证码
:param captcha_bytes: 验证码
:param ocr: 是否使用ocr识别
:return:
"""
if ocr:
sdk = muggle_ocr.SDK(model_type=muggle_ocr.ModelType.OCR)
else:
sdk = muggle_ocr.SDK(model_type=muggle_ocr.ModelType.Captcha)
return sdk.predict(image_bytes=captcha_bytes)
@staticmethod
def muggle_by_yaml_identify(captcha_bytes):
"""
使用自定义模型
支持基于 https://github.com/kerlomz/captcha_trainer 框架训练的模型
训练完成后,进入导出编译模型的[out]路径下, 把[graph]路径下的pb模型和[model]下的yaml配置文件放到同一路径下。
将 conf_path 参数指定为 yaml配置文件 的绝对或项目相对路径即可,其他步骤一致,如下示例:
"""
sdk = muggle_ocr.SDK(conf_path="D:\Software\python37\operation18.yaml")
text = sdk.predict(image_bytes=captcha_bytes)
return text
with open(r'./img/img_1.jpg', 'rb') as f:
print(ImageIdentify.muggle_identify(f.read(), True))
print(ImageIdentify.muggle_identify(f.read()))
print(ImageIdentify.muggle_by_yaml_identify(f.read()))
- 可以选择
训练字体模型 :
-
可查看up主视频解析讲解训练和部署,或者看文档介绍,或者看我下面简要的操作步骤,更详细的还是看上面的两个 -
使用captcha_trainer项目源码训练模型,下载源码并解压 -
然后安装一些项目环境依赖,上述下载的文件解压后可看见requirements.txt,建个虚拟环境安装进行安装依赖库pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt ,框架默认安装TensorFlow-GPU版,建议使用GPU进行训练,如需换用CPU训练则需替换 requirements.txt 文件中的tensorflow-gpu 为tensorflow,其他无需改动。 -
下载好安装包(GPU训练需要),注意下载runfile类型的安装包,deb安装会自动安装默认驱动:显卡NVIDIA 驱动下载 , CUDA 下载地址,cuDNN 下载地址(其中cuDNN需要注册NVIDIA账号且登陆,下载deb安装包)) -
准备验证码训练样本如下:验证码命名必须是验证码_MD5 的形式,如下图,修改验证码统一命名 import hashlib
import os
path = r"E:\Samples\case4\true"
filelist = os.listdir(path)
for item in filelist:
src = os.path.join(os.path.abspath(path), item)
print(src)
with open(src, "rb") as f:
_id = hashlib.md5(f.read()).hexdigest()
dst = os.path.join(os.path.abspath(path), f'{item.split(".")[0]}_{_id}.jpg')
os.rename(src, dst)
-
训练集样本数量准备注意事项:详细看这篇文章 -
然后运行当前目录下的app.py ,即可看到可视化操作界面,如何具体操作可看可查看up主视频第12分钟开始解析讲解训练和部署,以及参数设置的注意事项,点击 [Start Training] 开始训练,中途若需终止训练可点击 [Stop] 停止,若是未达到结束条件而终止任务,可以手动点击 [Compile] 编译 -
训练完成后,在该框架下projects的项目名称下的out目录里可以找到.pb和.yaml文件 ,才是将该两个文件复制到muggle_ocr相同的目录下 -
训练模型后的调用方法,将训练模型和muggle_ocr原有的模型放在同一个目录下,然后调用的时候指定conf_path即可正常调用自己的模型
(3) ddddocr安装与使用(推荐)
- ddddocr安装:识别数字、字母验证码
pip install ddddocr -i https://pypi.tuna.tsinghua.edu.cn/simple
- ddddocr识别之python解析使用如下,可选择是否使用gpu
import ddddocr
ocr = ddddocr.DdddOcr(use_gpu=False)
with open(r'./img/img_3.jpg', 'rb') as f:
print(ocr.classification(f.read()))
(4) easyocr安装与使用(推荐)
- easyocr安装:支持80多种语言的识别,据该文章介绍,精度优于PaddleOCR
pip install easyocr -i https://pypi.tuna.tsinghua.edu.cn/simple
- easyocr识别之python解析使用如下,第一次运行时加载稍长,需要在线下载检测模型和识别模型,之后就正常了,可选择是否使用gpu
reader = easyocr.Reader(['ch_sim', 'en'], gpu=False)
print(reader.readtext('./img/img_7.png', detail=0))
(5) paddleocr安装与使用(推荐)
- paddleocr安装:注意此版本为CPU版本
pip install paddlepaddle -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install shapely -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install paddleocr -i https://pypi.tuna.tsinghua.edu.cn/simple
- paddleocr识别之python解析使用如下
from paddleocr import PaddleOCR, draw_ocr
from PIL import Image
ocr = PaddleOCR(use_angle_cls=True, lang="ch")
result = ocr.ocr(captcha_path, cls=True)
for line in result:
print(line)
image = Image.open(captcha_path).convert('RGB')
boxes = [line[0] for line in result]
txts = [line[1][0] for line in result]
scores = [line[1][1] for line in result]
im_show = draw_ocr(image, boxes, txts, scores)
im_show = Image.fromarray(im_show)
im_show.show()
2、案例13_验证码去噪及识别
3、案例插曲_tensorflow与pytorch
|