前言

验证码相信大家都遇到过,不胜其烦的一次次输入错误是不是让你一度崩溃过,今天就教大家如何用黑科技解决验证码的问题。

按照国际惯例,在这里先喂自己袋盐,可视化(tableau)和毕业设计(matlab)的小伙伴,可订阅以下博主精心整理的三个专栏。

tableau可视化数据分析高级教程

https://blog.csdn.net/wenyusuran/category_9596753.html

MATLAB深入理解高级教程(附源码)

https://blog.csdn.net/wenyusuran/category_2239265.html

深度学习100例全系列详细教程

https://blog.csdn.net/wenyusuran/category_9596890.html

在博主的资源中也有各种算法的应用实例源代码,需要的小伙伴自取哟。

captcha

captcha 是用 python 写的生成验证码的库,它支持图片验证码和语音验证码,我们使用的是它生成图片验证码的功能。

首先我们设置我们的验证码格式为数字加大写字母,生成一串验证码试试看:

数据生成器

训练模型的时候,我们可以选择两种方式来生成我们的训练数据,一种是一次性生成几万张图,然后开始训练,一种是定义一个数据生成器,然后利用 fit_generator 函数来训练。

第一种方式的好处是训练的时候显卡利用率高,如果你需要经常调参,可以一次生成,多次使用;第二种方式的好处是你不需要生成大量数据,训练过程中可以利用 CPU 生成数据,而且还有一个好处是你可以无限生成数据。

我们的数据格式如下:

X

X 的形状是 (batch_size, height, width, 3),比如一批生成32个样本,图片宽度为170,高度为80,那么形状就是 (32, 80, 170, 3),取第一张图就是 X[0]。

y

y 的形状是四个 (batch_size, n_class),如果转换成 numpy 的格式,则是 (n_len, batch_size, n_class),比如一批生成32个样本,验证码的字符有36种,长度是4位,那么它的形状就是4个 (32, 36),也可以说是 (4, 32, 36),解码函数在下个代码块。

上面就是一个可以无限生成数据的例子,我们将使用这个生成器来训练我们的模型。

使用生成器

生成器的使用方法很简单,只需要用 next 函数即可。下面是一个例子,生成32个数据,然后显示第一个数据。当然,在这里我们还对生成的 One-Hot 编码后的数据进行了解码,首先将它转为 numpy 数组,然后取36个字符中最大的数字的位置,因为神经网络会输出36个字符的概率,然后将概率最大的四个字符的编号转换为字符串。

构建深度卷积神经网络

模型结构很简单,特征提取部分使用的是两个卷积,一个池化的结构,这个结构是学的 VGG16 的结构。之后我们将它 Flatten,然后添加 Dropout ,尽量避免过拟合问题,最后连接四个分类器,每个分类器是36个神经元,输出36个字符的概率。

模型可视化

得益于 Keras 自带的可视化,我们可以使用几句代码来可视化模型的结构:

这里需要使用 pydot 这个库,以及 graphviz 这个库,在 macOS 系统上安装方法如下:

brew install graphviz
pip install pydot-ng

我们可以看到最后一层卷积层输出的形状是 (1, 6, 256),已经不能再加卷积层了。

训练模型

训练模型反而是所有步骤里面最简单的一个,直接使用 model.fit_generator 即可,这里的验证集使用了同样的生成器,由于数据是通过生成器随机生成的,所以我们不用考虑数据是否会重复。注意,这段代码在笔记本上可能要耗费一下午时间。如果你想让模型预测得更准确,可以将 nb_epoch改为 10 或者 20,但它也将耗费成倍的时间。注意我们这里使用了一个小技巧,添加 nb_worker=2 参数让 Keras 自动实现多进程生成数据,摆脱 python 单线程效率低的缺点。如果不添加,耗时120秒,添加则只需80秒。

测试模型

当我们训练完成以后,可以识别一个验证码试试看:

计算模型总体准确率

模型在训练的时候只会显示第几个字符的准确率,为了统计模型的总体准确率,我们可以写下面的函数:

这里用到了一个库叫做 tqdm,它是一个进度条的库,为的是能够实时反馈进度。然后我们通过一些 numpy 计算去统计我们的准确率,这里计算规则是只要有一个错,那么就不算它对。经过计算,我们的模型的总体准确率在经过五代训练就可以达到 90%,继续训练还可以达到更高的准确率。

模型总结

模型的大小是16MB,在我的笔记本上跑1000张验证码需要用20秒,当然,显卡会更快。对于验证码识别的问题来说,哪怕是10%的准确率也已经称得上破解,毕竟假设100%识别率破解要一个小时,那么10%的识别率也只用十个小时,还算等得起,而我们的识别率有90%,已经可以称得上完全破解了这类验证码。

