pytorch图像数据增强N大技巧

数据增强对深度神经网络的训练来说是非常重要的,尤其是在数据量较小的情况下能起到扩充数据的效果。

还记得当时在学习过拟合的解决方法的时候,就有一条就是数据增强,那么我们这次来学习下,在 pytorch 中如何进行数据增强的具体操作。

直接上代码,很清晰明了。

import PIL.Image as Image
import os
from torchvision import transforms as transforms
import torchvision.transforms.functional as TF

# 此处是基础函数,就是读取图像,是使用PIL格式的
# pytorch提供的torchvision主要使用PIL的Image类进行处理,所以它数据增强函数大多数都是以PIL作为输入,并且以PIL作为输出。
# 选取PIL库是因为这是python的原生库,兼容性比较强
def read_PIL(image_path):
    """ read image in specific path
    and return PIL.Image instance"""
    image = Image.open(image_path)
    return image

# 中心裁剪
def center_crop(image):
    CenterCrop = transforms.CenterCrop(size=(300, 300))
    cropped_image= CenterCrop(image)
    return cropped_image

# 随机裁剪
def random_crop(image):
    RandomCrop = transforms.RandomCrop(size=(200, 200))
    random_image = RandomCrop(image)
    return random_image

# 定心定义尺寸
def resize(image):
    Resize = transforms.Resize(size=(100, 150))  # 指定长宽比
    resized_image = Resize(image)
    return resized_image

# 水平翻转
def horizontal_flip(image):
    HF = transforms.RandomHorizontalFlip()
    hf_image = HF(image)
    return hf_image

# 垂直翻转
def vertical_flip(image):
    VF = transforms.RandomVerticalFlip()
    vf_image = VF(image)
    return vf_image

# 随机角度旋转
def random_rotation(image):
    RR = transforms.RandomRotation(degrees=(10, 80))
    rr_image = RR(image)
    return rr_image

# 色度、亮度、饱和度、对比度的变化
def BCSH_transform(image):
    im = transforms.ColorJitter(brightness=1)(image)
    im = transforms.ColorJitter(contrast=1)(im)
    im = transforms.ColorJitter(saturation=0.6)(im)
    im = transforms.ColorJitter(hue=0.4)(im)
    return im

# 随机灰度化
def random_gray(image):
    gray_image = transforms.RandomGrayscale(p=0.5)(image)    # 以0.5的概率进行灰度化
    return gray_image

# Padding (将原始图padding成正方形)
def pad(image):
    pad_image = transforms.Pad((0, (im.size[0]-im.size[1])//2))(im)
    return pad_image


def erase_image(image, position, size):
    """
    按照指定的位置和长宽擦除
    :param image_path: 输入图像
    :param position: 擦除的左上角坐标
    :param size: 擦除的长宽值
    :return: 返回擦除后的图像
    """
    img = TF.to_tensor(image)
    erased_image = TF.to_pil_image(TF.erase(img=img,
                            i=position[0],
                            j=position[1],
                            h=size[0],
                            w=size[1],
                            v=1))
    return erased_image

def gamma_transform(image, gamma_value):
    """
    进行伽马变换
    :param image_path: 输入图片路径
    :param gamma_value: 伽马值
    :return: 伽马变换后的图像
    """
    gamma_image = TF.adjust_gamma(img=image, gamma=gamma_value)
    return gamma_image



#im = read_PIL('D:/new_learn/images/src1.jpeg')
im = read_PIL('D:/new_learn/images/src.jpg')
print(im.size)  # 得到尺寸

outDir = 'D:/new_learn/images/'
os.makedirs(outDir, exist_ok=True)

center_cropped_image = center_crop(im)  # 中心裁剪
center_cropped_image.save(os.path.join(outDir, 'center_cropped_image.jpg'))

random_cropped_image = random_crop(im)  # 随机裁剪
random_cropped_image.save(os.path.join(outDir, 'random_cropped_image.jpg'))

resized_image = resize(im)  # 重新resize
resized_image.save(os.path.join(outDir, 'resized_image.jpg'))

hf_image = horizontal_flip(im)  # 水平翻转
hf_image.save(os.path.join(outDir, 'hf_image.jpg'))

vf_image = vertical_flip(im)  # 垂直翻转
vf_image.save(os.path.join(outDir, 'vf_image.jpg'))

rr_image = random_rotation(im)  # 随机翻转
rr_image.save(os.path.join(outDir, 'rr_image.jpg'))

bcsh_image = BCSH_transform(im)  # 色度、亮度、饱和度、对比度的变化
bcsh_image.save(os.path.join(outDir, 'bcsh_image.jpg'))

random_gray_image = random_gray(im)  # 随机灰度化
random_gray_image.save(os.path.join(outDir, 'random_gray_image.jpg'))

pad_image = pad(im)  # 将图形加上padding,行成正方形
pad_image.save(os.path.join(outDir, 'pad_image.jpg'))

erased_image = erase_image(im, (100, 100), (50, 200))  # 指定区域擦除
erased_image.save(os.path.join(outDir, 'erased_image.jpg'))

gamma_image = gamma_transform(im, 0.1)  # γ变换
gamma_image.save(os.path.join(outDir, 'gamma_image.jpg'))

# 使用Compose函数生成一个PiPeLine, 经过这样处理后,我们就可以直接使用data_transform来进行图像的变换
data_transform={'train':transforms.Compose([
                    transforms.RandomHorizontalFlip(),
                    transforms.Resize(size=(100, 150)),
                    transforms.CenterCrop(size=(100, 150)),
                    transforms.ToTensor(),
                    transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
                    ])}

效果如下:
原图:
在这里插入图片描述

中心裁剪:
在这里插入图片描述

随机剪裁:
在这里插入图片描述

重新resize:
在这里插入图片描述

水平翻转:
在这里插入图片描述

垂直翻转:
在这里插入图片描述

随机翻转:
在这里插入图片描述

色度、亮度、饱和度、对比度的组合变化:
在这里插入图片描述

随机灰度化:
在这里插入图片描述

将图形加上padding,行成正方形:
在这里插入图片描述

指定区域擦除:
在这里插入图片描述

伽马变换:
在这里插入图片描述

PyTorch 是一个开源的深度学习库,由 Facebook Research 开发,它提供了高效的张量计算功能以及动态计算图,使得研究者和开发者能够方便地构建、训练和部署深度学习模型。在图像增强方面,PyTorch 提供了丰富的工具和功能来处理和增强图像数据,以便于模型更好地泛化和适应不同的输入。 图像增强在深度学习中通常用于: 1. **数据扩充(Data Augmentation)**:通过对原始图像进行旋转、翻转、裁剪、缩放、亮度调整、色彩变换等操作,生成多样化的训练样本,防止过拟合并提高模型的鲁棒性。 2. **预处理(Preprocessing)**:标准化或归一化像素值,使其落入特定的数值范围,比如将像素值从 0-255 转换为 -1 到 1 或者 0 到 1。 3. **随机性(Randomness)**:在训练过程中引入随机性,保证每次迭代看到的数据略有不同,模拟真实世界的不确定性。 PyTorch 中可以使用 `torchvision.transforms` 这个模块来进行图像增强。例如: ```python from torchvision import transforms transform = transforms.Compose([ transforms.RandomResizedCrop(size, scale=(0.8, 1.0)), transforms.RandomHorizontalFlip(p=0.5), transforms.ColorJitter(brightness=0.1, contrast=0.1, saturation=0.1), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) ``` 这里定义了一个包含多种增强操作的 `Compose` 对象,你可以根据需要调整这些参数。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值