目录
案例:一二三四
五、字符验证码的逆向(⭐⭐⭐)
1、案例插曲_验证码识别ocr库
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/simpletesserocr识别之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/simplepytesseract识别之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文件要等几秒才出现 - 实践训练出来识别也是失败的,暂未知原因,不管了,哈哈,差不多是这么个流程。
最后不推荐这种训练,我们看下面的模块更好用


- 如何训练,点击参考这篇文章,最终将生成的zwp.traineddata文件放到tessdata下面,然后识别的时候语言选择该字体。生成box文件原文章中的改成这个
(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() with open(r'./img/img_3.jpg', 'rb') as f: print(ocr.classification(f.read())) - ddddocr识别之目标检测
import ddddocr ocr = ddddocr.DdddOcr(det=True, show_ad=False) word_ocr = ddddocr.DdddOcr(show_ad=False) with open(r'./image/8320423853e84b499be0b81d40c7f259.jpg', 'rb') as f: content = f.read() xy_list = ocr.detection(content) img = Image.open(BytesIO(content)) draw = ImageDraw.Draw(img) words = [] for row in xy_list: # 框字 x1, y1, x2, y2 = row draw.line(([(x1, y1), (x1, y2), (x2, y2), (x2, y1), (x1, y1)]), width=1, fill="red") # 裁剪出单个字 corp = img.crop(row) img_byte = BytesIO() corp.save(img_byte, 'png') # 识别出单个字 word = word_ocr.classification(img_byte.getvalue()) words.append(word) img.show() print(dict(zip(words, xy_list)))
(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) # need to run only once to load model into memory 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_验证码去噪及识别
① 对图片验证码降噪、二值化,适用于提取字段颜色与背景颜色完全相同的验证码,效果如下

② 9领域法,以一点为中心, 即数字九宫格键,去除周边黑点小于阈值的噪点,效果如下

3、案例插曲_tensorflow与pytorch
- 还没学,后面再补上