改进

对于这种按顺序书写的文字,我们还有一种方法可以使用,那就是循环神经网络来识别序列。下面我们来了解一下如何使用循环神经网络来识别这类验证码。

CTC Loss

这个 loss 是一个特别神奇的 loss,它可以在只知道序列的顺序,不知道具体位置的情况下,让模型收敛。在这方面百度似乎做得很不错,利用它来识别音频信号。(warp-ctc)

那么在 Keras 里面,CTC Loss 已经内置了,我们直接定义这样一个函数,即可实现 CTC Loss,由于我们使用的是循环神经网络,所以默认丢掉前面两个输出,因为它们通常无意义,且会影响模型的输出。

  • y_pred 是模型的输出,是按顺序输出的37个字符的概率,因为我们这里用到了循环神经网络,所以需要一个空白字符的概念;

  • labels 是验证码,是四个数字;

  • input_length 表示 y_pred 的长度,我们这里是15;

  • label_length 表示 labels 的长度,我们这里是4。

模型结构

我们的模型结构是这样设计的,首先通过卷积神经网络去识别特征,然后经过一个全连接降维,再按水平顺序输入到一种特殊的循环神经网络,叫 GRU,它具有一些特殊的性质,为什么用 GRU 而不用 LSTM 呢?总的来说就是它的效果比 LSTM 好,所以我们用它。

模型可视化

可视化的代码同上,这里只贴图。

可以看到模型比上一个模型复杂了许多,但实际上只是因为输入比较多,所以它显得很大。还有一个值得注意的地方,我们的图片在输入的时候是经过了旋转的,这是因为我们希望以水平方向输入,而图片在 numpy 里默认是这样的形状:(height, width, 3),因此我们使用了 transpose 函数将图片转为了(width, height, 3)的格式,然后经过各种卷积和降维,变成了 (17, 32),这里的每个长度为32的向量都代表一个竖条的图片的特征,从左到右,一共有17条。然后我们兵分两路,一路从左到右输入到 GRU,一路从右到左输入到 GRU,然后将他们输出的结果加起来。再兵分两路,还是一路正方向,一路反方向,只不过第二次我们直接将它们的输出连起来,然后经过一个全连接,输出每个字符的概率。

数据生成器

评估模型

我们会通过这个函数来评估我们的模型,和上面的评估标准一样,只有全部正确,我们才算预测正确,中间有个坑,就是模型最开始训练的时候,并不一定会输出四个字符,所以我们如果遇到所有的字符都不到四个的时候,就不计算了,相当于加0,遇到多于4个字符的时候,只取前四个。

评估回调

因为 Keras 没有针对这种输出计算准确率的选项,因此我们需要自定义一个回调函数,它会在每一代训练完成的时候计算模型的准确率。

训练模型

由于 CTC Loss 收敛很慢,所以我们需要设置比较大的代数,这里我们设置了100代,然后添加了一个早期停止的回调和我们上面定义的回调,但是第一次训练只训练37代就停了,测试准确率才95%,我又在这个基础上继续训练了一次,停在了25代,得到了98%的准确率,所以一共训练了62代。

测试模型

这次随机出来的验证码很厉害,是O0OP,不过更厉害的是模型认出来了。

有趣的问题

我又用之前的模型做了个测试,对于 O0O0 这样丧心病狂的验证码,模型偶尔也能正确识别,这让我非常惊讶,它是真的能识别 O 与 0 的差别呢,还是猜出来的呢?这很难说。

总结

模型的大小是4.7MB,在我的笔记本上跑1000张验证码需要用14秒,平均一秒识别71张,估计可以拼过网速。至于深度学习到底能不能识别双胞胎,相信各位已经有了答案。

喜欢博主的小伙伴,请一键三连哟。

