<前篇----后篇>
在初次进入坑,接触高深的算法环节之前,有必要对计算机视觉的目标和实现有一个大概的了解。虽说都是些量少易懂的知识点,却主角般地贯穿着整个学习过程,而且作为从小白到学习者思维转换的桥梁,其必要性是肯定的。所以对于从未接触过深度学习的小白,强烈推荐了解,非小白可跳过
图像分类
首先来了解在计算机视觉领域上的图像指的是什么。——图像由像素组成,每个像素通过三原色(RGB)的明暗组合形成一种颜色,RGB各有256级亮度用数字0~255表示。最终图像就是一个由数字组成的三维数组Rw*h*c,三个维度分别是宽、高、颜色通道。
所谓的图像分类问题,则是在已有固定的分类标签集合中找出一个标签分配给输入的图像。这是计算机视觉领域的核心问题之一,并且有着各种各样的实际应用。计算机视觉领域中很多看似不同的问题(比如物体检测和分割),都可以被归结为图像分类问题,许多算法和原理都是为解决此问题服务的。
图像分类对人来说是简单至极的,但对于本质上只会算数的计算机来说,问题变得复杂起来。“把代表图像的一堆数字通过数学运算变成一个标签(通过计算获得视觉)” 光是这个过程就看似无法理解了,但实际上这是可行的,不少现有的模型能获得不错的结果,原理与实现之后会介绍,现在我们来谈谈计算机视觉算法在图像识别方面遇到的一些困难
- 视角变化(Viewpoint variation):同一个物体,摄像机可以从多个角度来展现。
- 大小变化(Scale variation):物体可视的大小通常是会变化的。
- 形变(Deformation):很多东西的形状并非一成不变,会有很大变化。
- 遮挡(Occlusion):目标物体可能被挡住。有时候只有物体的一小部分是可见的。
- 光照条件(Illumination conditions):在像素层面上,光照的影响非常大。
- 背景干扰(Background clutter):物体可能混入背景之中,使之难以被辨认。
- 类内差异(Intra-class variation):同一类物体的个体之间外形差异可能很大。
这些在人看来不太影响分类的变化,在计算机看来简直是天差地别,每一种变化都让输入的数字数组发生巨大变化。如何提高算法的健壮性,增强噪音抵抗力,在维持分类结论稳定的同时,保持对类间差异足够敏感,这些都是算法设计者要考虑的问题
数据驱动方法
关于详细的解释,可以参考。这里只简单的说明一下,由于类别的多样性与同类的相似性,在算法中逐一指定参数实现某个类的区分是很不现实的(先不考虑能不能直接找出这堆参数),所以目前流行的算法更类似于人类学习的过程——给计算机很多已分类好的数据,然后实现学习算法,让计算机自己调整这堆参数,从而学习到每个类的区分。这种方法,就是数据驱动方法。
以此为基础,整个图像分类过程可以总结为三步:
- 输入: 输入是包含N个图像(3维数组)的集合,每个图像的标签是K种分类标签中的一种。这个集合称为训练集。
- 学习: 用训练集来学习每个类到底长什么样。一般该步骤叫做训练分类器或者学习一个模型。
- 评价: 让分类器来预测它未曾见过的图像(测试集)的分类标签,并以此来评价分类器的好坏。如果分类器预测的分类标签和图像真正的分类标签一致,那很棒。
关于数据来源,cs231n课程使用的是图像分类数据集,这个数据集包含了60000张32X32的小图像。每张图像都有10种分类标签中的一种。这60000张图像被分为包含50000张图像的训练集和包含10000张图像的测试集。本系列也将基于此数据进行实践。
超参数及其调优
在构造分类器(算法)的时候,某些参数和函数的是必须要人为选择的,但是关于选择哪个才能获得最佳效果,不实践的话很难直接给出答案。类似这样的选择,就叫做超参数。这样一说,调优的方法就很明了了,把可能的选择都试一遍,选择准确率最高的一个就行了(通常作图分析取峰值)。
但要注意的是千万不能用测试集来进行调优,因为这会带来对测试集过拟合的风险(用测试集训练出来的分类器跑测试集当然表现好,都熟悉了
)。正确的做法是从训练集中分一部分(通常10%~50%)作为验证集用于调优,剩下的再作为训练集用于学习。测试数据集只使用一次,即在训练完成后评价最终的模型时使用。
交叉验证
有时候训练集数量较少,分得的验证集更少,不利于超参数的调优,这时会用交叉验证的方法,尽可能榨干整个训练集。
原理是把训练集分成N份(通常3,5,10),循环着取其中一份作为验证集,其他作为训练集,共跑N次。对于每个超参数的N个结果取它们的平均值作为该参数的表现,所有平均值画线连接取峰值对应的参数即可。
通常在深度学习(大型模型)中不会用交叉验证,因为这会使计算量翻N倍。但对于小型数据集值得一试。