《动手学深度学习》之图像增广(一)

参考图像增广
定义:
图像增广(image augmentation)技术通过对训练图像做一系列随机改变,来产生相似但又不同的训练样本,从而扩大训练数据集的规模。
图像增广的另一种解释是,随机改变训练样本可以降低模型对某些属性的依赖,从而提高模型的泛化能力

常见增广方式有:
1.对图像进行不同方式的裁剪,使感兴趣的物体出现在不同位置,从而减轻模型对物体出现位置的依赖性。
2.调整亮度、色彩等因素来降低模型对色彩的敏感度

下面以这幅图(400 * 500)为例,或者将自己想要的图放到和代码py同一个文件夹就可以了
在这里插入图片描述
代码显示图片

import torch
import torchvision
import matplotlib.pyplot as plt
from PIL import Image
img = Image.open('1.png')
plt.imshow(img)

左右and上下翻转

def show_images(imgs, num_rows, num_cols, scale=2):
    figsize = (num_cols * scale, num_rows * scale)
    _, axes = plt.subplots(num_rows, num_cols, figsize=figsize)
    for i in range(num_rows):
        for j in range(num_cols):
            axes[i][j].imshow(imgs[i * num_cols + j])
            axes[i][j].axes.get_xaxis().set_visible(False)
            axes[i][j].axes.get_yaxis().set_visible(False)
    return axes


def apply(img, aug, num_rows=2, num_cols=4, scale=1.5):
    Y = [aug(img) for _ in range(num_rows * num_cols)]
    show_images(Y, num_rows, num_cols, scale)
# 一半概率的图像水平(左右)翻转
apply(img, torchvision.transforms.RandomHorizontalFlip())
apply(img, torchvision.transforms.RandomVerticalFlip())

每次随机裁剪出一块面积为原面积10%∼100%10%∼100%的区域,且该区域的宽和高之比随机取自0.5∼20.5∼2,然后再将该区域的宽和高分别缩放到200像素

shape_aug = torchvision.transforms.RandomResizedCrop(200, scale=(0.1, 1), ratio=(0.5, 2))
apply(img, shape_aug)

变化颜色增广----------------------------------------------------------------
可以从4个方面改变图像的颜色:
亮度(brightness)、对比度(contrast)、饱和度(saturation)和色调(hue)

apply(img, torchvision.transforms.ColorJitter(brightness=0.5))
apply(img, torchvision.transforms.ColorJitter(hue=0.5))
apply(img, torchvision.transforms.ColorJitter(contrast=0.5))
# 随机变化
color_aug = torchvision.transforms.ColorJitter(
    brightness=0.5, contrast=0.5, saturation=0.5, hue=0.5)
apply(img, color_aug)

叠加多个图像增广----------------------------------------------------

augs = torchvision.transforms.Compose([
    torchvision.transforms.RandomHorizontalFlip(), color_aug, shape_aug])
apply(img, augs)

all_imges = torchvision.datasets.CIFAR10(train=True, root="./data", download=False)
#若你的文件夹下没有该数据集,则改成    download = True
# all_imges的每一个元素都是(image, label)
show_images([all_imges[i][0] for i in range(32)], 4, 8, scale=0.8)

完整代码

import torch
import torchvision
import matplotlib.pyplot as plt
from PIL import Image
img = Image.open('1.png')
plt.imshow(img)



def show_images(imgs, num_rows, num_cols, scale=2):
    figsize = (num_cols * scale, num_rows * scale)
    _, axes = plt.subplots(num_rows, num_cols, figsize=figsize)
    for i in range(num_rows):
        for j in range(num_cols):
            axes[i][j].imshow(imgs[i * num_cols + j])
            axes[i][j].axes.get_xaxis().set_visible(False)
            axes[i][j].axes.get_yaxis().set_visible(False)
    return axes


def apply(img, aug, num_rows=2, num_cols=4, scale=1.5):
    Y = [aug(img) for _ in range(num_rows * num_cols)]
    show_images(Y, num_rows, num_cols, scale)
# 一半概率的图像水平(左右)翻转
apply(img, torchvision.transforms.RandomHorizontalFlip())
apply(img, torchvision.transforms.RandomVerticalFlip())

# 每次随机裁剪出一块面积为原面积10%100%10%100%的区域,且该区域的宽和高之比随机取自0.520.52,然后再将该区域的宽和高分别缩放到200像素
shape_aug = torchvision.transforms.RandomResizedCrop(200, scale=(0.1, 1), ratio=(0.5, 2))
apply(img, shape_aug)

# 变化颜色增广--------------------------------
# 可以从4个方面改变图像的颜色:
# 亮度(brightness)、对比度(contrast)、饱和度(saturation)和色调(hue)
apply(img, torchvision.transforms.ColorJitter(brightness=0.5))
apply(img, torchvision.transforms.ColorJitter(hue=0.5))
apply(img, torchvision.transforms.ColorJitter(contrast=0.5))
# 随机变化
color_aug = torchvision.transforms.ColorJitter(
    brightness=0.5, contrast=0.5, saturation=0.5, hue=0.5)
apply(img, color_aug)

# 叠加多个图像增广----------------------------------------------------
augs = torchvision.transforms.Compose([
    torchvision.transforms.RandomHorizontalFlip(), color_aug, shape_aug])
apply(img, augs)

all_imges = torchvision.datasets.CIFAR10(train=True, root="./data", download=False)
#若你的文件夹下没有该数据集,则改成    download = True
# all_imges的每一个元素都是(image, label)
show_images([all_imges[i][0] for i in range(32)], 4, 8, scale=0.8)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值