5.3.1 数据预处理
数据集使用github上的开源猫、狗数据集,包含大小不一的猫、狗图片各5000张,其中4000张训练图片、1000张测试图片。下载地址为https://github.com/coolioasjulio/Cat-Dog-CNN-Classifier/tree/master/dataset。
将压缩后的数据集下载到路径../data并解压,得到cat_dog/train_set和cat_dog/test_set两个文件夹,均有cats和dogs两个类别,每个类别里面是图像文件。
分类任务中需要将图像从文件夹中读入,并以迭代器的形式进行训练。gluon的API提供了函数gluon.data.vision.ImageFolderDataset(),将图像文件根据分类进行预处理后读入数据。
创建两个ImageFolderDataset实例,分别读取训练数据集和测试数据集中的所有图像文件。相关代码如下:
测试集文件夹的路径:data\cat_dog\test_set,子文件夹cats和dogs,自动默认分类的类别class。下面画出前8张正类图像和后8张负类图像,如图5-4所示,大小和高宽比各不相同。相关代码如下:
图5-4 正负类图像
在图像处理时,采用增广技术。通过对训练图像做一系列随机改变,产生相似但又不同的训练样本,扩大训练数据集的规模。具体做法:一是对图像进行不同方式的裁剪,使感兴趣的物体出现在不同位置,减轻模型对物体出现位置的依赖性;二是调整亮度、色彩等因素,降低模型对色彩的敏感度,如图5-5所示。
首先,从图像中裁剪出随机大小和高宽比的一块区域;其次,将该区域缩放为高和宽均为224像素的输入并进行左右翻转。在测试过程中,将图像的高和宽均缩放为256像素,最后,从中裁剪出高和宽均为224像素的中心区域作为输入。此外,还需要对RGB(红、绿、蓝)三个颜色通道的数值做标准化:每个数值减去该通道所有数值的平均值,再除以该通道所有数值的标准差作为输出。相关代码如下:
图5-5 裁剪翻转效果