变换和增强图像¶
注意
在 0.15 中,我们在 namespace 中发布了一组新的转换,它们增加了对转换的支持
不仅是图像,还包括边界框、蒙版或视频。这些转换
与当前 API 完全向后兼容,您将看到它们
下面记录的 v2. 前缀。要开始使用这些新的
转换,您可以查看转换 v2:端到端对象检测示例。
请注意,这些转换仍处于 BETA 阶段,虽然我们预计 main
重大变化,部分 API 可能仍会根据用户情况而变化
反馈。请在此处提交您可能有的任何反馈,您也可以检查
走出本期了解
有关我们怀疑可能涉及未来更改的 API 的更多信息。torchvision.transforms.v2
转换是模块中提供的常见图像转换。可以使用 .
大多数转换类都有一个等效的函数:functional
转换可以对
转换。
如果您必须构建更复杂的转换管道,这将非常有用
(例如,在分段任务的情况下)。
torchvision.transforms
大多数转换都接受 PIL 图像 和张量图像,尽管有些转换是仅限 PIL 的,有些是 Tensor Only 的 Tensor 中。Conversion 可用于与 Convert 进行相互转换 PIL 图像,或用于转换 dtype 和 range。
接受张量图像的转换也接受批量张量
图像。张量图像是具有形状的张量,其中 是
通道数,分别是图像高度和宽度。一批
Tensor Images 是形状的张量,其中 是一个数字
批次中的图像。(C, H, W)
C
H
W
(B, C, H, W)
B
张量图像值的预期范围由
张量 dtype 。具有 float dtype 的 Tensor 图像应具有
中的 值。具有整数 dtype 的张量图像应为
在其中 是最大值
可以用该 DTYPE 表示。[0, 1)
[0, MAX_DTYPE]
MAX_DTYPE
随机转换会将相同的转换应用于所有 图像,但它们将产生不同的转换 跨呼叫。对于跨调用的可重现转换,您可以使用函数转换。
以下示例说明了可用转换的用法:
警告
从 v0.8.0 开始,所有的随机变换都使用 torch 默认的随机生成器来采样随机参数。 这是一个向后兼容性的破坏性变化,用户应该按如下方式设置 random 状态:
# Previous versions
# import random
# random.seed(12)
# Now
import torch
torch.manual_seed(17)
请记住,torch 随机生成器和 Python 随机生成器的相同种子不会 产生相同的结果。
转换可脚本性¶
为了编写转换脚本,请使用 而不是 .
torch.nn.Sequential
transforms = torch.nn.Sequential(
transforms.CenterCrop(10),
transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225)),
)
scripted_transforms = torch.jit.script(transforms)
确保仅使用可编写脚本的转换,即使用 lambda 函数且不需要 lambda 函数或 .torch.Tensor
PIL.Image
对于要与 一起使用的任何自定义转换,它们应派生自 。torch.jit.script
torch.nn.Module
几何学¶
将输入图像的大小调整为给定的大小。 |
|
[测试版]将输入的大小调整为给定的大小。 |
|
[测试版]根据“Simple Copy-Paste is a Strong Data Augmentation Method for Instance Segmentation”对输入执行大规模抖动。 |
|
[测试版]随机调整输入的大小。 |
|
[测试版]随机调整输入的大小。 |
|
在随机位置裁剪给定的图像。 |
|
[测试版]在随机位置裁剪输入。 |
|
裁剪图像的随机部分并将其调整为给定大小。 |
|
[测试版]裁剪输入的随机部分并将其大小调整为给定大小。 |
|
[测试版]来自“SSD:Single Shot MultiBox Detector”的随机 IoU 裁剪转换。 |
|
在中心裁剪给定的图像。 |
|
[测试版]裁剪中心的输入。 |
|
将给定的图像裁剪为四个角,并进行中央裁剪。 |
|
[测试版]将图像或视频裁剪为四个角并进行中央裁剪。 |
|
将给定的图像裁剪为四个角,并将中心裁剪加上这些角的翻转版本(默认使用水平翻转)。 |
|
[测试版]将图像或视频裁剪为四个角,并将中心裁剪加上这些的翻转版本(默认使用水平翻转)。 |
|
用给定的 “pad” 值在给定的图像的所有侧面填充。 |
|
[测试版]用给定的 “pad” 值填充 input 的所有侧面。 |
|
[测试版]从“SSD:Single Shot MultiBox Detector”的“缩小”转换。 |
|
按角度旋转图像。 |
|
[测试版]按角度旋转输入。 |
|
图像的随机仿射变换保持中心不变。 |
|
[测试版]随机仿射变换,输入保持中心不变。 |
|
以给定的概率对给定图像执行随机透视变换。 |
|
[测试版]以给定的概率对输入执行随机透视变换。 |
|
使用弹性变换变换张量图像。 |
|
[测试版]使用弹性转换转换输入。 |
|
以给定的概率随机水平翻转给定的图像。 |
|
[测试版]以给定的概率水平翻转输入。 |
|
以给定的概率随机垂直翻转给定的图像。 |
|
[测试版]以给定的概率垂直翻转输入。 |
颜色¶
随机更改图像的亮度、对比度、饱和度和色相。 |
|
[测试版]随机更改图像或视频的亮度、对比度、饱和度和色相。 |
|
[测试版]随机扭曲 SSD:Single Shot MultiBox Detector 中使用的图像或视频。 |
|
将图像转换为灰度。 |
|
[测试版]将图像或视频转换为灰度。 |
|
将图像随机转换为灰度,概率为 p(默认为 0.1)。 |
|
[测试版]将图像或视频随机转换为灰度,概率为 p(默认为 0.1)。 |
|
使用随机选择的高斯模糊来模糊图像。 |
|
[测试版]使用随机选择的高斯模糊来模糊图像。 |
|
以给定的概率随机反转给定图像的颜色。 |
|
[测试版]以给定的概率反转给定图像或视频的颜色。 |
|
通过减少每个颜色通道的位数,以给定的概率随机色调分离图像。 |
|
[测试版]通过减少每个颜色通道的位数,以给定的概率色调分离图像或视频。 |
|
通过反转高于阈值的所有像素值,以给定的概率随机曝光图像。 |
|
[测试版]通过反转高于阈值的所有像素值,以给定的概率对图像或视频进行曝光。 |
|
以给定的概率随机调整图像的清晰度。 |
|
[测试版]以给定的概率调整图像或视频的清晰度。 |
|
以给定的概率随机自动对比给定图像的像素。 |
|
[测试版]以给定的概率自动对比给定图像或视频的像素。 |
|
以给定的概率随机均衡给定图像的直方图。 |
|
[测试版]以给定的概率均衡给定图像或视频的直方图。 |
组成¶
将多个转换组合在一起。 |
|
[测试版]将多个转换组合在一起。 |
|
随机应用具有给定概率的转换列表。 |
|
[测试版]随机应用具有给定概率的转换列表。 |
|
应用从列表中随机选取的单个转换。 |
|
[测试版]应用从列表中随机选取的单个转换。 |
|
以随机顺序应用转换列表。 |
|
[测试版]以随机顺序应用转换列表。 |
杂项¶
使用方变换矩阵和离线计算的mean_vector变换张量图像。 |
|
[测试版]使用方形变换矩阵和离线计算的 mean_vector 变换张量图像或视频。 |
|
使用平均值和标准差对张量图像进行归一化。 |
|
[测试版]使用平均值和标准差对张量图像或视频进行标准化。 |
|
在Torch中随机选择一个矩形区域。Tensor 图像并擦除其像素。 |
|
[测试版]在输入图像或视频中随机选择一个矩形区域并擦除其像素。 |
|
将用户定义的 lambda 应用为转换。 |
|
[测试版]将用户定义的函数应用为转换。 |
|
[测试版]删除退化/无效的边界框及其相应的标签和掩码。 |
|
[测试版]将边界框固定到其相应的图像尺寸。 |
|
[测试版]从视频的时间维度对索引进行统一子采样。 |
转换¶
注意
请注意,下面的一些转换转换将缩放值
在执行转换时,虽然有些可能不会进行任何缩放。由
缩放,我们的意思是,例如 -> 会将 [0,
255] 范围转换为 [0, 1](反之亦然)。uint8
float32
将张量或 ndarray 转换为 PIL 图像 - 这不会缩放值。 |
|
[测试版]将张量或 ndarray 转换为 PIL 图像 - 这不会缩放值。 |
|
|
将 PIL Image 或 ndarray 转换为 tensor 并相应地缩放值。 |
[测试版]将 PIL Image 或 ndarray 转换为 tensor 并相应地缩放值。 |
|
将 PIL 图像转换为相同类型的张量 - 这不会缩放值。 |
|
[测试版]将 PIL 图像转换为相同类型的张量 - 这不会缩放值。 |
|
将张量图像转换为给定的值并相应地缩放值。 |
|
[测试版]将输入图像或视频转换为给定的值并相应地缩放值。 |
|
[测试版]将输入转换为特定的 dtype - 这不会缩放值。 |
|
[测试版]将边界框坐标转换为给定的坐标,例如从 “CXCYWH” 到 “XYXY”。 |
自动增强¶
AutoAugment 是一种常见的数据增强技术,可以提高图像分类模型的准确性。 尽管数据增强策略与他们训练的数据集直接相关,但实证研究表明, ImageNet 策略在应用于其他数据集时提供了显著的改进。 在 TorchVision 中,我们实施了在以下数据集上学习的 3 个策略: ImageNet 、 CIFAR10 和 SVHN 。 新转换可以独立使用,也可以与现有转换混合使用:
AutoAugment 策略在不同的数据集上学习。 |
|
基于 “AutoAugment: Learning Augmentation Strategies from Data” 的 AutoAugment 数据增强方法。 |
|
[测试版]基于 “AutoAugment: Learning Augmentation Strategies from Data” 的 AutoAugment 数据增强方法。 |
|
基于 “RandAugment: Practical automated data augmentation with a reduced search space” 的 RandAugmentment 数据增强方法。 |
|
[测试版]基于 “RandAugment: Practical automated data augmentation with a reduced search space” 的 RandAugmentment 数据增强方法。 |
|
使用 TrivialAugment Wide 进行独立于数据集的数据增强,如 “TrivialAugment: Tuning-free Yet State-of-the-Art Data Augmentation” 中所述。 |
|
[测试版]使用 TrivialAugment Wide 进行独立于数据集的数据增强,如 “TrivialAugment: Tuning-free Yet State-of-the-Art Data Augmentation” 中所述。 |
|
基于“AugMix:一种提高稳健性和不确定性的简单数据处理方法”的 AugMix 数据增强方法。 |
|
[测试版]基于“AugMix:一种提高稳健性和不确定性的简单数据处理方法”的 AugMix 数据增强方法。 |
函数转换¶
注意
您可以在下方找到现有命名空间的文档。命名空间也存在,并且可以是
使用!存在相同的函数,因此您只需更改
import 来依赖命名空间。torchvision.transforms.functional
torchvision.transforms.v2.functional
v2
函数转换可让您对转换管道进行精细控制。 与上述转换相反,函数转换不包含随机数 generator 的参数。 这意味着您必须指定/生成所有参数,但函数式转换将为您提供 跨调用的可重现结果。
例: 您可以将具有相同参数的函数转换应用于多个图像,如下所示:
import torchvision.transforms.functional as TF
import random
def my_segmentation_transforms(image, segmentation):
if random.random() > 0.5:
angle = random.randint(-30, 30)
image = TF.rotate(image, angle)
segmentation = TF.rotate(segmentation, angle)
# more transforms ...
return image, segmentation
例: 您可以使用 Functional transform 来构建具有自定义行为的 transform 类:
import torchvision.transforms.functional as TF
import random
class MyRotationTransform:
"""Rotate by one of the given angles."""
def __init__(self, angles):
self.angles = angles
def __call__(self, x):
angle = random.choice(self.angles)
return TF.rotate(x, angle)
rotation_transform = MyRotationTransform(angles=[-30, -15, 0, 15, 30])
调整图像的亮度。 |
|
调整图像的对比度。 |
|
对图像执行 Gamma 校正。 |
|
调整图像的色相。 |
|
调整图像的颜色饱和度。 |
|
调整图像的清晰度。 |
|
对图像应用仿射变换,保持图像中心不变。 |
|
通过重新映射每个通道的像素来最大化图像的对比度,使最低的像素变为黑色,最亮的像素变为白色。 |
|
在中心裁剪给定的图像。 |
|
将张量图像转换为给定的图像并相应地缩放值此函数不支持 PIL 图像。 |
|
在指定位置和输出大小裁剪给定图像。 |
|
通过对输入应用非线性映射来均衡图像的直方图,以便在输出中创建灰度值的均匀分布。 |
|
擦除具有给定值的输入 Tensor Image。 |
|
将给定的图像裁剪为四个角,并进行中央裁剪。 |
|
按给定内核对图像执行高斯模糊处理。 |
|
将图像的尺寸返回为 [channels, height, width]。 |
|
返回图像的通道数。 |
|
将图像的大小返回为 [width, height]。 |
|
水平翻转给定的图像。 |
|
反转 RGB/灰度图像的颜色。 |
|
使用平均值和标准差对浮点张量图像进行归一化。 |
|
用给定的 “pad” 值在给定的图像的所有侧面填充。 |
|
执行给定图像的透视变换。 |
|
将 a 转换为相同类型的张量。 |
|
通过减少每个颜色通道的位数来色调分离图像。 |
|
将输入图像的大小调整为给定的大小。 |
|
裁剪给定的图像并将其调整为所需的大小。 |
|
将 RGB 图像转换为图像的灰度版本。 |
|
按角度旋转图像。 |
|
通过反转高于阈值的所有像素值来使 RGB/灰度图像曝光。 |
|
从给定图像生成 10 张裁剪图像。 |
|
将任何模式(RGB、HSV、LAB 等)的 PIL 图像转换为图像的灰度版本。 |
|
将 tensor 或 ndarray 转换为 PIL 图像。 |
|
将 or 转换为 tensor。 |
|
垂直翻转给定的图像。 |