CNN+BLSTM+CTC的验证码识别从训练到部署
字数 3054 2025-08-18 11:37:57
CNN+BLSTM+CTC验证码识别从训练到部署完整指南
一、项目概述
本项目使用CNN+BLSTM+CTC深度学习架构实现端到端的不定长验证码识别,支持多种网络结构组合:
| 网格结构 | predict-CPU | predict-GPU | 模型大小 |
|---|---|---|---|
| CNN5+Bi-LSTM+H64+CTC | 15ms | 28ms | 2mb |
| CNN5+Bi-LSTM+H16+CTC | 8ms | 28ms | 1.5mb |
| DenseNet+Bi-LSTM+H64+CTC | 60ms | 60ms | 6.5mb |
注:H16/H64指Bi-LSTM的隐藏神经元个数(num_units)
二、环境配置
2.1 系统要求
| 操作系统 | 最低支持版本 |
|---|---|
| Ubuntu | 16.04 |
| Windows | 7 SP1 |
| MacOS | N/A |
2.2 Python环境依赖
| 依赖 | 最低支持版本 |
|---|---|
| Python | 3.6 |
| TensorFlow-GPU | 1.6.0 |
| Opencv-Python | 3.3.0.10 |
| Numpy | 1.14.1 |
| Pillow | 4.3.0 |
| PyYaml | 3.13 |
2.3 CUDA/cuDNN版本对应表
Linux版本对应
| TensorFlow版本 | Python版本 | 编译器 | 构建工具 | cuDNN | CUDA |
|---|---|---|---|---|---|
| tensorflow_gpu-1.12.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.15.0 | 7 | 9 |
| tensorflow_gpu-1.11.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.15.0 | 7 | 9 |
| tensorflow_gpu-1.10.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.15.0 | 7 | 9 |
Windows版本对应
| TensorFlow版本 | Python版本 | 编译器 | 构建工具 | cuDNN | CUDA |
|---|---|---|---|---|---|
| tensorflow_gpu-1.12.0 | 3.5-3.6 | MSVC 2015 update 3 | Bazel 0.15.0 | 7 | 9 |
| tensorflow_gpu-1.11.0 | 3.5-3.6 | MSVC 2015 update 3 | Bazel 0.15.0 | 7 | 9 |
| tensorflow_gpu-1.10.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 | 7 | 9 |
2.4 环境安装指南
Ubuntu 16.04下Python 3.6安装
sudo apt-get install openssl
sudo apt-get install libssl-dev
sudo apt-get install libc6-dev gcc
sudo apt-get install -y make build-essential zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm tk-dev
wget https://www.python.org/ftp/python/3.6.6/Python-3.6.6.tgz
tar -vxf Python-3.6.6.tar.xz
cd Python-3.6.6
./configure --prefix=/usr/local --enable-shared
make -j8
sudo make install -j8
虚拟环境配置
virtualenv -p /usr/bin/python3 venv
cd venv/
source bin/activate
cd captcha_trainer
pip3 install -r requirements.txt
Ubuntu 16.04下CUDA/cuDNN安装
-
下载安装包:
- NVIDIA驱动:https://www.geforce.cn/drivers
- CUDA:https://developer.nvidia.com/cuda-downloads
- cuDNN:https://developer.nvidia.com/cudnn (需注册账号)
-
关闭图形界面:
sudo service lightdm stop -
安装Nvidia驱动:
sudo chmod a+x NVIDIA-Linux-x86_64-384.90.run sudo ./NVIDIA-Linux-x86_64-384.90.run –no-x-check –no-nouveau-check –no-opengl-files -
安装CUDA:
sudo apt-get install freeglut3-dev build-essential libx11-dev libxmu-dev libxi-dev libgl1-mesa-glx libglu1-mesa libglu1-mesa-dev sudo sh cuda_9.0.176_384.81_linux.run -
配置环境变量(~/.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}} sudo ldconfig
三、项目配置
3.1 配置文件说明
config.yaml (系统配置)
System:
DeviceUsage: 0.7
TrainsPath: 'E:\Task\Trains\YourModelName\'
TrainRegex:
TestPath: 'E:\Task\TestGroup\YourModelName\'
TestRegex:
TestSetNum: 1000
NeuralNet:
CNNNetwork: CNN5
RecurrentNetwork: BLSTM
HiddenNum: 64
KeepProb: 0.98
Trains:
SavedSteps: 100
ValidationSteps: 500
EndAcc: 0.975
EndEpochs: 1
BatchSize: 64
TestBatchSize: 400
LearningRate: 0.01
DecayRate: 0.98
DecaySteps: 10000
model.yaml (模型配置)
Model:
Sites: []
ModelName: YourModelName-CNN5-H64-150x50
ModelType: 150x50
CharSet: ALPHANUMERIC_LOWER
CharExclude: []
CharReplace: {}
ImageWidth: 150
ImageHeight: 50
Pretreatment:
Binaryzation: -1
Smoothing: -1
Blur: -1
3.2 关键配置参数说明
-
CharSet:支持多种预设字符集或自定义
- 预设选项:ALPHANUMERIC, ALPHANUMERIC_LOWER, ALPHANUMERIC_UPPER, NUMERIC, ALPHABET_LOWER, ALPHABET_UPPER, ALPHABET
- 自定义示例:
['常', '世', '宁', '慢', '南', '制', '根', '难']
-
神经网络选择:
- CNNNetwork: [CNN5, DenseNet]
- RecurrentNetwork: [BLSTM, LSTM]
- 推荐配置:CNN5+BLSTM 或 DenseNet+BLSTM
-
训练参数:
- EndAcc: 训练达到此准确率时停止
- EndEpochs: 训练达到此周期数时停止
- BatchSize: 训练批次大小
- LearningRate: 初始学习率
四、训练流程
4.1 准备训练集
- 训练集路径支持多个路径列表
- 可使用
make_dataset.py将训练集打包为tfrecords格式提高读取效率
4.2 启动训练
python3 trains.py
4.3 训练输出
训练完成后会在out路径下生成:
.pb模型文件.yaml配置文件
五、部署方案
5.1 部署项目特性
- 多模型热拔插管理
- 灵活的版本控制
- 批量识别支持
- 服务智能路由策略
5.2 服务启动方式
Linux:
-
Tornado (端口19952):
python3 tornado_server.py -
Flask:
# 方案1: 直接启动 (端口19951) python flask_server.py # 方案2: 使用gunicorn (端口5000) pip install gunicorn gunicorn -c deploy.conf.py flask_server:app -
Sanic (端口19953):
python3 sanic_server.py -
gRPC (端口50054):
python3 grpc_server.py
Windows:
所有服务都通过python3 xxx_server.py启动
5.3 API调用说明
Flask/Tornado/Sanic服务
- 请求地址:
http://localhost:<端口>/captcha/v1 - Content-Type:
application/json - 请求方法:
POST - 请求参数:
{ "image": "base64编码后的图像二进制流", "model_site": "网站名(可选)", "model_type": "类别(可选)" } - 返回结果:
{ "message": "识别结果或错误消息", "code": "状态码", "success": "是否请求成功" }
gRPC服务
class GoogleRPC(object):
def __init__(self, host: str):
self._url = '{}:50054'.format(host)
self.true_count = 0
self.total_count = 0
def request(self, image, model_type=None, model_site=None):
import grpc
import grpc_pb2
import grpc_pb2_grpc
channel = grpc.insecure_channel(self._url)
stub = grpc_pb2_grpc.PredictStub(channel)
response = stub.predict(grpc_pb2.PredictRequest(
image=image,
split_char=',',
model_type=model_type,
model_site=model_site
))
return {"message": response.result, "code": response.code, "success": response.success}
if __name__ == '__main__':
result = GoogleRPC().request("base64编码后的图片二进制流")
print(result)
六、高级技巧
-
多颜色验证码识别:
- 不同颜色分别训练模型
- 调用时通过参数指定颜色模型
- 或采用颜色提取算法减少样本需求
-
样本生成:
- 对于开源验证码系统,可编写生成代码无限生成训练样本
- 示例项目:https://www.jianshu.com/p/da1b972e24f2
-
双输出网络:
- 修改网络最后一层为双输出
- 同时预测字符和对应颜色
- 需要更多标注数据
七、注意事项
- 本项目仅供学习和交流使用,不得用于非法用途
- 中文字符集训练需要更多样本和更长时间
- 不同颜色验证码识别需要分别训练模型
- 实际部署推荐使用CPU版TensorFlow
八、相关资源
-
项目源码:
- 训练项目:https://github.com/kerlomz/captcha_trainer
- 部署项目:https://github.com/kerlomz/captcha_platform
- C语言DLL调用:https://github.com/kerlomz/captcha_library_c
- C#调用示例:https://github.com/kerlomz/captcha_demo_csharp
-
示例训练集:QQ群857149419共享