增强操作#
关于自动增强,增强是满足以下要求的图像处理函数
它的第一个参数是用于处理的输入批次
第二个参数是控制操作的参数(例如旋转角度)。
它可以接受额外的关键字参数。
它使用 DALI 操作符 实现。
它使用
@augmentation
进行装饰
这是一个定义简化的旋转增强的示例
from nvidia.dali.auto_aug.core import augmentation
from nvidia.dali import fn
@augmentation(mag_range=(0, 30), randomly_negate=True)
def rotate_aug(data, angle, fill_value=128, rotate_keep_size=True):
return fn.rotate(data, angle=angle, fill_value=fill_value, keep_size=True)
基于现有的增强,可以使用调整后的参数创建一个新的增强
rotate_aug_60 = rotate_aug.augmentation(mag_range=(0, 60), randomly_negate=False)
要了解有关如何使用此处列出的增强构建策略的更多信息,请查看特定自动增强方案的文档:AutoAugment,RandAugment,或 TrivialAugment。
装饰器#
- @nvidia.dali.auto_aug.core.augmentation(function=None, *, mag_range=None, randomly_negate=None, mag_to_param=None, param_device=None, name=None, augmentation_cls=None)#
一个装饰器,将使用 DALI 实现的转换变为可用于自动增强的增强(例如 AutoAugment、RandAugment、TrivialAugment)。
function 必须接受至少两个参数:一个样本和一个参数。装饰器处理参数的计算。装饰后的增强接受幅度箱和总箱数,而不是参数。然后,使用箱来计算参数,就像调用 mag_to_param(magnitudes[magnitude_bin] * ((-1) ** random_sign)) 一样,其中 magnitudes=linspace(mag_range[0], mag_range[1], num_magnitude_bins)。
- 参数:
function (callable) – 一个函数,它接受至少两个位置参数:要处理的批次(表示为 DataNode)和转换的参数。该函数必须使用 DALI 操作符来处理批次并返回此类处理的单个输出。
mag_range ((number, number) 或 np.ndarray) – 指定操作的适用幅度范围。如果提供元组,则幅度将计算为 linspace(mag_range[0], mag_range[1], num_magnitude_bins)。如果提供 np.ndarray,它将直接使用,而不是 linspace。如果未指定 mag_range,则传递给 function 的参数将为 None。
randomly_negate (bool) – 如果为 True,则来自 mag_range 的幅度将为每个样本随机取反。
mag_to_param (callable) – 将幅度转换为参数的回调。参数将传递给装饰后的操作,而不是纯幅度。这样,可以预先计算一系列幅度的参数,并将其存储为 Constant 节点。请注意,回调必须返回 numpy 数组或可直接转换为 numpy 数组的数据(特别是,回调中不能使用 pipeline 的 DALI 操作符)。输出类型和维度必须一致,并且不依赖于幅度。
param_device (str) – “cpu”、“gpu”或“auto”;默认为“cpu”。描述存储预计算参数的位置(即 mag_to_param 输出)。如果指定“auto”,将选择 CPU 或 GPU 后端以匹配 sample 的后端。
name (str) – 增强的名称。默认情况下,使用装饰函数的名称。
- 返回值:
使用 Augmentation 类包装的操作,以便它可以与 auto_aug 转换一起使用。
- 返回类型:
- class nvidia.dali.auto_aug.core._augmentation.Augmentation#
使用
@augmentation
装饰函数的结果是Augmentation()
类的实例。该类不应直接实例化,需要使用装饰器创建。一旦获得,这些对象就成为可调用对象,可用于为 AutoAugment、RandAugment 或 TrivialAugment 指定策略。
- def augmentation(self, mag_range, randomly_negate, mag_to_param, param_device, name) -> Augmentation
您可以调用此方法以基于现有实例创建新的
Augmentation()
实例,并调整参数。所有参数都是可选的 - 指定的参数将替换先前传递给@augmentation
的参数。- 参数:
mag_range – 可选,请参阅
@augmentation
。randomly_negate – 可选,请参阅
@augmentation
。mag_to_param – 可选,请参阅
@augmentation
。param_device – 可选,请参阅
@augmentation
。name – 可选,请参阅
@augmentation
。
增强#
以下是由 DALI 定义的可调用 Augmentation()
实例列表。请注意,为了简洁起见,从 @augmentation
装饰器列表中省略了 mag_to_param
、param_device
和 name
参数。
要调整参数范围,请在下面列出的现有 Augmentation()
实例上使用 augmentation
方法,例如
# Create a steeper sheer operation based on existing one
steep_shear_x = shear_x.augmentation(mag_range=(0, 0.5), name="steep_shear_x")
- nvidia.dali.auto_aug.augmentations.shear_x(data, *, magnitude_bin=None, num_magnitude_bins=None, **kwargs)#
使用 nvidia.dali.fn.warp_affine()
应用具有 shear_x
因子的 nvidia.dali.fn.transforms.shear()
。
@augmentation(mag_range=(0, 0.3), randomly_negate=True, ...)
def shear_x(data, shear, fill_value=128, interp_type=None)
- nvidia.dali.auto_aug.augmentations.shear_y(data, *, magnitude_bin=None, num_magnitude_bins=None, **kwargs)#
使用 nvidia.dali.fn.warp_affine()
应用具有 shear_y
因子的 nvidia.dali.fn.transforms.shear()
。
@augmentation(mag_range=(0, 0.3), randomly_negate=True, ...)
def shear_y(data, shear, fill_value=128, interp_type=None)
- nvidia.dali.auto_aug.augmentations.translate_x(data, *, magnitude_bin=None, num_magnitude_bins=None, **kwargs)#
使用 nvidia.dali.fn.warp_affine()
应用具有 x 轴形状相关偏移的 nvidia.dali.fn.transforms.translation()
。
@augmentation(mag_range=(0., 1.), randomly_negate=True, ...)
def translate_x(data, rel_offset, shape, fill_value=128, interp_type=None)
- nvidia.dali.auto_aug.augmentations.translate_x_no_shape(data, *, magnitude_bin=None, num_magnitude_bins=None, **kwargs)#
使用 nvidia.dali.fn.warp_affine()
应用具有 x 轴绝对偏移的 nvidia.dali.fn.transforms.translation()
。
@augmentation(mag_range=(0, 250), randomly_negate=True, ...)
def translate_x_no_shape(data, offset, fill_value=128, interp_type=None)
- nvidia.dali.auto_aug.augmentations.translate_y(data, *, magnitude_bin=None, num_magnitude_bins=None, **kwargs)#
使用 nvidia.dali.fn.warp_affine()
应用具有 y 轴形状相关偏移的 nvidia.dali.fn.transforms.translation()
。
@augmentation(mag_range=(0., 1.), randomly_negate=True, ...)
def translate_y(data, rel_offset, shape, fill_value=128, interp_type=None)
- nvidia.dali.auto_aug.augmentations.translate_y_no_shape(data, *, magnitude_bin=None, num_magnitude_bins=None, **kwargs)#
使用 nvidia.dali.fn.warp_affine()
应用具有 y 轴绝对偏移的 nvidia.dali.fn.transforms.translation()
。
@augmentation(mag_range=(0, 250), randomly_negate=True, ...)
def translate_y_no_shape(data, offset, fill_value=128, interp_type=None)
- nvidia.dali.auto_aug.augmentations.rotate(data, *, magnitude_bin=None, num_magnitude_bins=None, **kwargs)#
使用 nvidia.dali.fn.rotate()
旋转图像。
@augmentation(mag_range=(0, 30), randomly_negate=True)
def rotate(data, angle, fill_value=128, interp_type=None, rotate_keep_size=True)
- nvidia.dali.auto_aug.augmentations.brightness(data, *, magnitude_bin=None, num_magnitude_bins=None, **kwargs)#
使用 nvidia.dali.fn.brightness()
调整亮度。幅度值被映射到 [0, 2] 参数范围。
@augmentation(mag_range=(0, 0.9), randomly_negate=True, ...)
def brightness(data, parameter)
- nvidia.dali.auto_aug.augmentations.contrast(data, *, magnitude_bin=None, num_magnitude_bins=None, **kwargs)#
使用通道加权平均值作为对比度中心来调整对比度。幅度值被映射到 [0, 2] 参数范围。
@augmentation(mag_range=(0, 0.9), randomly_negate=True, ...)
def contrast(data, parameter)
- nvidia.dali.auto_aug.augmentations.color(data, *, magnitude_bin=None, num_magnitude_bins=None, **kwargs)#
使用 nvidia.dali.fn.saturation()
调整颜色饱和度。幅度值被映射到 [0, 2] 参数范围。
@augmentation(mag_range=(0, 0.9), randomly_negate=True, ...)
def color(data, parameter)
- nvidia.dali.auto_aug.augmentations.sharpness(data, *, magnitude_bin=None, num_magnitude_bins=None, **kwargs)#
输出结果与 PIL 的 ImageEnhance.Sharpness 相对应。
@augmentation(mag_range=(0, 0.9), randomly_negate=True, ...)
def sharpness(data, kernel)
- nvidia.dali.auto_aug.augmentations.posterize(data, *, magnitude_bin=None, num_magnitude_bins=None, **kwargs)#
通过屏蔽较低的输入位来对图像进行色调分离。
@augmentation(mag_range=(0, 4), ...)
def posterize(data, mask)
- nvidia.dali.auto_aug.augmentations.solarize(data, *, magnitude_bin=None, num_magnitude_bins=None, **kwargs)#
反转低于阈值的像素。
@augmentation(mag_range=(256, 0), ...)
def solarize(data, threshold)
- nvidia.dali.auto_aug.augmentations.solarize_add(data, *, magnitude_bin=None, num_magnitude_bins=None, **kwargs)#
将偏移应用于值低于 128 的像素。
@augmentation(mag_range=(0, 110), ...)
def solarize_add(data, shift)
- nvidia.dali.auto_aug.augmentations.invert(data, *, magnitude_bin=None, num_magnitude_bins=None, **kwargs)#
反转图像。
@augmentation
def invert(data, _)
- nvidia.dali.auto_aug.augmentations.equalize(data, *, magnitude_bin=None, num_magnitude_bins=None, **kwargs)#
使用 nvidia.dali.fn.experimental.equalize 应用直方图均衡化。
@augmentation
def equalize(data, _)
"""
DALI's equalize follows OpenCV's histogram equalization.
The PIL uses slightly different formula when transforming histogram's
cumulative sum into lookup table.
- nvidia.dali.auto_aug.augmentations.auto_contrast(data, *, magnitude_bin=None, num_magnitude_bins=None, **kwargs)#
应用自动对比度调整。
@augmentation
def auto_contrast(data, _)
- nvidia.dali.auto_aug.augmentations.identity(data, *, magnitude_bin=None, num_magnitude_bins=None, **kwargs)#
恒等运算 - 不应用任何处理。
@augmentation
def identity(data, _)