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

简介:

本文我们来用 TensorFlow 来实现一个深度学习模型,用来实现验证码识别的过程,这里识别的验证码是图形验证码,首先我们会用标注好的数据来训练一个模型,然后再用模型来实现这个验证码的识别。

1.验证码准备

这里我们使用 python 的 captcha 库来生成即可,这个库默认是没有安装的,所以这里我们需要先安装这个库,另外我们还需要安装 pillow 库

4c65b55799cc092b2c5792e61509914959cd6d87

安装好之后,我们就可以用如下代码来生成一个简单的图形验证码

8d11223ac0012f361ddfa49ca04937d8babf97ea

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

2.预处理

在训练之前肯定是要进行数据预处理了,现在我们首先定义好了要生成的验证码文本内容,这就相当于已经有了 label 了,然后我们再用它来生成验证码,就可以得到输入数据 x 了,在这里我们首先定义好我们的输入词表,由于大小写字母加数字的词表比较庞大,设想我们用含有大小写字母和数字的验证码,一个验证码四个字符,那么一共可能的组合是 (26 + 26 + 10) ^ 4 = 14776336 种组合,这个数量训练起来有点大,所以这里我们精简一下,只使用纯数字的验证码来训练,这样其组合个数就变为 10 ^ 4 = 10000 种,显然少了很多。

所以在这里我们先定义一个词表和其长度变量:

ed3f69825f53882c57a6d32a1ad3bde19f04f6d0

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

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

ec6f8ef7df7f8859b4fdbfe67cf0633ff21311c1

这样调用此方法,我们就可以得到一个 Numpy 数组了,这个其实是把验证码转化成了每个像素的 RGB,我们调用一下这个方法试试:

25895f5589357db6e2142352e632d734a67efd2c

内容如下:

dfbd1062af3c0d82e03fe7ebeef0ef31351f4c7d

可以看到它的 shape 是 (60, 160, 3),这其实代表验证码图片的高度是 60,宽度是 160,是 60 x 160 像素的验证码,每个像素都有 RGB 值,所以最后一维即为像素的 RGB 值。

接下来我们需要定义 label,由于我们需要使用深度学习模型进行训练,所以这里我们的 label 数据最好使用 One-Hot 编码,即如果验证码文本是 1234,那么应该词表索引位置置 1,总共的长度是 40,我们用程序实现一下 One-Hot 编码和文本的互相转换:

e40c1a1e081a35d7176df633ebd319e5b8b34700

这里 text2vec() 方法就是将真实文本转化为 One-Hot 编码,vec2text() 方法就是将 One-Hot 编码转回真实文本。

例如这里调用一下这两个方法,我们将 1234 文本转换为 One-Hot 编码,然后在将其转回来:

cc7e87d091a7e38807c780bfd7afb7487f91b8b9

这样我们就可以实现文本到 One-Hot 编码的互转了。

接下来我们就可以构造一批数据了,x 数据就是验证码的 Numpy 数组,y 数据就是验证码的文本的 One-Hot 编码,生成内容如下:

62ca0fcfe30bf9c85395a8c4aa7149686e0d5212

这里我们定义了一个 getrandomtext() 方法,可以随机生成验证码文本,然后接下来再利用这个随机生成的文本来产生对应的 x、y 数据,然后我们再将数据写入到 pickle 文件里,这样就完成了预处理的操作。

3.构建模型

有了数据之后,我们就开始构建模型吧,这里我们还是利用 traintestsplit() 方法将数据分为三部分,训练集、开发集、验证集:

183079f20594b28b2eb4650ac0c7f4ba9cb5d822

接下来我们使用者三个数据集构建三个 Dataset 对象:

8f0c1684e0a52e3d32e8b2167376841b38f0d9c6

然后初始化一个迭代器,并绑定到这个数据集上:

48dbf34d785ee06e8da87d9076635545afca071b

接下来就是关键的部分了,在这里我们使用三层卷积和两层全连接网络进行构造,在这里为了简化写法,直接使用 TensorFlow 的 layers 模块:

539cba9fe4ce9c5d22561b064bae70c220552ea0

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

经过全连接网络变换之后,y 的 shape 就变成了 [batchsize, nclasses],我们的 label 是 CAPTCHALENGTH 个 One-Hot 向量拼合而成的,在这里我们想使用交叉熵来计算,但是交叉熵计算的时候,label 参数向量最后一维各个元素之和必须为 1,不然计算梯度的时候会出现问题。详情参见 TensorFlow 的官方文档:

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

