captcha_trainer 验证码识别-训练 使用记录

在爬数据的时候,网站出现了验证码,那么我们就得去识别验证码了。目前有两种方案

  1. 接入打码平台(花钱,慢)
  2. 自己训练(费时,需要GPU环境,快)

那么我采用的是使用开源训练框架 https://github.com/kerlomz/captcha_trainer

训练集准备

图片示例:

  1. 请求网站验证码具体接口,训练集(2w张) 测试集(1k张)
  2. 从打码平台进行标注
  3. 提交验证码给网站 检测 打码平台正确性
  4. 保存验证码图片格式为 {结果}_{md5(文件)}.jpg
  5. 打包训练集 测试集

    在projects/项目名/model.yaml 文件中配置训练集位置
Trains:
DatasetPath:
Training:
# 训练集打包结果路径
- ./projects/wacai-model-CNN5-GRU-H64-CTC-C1/dataset/Trains.0.tfrecords
Validation:
# 测试集打包结果路径
- ./projects/wacai-model-CNN5-GRU-H64-CTC-C1/dataset/Validation.0.tfrecords
SourcePath:
Training:
# 训练集图片路径
- D:/PyCode/XiaoXiangDemo/APPCheck/WaCaiCaptchaTraining/images
Validation:
# 测试集图片路径
- D:/PyCode/XiaoXiangDemo/APPCheck/WaCaiCaptchaTraining/images2

最后在项目主目录下 运行 python make_dataset.py 项目名 方式打包

设置训练配置

根据项目作者的参数说明,配置了符合我自己项目的要求

