使用Tensorflow和支持向量机
创建图像分类引擎
最近,2018韩国小姐的出炉引起了一波话题
大家感慨到:这一届的韩国小姐终于
不再撞脸了~
由此,小编查阅了往年韩国小姐的图片,
画风是这样的。。。
往年韩国小姐脸相似度过高,
甚至还被用作高难度的连连看游戏!
可见其识别的难度简直不敢想象,
但是,最近小编上手了一门实用的技术
——图像识别
学会了这门技术,你将轻松识别图片
成为21世纪的“火眼金睛”!
一、 写在前面的话
为了了解图像识别,小编阅读了很多文章,并将其中一篇英文文献翻译出来,重现文献中的实践步骤,而这篇推文则是小编翻译原文并重现的成果(魔术师提供文献相关的所有技术资料,公众号后台回复【图像识别】,即可获取源代码下载链接~~)
在阅读本文章前,爱研究的你需要掌握一些基本知识,因此,我们用一张框架图为你梳理这些先决知识:
接下来,小编将带你走近图像识别~
二、 学习背景
为了更好地学习图像识别,我们将从一个小项目入手。这个项目的目标是建立一个系统,帮助使用拉链拉头的用户在数据库中找到匹配的拉拔器。简而言之,就是完成一个拉链拉头和拉拔器之间的“连连看”游戏!
为了正确地匹配对应的拉链拉头和拉拔器,我们需要进行两步操作:其一,提取对象特征。通俗来讲,就是弄清楚拉链和拉拔器有什么样的特性(例如,颜色为绿色,拉链头为圆形等);其二,正确地进行分类,通俗来说,就是把拉链拉头正确地和相应的拉拔器配对。在这个过程中,我们将使用两个重要工具,一个叫Tensorflow,它采用数据流图进行数值计算,计算过程将在流图的各个计算设备中异步执行,这个工具可以帮助我们更好地提取对象特征;
另一个叫支持向量机,它是一种很好的分类方法。
三、 提取对象特征
本次试验的样本为12个拉拔器:
首先,我们将输入图像上的HoG(定向梯度直方图)特征和从模型库已有的拉动模型图像进行匹配。但如果输入图像背景具有强烈纹理(如图,有的背景有凹凸纹理,有的背景有木材横条纹理),纹理的存在加深了匹配的难度,导致匹配性能变差。
因此,我们测试了一种替代解决方案来解决带纹理背景的问题。我们构建了一个相对浅的CNN(卷积神经网络 ,主要构建于特征提取和特征映射),其具有2个卷积层和两个全连接层,用于对拉拔器图像进行分类。但是,由于我们的数据集太小(每种类型大约200个牵引图像)并且缺乏多样性,因此分类性能很差。它与随机猜测基本没有区别。
为了达到更好的效果,我们的方向是让网络更深,网络更宽。但是纯粹的增大网络有两个缺点——过拟合和计算量的增加。解决这两个问题的方法当然就是增加网络深度和宽度的同时减少参数,为了减少参数,那么自然全连接就需要变成稀疏连接,但是在实现上,全连接变成稀疏连接后实际计算量并不会有质的提升,因为大部分硬件是针对密集矩阵计算优化的,稀疏矩阵虽然数据量少,但是所耗的时间却是很难缺少。
所以需要一种方法,既能达到稀疏的减少参数的效果,又能利用硬件中密集矩阵优化的东风。Inception就是在这样的情况下应运而生。因此,我们使用TensorFlow作为工具,用其预先训练的深度CNN(即Inception)从每个输入图像中提取特征。
用于图像分类的CNN具有两个主要部分:
1)卷积层的长链;
2)一些神经网络中的全连接层。
卷积层的长链用于特征学习。学习到的特征将被输入全连接层以进行分类。下图显示了我们将要使用的TensorFlow的Inception网络结构:
如果卷积层的输入是具有3个通道的图像,则该层的内核大小是3×3,并且对于每个输出通道将存在独立的三个3×3内核集。 集合中的每个矩阵将与输入的相应通道卷积并产生三个卷积图像。这些卷积图像的总和将形成输出的通道。
下图是卷积步骤:
由于每个卷积层的输出是一个多通道图像,我们也可以将它们视为多个灰度图像。通过绘制这些灰度图像,我们可以了解Inception网络如何看到图像。 在卷积层链的不同阶段提取以下图像。这些阶段点在初始模型图中被展示为A,B,C和D.
A阶段的所有32张149×149图像:
B阶段的所有32张147×147图像:
C阶段的所有288张35×35图像:
D阶段的所有768张17×17图像:
在这里,我们可以看到图像变得越来越抽象,沿着卷积层链,我们还可以看到一些图像突出显示拉出器,其中一些突出显示背景。
由以上可知,卷积层的长链学习到的特征被输入全连接层以进行分类,馈送到最后一个分类层的功能也称为瓶颈功能,这个功能是一个十分有效的功能。那么,为什么瓶颈功能如此有效呢?
Inception网络的瓶颈特征是2048-d向量。以下是以条形图显示的输入图像的瓶颈特征图:
由于瓶颈特征是分类的一个很好的特征,我们希望代表相同类型的拉拔器的特征彼此接近(将特征视为2048-d空间中的点),而代表不同类型的拉拔器的特征应该相距很远。换句话说,我们希望看到数据集中的功能根据其类型进行自我聚类。
很难看到这种聚类发生在2048-d特征数据集上。 但是,我们可以对瓶颈特征进行降维,并将其转换为易于可视化的二维特征。下图是拉拔器数据集5中变换特征的散点图。 不同的拉拔器类型用不同的颜色说明。
我们可以看到,相同的色点大多聚集在一起。 我们很有可能使用瓶颈功能来高精度地训练分类器。
提取inception瓶颈特征的代码:
四、训练分类器
对于我们的拉拔器分类任务,我们将使用SVM进行分类:
SVM的目标是找到一个超平面,该平面在两个半空间中正确地分离训练数据,同时最大化这两个类之间的边界。
SVM是二进制分类器。但是,我们可以使用one-all-all或one-vs-one方法使其成为多类分类器。对于训练SVM分类器来说,似乎有很多工作要做,实际上当使用像scikit-learn这样的机器学习软件包时,它只是一些函数调用。最终,我们使用10折交叉验证来进行测试。
训练SVM分类器的代码:
SVM培训结果:
以下是我们获得的培训结果,获得了完美的结果! 虽然这可能会导致过度拟合......
我们用它来构建一个移动应用程序和一个用于现场测试的拉拔分类器的Web前端。
由于分类器可以使用看不见的样本,因此过度拟合的问题似乎并不那么严重。
五、结论
1.深层CNN,可以用作一般图像分类任务的特征提取。
2.Inception网络的瓶颈功能是一个很好的分类功能。我们从数据集中提取了瓶颈特征,并对可视化进行了降维,结果显示样本根据其类别进行了很好的聚类。
3.关于瓶颈特征的SVM分类器训练具有完美的结果,并且分类器似乎对看不见的样本起作用。
至此,我们完成了对拉链拉头和拉拔器之间的图片匹配识别,相信大家对图像识别也有了更深的理解,那么赶紧亲自动手体验一下吧~
PS:
移步留言区,即可获取源代码下载链接~~
-- the end --