## 图像在计算机中的存储形式和分类需要注意的问题
图像在计算机中一般是一个3维的0~255的矩阵序列(分别存储R\G\B三原色信道的值)。
在图像分类中需要注意的问题有:
* 视角、视点问题
* 照明度(曝光度、阻光度)问题
* 形态问题(变形、尺寸大小)
* 背景混淆
* 类内多样性
## 数据驱动方法
我们无法像排序一样设计一个具体的算法来解决这种问题。所以我们需要像教儿童一样,给出一定数量的照片,并标签上属于哪一类,以此来设计一种机器学习的方法,来学习每一类照片的综合视觉表征(特征)。 这样的一种方法就称为数据驱动方法。数据驱动方法依赖于首先给出的数据以及其分类标签。
### 图像分类的步骤
图像分类的任务就是获取一个像素序列(代表一个单个的图像),并依据我们的学习结果给图像一个标签。完整的步骤可以格式化如下:
* 输入:输入N个图片以及其标签作为训练集
* 训练/学习:使用训练集来学习/训练每一类的图像特征。这一步骤也称为训练模型。
* 评估:我们使用一个训练模型从未见过的数据集作为测试集进行分类预测,得到预测结果,并和真正的分类结果进行比较,用准确率来进行模型优劣的评估。
## 最近邻分类器
最近邻分类器在实际中并不常用,目前只介绍其原理。
最近邻分类器训练模型时,单纯的将图像的R\G\B信道的像素值进行简单的记录。在进行预测图片分类时,找出图片在像素值上的最近邻,将最近邻的分类标签作为其分类标签。
最近邻分类器使用的近邻距离分为L1和L2两种,公式分别如下:
L1:\sum_p|I_1^p-I_2^p|
$$
L2:\sqrt{\sum_p(I_1^p-I_2^p)^2}
$$
使用CIFAR-10数据集下,两种计算方法的准确率分别为38.6%和35.4%。这比随机盲猜要高,但是还是远远不及人类的分类能力。而最先进的卷积神经网络则可以达到95%的准确率,已经达到了人类的94%之上。
## K近邻分类器(kNN)
K近邻分类器的思想很简单,不再单纯找一个最近的,而是找K个最近的,由他们分别对结果产生贡献来计算最终的分类。但是有一个很大的问题是,如何选取这个K。
### 超参数优化的验证集
我们可以将训练集分为两部分,多的一部分用来训练,而另一部分我们叫做验证集,来验证在k取某定值的情况下的准确率,以选取最优的k。但是要记住,不能使用测试集做训练集或验证集,否则会导致过拟合的现象(在测试集的性能表现良好,但是实际性能可能比较差)。
#### 交叉验证
当训练集数据量比较小的时候,只用一个验证集可能会出现一定的问题导致实际性能低下。这时候我们可以训练集等分为若干份,进行多次交叉训练和验证,并取性能平均值,来选择k。
### 优点和缺点
kNN的优点在于低维数据时较优、训练时间较短,但是其测试预测时间要长。
针对预测时间长的问题,现在有出现近似最近邻等算法(ANN),使用kd-tree或者k-means进行解决。 神经网络也是一种不错的选择,其与kNN相反,训练时间长,但是测试时间短。
而且kNN在处理高维数据的时候,像素往往不能作为决定性因素,所以kNN在实际的图像分类中是不常用的。L1和L2距离的kNN似乎相比图片的语义表达,更为重视颜色的相近性。