图像转换和增强¶
Torchvision 在 torchvision.transforms
和 torchvision.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})
转换通常作为 transform
或 transforms
参数传递给数据集。
从这里开始¶
无论您是 Torchvision 转换的新手还是经验丰富,我们都建议您从转换 v2 入门开始,以了解有关新 v2 转换能做什么的更多信息。
然后,浏览本页下方的部分,获取一般信息和性能提示。可用的转换和函数式操作列在API 参考中。
更多信息和教程也可以在我们的示例图库中找到,例如转换 v2:端到端对象检测/分割示例或如何编写自己的 v2 转换。
支持的输入类型和约定¶
大多数转换都接受 PIL 图像和张量输入。支持 CPU 和 CUDA 张量。两种后端(PIL 或张量)的结果应该非常接近。一般来说,我们建议依赖张量后端以获得性能。可以使用转换转换在 PIL 图像之间或转换 dtypes 和范围。
张量图像的形状应为 (C, H, W)
,其中 C
是通道数,H
和 W
分别指高度和宽度。大多数转换支持批量张量输入。一批张量图像的形状为 (N, C, H, W)
,其中 N
是批次中的图像数量。v2 转换通常接受任意数量的前导维度 (..., C, H, W)
,并且可以处理批量图像或批量视频。
Dtype 和期望值范围¶
张量图像值的期望范围由张量 dtype 隐式定义。具有 float dtype 的张量图像的值应在 [0, 1]
范围内。具有 integer dtype 的张量图像的值应在 [0, MAX_DTYPE]
范围内,其中 MAX_DTYPE
是该 dtype 中可表示的最大值。通常,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
中)相比,这些转换具有许多优势:
它们不仅可以转换图像,**还可以**转换边界框、掩码或视频。这为图像分类以外的任务(如检测、分割、视频分类等)提供了支持。请参阅转换 v2 入门和转换 v2:端到端对象检测/分割示例。
它们支持更多转换,例如
CutMix
和MixUp
。请参阅如何使用 CutMix 和 MixUp。它们更快。
它们支持任意输入结构(dicts、lists、tuples 等)。
未来的改进和功能将仅添加到 v2 转换中。
这些转换与 v1 版本**完全向后兼容**,因此如果您已经在使用 torchvision.transforms
中的转换,只需将导入更新为 torchvision.transforms.v2
即可。输出方面,由于实现差异,可能会存在微不足道的差异。
性能考量¶
我们推荐以下指南以从转换中获得最佳性能:
依赖
torchvision.transforms.v2
中的 v2 转换使用张量而不是 PIL 图像
使用
torch.uint8
dtype,特别是对于调整大小操作使用 bilinear 或 bicubic 模式进行调整大小
典型的转换流水线可能如下所示:
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
的典型训练环境中,以上建议应能提供最佳性能。
转换往往对输入 strides / 内存格式敏感。一些转换对于 channels-first 图像会更快,而另一些则更喜欢 channels-last。像 torch
运算符一样,大多数转换将保留输入的内存格式,但这可能由于实现细节而无法始终得到遵守。如果您追求最佳性能,可能需要进行一些实验。在单独的转换(例如 Normalize
)上使用 torch.compile()
也可能有助于排除内存格式变量的影响。请注意,我们讨论的是**内存格式**,而不是张量形状。
请注意,Resize
和 RandomResizedCrop
等调整大小转换通常更喜欢 channels-last 输入,并且目前**不**倾向于受益于 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
命名空间还包含我们称为“内核 (kernels)”的内容。这些是实现特定类型核心功能的低级函数,例如 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()
,实际上会得到其 (scripted 的) v1 等效项。由于 v1 和 v2 之间的实现差异,这可能会导致 scripted 和 eager 执行之间的结果略有不同。
如果您确实需要 v2 转换的 torchscript 支持,我们建议对 torchvision.transforms.v2.functional
命名空间中的**函数式操作**进行脚本化,以避免意外。
另请注意,函数式操作仅支持纯张量的 torchscript,这些张量总是被视为图像。如果您需要对边界框或掩码等其他类型进行 torchscript 支持,可以依赖低级内核。
任何要与 torch.jit.script
一起使用的自定义转换,都应派生自 torch.nn.Module
。
另请参阅:Torchscript 支持。
V2 API 参考 - 推荐¶
几何转换¶
调整大小¶
|
将输入调整为给定大小。 |
|
根据“Simple Copy-Paste is a Strong Data Augmentation Method for Instance Segmentation”对输入执行大尺度抖动。 |
|
随机调整输入大小。 |
|
随机调整输入大小。 |
函数式操作
|
有关详细信息,请参阅 |
裁剪¶
|
在随机位置裁剪输入。 |
|
裁剪输入的随机部分并将其调整为给定大小。 |
|
来自“SSD: Single Shot MultiBox Detector”的随机 IoU 裁剪转换。 |
|
在中心裁剪输入。 |
|
将图像或视频裁剪为四个角和中心区域。 |
|
将图像或视频裁剪为四个角和中心区域,以及这些区域的翻转版本(默认使用水平翻转)。 |
函数式操作
|
有关详细信息,请参阅 |
|
有关详细信息,请参阅 |
|
有关详细信息,请参阅 |
|
有关详细信息,请参阅 |
|
有关详细信息,请参阅 |
其他¶
以给定概率水平翻转输入。 |
|
以给定概率垂直翻转输入。 |
|
|
使用给定的“填充”值在所有侧面填充输入。 |
|
来自“SSD: Single Shot MultiBox Detector”的“缩小 (Zoom out)”转换。 |
|
按角度旋转输入。 |
|
对输入进行随机仿射变换,保持中心不变。 |
|
以给定概率对输入执行随机透视变换。 |
|
使用弹性变换对输入进行转换。 |
函数式操作
有关详细信息,请参阅 |
|
有关详细信息,请参阅 |
|
|
有关详细信息,请参阅 |
|
有关详细信息,请参阅 |
|
有关详细信息,请参阅 |
|
有关详细信息,请参阅 |
|
有关详细信息,请参阅 |
颜色转换¶
|
随机更改图像或视频的亮度、对比度、饱和度和色调。 |
随机置换图像或视频的通道。 |
|
|
随机扭曲图像或视频,如“SSD: Single Shot MultiBox Detector”中所用。 |
|
将图像或视频转换为灰度图。 |
|
将图像或视频转换为 RGB(如果它们不是 RGB)。 |
|
以概率 p(默认 0.1)随机将图像或视频转换为灰度图。 |
|
使用随机选择的高斯模糊核模糊图像。 |
|
为图像或视频添加高斯噪声。 |
|
以给定概率反转给定图像或视频的颜色。 |
|
以给定概率通过减少每个颜色通道的位数来对图像或视频进行色调分离(Posterize)。 |
|
以给定概率通过反转高于阈值的所有像素值来对图像或视频进行曝光过度(Solarize)。 |
|
以给定概率调整图像或视频的锐度。 |
以给定概率对给定图像或视频的像素进行自动对比度调整(Autocontrast)。 |
|
|
以给定概率均衡给定图像或视频的直方图。 |
函数式操作
|
根据给定的排列方式对输入的通道进行重排。 |
|
详情请参阅 |
详情请参阅 |
|
|
详情请参阅 |
|
详情请参阅 |
|
详情请参阅 |
|
详情请参阅 |
|
详情请参阅 |
|
详情请参阅 |
|
详情请参阅 |
详情请参阅 |
|
|
详情请参阅 |
|
详情请参阅 |
|
调整亮度。 |
|
调整饱和度。 |
|
调整色相 |
|
调整伽马值。 |
组合¶
|
将多个变换组合在一起。 |
|
以给定的概率随机应用一系列变换。 |
|
从列表中随机选择并应用单个变换。 |
|
以随机顺序应用一系列变换。 |
其他¶
使用离线计算的方阵变换矩阵和均值向量来变换张量图像或视频。 |
|
|
使用均值和标准差对张量图像或视频进行归一化。 |
|
在输入的图像或视频中随机选择一个矩形区域并擦除其像素。 |
|
将用户定义的函数作为变换应用。 |
|
移除退化/无效的边界框及其对应的标签和掩码。 |
将边界框限制在对应的图像尺寸内。 |
|
|
从视频的时间维度中均匀采样 |
|
对给定的图像应用 JPEG 压缩和解压缩。 |
函数式操作
|
详情请参阅 |
|
详情请参阅 |
|
移除退化/无效的边界框并返回相应的索引掩码。 |
|
详情请参阅 |
详情请参阅 |
|
|
详情请参阅 |
转换¶
注意
请注意,以下一些转换变换在执行转换时会对值进行缩放,而另一些则不会。缩放是指例如将 uint8
-> float32
的 [0, 255] 范围映射到 [0, 1](反之亦然)。详情请参阅 Dtype and expected value range。
将张量、ndarray 或 PIL 图像转换为 |
|
将所有 TVTensors 转换为纯张量,移除相关元数据(如有)。 |
|
将 PIL 图像转换为相同类型的张量 - 此操作不缩放值。 |
|
|
将张量或 ndarray 转换为 PIL 图像 |
|
将输入转换为特定的 dtype,可选地对图像或视频的值进行缩放。 |
|
将边界框坐标转换为给定的 |
函数式
|
详情请参阅 |
将 |
|
|
将张量或 ndarray 转换为 PIL 图像。 |
|
详情请参阅 |
详情请参阅 |
已弃用
[已弃用] 请改用 |
|
|
[已弃用] 请改用 to_image() 和 to_dtype()。 |
|
[已弃用] 请改用 |
|
[已弃用] 请改用 to_dtype()。 |
自动增强¶
AutoAugment 是一种常用的数据增强技术,可以提高图像分类模型的准确性。尽管数据增强策略与其训练的数据集直接相关,但实证研究表明,ImageNet 策略应用于其他数据集时也能带来显著改进。在 TorchVision 中,我们实现了从以下数据集学到的 3 种策略:ImageNet、CIFAR10 和 SVHN。这个新的变换既可以单独使用,也可以与现有变换混合搭配使用。
|
基于 "AutoAugment: Learning Augmentation Strategies from Data" 的 AutoAugment 数据增强方法。 |
|
基于 "RandAugment: Practical automated data augmentation with a reduced search space" 的 RandAugment 数据增强方法。 |
|
基于 "TrivialAugment: Tuning-free Yet State-of-the-Art Data Augmentation" 中描述的与数据集无关的 TrivialAugment Wide 数据增强。 |
|
基于 "AugMix: A Simple Data Processing Method to Improve Robustness and Uncertainty" 的 AugMix 数据增强方法。 |
CutMix - MixUp¶
CutMix 和 MixUp 是特殊的变换,旨在应用于批次而不是单个图像,因为它们将图像对组合在一起。这些可以在数据加载器之后(样本批处理后)或作为 collation 函数的一部分使用。详细用法示例请参阅 如何使用 CutMix 和 MixUp。
|
对提供的图像和标签批次应用 CutMix。 |
|
对提供的图像和标签批次应用 MixUp。 |
开发者工具¶
实现自定义 v2 变换的基类。 |
|
装饰一个 kernel 以便将其注册到 functional 和(自定义的)tv_tensor 类型。 |
|
返回高度和宽度。 |
|
返回通道数、高度和宽度。 |
|
返回输入中的边界框。 |
V1 API 参考¶
几何变换¶
|
将输入图像调整到给定大小。 |
|
在随机位置裁剪给定的图像。 |
|
裁剪图像的随机部分并将其调整到给定大小。 |
|
在中心裁剪给定的图像。 |
|
将给定的图像裁剪为四个角和中心部分。 |
|
将给定的图像裁剪为四个角和中心部分,以及这些部分的翻转版本(默认为水平翻转)。 |
|
使用给定的“pad”值在给定图像的四周填充。 |
|
按角度旋转图像。 |
|
对图像进行随机仿射变换,同时保持中心不变。 |
|
以给定概率对给定图像执行随机透视变换。 |
|
使用弹性变换对张量图像进行变换。 |
|
以给定概率随机水平翻转给定的图像。 |
|
以给定概率随机垂直翻转给定的图像。 |
色彩变换¶
|
随机改变图像的亮度、对比度、饱和度和色相。 |
|
将图像转换为灰度图。 |
|
以概率 p(默认 0.1)随机将图像转换为灰度图。 |
|
使用随机选择的高斯模糊对图像进行模糊。 |
|
以给定概率随机反转给定图像的颜色。 |
|
以给定概率通过减少每个颜色通道的位数随机对图像进行色调分离(posterize)。 |
|
以给定概率通过反转阈值以上的所有像素值随机对图像进行曝光过度(solarize)。 |
|
以给定概率随机调整图像的锐度。 |
|
以给定概率随机对给定图像的像素进行自动对比度调整。 |
|
以给定概率随机对给定图像的直方图进行均衡化。 |
组合¶
|
将多个变换组合在一起。 |
|
以给定的概率随机应用一系列变换。 |
|
从列表中随机选择并应用单个变换。 |
|
以随机顺序应用一系列变换。 |
其他¶
|
使用离线计算的方阵变换矩阵和均值向量对张量图像进行变换。 |
|
使用均值和标准差对张量图像进行归一化。 |
|
在 torch.Tensor 图像中随机选择一个矩形区域并擦除其像素。 |
|
将用户定义的 lambda 函数作为变换应用。 |
转换¶
注意
请注意,以下一些转换变换在执行转换时会对值进行缩放,而另一些则不会。缩放是指例如将 uint8
-> float32
的 [0, 255] 范围映射到 [0, 1](反之亦然)。详情请参阅 Dtype and expected value range。
|
将张量或 ndarray 转换为 PIL 图像 |
|
将PIL图像或ndarray转换为张量并相应地缩放值。 |
将 PIL 图像转换为相同类型的张量 - 此操作不缩放值。 |
|
|
将张量图像转换为给定的 |
自动增强¶
AutoAugment 是一种常用的数据增强技术,可以提高图像分类模型的准确性。尽管数据增强策略与其训练的数据集直接相关,但实证研究表明,ImageNet 策略应用于其他数据集时也能带来显著改进。在 TorchVision 中,我们实现了从以下数据集学到的 3 种策略:ImageNet、CIFAR10 和 SVHN。这个新的变换既可以单独使用,也可以与现有变换混合搭配使用。
|
在不同数据集上学习到的AutoAugment策略。 |
|
基于 "AutoAugment: Learning Augmentation Strategies from Data" 的 AutoAugment 数据增强方法。 |
|
基于 "RandAugment: Practical automated data augmentation with a reduced search space" 的 RandAugment 数据增强方法。 |
|
基于 "TrivialAugment: Tuning-free Yet State-of-the-Art Data Augmentation" 中描述的与数据集无关的 TrivialAugment Wide 数据增强。 |
|
基于 "AugMix: A Simple Data Processing Method to Improve Robustness and Uncertainty" 的 AugMix 数据增强方法。 |
函数式变换¶
|
调整图像的亮度。 |
|
调整图像的对比度。 |
|
对图像执行伽马校正。 |
|
调整图像的色调。 |
|
调整图像的色彩饱和度。 |
|
调整图像的锐度。 |
|
对图像应用仿射变换,保持图像中心不变。 |
|
通过重新映射图像的每个通道的像素值来最大化对比度,使得最低值变为黑色,最高值变为白色。 |
|
在中心裁剪给定的图像。 |
|
将张量图像转换为给定的 |
|
在指定位置和输出大小裁剪给定的图像。 |
|
通过对输入应用非线性映射来均衡图像的直方图,以便在输出中创建灰度值的均匀分布。 |
|
用给定值擦除输入的张量图像。 |
|
将给定的图像裁剪为四个角和中心部分。 |
|
使用给定的卷积核对图像执行高斯模糊。 |
|
返回图像的维度,格式为 [channels, height, width]。 |
返回图像的通道数。 |
|
|
返回图像的大小,格式为 [width, height]。 |
|
水平翻转给定的图像。 |
|
反转RGB/灰度图像的颜色。 |
|
使用均值和标准差对浮点张量图像进行归一化。 |
|
使用给定的“pad”值在给定图像的四周填充。 |
|
对给定的图像执行透视变换。 |
|
将 |
|
通过减少每个颜色通道的位数来对图像进行色调分离(Posterize)。 |
|
将输入图像调整到给定大小。 |
|
裁剪给定的图像并将其调整到所需大小。 |
|
将RGB图像转换为灰度图像。 |
|
按角度旋转图像。 |
|
通过反转超过阈值的所有像素值,对RGB/灰度图像进行曝光过度处理(Solarize)。 |
|
从给定的图像生成十个裁剪后的图像。 |
|
将任何模式(RGB、HSV、LAB等)的PIL图像转换为灰度图像。 |
|
将张量或 ndarray 转换为 PIL 图像。 |
|
将 |
|
垂直翻转给定的图像。 |