1.背景介绍这是个人的一个小项目,已经跑了2年了。最近目标网站改为扫码登录,所以作为技术分享发布。项目起源是女神参加的签到活动,我坚持了很久。后来觉得麻烦,中途放弃有点可惜。问能不能实现程序的自动登录+签到。我打开某个网站看了看。Python+selenium可以实现,但是人们要的是全自动,这就需要克服自动识别验证码的困难。懒惰永远是技术进步的源泉,但我也对机器视觉本身更感兴趣。那些年,小区和单位的大门都是车牌识别,我想借此机会来探讨一下这项技术到底是怎么回事。首先,城镇建筑有两张图,一张是准确率统计,一张是实战截图。其中动画只识别验证码,没有登录操作,仅用于效果展示。本文不会介绍太多的技术细节和理论原理,只是展示听起来高大上的人工智能+机器学习+计算机视觉,个人可以玩的场景非常多。对这个效果感兴趣的可以继续往下看:2、验证码分析:某网站的验证码比较复杂。模板一共有四组,有的用干涉线,有的用点阵来搭建字母,还有的进行的各种变形,也是用七种颜色渲染出来的。先去网上看看有没有现成的轮子。方法很多,简单的方法实现起来不费事。1.先试试谷歌的tesseract和pytesser3。它们都是一样的东西。代码极其简洁,两三行就会产生结果。勉强可以接受。结果,驴的嘴唇和马的嘴不对。2.本着简明扼要的原则,我还是打算依赖pytesser3,给它喂合适的数据,把验证码转成灰度图,二值化,过滤降噪,模糊各种手段,还要测试4位验证码分割成4张小图,以单字识别的形式提高其准确率。但是不管用什么方式来迎接它,识别效果都差了很多。3.只有终极大招,机器深度学习+卷积神经网络,搞了半天才进这个坑。这么大的坑我能爬出来吗?经过一个多星期的学习,跑出了建城图的效果,稳定运行了2年。大致的调试过程我可以简单分享一下。3、开发调试过程cnn模型训练需要训练集和测试集。对于这两个数据集,计算机需要知道答案,那么知道答案的数据是怎么来的呢?1、先写一个脚本,收集目标网站代码的200个验证码,手动标注,将答案作为验证码图片文件名的前4个字符。2、人肉标记效率太低。花钱打标?还不够,写个小程序签到玩,还需要投资?然后自己生成一批。观察目标网站的验证码,扭曲、模糊、加线的方法与谷歌开源的验证码开发包颇为相似。下次再来模拟一下。包是java的,在eclipse中稍微改动一下,一次午餐时间生成了50万个带答案的验证码。像这样,文件名的前4个字符就是答案。3.有了训练集,我们来搭建训练和部署环境。基于简单性和通用性的考虑,这次不会对验证码图片进行裁剪,整体丢给机器进行训练。4、验证效果的时候到了。程序调好后,训练集和测试集丢给程序,6W数据CPU需要跑一夜,而GPU只需要20分钟。以我50W的数据,GPU半个晚上就训练完了。下面是第二天早上在实验环境下的数据。实验环境是指:训练集、测试集、测试集均由同一个系统生成。准确率达到97.3%。那么在实际环境中,效果如何呢?实际环境指的是训练集,测试集是自己写的代码生成的。测试集是从目标网站收集的,人工标注的。真实环境只有85%,有点低吧?把所有的错误都找出来,找出原因:我这样识别错误,机器给我指出错误答案,让我很惭愧。但感觉很好。还有这种东西,明明那么明显,认人肉怎么会错呢?后来看键盘,7和U靠得太近了,肯定手滑了。排除这些人工标记错误,真实环境下的准确率达到90%。基本上可以满足自动登录的要求。5.如何提高准确率后来我进一步思考,有没有什么办法可以让准确率更高呢?实验环境和真实环境有什么区别?有7%的差距吗?目标网站一定有一些我没有观察到的微调。比如这张:左边六张图是模拟生成的验证码,右边一张是目标网站人肉发送的验证码。肉眼看起来很像,但字体上似乎有细微差别,导致实验环境和真实环境有7%的精度误差。解决这个问题,有两种方式:1.人肉打出足够多的代码作为Testset,再训练。效果应该不错,但是缺点也很明显,人肉码哪有那么大的功夫。或者你有时间,你就是偷懒,非要用技术来解决。这样一来,似乎就有了办法。苹果的AI登场就是为了治愈这种懒惰。参见方法二。2.关键字:simgan。仔细研究了两篇相关论文,觉得自己有些想法,于是决定试一试。6.进阶实验提高准确率经过十多天的实验(一次训练时间太长),对simgan的原理有了更深的理解,SimGAN-Captcha的实验也完全复现,再扩展应用转到您自己的环境以进行示例增强。实验过程遵循这样的思路:首先重现SimGAN-Captcha过程。然后将灰度图改为RGB,通过未标注的真实数据和标注的模拟数据训练SimGAN-Captcha,通过训练好的模型,Refine上面提到的500,000+10,000模拟训练数据,并通过RefinedData,重新训练验证码识别模型,以及比较统计精度。但是效果并不好,甚至肉眼也无法发现像素级的差异。可以说模拟的很逼真,也可以说Refine没有任何效果。它甚至让人怀疑SimGAN-Captcha是否有效。于是又用了一个验证码生成器生成了完全不同的验证码,并用SimGAN-Captcha在像素级对新的验证码进行了强化,以证明Refine确实有效。经过50多个小时的训练,SimGAN-Captcha具有明显的增强效果。例如:为了表达方便,我们从左到右依次称它们为1号、2号、3号、4号。1号是完全不同的算法X生成的验证码,心灰意冷。3号和4号是上述目标网站不同形式的真实验证码。将AlgorithmX生成的1st-like验证码作为Synthetic数据集,使用类似于3号和4号的验证码作为真实数据集,将合成验证码提炼为2号。仔细观察No2、No.3和No.4已经有了很多特点,比如:1.不再凌乱,变得更亮了,P、K、H的颜色对比更明显;2、干涉线有颜色断点,这个特点很好的模拟了3号样品;3.字母P和E和4号一样有点阵效果,SimGAN应该擅长模拟点阵。如果把干扰线扭曲了,那它就难办了。看来SimGAN确实有效。它可以在像素级别尽可能地将模拟样本转换为真实样本。不过,即使变换得“像一些”,对提高准确率似乎也没有多大帮助。使用Google的验证码生成的验证码作为Synthetic数据集,目标网站的验证码作为真实数据集进行训练,然后使用这样的模型生成CNN的训练集和测试集,然后进行测试目标网站的验证码。增长率不到0.5%。使用上述算法X生成的验证码作为Synthetic数据集,目标网站的验证码作为真实数据集进行训练,然后使用这样的模型生成cnn的训练集和测试集去训练cnn,直接用X算法生成训练集和测试训练出来的CNN模型,在正确率的对比中只增加了0.1%。把上面的过程用文字描述一下,已经很绕口了。在实际训练中,尽量安排在晚上或周末进行。总共花费了400到500个小时的培训时间。花了这么大的时间成本,才取得这么小的成绩。进步毫无价值。而当我绕了一大圈,回到起点的时候,我尝试着加强cnn的训练,提高对它的要求。我没有在准确率达到99%时停止训练,而是在准确率达到200%时才停止训练(类似于while1周期),仅吃一顿午餐后准确率就提高了2.2%。使用同样的600个实验数据进行对比,上篇准确率为97.33%,这次提高到99.5%,比如城镇建筑图。对于验证码识别,苦练正道才是王道,而SimGAN并没有这么好的效果。SimGAN应该有自己擅长的领域。验证码增强不好,图片增强效果好吗?上面提到的AppleAI首秀中的论文,眼球控制图像的样本增强,似乎效果不明显。我也完成了复现,效果很好,有机会再分享。
