Pytorch教程

【示例】transforms提供的各种转换

作者 : 老饼 发表日期 : 2023-07-28 10:49:03 更新日期 : 2023-12-09 11:33:17
本站原创文章,转载请说明来自《老饼讲解-深度学习》www.bbbdata.com




本文概述

pytorch的transforms提供了缩放、裁剪、颜色转换、自动增强和其它等相关的变换

本文展示各个API的简单介绍和效果,旨在快速了解各个API的功能和效果

各个API的具体代码使用示例参考: 《torchvision.transforms使用示例代码》

各个API更细节的使用示例参考官方文档:https://pytorch.org/vision/stable/transforms.html 




一、 transforms的缩放转换   


01. 缩放API说明

Resize-缩放:缩放Resize是将图片修改成指定尺寸
示例解说:Resize((20,30)) ,转换后图像的高为20,宽为30
          Resize(20) ,将图像最小边等比缩放为为20

RandomShortestSize-随机缩放最短尺寸:
随机将图像最小边等比缩放到指定的几个值
示例解说:RandomShortestSize([20,30,40]) ,转换后图像的最小边等于20、30、40中的某一个


RandomResize-随机缩放:将图像最小边等比缩放到等定范围
示例解说:RandomResize(20,30) ,将最小边等比缩放到[20,30)之间


02. 缩放API的效果示例


各种缩放的效果示例如下
对原图像src应用Resize、RandomShortestSize、RandomResize进行转换的结果如下:

  
 其中,各个入参为:Resize((70,120))、RandomShortestSize([50,60,70])、RandomResize(50,70) 




二、 transforms的裁剪转换   


01. 裁剪API说明

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张



02. 裁剪API的效果示例


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))的效果如下:
 




三、transforms的颜色转换    



01. 颜色转换API说明


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%的概率均衡图片颜色直方图


02. 颜色转换API的效果示例


上述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)   






四、transforms的其它转换    



01. 其它转换API说明


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为填充


02. 其它转换API的效果示例


上述各个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)   




五、更多的transforms变换    


01. 更多的转换API说明

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]])


02. 更多的转换API的效果示例


 上述各个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)




六、transforms的自动增强变换    



01. 自动增强转换API说明


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:填充值


02. 自动增强转换API的效果示


 上述各个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 




联系老饼