一、问题的引出:

老婆迷上某网站的签到活动,坚持了好久,最近开始嫌麻烦了,中途放弃又觉得可惜,于是问我能不能实现程序自动登录+签到。我打开某网站看了下,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.csdn.net/shenxiaolu1984/article/details/76160306

https://blog.csdn.net/omnispace/article/details/78256191

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

  1. 4位数字验证码图片识别 +tensorflow+CNN

    4位数字验证码图片识别 +tensorflow+CNN 跟着视频写了以下代码,精度设置在0.8的时候保存模型,然后验证结果还不错.有兴趣的同学可以一起讨论 import numpy as np imp ...

  2. 基于Tensorflow和CNN实现验证码图片识别

    卷积神经网络自从被提出开始,就受到人们的广泛欢迎,它在图像识别.语音识别.自然语言处理任务中扮演着重要的角色,在此基础上衍生出的网络模型更是层出不穷.进行验证码识别时,使用传统的Tesseract O ...

  3. 记一次 基于 卷积神经网络(CNN)的 验证码图片识别

    前几天搭建好了tensorflow2的环境,今天来试验一下神奇的机器学习. 先简单编写一个java程序,收集了10000多个验证码图片,全部进行人工标注(训练素材点击下载),其中600多个用来检验预测 ...

  4. java 验证码图片识别_JavaSE图像验证码简单识别程序详解

    本文为大家分享了JavaSE图像验证码简单识别程序,供大家参考,具体内容如下 首先你应该对图片进行样本采集,然后将样本进行灰度处理,也就是变成黑白两色. 然后你就可以使用该类,对目标文件进行分析.具体 ...

  5. cnn识别cifar10、cifar100(pytorch)

    下面的代码是cnn识别cifar10,如果是cifar100,将数据集的改成cifar100,然后模型的输出神经元10改为100即可. import torch,torchvision import ...

  6. Python网络爬虫开发实战,微博宫格验证码的识别

    本节我们来介绍一下新浪微博宫格验证码的识别,此验证码是一种新型交互式验证码,每个宫格之间会有一条指示连线,指示了我们应该的滑动轨迹,我们需要按照滑动轨迹依次从起始宫格一直滑动到终止宫格才可以完成验证, ...

  7. Class 18 - 1 图形验证码的识别

    一.图形验证码的识别 先将验证码的图片保存到本. 打开开发者工具,找到验证码元素.验证码元素是一张图片,src 属性是 CheckCode.aspx.打开链接 http://my.cnki.net/e ...

  8. 最新Discuz验证码和PhpWind验证码的识别

    需验证码识别,对常用论坛的验证码识别的时候大家用来做群发是最合适不过了.一个非常有意义的参考 注:非crazycoder原装,文章是转载的,原文出处不祥了,很多地方都有,找不到原出处了 验证码(cap ...

  9. 【验证码的识别】—— 极验验证码的识别

    前言 (结尾有彩蛋欧) 目前,许多网站采取各种各样的措施来反爬虫,其中一个措施便是使用验证码.随着技术的发展,验证码的花样越来越多.验证码最初是几个数字组合的简单的图形验证码,后来加入了英文字母和混淆 ...

最新文章

  1. Spring研究笔记------事务探究
  2. 皮一皮:老外这是人傻钱多啊...
  3. 【物联网】QCA4010之SNTP协议
  4. .NET网站国际化策略
  5. java迭代器删除两个_两个迭代器的故事
  6. 单片机sleep函数的头文件_单片机代码模块化设计思想浅谈
  7. java查询数组中元素的索引
  8. java开发面试中经常问到的问题(2019年5月)
  9. pythonmkdir语法错误_Python mkdir一个有难度的问题
  10. 什么是网关软件?国内有好的资源网关软件吗?
  11. php微信个性化菜单,微信公众平台开发:个性化菜单接口说明
  12. 蝶形算法(Butterfly Algorithm)未更完
  13. 图像融合算法及多视角(多源)信息融合总结
  14. linux 如何重建mbr,双系统如何删除Linux,恢复Windows从MBR引导启动?
  15. 计算机怎么求标准偏差,如何计算Excel标准偏差?您必须知道这两个技巧
  16. Zedboard 运行linaro操作系统
  17. 车辆出险保险索赔技巧——让每个车友都能学习
  18. SAP CDS UI 常用注解用法
  19. 为什么成年人都不学习了
  20. Python xlwings Excel单元格部分内容添加下划线

热门文章

  1. Dubbo学习-注册中心
  2. mysql灰度更新_灰度发布策略
  3. 【那千古永恒不变的信念】
  4. uni-table 行点击分页选择、分页修改
  5. 有选择的人从来都谈不上落魄,过着没有选择,不得已的生活才叫落魄
  6. 数控,模具,首选广大模具数控学校
  7. 给activity设置半透明背景
  8. springmvc+mybatis实现简单的图书管理系统
  9. 牛码宝宝 - Sprint log (No.7)
  10. Google Map Api 谷歌地图接口