• Docs >
  • Transforming and augmenting images
Shortcuts

转换和增强图像

Torchvision 支持在 torchvision.transformstorchvision.transforms.v2 模块中常见的计算机视觉变换。变换可以用于转换或增强数据,以用于不同任务(如图像分类、检测、分割、视频分类)的训练或推理。

# Image Classification
import torch
from torchvision.transforms import v2

H, W = 32, 32
img = torch.randint(0, 256, size=(3, H, W), dtype=torch.uint8)

transforms = v2.Compose([
    v2.RandomResizedCrop(size=(224, 224), antialias=True),
    v2.RandomHorizontalFlip(p=0.5),
    v2.ToDtype(torch.float32, scale=True),
    v2.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])
img = transforms(img)
# Detection (re-using imports and transforms from above)
from torchvision import tv_tensors

img = torch.randint(0, 256, size=(3, H, W), dtype=torch.uint8)
boxes = torch.randint(0, H // 2, size=(3, 4))
boxes[:, 2:] += boxes[:, :2]
boxes = tv_tensors.BoundingBoxes(boxes, format="XYXY", canvas_size=(H, W))

# The same transforms can be used!
img, boxes = transforms(img, boxes)
# And you can pass arbitrary input structures
output_dict = transforms({"image": img, "boxes": boxes})

转换通常作为transformtransforms参数传递给数据集

从这里开始

无论你是Torchvision变换的新手,还是已经对它们有经验,我们都鼓励你从开始使用变换v2开始,以了解更多关于新v2变换可以实现的内容。

然后,浏览本页下方的部分以获取一般信息和性能提示。可用的转换和功能列在API参考中。

更多信息和教程也可以在我们的示例库中找到,例如Transforms v2: 端到端目标检测/分割示例如何编写自己的v2转换

支持的输入类型和约定

大多数转换都接受PIL图像和张量输入。支持CPU和CUDA张量。两种后端(PIL或张量)的结果应该非常接近。一般来说,我们建议依赖张量后端以获得性能转换变换可用于与PIL图像之间的转换,或用于转换数据类型和范围。

张量图像的形状应为(C, H, W),其中C是通道数,HW分别表示高度和宽度。大多数变换支持批量张量输入。批量张量图像是一个形状为(N, C, H, W)的张量,其中N是批次中的图像数量。v2变换通常接受任意数量的前导维度(..., C, H, W),并且可以处理批量图像或批量视频。

数据类型和预期值范围

张量图像的预期值范围由张量的数据类型隐式定义。具有浮点数据类型的张量图像预期值在[0, 1]范围内。具有整数数据类型的张量图像预期值在[0, MAX_DTYPE]范围内,其中MAX_DTYPE是该数据类型可以表示的最大值。通常,数据类型为torch.uint8的图像预期值在[0, 255]范围内。

使用 ToDtype 来转换输入的 dtype 和范围。

V1 还是 V2?我应该使用哪一个?

TL;DR 我们建议使用 torchvision.transforms.v2 转换 而不是 torchvision.transforms 中的转换。它们更快,并且可以 做更多的事情。只需更改导入,您就可以开始了。未来, 新功能和改进将仅考虑用于 v2 转换。

在 Torchvision 0.15(2023年3月)中,我们发布了一组新的变换,这些变换可以在 torchvision.transforms.v2 命名空间中使用。与 v1 版本(在 torchvision.transforms 中)相比,这些变换有很多优势:

这些转换与v1版本完全向后兼容,所以如果你已经在使用torchvision.transforms中的转换,你只需要将导入更新为torchvision.transforms.v2。在输出方面,由于实现上的差异,可能会有微不足道的差异。

性能考虑

我们建议遵循以下指南以获得转换的最佳性能:

  • 依赖于来自 torchvision.transforms.v2 的 v2 转换

  • 使用张量代替PIL图像

  • 使用 torch.uint8 数据类型,特别是在调整大小时

  • 使用双线性或双三次模式调整大小

这是一个典型的转换管道可能的样子:

from torchvision.transforms import v2
transforms = v2.Compose([
    v2.ToImage(),  # Convert to tensor, only needed if you had a PIL image
    v2.ToDtype(torch.uint8, scale=True),  # optional, most input are already uint8 at this point
    # ...
    v2.RandomResizedCrop(size=(224, 224), antialias=True),  # Or Resize(antialias=True)
    # ...
    v2.ToDtype(torch.float32, scale=True),  # Normalize expects float input
    v2.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])

上述内容应为您在典型的训练环境中提供最佳性能,该环境依赖于torch.utils.data.DataLoader,并且num_workers > 0

变换通常对输入的步幅/内存格式敏感。一些变换在处理通道优先的图像时会更快,而其他变换则更喜欢通道最后的图像。像torch操作符一样,大多数变换会保留输入的内存格式,但由于实现细节,这可能并不总是得到尊重。如果你追求最佳性能,可能需要进行一些实验。在单个变换上使用torch.compile()也可能有助于排除内存格式变量(例如在Normalize上)。请注意,我们讨论的是内存格式,而不是张量形状

请注意,像ResizeRandomResizedCrop这样的调整大小变换通常更喜欢通道在最后的输入,并且目前能从torch.compile()中受益。

转换类、函数和内核

变换可以作为类使用,如 Resize,也可以作为函数使用,如 resize()torchvision.transforms.v2.functional 命名空间中。 这与 torch.nn 包非常相似,该包在 torch.nn.functional 中定义了类和函数等价物。

函数支持PIL图像、纯张量或TVTensors,例如resize(image_tensor)resize(boxes)都是有效的。

注意

RandomCrop这样的随机变换每次调用时都会随机采样一些参数。它们的功能对应物(crop())不会进行任何随机采样,因此参数化略有不同。变换类的get_params()类方法可以在使用功能API时用于执行参数采样。

torchvision.transforms.v2.functional 命名空间还包含我们称之为“内核”的内容。这些是实现特定类型核心功能的低级函数,例如 resize_bounding_boxes`resized_crop_mask。它们是公开的,尽管没有文档记录。查看 代码 以了解哪些是可用的(注意,那些以下划线开头的函数 不是 公开的!)。内核只有在您希望为边界框或遮罩等类型提供 torchscript 支持 时才有用。

Torchscript支持

大多数变换类和函数支持torchscript。对于组合变换,请使用torch.nn.Sequential而不是Compose

transforms = torch.nn.Sequential(
    CenterCrop(10),
    Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225)),
)
scripted_transforms = torch.jit.script(transforms)

警告

v2 转换支持 torchscript,但如果你在 v2 转换上调用 torch.jit.script(),你实际上会得到其(脚本化的)v1 等效版本。由于 v1 和 v2 之间的实现差异,这可能会导致脚本化和急切执行之间的结果略有不同。

如果你真的需要v2转换的torchscript支持,我们建议从torchvision.transforms.v2.functional命名空间中编写functionals的脚本,以避免意外。

还需注意,函数仅支持纯张量的torchscript,这些张量始终被视为图像。如果您需要为其他类型(如边界框或掩码)提供torchscript支持,您可以依赖低级内核

对于任何要与torch.jit.script一起使用的自定义转换,它们应该从torch.nn.Module派生。

另请参阅:Torchscript支持

V1 API 参考

几何

调整大小(size[, interpolation, max_size, ...])

将输入图像调整为给定大小。

RandomCrop(size[, padding, pad_if_needed, ...])

在随机位置裁剪给定的图像。

RandomResizedCrop(size[, scale, ratio, ...])

裁剪图像的随机部分并将其调整为给定大小。

CenterCrop(size)

在中心裁剪给定的图像。

FiveCrop(size)

将给定的图像裁剪为四个角和中心裁剪。

TenCrop(size[, vertical_flip])

将给定的图像裁剪为四个角落和中央裁剪部分,以及这些部分的翻转版本(默认使用水平翻转)。

Pad(padding[, fill, padding_mode])

用给定的“pad”值在图像的所有边进行填充。

RandomRotation(degrees[, interpolation, ...])

将图像旋转一定角度。

RandomAffine(degrees[, translate, scale, ...])

对图像进行随机仿射变换,保持中心不变。

RandomPerspective([distortion_scale, p, ...])

对给定图像以给定概率执行随机透视变换。

ElasticTransform([alpha, sigma, ...])

使用弹性变换转换张量图像。

RandomHorizontalFlip([p])

以给定的概率随机水平翻转给定的图像。

RandomVerticalFlip([p])

以给定的概率随机垂直翻转给定的图像。

颜色

ColorJitter([亮度, 对比度, ...])

随机更改图像的亮度、对比度、饱和度和色调。

灰度([num_output_channels])

将图像转换为灰度。

RandomGrayscale([p])

以概率p(默认0.1)随机将图像转换为灰度。

GaussianBlur(kernel_size[, sigma])

使用随机选择的高斯模糊对图像进行模糊处理。

RandomInvert([p])

以给定的概率随机反转给定图像的颜色。

RandomPosterize(bits[, p])

通过减少每个颜色通道的位数,以给定的概率随机对图像进行色调分离。

RandomSolarize(threshold[, p])

以给定的概率随机对图像进行曝光处理,通过反转所有高于阈值的像素值。

RandomAdjustSharpness(sharpness_factor[, p])

以给定的概率随机调整图像的清晰度。

RandomAutocontrast([p])

以给定的概率随机对给定图像的像素进行自动对比度调整。

RandomEqualize([p])

以给定的概率随机均衡给定图像的直方图。

组合

Compose(transforms)

将多个变换组合在一起。

RandomApply(transforms[, p])

以给定的概率随机应用一系列转换。

RandomChoice(transforms[, p])

从列表中随机选择并应用单一转换。

RandomOrder(transforms)

以随机顺序应用一系列转换。

杂项

LinearTransformation(transformation_matrix, ...)

使用离线计算的正方形变换矩阵和mean_vector转换张量图像。

Normalize(mean, std[, inplace])

使用均值和标准差对张量图像进行归一化。

RandomErasing([p, scale, ratio, value, inplace])

随机选择一个矩形区域在torch.Tensor图像中并擦除其像素。

Lambda(lambd)

应用用户定义的lambda作为转换。

转换

注意

请注意,下面列出的一些转换变换在执行转换时会缩放值,而有些可能不会进行任何缩放。通过缩放,我们指的是例如uint8 -> float32会将[0, 255]范围映射到[0, 1](反之亦然)。请参阅Dtype和预期值范围

ToPILImage([mode])

将张量或ndarray转换为PIL图像

ToTensor()

将PIL图像或ndarray转换为张量并相应地缩放值。

PILToTensor()

将PIL图像转换为相同类型的张量 - 这不会缩放值。

ConvertImageDtype(dtype)

将张量图像转换为给定的dtype并相应地缩放值。

自动增强

AutoAugment 是一种常见的数据增强技术,可以提高图像分类模型的准确性。 尽管数据增强策略与其训练的数据集直接相关,但实证研究表明, ImageNet 策略在应用于其他数据集时能显著提升效果。 在 TorchVision 中,我们实现了基于以下数据集的 3 种策略:ImageNet、CIFAR10 和 SVHN。 新的变换可以单独使用,也可以与现有的变换混合使用:

AutoAugmentPolicy(value)

在不同数据集上学习的AutoAugment策略。

AutoAugment([policy, interpolation, fill])

基于"AutoAugment: Learning Augmentation Strategies from Data"的AutoAugment数据增强方法。

RandAugment([num_ops, magnitude, ...])

基于"RandAugment: Practical automated data augmentation with a reduced search space"的RandAugment数据增强方法。

TrivialAugmentWide([num_magnitude_bins, ...])

使用TrivialAugment Wide进行与数据集无关的数据增强,如"TrivialAugment: Tuning-free Yet State-of-the-Art Data Augmentation"中所述。

AugMix([严重程度, 混合宽度, ...])

基于"AugMix: A Simple Data Processing Method to Improve Robustness and Uncertainty"的AugMix数据增强方法。

功能转换

adjust_brightness(img, brightness_factor)

调整图像的亮度。

adjust_contrast(img, contrast_factor)

调整图像的对比度。

adjust_gamma(img, gamma[, gain])

对图像执行伽马校正。

adjust_hue(img, hue_factor)

调整图像的色调。

adjust_saturation(img, saturation_factor)

调整图像的色彩饱和度。

adjust_sharpness(img, sharpness_factor)

调整图像的清晰度。

affine(img, angle, translate, scale, shear)

在保持图像中心不变的情况下对图像应用仿射变换。

autocontrast(img)

通过重新映射每个通道的像素来最大化图像的对比度,使最暗的像素变为黑色,最亮的像素变为白色。

center_crop(img, output_size)

在中心裁剪给定的图像。

convert_image_dtype(image[, dtype])

将张量图像转换为给定的dtype并相应地缩放值。此函数不支持PIL图像。

crop(img, top, left, height, width)

在指定位置裁剪给定图像并输出大小。

equalize(img)

通过对输入应用非线性映射来均衡图像的直方图,以在输出中创建灰度值的均匀分布。

erase(img, i, j, h, w, v[, inplace])

用给定值擦除输入的张量图像。

five_crop(img, size)

将给定的图像裁剪为四个角和中心裁剪。

gaussian_blur(img, kernel_size[, sigma])

对图像执行给定核的高斯模糊

get_dimensions(img)

返回图像的尺寸为 [通道数, 高度, 宽度]。

get_image_num_channels(img)

返回图像的通道数。

get_image_size(img)

返回图像的尺寸为[宽度, 高度]。

hflip(img)

水平翻转给定的图像。

invert(img)

反转RGB/灰度图像的颜色。

normalize(tensor, mean, std[, inplace])

使用均值和标准差对浮点张量图像进行归一化。

pad(img, padding[, fill, padding_mode])

用给定的“pad”值在图像的所有边进行填充。

perspective(img, startpoints, endpoints[, ...])

对给定图像执行透视变换。

pil_to_tensor(pic)

PIL Image转换为相同类型的张量。

posterize(img, bits)

通过减少每个颜色通道的位数来对图像进行色调分离。

resize(img, size[, interpolation, max_size, ...])

将输入图像调整为给定大小。

resized_crop(img, top, left, height, width, size)

裁剪给定的图像并将其调整到所需的大小。

rgb_to_grayscale(img[, num_output_channels])

将RGB图像转换为灰度图像。

rotate(img, angle[, interpolation, expand, ...])

将图像旋转一定角度。

solarize(img, threshold)

通过反转所有高于阈值的像素值来对RGB/灰度图像进行曝光处理。

ten_crop(img, size[, vertical_flip])

从给定的图像生成十张裁剪后的图像。

to_grayscale(img[, num_output_channels])

将任何模式(RGB、HSV、LAB等)的PIL图像转换为灰度版本的图像。

to_pil_image(pic[, mode])

将张量或ndarray转换为PIL图像。

to_tensor(pic)

PIL Imagenumpy.ndarray转换为张量。

vflip(img)

垂直翻转给定的图像。