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安装

  1. 下载安装包:

    • NVIDIA驱动:https://www.geforce.cn/drivers
    • CUDA:https://developer.nvidia.com/cuda-downloads
    • cuDNN:https://developer.nvidia.com/cudnn (需注册账号)
  2. 关闭图形界面:

    sudo service lightdm stop
    
  3. 安装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
    
  4. 安装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
    
  5. 配置环境变量(~/.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 关键配置参数说明

  1. CharSet:支持多种预设字符集或自定义

    • 预设选项:ALPHANUMERIC, ALPHANUMERIC_LOWER, ALPHANUMERIC_UPPER, NUMERIC, ALPHABET_LOWER, ALPHABET_UPPER, ALPHABET
    • 自定义示例:['常', '世', '宁', '慢', '南', '制', '根', '难']
  2. 神经网络选择

    • CNNNetwork: [CNN5, DenseNet]
    • RecurrentNetwork: [BLSTM, LSTM]
    • 推荐配置:CNN5+BLSTM 或 DenseNet+BLSTM
  3. 训练参数

    • EndAcc: 训练达到此准确率时停止
    • EndEpochs: 训练达到此周期数时停止
    • BatchSize: 训练批次大小
    • LearningRate: 初始学习率

四、训练流程

4.1 准备训练集

  • 训练集路径支持多个路径列表
  • 可使用make_dataset.py将训练集打包为tfrecords格式提高读取效率

4.2 启动训练

python3 trains.py

4.3 训练输出

训练完成后会在out路径下生成:

  • .pb模型文件
  • .yaml配置文件

五、部署方案

5.1 部署项目特性

  1. 多模型热拔插管理
  2. 灵活的版本控制
  3. 批量识别支持
  4. 服务智能路由策略

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)

六、高级技巧

  1. 多颜色验证码识别

    • 不同颜色分别训练模型
    • 调用时通过参数指定颜色模型
    • 或采用颜色提取算法减少样本需求
  2. 样本生成

    • 对于开源验证码系统,可编写生成代码无限生成训练样本
    • 示例项目:https://www.jianshu.com/p/da1b972e24f2
  3. 双输出网络

    • 修改网络最后一层为双输出
    • 同时预测字符和对应颜色
    • 需要更多标注数据

七、注意事项

  1. 本项目仅供学习和交流使用,不得用于非法用途
  2. 中文字符集训练需要更多样本和更长时间
  3. 不同颜色验证码识别需要分别训练模型
  4. 实际部署推荐使用CPU版TensorFlow

八、相关资源

  1. 项目源码:

    • 训练项目: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
  2. 示例训练集:QQ群857149419共享

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安装 虚拟环境配置 Ubuntu 16.04下CUDA/cuDNN安装 下载安装包: NVIDIA驱动:https://www.geforce.cn/drivers CUDA:https://developer.nvidia.com/cuda-downloads cuDNN:https://developer.nvidia.com/cudnn (需注册账号) 关闭图形界面: 安装Nvidia驱动: 安装CUDA: 配置环境变量(~/.bashrc): 三、项目配置 3.1 配置文件说明 config.yaml (系统配置) model.yaml (模型配置) 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 启动训练 4.3 训练输出 训练完成后会在 out 路径下生成: .pb 模型文件 .yaml 配置文件 五、部署方案 5.1 部署项目特性 多模型热拔插管理 灵活的版本控制 批量识别支持 服务智能路由策略 5.2 服务启动方式 Linux: Tornado (端口19952): Flask: Sanic (端口19953): gRPC (端口50054): Windows: 所有服务都通过 python3 xxx_server.py 启动 5.3 API调用说明 Flask/Tornado/Sanic服务 请求地址: http://localhost:<端口>/captcha/v1 Content-Type: application/json 请求方法: POST 请求参数: 返回结果: gRPC服务 六、高级技巧 多颜色验证码识别 : 不同颜色分别训练模型 调用时通过参数指定颜色模型 或采用颜色提取算法减少样本需求 样本生成 : 对于开源验证码系统,可编写生成代码无限生成训练样本 示例项目: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共享