不少开发者都讨厌网站的验证码,特别是写网络爬虫的程序员,而网站之因此设置验证码,是为了防止机器人访问网站,形成没必要要的损失。如今好了,随着机器学习技术的发展,机器识别验证码的问题比较好解决了。html
这里咱们采用wordpress的Really Simple CAPTCHA生成验证码的插件,之因此选择这个插件,一个是它的安装量很大,二个是由于它是开源的,咱们能够利用它批量的生成验证码图片。python
咱们经过demo网站得知,Really Simple CAPTCHA生成的是包含4个数字或者字母的图片,经过阅读源码得知,这个插件还屏蔽了O和I这两个比较容易混淆的字母,也就是说,还剩下32个字符,看来能够完成。
目前花费了两分钟。程序员
咱们要用到如下的工具和库。算法
为了达到目的,咱们首先要准备样本集,样本以下:网络
使用Really Simple CAPTCHA插件的源码,咱们很方便的批量生成10000个验证码图片和对应的结果,待咱们生成完成后,大概以下:机器学习
这地方你们能够根据本身的实际状况修改Really Simple CAPTCHA插件的源码,来生成本身想要的样本集。若是你觉着麻烦,也能够下载我生成好的。wordpress
目前为止,咱们花了五分钟。函数
咱们如今有了样本集了,咱们能够直接那图片和对应的结果直接进行神经网络的训练。
只要咱们的样本够多,最终也能达到咱们想要的效果。工具
但咱们也能够采用更好的训练方法,这个训练方法使用更少的样本数据,可是结果要比直接训练的方法好不少,我想你已经猜到了,这个方法就是把图片中的四个字符切割开,造成四个样本。这方法之因此可行,是由于全部的验证码图片都是4个字符的。学习
10000张图片,一张一张手动用PS去切割,确定不现实,并且因为图片的横向排列并非等间距的,字符间的距离大小不一致,手动切割确定不可能了。
其实咱们只要画出一个矩形,保证矩形框里只有字符就能够,而后从图片中切出这样的一个矩形,就造成了一个单个字符的图片样本。幸运的是,这个操做opencv已经帮咱们实现了,opencv有个函数叫作findContours(),能够按照一样色值的区域裁剪咱们想要的矩形。
-接下来咱们用opencv的findContours函数切割图片。
接下来,咱们就把图片从左到右进行切割,并存储切割后的图片,以及图片对应的字符。可是实际操做的过程当中,我发现一个问题,就是有时候两个字符靠的太近,致使opencv在切割的时候,把两个字符切割刀一个图片里了,好比:
切割完的效果是:
若是不解决这个问题,咱们的样本集就不许了,那训练出来的模型也就不可能正确了。个人解决方法是,首先设置一个字符宽最大的像素,若是超过这个像素,则认为一个图片中包含了两个字符,而后咱们选择把这个图片对半切割,分红两个字符。例如:
好,咱们如今获得了一个验证码图片对应的4个字符的图片,如今咱们把全部的样本图片都切割好,而后,把相同的字符对应的图片放到一个文件夹,这么作的目的是尽可能多的找出同一个字符的多种样式。结果以下:
到目前为止,我花了10分钟。
由于咱们只是识别图片对应的数字或者字母,因此咱们不须要特别复杂的神经网络算法。识别字符比识别小猫小狗的简单多了。
我这地方使用卷积神经网络,two convolutional layers and two fully-connected layers。
这地方对卷积神经网络算法就不作详细介绍,感兴趣的同窗,能够google学习一下。
训练完成后,咱们须要测试一下。15分钟花完。
整个过程看起来很简单:
下面是个人测试:
你能够从这获得完整的代码和示例图片,你能够参照README来运行相关的程序。