(一)图像分类

目录

1.图像分类概念

2.图像分类的困难和挑战

3.数据驱动的方式

4.K-NN分类器

5.交叉验证

6.K-NN分类器的优劣


图像分类:

图像分类问题指的是,对于一张输入图像,从已有的标签集合中找出一个标签,并分配给这张图像。以下图为例:我们的图像分类模型会读取这张图片,然后输出这张图片对应每个标签的概率。对于计算机来说,图像是由一个一个的像素信息组成的。在这个例子中,这张猫的图片大小像素是248*400,因为图片是彩色的,所以还包含了RGB三个颜色通道。所以我们的输入是240*800*3=297600,每个数字代表着某一通道的亮度值。范围在0-255之间,0代表白色,255代表黑色。而我们要做的就是让计算机理解这些数字信息,然后做出分类。

困难和挑战:

对于人来说,识别出一个物体的概念是件简单的事情。但对于计算机来说却不一定,下面列举计算机视觉在图像识别方面遇到的一些困难:

  • 视角变化(Viewpoint variation:同一个物体,摄像机可以从多个角度来展现。
  • 大小变化(Scale variation:物体可视的大小通常是会变化的(不仅是在图片中,在真实世界中大小也是变化的)。
  • 形变(Deformation:很多东西的形状并非一成不变,会有很大变化。
  • 遮挡(Occlusion:目标物体可能被挡住。有时候只有物体的一小部分(可以小到几个像素)是可见的。
  • 光照条件(Illumination conditions:在像素层面上,光照的影响非常大。
  • 背景干扰(Background clutter:物体可能混入背景之中,使之难以被辨认。
  • 类内差异(Intra-class variation:一类物体的个体之间的外形差异很大,比如椅子。这一类物体有许多不同的对象,每个都有自己的外形。

以上的所有情况,同一个类别的像素信息都会有巨大的差异(计算机是通过像素信息去看图像的)。面对以上所有变化及其组合,好的图像分类模型能够在维持分类结论稳定的同时,保持对类间差异足够敏感。

数据驱动的方式:

数据驱动的方式类似于教小孩看图识物,我们把大量的数据输入图像分类模型(学习算法),并告诉这个模型,每张图片的类别是什么,我们让模型自己去学习每个类的外形。我们的训练数据长这样,每张图片都带有自己对应的标签:

图像分类流程:

  • 输入:输入是包含N个图像的集合,每个图像的标签是K种分类标签中的一种。这个集合称为训练集。
  • 学习:这一步的任务是使用训练集来学习每个类到底长什么样。一般该步骤叫做训练分类器或者学习一个模型
  • 评价:让分类器来预测它未曾见过的图像的分类标签,并以此来评价分类器的质量。我们会把分类器预测的标签和图像真正的分类标签对比。毫无疑问,分类器预测的分类标签和图像真正的分类标签如果一致,那就是好事,这样的情况越多越好。

 

Nearest Neighbor分类器(最邻近算法)

最邻近算法会将测试图片与训练集中的每一张图片做比较,然后将它认为与训练集图片中最接近的图片的标签赋给我们的测试图片。那么这个算法是怎么比较这些图片的呢,这就用到了度量距离的方法:L1距离(曼哈顿距离)和L2距离(欧式距离)

L1距离:以一个颜色通道举例,逐个像素求差值,然后相加,得到的数值就代表距离。

公式:

L2距离:逐个像素求差值,然后平方,相加,最后开方。

公式:\displaystyle d_2(I_1,I_2)=\sqrt{ \sum_p(I^p_1-I^p_2)^2}

结果:左边是我们的训练集,右边第一列是我们的测试图片,箭头后面的图片是我们用最邻近算法选出的最相似的图片。

K-Nearest Neighbor分类器

在前面介绍的NN分类器,它只会选择最相似的一张图片来作为测试图片的标签,但其实这样做的准确率是非常低的。所以在实际应用中,我们大多使用K-NN分类器。它的思想很简单:与其只找最相近的那1个图片的标签,我们找最相似的k个图片的标签,然后让他们针对测试图片进行投票,最后把票数最高的标签作为对测试图片的预测。从直观感受上就可以看到,更高的k值可以让分类的效果更平滑,使得分类器对于异常值更有抵抗力。但是对于这个k值我们应该如何选定呢?

用于超参数调优的验证集

这个k值,我们称之为超参数。我们可能会想到,用一组测试图片去测试每一个k值,然后我们选择准确率最高的k值。但这种想法是错误的。这会导致我们的模型陷入过拟合的情况,即模型泛化性很差。因为当我们用测试集去调整超参数的时候,模型会把测试集学习的很好,然后最后我们再用测试集去评价这个模型的时候,我们会得到一个乐观的结果。但实际上,这个模型的泛化性能我们无从得知。它可能会在我们实际应用这个模型的时候,对于模型没有训练过的数据,准确率非常的低。所以,测试数据集只能使用一次,即在训练完成后评价最终的模型时使用。

那我们应该用什么数据去调整我们的超参数呢,答案是:从训练集中取出一部分来调优,我们称之为验证集。把训练集分成训练集和验证集。使用验证集来对所有超参数调优。假如我们有50000张训练图片,我们可以抽取1000张作为我们的验证集。最后只在测试集上跑一次并报告结果。

交叉验证

有时候,训练集数量较小(因此验证集的数量更小),人们会使用一种被称为交叉验证的方法,这种方法更加复杂些。还是用刚才的例子,如果是交叉验证集,我们就不是取1000个图像,而是将训练集平均分成5份,其中4份用来训练,1份用来验证。然后我们循环着取其中4份来训练,其中1份来验证,最后取所有5次验证结果的平均值作为算法验证结果。

这就是5份交叉验证对k值调优的例子。针对每个k值,得到5个准确率结果,取其平均值,然后对不同k值的平均表现画线连接。本例中,当k=7的时算法表现最好(对应图中的准确率峰值)。如果我们将训练集分成更多份数,直线一般会更加平滑(噪音更少)。

Nearest Neighbor分类器的优劣

优点:

1. 简单易实现,训练过程只需要将数据存储起来,不需要花费训练时间。

缺点:

1.测试需要花费大量时间进行比较运算,这是不符合实际应用的。实际应用中,我们更关注测试效率。后续要学习的卷积神经网络恰恰相反:需要花大量的时间训练模型,一旦训练完成,测试速度将会变的非常快。这更符合实际应用需求。

2.nearest neighbor分类器在数据维度比较低的时候,可能比较合适。但在高维数据中(图像数据),比较向量间的距离通常是反直觉的。即图像像素相似,但我们看起来实际上有很明显的差距。下面的例子就是L2距离相等,但图像本身的语义却不相等:

3.仅使用像素差异来比较图像是不够的。下面的例子中:排列相近的图片L2距离小。可以看出,图片的排列是被背景主导而不是图片语义内容本身主导。比如,狗的图片可能和青蛙的图片非常接近,这是因为两张图片都是白色背景。但我们希望的是模型能将同类的图像聚集在一起,且不会被背景或者其他因素干扰。所以,我们并不能止步于图像原始像素的比较,得继续前进!

猜你喜欢

转载自blog.csdn.net/Polaris47/article/details/84403642