变换示例说明#

本示例展示了 torchvision.transforms.v2 中可用的各种变换。

from PIL import Image
from pathlib import Path
import matplotlib.pyplot as plt

import torch
from torchvision.transforms import v2

plt.rcParams["savefig.bbox"] = 'tight'

# if you change the seed, make sure that the randomly-applied transforms
# properly show that the image can be both transformed and *not* transformed!
torch.manual_seed(0)

# If you're trying to run that on Colab, you can download the assets and the
# helpers from https://github.com/pytorch/vision/tree/main/gallery/
from helpers import plot
# orig_img = Image.open(Path('../assets') / 'astronaut.jpg')
orig_img = Image.open("../../images/astronaut.jpg")

几何变换#

几何图像变换指的是改变图像的几何属性的过程,比如它的形状、大小、方向或位置。这涉及到对图像像素或坐标应用数学运算以实现所需的变换。

填充#

torchvision.transforms.v2.Pad 变换(也见 pad() 函数)用一些像素值填充所有图像边界。

padded_imgs = [v2.Pad(padding=padding)(orig_img) for padding in (3, 10, 30, 50)]
plot([orig_img] + padded_imgs)
../../../_images/a36d7777aa09131f49fe4dc31d3b7052f7df5d0317d21babb8c3f0284fe020b5.png

调整大小#

Resize 转换(也请参见 resize())用于调整图像的大小。

resized_imgs = [v2.Resize(size=size)(orig_img) for size in (30, 50, 100, orig_img.size)]
plot([orig_img] + resized_imgs)
../../../_images/94914a38b4db70472e40eeb77540767ee52317d5f8a6c2ef508524bf3bcf586b.png

CenterCrop#

CenterCrop 转换(另见 :center_crop())在图像中心进行裁剪。

center_crops = [v2.CenterCrop(size=size)(orig_img) for size in (30, 50, 100, orig_img.size)]
plot([orig_img] + center_crops)
../../../_images/ad25fec88590d12b30b04136643b80e7e2e27b82826f5ba319aea14be9c530d0.png

FiveCrop#

FiveCrop 变换(也参见 five_crop())将给定的图像裁剪为四个角和中心的五个部分。

(top_left, top_right, bottom_left, bottom_right, center) = v2.FiveCrop(size=(100, 100))(orig_img)
plot([orig_img] + [top_left, top_right, bottom_left, bottom_right, center])
../../../_images/6e5664f210cd33835d7140c9cbbae21055fff0fed120a57fe537c0cc26a15a18.png

随机透视变换#

RandomPerspective 变换(也请参见 perspective()) 对图像执行随机透视变换。

perspective_transformer = v2.RandomPerspective(distortion_scale=0.6, p=1.0)
perspective_imgs = [perspective_transformer(orig_img) for _ in range(4)]
plot([orig_img] + perspective_imgs)
../../../_images/92146e5e39cc67c9b4c490e9244e38b9cc3d8df62310b19d5f22eeb8c79f5e83.png

随机旋转#

RandomRotation 变换(另见 rotate() 函数)以随机角度旋转图像。

rotater = v2.RandomRotation(degrees=(0, 180))
rotated_imgs = [rotater(orig_img) for _ in range(4)]
plot([orig_img] + rotated_imgs)
../../../_images/e7e63bdf63c94972ac197ea9cc5922655910997c439fc927cfedc3a7edf03b89.png

随机仿射#

RandomAffine转换 (另见:affine()) 对图像执行随机仿射变换。

affine_transfomer = v2.RandomAffine(degrees=(30, 70), translate=(0.1, 0.3), scale=(0.5, 0.75))
affine_imgs = [affine_transfomer(orig_img) for _ in range(4)]
plot([orig_img] + affine_imgs)
../../../_images/1d3ca8c544812cbc4868059e4046acb3275f19e6a5cb9515737dd3e5815048b7.png

弹性变换#

ElasticTransform 转换(也参见 elastic_transform() 函数)随机改变图像中物体的形态,并产生类似透视水面的效果。

elastic_transformer = v2.ElasticTransform(alpha=250.0)
transformed_imgs = [elastic_transformer(orig_img) for _ in range(2)]
plot([orig_img] + transformed_imgs)
../../../_images/927163a429cd28e944c42904e47575d6ef9794ed7b09cac18331ca7ef0215411.png

随机裁剪#

torchvision.transforms.v2.RandomCrop 变换(也请参见 torchvision.transforms.v2.functional.crop() 函数)可以在图像的随机位置执行裁剪操作。

