【CS231n_2017】2-Image Classification

来源:互联网 发布:日式装修风格知乎 编辑:程序博客网 时间:2024/06/08 20:13

图像分类

  图像分类是计算机视觉的核心问题之一,可以理解为从一组固定的类别中为输入图像贴上对应标签,说明该图像属于哪一类。虽然图像分类问题比较简单,但它有着很多的实际应用,像目标检测、图像分割这些看似不同的计算机视觉任务,都能简化成图像分类问题。

  在CS231n课程中,需要用到Python和Numpy,附上基础知识教程:Python简单入门、Numpy简单入门

  举个简单的例子,如下图所示。我们的任务是识别图像中的物体,可能是猫、狗、帽子、马克杯中的一种。图像是有很多像素点组成的,每个像素对应着RGB三个通道的值,如果图像大小为800×600,那么它的数据量则有800×600×3。通过图像分类算法的计算,我们得出该物体是猫的可能性最高,这样容易推导出,图像中的识别对象是一只猫。


挑战

  当我们去检测识别对象时,会遇到一些问题与挑战。一个好的图像分类模型要求能适应性地处理多种问题,保持对类间变化的灵敏度。

  • 视角变化(Viewpoint variation):对同一识别对象,观察位置不同,看到的样子也就不同。
    这里写图片描述
  • 光照影响(Illumination):光照的影响在像素级上是非常明显的。
    这里写图片描述
  • 形状变化(Deformation):很多识别对象都不是刚体,比如一只猫,它的姿态可以千奇百怪。
    这里写图片描述
  • 遮掩(Occlusion):如果识别对象被部分遮挡,该如何检测?比如,如何仅仅通过猫的头部或是猫的尾巴就能辩认出这是一只猫。
    这里写图片描述
  • 背景干扰(Background clutter):识别对象可能会融入到它们所处的环境中,使得难以识别。
    这里写图片描述
  • 类间差异(Intraclass variation):相同的一类对象可能有很多不同的类型,即“一猪生九仔,连母十个样”。
    这里写图片描述

数据驱动方法

  在图像分类中,首先要收集大量数据,每一个类别都应有大量的图像样例,称之为训练数据集,然后才是不断改进算法。

  具体方法步骤是:

  • 大量收集图像及对应标签的数据集。数据集,也称训练集,应包含足够多的图像,每个标签都有多个不同的类。
  • 使用机器学习训练分类器。我们的任务是让分类器通过训练集辨识不同类别的样子。
  • 在新的图像上评估分类器的分类效果。将分类器的预测结果与真实标签进行对比,从而对分类器进行评估。理想的效果是预测标签与实际标签相同。

最近邻分类器

  最近邻分类器(Nearest Neighbor Classifier)与CNN卷积神经网络无关,在实际工作中也很少用到,但它能让我们对图像分类问题的基本方法有个大概了解。

  这里我们介绍一个数据集,名为 CIFAR-10。CIFAR-10是一个有名的图像分类数据集,包含了60000张图像(32×32),对应十个标签。其中,50000张是训练集,10000是测试集。下图是CIFAR-10数据集的部分图像,划分为10类。右边第一列是测试图像,其余列是通过最近邻分类方法在训练集中搜寻的最相似的十张图像。(从这里,我们可以知道,Nearest Neighbor Classifier为什么很少应用于实际)

  如何实现最近邻分类器呢?最简单的方法就是比较两张图像像素间的差异,然后把所有的差异相加。给定两张图像I1和I2,可以通过 ‘L1 distance ’ 来定义。

d1(I1,I2)=p|Ip1Ip2|


  一般来说,如果在 CIFAR-10 数据集上进行分类测试,准确率只能达到38.6%,虽然比随机预测的10%要高,但无法与CNN高达95的准确率对比。

  计算两个图像向量的距离的方法还有很多种,比如 ‘L2 distance’ ,即计算两个向量间的欧式距离。

