关于验证码cnn识别的一些笔记

本文介绍了一种使用深度学习技术自动识别复杂验证码的方法,通过自动生成大量样本训练卷积神经网络(CNN),实现了较高的识别准确率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、问题的引出:

老婆迷上某网站的签到活动,坚持了好久,最近开始嫌麻烦了,中途放弃又觉得可惜,于是问我能不能实现程序自动登录+签到。我打开某网站看了下,python+selenium就可以实现,python有丰富的轮子,几行简单的代码就实现了手输验证码的半自动登录+签到。但这不符合老婆的要求,老婆是根本不想操心这件事了,不想每天记得还有任务要完成,再去打开程序输个验证码,人家要的是全自动!这就需要把这个验证码识别难点攻克掉了。懒永远是技术进步的源动力啊,不过我对机器视觉本身也比较感兴趣,现在小区和单位的门口都是车牌识别了,也打算探究一下这门技术是怎么回事。

二、分析验证码:

某网站的验证码还是挺复杂的,有几套模版,有的加了干扰线,有的是用点阵构建字母,有的进行的各种扭曲,还渲染上了七彩色。

先去网上看看有没有现成的轮子,方法很多,简单的方法能实现,就不用麻烦的。

1、先试试谷歌的tesseract、pytesser3,都是一回事,代码极其简洁,两三行就出结果,勉强可以接受吧,规规矩矩的字,识别率还挺高,但稍加变形,结果就驴唇不对马嘴。

2、本着一切从简的原则,还是打算依赖pytesser3,给它喂适合它的数据,把验证码转灰度图、二值化、滤波降噪、模糊各种手段组合着用,还测试了4位验证码切割成4张小图片,以单字符识别的形式提高它的准确率。不过不论你用什么手段往它身上招呼,识别效果都差的远着呢。

3、只有祭出终极大招了,机器深度学习+卷积神经网络,在入这个坑之前,做了好久好久的心理建设,python是老婆提出需求后才研究的,那么简单的tesseract,光是环境配置都折腾了好久。cnn这么大的坑我爬的出来嘛?有言论说想跳这个坑的,因为配置环境复杂,90%的人都放弃了,还有5%的人各种报错,最终能把代码跑起来的不到3%。

恩,我最终跑出来了,经过了一个星期的学习,从换显卡开始动手操作到训练完毕跑出测试结果,24小时完成。所以才有了这篇文章,简单记录一下大致过程吧。

在轮子丰富的python世界,代码显得不那么重要,似乎整体工程跑下来也没写几行代码。最最最重要的还是环境搭建,特别感谢这个大神:http://www.gongyesheji.org/?p=951 通过他的帖子,我节约了大量时间,回避了很多版本不匹配导致的坑(tesseract就遇到类似的坑无数)整个tensorflow-gpu1.13.1的环境就是参照他走过的路搭出来的。在读这个帖子之前,我已经有了win7+python3.7.1的环境,但是显卡不行,突然记起仓库里有几块新的GT1030呢,刚好是这篇帖子提到的6.1算力的高性价比神器。一直觉得又不打游戏,核显就挺好了,机箱里多一个风扇,耳边就多一份噪音。现在该把它拿出来换上了。

 

环境有了,我们回归到问题本身。以cnn的思路重新考虑问题。cnn需要训练集和测试集的,这两个数据集,机器需要知道答案,那么知道答案的数据怎么来?

1、先写个脚本,采集了200份目标网站的验证码,人工打上标签。

2、人肉打标效率太低。花钱打标?不至于吧,自己写个小程序签到玩,还要投资?那就自己生成一批吧。观察目标网站的验证码,扭曲、模糊、加线的手法挺象谷歌开源验证码开发包的,下一个回来,模拟一下。包是java的,在eclipse里略做改动,一顿午饭的时间就生成了50万张带答案的验证码。类似这样,文件名前4个字符就是答案。

3、训练集有了,下面搭建训练和部署环境,我参考了这位大神的文章 https://www.jianshu.com/p/80ef04b16efc

这位大神致力于通用验证码识别方案,图片不切割,整体丢给机器去训练。

三、实现效果

又无数次地从坑中爬出来,到了收获的时候了。程序调好,刚好下班,把训练集和测试集丢给机器,据说6W数据CPU要跑一晚上,GPU只用20分钟。我这50W数据,GPU半个晚上也就训练完了。这是第二天早上,实验环境下的数据,实验环境是指:训练集,测试集,考试集都是用同一套系统生成的。准确率达到97%。

那么在实际环境中,效果如何呢?实际环境是指训练集,测试集是通过系统生成的。而考试集是从目标网站采集回来并人工标识的。

真实环境才85%,有点低了对不对?把错误的都找出来查找一下原因:

类似这样的错误,是我看错了,机器给我指出了答案不正确,让我自愧不如啊。不过这感觉挺美妙的。

还有这种的,这么明显,怎么可能人肉错呢,后来一看键盘,7和U离得太近,肯定手滑了。排除这些人工标识出错,真实环境的准确率达到90%了。基本能符合自动登录的要求了。

后来我还在考虑,还有没有什么办法可以让准确率更进一步呢?实验环境和真实环境差在哪里,有7%的差距呢?目标网站一定是有哪些微调我没有观察到。比如这张:

左六图是谷歌开发包生成的验证码,右一图是人肉从目标网站上打来的码。肉眼看上去很象,字体上似乎有微小的差别,导致了实验环境与真实环境7%的准确率误差,要解决这个问题,有两个办法:

1、人肉打出足够多的码,以此为测试集,重新训练。效果应该不错,可是缺点也显而易见,哪有那么多功夫去人肉打码。或者有时间,就是懒,你用技术去解决啊。这么一说,好像也有办法,Apple 的AI首秀就是治这种懒的,见办法2。

2、关键字:simgan。认真研究了这两篇文章,觉得有搞头啊,签到小程序当然用不上了,以后有类似项目需要高精度时,可以参考。  https://blog.youkuaiyun.com/shenxiaolu1984/article/details/76160306

https://blog.youkuaiyun.com/omnispace/article/details/78256191

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值