目录
第一步:先将get_transform里面的配置修改为自己需要的
前言
本文概述:该模块涵盖了我们经常使用到的数据增强手段,注释详细,开箱即用,小白可以直接使用,大神也可以轻易定制。我希望该模块能够帮助大家减少重复造轮子的工作,将精力用在更重要的地方。
作者介绍:作者本人是一名人工智能炼丹师,目前在实验室主要研究的方向为生成式模型,对其它方向也略有了解,希望能够在CSDN这个平台上与同样爱好人工智能的小伙伴交流分享,一起进步。谢谢大家鸭~~~
如果你觉得这篇文章对您有帮助,麻烦点赞、收藏或者评论一下,这是对作者工作的肯定和鼓励。
零、数据增强的作用
数据增强是一种在机器学习和深度学习中用于增加样本数量和多样性的技术,其作用有以下几点:
1. 提高模型泛化能力:模型的泛化能力是指其对新数据的适应性能力,数据增强可以增加数据集大小和多样性,从而提高模型的泛化能力。
2. 缓解过拟合问题:过拟合是指模型在训练集上表现很好,但在测试集上表现很差,数据增强可以增加数据样本和样本多样性,从而缓解过拟合的问题。
3. 提高模型的鲁棒性:数据增强可以减少对输入数据的敏感性,从而提高模型的鲁棒性,使其对于稍有变化的数据也能做出准确的预测。
4. 提高数据利用率:数据增强可以生成更多的训练样本,从而提高数据利用率,特别是在数据量较少的情况下,数据增强可以发挥更大的作用。
废话少说,直接上干货!!!
一、数据增强模块代码
import torchvision.transforms as transforms
def transform(IsResize,Resize_size,IsTotensor,IsNormalize,Norm_mean,Norm_std,IsRandomGrayscale,IsColorJitter,
brightness,contrast,hue,saturation,IsCentercrop,Centercrop_size,IsRandomCrop,RandomCrop_size,
IsRandomResizedCrop,RandomResizedCrop_size,Grayscale_rate,IsRandomHorizontalFlip,HorizontalFlip_rate,
IsRandomVerticalFlip,VerticalFlip_rate,IsRandomRotation,degrees):
Resize_transform = []
Rotation=[]
Color=[]
Tensor=[]
Normalize=[]
#-----------------------------------------------<旋转图像>-----------------------------------------------------------#
if IsRandomRotation:
Rotation.append(transforms.RandomRotation(degrees))
if IsRandomHorizontalFlip:
Rotation.append(transforms.RandomHorizontalFlip(HorizontalFlip_rate))
if IsRandomVerticalFlip:
Rotation.append(transforms.RandomHorizontalFlip(VerticalFlip_rate))
#-----------------------------------------------<图像颜色>-----------------------------------------------------------#
if IsColorJitter:
Color.append(transforms.ColorJitter(brightness,contrast,saturation,hue))
if IsRandomGrayscale:
Color.append(transforms.RandomGrayscale(Grayscale_rate))
#---------------------------------------------<缩放或者裁剪>----------------------------------------------------------#
if IsResize:
Resize_transform.append(transforms.Resize(Resize_size))
if IsCentercrop:
Resize_transform.append(transforms.CenterCrop(Centercrop_size))
if IsRandomCrop:
Resize_transform.append(transforms.RandomCrop(RandomCrop_size))
if IsRandomResizedCrop:
Resize_transform.append(transforms.RandomResizedCrop(RandomResizedCrop_size))
if (IsResize+IsCentercrop+IsRandomCrop+IsRandomResizedCrop) >= 2:
print("警告:您同时使用了多种裁剪或缩放方法,请确认这是否是您所预期的")
#---------------------------------------------<tensor化和归一化>------------------------------------------------------#
if IsTotensor:
Tensor.append(transforms.ToTensor())
if IsNormalize and len(Color)==0:
Normalize.append(transforms.Normalize(Norm_mean,Norm_std))
else:
Normalize.append(transforms.Normalize(Norm_mean,Norm_std))
print("警告:亮度、对比度、转为灰度图等操作会改变图像的均值和方差可能会与归一化操作有冲突,因此不推荐一起使用,除非您清楚您在干什么")
# 您可以更改数据增强的顺序,但是数据增强的顺序可能会影响最终数据的质量,因此除非您十分明白您在做什么,否则,请保持默认顺序
transforms_order=[Resize_transform,Rotation,Color,Tensor,Normalize]
return transforms.Compose(transforms_order)
def get_transform():
return transform(
IsResize=True, #是否缩放图像
Resize_size=(256,256), #缩放后的图像大小 如(512,512)->(256,192)
IsCentercrop=False,#是否进行中心裁剪
Centercrop_size=(256,256),#中心裁剪后的图像大小
IsRandomCrop=False,#是否进行随机裁剪
RandomCrop_size=(256,256),#随机裁剪后的图像大小
IsRandomResizedCrop=False,#是否随机区域进行裁剪
RandomResizedCrop_size=(256,256),#随机裁剪后的图像大小
IsTotensor=True, #是否将PIL和numpy格式的图片的数值范围从[0,255]->[0,1],且将图像形状从[H,W,C]->[C,H,W]
IsNormalize=True, #是否对图像进行归一化操作,即使用图像的均值和方差将图像的数值范围从[0,1]->[-1,1]
Norm_mean=(0.5,0.5,0.5),#图像的均值,用于图像归一化,建议使用自己通过计算得到的图像的均值
Norm_std=(0.5,0.5,0.5),#图像的方差,用于图像归一化,建议使用自己通过计算得到的图像的方差
IsRandomGrayscale=False,#是否随机将彩色图像转化为灰度图像
Grayscale_rate=0.5,#每张图像变成灰度图像的概率,设置为1的话等同于transforms.Grayscale()
IsColorJitter=False,#是否随机改变图像的亮度、对比度、色调和饱和度
brightness=0.5,#每个图像被随机改变亮度的概率
contrast=0.5,#每个图像被随机改变对比度的概率
hue=0.5,#每个图像被随机改变色调的概率
saturation=0.5,#每个图像被随机改变饱和度的概率
IsRandomVerticalFlip=False,#是否垂直翻转图像
VerticalFlip_rate=0.5,#每个图像被垂直翻转图像的概率
IsRandomHorizontalFlip=False,#是否水平翻转图像
HorizontalFlip_rate=0.5,#每个图像被水平翻转图像的概率
IsRandomRotation=False,#是是随机旋转图像
degrees=10,#每个图像被旋转角度的范围 如degrees=10 则图像将随机旋转一个(-10,10)之间的角度
)
# 图像分类、识别推荐使用的数据增强配置,
"""def get_transform():
return transform(
IsResize=True, #可选
Resize_size=(256,256), #缩放后的图像大小 如(512,512)->(256,192)
IsCentercrop=False,#可选
Centercrop_size=(256,256),#中心裁剪后的图像大小
IsRandomCrop=False,#可选
RandomCrop_size=(256,256),#随机裁剪后的图像大小
IsRandomResizedCrop=False,#可选
RandomResizedCrop_size=(256,256),#随机裁剪后的图像大小
IsTotensor=True, #建议保持这样
IsNormalize=True, #建议保持这样
Norm_mean=(0.5,0.5,0.5),#图像的均值,用于图像归一化,建议使用自己通过计算得到的图像的均值
Norm_std=(0.5,0.5,0.5),#图像的方差,用于图像归一化,建议使用自己通过计算得到的图像的方差
IsRandomGrayscale=False,#建议保持这样
Grayscale_rate=0.5,#建议保持这样
IsColorJitter=False,#建议保持这样
brightness=0.5,#建议保持这样
contrast=0.5,#建议保持这样
hue=0.5,#建议保持这样
saturation=0.5,#建议保持这样
IsRandomVerticalFlip=True,#建议保持这样
VerticalFlip_rate=0.5,#建议保持这样
IsRandomHorizontalFlip=True,#建议保持这样
HorizontalFlip_rate=0.5,#建议保持这样
IsRandomRotation=True,#建议保持这样
degrees=10,#建议10-90之间
)"""
#图像生成模型,语义分割类模型,不建议对其进行额外的图像增强,如下即可(只用修改Resize_size和看情况修改Norm_mean和Norm_std)
"""def get_transform():
return transform(
IsResize=True, #是否缩放图像
Resize_size=(256,256), #缩放后的图像大小 如(512,512)->(256,192)
IsCentercrop=False,#是否进行中心裁剪
Centercrop_size=(256,256),#中心裁剪后的图像大小
IsRandomCrop=False,#是否进行随机裁剪
RandomCrop_size=(256,256),#随机裁剪后的图像大小
IsRandomResizedCrop=False,#是否随机区域进行裁剪
RandomResizedCrop_size=(256,256),#随机裁剪后的图像大小
IsTotensor=True, #是否将PIL和numpy格式的图片的数值范围从[0,255]->[0,1],且将图像形状从[H,W,C]->[C,H,W]
IsNormalize=True, #是否对图像进行归一化操作,即使用图像的均值和方差将图像的数值范围从[0,1]->[-1,1]
Norm_mean=(0.5,0.5,0.5),#图像的均值,用于图像归一化,建议使用自己通过计算得到的图像的均值
Norm_std=(0.5,0.5,0.5),#图像的方差,用于图像归一化,建议使用自己通过计算得到的图像的方差
IsRandomGrayscale=False,#是否随机将彩色图像转化为灰度图像
Grayscale_rate=0.5,#每张图像变成灰度图像的概率,设置为1的话等同于transforms.Grayscale()
IsColorJitter=False,#是否随机改变图像的亮度、对比度、色调和饱和度
brightness=0.5,#每个图像被随机改变亮度的概率
contrast=0.5,#每个图像被随机改变对比度的概率
hue=0.5,#每个图像被随机改变色调的概率
saturation=0.5,#每个图像被随机改变饱和度的概率
IsRandomVerticalFlip=False,#是否垂直翻转图像
VerticalFlip_rate=0.5,#每个图像被垂直翻转图像的概率
IsRandomHorizontalFlip=False,#是否水平翻转图像
HorizontalFlip_rate=0.5,#每个图像被水平翻转图像的概率
IsRandomRotation=False,#是是随机旋转图像
degrees=10,#每个图像被旋转角度的范围 如degrees=10 则图像将随机旋转一个(-10,10)之间的角度
)"""
二、使用方法
-
第一步:先将get_transform里面的配置修改为自己需要的
def get_transform():
return transform(
IsResize=True, #是否缩放图像
Resize_size=(256,256), #缩放后的图像大小 如(512,512)->(256,192)
IsCentercrop=False,#是否进行中心裁剪
Centercrop_size=(256,256),#中心裁剪后的图像大小
IsRandomCrop=False,#是否进行随机裁剪
RandomCrop_size=(256,256),#随机裁剪后的图像大小
IsRandomResizedCrop=False,#是否随机区域进行裁剪
RandomResizedCrop_size=(256,256),#随机裁剪后的图像大小
IsTotensor=True, #是否将PIL和numpy格式的图片的数值范围从[0,255]->[0,1],且将图像形状从[H,W,C]->[C,H,W]
IsNormalize=True, #是否对图像进行归一化操作,即使用图像的均值和方差将图像的数值范围从[0,1]->[-1,1]
Norm_mean=(0.5,0.5,0.5),#图像的均值,用于图像归一化,建议使用自己通过计算得到的图像的均值
Norm_std=(0.5,0.5,0.5),#图像的方差,用于图像归一化,建议使用自己通过计算得到的图像的方差
IsRandomGrayscale=False,#是否随机将彩色图像转化为灰度图像
Grayscale_rate=0.5,#每张图像变成灰度图像的概率,设置为1的话等同于transforms.Grayscale()
IsColorJitter=False,#是否随机改变图像的亮度、对比度、色调和饱和度
brightness=0.5,#每个图像被随机改变亮度的概率
contrast=0.5,#每个图像被随机改变对比度的概率
hue=0.5,#每个图像被随机改变色调的概率
saturation=0.5,#每个图像被随机改变饱和度的概率
IsRandomVerticalFlip=False,#是否垂直翻转图像
VerticalFlip_rate=0.5,#每个图像被垂直翻转图像的概率
IsRandomHorizontalFlip=False,#是否水平翻转图像
HorizontalFlip_rate=0.5,#每个图像被水平翻转图像的概率
IsRandomRotation=False,#是是随机旋转图像
degrees=10,#每个图像被旋转角度的范围 如degrees=10 则图像将随机旋转一个(-10,10)之间的角度
)
-
第二步:实例化transform
transform=get_transform()
-
第三步:应用transform
直接对数据应用transform,常用于自定义的Dataset
data=transform(data)
在pytorch自带的数据类中使用
from torchvision import datasets
# ImageFolder类中使用
dataset = try_dataset1 = datasets.ImageFolder('数据集路径',transform=transform)
# pytorch自带数据集中使用
dataset = datasets.MNIST('数据集保存路径', train=True, download=True, transform=transform),
尾言
今天是六一儿童节鸭,祝CSDN里面的小朋友、大朋友们六一快乐!!!,永远像小孩一样无忧无忧,没有烦恼,天天开心。
如果您觉得这篇文章对您有帮忙,请点赞、收藏。您的点赞是对作者工作的肯定和鼓励,这对作者来说真的非常重要。如果您对文章内容有任何疑惑和建议,欢迎在评论区里面进行评论,我将第一时间进行回复。