0%

利用深度学习识别验证码缺口

做爬虫的同学肯定或多或少会为验证码苦恼过,在最初的时候,大部分验证码都是图形验证码。但是前几年「极验」验证码横空出世,行为验证码变得越来越流行,其中之一的形式便是滑块验证码。 滑块验证码是怎样的呢?如图所示,验证码是一张矩形图,图片左侧会出现一个滑块,右侧会出现一个缺口,下侧会出现一个滑轨。左侧的滑块会随着滑轨的拖动而移动,如果能将左侧滑块正好滑动到右侧缺口处,就算完成了验证。 image-20191107023051548 由于这种验证码交互形式比较友好,且安全性、美观度上也会更高,像这种类似的验证码也变得越来越流行。另外不仅仅是「极验」,其他很多验证码服务商也推出了类似的验证码服务,如「网易易盾」等,上图所示的就是「网易易盾」的滑动验证码。 没错,确实这种滑动验证码的出现让很多网站变得更安全。但是做爬虫的可就苦恼了,如果采用自动化的方法来绕过这种滑动验证码,关键部分在于以下两点:

  • 找出目标缺口的位置。
  • 模拟人的滑动轨迹将滑块滑动到缺口处。

那么问题来了,第一步怎么做呢? 我们怎么识别目标缺口到底在图片的哪个地方?大家可能想到的答案有:

  • 直接手工一把梭。
  • 利用图像处理算法检测缺口处特征。
  • 对接打码平台,获取缺口位置。

另外对于极验来说,之前还有一种方法来识别缺口,那就是对比原图和缺口图的不同之处,通过遍历像素点来找出缺口的位置,但这种方法就比较投机了。如果换家验证码服务商,不给我们原图,我们就无从比较计算了。 总之,我们的目标就是输入一张图,输出缺口的的位置。 上面的方法呢,要么费时费钱、要么准确率不高。那还有没有其他的解决方案呢? 当然有。 现在深度学习这么火,基于深度学习的图像识别技术已经发展得比较成熟了。那么我们能不能利用它来识别缺口位置呢? 答案是,没问题,我们只需要将这个问题归结成一个深度学习的「目标检测」问题就好了。 听到这里,现在可能有的同学已经望而却步了,深度学习?我一点基础都没有呀,咋办? 不用担心,本节介绍的内容全程没有一行代码,不需要任何深度学习基础,我们只需要动动手点一点就能搭建一个识别验证码缺口的深度学习的模型。 这么神奇?是的,那么本节我就带大家来实现一下吧。

目标检测

首先在开始之前简单说下目标检测。什么叫目标检测?顾名思义,就是把我们想找的东西找出来。比如给一张「狗」的图片,如图所示: image-20191107024841075 我们想知道这只狗在哪,它的舌头在哪,找到了就把它们框选出来,这就是目标检测。 经过目标检测算法处理之后,我们期望得到的图片是这样的: image-20191107025008947 可以看到这只狗和它的舌头就被框选出来了,这就完成了一个不错的目标检测。 现在比较流行的目标检测算法有 R-CNN、Fast R-CNN、Faster R-CNN、SSD、YOLO 等,感兴趣同学的可以了解一下,当然看不懂也没有什么影响。 另外再提一个地方,不懂深度学习的同学可以看看,懂的直接跳过下面一段。 我们既然要搭建一个模型来实现一个目标检测算法,那模型怎么知道我们究竟想识别个什么东西?就比如上图,模型咋知道我们想识别的是狗而不是草,是舌头而不是鼻子。这是因为,既然叫深度学习,那得有学习的东西。所以,搭建一个深度学习模型需要训练数据。啥也不告诉模型,模型从哪里去学习?所以,我们得预先有一些标注好位置的图片供模型去学习(训练),比如准备好多张狗的图片和狗的轮廓标注位置,模型在训练过程中会自动学习到图片和标注位置的关系。模型训练好了之后,我们给模型一个没有见过的类似的狗的图,模型也能找出来目标的位置了。 所以,迁移到验证码缺口识别这个任务上来,我们第一步就是给模型提供一些训练数据,训练数据就包括验证码的图片和缺口的位置标注轮廓信息。 好,既然如此,我们第一步就得准备一批验证码数据供标注和训练了。

准备训练数据

这里我用的是网易易盾的验证码,链接为:http://dun.163.com/trial/jigsaw。 我写爬虫爬下来了一些验证码的图,具体怎么爬的就不再赘述了,简单粗暴直接干就行了。 爬下来的验证码图类似这样子: image-20191107030722603 我们不需要滑轨的部分,只保留验证码本身的图片和上面的两个缺口就行了,下面是我准备的一些验证码图: image-20191107030825681 我爬了大约上千张吧,越多越好。当然对于今天的任务来说,其实几十上百张已经就够了。

