福音:不懂代码也能用TensorFlow做验证码识别了

简介: 长话短说,开门见山,网络上现有的代码以教学研究为主,对于验证码识别有刚需的朋友们,无需阅读代码,几个参数任何人都能使用机器学习技术训练一个模型,如本文有不严谨之处还请告知与谅解,此文旨在献给不求甚解,拿来主义者。

项目地址:https://github.com/kerlomz/captcha_trainer,欢迎各位大佬们指点

长话短说,开门见山,网络上现有的代码以教学研究为主,对于验证码识别有刚需的朋友们,无需阅读代码,几个参数任何人都能使用机器学习技术训练一个模型,如本文有不严谨之处还请告知与谅解,此文旨在献给不求甚解,拿来主义者。

笔者选用的时下最为流行的CNN卷积神经网络进行端到端的验证码识别
懒人们仅仅需要了解一点基本的理念即可,下面笔者将带领大家走马观花瞧一瞧如何为之:

1.故事从两个配置文件说起

config.yaml # 系统配置

# Device: The default device is CPU.
# - If you use the GPU version, you need to install some additional applications.
# TrainRegex and TestRegex: Default matching apple_20181010121212.jpg file.
# TrainsPath and TestPath: The local path of your training and testing set.
System:
  Device: 'gpu:0'
  TrainsPath: 'E:\Task\Trains\cn_exec'
  TrainRegex: '.*?(?=_.*\.)'
  TestPath: 'E:\Task\TestGroup\cn_exec'
  TestRegex: '.*?(?=_.*\.)'

# TestNum: The number of samples for each test batch.
# - A test for every saved steps, Default value is 100.
# EndAcc: Finish the training when the accuracy reaches [EndAcc*100]%.
# EndStep: Finish the training when the step is greater than the [-1: Off, EndStep >0: On] step.
# LearningRate: Find the fastest relationship between the loss decline and the learning rate.
Trains:
  TestNum: 300
  SavedStep: 100
  EndAcc: 0.97
  EndStep: -1
  LearningRate: 0.0003

笔者十分怀念大学时光,就用校园生活的大白话捋一捋何为机器学习吧。
简单来说,给机器刷题(训练集),机器边做题边对照标准答案(结合测试集进行训练),机器用学习收获的结晶(模型)通过套公式写出了标准答案(识别)。学习指的就是找到特征与标签的映射关系。这样当有特征而无标签的未知数据输入时,我们就可以通过已有的关系得到未知数据标签。

综上所述,我们得出了第一个结论:我们需要 训练集测试集 来训练 模型

1.1 训练集

大致常见的有以下几种方案:

  1. 人工打码
  2. 认真分析验证码特征,自己生成几乎一样的验证码来代替训练集
  3. 对接打码平台:前提是要写一个爬虫,并且该爬虫需要具备以下功能:(1)下载验证码图片、(2)接入打码平台识别验证码、(3)将打码结果输入到验证码网站进行对错校验

1.2 测试集

极力推荐外部打码+人肉打码混合(特别是一些机器容易识别错的)

1.3 开始刷题

训练集和测试集到手之后就可以开搞了。

System:
  Device: 'gpu:0' # 配置用来训练的设备,GPU比CPU快得多的多,但是要安装额外的环境依赖
  TrainsPath: 'E:\Task\Trains\cn_exec' # 训练集的存放路径
  TrainRegex: '.*?(?=_.*\.)' # 训练集的文件名匹配,一般有两个原则:不重名、包含标注
  TestPath: 'E:\Task\TestGroup\cn_exec' # 同上
  TestRegex: '.*?(?=_.*\.)' # 同上

默认的命名规则为 正确标注_时间戳.jpg
上面对应的命名规则通过正则 .*?(?=_.*\.) 提取到正确标注,所以如果不按照这个规则命名,就需要自己另写对应于正确标注的匹配正则

Trains:
  TestNum: 300 # 每个批次测试样本数,换言之:每次小测验出300题
  SavedStep: 100 # 训练过程中每100个步长保存模型,接地气的说法:每背100个单词消化一下
  EndAcc: 0.97 # 结束训练的准确率指标,换句话说,100分考97分就能毕业了
  EndStep: -1 # 结束训练的步长指标,换句话说,跑10公里就结束了,不看成绩了
  LearningRate: 0.0003 # 学习率和loss值密切相关,按默认的来就好了,一般还有几种选项:0.1, 0.01

2.可以嘴角开始疯狂上扬了

