数据增广之图像增广

数据增广之图像增广

数据增广指的是不仅仅针对图像,还可以针对文本、语音等数据,本文主要是针对图像这种数据的增广方式做一个简要了解。

数据增广

  • 增加一个已有数据集,使得有更多的多样性
    • 在语言里面加入各种不同的背景噪音
    • 改变图片的颜色和形状

图像增广需要注意的是,一般来说,使用增强后的数据进行训练,是一种在线生成方式,通过在线生成对原始数据生成成增强后的数据并用于训练,并不是说数据集真的新增加了许多经过变换后的图片。

并且这种在线生成的增广方式是随机的,也就是说这一次随机生成的图片增广后的结果很有可能跟下一次运行出来的结果是不一样的。

常见的图像增广方式

水平翻转

# 默认0.5的概率 随机水平翻转
apply(img, torchvision.transforms.RandomHorizontalFlip())

image-20250121192905003

上下/垂直翻转

但注意并不是所有的图片数据集都适合这种翻转方式,具体要看具体的图片是什么样子的。

# 默认0.5的概率 随机上下/垂直翻转
apply(img, torchvision.transforms.RandomVerticalFlip())

image-20250121192948352

随机裁剪

# 随机裁剪并resize到固定大小
# size  指定输出裁剪图像的大小,可以是整数(正方形)或元组(宽度,高度)
# scale 决定裁剪区域相对于原始图像面积的比例范围
# ratio 决定裁剪区域的宽高比范围
shape_aug = torchvision.transforms.RandomResizedCrop(
    size=(200, 200), scale=(0.1, 1), ratio=(1/2, 2/1))
apply(img, shape_aug)

image-20250121193011301

随机更改图像颜色

# 随机更改图像颜色 亮度brightness  对比度contrast  饱和度saturation  色调hue
# 参数中的 0.5 是指调整范围的幅度
# 表示会在 [1 - 0.5, 1 + 0.5] 的比例范围内变化,即 [0.5, 1.5] 倍(上下可调50%)
color_aug = torchvision.transforms.ColorJitter(
    brightness=0.5, contrast=0.5, saturation=0.5, hue=0.5
)
apply(img, color_aug)

image-20250121193034462

结合多种图像增广方法

# Compose 的主要功能是将多个变换按顺序组合成一个可调用的对象,对输入数据逐一应用这些变换
augmens = torchvision.transforms.Compose([
    torchvision.transforms.RandomHorizontalFlip(),
    color_aug,
    shape_aug])
apply(img, augmens)

image-20250121193103323

完整代码

import torch
import torchvision
from torch import nn
from d2l import torch as d2l
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np

# 设置图片路径,确保路径正确
img_path = 'img/cat.jpg'

# 检查路径是否正确,并加载图片
try:
    img = d2l.Image.open(img_path)  # 打开图片
    d2l.set_figsize()
    d2l.plt.imshow(img)  # 显示图片
    d2l.plt.axis('off')  # 隐藏坐标轴
    d2l.plt.show()  # 显示图片
except FileNotFoundError:
    print(f"图片路径 '{img_path}' 不存在,请检查路径是否正确。")


def show_imgs(img, mosaic_mode, num_rows, num_cols):
    row_col_size = (num_rows, num_cols)
    multi = row_col_size[0] * row_col_size[1] + 1
    for i in range(1, multi):
        plt.subplot(num_rows, num_cols, i)
        flip_img = mosaic_mode(img)

        flip_img = np.array(flip_img)[:]
        plt.imshow(flip_img)
        plt.axis('off')  # 隐藏坐标轴

    plt.show()


def apply(img, aug, num_rows=2, num_cols=4):
    Y = [aug(img) for _ in range(num_rows * num_cols)]
    show_imgs(img, aug, num_rows, num_cols)
    # d2l.show_images(Y, num_rows, num_cols, scale=scale)


# 默认0.5的概率 随机水平翻转
apply(img, torchvision.transforms.RandomHorizontalFlip())

# 默认0.5的概率 随机上下/垂直翻转
apply(img, torchvision.transforms.RandomVerticalFlip())

# 随机裁剪并resize到固定大小
# size  指定输出裁剪图像的大小,可以是整数(正方形)或元组(宽度,高度)
# scale 决定裁剪区域相对于原始图像面积的比例范围
# ratio 决定裁剪区域的宽高比范围
shape_aug = torchvision.transforms.RandomResizedCrop(
    size=(200, 200), scale=(0.1, 1), ratio=(1/2, 2/1))
apply(img, shape_aug)

# 随机更改图像颜色 亮度brightness  对比度contrast  饱和度saturation  色调hue
# 参数中的 0.5 是指调整范围的幅度
# 表示会在 [1 - 0.5, 1 + 0.5] 的比例范围内变化,即 [0.5, 1.5] 倍(上下可调50%)
color_aug = torchvision.transforms.ColorJitter(
    brightness=0.5, contrast=0.5, saturation=0.5, hue=0.5
)
apply(img, color_aug)

# 结合多种图像增广方法
# Compose 的主要功能是将多个变换按顺序组合成一个可调用的对象,对输入数据逐一应用这些变换
augmens = torchvision.transforms.Compose([
    torchvision.transforms.RandomHorizontalFlip(),
    color_aug,
    shape_aug])
apply(img, augmens)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值