标注缺口位置

下一步就是把缺口的位置标注出来了。想一想这一步又不太好办,我难道还得每张图片量一量吗?这费了劲了,那咋整啊? 很多同学可能到了这一步就望而却步了,更别提后面的搭建模型训练了。 但我们在文章开头说了,我们不需要写一行代码,点一点就能把模型搭建好。怎么做到的呢?我们可以借助于一些平台和工具。 在这里就要请出今天的主角—— ModelArts 了,这是我发现的华为云的一个深度学习平台,借助它我们可以完成数据标注、模型训练、模型部署三个步骤,最重要的是,我们不需要写代码,只需要点来点去就可以完成了。 让我们进入 ModelArts 来看看: image-20191107031802815 它已经内置了一些深度学习模型,包括图像分类、物体检测、预测分析等等,我们可以直接利用它们来快速搭建属于自己的模型。 在这里我们就切换到「自动学习」的选项卡,创建一个物体检测的项目。 image-20191107032040036 进入项目里面,可以看到最上面会显示三个步骤:

  • 数据标注
  • 模型训练
  • 部署上线

也就是说,经过这三步,我们就可以搭建和部署一个深度学习模型。 页面如图所示: image-20191107032248156 那我们先来第一步——数据标注,这里我把一些验证码的图上传到页面中,在这里我上传了 112 张图: image-20191107032407896 上传完毕之后我们可以点击每一张图片进行标注了,这个平台提供了非常方便的标注功能,只需要鼠标拖拽个轮廓就完成了,112 张图标注完也就几分钟,标注的时候就框选这么个轮廓就行了,如图所示: image-20191107032556453 在这里边界需要把整个缺口的图全框选出来,其中上边界和右边界和标注框相切即可,总之确保标注框正好把缺口图框选出来就行,平台会自动保存和记录标注的像素点位置。 标注完一个,它会提示要添加一个名字,我在这里添加的名字叫「边界」,可以随意指定。 等全部标注完毕,点击「保存并返回」按钮即可。

训练

好,标注完了我们就可以开始训练了。我们在这里不需要写任何的代码,因为平台已经给我们写好了,内置了目标检测的深度学习模型,我们只需要提供数据训练就行了,如图所示: image-20191107033005181 在这里,我们只需要设置一下「最大训练时长」就好了,这么点图片其实几分钟就能训练完了,「最大训练时长」随意填写即可,最小不小于 0.05,填写完了之后就可以点击「开始训练」按钮训练了。 等几分钟,就会训练完成了,可以看到类似如图的页面: image-20191107033211474 这里显示了模型的各个参数和指标。 是的,你没看错,我们没有写任何代码,只过了几分钟,模型就已经训练完,并且可以部署上线了。

部署测试

然后进行下一步,部署上线,直接点击左上角的部署按钮即可: image-20191107033411530 过一会儿, 部署成功之后便可以看到类似这样的界面: image-20191107033446107 在这里我们可以上传任意的验证码图片进行测试,比如我随意上传一张没有标注过的验证码图,然后它会给我们展示出预测结果,如图所示: image-20191107033907756 可以看到,它就把缺口的位置检测出来了,同时在右侧显示了具体的像素值和置信度:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"detection_classes": [
"边界"
],
"detection_boxes": [
[
16.579784393310547,
331.89569091796875,
124.46369934082031,
435.0449523925781
]
],
"detection_scores": [
0.9999219179153442
]
}

是的,检测的结果还是比较准确的。有了这个结果,我们下一步模拟滑动到标注结果的左边界位置就好了!具体的模拟过程这里就不展开讲了。 另外平台同时还提供了模型部署后的 URL 接口和接口调用指南,也就是我们只需要向接口上传任意的验证码图片,就可以得到缺口的位置了!调用方式可以见:https://support.huaweicloud.com/engineers-modelarts/modelarts_23_0063.html。 嗯,就是这样,我们通过非常简单的操作,不需要任何代码,几分钟就搭建了一个深度学习模型,准确率也还不错。 当然这里我们只标注了 100 多张,标注得越多,标注得越精确,模型的准确率也会越高的。 以上便是利用 ModelArts 搭建滑动验证码缺口识别模型的方法,十分简洁高效。大家感兴趣可以了解下 ModelArts:https://www.huaweicloud.com/product/modelarts.html