但是现在的 label 参数是 CAPTCHALENGTH 个 One-Hot 向量拼合而成,所以这里各个元素之和为 CAPTCHALENGTH,所以我们需要重新 reshape 一下,确保最后一维各个元素之和为 1:

f43ac0de17d787cb34038f8e3f09c7c72bb0c992

这样我们就可以确保最后一维是 VOCAB_LENGTH 长度,而它就是一个 One-Hot 向量,所以各元素之和必定为 1。

然后 Loss 和 Accuracy 就好计算了:

8b7189f74cf03581360e1008eab4c3b8f1146f2a

再接下来执行训练即可:

68d379d7635d0d9abfb7edbde22830b281394bc3

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

训练

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

692c79e1e90d156bc3384a5aef02e7442805809c

测试

训练过程我们还可以每隔几个 Epoch 保存一下模型:

6fae95b99d2ea3065e91667c93c34d1cbbd71651

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

验证时我们可以重新 Reload 一下模型,然后进行验证:

0a407f104a97c287dca1d52b7a0d0e1f2906f41b


原文发布时间为:2018-11-20
本文作者:MobSDK
本文来自云栖社区合作伙伴“ 安卓巴士Android开发者门户”,了解相关信息可以关注“ 安卓巴士Android开发者门户”。
相关文章
|
机器学习/深度学习 TensorFlow 算法框架/工具
优达学城深度学习之六——TensorFlow实现卷积神经网络
优达学城深度学习之六——TensorFlow实现卷积神经网络
优达学城深度学习之六——TensorFlow实现卷积神经网络
|
机器学习/深度学习 存储 TensorFlow
直观理解并使用Tensorflow实现Seq2Seq模型的注意机制(下)
直观理解并使用Tensorflow实现Seq2Seq模型的注意机制
163 0
直观理解并使用Tensorflow实现Seq2Seq模型的注意机制(下)
|
机器学习/深度学习 数据采集 自然语言处理
直观理解并使用Tensorflow实现Seq2Seq模型的注意机制(上)
直观理解并使用Tensorflow实现Seq2Seq模型的注意机制
234 1
直观理解并使用Tensorflow实现Seq2Seq模型的注意机制(上)
|
机器学习/深度学习 数据可视化 TensorFlow
使用TensorFlow Probability实现最大似然估计
TensorFlow Probability是一个构建在TensorFlow之上的Python库。它将我们的概率模型与现代硬件(例如GPU)上的深度学习结合起来。
120 1
|
TensorFlow 算法框架/工具 计算机视觉
TensorFlow 实现VGG16图像分类
TensorFlow 实现VGG16图像分类
TensorFlow 实现VGG16图像分类
|
机器学习/深度学习 存储 算法
TensorFlow 实现图像分类|学习笔记
快速学习 TensorFlow 实现图像分类。
137 0
TensorFlow 实现图像分类|学习笔记
|
机器学习/深度学习 TensorFlow 算法框架/工具
逻辑回归的 tensorflow 实现 | 学习笔记
快速学习逻辑回归的 tensorflow 实现
106 0
逻辑回归的 tensorflow 实现 | 学习笔记
uiu
|
机器学习/深度学习 算法 TensorFlow
TensorFlow 2 Keras实现线性回归
TensorFlow 2 Keras实现线性回归
uiu
144 0
TensorFlow 2 Keras实现线性回归
|
机器学习/深度学习 TensorFlow API
深度学习:Tensorflow实现线性回归梯度下降优化
深度学习:Tensorflow实现线性回归梯度下降优化
120 0
深度学习:Tensorflow实现线性回归梯度下降优化
|
机器学习/深度学习 TensorFlow API
TensorFlow实现多输入源多输出
有时我们的输入数据不只一个,会存在多个输入源,多个输出源,对于这种情况我们使用Sequential显然是不行的,因为Sequential只能够搭建线性拓扑模型,对于那种流水线型的模型较为适合,如果是非线性拓扑,复杂的拓扑使用Sequential是不能够实现的,这是我们就需要使用Function API,它会使我们处理多输入多输出变得简单。
576 0
TensorFlow实现多输入源多输出

热门文章

最新文章