本站原创文章,转载请说明来自《老饼讲解-深度学习》www.bbbdata.com
本文概述
pytorch的transforms提供了缩放、裁剪、颜色转换、自动增强和其它等相关的变换
本文展示各个API的简单介绍和效果,旨在快速了解各个API的功能和效果
各个API的具体代码使用示例参考: 《torchvision.transforms使用示例代码》
各个API更细节的使用示例参考官方文档:https://pytorch.org/vision/stable/transforms.html
Resize-缩放:缩放Resize是将图片修改成指定尺寸
示例解说:Resize((20,30)) ,转换后图像的高为20,宽为30
Resize(20) ,将图像最小边等比缩放为为20
RandomShortestSize-随机缩放最短尺寸:随机将图像最小边等比缩放到指定的几个值
示例解说:RandomShortestSize([20,30,40]) ,转换后图像的最小边等于20、30、40中的某一个
RandomResize-随机缩放:将图像最小边等比缩放到等定范围
示例解说:RandomResize(20,30) ,将最小边等比缩放到[20,30)之间
各种缩放的效果示例如下
对原图像src应用Resize、RandomShortestSize、RandomResize进行转换的结果如下:
其中,各个入参为:Resize((70,120))、RandomShortestSize([50,60,70])、RandomResize(50,70)
RandomCrop-随机裁剪:在原图像中随机裁剪指定尺寸的子图
示例解说:RandomCrop((40,80))在原图像中随机裁出高为40,宽为80的子图
RandomResizedCrop-随机调整裁剪大小:按随机长宽比,裁出随机面积,然后转换为指定Size的图像
示例解说:RandomResizedCrop((40,80),scale=(0.5,0.5),ratio=(3.0/4.0,4.0/3.0))
在原图中,按3/4至4/3之间随机选择一个长宽比,裁剪原图50%的面积,然后转换为高为40宽为80的图像
RandomIoUCrop-随机IoU裁剪:目标检测任务中带框的裁剪
CenterCrop-中心裁剪:在图片中心指定尺寸进行裁剪
示例解说:CenterCrop((60,80)),在原图中心裁剪出高60,宽80的子图
CenterCrop(60),在原图中心裁剪出高60,宽60的方形子图
FiveCrop-五裁剪:在上下左右中心各裁剪出一张指定Size的子图,共5张
示例解说:FiveCrop((60,80))在图像的左上、右上、左下、右下和中间各裁剪出5张高60宽80的图像
TenCrop-十裁剪:上下左右中心裁剪后,得到5张子图,将其翻转,再得到5张,共10张子图
示例解说:TenCrop((60,80))在图像的左上、右上、左下、右下和中间各裁剪出高60宽80的图像,共5张,加上翻转后的图像就有10张
RandomCrop、RandomResizedCrop、 CenterCrop的效果如下:
其中各个API的参数为:
RandomCrop((40,80))
RandomResizedCrop((40,80),scale=(0.5,0.5),ratio=(3.0/4.0,4.0/3.0))
CenterCrop((60,80))
FiveCrop((60,80))的效果如下:
ColorJitter-颜色抖动:随机修改图片的亮度、对比度、饱和度和色相
示例解说: ColorJitter(brightness=(0.3,1.3),contrast=(0.3,1.3),saturation=(0.3,1.3), hue=(-0.3,0.3))
brightness亮度参数,contrast对比度,saturation饱和度都在0.3与1.3之间随机选择,hue色相在-0.3与0.3之间随机选择
RandomPhotometricDistort-随机照片度量失真:随机修改图片的亮度、对比度、饱和度和色相,同时随机修改通道的排序
示例解说:RandomPhotometricDistort(brightness=(0.3,1.3),contrast=(0.3,1.3),saturation=(0.3,1.3), hue=(-0.3,0.3))
即ColorJitter的基础上再随机对通道随机排序,入参与 ColorJitter一致
Grayscale-灰度:将图片转为灰度图片
示例解说:Grayscale(num_output_channels=3),将图片转为灰度图片,期望的输出为3通道
RandomGrayscale-随机灰度:以一定的概率将图片转为灰度图片
示例解说: RandomGrayscale(p=1.0),以100%的概率将图片转为灰度图片
GaussianBlur-高斯模糊:将图片进行高斯模糊处理
示例解说:GaussianBlur(kernel_size=5,sigma=3) ,使用3个sigma为3的高斯核对图片进行模糊处理
RandomInvert-随机反转:以一定的概率进行颜色反转
示例解说:RandomInvert(p=0.9),以90%的概率将图片的颜色反转
RandomPosterize-随机后验 :以指定概率减少每个颜色通道的位数
示例解说:RandomPosterize(bits=2,p=0.9) ,以90%的概率将颜色通道的位数变为2
RandomSolarize-随机极化:对大于阈值的颜色进行颜色反转
示例解说:RandomSolarize(threshold=200,p=0.9) ,90%的概率,将值大于200的像素进行颜色反转
RandomAdjustSharpness-随机调整清晰度:以一定的概率调整图片的清晰度
示例解说:RandomAdjustSharpness(sharpness_factor=5,p=1.0),以100%的概率将图片清晰度调为5
sharpness_factor是清晰度因子,0时会将图片模糊化,1时保持原样,2及以上会让图片更清晰
RandomAutocontrast-随机自动对比:以一定的概率增强图片的对比度
示例解说:RandomAutocontrast(p=1.0),100%的概率增强图片的颜色对比度
RandomEqualize-随机均衡:以给定的概率均衡给定图像或视频的颜色直方图
示例解说:RandomEqualize(p=1.0),以100%的概率均衡图片颜色直方图
上述API的效果示例如下:
其中各个API的参数设置如下:
ColorJitter(brightness=(0.3,1.3),contrast=(0.3,1.3),saturation=(0.3,1.3),hue=(-0.3,0.3))
RandomPhotometricDistort(brightness=(0.3,1.3),contrast=(0.3,1.3),saturation=(0.3,1.3),hue=(-0.3,0.3))
Grayscale(num_output_channels=3),RandomGrayscale(p=1.0),GaussianBlur(kernel_size=5,sigma=3)
RandomInvert(p=1.0),RandomPosterize(bits=2,p=1.0),RandomSolarize(threshold=200,p=1.0)
RandomAdjustSharpness(sharpness_factor=5,p=1.0),RandomAutocontrast(p=1.0),RandomEqualize(p=1.0)
RandomHorizontalFlip-随机水平翻转:给定概率p,按概率p水平翻转
示例解说:RandomHorizontalFlip(p=0.9),90%的概率将图片水平翻转,10%概率保持原样
RandomVerticalFlip-随机垂直翻转:给定概率p,按概率p垂直翻转
示例解说:RandomVerticalFlip(p=0.9),90%的概率将图片垂直翻转,10%概率保持原样
Pad-填充:对图像上下左右各边进行填充
示例解说:Pad(padding=(10,20,30,40), fill=100),对左上右下分别填充10、20、30、40像素,填充值为100
RandomZoomOut-随机缩小:图像大小不变的情况下,添加一个随机大小的画布(画布比图像更大),将图像放到画布随机位置中
示例解说:RandomZoomOut(fill=100,side_range=(1.0,2.0),p=0.9),
添加一个1-2倍大小的画布,将图像随机放置其中,90%的概率进行这样的处理,10%概率保持原样
RandomRotation-随机旋转:对图像以某点为中心,以随机角度进行旋转
示例解说:RandomRotation(degrees=(-30,30),expand=False,center=(0,0),fill=100)
对图片以(0,0)为中心随机旋转-30度至30度,旋转后的空白部分填充为100,超出画布的部分忽略
补充:center是旋转中心,默认时以图像中心为旋转中心,expand为True时,会扩展画布,以显示图像全部内容
RandomAffine-随机仿射变换:对图片进行随机仿射变换,仿射变换包括旋转,平衡,剪切,缩放。
示例解说:RandomAffine(degrees=(-30,50),translate=(0.2, 0.3),shear=(-30,50),scale=(0.5,1),fill=100)
在-30至50度之间随机旋转,然后宽高各平移0至20%、30%,进行-30至50度的随机剪切,整体大小随机缩放50%-100%,空白的地方填充值为100
RandomPerspective-随机透视:以一定的形变水平进行随机透视变换
示例解说:RandomPerspective(distortion_scale=0.9,p=1.0),以100%的概率进行随机透视变换,形变水平为0.9。
ElasticTransform-弹性变换:对图片以一定的位移、平滑度进行弹性变换
示例解说:ElasticTransform(alpha=50.0,sigma=4.0,fill=100),alpha为位置大小,sigma为位置平滑度,fill为填充
上述各个API的转换效果示例如下:
其中各个API的参数设置如下:
RandomHorizontalFlip(p=0.9) ,RandomVerticalFlip(p=0.9) ,Pad(padding=(10,20,30,40), fill=100)
RandomZoomOut(fill=100,side_range=(1.0,2.0),p=1) ,RandomRotation(degrees=(-30,30),expand=False,center=(0,0),fill=100)
RandomAffine(degrees=(-30,50),translate=(0.2, 0.3),shear=(-30,50),scale=(0.5,1),fill=100)
RandomPerspective(distortion_scale=0.9,p=1.0) ,ElasticTransform(alpha=50.0,sigma=4.0,fill=100)
LinearTransformation-线性变换:使用方阵变换和离线计算的均值向量对张量图像或视频进行变换
示例解说:LinearTransformation(transformation_matrix,mean_vector) ,
transformation_matrix为D x D的矩阵,mean_vector维度为D的向量,D=C x H x W
即将图像减去mean_vector后,再用transformation_matrix进行变换
Normalize-标准化:使用平均值和标准偏差对张量图像或视频进行标准化
示例解说:Normalize(mean=(0.5,0.5,0.5),std=(1.,1.,1.),inplace=True) ,对三个通道都采用mean=0.5,std=1的标准化
注意,(1)这里的标准化并不是把通道值标准化到均值为0.5,标准差为1的"平时所理解的标准化",
而是采用公式output[channel] = (input[channel] - mean[channel]) / std[channel]
(2)输入必须为float,而不能是int类型
RandomErasing-随机擦除:在输入图像或视频中随机选择一个矩形区域并擦除其像素(或者可以理解为生成一个遮挡矩形)
示例解说:RandomErasing(p=1.0,scale=(0.4,0.6),ratio=(1/2,1),value=100,inplace=True)
以100%的概率生成一个遮挡矩形,矩形面积在40%至60%之间随机选择,矩阵长宽比为1:2至1:1之间随机选择,矩阵的颜色值为100
Lambda:将用户定义的函数作为转换
示例解说:Lambda(fcn),其中fcn是自己定义的一个函数,将调用fcn对图像进行处理
from torchvision.transforms import v2
import torch
img = torch.tensor([[11, 12],[13, 14]]) # 要处理的图像
def fcn(x): # 自定义一个处理图像的函数
return x-5 # 处理内容为x-5
transform = v2.Lambda(fcn) # 初始化转换
img_trans = transform(img) # 对图片进行转换
print(img_trans) # 打印处理后的结果
运行结果如下:
tensor([[6, 7],
[8, 9]])
上述各个API的转换效果示例如下:
其中各个API的参数设置如下:
Normalize(mean=(100,100,100),std=(1.,1.,1.),inplace=True)
RandomErasing(p=1.0 ,scale=(0.4,0.6),ratio=(1/2,1) ,value=100 ,inplace=True)
AutoAugment-自动增强:根据<https://arxiv.org/pdf/1805.09501.pdf>`一文中的自动增强策略进行随机增强
示例解说:AutoAugment(policy,interpolation,fill),AutoAugment共三个参数,policy是策略,interpolation是插值方式,fill是填充值
RandAugment-随机增强:根据 <https://arxiv.org/abs/1909.13719>一文中的增强方式,进行减少搜索空间的实用自动化数据扩充
示例解说:RandAugment(num_ops=1,magnitude=2,num_magnitude_bins=3,fill=50)
num_ops:增强转换数
magnitude:幅值
num_magnitude_bins:幅值个数
interpolation:插值方式
fill:填充值
TrivialAugmentWide-琐碎的宽版增强: 根据<https://arxiv.org/abs/2103.10158>一文中的增强方式,使用TrivialAugment-Wide进行独立于数据集的数据增强
示例解说:TrivialAugmentWide(num_magnitude_bins=2,fill=100)
num_magnitude_bins:幅值个数
interpolation:插值方式
fill:填充值
AugMix:根据 <https://arxiv.org/abs/1912.02781>一文中的增强方式,进行提高鲁棒性和不确定性的简单数据处理
示例解说:AugMix(severity=3,mixture_width=3,chain_depth=-1,alpha=1.0,all_ops=True,fill=100)
severity:基础增强操作的严重程度
mixture_width:扩增链的数量
chain_depth:扩增链的深度,负数时表示从区间在[1,3]随机选择深度
alpha:概率分布的超参数
all_ops:是否使用所有操作(包括亮度、对比度、颜色和清晰度)
interpolation:插值方式
fill:填充值
上述各个API的转换效果示例如下:
其中各个API的参数设置如下:
AutoAugment(),RandAugment(num_ops=1,magnitude=2,num_magnitude_bins=3,fill=50)
TrivialAugmentWide(num_magnitude_bins=2,fill=100)
AugMix(severity=3,mixture_width=3,chain_depth=-1,alpha=1.0,all_ops=True,fill=100)
End