图像分类

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

  在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|Ip1−Ip2|d_1(I_1,I2) = \sum_p|I_1^p-I_2^p |

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

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

d2(I1,I2)=∑p(Ip1−Ip2)2−−−−−−−−−−−√d_2(I_1,I_2)=\sqrt{\sum_p(I_1^p-I_2^p)^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个点,二维图像需要424^2即16个点,三维图像需要434^3即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%的数据作为验证集,当然,如果超参数数值过大时,我们需要用到更大的验证集。当样本数量过少时,才优先考虑交叉验证。


【CS231n_2017】2-Image Classification相关推荐

  1. 【Transformer】CLS(classification)有什么用?

    CLS]就是classification的意思,可以理解为用于下游的分类任务. 一句话理解:[CSL]就是一个向量,只是不是某一个字的向量,是一个够代表整个文本的的语义特征向量,取出来就可以直接用于分 ...

  2. 【论文】Awesome Relation Classification Paper(关系分类)(PART II)

    0. 写在前面 上一篇[论文]Awesome Relation Extraction Paper(关系抽取)(PART I)介绍了一些关系抽取和关系分类方面的经典论文,主要是以CNN模型为主,今天我们 ...

  3. 【论文】Awesome Relation Classification Paper(关系分类)(PART I)

    0. 写在前面 "正确的判断来自经验,而经验来自于错误的判断" 之前做过的百度今年的语言与智能技术竞赛,其中有一个子赛道就是关于信息抽取.信息抽取(Information Extr ...

  4. 【cs231n】图像分类-Linear Classification线性分类

    [学习自CS231n课程] 转载请注明出处:http://www.cnblogs.com/GraceSkyer/p/8824876.html 之前介绍了图像分类问题.图像分类的任务,就是从已有的固定分 ...

  5. 【 Notes 】Positioning system classification

    Positioning systems determine the location of a person or an object either relative to a known posit ...

  6. 【Paper-Attack】Attacking Graph-Based Classification without Changing Existing Connections

    Attacking Graph-Based Classification without Changing Existing Connections 背景 training dataset中包含pos ...

  7. 【CS231n_2017】1-Introduction to CNN for Visual Recognition

      本专栏根据斯坦福大学2017年公开课CS231n的视频教程整理学习资料,做学习笔记.   首先简单介绍CS231n,又称Convolutional Neural Networks for Visu ...

  8. 【李宏毅】-机器学习2021-HW2-Phoneme Classification

    Data 这个任务是一个多分类问题: 从语音进行帧级音素预测. 数据分析 一个语音结果处理之后会得到一个特征向量,这个向量的是Txd, T是frame的长度,d是嵌入维度,使用不同的特征提取方法,得到 ...

  9. 【caffe-Windows】mnist实例编译之model的使用-classification

     [caffe-Windows]mnist实例编译之model的使用-classification 标签: 深度学习caffe 2016-08-16 11:24 1349人阅读 评论(12) 收藏 ...

最新文章

  1. 张宏江:人工智能的长远发展需要有人坐冷板凳
  2. 从程序员到项目经理(20):让员工为目标而干活
  3. 开了一论坛,专门讨论控件技术
  4. 并发工具类(三)控制并发线程数的Semaphore
  5. php实现socket编程
  6. STM32 基于正电原子开发板,改换芯片为STM32F103R6,Proteus仿真的一些问题
  7. 一个简单的WebService服务
  8. 推荐我看过的几本好书给大家!(2)
  9. hdu1114完全背包
  10. TOJ 4008 The Leaf Eaters
  11. 数据结构与算法 第二章 数据结构中的线性结构
  12. linux编译C++代码
  13. 汇编指令大全(带注释)
  14. 电信HG2201T网关(部分地区的电信网关2.0)超级密码获取
  15. Excel小技巧-获取列数
  16. 服务器租用带宽不够会出现哪些情况
  17. matlab 怎么解ode方程,Matlab解微分方程(ODE+PDE).pdf
  18. matlab中如何使用help,MATLAB中如何使用help?怎样看matlab的help
  19. matlab内置vmd吗,matlab中使用VMD(变分模态分解)
  20. python中的header_python中header是什么意思

热门文章

  1. KMP算法总结+Next数组+Nextval数组
  2. EasyBCD 2.4 个人版下载
  3. 【PAT】1001 害死人不偿命的(3n+1)猜想
  4. Community宣言
  5. Python之np.where的使用
  6. leetcode959. Regions Cut By Slashes
  7. 给csdn主页添加个人联系方式或二维码
  8. 火星人谚语系列之三:正确的答案一定简单
  9. IT男几时而立(上)
  10. 敏捷开发般若敏捷系列之五:如何推广敏捷(中)(无寿者,回报,破我执)...