准备数据

首先我们下载测试数据, 按照数据描述所示, 该数据具有6w 个样本, 每个图片是 32 x 32 维, 并分为 10 大类.每大类是 6000 个.

CIFAR-10 and CIFAR-100 datasets

对于图片, 我们可以将图片中的每个像素点都转化为 RGB 的形式, 由此将 图片转为 三维数组 的形式

相应的 python 代码如下所示

import matplotlib.pyplot as plt

def test_read_img(path):
    img = plt.imread(path)
    print(img.shape)  # 打印图片大小
    plt.imshow(img)
    plt.show()

影响图片识别的因素

实际项目中, 影响图像识别的因素有很多, 同一个物体的不同视角, 图像的大小, 主要的物体被部分覆盖, 图片的亮度, 同一物体的不同形状等等, 都可能影响图像识别的结果.

如果直接使用数据进行 KNN 识别, 显然是不可以的.

KNN模型的核心是计算距离。假设我们把图片转换成数据,之后无非就是计算两个矩阵/张量之间的距离罢了,这很明显不会考虑到以上几个问题,这也是为什么KNN这种方式得出来的效果并不是特别好的主要原因。

如果坚持使用 KNN, 那么我们就需要对原始数据做 特征工程, 提取一些能够对图片进行很好的总结, 并且能够较好的处理不同环境的影响的特征, 这样的特征我们称之为 rotation-invariant

常用的图片特征

常用的图片特征有如下几种

这样特征除了能够较好的总结一个图片, 并且能够对数据进行 降维.

这样的降维操作, 除了能够节省计算资源, 它也会更好的保留图片中的重要信息, 帮助过滤掉无用的噪声

除了以上几种特征, 我们还可以采用 PCA 的方式, 将高维向量映射到低维向量中.