变换和增强图像¶
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:我们建议使用转换
而不是 .他们更快,而且他们可以做到
更多的东西。只需更改导入,您就可以开始了。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 转换仍处于 BETA 阶段,但目前我们预计不会 对其公共 API 进行的破坏性更改。我们计划制作 它们在 0.17 版本中完全稳定。请在此处提交您可能有的任何反馈。
性能注意事项¶
我们建议遵循以下准则,以充分利用 变换:
依赖 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
torch.nn.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 中使用的图像或视频。 |
|
[测试版]将图像或视频转换为灰度。 |
|
[测试版]将图像或视频随机转换为灰度,概率为 p(默认为 0.1)。 |
|
[测试版]使用随机选择的高斯模糊来模糊图像。 |
|
[测试版]以给定的概率反转给定图像或视频的颜色。 |
|
[测试版]通过减少每个颜色通道的位数,以给定的概率色调分离图像或视频。 |
|
[测试版]通过反转高于阈值的所有像素值,以给定的概率对图像或视频进行曝光。 |
|
[测试版]以给定的概率调整图像或视频的清晰度。 |
|
[测试版]以给定的概率自动对比给定图像或视频的像素。 |
|
[测试版]以给定的概率均衡给定图像或视频的直方图。 |
泛 函
根据给定的排列排列 input 的通道。 |
|
调整亮度。 |
|
调整饱和度。 |
|
调整色相 |
|
调整灰度系数。 |
组成¶
[测试版]将多个转换组合在一起。 |
|
[测试版]随机应用具有给定概率的转换列表。 |
|
[测试版]应用从列表中随机选取的单个转换。 |
|
[测试版]以随机顺序应用转换列表。 |
杂项¶
[测试版]使用方形变换矩阵和离线计算的 mean_vector 变换张量图像或视频。 |
|
[测试版]使用平均值和标准差对张量图像或视频进行标准化。 |
|
[测试版]在输入图像或视频中随机选择一个矩形区域并擦除其像素。 |
|
[测试版]将用户定义的函数应用为转换。 |
|
[测试版]删除退化/无效的边界框及其相应的标签和掩码。 |
|
[测试版]将边界框固定到其相应的图像尺寸。 |
|
[测试版]从视频的时间维度对索引进行统一子采样。 |
泛 函
[测试版]有关详细信息,请参阅。 |
|
转换¶
注意
请注意,下面的一些转换转换将缩放值
在执行转换时,虽然有些可能不会进行任何缩放。由
缩放,我们的意思是,例如 -> 会将 [0,
255] 范围转换为 [0, 1](反之亦然)。请参阅 Dtype 和预期值范围。uint8
float32
|
|
[测试版]将所有tv_tensors转换为纯张量,删除关联的元数据(如果有)。 |
|
[测试版]将 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。 |
|
垂直翻转给定的图像。 |