变换和增强图像¶
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
参数传递给 Datasets。
从这里开始¶
无论您是 Torchvision 变换的新手还是已经经验丰富,我们都鼓励您从 开始使用变换 v2 开始,以便详细了解新的 v2 变换可以做什么。
然后,浏览此页面下方各部分,了解一般信息和性能提示。可用的变换和函数列在 API 参考 中。
更多信息和教程还可以在我们的 示例库 中找到,例如 变换 v2:端到端对象检测/分割示例 或 如何编写您自己的 v2 变换。
支持的输入类型和约定¶
大多数转换都接受 PIL 图像和张量输入。CPU 和 CUDA 张量都受支持。两种后端(PIL 或张量)的结果应该非常接近。一般来说,我们建议依靠张量后端 以提高性能。转换转换 可用于转换到 PIL 图像或从 PIL 图像转换,或用于转换数据类型和范围。
张量图像的形状应为 (C, H, W)
,其中 C
是通道数,H
和 W
分别表示高度和宽度。大多数转换都支持批处理张量输入。一批张量图像是一个形状为 (N, C, H, W)
的张量,其中 N
是批处理中的图像数。v2 转换通常接受任意数量的前导维度 (..., C, H, W)
,并且可以处理批处理图像或批处理视频。
数据类型和预期值范围¶
张量图像值的预期范围由张量数据类型隐式定义。具有浮点数据类型的张量图像的值应在 [0, 1]
中。具有整数数据类型的张量图像的值应在 [0, MAX_DTYPE]
中,其中 MAX_DTYPE
是该数据类型中可表示的最大值。通常,数据类型为 torch.uint8
的图像的值应在 [0, 255]
中。
使用 ToDtype
转换输入的数据类型和范围。
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。它们更快。
它们支持任意输入结构(字典、列表、元组等)。
未来的改进和功能将仅添加到 v2 转换。
这些转换与 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
上)。请注意,我们讨论的是内存格式,而不是 张量形状。
请注意,调整大小转换(如 Resize
和 RandomResizedCrop
)通常更喜欢通道优先输入,并且目前不会受益于 torch.compile()
。
转换类、函数和内核¶
变换可作为类使用,如 Resize
,也可作为函数使用,如 resize()
,该函数在 torchvision.transforms.v2.functional
命名空间中。这与 torch.nn
包非常相似,后者在 torch.nn.functional
中定义了类和函数等价项。
函数支持 PIL 图像、纯张量或 TVTensor,例如 resize(image_tensor)
和 resize(boxes)
都有效。
注意
随机变换(如 RandomCrop
)每次调用时都会随机抽取一些参数。它们的函数对应项(crop()
)不会进行任何类型的随机抽样,因此参数化略有不同。使用函数 API 时,可以使用变换类的 get_params()
类方法来执行参数抽样。
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,这些张量始终被视为图像。如果你需要对其他类型(如边界框或掩码)提供 torchscript 支持,你可以依赖低级内核。
对于要与 torch.jit.script
一起使用的任何自定义变换,它们都应派生自 torch.nn.Module
。
另请参阅:Torchscript 支持。
V2 API 参考 - 推荐¶
几何¶
调整大小¶
|
将输入调整为给定大小。 |
|
根据 "简单复制粘贴是一种用于实例分割的强大数据增强方法" 对输入执行大尺度抖动。 |
|
随机调整输入大小。 |
|
随机调整输入大小。 |
函数
|
有关详细信息,请参阅 |
裁剪¶
|
在随机位置裁剪输入。 |
|
裁剪输入的随机部分并将其调整为给定大小。 |
|
来自 "SSD:单次多框检测器" 的随机 IoU 裁剪变换。 |
|
从中心裁剪输入。 |
|
将图像或视频裁剪成四个角和中心裁剪。 |
|
将图像或视频裁剪成四个角和中心裁剪,以及这些裁剪的翻转版本(默认情况下使用水平翻转)。 |
函数
|
有关详细信息,请参见 |
|
有关详细信息,请参见 |
|
有关详细信息,请参见 |
|
有关详细信息,请参见 |
|
有关详细信息,请参见 |
其他¶
以给定的概率水平翻转输入。 |
|
以给定的概率垂直翻转输入。 |
|
|
使用给定的“pad”值填充输入的所有边。 |
|
来自"SSD: 单次多框检测器"的“缩小”变换。 |
|
按角度旋转输入。 |
|
随机仿射变换输入,保持中心不变。 |
|
以给定的概率对输入执行随机透视变换。 |
|
使用弹性变换变换输入。 |
函数
有关详细信息,请参见 |
|
有关详细信息,请参阅 |
|
|
有关详细信息,请参阅 |
|
有关详细信息,请参阅 |
|
有关详细信息,请参阅 |
|
有关详细信息,请参阅 |
|
有关详细信息,请参阅 |
颜色¶
|
随机更改图像或视频的亮度、对比度、饱和度和色相。 |
随机排列图像或视频的通道 |
|
|
随机扭曲图像或视频,如 SSD: 单次拍摄多框检测器 中所用。 |
|
将图像或视频转换为灰度。 |
|
将图像或视频转换为 RGB(如果它们不是 RGB)。 |
|
以概率 p(默认 0.1)随机将图像或视频转换为灰度。 |
|
使用随机选择的 Gaussian 模糊内核模糊图像。 |
|
以给定的概率反转给定图像或视频的颜色。 |
|
通过减少每个颜色通道的位数,以给定的概率对图像或视频进行海报化处理。 |
|
通过反转高于阈值的所有像素值,以给定的概率对图像或视频进行日光化处理。 |
|
以给定的概率调整图像或视频的锐度。 |
以给定的概率对给定图像或视频的像素进行自动对比度调整。 |
|
|
以给定的概率对给定图像或视频的直方图进行均衡化。 |
函数
|
根据给定的置换对输入的通道进行置换。 |
|
有关详细信息,请参见 |
有关详细信息,请参见 |
|
|
有关详细信息,请参见 |
|
有关详细信息,请参见 |
|
参见 |
|
有关详细信息,请参见 |
|
有关详细信息,请参见 |
|
|
有关详细信息,请参见 |
|
|
|
|
有关详细信息,请参阅 |
|
调整亮度。 |
|
调整饱和度。 |
|
调整色相 |
|
调整伽马。 |
组合¶
|
将多个变换组合在一起。 |
|
以给定的概率随机应用一系列变换。 |
|
从列表中随机选取单个变换并应用。 |
|
按随机顺序应用一系列变换。 |
其他¶
使用离线计算的正方形变换矩阵和均值向量变换张量图像或视频。 |
|
|
使用均值和标准差对张量图像或视频进行归一化。 |
|
在输入图像或视频中随机选择一个矩形区域并擦除其像素。 |
|
将用户定义的函数用作变换。 |
|
移除退化的/无效的边界框及其对应的标签和掩码。 |
将边界框限制在它们对应的图像尺寸内。 |
|
|
从视频的时间维度中均匀地抽取 |
|
对给定的图像应用 JPEG 压缩和解压缩。 |
函数
|
有关详细信息,请参见 |
|
有关详细信息,请参阅 |
|
移除退化/无效的边界框并返回相应的索引掩码。 |
|
有关详细信息,请参阅 |
有关详细信息,请参阅 |
|
|
有关详细信息,请参阅 |
转换¶
注意
请注意,以下某些转换将在执行转换时缩放值,而某些转换可能不会进行任何缩放。缩放是指,例如,uint8
-> float32
会将 [0, 255] 范围映射到 [0, 1](反之亦然)。请参阅 数据类型和预期值范围。
将张量、ndarray 或 PIL 图像转换为 |
|
将所有 TVTensor 转换为纯张量,删除关联的元数据(如果存在)。 |
|
将 PIL 图像转换为相同类型的张量 - 这不会缩放值。 |
|
|
将张量或 ndarray 转换为 PIL 图像 |
|
将输入转换为特定 dtype,可选择缩放图像或视频的值。 |
|
将边界框坐标转换为给定的 |
函数
|
有关详细信息,请参阅 |
将 |
|
|
将张量或 ndarray 转换为 PIL 图像。 |
|
有关详细信息,请参阅 |
有关详细信息,请参阅 |
已弃用
[已弃用] 改用 |
|
|
[已弃用] 改用 to_image() 和 to_dtype()。 |
|
[已弃用] 改用 |
|
[已弃用] 改用 to_dtype()。 |
自动增强¶
AutoAugment 是一种常见的数据增强技术,可以提高图像分类模型的准确性。尽管数据增强策略直接与其训练数据集相关,但实证研究表明,ImageNet 策略在应用于其他数据集时可提供显著的改进。在 TorchVision 中,我们实现了在以下数据集上学习到的 3 种策略:ImageNet、CIFAR10 和 SVHN。新的转换可独立使用,也可与现有转换混合匹配
|
基于 "AutoAugment:从数据中学习增强策略" 的 AutoAugment 数据增强方法。 |
|
基于 "RandAugment:具有缩小搜索空间的实用自动数据增强" 的 RandAugment 数据增强方法。 |
|
数据集无关的数据增强,采用 TrivialAugment Wide,如 "TrivialAugment:无需调优但达到最先进水平的数据增强" 中所述。 |
|
基于 "AugMix:一种改进鲁棒性和不确定性的简单数据处理方法" 的 AugMix 数据增强方法。 |
CutMix - MixUp¶
CutMix 和 MixUp 是特殊的变换,它们用于批处理而不是单个图像,因为它们将成对的图像组合在一起。这些变换可以在数据加载器之后(在对样本进行批处理后)或作为整理函数的一部分使用。有关详细的使用示例,请参阅 如何使用 CutMix 和 MixUp。
|
将 CutMix 应用于提供的图像和标签批处理。 |
|
将 MixUp 应用于提供的图像和标签批处理。 |
开发者工具¶
|
装饰内核以将其注册为功能和(自定义)tv_tensor 类型。 |
V1 API 参考¶
几何¶
|
将输入图像调整为给定大小。 |
|
在随机位置裁剪给定图像。 |
|
裁剪图像的随机部分并将其调整为给定大小。 |
|
在中心裁剪给定图像。 |
|
将给定图像裁剪成四个角和中心裁剪。 |
|
将给定的图像裁剪成四个角和中央裁剪,以及这些图像的翻转版本(默认情况下使用水平翻转)。 |
|
使用给定的“pad”值填充图像的所有边。 |
|
按角度旋转图像。 |
|
随机仿射变换图像,保持中心不变。 |
|
以给定的概率对给定的图像执行随机透视变换。 |
|
使用弹性变换变换张量图像。 |
|
以给定的概率随机水平翻转给定的图像。 |
|
以给定的概率随机垂直翻转给定的图像。 |
颜色¶
|
随机改变图像的亮度、对比度、饱和度和色相。 |
|
将图像转换为灰度。 |
|
以概率 p(默认值为 0.1)将图像随机转换为灰度。 |
|
使用随机选择的高斯模糊对图像进行模糊处理。 |
|
以给定的概率随机反转给定图像的颜色。 |
|
通过减少每个颜色通道的位数,以给定的概率随机对图像进行海报化处理。 |
|
通过反转高于阈值的所有像素值,以给定的概率随机对图像进行日光化处理。 |
|
以给定的概率随机调整图像的锐度。 |
|
以给定的概率随机对给定图像的像素进行自动对比度调整。 |
|
以给定的概率随机均衡给定图像的直方图。 |
组合¶
|
将多个变换组合在一起。 |
|
以给定的概率随机应用一系列变换。 |
|
从列表中随机选取单个变换并应用。 |
|
按随机顺序应用一系列变换。 |
其他¶
|
使用正方形变换矩阵和离线计算的均值向量变换张量图像。 |
|
使用均值和标准差对张量图像进行归一化。 |
|
在 torch.Tensor 图像中随机选择一个矩形区域并擦除其像素。 |
|
将用户定义的 lambda 作为变换应用。 |
转换¶
注意
请注意,以下某些转换将在执行转换时缩放值,而某些转换可能不会进行任何缩放。缩放是指,例如,uint8
-> float32
会将 [0, 255] 范围映射到 [0, 1](反之亦然)。请参阅 数据类型和预期值范围。
|
将张量或 ndarray 转换为 PIL 图像 |
|
将 PIL 图像或 ndarray 转换为张量并相应地缩放值。 |
将 PIL 图像转换为相同类型的张量 - 这不会缩放值。 |
|
|
将张量图像转换为给定的 |
自动增强¶
AutoAugment 是一种常见的数据增强技术,可以提高图像分类模型的准确性。尽管数据增强策略直接与其训练数据集相关,但实证研究表明,ImageNet 策略在应用于其他数据集时可提供显著的改进。在 TorchVision 中,我们实现了在以下数据集上学习到的 3 种策略:ImageNet、CIFAR10 和 SVHN。新的转换可独立使用,也可与现有转换混合匹配
|
在不同数据集上学习的自动增强策略。 |
|
基于 "AutoAugment:从数据中学习增强策略" 的 AutoAugment 数据增强方法。 |
|
基于 "RandAugment:具有缩小搜索空间的实用自动数据增强" 的 RandAugment 数据增强方法。 |
|
数据集无关的数据增强,采用 TrivialAugment Wide,如 "TrivialAugment:无需调优但达到最先进水平的数据增强" 中所述。 |
|
基于 "AugMix:一种改进鲁棒性和不确定性的简单数据处理方法" 的 AugMix 数据增强方法。 |
功能转换¶
|
调整图像的亮度。 |
|
调整图像的对比度。 |
|
对图像执行伽马校正。 |
|
调整图像的色调。 |
|
调整图像的色彩饱和度。 |
|
调整图像的锐度。 |
|
在图像上应用仿射变换,保持图像中心不变。 |
|
通过重新映射每个通道的像素,使最低像素变为黑色,最高像素变为白色,从而最大化图像的对比度。 |
|
在中心裁剪给定图像。 |
|
将张量图像转换为给定的 |
|
在指定位置和输出大小处裁剪给定图像。 |
|
通过对输入应用非线性映射来均衡图像的直方图,以便在输出中创建灰度值的均匀分布。 |
|
使用给定值擦除输入张量图像。 |
|
将给定图像裁剪成四个角和中心裁剪。 |
|
通过给定的内核对图像执行高斯模糊 |
|
将图像的尺寸返回为 [channels, height, width]。 |
返回图像的通道数。 |
|
|
将图像的大小返回为 [width, height]。 |
|
水平翻转给定的图像。 |
|
反转 RGB/灰度图像的颜色。 |
|
使用均值和标准差对浮点张量图像进行归一化。 |
|
使用给定的“pad”值填充图像的所有边。 |
|
对给定的图像执行透视变换。 |
|
将 |
|
通过减少每个颜色通道的位数对图像进行色调分离。 |
|
将输入图像调整为给定大小。 |
|
裁剪给定的图像并将其调整为所需大小。 |
|
将 RGB 图像转换为图像的灰度版本。 |
|
按角度旋转图像。 |
|
通过反转高于阈值的像素值,对 RGB/灰度图像进行太阳化。 |
|
从给定的图像生成十个裁剪图像。 |
|
将任意模式 (RGB、HSV、LAB 等) 的 PIL 图像转换为图像的灰度版本。 |
|
将张量或 ndarray 转换为 PIL 图像。 |
|
将 |
|
垂直翻转给定的图像。 |