图像分类
图像分类是把一副图像赋予一个标签的,标签范围已知。图像分类问题是计算机视觉的核心;其他计算机视觉问题,例如物体检测、分割等,最终都可以看做是图像识别问题。
下面是一副图像,高和宽分别为400和248,包括3个通道RGB。这意味着图像包含400×248×3=297,600个像素,分类过程就是把这么多像素转换为一个标签。
图像分类面临着以下挑战: 1、视角变化:同一个物体在不同角度拍摄的图片不同。 2、比例变化:物体在图片所占比例可能不同。 3、变形:同一个物体,形状会发生有时会改变。 4、遮挡:目标物体有时会被遮挡,仅仅能看到部分物体。 5、光照:光照会影响像素值的大小。 6、背景:目标物体可能混乱在背景噪声中。 7、对象内部差异:一类对象范围很广,例如椅子,有各式各样的的椅子,外表各不相同。
下图是这些挑战的实例。优异的图像分类模型应该能够应对上面这些变化及其组合。
数据驱动
写一个图像分类算法和写一个数字排序算法并不相同,前者不像后者那么直观。像教小孩一样,我们需要大量的有标签的图像来训练一个图像分类算法。这种方法叫做数据驱动。下图就是用来供算法学习的训练集。
图像学习流程
图像分类的任务就是输入一组像素数据,输出一个标签。其流程吐下: 输入:N个有标签的图片,标签总类别为K。这些训练数据称作训练集。 学习:学习每一类图片的特征。这一步叫做训练或学习模型。 评估:用一个不同于训练集的有标签的集合来评估学好的模型。
最近邻分类器
最近邻分类器和卷积神经网络并不相关,但是它可以让我们学习了解图像分类的一些问题。
图像分类数据集CIFAR-10
CIFAR-10是很流行的小的图片集,它包含60,000张32x32的图片,总共有10个类别,每张图片属于其中一个类别。这60,000张图片分类训练集(50,000)和测试机(10,000)。下图在10类中随机挑选了一些:
如果使用最近邻分类器,具体做法就是把测试机的每张图片和50,000张训练集的图片做对比,找出距离最小的图片就其类别。
怎么对比图片的距离,一张图片有32x32x3个像素,最简单的办法就是对比每个像素值。即,给定两个向量I1,I2,来计算他们之间的L1距离
d1(I1,I2)=∑P|Ip1−Ip2|
下图是计算过程的可视化
这样的算法,只能达到38.6%左右的识别率,和最优的识别率95%差别很大。
如何选择距离:计算向量之间的距离有很多方式,另外一个常用的就是L2距离,它是计算两个向量之间的高斯距离:
d1(I1,I2)=∑P(Ip1−Ip2)2−−−−−−−−−−−√
使用这个距离,大概可以达到35.4%左右的识别率,比L1距离略低。
L1 vs L2:在对比两个向量的差异时,相比之下,L2比L1更加不能容忍这些差异。相对于一个大的差异,L2能更加容忍几个中等的差异。 这里需要理解,例如3个向量: [1,3],[4,6],[2,8],比较第一个向量和第二三个向量的L1,L2距离 L1距离为:4−1+6−3=6,2−1+8−3=6 L2距离为:32+32−−−−−−√=18−−√,12+52−−−−−−√=26−−√ L1距离相同时,L2距离却不同,L2加上了平方,在L1相同时,即差异和相同时,各个差异比较平均情况下,L2更小。
k-Nearest Neighbor分类器
上面例子中,只使用了距离测试图像最近的图片。kNN是使用了k个最近的图片,让k个图片来投票决定测试图片的标签。显然当k=1是就退化为上面的情况了。可以想象,更高的k值可以是分类结果更加平滑。
在实际问题中,图和选择k值,下面就来说明。
验证集用来调优超参数
在使用kNN分类时,k选择多少是最优?在计算距离时,L1还是L2,或者其他。这些参数叫做超参数hyperparameters,在机器学习的算法中会经常提到超参数这个概念。
在调参时,绝不应该使用测试集。测试集只是用来最后验证算法性能的,如果使用测试集调参,训练的模型在测试集上的表现会过于乐观,可能会造成在测试集的过拟合。
一个正确的做法是把训练集一分为二,一个小的训练集叫做验证集。以CIFAR-10为例,可以ongoing49,000张来训练,1000张当做验证集,在验证集上调参。当训练集比较小时,可以考虑使用交叉验证。
交叉验证,交叉验证是把训练集等分为几份,选择其中一份当做验证集,其余的当做训练集来训练。例如,下图是把数据分为5份,是5折交叉验证。
可以看书k=7是最优。5折交叉验证过程如下
实践,在实践中并不经常使用交叉验证,而是单独使用一个验证集,因为交叉验证带来了巨大的计算代价。常常把训练集的50%~90%当做训练集,其余当做验证集。如果验证集图片数量太少,最好还是使用交叉验证,常用的有3折、5折、10折交叉验证。
NN的优缺点
NN十分简单,容易实现和理解,且不需要训练,它需要存储所有训练数据在预测时进行计算。我们常常更加关心预测花费的时间,而不十分关心训练所用时间。实际上,深度卷积网络训练时花费很多时间,但是预测时间很短。
计算复杂度也是一个研究领域,几个Approximate Nearest Neighbor(ANN)算法和一些库可以用来加速。这些算法把精确度和复杂度做了一些trade off,例如预处理或索引建立kdtree,或者使用k-measn。
NN分类器更加适合低维度的数据,在图像分类中很少使用。图像是高维度数据,包含许多像素,高维数据的距离不符合直觉。下面图像的L2距离相似,但是图像语义差别很大。
下面这种图更加能说明这一点,相邻紧的图L2距离小,可以看出,邻近的图主要是背景或颜色相近,不是语义上的相近。
总结
本节介绍了图像分类、最近邻分类器(提出了超参数概念)。设置超参数的方法是设置验证集。在训练集样本比较少时,可以使用交叉验证方法。介绍了L1,L2距离概念。
kNN实践总结:
1、预处理数据:对数据进行进行归一化处理,使数据均值为0,方差为1。 2、如果数据维数很高,使用PCA等降维。 3、分割训练集,要有验证集。如果训练集样本比较少,考虑使用交叉验证。 4、测试不同的k值以及距离度量L1,L2。 5、如果预测时间过长,考虑使用近似NN库(Approximate NN library)。 6、记录超参数。不应该使用验证集来训练(最后的模型再用验证集训练),因为这样可能会导致超参数发生变化。正确的做法是使用测试集来评估超参数的效果。