c++ 图片验证码识别_用 TensorFlow 2 识别验证码过程中踩过的坑

(给Python开发者加星标,提升Python技能)

来源: TensorFlow-李传两

在学习了 CNN 之后,我一直想去做一个验证码识别?。网上找了很多资料,杂七杂八的一大堆,但是好多是 tf1 写的?‍♂️。我对 tf1 不太熟悉,于是自己开始了基于 TensorFlow 2 的摸索实践。

摸索的过程异常艰难,一开始我直接用 captcha 生成了 10080 张验证码去识别,发现 loss 一直停留在 2.3 左右,accuracy 一直是 0.1 左右,训练了 100 回合,也没什么提升,电脑都快要跑废了?,咋办呀?于是网上各种问大佬,找到机会就提问,其中一位大佬的回答让我受到了启发⚡️,他说:你可以先识别 1 位,然后 2 位,3 位,最后 4 位,一步一步来……(此处感谢魏巍老师)。

本文主要描述我在验证码识别过程中的一些摸索,整理出来以供大家参考:

第一回:搭建网络结构

首先我们需要搭建网络结构,如下:
model=tf.keras.models.Sequential([

tf.keras.Input(shape=(H, W, C)),
layers.Conv2D(32, 3, activation='relu'),
layers.MaxPooling2D((2, 2)),

layers.Conv2D(64, 3, activation='relu'),
layers.MaxPooling2D((2, 2)),

layers.Conv2D(64, 3, activation='relu'),
layers.MaxPooling2D((2, 2)),

layers.Conv2D(64, 3, activation='relu'),
layers.MaxPooling2D((2, 2)),

layers.Conv2D(64, 3, activation='relu'),
layers.MaxPooling2D((2, 2)),

layers.Flatten(),
layers.Dense(1024, activation='relu'),

layers.Dense(D * N_LABELS, activation='softmax'),
layers.Reshape((D, N_LABELS)),
])

model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics= ['accuracy'])


