变换和增强图像¶
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})
转换通常作为 or 参数传递
到 Datasets。transform
transforms
从这里开始¶
无论您是 Torchvision 转换的新手,还是已经有 Torchvision 转换的经验 他们,我们鼓励您从 中的 Transforms v2 入门开始 以了解有关新 v2 转换可以执行哪些操作的更多信息。
然后,浏览本页下方的部分以获取一般信息和 性能提示。API 参考中列出了可用的转换和功能。
更多信息和教程也可以在我们的示例库中找到,例如转换 v2:端到端对象检测/分割示例或如何编写您自己的 v2 转换。
支持的输入类型和约定¶
大多数转换都接受 PIL 图像 和 Tensor Inputs。支持 CPU 和 CUDA 张量。 两个后端(PIL 或 Tensors)的结果都应该非常 关闭。一般来说,我们建议依赖张量后端 性能。转换变换可用于与 PIL 图像相互转换,或 转换 dtype 和 ranges。
Tensor 图像的形状应为 ,其中 是
通道数,以及 和 指的是 height 和 width。最
转换支持批量张量输入。一批 Tensor 图像是
shape ,其中 是批次中的图像数量。v2 转换通常接受任意数量的前导
维度,并且可以处理批量图像或批量视频。(C, H, W)
C
H
W
(N, C, H, W)
N
(..., C, H, W)
Dtype 和期望值范围¶
张量图像值的预期范围由
张量 dtype 。具有 float dtype 的 Tensor 图像应具有
中的 值。具有整数 dtype 的张量图像应为
在其中 是最大值
可以用该 DTYPE 表示。通常,dtype 的图像应具有 中的值。[0, 1]
[0, MAX_DTYPE]
MAX_DTYPE
torch.uint8
[0, 255]
V1 还是 V2?我应该使用哪一个?¶
TL;DR:我们建议使用转换
而不是 .他们更快,而且他们可以做到
更多的东西。只需更改导入,您就可以开始了。移动
向前看,新功能和改进将仅考虑用于 v2
变换。torchvision.transforms.v2
torchvision.transforms
在 Torchvision 0.15(2023 年 3 月)中,我们发布了一组新的可用转换
在 namespace 中。这些转换有很多
与 V1 相比的优势 (IN):torchvision.transforms.v2
torchvision.transforms
它们可以转换图像,也可以转换边界框、蒙版或视频。这 为图像分类以外的任务提供支持:检测、分割、 视频分类等。请参阅转换 v2 入门和转换 v2:端到端对象检测/分段示例。
它们支持更多转换,如
和
。请参阅如何使用 CutMix 和 MixUp。
他们更快。
它们支持任意 Importing 结构 (dicts, lists, tuples, etc.)
未来的改进和功能将仅添加到 v2 转换中。
这些转换与 v1 转换完全向后兼容,因此如果
您已经在使用 TransForms From ,只需
do to 是将导入更新为 。就
output,由于实现差异,可能存在可以忽略不计的差异。torchvision.transforms
torchvision.transforms.v2
性能注意事项¶
我们建议遵循以下准则,以充分利用 变换:
依赖 v2 转换
torchvision.transforms.v2
使用张量而不是 PIL 图像
使用 dtype,尤其是用于调整大小
torch.uint8
使用 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]),
])
以上应该会在典型的训练环境中为您提供最佳性能
这依赖于 with 。
num_workers >
0
转换往往对输入步幅/内存格式敏感。一些
通道优先图像的转换速度会更快,而其他人则更喜欢
channels-last 的与运算符一样,大多数转换将保留
memory 格式,但这可能并不总是被遵守,因为
实现细节。如果您正在追求
非常好的性能。对单个转换使用
还有助于分解 memory format 变量(例如 on
)。请注意,我们谈论的是内存格式,而不是张量形状。
torch
转换类、函数和内核¶
转换可以作为类(如 )使用,但也可用作函数(如
命名空间中)。
这非常类似于定义两个类的
包
和 中的
函数等效项。
torchvision.transforms.v2.functional
函数支持 PIL 图像、纯张量或 TVTensor,例如 both 和 are
有效。resize(image_tensor)
resize(boxes)
注意
像 will 这样的随机转换
每次调用时随机采样一些参数。它们的功能
Counterpart (
) 不执行
任何类型的随机采样,因此具有轻微的差异
参数。transforms 类的 class 方法
可用于在使用功能 API 时执行参数采样。
get_params()
命名空间还包含我们
调用 “kernels”。这些是实现
特定类型的核心功能,例如 或。它们是公开的,尽管没有记录。检查代码以查看哪些可用(请注意,那些以
下划线不是公开的!只有当你希望 torchscript 支持像 bounding 这样的类型时,内核才真正有用
框或掩码。torchvision.transforms.v2.functional
resize_bounding_boxes
`resized_crop_mask
Torchscript 支持¶
大多数 transform 类和函数都支持 torchscript。用于合成
transforms,请使用 ,而不是
:
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 类转换,你实际上最终会得到它的(脚本化的)v1
等效。这可能会导致
由于 v1 之间的实现差异而导致的脚本化和 Eager 执行
和 v2.torch.jit.script()
如果您确实需要 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 裁剪转换。 |
|
裁剪中心的输入。 |
|
将图像或视频裁剪为四个角并进行中央裁剪。 |
|
将图像或视频裁剪为四个角,并将中心裁剪加上这些的翻转版本(默认使用水平翻转)。 |
泛 函
别人¶
以给定的概率水平翻转输入。 |
|
以给定的概率垂直翻转输入。 |
|
用给定的 “pad” 值填充 input 的所有侧面。 |
|
从“SSD:Single Shot MultiBox Detector”的“缩小”转换。 |
|
按角度旋转输入。 |
|
随机仿射变换,输入保持中心不变。 |
|
以给定的概率对输入执行随机透视变换。 |
|
使用弹性转换转换输入。 |
泛 函
颜色¶
随机更改图像或视频的亮度、对比度、饱和度和色相。 |
|
随机排列图像或视频的通道 |
|
随机扭曲 SSD:Single Shot MultiBox Detector 中使用的图像或视频。 |
|
将图像或视频转换为灰度。 |
|
|
将图像或视频转换为 RGB(如果它们已经不是 RGB)。 |
将图像或视频随机转换为灰度,概率为 p(默认为 0.1)。 |
|
使用随机选择的高斯模糊内核模糊图像。 |
|
向图像或视频添加高斯噪声。 |
|
以给定的概率反转给定图像或视频的颜色。 |
|
通过减少每个颜色通道的位数,以给定的概率色调分离图像或视频。 |
|
通过反转高于阈值的所有像素值,以给定的概率对图像或视频进行曝光。 |
|
以给定的概率调整图像或视频的清晰度。 |
|
以给定的概率自动对比给定图像或视频的像素。 |
|
以给定的概率均衡给定图像或视频的直方图。 |
泛 函
根据给定的排列排列 input 的通道。 |
|
调整亮度。 |
|
调整饱和度。 |
|
调整色相 |
|
调整灰度系数。 |
组成¶
将多个转换组合在一起。 |
|
随机应用具有给定概率的转换列表。 |
|
应用从列表中随机选取的单个转换。 |
|
以随机顺序应用转换列表。 |
杂项¶
使用方形变换矩阵和离线计算的 mean_vector 变换张量图像或视频。 |
|
使用平均值和标准差对张量图像或视频进行标准化。 |
|
在输入图像或视频中随机选择一个矩形区域并擦除其像素。 |
|
将用户定义的函数应用为转换。 |
|
删除退化/无效的边界框及其相应的标签和掩码。 |
|
将边界框固定到其相应的图像尺寸。 |
|
从视频的时间维度对索引进行统一子采样。 |
|
对给定图像应用 JPEG 压缩和解压缩。 |
泛 函
有关详细信息,请参阅。 |
|
删除退化/无效的边界框并返回相应的索引掩码。 |
|
转换¶
注意
请注意,下面的一些转换转换将缩放值
在执行转换时,虽然有些可能不会进行任何缩放。由
缩放,我们的意思是,例如 -> 会将 [0,
255] 范围转换为 [0, 1](反之亦然)。请参阅 Dtype 和预期值范围。uint8
float32
|
|
将所有 TVTensor 转换为纯张量,删除关联的元数据(如果有)。 |
|
将 PIL 图像转换为相同类型的张量 - 这不会缩放值。 |
|
将 tensor 或 ndarray 转换为 PIL 图像 |
|
将输入转换为特定的 dtype,并可选择缩放 images 或 videos 的值。 |
|
将边界框坐标转换为给定的坐标,例如从 “CXCYWH” 到 “XYXY”。 |
泛 函
将 a 转换为相同类型的张量。 |
|
将 tensor 或 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” 的 RandAugmentment 数据增强方法。 |
|
使用 TrivialAugment Wide 进行独立于数据集的数据增强,如 “TrivialAugment: Tuning-free Yet State-of-the-Art Data Augmentation” 中所述。 |
|
基于“AugMix:一种提高稳健性和不确定性的简单数据处理方法”的 AugMix 数据增强方法。 |
CutMix - 混合¶
CutMix 和 MixUp 是特殊的转换,它们 用于批处理而不是单个图像,因为它们 将图像对组合在一起。这些可以在 dataloader 之后使用 (对样本进行批处理后),或排序规则函数的一部分。有关详细的使用示例,请参阅如何使用 CutMix 和 MixUp。
将 CutMix 应用于提供的一批图像和标签。 |
|
将 MixUp 应用于提供的图片和标签批次。 |
开发人员工具¶
装饰内核以将其注册为 functional 和 (custom) tv_tensor类型。 |
V1 API 参考¶
几何学¶
将输入图像的大小调整为给定的大小。 |
|
在随机位置裁剪给定的图像。 |
|
裁剪图像的随机部分并将其调整为给定大小。 |
|
在中心裁剪给定的图像。 |
|
将给定的图像裁剪为四个角,并进行中央裁剪。 |
|
将给定的图像裁剪为四个角,并将中心裁剪加上这些角的翻转版本(默认使用水平翻转)。 |
|
用给定的 “pad” 值在给定的图像的所有侧面填充。 |
|
按角度旋转图像。 |
|
图像的随机仿射变换保持中心不变。 |
|
以给定的概率对给定图像执行随机透视变换。 |
|
使用弹性变换变换张量图像。 |
|
以给定的概率随机水平翻转给定的图像。 |
|
以给定的概率随机垂直翻转给定的图像。 |
颜色¶
随机更改图像的亮度、对比度、饱和度和色相。 |
|
将图像转换为灰度。 |
|
将图像随机转换为灰度,概率为 p(默认为 0.1)。 |
|
使用随机选择的高斯模糊来模糊图像。 |
|
以给定的概率随机反转给定图像的颜色。 |
|
通过减少每个颜色通道的位数,以给定的概率随机色调分离图像。 |
|
通过反转高于阈值的所有像素值,以给定的概率随机曝光图像。 |
|
以给定的概率随机调整图像的清晰度。 |
|
以给定的概率随机自动对比给定图像的像素。 |
|
以给定的概率随机均衡给定图像的直方图。 |
组成¶
将多个转换组合在一起。 |
|
随机应用具有给定概率的转换列表。 |
|
应用从列表中随机选取的单个转换。 |
|
以随机顺序应用转换列表。 |
杂项¶
使用方变换矩阵和离线计算的mean_vector变换张量图像。 |
|
使用平均值和标准差对张量图像进行归一化。 |
|
在Torch中随机选择一个矩形区域。Tensor 图像并擦除其像素。 |
|
将用户定义的 lambda 应用为转换。 |
转换¶
注意
请注意,下面的一些转换转换将缩放值
在执行转换时,虽然有些可能不会进行任何缩放。由
缩放,我们的意思是,例如 -> 会将 [0,
255] 范围转换为 [0, 1](反之亦然)。请参阅 Dtype 和预期值范围。uint8
float32
将 tensor 或 ndarray 转换为 PIL 图像 |
|
|
将 PIL Image 或 ndarray 转换为 tensor 并相应地缩放值。 |
将 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” 的 RandAugmentment 数据增强方法。 |
|
使用 TrivialAugment Wide 进行独立于数据集的数据增强,如 “TrivialAugment: Tuning-free Yet State-of-the-Art Data Augmentation” 中所述。 |
|
基于“AugMix:一种提高稳健性和不确定性的简单数据处理方法”的 AugMix 数据增强方法。 |
函数转换¶
调整图像的亮度。 |
|
调整图像的对比度。 |
|
对图像执行 Gamma 校正。 |
|
调整图像的色相。 |
|
调整图像的颜色饱和度。 |
|
调整图像的清晰度。 |
|
对图像应用仿射变换,保持图像中心不变。 |
|
通过重新映射每个通道的像素来最大化图像的对比度,使最低的像素变为黑色,最亮的像素变为白色。 |
|
在中心裁剪给定的图像。 |
|
将张量图像转换为给定的图像并相应地缩放值此函数不支持 PIL 图像。 |
|
在指定位置和输出大小裁剪给定图像。 |
|
通过对输入应用非线性映射来均衡图像的直方图,以便在输出中创建灰度值的均匀分布。 |
|
擦除具有给定值的输入 Tensor Image。 |
|
将给定的图像裁剪为四个角,并进行中央裁剪。 |
|
通过给定内核对图像执行高斯模糊 |
|
将图像的尺寸返回为 [channels, height, width]。 |
|
返回图像的通道数。 |
|
将图像的大小返回为 [width, height]。 |
|
水平翻转给定的图像。 |
|
反转 RGB/灰度图像的颜色。 |
|
使用平均值和标准差对浮点张量图像进行归一化。 |
|
用给定的 “pad” 值在给定的图像的所有侧面填充。 |
|
执行给定图像的透视变换。 |
|
将 a 转换为相同类型的张量。 |
|
通过减少每个颜色通道的位数来色调分离图像。 |
|
将输入图像的大小调整为给定的大小。 |
|
裁剪给定的图像并将其调整为所需的大小。 |
|
将 RGB 图像转换为图像的灰度版本。 |
|
按角度旋转图像。 |
|
通过反转高于阈值的所有像素值来使 RGB/灰度图像曝光。 |
|
从给定图像生成 10 张裁剪图像。 |
|
将任何模式(RGB、HSV、LAB 等)的 PIL 图像转换为图像的灰度版本。 |
|
将 tensor 或 ndarray 转换为 PIL 图像。 |
|
将 or 转换为 tensor。 |
|
垂直翻转给定的图像。 |