Python - 通用滑块验证码识别库 Captcha-Recognizer
Python - 通用滑块验证码识别库 Captcha-Recognizer
- Captcha-Recognizer 库概述
- 使用方法
- 一、HTTP API使用:captcha-api
- 二、Python安装
- 使用示例
- V1版本
- 基于单缺口/多缺口验证码背景图识别滑块缺口
- 基于验证码截图的识别滑块缺口
- 基于验证码截图识别滑块距离
- V2 增强版
- V2 Beta 增强版使用示例
- 注意事项
- 偏移量
- 图片缩放
- 图片识别耗时
- ddddocr 和 captcha-recognizer 的优缺点分析
滑块验证码缺口位置的精准识别是验证环节的核心,本文将详细介绍一款基于深度学习实现的通用滑块验证码识别库 ——Captcha-Recognizer。该库已封装为易用的 Python 库,仅需三行代码即可完成滑块验证码缺口识别,极大降低了开发者应对滑块验证码的技术门槛。
GitHub仓库:https://github.com/chenwei-zhao/captcha-recognizer
Gitee仓库:https://gitee.com/chenwei-zhaozhao/captcha-recognizer
注:实测比DdddOcr效果好一些,但不绝对,需根据不同场景选择合适的识别工具。
Captcha-Recognizer 库概述
Captcha-Recognizer 是一款易用的通用滑块验证码识别库,通过深度学习训练通用的缺口检测模型,依托训练结果能够精准识别出验证码中的滑块缺口位置,并返回缺口的坐标与可信度。
支持的验证码类型:
- 单缺口验证码背景图
- 多缺口验证码背景图
- 验证码截图(包含滑块和背景图)
以下为三种类型验证码的示例图:
![]() 单缺口验证码背景图 | ![]() 多缺口验证码背景图 | ![]() 验证码截图(包含滑块和背景图) |
使用方法
一、HTTP API使用:captcha-api
该库提供了基于 Vue + FastAPI 搭建的验证码识别演示平台,相关资源可参考验证码识别库:Captcha Recognizer,适用于需要通过 API 接口调用验证码识别功能的场景。
二、Python安装
通过 Python 的包管理工具 pip 即可轻松安装 Captcha-Recognizer 库,命令如下:
pip install captcha-recognizer
使用示例
V1版本
基于单缺口/多缺口验证码背景图识别滑块缺口
from captcha_recognizer.recognizer import Recognizer# source传入图片路径支持 Union[str, Path, bytes, np.ndarray]
# verbose=False表示关闭冗余输出
# show_result 为True展示识别效果图 (生产环境请设置show_result=False)
# save 为True保存识别结果图 (生产环境请设置save=False)
# is_single 默认为False表示支持多缺口背景图识别,is_single=True表示仅支持单缺口背景图识别(指定is_single为True时,对单缺口背景图识别准确度更高)recognizer = Recognizer()
box, confidence = recognizer.identify_gap(source='your_example_image.png')print(f'缺口坐标: {box}')
print(f'可信度: {confidence}')"""
打印结果如下:
缺口方框坐标: [331.72052001953125, 55.96122741699219, 422.079345703125, 161.7498779296875]
可信度: 0.9513089656829834坐标原点:图片左上角
缺口方框坐标为缺口方框左上角和右下角距离坐标原点的距离
"""
示例图
包括且不限于以下类型、尺寸的滑块图片检测
![]() 示例图 1 | ![]() 识别效果示例图1 |
![]() 示例图 2 | ![]() 识别效果示例图 2 |
![]() 示例图 3 | ![]() 识别效果示例图 3 |
基于验证码截图的识别滑块缺口
from captcha_recognizer.recognizer import Recognizer# source传入图片路径,支持 Union[str, Path, bytes, np.ndarray]
# verbose=False表示关闭冗余输出
# show_result 为True展示识别效果图 (生产环境请设置show_result=False)
# save 为True保存识别结果图 (生产环境请设置save=False)ecognizer = Recognizer()
box, confidence = recognizer.identify_screenshot(source='your_example_image.png')print(f'缺口坐标: {box}')
print(f'可信度: {confidence}')"""
打印结果如下:
缺口方框坐标: [331.72052001953125, 55.96122741699219, 422.079345703125, 161.7498779296875]
可信度: 0.9513089656829834坐标原点:图片左上角
缺口方框坐标为缺口方框左上角和右下角距离坐标原点的距离
"""
![]() 示例图 1 | ![]() 识别效果示例图1 |
基于验证码截图识别滑块距离
from captcha_recognizer.recognizer import Recognizer# source传入图片路径或图片对象,支持Union[str, Path, bytes, np.ndarray]
# verbose=False表示关闭冗余输出
# show_result 为True展示识别效果图 (生产环境请设置show_result=False)
# save 为True保存识别结果图 (生产环境请设置save=False)recognizer = Recognizer()
distance = recognizer.identify_distance_by_screenshot(source='your_screenshot.jpg')print('滑块距离', distance)
V2 增强版
V2增强版,增强了对多缺口复杂验证码的识别效果
V2支持以下类型验证码的识别
- 单缺口验证码背景图(不含滑块的背景图)
- 多缺口验证码截图或合成图(含滑块和背景图)
V2 Beta 增强版使用示例
首先需升级库至最新版本,命令如下:
pip install captcha-recognizer --upgrade
# V2增强版
from captcha_recognizer.slider import SliderV2box, confidence = SliderV2().identify(source=f'images_example/example8.png', show=True)
print(f'缺口坐标: {box}')
print('置信度', confidence)
注意事项
偏移量
部分滑块验证码的滑块初始位置存在一定偏移,以如下示例图为例:
在示例图中:
- 第一条黑线位置为滑块初始位置,距离图片边框约 8 个像素的偏移量(offset 为 8)。
- 识别结果的缺口坐标为 [x1, y1, x2, y2],对应缺口的左上角和右下角坐标(坐标原点为图片左上角)。
- 第二条黑线的 X 轴坐标值对应缺口识别结果左上角的 X 轴坐标值,此处为 154(x1 为 154)。
- 因此,实际滑块的距离为 x1 - offset(即 154 - 8 = 146),也就是说实际滑块距离为缺口的 x1 值减去滑块距离图片边框的偏移量 (offset)。
图片缩放
部分验证码在前端渲染时会对图片进行缩放,此时实际的滑块距离需按照图片缩放比例进行计算,以确保滑块移动距离的准确性,示例图如下:
图片识别耗时
- 首次识别图片耗时较长(约 2 秒),后续单张图片的识别耗时约为 60 毫秒(60 毫秒)。
- 造成首次识别耗时较长的原因是,首次识别时需要将模型从磁盘加载到内存中,并完成权重加载、内存分配等一系列初始化工作,该过程相对耗时。
- 一旦模型加载完成并初始化好,后续的图片预测可直接利用已加载的模型和分配好的资源,从而避免重复加载和初始化的开销,大幅缩短识别耗时。
ddddocr 和 captcha-recognizer 的优缺点分析
以下是ddddocr和captcha-recognizer的优缺点分析:
- ddddocr
- 优点:
- 简单易用:安装方便,只需几行代码即可实现验证码识别功能,对于开发者来说上手难度低。
- 支持多种类型:可识别数字、字母、中文等多种类型的验证码,还能处理一些简单的滑块验证码。
- 速度较快:在CPU环境下单字符识别耗时仅8ms,能够满足一些对识别速度有要求的场景。
- 轻量级模型:基于CNN的轻量级模型,大小小于15MB,占用资源少,易于集成到各种项目中。
- 开源免费:项目完全开源,开发者可以免费使用,降低了开发成本。
- 缺点:
- 准确率有限:对于一些复杂的验证码,可能会出现误识别或无法识别的情况,准确率不是特别高。
- 特殊字体识别效果差:遇到一些特殊字体的验证码,识别率可能会受到影响。
- 依赖数据训练:其识别效果依赖于训练数据,对于一些新出现的或与训练数据差异较大的验证码类型,识别效果可能不佳。
- 内存占用较大:在一些小内存机器上运行可能会存在问题,且识别速度跟机器性能关系很大,CPU性能不佳时速度会较慢。
- 优点:
- captcha-recognizer
- 优点:
- 适应复杂场景:基于YOLOv8的轻量化缺口检测模型,能够支持多缺口、旋转干扰、背景噪声等复杂场景下的验证码识别。
- Python原生API:提供Python原生API,对于Python开发者来说,集成非常方便,几乎没有门槛。
- 模型轻量化:基于YOLOv8的轻量化模型,在保证一定准确率的同时,对计算资源的需求相对较低,能够在多种设备上运行。
- 缺点:
- 功能相对单一:主要专注于滑块验证码等特定类型的验证码识别,对于其他类型的验证码,如数字、字母、中文混合的普通字符验证码,可能不如专门的OCR工具如ddddocr支持得好。
- 准确率受场景限制:虽然能处理复杂场景,但在一些极端复杂或特殊的情况下,其识别准确率可能也会受到影响。
- 依赖特定模型:其性能和效果依赖于YOLOv8模型的性能和训练情况,如果模型本身存在局限性,可能会影响整体的识别效果。
- 优点: