验证码识别新革命:源码+通用识别模型
字数 2752 2025-08-15 21:31:29

验证码识别系统全面教学文档

一、项目概述

本项目提供了一套完整的验证码识别解决方案,包括训练框架(captcha_trainer)和部署平台(captcha_platform),以及一个简易的MuggleOCR SDK。系统采用CNN+RNN+CTC(CRNN)架构进行端到端的不定长验证码识别,支持多种网络结构切换,具有以下特点:

  • 企业级生产水准,识别率高(简单验证码可达99%)
  • CPU部署即可,单次识别平均12ms(腾讯云1核1G机器)
  • 操作简单,无需编码基础即可训练模型
  • 支持模型热拔插和多模型动态部署
  • 提供编译版,免去环境配置烦恼

二、核心组件

1. MuggleOCR SDK

  • 体积仅6MB,内置两个通用模型:
    • 简单通用验证码模型(识别率95%+)
    • 普通OCR模型
  • 三行代码即可调用:
with open(r"1.png", "rb") as f:
    img_bytes = f.read()
import muggle_ocr
sdk = muggle_ocr.SDK(model_type=muggle_ocr.ModelType.Captcha)
text = sdk.predict(image_bytes=img_bytes)

2. 训练框架(captcha_trainer)

  • 支持网络结构:
    • CNN5/CNNX(专为验证码优化)
    • MobileNet/DenseNet121/ResNet50
    • Bi-LSTM/GRU+CTC/CrossEntropy
  • 性能指标:
    • CNN5+Bi-LSTM+H64+CTC: CPU 5-10ms, GPU 1-2ms, 模型2MB
    • CNN5+CrossEntropy: CPU 2-8ms, GPU 0-1ms, 模型1.5MB

3. 部署平台(captcha_platform)

  • 支持多种后端:
    • Tornado(推荐,最稳定)
    • Flask
    • Sanic
    • gRPC(性能优越)
  • 特性:
    • 多模型部署
    • 模型热拔插
    • 版本控制
    • 批量识别
    • 智能模型分发

三、环境配置

1. 系统要求

  • 操作系统:
    • Ubuntu 16.04+
    • Windows 7 SP1+
    • MacOS

2. Python环境

  • Python 3.7+
  • 核心依赖:
    • TensorFlow-GPU 1.15.0(暂不支持2.0+)
    • OpenCV-Python 4.2.0.34
    • Numpy 1.18.4+
    • Pillow 7.1.2+

推荐使用虚拟环境:

virtualenv -p /usr/bin/python3 venv
source venv/bin/activate
pip install -r requirements.txt

3. CUDA/cuDNN配置

Ubuntu 16.04:

  1. 下载runfile格式的驱动和CUDA 9.0
  2. 关闭图形界面:sudo service lightdm stop
  3. 安装驱动:
sudo chmod a+x NVIDIA-Linux-x86_64-*.run
sudo ./NVIDIA-Linux-x86_64-*.run --no-x-check --no-nouveau-check --no-opengl-files
  1. 安装CUDA:
sudo sh cuda_9.0.176_384.81_linux.run
  1. 配置环境变量(~/.bashrc):
export PATH=/usr/local/cuda-9.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-9.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

Windows:

  • 安装CUDA 10.0,不安装驱动和VS组件
  • 下载对应cuDNN替换到CUDA安装目录

四、训练配置

1. 样本准备

  • 命名格式:标签_随机数.png (如:AB12_123456789.png)
  • 样本量建议:
    • 简单特征(1-2种干扰):几百-几千
    • 复杂特征(3种+干扰):几万-几十万
    • 中文验证码:10w+起步

2. 配置文件关键参数

神经网络区:

  • ModelName: 项目名称
  • Network: 网络选择(CNNX/ResNet50等)
  • Decoder: 解码器类型(CTC/CrossEntropy)
  • NeuronNum: RNN隐藏神经元数量(如64)

样本源配置区:

  • TrainPath: 训练样本路径
  • ValidationPath: 验证样本路径(可选)
  • ValidationSetNum: 验证集数量(默认300)

训练配置区:

  • TestNum: 测试数量
  • BatchSize: 批次大小
  • LearningRate: 学习率
  • Epochs: 训练轮次

高级配置:

  • Category: 字符集定义
    • 默认:ALPHANUMERIC_LOWER(不区分大小写)
    • 自定义:['你','好','世','界']
  • ImageWidth/Height: 图片尺寸
  • Pretreatment: 预处理方法
    • ConcatFrames: GIF帧拼接
    • BlendFrames: GIF帧融合

3. 训练流程

  1. 配置神经网络参数
  2. 设置项目名称
  3. 指定样本路径
  4. 配置训练参数
  5. 点击"Make Dataset"打包样本
  6. 点击"Start Training"开始训练

