在学习了CNN之后,自己想去做一个验证码识别,网上找了很多资料,杂七杂八的一大堆,但是好多是tf1写的,对tf1不太熟悉,有点看不懂,于是自己去摸索吧。

摸索的过程是异常艰难呀,一开始我直接用captcha 生成了10080张验证码去识别,发现loss一直停留在2.3左右,accuracy一直是0.1左右,训练了100回合,也没啥变化,电脑都快要跑废了,咋办呀,于是网上各种问大佬,找到机会就发问,说我识别验证码出现的问题,其中一位大佬对我的问题很有帮助,感谢魏巍老师。

下面就是我寻找问题答案的每一步:

第一回

网络结构的搭建:

 model=tf.keras.models.Sequential([

     tf.keras.Input(shape=(H, W, C)),
layers.Conv2D(, , activation='relu'),
layers.MaxPooling2D((, )), layers.Conv2D(, , activation='relu'),
layers.MaxPooling2D((, )), layers.Conv2D(, , activation='relu'),
layers.MaxPooling2D((, )), layers.Conv2D(, , activation='relu'),
layers.MaxPooling2D((, )), layers.Conv2D(, , activation='relu'),
layers.MaxPooling2D((, )), layers.Flatten(),
layers.Dense(, 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=,
callbacks=callbacks,
validation_data=valid_gen,
validation_steps=len(valid_idx)//valid_batch_size)

summary:

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

样本图:

训练结果:
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位识别不出来,能不能先识别一位呢?好,那就开始搞,一位比较简单,跟Mnist 数据集很相似,在这我就不详细了。

第二回

接着来识别2位的验证码,

train count: 441, valid count: 189, test count: 270,

样本图:

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

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

哎呦,有感觉了,有了起色了,出现了过拟合的现象,解决过拟合的方法主要有:

1、get more trainning 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 左右,这是什么鬼呢?我都想骂娘了。

但是我还是不死心呀,继续想办法呀,既然彩色的有难度,我先识别黑白的样本行不行呢,先试试吧。

第四回

网络结构依然采用上面的,input_shape(100,80,3)
这是我用 2 位的黑白图片的验证码进行了训练,效果很好,收敛也很快。

训练第 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 张识别错了:

样本图:

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

第五回

依然采用上面的网络结构,
这次使用的是 4 位黑白图片的验证码

train count: 2469, valid count: 1059, test count: 1512,

训练第 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 张错误:

4位验证码的样本图:

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

第六回

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

train count: 4939, valid count: 2117, test count: 3024,

第 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 张错误:

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

下篇我需要把彩色验证码上噪点给去掉,然后再送入神经网络,请持续关注。

使用tensorflow2识别4位验证码及思考总结的更多相关文章

  1. [验证码识别技术]字符验证码杀手--CNN

    字符验证码杀手--CNN 1 abstract 目前随着深度学习,越来越蓬勃的发展,在图像识别和语音识别中也表现出了强大的生产力.对于普通的深度学习爱好者来说,一上来就去跑那边公开的大型数据库,比如I ...

  2. java练习题(字符串类):显示4位验证码、输出年月日、从XML中抓取信息

    1.显示4位验证码 注:大小写字母.数字混合 public static void main(String[] args) { String s="abcdefghijklmnopqrstu ...

  3. python利用selenium库识别点触验证码

    利用selenium库和超级鹰识别点触验证码(学习于静谧大大的书,想自己整理一下思路) 一.超级鹰注册:超级鹰入口 1.首先注册一个超级鹰账号,然后在超级鹰免费测试地方可以关注公众号,领取1000积分 ...

  4. js 做的随机8位验证码

    开发思路: 画出放置验证码的模块.一个写有“看不清…”的小块,以及输入验证码的文本框 获取各个模块 封装一个函数Yan_ma(),设置验证码为8位,里面含有数字,小写字母,小写字母和中文.每种类型出现 ...

  5. 爬虫(十二):图形验证码的识别、滑动验证码的识别(B站滑动验证码)

    1. 验证码识别 随着爬虫的发展,越来越多的网站开始采用各种各样的措施来反爬虫,其中一个措施便是使用验证码.随着技术的发展,验证码也越来越花里胡哨的了.最开始就是几个数字随机组成的图像验证码,后来加入 ...

  6. java识别简单的验证码

    1.老规矩,先上图 要破解类似这样的验证码: 拆分后结果: 然后去匹配,得到结果. 2.拆分图片 拿到图片后,首先把图片中我们需要的部分截取出来. 具体的做法是,创建一个的和图片像素相同的一个代表权重 ...

  7. time-based基于google key生成6位验证码(google authenticator)

    由于公司服务器启用了双因子认证,登录时需要再次输入谷歌身份验证器生成的验证码.而生成验证码是基于固定的算法的,以当前时间为基础,基于每个人的google key去生成一个6位的验证码.也就是说,只要是 ...

  8. python下调用pytesseract识别某网站验证码

    一.pytesseract介绍 1.pytesseract说明 pytesseract最新版本0.1.6,网址:https://pypi.python.org/pypi/pytesseract Pyt ...

  9. Aforge.net识别简易数字验证码问题

    参考:https://www.bbsmax.com/A/rV57LjWGdP/ https://blog.csdn.net/louislong007/article/details/47683035 ...

随机推荐

  1. 5.12 省选模拟赛 T2 贪心 dp 搜索 差分

    LINK:T2 这题感觉很套路 但是不会写. 区间操作 显然直接使用dp不太行 直接爆搜也不太行复杂度太高. 容易想到差分 由于使得整个序列都为0 那么第一个数也要i差分前一个数 强行加一个0 然后 ...

  2. jmeter如何设置全局变量

    场景:性能测试或者接口测试,如果想跨线程引用(案例:A线程组里面的一个输出,是B线程组里面的一个输入,这个时候如果要引用),这个时候你就必须要设置全局变量;全链路压测也需要分不同场景,通常情况,一个场 ...

  3. Python分析6000家破产IT公司

    前一阵有个字节跳动的程序员火了,年仅28岁实现了财务自由,宣布提前退休.最直接的原因是选择了一家发展前景很好的创业公司.当然平时我们经常能听到,某某人加入创业公司,xx年后公司上市,身价暴涨,财务自由 ...

  4. 3行!仅3行代码就能抓取B站(弹幕、评论、用户)数据

    今天介绍一个获取B站数据的Python扩展库-bilibili_api 可以获取的数据包括: video-视频模块 user-用户模块 dynamic-动态模块 这次用“Running Man”十周年 ...

  5. 我还在生产玩 JDK7,JDK 15 却要来了!|新特性尝鲜

    自从 JDK9 之后,每年 3 月与 9 月 JDK 都会发布一个新的版本,而2020 年 9 月即将引来 JDK15. 恰巧 IDEA 每四五个月会升级一个较大的版本,每次升级之后都会支持最新版本 ...

  6. Access to XMLHttpRequest at xxxx from origin ‘null‘ has been blocked by CORS policy:

    使用前后端分离的方式创建web项目的时候出现问题: 这是因为 ajax 请求的对应的域在本地的一个文件路径,比如在D盘的某个文件夹,这里存放的都是前端文件: 但是对应的服务器是 localhost 的 ...

  7. 云原生数据库mysql对共享存储分布式文件系统的接口需求分析

    1. 引言 云原生数据库跟分布式mpp数据库是有差异的,虽然两者都是计算与存储分离,但是在资源的占用上有所不同.云原生数据库是shard everything架构,其依赖的存储资源.内存资源.事务资源 ...

  8. ECharts 常见的问题总结

    以前也用过ECharts(不得不说,这真的是百度的良心产品),但是都是一些简单的示例.这次因为工作的需要,做了很多表格,对ECharts有了更加深刻的理解,现在来总结一下. 第一个肯定是新手经常遇到的 ...

  9. LeetCode 115.不同的子序列 详解

    题目详情 给定一个字符串 S 和一个字符串 T,计算在 S 的子序列中 T 出现的个数. 一个字符串的一个子序列是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串.(例如, ...

  10. 看DLI服务4核心如何提升云服务自动化运维

    摘要:今天我们来说说DLI是如何实现监控告警来提升整体运维能力,从而为客户更好的提供Serverless的DLI. DLI是支持多模引擎的Serverless大数据计算服务,免运维也是其作为Serve ...