本文使用卷积神经网络(CNN)破解CAPTCHA验证码,主要基于参考资料中的两种方案进行了优化和整合,在此致谢!
CAPTCHA验证码是目前互联网上常见的一种图灵测试,用来区别“机器”和人类。当然,有了AI的加持,机器也就能像人类一样聪明地识(破)别(解)了。
但是上图中的验证码白底黑字,间距分明,显得过于简单了,为了增加挑战性,采取了以下这种验证码。而且,在Python中,可以通过加载capthcha.image
工具库就能轻松地生成。
Python 3 keras 2.0 (2.0以前版本会有编译错误) OpenCV
- 运行
captcha_generator.py
生成并保存验证码图片,可根据需要修改训练集的数量。 - 运行
model.py
进行卷积神经网络训练,模型和权重保存为captcha_model.hdf5
。 - 运行
predict_with_model.py
,加载权重文件,进行预测。
参考资料1中的破解方法简单粗暴,构建了一个很深的神经网络,然后把整张图片喂给模型训练,对应4个字符标签。这个模型比较复杂,而且如果用CPU来计算时间就很长了。我想到,如果能够先把图片预处理一下,识别出原图中4个字符的位置,然后单独训练,不就能大大简化训练模型和计算量了嘛。于是,进行了图片预处理和采用了两层卷积模型。
在把图像转换为灰度图像后,用OpenCV中的findContours
函数能帮助我们轻松找到轮廓边界。但是,问题来了,原图中的噪声点(线)会干扰边界判断。用cv2.medianBlur(img, filter_size)
就能很好地解决这一类似胡椒面问题,把符合filter_size的噪点过滤掉,然后就基本准确地识别出每个字符的边界了。
如果两个或多个字符黏连,那长宽比肯定会异常,就进行一下切割。
两层的网络就足够啦。
15代训练后,单个字符的准确率为97.7%,CPU计算时间,大概5分钟不到。
使用训练完的权重进行预测,把四个字符标签都一一对应算作识别成功,准确率大概在50%。考虑到可以让程序不断尝试提交,在网速能保证的情况下基本满足要求。
所谓魔高一尺道高一丈,现在新型验证码层出不穷,就是为了防止不(聪)法(明)分(机)子(智)破解的。 比如下面这种需要滑动鼠标拼图的,原理是检测鼠标运动轨迹。网上也已经有破解攻略了。
但是,遇到12306这种丧心病狂的,也只能尴尬地微笑了o( ̄︶ ̄)o
参考资料: