当 AI 遇到狗年,说一说用深度学习识别不同品种的狗子

VerEfs 3年前
   <p>新的一年即将到来了,这里先祝各位新年快乐,狗年财运旺旺的 。在新年的最后一篇推送中,就简单的介绍一下和狗相关的一项黑科技,狗练识别。</p>    <p>狗是已知的,人类最早驯化的动物了,早在一万五千多年之前,还处在农业时代之前的原始人类就靠着几根骨头骗到了贪吃的灰狼,又等到了农业时代,人们发现狗真的是十项全能的好帮手,于是开始了对狗的定向演化,于是就有了许多看起来差异巨大的不同品种的狗,下图所展示的只是一些常见的品种,你认出那些你熟悉的品种了吗?</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/8784d7ca72cdfe51abb83a1d11ae3bf5.jpg"></p>    <p>而根据不同品种的狗狗的照片,按照品种进行分类,在机器视觉中属于Fine-grained classification,也就是根据图像的细节进行分类,类似的问题还包括根据植物的照片判断是那种花等,你也许会说,这样的问题不应该很简单吗,用深度学习就行了,一层不行就再加一层。</p>    <p><img src="https://simg.open-open.com/show/cc13f405da9f351415fe049e332ba84a.jpg"></p>    <p>且慢,让我们先看看这个问题本身有那些本质的困难之处。首先是不同品种的狗都很相似,比如下图的三种狗,若你不是狗专家,你能够分清楚吗?</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/fa3bda2d0a7dc0865679c4160f923852.jpg"></p>    <p>第二个问题是即使是同一种狗,也会差距很大,例如下图的三种狗,竟然是一家人,你说这叫AI头大不头大。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/9f56892f25b960f616772fc5721c6347.jpg"></p>    <p>更要命的是不同的狗狗都有各自独特的pose,而且他们所在的图片的区域,图片背后的背景是草地还是森林都不同。下图展示了三只不同姿势的狗狗。</p>    <p><img src="https://simg.open-open.com/show/009098e9fe578918b4e9f156aadc567c.jpg"></p>    <p>正是由于有这三个问题,要做好狗脸识别,并不是一件简单的事。所以说, 使用深度学习去解决具体问题,需要先调研清楚这个问题的背景和障碍,才能够便于设计下一步具体优化方法。</p>    <p>该怎么做了?第一种思路是数据增强,也就是用 <strong>随机应对随机</strong> 。既然狗子的位置在照片中不固定,那就将原始的图片随机的裁剪一下,旋转一下,将图像的颜色做一些微调,总之就是想象一个熊孩子打开ps修改了每张狗子的照片,给你留下了一堆看起来和原始的训练数据差不多的照片作为新的训练集。下面给出了随机剪裁之后得到的狗的照片示例。</p>    <p><img src="https://simg.open-open.com/show/577dd824f0cc6e538002ee46b9ad105e.jpg"></p>    <p>而另一种方式,可以看成是 <strong>用有序来应对随机</strong> ,也就是先通过识别出狗子所在的区域,再将这个区域拉伸成一样大小的图片,来去除背景的干扰。例如下图所示,展示了经过了背景去除和拉伸前后的狗子的照片,可以看到经过处理后的照片,只剩下了我们关心的狗子的信息。</p>    <p><img src="https://simg.open-open.com/show/07b62ae48316b995c7d950cabc8da987.jpg"></p>    <p>接下来的问题是狗子的照片不够多,斯坦福大学针对狗的品种识别,搞出了一个数据库,里面有一百多种狗,一共一万多张照片,但若是指望这些图片就能够训练出一个靠谱的深度神经网络,那效果多半不好。 数据增强虽然能够改善预测的准确性,但其上限不高,毕竟原始的信息就那么多。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/c01d31b1da97641ffd964fd65ae37d96.jpg"></p>    <p>若是你自己做不到,不妨站在巨人的肩膀上。迁移学习正是这样,深度学习的好处是模型不再是铁板一块,而是可以拆解成一层一层的,不用花一分钱,你可以拿大牛们训练好的网络,将其用做自己的用途。关于迁移学习,曾经写过一篇名叫白话迁移学习的小文,感兴趣的可以点击深入了解。</p>    <p>而迁移学习迁移的是什么样的神经网络,自然是深度学习中最出名的卷积神经网络,关于这个话题,可以参考你所不能不知道的CNN和 <a href="http://mp.weixin.qq.com/s?__biz=MzA3MzQwNzI3OA==&mid=2651381959&idx=1&sn=1b920dd476849d88b67a2ef1cf3ed8fc&chksm=84f3ce86b3844790627d2f15256aff0753be1f0b0623da64aaa7357d73e8ed14c415061acb27&scene=21#wechat_redirect" rel="nofollow,noindex">用CNN来识别鸟or飞机的图像</a> ,这里就不再重复了。</p>    <p>但迁移学习并不意味着什么都不需要来做,你需要利用成熟的网络提取出的高级特征,用他们来进行预测,但是要注意的是,你预测得出的结果并不是一个确定的狗的品种,而是这个图属于哪个品种的概率,而这又是怎么得出来的,靠的是一个名叫softMax的激活函数,这可是深度学习中最出名的两个激活函数了,soft是保证输出的结果是符合概率分布,也就是不会出现概率为120%的情况,而max是让错的更错,从而提高学习的效率。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/3cade5b96b296c2453128ef9f362b32a.jpg"></p>    <p>最后说一说这个例子的实现难度,类似Minst数据集的手写数字识别,宠物狗的品种分类,也是一个相对容易上手的例子,你不需要昂贵的显卡,就普通的个人电脑,就可以基于已有的图像识别网络,例如谷歌的Inception,来搭建一个属于你的狗脸识别程序。除了用来展示,这个例子还可以锻炼你诊断网络的能力,训练的太慢,不妨换换更快学习率,训练的结果起伏太大,还可以再换换更慢的学习率啦。</p>    <p>开个玩笑,虽然学习率是深度学习中很重要的一个参数,但不是万能的,这个例子的好处是让你能够直观的看到你训练出神经网络有那些不足,又为什么会犯错,例如下图,如果是将图片变成黑白的,神经网络是不会犯错的,但一旦加上了色彩,你就会发现神经网络没有将黄色那只分成拉布拉多犬,这时你就能发现,是你的神经网络过拟合了,网络中的一个神经元学到的速记口诀,但凡黄色的都不是拉布拉多,这时不管你怎么做数据增强,对数据又拉伸又旋转,都无法教会这个神经元忘掉这个口诀,这也是我为什么上文说数据增强的效果是有上限的。</p>    <p><img src="https://simg.open-open.com/show/f90d029a855f99b04a0c2f618d520b9c.jpg"></p>    <p>而这时如果你能用dropout机制,时不时的将这个背小抄的神经元踢下线,那么你的神经网络就能够有机会学到拉布拉多真正的特征,这也就解释了为什么dropout机制是一种极为高效的防止模型过拟合的方法。</p>    <p>卷积神经网络的另一个特点是能够打破所谓的黑箱,让你看看 <strong>网络内部特征是如何一步步被抽象出来的</strong> ,下图依次分别展示了卷积神经网络的输入图像和第一层的输出结果,可以看出神经网络第一层的卷积核提取出的特征分别是什么,又对图像进行了怎样的抽象。(虽然小编表示我就算看出神经网络做了什么,也没法说出来,不过这反而说明了网络本身能做一些人无法明确言说的任务,而这正是深度神经网络最革命性的创新)</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/b0095e7d1e7534d2f4f099ce1622ed25.jpg"></p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/d4d6a14099d1ca4621f9164abf7ecd0a.jpg"></p>    <p>在这篇小文的结尾,放上一章狗狗们的全家福照片,愿各位不管是什么汪,新的一年的事事兴旺,合家安康。</p>    <p><img src="https://simg.open-open.com/show/a8e339363e81c98aa0dacaad9d135a3e.jpg"></p>    <p>参考资料</p>    <p>1)Using Convolutional Neural Networks to Classify Dog Breeds  Hsu, David</p>    <p>2)Dog Breed Identification  Whitney LaRow ,Brian Mittl, Vijay Singh</p>    <p>3)Automatic Dog Breed Identification     Dylan Rhodes</p>    <p> </p>    <p>来自:http://mp.weixin.qq.com/s/trUSob28kuKQDLbfR4hVlw</p>    <p> </p>