翻转和裁剪
左右翻转图像通常不会改变对象的类别。这是最早且最广泛使用的图像增广方法之一。 接下来,我们使用transforms模块来创建RandomFlipLeftRight实例,这样就各有50%的几率使图像向左或向右翻转。
- 向右翻转图像
# img 是读入的照片
apply(img, torchvision.transforms.RandomHorizontalFlip())
2. 上下翻转图像
apply(img, torchvision.transforms.RandomVerticalFlip())
3. 图像进行随机裁剪
shape_aug = torchvision.transforms.RandomResizedCrop(
(200, 200), scale=(0.1, 1), ratio=(0.5, 2))
apply(img, shape_aug)
'''
(200, 200)这是RandomResizedCrop的目标输出尺寸,即裁剪后的图像将被调整为200x200像素。
scale=(0.1, 1):图像将被缩放到原始尺寸的10%到100%之间。
ratio=(0.5, 2):这个参数指定了随机调整大小时图像的宽高比范围,ratio的范围是从0.5到2。这意味着在裁剪之前,图像的宽度和高度将被缩放,使得宽高比在0.5到2之间。
'''
4. 改变颜色
apply(img, torchvision.transforms.ColorJitter(
brightness=0.5, contrast=0, saturation=0, hue=0))
'''
brightness=0.5:亮度调整参数。这个参数指定了亮度变化的范围。在这个例子中,brightness 设置为0.5,意味着图像的亮度可以在原始亮度的50%到150%之间随机变化。
contrast=0:对比度调整参数。这个参数指定了对比度变化的范围。在这个例子中,contrast 设置为0,意味着对比度不会发生变化,即图像的对比度保持不变。
saturation=0:饱和度调整参数。这个参数指定了饱和度变化的范围。在这个例子中,saturation 设置为0,意味着饱和度不会发生变化,即图像的颜色饱和度保持不变。
hue=0:色调调整参数。这个参数指定了色调变化的范围。在这个例子中,hue 设置为0,意味着色调不会发生变化,即图像的色调保持不变。
'''
apply(img, torchvision.transforms.ColorJitter(
brightness=0, contrast=0, saturation=0, hue=0.5))
结合多种图像增广方法
shape_aug = torchvision.transforms.RandomResizedCrop(
(200, 200), scale=(0.1, 1), ratio=(0.5, 2))
color_aug = torchvision.transforms.ColorJitter(
brightness=0.5, contrast=0.5, saturation=0.5, hue=0.5)
augs = torchvision.transforms.Compose([
torchvision.transforms.RandomHorizontalFlip(), color_aug, shape_aug])
apply(img, augs)
案例
在这里,我们只使用最简单的随机左右翻转。 此外,我们使用ToTensor实例将一批图像转换为深度学习框架所要求的格式,即形状为(批量大小,通道数,高度,宽度)的32位浮点数,取值范围为0~1。
这里用的cifar10作为案例:
train_augs = torchvision.transforms.Compose([
torchvision.transforms.RandomHorizontalFlip(),
torchvision.transforms.ToTensor()])
test_augs = torchvision.transforms.Compose([
torchvision.transforms.ToTensor()])
# 这里用的cifar10作为案例
def load_cifar10(is_train, augs, batch_size):
dataset = torchvision.datasets.CIFAR10(root="../data", train=is_train,
transform=augs, download=True)
dataloader = torch.utils.data.DataLoader(dataset, batch_size=batch_size,
shuffle=is_train, num_workers=d2l.get_dataloader_workers())
return dataloader
# 形成数据
train_iter = load_cifar10(True, train_augs, batch_size)
test_iter = load_cifar10(False, test_augs, batch_size)