先晒出模型方面的参数,不要被吓到,讲一讲其实很简单的

model.yaml # 模型配置

# Convolution: The number of layers is at least 3.
# - The number below corresponds to the size of each layer of convolution.
NeuralNet:
  Convolution:
    - 32
    - 64
    - 128
  ConvCoreSize: 3
  FullConnect: 1024

# CharSet: [ALPHANUMERIC, ALPHANUMERIC_LOWER, ALPHANUMERIC_UPPER, NUMERIC].
# ImageChannel: [1 - Gray Scale, 3 - RGB].
Model:
  ModelName: patchca
  ImageChannel: 1
  CharLength: 4
  CharSet: ALPHANUMERIC

# OriginalColor: [false - Gray Scale, true - RGB].
# Binaryzation: [-1: Off, >0 and < 255: On].
# Smoothing: [-1: Off, >0: On].
# Blur: [-1: Off, >0: On].
Pretreatment:
  OriginalColor: false
  Binaryzation: 240
  Smoothing: 3
  Blur: 5

2.1 神经网络

我们选用的神经网络是最基础的CNN模型了,一般来说就是

卷积层+池化层+卷积层+池化层...+全连接层

笔者曾经上课时存了一个很好理解的图示,斯坦福大学的CS231N的课程的传送门
卷积运算显然是一个线性操作,而神经网络要拟合的是非线性的函数,因此和全连接网络类似,我们需要加上激活函数,笔者的代码选取的为ReLU函数。
池化层的作用:通过卷积操作,我们完成了对输入向图像的降维和特征抽取,但特征图像的维数还是很高。维数高不仅计算耗时,而且容易导致过拟合。为此引入了下采样技术,也称为pooling即池化操作。池化的做法是对图像的某一个区域用一个值代替,如最大值或平均值。在这里,笔者选择的是最大值,因为前者是非线性的,一般情况下将获得更好的效果。(笔者在此便不徒增各位的选择困难了,私下决定在代码里定死)

2.2 模型

忘了和大家说一件很重要的事,光把验证码丢给计算机纯属耍流氓,好比要考试了,老师不告诉你考试范围,所以,我们还要告诉机器 这图片对应的验证码是几位的,用的是什么字符集等,例如 “AB3D” 是 4位,字符集用的是英文+数字混合。

字符集给各位安排好了

  • ALPHANUMERIC: 英文大小写与数字混合
  • ALPHANUMERIC_LOWER: 英文小写与数字混合
  • ALPHANUMERIC_UPPER: 英文大写与数字混合
  • NUMERIC: 纯数字
    注: 本来想加中文的,但大家需要知道,中文的难度太大了,这个基本的神经网络结构完全不足以支撑,即使能训练,最多只有很低的识别率,训练时间也极高,所以这个Demo就一切从简,只考虑最常见的

2.3 预处理

节奏很快,给了考试范围,预处理又是为了什么呢,这个不知道从何说起了,这个并不是必须的环节,更像是优化,好比老师出题,出的都是无限维向量空间上的泛函,一题要解一百年,那我们分析个锤子,我们通过预处理,把维度降低到一元一次方程,识别难度降低了,识别速度也快了。
一般情况下,预处理有这么几种:
笔者的训练系统自带了 二值化、滤波、模糊
特别强调一下:为什么网上没人提及过模糊处理呢,待我举个栗子:
类型A - 处理前
类型B - 处理前
类型A - 处理后
类型B - 处理后

经过处理,类型A和类型B在肉眼上看是不是很像一个模子刻出来的。滤波主要是为了降噪,二值化旨在排除颜色的干扰,经过这些预处理,足够解决大部分简单的字符型验证码了。

2.4 开工

训练Console截图.png

不用过多介绍了吧,上图也没讲什么,大致就告诉我们两样东西:
第一,测试环节的预测报告
第二,识别率

每100步的检验有两种格式输出消息:

  1. Flag: , Predict:
  2. False, Flag: , Predict:
    输出这些消息的意义在于,满足笔者不肯放过每一个细节的监视欲望。

acc_on_train 说的是是准确率
注:这个100%是要强调一下的,仅仅说明抽样的300个测试集中,预测率100%。
该模型实际线上的识别率是99.8%,大约1w个测试样本。