d2(I1,I2)=p(Ip1Ip2)2

  在实际运算中,我们可以忽略根号,因为它是单调函数,虽然改变了距离大小的绝对值,但是不会造成影响。在 CIFAR-10 数据集上进行测试,只能得到35.4%的准确率,低于L1 distance。当两张图像差异较大时,L2 distance的值会明显大于L1 distance。L1 distance 和 L2 distance 都是最常用的 p-范数的特例。

  最近邻分类器的一个优点是容易理解与实现,另外,该分类器不需要训练时间,因为它只是存储训练数据,也可能需要为训练数据编索引。然而,它需要大量时间进行测试,当对一张图像进行分类时,需要遍历地去对比所有图像样本。在实际工作中,我们更关心测试时间而非训练时间。以深度神经网络为例,虽然训练成本很高,但是一旦训练工作完成,测试新样本的成本就非常低了。

  最近邻分类器的计算复杂度是一个活跃的研究领域,有很多的近似最近邻(ANN:Approximate Nearest Neighbor)算法和库,能够加速数据集如FLANN中的最近邻检索。 这些算法允许在检索期间利用其空间复杂度或是时间复杂度来权衡最近邻检索的正确性,并且通常依赖于涉及构建kdtree或运行k均值算法的预处理阶段或索引阶段。


k最近邻分类器

  k最近邻分类器(k - Nearest Neighbor Classifier)要比最近邻分类器实现效果更好。不同于在训练集中寻找单个最相似的图像,k最近邻分类器所采用的方法是寻找k个最相似的图像,根据这k个图像为测试图像贴上对应标签。

  很明显,当k的值为1时,就是最近邻分类器。k值越大,实现的效果越平滑,异常值造成的干扰越小。


  其中,NN classifier使用的是L2 distance方法,5-NN classifier中白色部分是指分类不明确的区域。对于异常值,NN classifier图中生成了错误预测的孤立区域,而在5-NN classifier图中,则是以平滑的方式进行处理。

  K最近邻分类器在实际工作中几乎不会用到。首先,它在测试阶段非常缓慢,需要耗费大量时间。其次,图像间的距离信息意义不大,当对图像中同一识别对象进行遮掩、平移、变色后,很难辨识出这是相同的对象。最后,它会造成维数灾难。一维中需要4个点,二维图像需要42即16个点,三维图像需要43即64个点,以此类推。



超参数调整的验证集

  在k最近邻分类器中,k值设定为多少才最合适呢?在本文前段中,已经介绍了L1范数和L2范数,但还有很多选择还未考虑。这些选择就叫做超参数,在机器学习设计算法时频繁出现。

  值得注意的是,我们不能使用测试集来调整超参数。因为测试集数据应被视为珍贵的资源,在机器学习算法中,除了最后的测试阶段,其余阶段尽量不要使用测试集。另一个原因是,如此调整超参数后,把测试集数据当成了训练集数据,这样分类器能在测试集中很好地运行,但部署模型时将会出现明显的性能降低。

  于是提出了一个调整超参数的较好方法,它将训练集中的小部分数据划分出来,称之为验证集。以 CIFAR-10 为例,将50000的训练集数据划分成49000的训练集和1000的验证集。

交叉验证

  交叉验证是一种更为复杂的调整超参数的方法。当训练集数据的规模过小时,验证集的规模自然也很小,交叉验证能很好解决这一问题。

  之前调整超参数的方法是随机选取1000个数据作为验证集,而交叉验证则是迭代不同的验证集,并求这些验证集的平均性能。在k折交叉验证中,我们将训练集划分为均等的k份子样本,其中k-1份用于训练,1份用于验证。如此重复k次,每个子样本验证一次,对这k次的结果求平均,最终得到一个单一估测。

  以5折交叉验证为例,将训练集train data划分为均等的5份子样本,其中4份用于训练,1份(黄色部分)用于验证。迭代重复,每个fold都将被视作验证集,最后对这5次的结果求平均,得到5折交叉验证的准确率。

  图中横轴是k值,纵轴是交叉验证的准确率,当k值大约取7时,能达到最高的准确率。

  在实际工作中,交叉验证计算昂贵,所以一般都是使用单次验证而非交叉验证。一般是将训练集中50%~90%的数据作为验证集,当然,如果超参数数值过大时,我们需要用到更大的验证集。当样本数量过少时,才优先考虑交叉验证。


阅读全文
0 0
原创粉丝点击