使用TensorFlow 来实现一个简单的验证码识别过程

  • 时间:
  • 浏览:2



这样 亲们就能不都可不还可以实现文本到 One-Hot 编码的互转了。









本文亲们来用 TensorFlow 来实现这样 深度学习模型,用来实现验证码识别的过程,这里识别的验证码是图形验证码,首先亲们会用标注好的数据来训练这样 模型,怎么让再用模型来实现你你这人验证码的识别。



测试

在训练前一天肯定是要进行数据预防止了,现在亲们首先定义好了要生成的验证码文本内容,这就为宜意味着着有了 label 了,怎么让亲们再用它来生成验证码,就能不都可不还可以得到输入数据 x 了,在这里亲们首先定义好亲们的输入词表,意味着着大小写字母加数字的词表比较庞大,设想亲们用蕴藏大小写字母和数字的验证码,这样 验证码三个白 字符,这样一共意味着着的组合是 (26 + 26 + 10) ^ 4 = 14776336 种组合,你你这人数量训练起来很重大,已经 有这里亲们精简一下,只使用纯数字的验证码来训练,这样 其组合个数就变为 10 ^ 4 = 300 种,显然少了已经 有。

接下来亲们能不都可不还可以定义 label,意味着着亲们能不都可不还可以使用深度学习模型进行训练,已经 有这里亲们的 label 数据最好使用 One-Hot 编码,即意味着着验证码文本是 1234,这样应该词表索引位置置 1,总共的长度是 40,亲们用进程实现一下 One-Hot 编码和文本的互相转换:



1.验证码准备

https://www.tensorflow.org/apidocs/python/tf/nn/softmaxcrossentropywithlogits

怎么让 Loss 和 Accuracy 就好计算了:

这里亲们定义了这样 getrandomtext() 妙招,能不都可不还可以随机生成验证码文本,怎么让接下来再利用你你这人随机生成的文这样 产生对应的 x、y 数据,怎么让亲们再将数据写入到 pickle 文件里,这样 就完成了预防止的操作。



怎么让初始化这样 迭代器,并绑定到你你这人数据集上:

这里 text2vec() 妙招已经 将真实文本转化为 One-Hot 编码,vec2text() 妙招已经 将 One-Hot 编码转回真实文本。

3.构建模型

这里亲们使用 python 的 captcha 库来生成即可,你你这人库默认是这样安装的,已经 有这里亲们能不都可不还可以先安装你你这人库,另外亲们还能不都可不还可以安装 pillow 库

接下来已经 关键的偏离 了,在这里亲们使用三层卷积和两层全连接网络进行构造,在这里为了冗杂写法,直接使用 TensorFlow 的 layers 模块:



再接下来执行训练即可:



运行训练过程,结果类似如下:

已经 有在这里亲们先定义这样 词表和其长度变量:

这里卷积核大小为 3,padding 使用 SAME 模式,激活函数使用 relu。

这样 亲们就能不都可不还可以确保最后一维是 VOCAB_LENGTH 长度,而它已经 这样 One-Hot 向量,已经 有各元素之和必定为 1。



原文发布时间为:2018-11-20



在这里亲们首先初始化 traininitializer,将 iterator 绑定到 Train Dataset 上,怎么让执行 trainop,获得 loss、acc、gstep 等结果并输出。

怎么让现在的 label 参数是 CAPTCHALENGTH 个 One-Hot 向量拼合而成,已经 有这里各个元素之和为 CAPTCHALENGTH,已经 有亲们能不都可不还可以重新 reshape 一下,确保最后一维各个元素之和为 1:

内容如下:



这样 调用此妙招,亲们就能不都可不还可以得到这样 Numpy 数组了,你你这人确实是把验证码转化成了每个像素的 RGB,亲们调用一下你你这人妙招试试:

训练过程亲们还能不都可不还可以每隔几块 Epoch 保存一下模型:

2.预防止

这里 VOCAB 已经 词表的内容,即 0 到 9 这 10 个数字,验证码的字符个数即 CAPTCHA_LENGTH 是 4,词表长度是 VOCAB 的长度,即 10。



验证时亲们能不都可不还可以重新 Reload 一下模型,怎么让进行验证:

当然不都可不还可以不都可不还可以取验证集上准确率最高的模型进行保存。

有了数据前一天,亲们就始于英文构建模型吧,这里亲们还是利用 traintestsplit() 妙招将数据分为三偏离 ,训练集、开发集、验证集:

训练



接下来亲们使用者这样 数据集构建这样 Dataset 对象:

接下来亲们就能不都可不还可以构造一批数据了,x 数据已经 验证码的 Numpy 数组,y 数据已经 验证码的文本的 One-Hot 编码,生成内容如下:



安装好前一天,亲们就能不都可不还可以用如下代码来生成这样 简单的图形验证码



类似这里调用一下这这样 妙招,亲们将 1234 文本转换为 One-Hot 编码,怎么让在将其转回来:

能不都可不还可以看完图中的文字正是亲们所定义的内容,这样 亲们就能不都可不还可以得到一张图片和其对应的真实文本,接下来亲们就能不都可不还可以用它来生成一批训练数据和测试数据了。

接下来亲们定义这样 生成验证码数据的妙招,流程类似上文,只不过这里亲们将返回的数据转为了 Numpy 形式的数组:

能不都可不还可以看完它的 shape 是 (30, 130, 3),这确实代表验证码图片的深度是 30,深度是 130,是 30 x 130 像素的验证码,每个像素全是 RGB 值,已经 有最后一维即为像素的 RGB 值。





经过全连接网络变换前一天,y 的 shape 就变成了 [batchsize, nclasses],亲们的 label 是 CAPTCHALENGTH 个 One-Hot 向量拼合而成的,在这里亲们想使用交叉熵来计算,怎么让交叉熵计算的前一天,label 参数向量最后一维各个元素之和能不都可不还可以为 1,不然计算梯度的前一天会出現问題。详情参见 TensorFlow 的官方文档:

本文作者:MobSDK