cropper = v2.RandomCrop(size=(128, 128))
crops = [cropper(orig_img) for _ in range(4)]
plot([orig_img] + crops)
../../../_images/300c7be287c2136bfa6dcb345d3eb06119b4499f9d985aae64e6a35c73aefe2e.png

随机调整大小裁剪#

RandomResizedCrop 变换(也请参考 resized_crop()函数)在图像的随机位置进行裁剪,然后将裁剪的部分调整到指定的大小。

resize_cropper = v2.RandomResizedCrop(size=(32, 32))
resized_crops = [resize_cropper(orig_img) for _ in range(4)]
plot([orig_img] + resized_crops)
../../../_images/976d5bec8a29398febeda0773d2b5cfdd07de5d960f66124c91b6911d479c67d.png

光度变换#

光度图像变换(Photometric Transforms)指的是修改图像的光度属性的过程,例如其亮度、对比度、颜色或色调。这些变换被用来改变图像的视觉外观,同时保持其几何结构不变。

除了 Grayscale 之外,以下变换是随机的,这意味着相同的变换实例每次对给定图像进行变换时都会产生不同的结果。

Grayscale(灰度)#

Grayscale 变换(另见 to_grayscale())将图像转换为灰度图。

gray_img = v2.Grayscale()(orig_img)
plot([orig_img, gray_img], cmap='gray')
../../../_images/6e44618359882af565faee08a5a6bf8b5d16f8bc916f4f505fc7d0ae23d836e9.png

ColorJitter#

ColorJitter 转换随机改变图像的亮度、对比度、饱和度、色调等属性。

jitter = v2.ColorJitter(brightness=.5, hue=.3)
jittered_imgs = [jitter(orig_img) for _ in range(4)]
plot([orig_img] + jittered_imgs)
../../../_images/9e8bd417e8c75a4d060f77272e1b5f3a3bb13356909601ed4ecd39d633642868.png

高斯模糊#

GaussianBlur变换(也可参见函数 gaussian_blur())对图像执行高斯模糊变换。

blurrer = v2.GaussianBlur(kernel_size=(5, 9), sigma=(0.1, 5.))
blurred_imgs = [blurrer(orig_img) for _ in range(4)]
plot([orig_img] + blurred_imgs)
../../../_images/04ac23ab523fe0b75329752871e34a069db6cb3a04367111cb8069ab93081698.png

随机反转颜色#

RandomInvert 变换(也见 invert() 函数)随机反转给定图像的颜色。

inverter = v2.RandomInvert()
invertered_imgs = [inverter(orig_img) for _ in range(4)]
plot([orig_img] + invertered_imgs)
../../../_images/d0f72c73cf5cec9703195f5a064f8c198f2df9193bc6564f3727370075dd188c.png

随机海报化#

RandomPosterize 转换(也请参见 torchvision.transforms.v2.functional.posterize() 函数)通过减少每个颜色通道的位数,对图像进行随机海报化处理。

posterizer = v2.RandomPosterize(bits=2)
posterized_imgs = [posterizer(orig_img) for _ in range(4)]
plot([orig_img] + posterized_imgs)
../../../_images/5710ea9f7b33359ba643ace6f5d28e83cff093262c0fa14b6fa2defd88887180.png

随机曝光#

RandomSolarize变换 (也见 solarize()函数) 通过反转所有高于阈值的像素值,随机地对图像进行太阳化处理。

solarizer = v2.RandomSolarize(threshold=192.0)
solarized_imgs = [solarizer(orig_img) for _ in range(4)]
plot([orig_img] + solarized_imgs)
../../../_images/37ded56dade304bf3e051c6e6a04f5ad011c54ddb4f1782259d81d1a2ed40192.png

随机调整锐度#

RandomAdjustSharpness 转换(也可参见 adjust_sharpness())随机调整给定图像的锐度。

sharpness_adjuster = v2.RandomAdjustSharpness(sharpness_factor=2)
sharpened_imgs = [sharpness_adjuster(orig_img) for _ in range(4)]
plot([orig_img] + sharpened_imgs)
../../../_images/21277970241de192ec21584ff1cb32a84a7a3cc0eccf765146d0fe597715da08.png

随机自动对比度#

RandomAutocontrast 转换器 (另见 autocontrast()) 随机对给定图像应用自动对比度调整。

autocontraster = v2.RandomAutocontrast()
autocontrasted_imgs = [autocontraster(orig_img) for _ in range(4)]
plot([orig_img] + autocontrasted_imgs)
../../../_images/21277970241de192ec21584ff1cb32a84a7a3cc0eccf765146d0fe597715da08.png

