· 机器学习 · 图形验证码识别应用 ·

偶然看到小伙伴们的讨论:具体内容还不太了解,但似乎在说登录界面验证码的事儿。

验证码是测试过程中经常遇到的一个问题,于是不禁思考:如何在自动化测试的过程中对验证码进行高效的识别和处理,以此来提升测试效率?
首先,对于简单的拖放验证码(drag-and-drop),可以使用selenium的拖放函数,来操作被拖放的元素并设定拖放的距离、拖放到的目标元素。
以下的例子展示了运用拖放操作在http://pythonscraping.com/pages/javascript/draggableDemo.html的页面,来证明访问者不是一个机器人。

页面中的message元素中展示了一条信息,内容为:
Prove you are not a bot, by dragging the square from the blue area to the read area!
很快地,python就会运行完毕,并得到第二条信息:
You are definitely not a bot!
当然这是一种较为简单的验证码情况,如果是对于一个陌生的网页,实现这样的操作可能会有一点困难,尤其是绝大多数网站的验证码远比这复杂。
实际环境中,我们常见的验证码是图形验证码,以上的操作就并不适用了。
因此下面我就谈谈自己对于运用机器学习算法进行图像验证码的识别的一点粗浅看法。

· 问题分析 ·
要弄清怎样让机器识别图像验证码,先来想想,我们作为充满智慧的人类是怎样认出一张验证码中的字符的:
1) 对图像进行浏览,找出N个字符在图像中的位置;
2) 对找到的字符依次进行辨认,并最终得到整个验证码的结果。
其实想要让计算机识别一张图像验证码,步骤也是类似的,比如:
1) 采取某种策略对包含多个字符的图像进行拆分,使得每个图像中尽量只包含一个字符;
2) 对得到的子图像依次进行识别,得到概率最高的结果,并将全部结果依次组合则得到最终结果。
第一个步骤常被称之为图像分割。如果大家对动态规划有一点印象的话,就会更容易理解了,因为图像分割的作用与之类似,即将大的问题拆分为若干个子问题,依次攻破。
第二个步骤则是一个比较标准的监督学习(Supervised Learning)问题中的分类问题。监督学习主要分为回归(Regression)问题和分类(Classification)问题两类,其区别在于,回归问题所产生的结果是连续的,而分类问题的结果是离散的。
一个典型的分类问题的例子是:已知某城市若干套房子的面积与其对应的房价,以此为依据,对给出面积的房子进行房价预测。
那么已知的信息用图像表达出来就会像这样:

而一个机器学习算法给出的一条拟合函数可能会像这样:

虽然实际中的回归问题往往会有更多的维度,即可能对于预测房价而言,面积不是唯一的影响因素,还会有更多的信息能造成影响,如房子所在的区域、周围的学校、与最近警察局的距离、楼层等等,这些因素作为“参数(Parameters)”,以不同的程度对最终的结果:房价产生着影响。
工程师们往往需要考虑使用哪些,或是注重哪些参数来获得一个较优的结果。
而对于分类问题,相信只要你再稍微往后看看,就会有一个清晰的认识了。
不知你有没有注意到,对于监督学习而言,已知的数据必须包含参数以及结果两方面的信息,否则如果你不知道房子的任何价格信息,就无法做出预测。
与之对应的另一个大类的问题叫做“非监督学习(Unsupervised Learning)”,我们很快也会谈到。
对于两个步骤分别可能存在的难点,我们也会在之后进行讨论。

· 环境准备 ·
对于传统算法的机器学习而言,无论是MATLAB还是python都是很常用的。
不过说到神经网络,由于TensorFlow,PyTorch等开源工具被广泛使用,python可能就要略胜一筹了。
Anaconda是一个开源的Python包管理器,它可以方便我们对多个虚拟环境的管理,并简单地处理好不同包之间的版本依赖问题。
如果你还在使用Python2,那么建议更换到Python3,因为有许多包已经不再对Python2提供更新。
至于其他各种相关的Python包,在之后用到的时候会单独进行列出。

· 数据集准备 ·
产生一个图像验证码的数据集并不是一件太复杂的事情。大致步骤如下:
1) 在指定的字符集合(如0-9,A-Z,甚至是汉字等)中随机选取N个字符;
2) 将产生的字符放置于背景图像之上;
3) 在图像之上增加噪声;
4) 对产生的字符进行随机的缩放、旋转、投影等变换;
5) 得到验证码。
如果是为了产生验证码作为数据集,还会有额外的两个步骤:
6)将产生的验证码进行存储;
7)将产生的验证码对应的字符进行记录,写入文件。
道理说完了,不过在python中,也不乏存在简简单单就可以产生一个图像验证码的库。这里我使用到了captcha。
在安装后,使用如下的代码就可以产生一个验证码:

产生的验证码如下:

更进一步的,使用一个循环来批量产生验证码并写入称为文件就可以得到一个个验证码的图像了,由此可以得到训练集,它们将用来进行模型的训练。
在产生验证码的同时,对其字符

本文探讨了如何使用机器学习和深度学习技术来处理和识别登录界面的图形验证码,包括图像分割、分类算法以及神经网络的应用。通过对验证码的图像处理、数据集生成、图像预处理、聚类算法分析以及使用神经网络模型,如CNN,进行多分类任务,最终达到了93.9%的测试准确率。验证码识别技术的发展,反映了计算机视觉和自然语言处理在应对复杂验证码挑战方面的进步。
最低0.47元/天 解锁文章
608

被折叠的 条评论
为什么被折叠?



