用Python识别验证码

举报
开飞机的大象 发表于 2018/12/24 14:47:30 2018/12/24
【摘要】 爬虫过程中难免会碰到验证码,各种各样的验证码似乎阻挡了爬虫的脚步。

由于本文实现的功能是在内网环境完成,因此,没有代码介绍,也没有识别效果展示。

爬虫过程中难免会碰到验证码,各种各样的验证码似乎阻挡了爬虫的脚步。

为了识别机器和真实用户而诞生的爬虫

碰到验证码有两个方法解决:

  • 将代码提交到“打码平台”,付费完成打码

  • 自己写代码完成验证码识别的过程

打码平台

为了识别验证码花钱,显然不符合「极客精神」,既然我们已经会写Python,为啥不自己写一个方法来识别呢?

我在写一个自动抢会议室的系统,但是抢会议室的过程中,需要输入验证码才可以完成预定。

这个验证码比较简单,只有4位阿拉伯数字组成。形式大概和下面图片比较类似,但图片的噪音比下面要严重得多。由于验证码都在公司办公环境,所以无法导出来。

一开始,我写了一些图像预处理的方法,流程大概有以下几步:

  1. 读取图片,并调整图像尺寸

  2. 对图片进行灰度处理

  3. 手动设置阈值,对灰度图像进行二值化处理

  4. 遍历整张图像,扫描图像黑色像素连接区域,将范围太小的黑色像素块去除

  5. 对图像横纵坐标进行扫描,取出完整的图像

  6. 到第5步,我得到的图像像素是6*10,缩小图像尺寸,可以更好地保留结果信息,减少由于旋转,拉伸等形态变换带来的图像差异,像素不大,但已经足够区分不同的数字了。

编码之前,我手动从网站上下载验证码,并进行标注,得到了50副图像。0-9每个数字大约有20张图片「这个过程实在是太无聊了,我只想赶紧结束人力标注的行为」

由于验证码数据样本实在太少,在一开始的尝试的传统机器学习与深度学习方法都毫无例外失败了。

我尝试了以下方法:

  • 在mnist数据集的基础上使用TensorFlow搭建神经网络

  • LibSVM

  • KNN

  • 线性回归

  • GBDT

实际上使用mnist数据集来训练,是不合理的。因为即使是阿拉伯数字,我遇到的验证码里的样式和mnist中的样式还是存在不小的差异,这会导致识别率一直无法提升。

mnist数据集

后来我想到了一个方法,图像里的信息既然只有阿拉伯数字,总共只有10类,而且每张图片中都是固定的4个数字。

那我能不能用简单的方法进行比对?建立一个样本图像库,对测试图片进行预处理以后,得到分割4张6*10的二值化图片,与样本图像库进行图像上的比对,最后进行结果进行统计,归类,得到最终预测值。

预处理后得到的图片(图片来自:字符型图片验证码识别完整过程及Python实现

图像预处理的方法前面已经完成了,关键是用什么方法来进行图像比对呢?

一开始我想的很简单,直接对每张样本图片I1与测试图片I2相同坐标的像素进行逐一比对,计算I1I2的相同坐标的像素相等的数目,最后求均值,得到10个分值,分数高的就是预测结果。

这个计算方法看起来可行,但是在实际使用的时候有一些问题

  • 因为要遍历所有图片的所有像素,计算起来非常慢!

  • 由于原始验证码图片添加了大量噪音,虽然做了降噪处理,但得到的同一类别图片之间还是存在较大差异。因此,如果用像素完全匹配的方法,容易有误判。


后来我找到了一个方法,先对样本图像进行编码转换。得到一个能体现图像特征的code,再将这些样本图像的code全部保存起来。这样下次要使用的时候,就不必每次都读一遍图片啦!

图片转code的方法我选择的hash转换,过程大致如下:

  • 缩放:图片缩放为8*8

  • 求平均值:计算灰度图所有像素的平均值

  • 比较:像素值大于平均值记作1,相反记作0,总共64位

  • 生成hash:将上述步骤生成的1和0按顺序组合起来既是图片的指纹(hash)。顺序不固定。但是比较时候必须是相同的顺序。

得到hash值后,将同一数字对于图片的hash值存在一个txt文件中,实际使用的时候,对预测图像进行上文相同的预处理操作,分割出4个图片后,再计算出4个预测图像的hash值,将测试图像的hash值与TXT文件中的hash进行比对,计算汉明距离,即两个64位的hash值有多少位是不一样的,不相同位数越少,图片越相似。

得到测试图像与每个样本图像hash值的汉明距离后,进行统计,平均,取预测值最大的样本图像标签为预测值。识别的速度也还不错,平均只需要0.3秒就可以完成一次识别。

这种识别的方法简单易操作,对简单的字母数字组合验证码非常有效,但是对图像预处理提出了更高的要求,而且不具备泛化性,碰到不同的验证码每次都需要单独编辑规则。

====================================================================

本文发表在李思原博客“机器在学习”

原文链接:http://www.siyuanblog.com/?p=1774

欢迎扫码关注我的微信公众号:聚数为塔

qrcode_for_gh_b8391fc7ce11_430.jpg

=====================================================================


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。