感谢时间:十分感谢全国失信网的验证码用以学习和研究
http://zxgk.court.gov.cn/zhzxgk/captcha.do?captchaId=08578d94beef4817afaa7b9fe1c64d58&random=0.11016792282004739
再次声明:本人未以任何形式收集该网站上的个人信息,仅作研究学习用途,该软件仅限于个人玩耍使用,请勿用于商业用途,否则作者概不负责。`

3. 惊!大妈玩转深度学习的原因竟然是

到这里差不多已经接近尾声了,经过封装打包,傻瓜式训练神器锻造出炉。下面简单介绍以下:

  1. CPU版不需要安装额外的依赖,但有些版本低的电脑需要安装VC运行时库,还有,Win7 SP1以下是不支持TensorFlow的。

最便捷的验证码训练工具 - CPU版
链接:https://kerlomz-business.oss-cn-hangzhou.aliyuncs.com/captcha_trainer.zip

GPU版不是纯傻瓜式的,CPU版呢我就放阿里云OSS上好了,一键圆梦。

最便捷的验证码训练工具 - GPU版
链接: https://pan.baidu.com/s/119CIPEzwRmAZxu6BcBrJug
密码: nfe5

下面祭出神器界面:
CNN模型训练工具 -  非专业人员版

笔者思前想后:光训练模型可不行,还要会部署。
笔者准备在下一篇将祭出杀手锏“验证码平台一键部署神器

相关实践学习
基于阿里云DeepGPU实例,用AI画唯美国风少女
本实验基于阿里云DeepGPU实例,使用aiacctorch加速stable-diffusion-webui,用AI画唯美国风少女,可提升性能至高至原性能的2.6倍。
目录
相关文章
|
6月前
|
机器学习/深度学习 监控 算法
【tensorflow】连续输入的神经网络模型训练代码
【tensorflow】连续输入的神经网络模型训练代码
|
6月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
【tensorflow】连续输入的线性回归模型训练代码
  get_data函数用于生成随机的训练和验证数据集。首先使用np.random.rand生成一个形状为(10000, 10)的随机数据集,来模拟10维的连续输入,然后使用StandardScaler对数据进行标准化。再生成一个(10000,1)的target,表示最终拟合的目标分数。最后使用train_test_split函数将数据集划分为训练集和验证集。
|
1天前
|
机器学习/深度学习 PyTorch TensorFlow
【TensorFlow】TF介绍及代码实践
【4月更文挑战第1天】TF简介及代码示例学习
|
6月前
|
机器学习/深度学习 存储 自然语言处理
|
4月前
|
机器学习/深度学习 Linux TensorFlow
基于Python TensorFlow Keras的深度学习回归代码——keras.Sequential深度神经网络
基于Python TensorFlow Keras的深度学习回归代码——keras.Sequential深度神经网络
|
4月前
|
机器学习/深度学习 编译器 TensorFlow
基于Python TensorFlow Estimator的深度学习回归与分类代码——DNNRegressor
基于Python TensorFlow Estimator的深度学习回归与分类代码——DNNRegressor
|
9月前
|
机器学习/深度学习 算法 数据可视化
花朵识别系统python+TensorFlow+Django网页界面+深度学习模型+卷积网络算法【完整代码】
花朵识别系统,基于Python实现,深度学习卷积神经网络,通过TensorFlow搭建卷积神经网络算法模型,并对数据集进行训练最后得到训练好的模型文件,并基于Django搭建可视化操作平台。
147 0
|
9月前
|
机器学习/深度学习 移动开发 算法
Python垃圾识别系统,TensorFlow+Django网页框架+深度学习模型+卷积网络【完整代码】
垃圾识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对5种垃圾数据集进行训练,最后得到一个识别精度较高的模型。并基于Django,开发网页端操作平台,实现用户上传一张垃圾图片识别其名称。
162 0
|
5月前
|
机器学习/深度学习 监控 TensorFlow
利用TensorFlow实现机器学习代码以用防止员工泄密软件检测员工泄密行为
随着信息安全的重要性日益增加,保护敏感数据免受员工泄密的风险成为组织的首要任务之一。在本文中,我们将讨论如何使用TensorFlow,一种强大的开源机器学习框架,来实现防止员工泄密软件。我们将演示如何编写代码来监控员工的行为,检测潜在的泄密行为,并在必要时采取自动化措施。这一切将有助于加强数据安全,防止敏感信息泄露。
183 2
|
5月前
|
机器学习/深度学习 数据挖掘 TensorFlow
keras tensorflow 搭建CNN-LSTM神经网络的住宅用电量预测 完整代码数据
keras tensorflow 搭建CNN-LSTM神经网络的住宅用电量预测 完整代码数据
51 0