callbacks=[
tf.keras.callbacks.TensorBoard(log_dir='logs'),
tf.keras.callbacks.ModelCheckpoint(filepath=check_point_path,
save_weights_only=True,
save_best_only=True)
]
history = model.fit(train_gen,
steps_per_epoch=len(train_idx)//batch_size,
epochs=100,
callbacks=callbacks,
validation_data=valid_gen,
validation_steps=len(valid_idx)//valid_batch_size)

summary:

51dee5ae3b59f501a81ce840ad793521.png

我的训练数据量:train count: 7408, valid count: 3176, test count: 4536

样本图:

795e191fd2222bb3ab4ea67ed8455132.png 2ca788e423f8c4c1332b6b4988588037.png 223d170e00c3ad770bc597479d05c054.png

训练结果:

Train for 231 steps, validate for 99 steps
Epoch 1/100
1/231 […] - ETA: 4:18 - loss: 2.2984 - accuracy: 0.1328
231/231 [==============================] - 143s 618ms/step - loss: 2.3032 - accuracy: 0.0971 - val_loss: 2.3029 - val_accuracy: 0.0987
Epoch 2/100
230/231 [============================>.] - ETA: 0s - loss: 2.3026 - accuracy: 0.1014
231/231 [==============================] - 121s 525ms/step - loss: 2.3026 - accuracy: 0.1013 - val_loss: 2.3031 - val_accuracy: 0.0986
Epoch 3/100
230/231 [============================>.] - ETA: 0s - loss: 2.3026 - accuracy: 0.1029
231/231 [==============================] - 138s 597ms/step - loss: 2.3026 - accuracy: 0.1026 - val_loss: 2.3032 - val_accuracy: 0.0986
Epoch 4/100
230/231 [============================>.] - ETA: 0s - loss: 2.3025 - accuracy: 0.1031
231/231 [==============================] - 124s 537ms/step - loss: 2.3025 - accuracy: 0.1031 - val_loss: 2.3032 - val_accuracy: 0.0987
Epoch 5/100
230/231 [============================>.] - ETA: 0s - loss: 2.3025 - accuracy: 0.1040
231/231 [==============================] - 123s 532ms/step - loss: 2.3025 - accuracy: 0.1039 - val_loss: 2.3032 - val_accuracy: 0.0989
Epoch 6/100
230/231 [============================>.] - ETA: 0s - loss: 2.3025 - accuracy: 0.1039
231/231 [==============================] - 118s 509ms/step - loss: 2.3025 - accuracy: 0.1038 - val_loss: 2.3033 - val_accuracy: 0.0988

Epoch 20/100
230/231 [============================>.] - ETA: 0s - loss: 2.3025 - accuracy: 0.1038
231/231 [==============================] - 120s 521ms/step - loss: 2.3025 - accuracy: 0.1038 - val_loss: 2.3034 - val_accuracy: 0.0988
Epoch 21/100
190/231 [=======================>…] - ETA: 20s - loss: 2.3025 - accuracy: 0.1032

loss 一直没有变化,accuracy 也很低,不知道出现了什么原因,困扰一两个星期?,都想要放弃了,太难了。但是我不死心,非要把它搞出来,4 位识别不出来,能不能先识别一位呢dd7f3780452e7e09f3bbc829b39886bf.png?好,那就开始搞,一位比较简单,跟 Mnist 数据集很相似,在这我就不赘述了。

第二回:2 位彩色验证码训练

接着来识别 2 位的验证码。train count: 441, valid count: 189, test count: 270

样本图:

e266daea974c800db4f3022e326b970c.png 7f7ade2fc4290bae4f6a8e58b18c19b7.png 17ef5dccb9c1f00087b7bbf883621f9b.png

下面是我用 2 位验证码进行训练的结果:

41c499a893f5c68423cbffc157ea36e1.png

30 张图片进行测试,结果:

fdb9875c908fff5e9d7387a444b549be.png 哎呦,有感觉了,有了起色了,但是出现了过拟合的现象,解决过拟合的方法主要有:
  1. Get more training data
  2. Reduce the capacity of the network
  3. Add weight regularization
  4. Add dropout
  5. Data-augmentation
  6. Batch normalization

第三回:增加彩色验证码数据集

于是我就增加了数据集。train count: 4410, valid count: 1890, test count: 2700

然后又出现了 loss 一直在 2.3,accuracy 在 0.09 左右,这是什么鬼呢?‍♂️?但是我还是不死心呀,继续想办法呀,既然彩色的有难度,我先识别黑白的样本行不行呢?,先试试吧。

第四回:2 位黑白验证码训练

网络结构依然采用上面的,input_shape(100,120,3)。

这是我用 2 位的黑白图片的验证码进行了训练,效果很好,收敛也很快?。

b8eccbf4b39fb1df55740dc1a7b2ddc6.png

训练第 50 回合时:

Epoch 50/50
26/27 [============>…] - ETA: 0s - loss: 0.0150 - accuracy: 0.9940
27/27 [==============] - 8s 289ms/step - loss: 0.0212 - accuracy: 0.9936 - val_loss: 0.2348 - val_accuracy: 0.9446

随机选取了 30 张图片进行了测试,2 张识别错了:

c320a3712f2a37546313fba1bc155e6a.png

样本图:

17988e51d816c1c9313cf45a73033d1e.png

看着这结果,我露出了洁白的大牙???,信心大增呀,继续搞,直接上 4 位验证码。

第五回:4 位黑白验证码训练

依然采用上面的网络结构,这次使用的是 4 位黑白图片的验证码。train count: 2469, valid count: 1059, test count: 1512

4b9e3749777076a0ff147536d5edf82b.png

训练第 20 回合:

Epoch 20/20
76/77 [====>.] - ETA: 0s - loss: 0.0409 - accuracy: 0.9860
77/77 [======] - 33s 429ms/step - loss: 0.0408 - accuracy: 0.9861 - val_loss: 0.3283 - val_accuracy: 0.9221

随机选取 30 张图片进行测试,8 张错误:

3980afd33c5d61989588342e66143bcc.png

 4 位验证码的样本图:

411fc37908773c92d42238dcfc5f2d7f.png

从结果来看,有点过拟合?,没关系,继续加大数据集。

第六回:增加黑白验证码数据集

依旧采用上面的网络结构,这次我增加了数据集 4939 张,依旧使用的是 4 位黑白的验证码,训练结果还是挺好的:train count: 4939, valid count: 2117, test count: 3024

cfa1dd4d87391efa93c489cb07bcbb6e.png

第 20 回合:

Epoch 20/20
153/154 [==>.] - ETA: 0s - loss: 0.0327 - accuracy: 0.9898
154/154 [====] - 75s 488ms/step - loss: 0.0329 - accuracy: 0.9898 - val_loss: 0.1057 - val_accuracy: 0.9740

可以看出 训练集的准确率 跟验证集上很接近,随机选取 30 张图片进行测试,6 张错误图如下:

c73010bc2920bb3322bb7438353e4e5c.png

好了,搞了这么多,由此我觉得是噪点影响了深度学习的识别,maxpool 的时候连带着噪点也采样了,我们需要将噪点处理掉,再喂入神经网络。

第七回:预处理

在上面的推理中,我感觉是噪点影响了神经网络的识别,于是乎我在送入网络之前进行了去噪,二值化操作,训练如下:train count: 4939, valid count: 2117, test count: 3024

6c955fbea890c04fd9ca638b8cb48513.png

从图中可以看出,模型收敛了,但有点过拟合,第 20 回合训练结果如下:

Epoch 20/20
153/154 [==>.] - ETA: 0s - loss: 0.0407 - accuracy: 0.9861
154/154 [===] - 69s 450ms/step - loss: 0.0408 - accuracy: 0.9860 - val_loss: 0.3227 - val_accuracy: 0.9244

随机选取了 30 张图片进行了测试,8 张错误:

4b423a6085900660d84fb267cac8147c.png

做到这里, 我对之前的推测有了猜疑:是噪点影响的吗?我觉得不完全是。核心原因是我在尝试的过程中对验证码进行了处理,从 RGB 的验证码变成了单通道的黑白验证码,使得图片的信息减少了,神经网络的计算量也大大减少了,网络模型很快得到了收敛,loss 显著减少,accuracy 在不断提高。

整个过程是使用 CPU 进行训练的,电脑配置是 Intel®_Core™i7-6700HQ_CPU@_2.60GHz,8G 内存。如果大家的电脑配置高,用 GPU 进行训练,我觉得即使不做预处理,效果也能出来。

参考文档

  • https://github.com/JackonYang/captcha-tensorflow

- EOF -

推荐阅读   点击标题可跳转

1、TensorFlow 惊现大 bug?网友:这是逼着我们用 PyTorch 啊!

2、北大学霸出的中文教程:简单粗暴入门 TensorFlow 2.0

3、OpenAI 全面拥抱 PyTorch,TensorFlow:我哪里比不上它?

觉得本文对你有帮助?请分享给更多人

关注「Python开发者」加星标,提升Python技能

6795785ea17f025b7df816b02689a557.png

点赞和在看就是最大的支持❤️

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值