前言
本文是我的毕业设计基于Tensorflow的深度学习与研究的番外篇,在这篇文章中,我将解决以下两个问题:
- 利用深度学习进行五种花的分类
- 利用深度学习识别滑动验证码缺口位置
第一个问题来源于我妈的小花园和我的毕业设计,原本我的毕业设计只要求做一个demo(利用Alexnet完成MNIST的识别)就可以了,但为了丰富我的论文成果,我以我妈小花园的几种花为契机,参照微信小程序识花君(最重要的还是想在我妈面前显摆一下),通过华为云AI开发平台ModelArts进行数据标注、模型训练以及部署上线,实现对太阳花、郁金香、玫瑰、菊花、蒲公英的识别。
图 0-1 小花园的一角
第二个问题来源于2018年10月左右(大三上学期国庆节那阵),那阵初学爬虫,爬过了猫眼、豆瓣、喜马拉雅App等,当时遇到的我认为最难的反爬措施就是滑动验证码,这篇文章中我就通过深度学习的知识来讲解一下反爬虫中模拟滑动验证码滑动的问题。
01 利用深度学习进行五种花的分类
我的毕业设计中关于花分类的demo共有3672张样本图片,包括五种类别,其中daisy(菊花)633张,dandelion(蒲公英)898张,roses(玫瑰)641张,sunflowers(太阳花)699张,tulips(郁金香)799;训练集图片共3306张,同样也是五种类别,其中daisy(菊花)570张,dandelion(蒲公英)809张,roses(玫瑰)577张,sunflowers(太阳花)630张,tulips(郁金香)720;测试集图片共364张,也是五种类别,其中daisy(菊花)63张,dandelion(蒲公英)89张,roses(玫瑰)64张,sunflowers(太阳花)69张,tulips(郁金香)79;我将通过搭建Alexnet卷积神经网络(具体网络结构模型请参考Alexnet论文),实现对五种花的识别,以下是我的结果演示:
图1-1 模型训练成功
图1-2 训练集与测试集之间的误差展示
图1-3 样例展示(检测玫瑰,识别率高达95.5%)
相信上面的过程叙述,小伙伴已经差不多看懂了,无非就是这几个过程:
- 样本采集(大量的样本数据,通过批量爬虫或者手动保存)
- 模型搭建(我用的是CNN-Alexnet)
- 模型训练(我跑在了cpu上,推荐大家用Google cloud或者AWS云平台)
- 使用测试集进行测试并按照要求调整即可
有的小伙伴可能说,这么麻烦,我才不做呢,好吧,此时天空一声雷,东哥登场,他带来了一种只需要动动鼠标、拖拽拖拽就可以训练一个模型并部署上线的方法,来看看吧。
首先,我们来解释一下,什么叫图像分类?顾名思义,就是把所给样本图片根据某些特征分开来,当用户想要判断一张前所未见的图片属于哪一类时,我们可以根据通过样本图片训练好的神经网络模型对要判断的图片进行特征提取,进而判断该张图片可能属于样本中哪一类别的概率,并最终判定概率最大的一个就是该图片所属的类别。(分类问题预测的是类别,模型的输出是概率分布(三分类问题输出例子:[0.2,0.7,0.1]),很明显,所有概率之和为1)接下来,我将通过华为云AI开发平台ModelArts来给大家展示一下整个的操作过程:
准备训练数据
我使用的数据是通过对百度图片、千图等几个网站的爬虫获取的,总共3762张图片,具体怎么爬,我就不赘述了。爬下来的所有图片长这样:
图1-4 采集样本图片
标注图片
接下来一步是借助ModelArts来完成数据集的标注,可能很多小伙伴到了这一步就已经望而却步了,坚持住,胜利就在眼前~让我们进入华为云ModelArts控制台来看看:
图1-5 ModelArts控制台
它内置了一些深度学习模型,包括图像分类(本文第一专题-花的分类用到就是这个)、物体检测(本文第二个专题-滑块识别用的就是这个)、预测分析(房价预测等)等,我们可以直接利用它们来搭建属于自己的模型。
我们创建图像分类的项目,并创建OBS桶,通过obs-browser将本地图片上传,为了省流量,我将我demo中测试集的所有图片导入,共计364张图片,上传之后我们进行图片的标注。
图1-6 图片标注
标注完之后,我给我的5个分类分别添加了标签名,如图中所示,可以随意制定,不必跟我一样。
训练
图片标注完成之后,我们就可以开始训练了。现在才是好多不喜欢写代码的小伙伴们的天堂啊,ModelArts内置了图像分类的深度学习模型,我们只需提供训练数据就可以了。
在这里,我们只需要设置一下最大训练时长就好了,这么点儿图片很快就训练完了,静静的等待一下就好,最大训练时长随意填写即可,最小不小于0.05,填写完成之后点击开始训练。
等几分钟,就会训练完成,可以看到类似的页面:
图1-7 训练成功界面
haha,是不是觉得好神奇啊,我都不知道深度学习是啥,我竟然搭出了模型,还有更神奇的呢,我们来最后一步,部署上线。
部署测试
最后一步,点击部署,部署成功的界面如下图所示:
图1-8 部署测试成功的界面
最后的最后,我们来享用一下我们的模型,看看准确率咋样,在这里我们上传一张花的图片,我上传的是一张玫瑰的图片,然后看看结果咋样。
图1-9 最终效果图
还不错吧,最终判断为玫瑰的概率为76.8%,非常完美。
02 利用深度学习识别滑动验证码缺口位置
讲完了图像分类,我们再说说目标检测的事,其实在本文中具体来说就是滑动验证码识别的事,小伙伴们平时在登陆某些网站的时候肯定遇到过类似下面图示的界面:
图2-1 滑动验证码(图片来自网易易盾 https://dun.163.com/trial/jigsaw)
虽然这种验证码形式友好,且安全性、美观度相比之前的手段都有了很大的改观,但是对于爬虫er来说,难度可是提升了一大截呀~
其实,对于滑动验证码的处理,其实思路上很简单:
- 找到目标缺口位置
- 模拟用户滑动操作将滑块拉动到目标缺口位置处
对于模拟用户拉动滑块的操作这里不做赘述,我们主要通过深度学习来分析缺口位置识别的事,如果你仔细看完了我第一部分的内容,相信到这里你已经有了思路,借助华为云--ModelArts平台,我们只需提供一些训练数据即可,这些训练数据不同于图像分类中仅有的图片数据,还需要包括缺口位置标注轮廓信息。
准备好了数据,我们就可以借助模型来训练了,具体步骤不在赘述,请参考图像分类部分:
图 2-2 图片标注
需要注意一点:目标检测与图像分类不同,目标检测需要手动操作通过拖拽标注上传样本图片中的缺口位置,供模型训练用。
接下来的所有在华为云---ModelArts平台上的操作与图像分类大同小异,这里不在赘述。
到此为止,我根据毕业设计情况以及我遇到过的问题介绍了深度学习在图像识别(五种花的分类)、目标检测(滑动验证码识别)的两个小demo,相信大家已经看懂了,快实现一下吧