# - requirement.txt  -  GPU: tensorflow-gpu, CPU: tensorflow
# - If you use the GPU version, you need to install some additional applications.
# MemoryUsage: 显存占用率,推荐0.6-0.8之间
System:
MemoryUsage: {MemoryUsage}
Version: 2 # CNNNetwork: [CNN5, ResNet50, DenseNet]
# RecurrentNetwork: [CuDNNBiLSTM, CuDNNLSTM, CuDNNGRU, BiLSTM, LSTM, GRU, BiGRU, NoRecurrent]
# - 推荐配置为 不定长问题:CNN5+GRU ,定长:CNN5/DenseNet/ResNet50
# UnitsNum: RNN层的单元数 [16, 64, 128, 256, 512]
# - 神经网络在隐层中使用大量神经元,就是做升维,将纠缠在一起的特征或概念分开。
# Optimizer: 优化器算法 [AdaBound, Adam, Momentum]
# OutputLayer: [LossFunction, Decoder]
# - LossFunction: 损失函数 [CTC, CrossEntropy]
# - Decoder: 解码器 [CTC, CrossEntropy]
NeuralNet:
CNNNetwork: {CNNNetwork}
RecurrentNetwork: {RecurrentNetwork}
UnitsNum: {UnitsNum}
Optimizer: {Optimizer}
OutputLayer:
LossFunction: {LossFunction}
Decoder: {Decoder} # ModelName: 模型名/项目名,同时也对应编译后的pb模型文件名
# ModelField: 模型处理的数据类型,目前只支持图像 [Image, Text]
# ModelScene: 模型处理的场景类型,目前只支持分类场景 [Classification]
# - 目前只支持 “图像分类” 这一种场景.
Model:
ModelName: {ModelName}
ModelField: {ModelField}
ModelScene: {ModelScene} # FieldParam 分为 Image, Text 两种,不同数据类型时可配置的参数不同,目前只提供 Image 一种。
# ModelField 为 Image 时:
# - Category: 提供默认的内置解决方案:
# -- [ALPHANUMERIC(含大小写英文数字), ALPHANUMERIC_LOWER(小写英文数字),
# -- ALPHANUMERIC_UPPER(大写英文数字),NUMERIC(数字), ALPHABET_LOWER(小写字母),
# -- ALPHABET_UPPER(大写字母), ALPHABET(大小写字母),
# -- ALPHANUMERIC_CHS_3500_LOWER(小写字母数字混合中文常用3500)]
# - 或者可以自定义指定分类集如下(中文亦可):
# -- ['Cat', 'Lion', 'Tiger', 'Fish', 'BigCat']
# - Resize: 重置尺寸,对应网络的输入: [ImageWidth, ImageHeight/-1, ImageChannel]
# - ImageChannel: 图像通道,3为原图,1为灰度 [1, 3]
# - 为了配合部署服务根据图片尺寸自动选择对应的模型,由此诞生以下参数(ImageWidth,ImageHeight):
# -- ImageWidth: 图片宽度.
# -- ImageHeight: 图片高度.
# - MaxLabelNum: 该参数在使用CTC损失函数时将被忽略,仅用于使用交叉熵作为损失函数/标签数固定时使用
# ModelField 为 Text 时:
# - 该类型暂时不支持
FieldParam:
Category: {Category}
Resize: {Resize}
ImageChannel: {ImageChannel}
ImageWidth: {ImageWidth}
ImageHeight: {ImageHeight}
MaxLabelNum: {MaxLabelNum}
OutputSplit: {OutputSplit} # 该配置应用于数据源的标签获取.
# LabelFrom: 标签来源,目前只支持 从文件名提取 [FileName, XML, LMDB]
# ExtractRegex: 正则提取规则,对应于 从文件名提取 方案 FileName:
# - 默认匹配形如 apple_20181010121212.jpg 的文件.
# - 默认正则为 .*?(?=_.*\.)
# LabelSplit: 该规则仅用于 从文件名提取 方案:
# - 文件名中的分割符形如: cat&big cat&lion_20181010121212.png,那么分隔符为 &
# - The Default is null.
Label:
LabelFrom: {LabelFrom}
ExtractRegex: {ExtractRegex}
LabelSplit: {LabelSplit} # DatasetPath: [Training/Validation], 打包为TFRecords格式的训练集/验证集的本地绝对路径。
# SourcePath: [Training/Validation], 未打包的训练集/验证集源文件夹的本地绝对路径。
# ValidationSetNum: 验证集数目,仅当未配置验证集源文件夹时用于系统随机抽样用作验证集使用。
# - 该选项用于懒人训练模式,当样本极度不均衡时建议手动设定合理的验证集。
# SavedSteps: 当 Session.run() 被执行一次为一步(1.x版本),保存训练过程的步数,默认为100。
# ValidationSteps: 用于计算准确率,验证模型的步数,默认为每500步验证一次。
# EndAcc: 结束训练的条件之准确率 [EndAcc*100]% 到达该条件时结束任务并编译模型。
# EndCost: 结束训练的条件之Cost值 EndCost 到达该条件时结束任务并编译模型。
# EndEpochs: 结束训练的条件之样本训练轮数 Epoch 到达该条件时结束任务并编译模型。
# BatchSize: 批次大小,每一步用于训练的样本数量,不宜过大或过小,建议64。
# ValidationBatchSize: 验证集批次大小,每个验证准确率步时,用于验证的样本数量。
# LearningRate: 学习率 [0.1, 0.01, 0.001, 0.0001] fine-tuning 时选用较小的学习率。
Trains:
DatasetPath:
Training: {DatasetTrainsPath}
Validation: {DatasetValidationPath}
SourcePath:
Training: {SourceTrainPath}
Validation: {SourceValidationPath}
ValidationSetNum: {ValidationSetNum}
SavedSteps: {SavedSteps}
ValidationSteps: {ValidationSteps}
EndAcc: {EndAcc}
EndCost: {EndCost}
EndEpochs: {EndEpochs}
BatchSize: {BatchSize}
ValidationBatchSize: {ValidationBatchSize}
LearningRate: {LearningRate} # 以下为数据增广的配置
# Binaryzation: 该参数为 list 类型,包含二值化的上界和下界,值为 int 类型,参数为 -1 表示未启用。
# MedianBlur: 该参数为 int 类型,参数为 -1 表示未启用。
# GaussianBlur: 该参数为 int 类型,参数为 -1 表示未启用。
# EqualizeHist: 该参数为 bool 类型。
# Laplace: 该参数为 bool 类型。
# WarpPerspective: 该参数为 bool 类型。
# Rotate: 该参数为大于 0 的 int 类型,参数为 -1 表示未启用。
# PepperNoise: 该参数为小于 1 的 float 类型,参数为 -1 表示未启用。
# Brightness: 该参数为 bool 类型。
# Saturation: 该参数为 bool 类型。
# Hue: 该参数为 bool 类型。
# Gamma: 该参数为 bool 类型。
# ChannelSwap: 该参数为 bool 类型。
# RandomBlank: 该参数为大于 0 的 int 类型,参数为 -1 表示未启用。
# RandomTransition: 该参数为大于 0 的 int 类型,参数为 -1 表示未启用。
DataAugmentation:
Binaryzation: {DA_Binaryzation}
MedianBlur: {DA_MedianBlur}
GaussianBlur: {DA_GaussianBlur}
EqualizeHist: {DA_EqualizeHist}
Laplace: {DA_Laplace}
WarpPerspective: {DA_WarpPerspective}
Rotate: {DA_Rotate}
PepperNoise: {DA_PepperNoise}
Brightness: {DA_Brightness}
Saturation: {DA_Saturation}
Hue: {DA_Hue}
Gamma: {DA_Gamma}
ChannelSwap: {DA_ChannelSwap}
RandomBlank: {DA_RandomBlank}
RandomTransition: {DA_RandomTransition} # 以下为预处理的配置
# Binaryzation: 该参数为 list 类型,包含二值化的上界和下界,值为 int 类型,参数为 -1 表示未启用。
# ReplaceTransparent: 使用白色替换透明背景
# HorizontalStitching: 水平拆分拼接,适用于上下分层
# ConcatFrames: 根据帧索引列表水平合并帧
# BlendFrames: 根据帧索引列表融合帧内容
Pretreatment:
Binaryzation: {Pre_Binaryzation}
ReplaceTransparent: {Pre_ReplaceTransparent}
HorizontalStitching: {Pre_HorizontalStitching}
ConcatFrames: {Pre_ConcatFrames}
BlendFrames: {Pre_BlendFrames}

开始训练

执行 python trains.py 项目名 方式训练。然后就开始等待训练完成,生成 .pb文件

调用 pb 文件进行识别

采用作者提供的 muggle_ocr 项目来进行调用 pb 文件,进行验证码识别

import muggle_ocr
yaml_path = 'xx.pb'
sdk = muggle_ocr.SDK(model_type=muggle_ocr.ModelType.Captcha,conf_path=yaml_path)
url = 'http://www.xxx/image/11.jpg'
response = requests.get(url, verify=False)
text = self.sdk.predict(image_bytes=response.content)

结语

这样简单的操作就完成了验证码识别了,是不是太方便了。

captcha_trainer 验证码识别-训练 使用记录的更多相关文章

  1. CNN+BLSTM+CTC的验证码识别从训练到部署

    项目地址:https://github.com/kerlomz/captcha_trainer 1. 前言 本项目适用于Python3.6,GPU>=NVIDIA GTX1050Ti,原mast ...

  2. 【转】CNN+BLSTM+CTC的验证码识别从训练到部署

    [转]CNN+BLSTM+CTC的验证码识别从训练到部署 转载地址:https://www.jianshu.com/p/80ef04b16efc 项目地址:https://github.com/ker ...

  3. python使用tesseract-ocr完成验证码识别(模型训练和使用部分)

    一.Tesseract训练 大体流程为:安装jTessBoxEditor -> 获取样本文件 -> Merge样本文件 –> 生成BOX文件 -> 定义字符配置文件 -> ...

  4. 利用jTessBoxEditor工具进行Tesseract3.02.02样本训练,提高验证码识别率

    1.背景 前文已经简要介绍tesseract ocr引擎的安装及基本使用,其中提到使用-l eng参数来限定语言库,可以提高识别准确率及识别效率. 本文将针对某个网站的验证码进行样本训练,形成自己的语 ...

  5. tensorflow训练验证码识别模型

    tensorflow训练验证码识别模型的样本可以使用captcha生成,captcha在linux中的安装也很简单: pip install captcha 生成验证码: # -*- coding: ...

  6. 字符型图片验证码识别完整过程及Python实现

    字符型图片验证码识别完整过程及Python实现 1   摘要 验证码是目前互联网上非常常见也是非常重要的一个事物,充当着很多系统的 防火墙 功能,但是随时OCR技术的发展,验证码暴露出来的安全问题也越 ...

  7. 基于LeNet网络的中文验证码识别

    基于LeNet网络的中文验证码识别 由于公司需要进行了中文验证码的图片识别开发,最近一段时间刚忙完上线,好不容易闲下来就继上篇<基于Windows10 x64+visual Studio2013 ...

  8. 使用tensorflow搭建自己的验证码识别系统

    目录 准备验证码数据 保存为tfrecords文件 验证码训练 学习tensorflow有一段时间了,想做点东西来练一下手.为了更有意思点,下面将搭建一个简单的验证码识别系统. 准备验证码数据 下面将 ...

  9. Pyhthon爬虫其之验证码识别

    背景 现在的登录系统几乎都是带验证手段的,至于验证的手段也是五花八门,当然用的最多的还是验证码.不过纯粹验证码识已经是很落后的东西了,现在比较多见的是滑动验证,滑动拼图验证(这个还能往里面加广告).点 ...

