0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用TensorFlow 2识别验证码过程中踩过的坑

Tensorflowers 来源:TensorFlow 作者:TensorFlow 2020-10-22 16:47 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

在学习了 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:

我的训练数据量: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 位彩色验证码训练

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

样本图:

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

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

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

Get more training data

Reduce the capacity of the network

Add weight regularization

Add dropout

Data-augmentation

Batch normalization

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

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

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

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

网络结构依然采用上面的,input_shape(100,120,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 位黑白验证码训练

依然采用上面的网络结构,这次使用的是 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 的时候连带着噪点也采样了,我们需要将噪点处理掉,再喂入神经网络

第七回:预处理

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

从图中可以看出,模型收敛了,但有点过拟合,第 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 张错误:

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

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


责任编辑:lq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cnn
    cnn
    +关注

    关注

    3

    文章

    356

    浏览量

    23537
  • tensorflow
    +关注

    关注

    13

    文章

    336

    浏览量

    62370
  • 验证码
    +关注

    关注

    2

    文章

    20

    浏览量

    4896

原文标题:经验总结:使用 TensorFlow 2 识别验证码过程中踩过的坑

文章出处:【微信号:tensorflowers,微信公众号:Tensorflowers】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    光耦失效的N种现场!工程师都

    在电子电路设计,光电耦合器(光耦)凭借电气隔离、信号传输、抗干扰等核心优势,成为电源、工控、汽车电子、医疗设备等领域不可或缺的基础器件。它看似结构简单、应用便捷,却藏着无数容易被忽略的“陷阱”,几乎每位硬件工程师都在光耦上过失效的
    的头像 发表于 04-23 11:18 150次阅读
    光耦失效的N种现场!工程师都<b class='flag-5'>踩</b><b class='flag-5'>过</b>的<b class='flag-5'>坑</b>

    BSP调试#05:MIPI DSI(RK3588)

       本合集的是我当初调试 RK3588 平台时的 原始笔记 ——只保留了那些的问题接口,没出过问题的内容全删掉了。文章框架如下: 其中, “调试过程” 章节可能有点意思(记录了
    的头像 发表于 04-17 11:54 5998次阅读
    BSP调试#05:MIPI DSI(RK3588)

    深耕电路板加工8年,从到精通,这些实操经验帮你少走90%弯路

    大家好,从事电路板(PCB)加工行业整整13年,从最初跟着师傅学习的学徒,到现在能独立负责从样品打样到批量量产的全流程,期间、总结的经验,今天一次性分享给大家——无论你是刚入行的新手,还是
    发表于 04-16 09:31

    PCB颜色选购避指南:别再被&quot;黑色高端&quot;忽悠了!

    做硬件这么多年,发现很多新手甚至部分老工程师选PCB颜色都:觉得黑色更高端、蓝色更好看、紫色更个性,结果投产之后要么良率暴跌,要么成本翻倍,最后还是老老实实换回绿色。今天就把PCB颜色选择的底层逻辑说透,看完再也不会
    的头像 发表于 03-26 14:06 153次阅读

    N沟道 vs P沟道MOS管,怎么选才不?一文搞懂选型关键

           在电子电路设计、元器件选型过程中,MOS管是最常用的开关/放大器件之一,而N沟道(N-MOS)和P沟道(P-MOS)的选择,直接决定电路能否稳定工作、成本是否可控,甚至会不会出现“烧管
    的头像 发表于 03-18 08:47 1016次阅读
    N沟道 vs P沟道MOS管,怎么选才不<b class='flag-5'>踩</b><b class='flag-5'>坑</b>?一文搞懂选型关键

    从零开始做嵌入式数字时钟,我的三个大坑

    作为一名刚完成嵌入式数字时钟项目的开发,回顾这段经历,真是一边一边成长。这个项目看似简单——不就是显示个时间吗?实际动手才发现,从“能跑”到“准时报时”,中间隔着好几个不眠之夜。今天就把我真实
    的头像 发表于 03-06 10:49 200次阅读
    从零开始做嵌入式数字时钟,我<b class='flag-5'>踩</b><b class='flag-5'>过</b>的三个大坑

    到高效落地:关键词搜索淘宝天猫商品列表 API 的实操心得

    到高效落地:关键词搜索淘宝天猫商品列表 API 的实操心得 (适合做:选品、比价、代购集运、店铺上货、数据分析、返利工具的同学直接落地) 一、开篇:为什么 90% 的人都会卡在「关键词搜索
    的头像 发表于 02-28 14:22 1501次阅读

    K8s生产环境10大记录复盘

    这篇文章记录了我这些年在 K8s 生产环境。每一个案例都是血泪教训,有些甚至导致了生产事故。希望通过分享这些经历,能帮助大家避免重蹈覆辙。
    的头像 发表于 02-05 15:51 696次阅读

    记ESP32CAM解决指南,已反映商家

    中国香河英茂科工没有一个鸭蛋是白吃的,没有一分钱融资是百花的,都转化为科技成果----记ESP32CAM解决指南,已反映商家 https://user.qzone.qq.com/382905282/blog/1770127464
    发表于 02-03 22:23

    智能工厂改造?有人物联网手把手教你挑对系统

    中小工厂砸几十万搞智能改造,结果了最冤的:花 “智慧工厂系统” 的钱,买的只是个 “升级款工厂监控系统”—— 只能看设备转不转,没法调生产、降能耗,钱直接打了水漂。智能改造选系统,真的像开盲盒
    的头像 发表于 12-19 14:20 409次阅读
    智能工厂改造<b class='flag-5'>踩</b><b class='flag-5'>坑</b>?有人物联网手把手教你挑对系统

    STM32 5 个容易的外设使用技巧

    STM32是嵌入式开发领域的热门MCU,功能丰富到几乎可以完成所有常见控制任务:GPIO、ADC、UART、定时器、DMA……应有尽有。但是,正因为功能强大,开发的机会也随之增多。很多初学者
    的头像 发表于 11-24 19:04 970次阅读
    STM32 5 个容易<b class='flag-5'>踩</b><b class='flag-5'>坑</b>的外设使用技巧

    JLink、RV Debugger及串口下载使用体验和

    自己搭配调试器或串口工具来进行,虽然造成了一定麻烦,却也是学习()的好机会。 以下将以调试器为顺序,简单叙述使用感受及过程中
    发表于 11-05 12:04

    自动化测试如何绕过Cloudflare验证码?Python + Selenium 脚本实战指南!

    01什么是Cloudflare验证码Cloudflare提供网络工具,并提供一套全面的安全功能,以保护网站免受各种在线威胁。Cloudflare验证码是一种用于区分人类用户和自动化机器人的功能。它是
    的头像 发表于 08-15 10:01 1621次阅读
    自动化测试如何绕过Cloudflare<b class='flag-5'>验证码</b>?Python + Selenium 脚本实战指南!

    UWB自动跟随技术原理、算法融合优化和实录

    UWB为什么是最靠谱的自动跟随技术?原理是什么?需要做什么算法融合、优化?我们在开发过程中
    的头像 发表于 08-14 17:45 1763次阅读
    UWB自动跟随技术原理、算法融合优化和<b class='flag-5'>踩</b><b class='flag-5'>坑</b>实录

    HarmonyOS5云服务技术分享--手机号登录教程

    ;requestPermissions\": [ {\"name\": \"ohos.permission.READ_SMS\"} // 如果需要自动读取短信验证码 ]` 三、核心
    发表于 05-22 15:37