前面的部分专注于卷积神经网络的层结构介绍,同时还介绍了到目前为止比较出名的卷积神经网络,接着使用比较复杂的卷积神经网络提高了 MNIST 数据集的准确率。下面将从另外的角度——图像增强的方面入手,提高模型的准确率和泛化能力。
一直以来,图像识别这一计算机视觉的核心问题都面临很多挑战,同一个物体在不同情况下都会得出不同的结论。
对于一张照片,我们看到的是一些物体,而对于计算机而言,它看到的是一些像素点,如图 4.23所示。
如果拍摄照片的照相机位置发生了改变,那么拍得的图片对于我们而言,变化很小,但是对于计算机而言,图片的像素变化是很大的。拍照时的光照条件也是很重要的一个影响因素:光照太弱,照片里的物体会和背景融为一体,它们的像素点就会很接近,计算机就无法正确识别出物体,如图4.24所示。
除此之外,物体本身的变形也会对计算机识别造成障碍,比如一只猫是趴着的,计 算机能够识别它,但如果猫换了一个姿势,变成躺着的状态,那么计算机就无法识别了,如图 4.25所示。
最后,物体本身会隐藏在一些遮蔽物中,这样物体只呈现局部的信息,计算机也难以识别,如图4.26所示。
针对这些问题,我们希望能够对原始图片进行增强,在一定程度上解决部分问题在 PyTorch 中已经内置了一些图像增强的方法,不需要再繁琐地去实现,只需要简单的调用。
torchvision.transforms 包括所有图像增强的方法。
- 第一个函数是 Scale,对图片的尺度进行缩小和放大;
- 第二个函数是 CenterCrop,对图像正中心进行给定大小的裁剪;
- 第三个函数是 RandomCrop,对图片进行给定大小的随记裁剪;
- 第四个函数是 RandomHorizaontalFlip,对图片进行概率为 0.5 的随机水平翻转;
- 第五个函数是 RandomSizedCrop,首先对图片进行随机尺寸的裁剪,然后对裁剪的图片进行一个随机比例的缩放,最后将图片变成给定的大小,这在 InceptionNet 中比较流行;
- 最后一个是 Pad,对图片进行边界零填充。
上面介绍了 PyTorch 内置的一些图像增强的方法,还有更多的增强方法,可以使用 OpenCV或者 PIL 等第三方图形库实现。在网络的训练中图像增强是一种常见、默认的做法,对多任务进行图像增强之后都能够在一定程度上提升任务的准确率。