随机推荐

  1. JSTL标签报错-http://java.sun.com/jsp/jstl/core

    考虑为tomcat缺少相关的包 导入就好了 导入jstl-api-1.2.jar 以及standard-1.1.2.jar 然后重启服务 更多java学习,请进本人小博客-https://zhangj ...

  2. Hamcrest 断言框架

    Hamcrest是一个为了测试为目的,能组合成灵活表达式的匹配器类库.用于编断言的框架,使用这个框架编写断言,提高可读性及开发测试的效率,提供了大量"匹配器"方法,每个匹配器用于执 ...

  3. 网络协议之TCP和UDP

    TCP/IP协议: 传输控制协议/因特网互联协议( Transmission Control Protocol/Internet Protocol),是Internet最基本.最广泛的协议.它定义了计 ...

  4. mybatis和hibernate区别

    一.本质区别和应用场景

  5. shell--目录通配符

    符号 说明 ? 匹配任一字符 * 匹配一个或多个字符 [a-z0-9] 类似于正则表达式, 若想匹配?可用[?] [!a-z] 类似于正则表达式[^a-z], 不匹配中括号中的内容 {string1, ...

  6. java版gRPC实战之三:服务端流

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  7. go实现堆排序、快速排序、桶排序算法

    一. 堆排序 堆排序是利用堆这种数据结构而设计的一种排序算法.以大堆为例利用堆顶记录的是最大关键字这一特性,每一轮取堆顶元素放入有序区,就类似选择排序每一轮选择一个最大值放入有序区,可以把堆排序看成是 ...

  8. freeswitch 编译安装后的配置

    --------------------FreeSWITCH configuration------------Locations: prefix: /usr/local/freeswitchexec ...

  9. 机器学习——最优化问题:拉格朗日乘子法、KKT条件以及对偶问题

    1 前言 拉格朗日乘子法(Lagrange Multiplier)  和 KKT(Karush-Kuhn-Tucker)  条件是求解约束优化问题的重要方法,在有等式约束时使用拉格朗日乘子法,在有不等 ...

  10. POJ2352 Stars (静态二叉检索树)

    https://vjudge.net/problem/POJ-2352 分析: 由于是按照y坐标的升序,y坐标向等的按x的升序的顺序给出星星.那么某个星星的等级数就是在他前面x坐标小于等于他的x坐标的 ...