随机均衡化#

RandomEqualize 变换(也见 equalize())随机对给定图像的直方图进行均衡化处理。

equalizer = v2.RandomEqualize()
equalized_imgs = [equalizer(orig_img) for _ in range(4)]
plot([orig_img] + equalized_imgs)
../../../_images/36c51dc01c6637ce33d3c82da9ea9c819b2882069a4336778bd0695b1025e057.png

JPEG#

JPEG变换(也可参见 jpeg() 函数)对给定的图像应用随机程度的JPEG压缩。

jpeg = v2.JPEG((5, 50))
jpeg_imgs = [jpeg(orig_img) for _ in range(4)]
plot([orig_img] + jpeg_imgs)
../../../_images/9af742810bc8875f047fdfed8c3975e6e115c2a6ae94df3b8f53291e4be186b3.png

增强变换#

以下转换是多种变换的组合,包括几何变换、光度变换或两者兼有。

自动增强#

AutoAugment 类根据给定的自动增强策略自动对数据进行增强。有关可用策略的详细信息,请参见 AutoAugmentPolicy

policies = [v2.AutoAugmentPolicy.CIFAR10, v2.AutoAugmentPolicy.IMAGENET, v2.AutoAugmentPolicy.SVHN]
augmenters = [v2.AutoAugment(policy) for policy in policies]
imgs = [
    [augmenter(orig_img) for _ in range(4)]
    for augmenter in augmenters
]
row_title = [str(policy).split('.')[-1] for policy in policies]
plot([[orig_img] + row for row in imgs], row_title=row_title)
../../../_images/2415e87d87b003841af5cc2e2146c4db749b6f0337b95f7c11bb8ec9838fcae4.png

RandAugment#

RandAugment 是 AutoAugment 的替代版本。

augmenter = v2.RandAugment()
imgs = [augmenter(orig_img) for _ in range(4)]
plot([orig_img] + imgs)
../../../_images/396baaa30208c8f7df03d0469f5da31b281b69d000d4b24af384e01cf5423f18.png

TrivialAugmentWide#

TrivialAugmentWide 是 AutoAugment 的一种替代实现。然而,与多次变换图像不同,它仅使用给定列表中的随机变换和随机强度数对图像进行一次转换。

augmenter = v2.TrivialAugmentWide()
imgs = [augmenter(orig_img) for _ in range(4)]
plot([orig_img] + imgs)
../../../_images/be38128adf4fa6756c39b10321b89b6e912b107acecb102ef9f2ba3975fb8370.png

AugMix#

AugMix 转换器在图像的增强版本之间进行插值。

augmenter = v2.AugMix()
imgs = [augmenter(orig_img) for _ in range(4)]
plot([orig_img] + imgs)
../../../_images/b3701e46c1a0b8edc2d7a4f11ea1db84d426182ac90449641546dfcc8fe47609.png

随机应用变换#

给定概率 p,以下变换将随机应用。也就是说,当 p = 0.5 时,有 \(50\%\) 的机会返回原始图像,也有50%的机会返回变换后的图像,即使是使用同一个变换实例调用也是如此!

随机水平翻转#

RandomHorizontalFlip 变换 (另见 hflip()) 以给定的概率对图像进行水平翻转。

hflipper = v2.RandomHorizontalFlip(p=0.5)
transformed_imgs = [hflipper(orig_img) for _ in range(4)]
plot([orig_img] + transformed_imgs)
../../../_images/f5f7e5392a216fb84dce640381265fe7b0ec2b2e9173192b76daa59a90ecc9d6.png

随机垂直翻转#

RandomVerticalFlip 转换(另见 vflip() 函数)对图像执行垂直翻转,该操作基于给定的概率进行。

vflipper = v2.RandomVerticalFlip(p=0.5)
transformed_imgs = [vflipper(orig_img) for _ in range(4)]
plot([orig_img] + transformed_imgs)
../../../_images/4e2df9b9cddc8a2c33291651fd6fcd5bdc8adf3d086efa298a5112dc472b6178.png

随机应用#

RandomApply 变换器随机地以给定的概率应用一系列变换。

applier = v2.RandomApply(transforms=[v2.RandomCrop(size=(64, 64))], p=0.5)
transformed_imgs = [applier(orig_img) for _ in range(4)]
plot([orig_img] + transformed_imgs)
../../../_images/4e00f3b78aa8d5b702373cb9fdcd4c7eedc5a55c64e2ea1423fa04f54ab7b8c7.png