黑科技教你一招如何解除 生活中烦人的验证码问题相关推荐

  1. 鸿蒙系统通知栏怎么清理,教你两招 彻底关掉手机通知栏烦人的无用通知

    相信很多朋友都跟我一样,在使用安卓手机时,遇到这样一个十分令人烦躁的问题:通知栏经常会弹出一堆无用的通知.有些自带的APP从来没用过,但各种通知推送从来没断过.而且每次清除后,过不了多长时间通知栏又是 ...

  2. 什么软件可以测试对方把你电话拉黑,不打扰对方,如何检测微信里有没有人把你拉黑?教你一招!...

    原标题:不打扰对方,如何检测微信里有没有人把你拉黑?教你一招! 小编最近发现 大家其实都不太会用微信和QQ-- 行吧 看在你们这么 不会用QQ和微信的份上 小编今天就教教你们 微信未读消息的聊天图片与 ...

  3. 测试拉黑微信软件,如何检测微信里有没有人把你拉黑?教你一招!

    原标题:如何检测微信里有没有人把你拉黑?教你一招! 本文转载自微信公众号:一只学霸(ID:bajie203) 团团最近发现 大家其实都不太会用微信和QQ-- 看在你们这么 不会用QQ和微信的份上 团团 ...

  4. 如何记录2秒内实现1800度转体+翻腾,百度智能云黑科技教你看懂跳水

    百度智能云与中国国家跳水队协同推进人工智能与体育跨界合作再进一步,正在为我国AI+体育的应用探索开拓一片新的大陆.4月22日,百度与中国国家跳水队举行合作启动仪式,百度智能云正式成为中国国家跳水队独家 ...

  5. 测试微信拉黑软件,如何检测微信里有没有人把你拉黑?教你一招

    微信和QQ,你真的会用吗? 行吧 看在你们这么 不会用QQ和微信的份上 今天就教教你们 微信未读消息的聊天图片与视频 失效时间是72小时 如果72小时内没有查看 会自动失效 手机聊微信的时候 在十秒钟 ...

  6. 在外包干了三年,我废了,不吹不黑,教你几招避坑指南

    最近也有不少读者来问我:我拿到了两个offer,一个小企业XX职位,一个某大厂的外包岗位,怎么选择啊? 我一般都是建议不要去外包,不是我对外包有多大仇恨,也不是有意甩锅外包公司,人家也是企业,也是靠实 ...

  7. 图麟科技多项“黑科技”将亮相智博会

    文章来源:ATYUN AI平台 "全自动智能化无人工厂.0.1秒锁定嫌疑犯.'刷脸'无障碍进出的无人超市,"这不是对美好世界的憧憬,而是真真切切能触碰到的现实场景.8月23日,全球 ...

  8. iphone11看信号强度_你的 iPhone 信号有多差?教你一招查询信号强度

    原标题:你的 iPhone 信号有多差?教你一招查询信号强度 最近,好多人跟小卫吐槽新iphone信号不好! 虽说iPhone 11价格是真香,但终究没有逃脱信号差的问题. 唉,这也不能怪苹果,只能说 ...

  9. 冬奥闭幕式黑科技再次引爆全网,AR中国结、折柳寄情……还有212项科技藏在冬奥里...

    明敏 发自 凹非寺 量子位 | 公众号 QbitAI 冬奥会开幕式用一众黑科技炸翻全网,闭幕式当然也不甘示弱. 用AR (增强现实)合成的万千红丝带,在空中翻飞腾舞.最终编织成象征着吉祥团结的中国结: ...

最新文章

  1. 模型压缩、模型剪枝、模型部署
  2. 利用python进行数据分析第二版学习笔记
  3. 黑马程序员---面向对象笔记总结
  4. 揭秘!如何用Flutter设计一个100%准确的埋点框架?
  5. 几何画板如何绘制动态正切函数图像
  6. struts2环境搭建教程
  7. 使用HbuilerX运行微信小程序到微信小程序模拟器
  8. gitlab发邮件收不到
  9. ICC编译器生成优化报告
  10. ES5和ES6的区别。
  11. JavaScript的入门(下)
  12. android11最新版本是多少,Android11正式发布 安卓11正式版系统发布更新时间
  13. Python 螺旋正方形
  14. LaTeX中TikZ绘图备忘二
  15. java计算机毕业设计基于springboo+vue的幼儿园管理系统
  16. 微信运营,做好微信朋友圈营销的6个技巧和3点注意事项
  17. 【安全资讯】这个团伙贩卖公民个人信息6亿余条
  18. Python-OpenCV读取视频文件
  19. R语言-HTML 基础与R语言解析
  20. 华工计算机基础知识随堂作业答案,新版华工《计算机应用基础》随堂练习.doc...

热门文章

  1. Sql 查询当天、本周、本月记录
  2. JavaScript文档
  3. Java:Comparable接口
  4. android上使用git
  5. CSP认证201612-3 权限查询[C++题解]:模拟题、结构体、set、有点复杂
  6. python关键字是什么颜色,python – Matplotlib:如果使用关键字sym,则使用Boxplot异常值颜色更改...
  7. java exec执行tar_用java调用rpmbuild 报错,同一条命令直接复制到终端却能运行
  8. mysql主从复制自增_关于mysql主从复制自增长列
  9. c语言影碟出租程序设计总结,vc++影碟出租系统的设计与开发
  10. php pdo bind,PHPPDOStatement对象bindpram()、bindvalue()和bindcolumn之间的区别_php技巧