• 文档 >
  • 转换图像、视频、框等
快捷方式

转换图像、视频、边界框等

Torchvision 在 torchvision.transforms.v2 模块中支持常见的计算机视觉转换。转换可用于转换和增强数据,用于训练或推理。支持以下对象:

  • 纯张量、Image 或 PIL 图像格式的图像

  • Video 格式的视频

  • 轴对齐和旋转的边界框,格式为 BoundingBoxes

  • 分割和检测掩码,格式为 Mask

  • 关键点,格式为 KeyPoints

# 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 参数传递给 Datasets

从这里开始

无论您是 Torchvision 转换的新手,还是已经熟悉它们,我们都鼓励您从 使用 transforms 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 来转换输入的数据类型和范围。

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

简而言之,我们建议使用 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,也可以作为函数,例如 torchvision.transforms.v2.functional 命名空间中的 resize()。这非常类似于 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 命名空间中的**函数**,以避免意外。

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

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

另请参阅: TorchScript 支持

V1 API 参考

几何变换

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

用给定的“填充”值填充给定图像的所有侧面。

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

旋转图像。

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

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

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

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

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

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

RandomHorizontalFlip([p])

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

RandomVerticalFlip([p])

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

颜色

ColorJitter([brightness, contrast, ...])

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

Grayscale([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, ...)

使用离线计算的方阵变换矩阵和均值向量来变换张量图像。

Normalize(mean, std[, inplace])

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

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

随机选择一个矩形区域并在该区域内擦除张量图像的像素。

Lambda(lambd)

应用用户定义的 lambda 函数作为变换。

转换

注意

请注意,其中一些转换会缩放值,而另一些可能不会。缩放是指,例如,将 `uint8` 转换为 `float32` 会将 [0, 255] 的范围映射到 [0, 1](反之亦然)。有关详细信息,请参阅 范围和数据类型

ToPILImage([mode])

将张量或 ndarray 转换为 PIL 图像

ToTensor()

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

PILToTensor()

将 PIL Image 转换为相同类型的张量 - 此操作不缩放值。

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: Tuning-free Yet State-of-the-Art Data Augmentation” 所述,使用 TrivialAugment Wide 进行与数据集无关的数据增强。

AugMix([severity, mixture_width, ...])

基于 “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 Image。

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

用给定的“填充”值填充给定图像的所有侧面。

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)

垂直翻转给定图像。

文档

访问全面的 PyTorch 开发者文档

查看文档

教程

为初学者和高级开发者提供深入的教程

查看教程

资源

查找开发资源并让您的问题得到解答

查看资源