首先我们下载测试数据, 按照数据描述所示, 该数据具有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
的方式, 将高维向量映射到低维向量中.