4. 样本复杂度评估

影响样本量的特征复杂度指标:

  1. 变形程度
  2. 旋转角度
  3. 模糊程度
  4. 背景干扰
  5. 前景干扰
  6. 字体种类
  7. 验证码位数
  8. 字符集大小

五、模型部署

1. 服务部署方式

Linux:

# Tornado(端口19952)
python3 tornado_server.py

# Flask(端口19951)
python flask_server.py
# 或使用gunicorn:
gunicorn -c deploy.conf.py flask_server:app

# Sanic(端口19953)
python3 sanic_server.py

# gRPC(端口50054)
python3 grpc_server.py

# 编译版
./captcha_platform_tornado

Windows:

直接运行对应server.py文件

2. API调用示例

Tornado/Flask/Sanic:

  • 请求URL: http://127.0.0.1:端口/captcha/v1
  • 方法: POST
  • Content-Type: application/json
  • 请求体:
{
    "image": "iVBORw0KGgoAAAAN...base64编码图像",
    "model_name": "可选模型名",
    "output_split": "多标签分隔符"
}
  • 响应:
{
    "message": "识别结果",
    "code": 0,
    "success": true,
    "uid": "请求ID"
}

gRPC调用:

from grpc_pb2 import PredictRequest
from grpc_pb2_grpc import PredictStub

channel = grpc.insecure_channel('localhost:50054')
stub = PredictStub(channel)
response = stub.predict(PredictRequest(
    image=base64_image,
    split_char=',',
    model_type='model_name'
))

3. 模型管理

  1. 添加模型:
    • 将pb模型放入graph路径
    • 将yaml配置放入model路径
  2. 卸载模型:
    • 删除对应的yaml和pb文件
  3. 更新模型:
    • 先放新pb模型,再放新yaml配置

六、高级技巧

1. 批量识别配置

通过FieldParam/CorpParams参数实现图片切割批量识别:

FieldParam:
  CorpParams:
    - start_pos: [118, 0]  # 起始坐标
      interval_size: [0, 0] # 间隔
      corp_num: [1, 1]      # 切割数量
      corp_size: [60, 30]   # 切割尺寸
    - start_pos: [5, 40]
      interval_size: [5, 5]
      corp_num: [4, 2]
      corp_size: [66, 66]
  OutputCoord: True

2. 彩色验证码处理方案

  1. 颜色提取法

    • 使用HSV/K-means聚类分离颜色
    • 弊端:特征丢失,识别率瓶颈约90%
  2. 不分离颜色方案

    • 方案1:同时预测颜色和内容(成本高,需人工标注)
    • 方案2:每种颜色单独训练模型(成本中等)
    • 方案3:所有颜色转换为一种颜色(最佳方案)
      • 将不同颜色通过算法统一为一种颜色
      • 样本成本最低,识别率98%+
      • CPU识别时间5-8ms,模型大小3MB

七、资源链接

  1. 训练项目源码: https://github.com/kerlomz/captcha_trainer
  2. 部署项目源码: https://github.com/kerlomz/captcha_platform
  3. MuggleOCR PyPI: https://pypi.org/project/muggle-ocr
  4. 示例数据集: https://share.weiyun.com/5pzGF4V

八、注意事项

  1. Windows服务器版使用编译版闪退时:

    • 通过CMD运行查看报错
    • 如报错cv2 ImportError: Dll load failed
      1. 进入"我的电脑"-"属性"-"管理"
      2. "添加角色和功能"
      3. 勾选"桌面体验"并安装
      4. 重启系统
  2. 样本命名规范:

    • 单标签:标签_随机数.png (如:飞机_0123456789012.png)
    • 多标签:标签1&标签2&标签3_随机数.png (如:飞机&鞋子&水杯_1231290424123.png)
  3. 样本量最低要求:

    • 不得少于一个Batch Size
    • 建议至少满足1000+样本量
验证码识别系统全面教学文档 一、项目概述 本项目提供了一套完整的验证码识别解决方案,包括训练框架(captcha_ trainer)和部署平台(captcha_ platform),以及一个简易的MuggleOCR SDK。系统采用CNN+RNN+CTC(CRNN)架构进行端到端的不定长验证码识别,支持多种网络结构切换,具有以下特点: 企业级生产水准,识别率高(简单验证码可达99%) CPU部署即可,单次识别平均12ms(腾讯云1核1G机器) 操作简单,无需编码基础即可训练模型 支持模型热拔插和多模型动态部署 提供编译版,免去环境配置烦恼 二、核心组件 1. MuggleOCR SDK 体积仅6MB,内置两个通用模型: 简单通用验证码模型(识别率95%+) 普通OCR模型 三行代码即可调用: 2. 训练框架(captcha_ trainer) 支持网络结构: CNN5/CNNX(专为验证码优化) MobileNet/DenseNet121/ResNet50 Bi-LSTM/GRU+CTC/CrossEntropy 性能指标: CNN5+Bi-LSTM+H64+CTC: CPU 5-10ms, GPU 1-2ms, 模型2MB CNN5+CrossEntropy: CPU 2-8ms, GPU 0-1ms, 模型1.5MB 3. 部署平台(captcha_ platform) 支持多种后端: Tornado(推荐,最稳定) Flask Sanic gRPC(性能优越) 特性: 多模型部署 模型热拔插 版本控制 批量识别 智能模型分发 三、环境配置 1. 系统要求 操作系统: Ubuntu 16.04+ Windows 7 SP1+ MacOS 2. Python环境 Python 3.7+ 核心依赖: TensorFlow-GPU 1.15.0(暂不支持2.0+) OpenCV-Python 4.2.0.34 Numpy 1.18.4+ Pillow 7.1.2+ 推荐使用虚拟环境: 3. CUDA/cuDNN配置 Ubuntu 16.04: 下载runfile格式的驱动和CUDA 9.0 关闭图形界面: sudo service lightdm stop 安装驱动: 安装CUDA: 配置环境变量(~/.bashrc): Windows: 安装CUDA 10.0,不安装驱动和VS组件 下载对应cuDNN替换到CUDA安装目录 四、训练配置 1. 样本准备 命名格式: 标签_随机数.png (如: AB12_123456789.png ) 样本量建议: 简单特征(1-2种干扰):几百-几千 复杂特征(3种+干扰):几万-几十万 中文验证码:10w+起步 2. 配置文件关键参数 神经网络区: ModelName : 项目名称 Network : 网络选择(CNNX/ResNet50等) Decoder : 解码器类型(CTC/CrossEntropy) NeuronNum : RNN隐藏神经元数量(如64) 样本源配置区: TrainPath : 训练样本路径 ValidationPath : 验证样本路径(可选) ValidationSetNum : 验证集数量(默认300) 训练配置区: TestNum : 测试数量 BatchSize : 批次大小 LearningRate : 学习率 Epochs : 训练轮次 高级配置: Category : 字符集定义 默认: ALPHANUMERIC_LOWER (不区分大小写) 自定义: ['你','好','世','界'] ImageWidth/Height : 图片尺寸 Pretreatment : 预处理方法 ConcatFrames : GIF帧拼接 BlendFrames : GIF帧融合 3. 训练流程 配置神经网络参数 设置项目名称 指定样本路径 配置训练参数 点击"Make Dataset"打包样本 点击"Start Training"开始训练 4. 样本复杂度评估 影响样本量的特征复杂度指标: 变形程度 旋转角度 模糊程度 背景干扰 前景干扰 字体种类 验证码位数 字符集大小 五、模型部署 1. 服务部署方式 Linux: Windows: 直接运行对应server.py文件 2. API调用示例 Tornado/Flask/Sanic: 请求URL: http://127.0.0.1:端口/captcha/v1 方法: POST Content-Type: application/json 请求体: 响应: gRPC调用: 3. 模型管理 添加模型: 将pb模型放入 graph 路径 将yaml配置放入 model 路径 卸载模型: 删除对应的yaml和pb文件 更新模型: 先放新pb模型,再放新yaml配置 六、高级技巧 1. 批量识别配置 通过 FieldParam/CorpParams 参数实现图片切割批量识别: 2. 彩色验证码处理方案 颜色提取法 : 使用HSV/K-means聚类分离颜色 弊端:特征丢失,识别率瓶颈约90% 不分离颜色方案 : 方案1:同时预测颜色和内容(成本高,需人工标注) 方案2:每种颜色单独训练模型(成本中等) 方案3:所有颜色转换为一种颜色(最佳方案) 将不同颜色通过算法统一为一种颜色 样本成本最低,识别率98%+ CPU识别时间5-8ms,模型大小3MB 七、资源链接 训练项目源码: https://github.com/kerlomz/captcha_ trainer 部署项目源码: https://github.com/kerlomz/captcha_ platform MuggleOCR PyPI: https://pypi.org/project/muggle-ocr 示例数据集: https://share.weiyun.com/5pzGF4V 八、注意事项 Windows服务器版使用编译版闪退时: 通过CMD运行查看报错 如报错 cv2 ImportError: Dll load failed : 进入"我的电脑"-"属性"-"管理" "添加角色和功能" 勾选"桌面体验"并安装 重启系统 样本命名规范: 单标签: 标签_随机数.png (如: 飞机_0123456789012.png ) 多标签: 标签1&标签2&标签3_随机数.png (如: 飞机&鞋子&水杯_1231290424123.png ) 样本量最低要求: 不得少于一个Batch Size 建议至少满足1000+样本量