1 图像增广
1.1 常用的图像增广方法
- 样例图片:
1 | %matplotlib inline |
<matplotlib.image.AxesImage at 0x7f58f7ddc550>
- 大多数图像增广方法都具有一定的随机性。为了便于观察图像增广的效果,我们下面定义辅助函数apply, 在输入图像img上多次运行图像增广方法aug并显示所有结果。
1 | def apply(img, aug, num_rows=2, num_cols=4, scale=1.5): |
1.1.1 翻转和裁剪
- 50%的概率水平翻转图像
1 | apply(img, torchvision.transforms.RandomHorizontalFlip()) |
50%的概率垂直翻转图像
- 上下翻转图像不如左右图像翻转那样常用。但是,至少对于这个示例图像,上下翻转不会妨碍识别。
1 | apply(img, torchvision.transforms.RandomVerticalFlip()) |
随机裁剪,使物体以不同的比例出现在图像的不同位置; 汇聚层可以降低卷积层对目标位置的敏感性
随机裁剪一个面积为原始面积10%到100%的区域,该区域的宽高比从0.5~2之间随机取值。然后,区域的宽度和高度都被缩放到200像素
1 | shape_aug = torchvision.transforms.RandomResizedCrop( |
1.1.2 变化颜色
我们可以改变图像颜色的四个方面:
亮度: 调整亮度可以使图像看起来更明亮或更暗
对比度: 增加对比度可使图像中的阴影更加明显
饱和度: 饱和度是指颜色的纯度
色调: 色调是指颜色的个别阴影
随机更改图像的亮度,随机值为原始图像的50%(1−0.5)到150%(1+0.5)之间。
1 | apply(img, torchvision.transforms.ColorJitter(brightness=0.5, contrast=0, saturation=0, hue=0)) |
- 随机更改图像的色调。
1 | color_aug = torchvision.transforms.ColorJitter(brightness=0, contrast=0, saturation=0, hue=0.5) |
1.1.3 组合使用多种图像增广方法
1 | augs = torchvision.transforms.Compose([ |
1.2 使用图像增广训练模型
- 使用cifar10数据集
1 | all_images = torchvision.datasets.CIFAR10(train=True, root='./data', download=True) |
Files already downloaded and verified
- 为了在预测过程中得到确切的结果,我们通常对训练样本只进行图像增广,且在预测过程中不使用随机操作的图像增广。
1 | train_augs = torchvision.transforms.Compose([ |
1.2.1 多GPU训练
1 | #@save |
- 利用图像增广训练模型.
1 | batch_size, devices, net = 256, [torch.device(f'cuda:6')], d2l.resnet18(10, 3) |
loss 0.171, train acc 0.941, test acc 0.851
4751.6 examples/sec on [device(type='cuda', index=6)]