Albumentations: Fast and Flexible Image Augmentations.
- website:link
- documents:link
- code:github
- paper:Albumentations: Fast and Flexible Image Augmentations
Albumentations是一个为图像的数据增强设计的python库,安装如下:
pip install albumentations
1. Albumentations中的数据增强方法
Albumentations中的数据增强方法可以分为像素级的变换(pixel-level transforms)和空间级的变换(spatial-level transforms)两类。
⚪ pixel-level transforms
像素级的变换只改变图像的整体像素值,不影响图像的标签(如mask,检测框,关键点)。适用于图像分类等任务。
格式转换
- Normalize:标准化像素值,
mean=(0.485, 0.456, 0.406)像素均值;std=(0.229, 0.224, 0.225)像素标准差;max_pixel_value=255.0最大像素值 - Downscale:通过下采样再上采样降低图像的质量,
scale_min=0.25下采样的最小尺寸;scale_max=0.25下采样的最大尺寸;interpolation=0插值方法,默认为最近邻差值 - FromFloat:改变像素值的数据类型(通常下采样),
dtype='uint16'目标数据类型;max_value=None输入像素值的最大值 - ImageCompression:降低图像的压缩质量,
quality_lower=99图像质量的下界;quality_upper=100图像质量的上界 - ToFloat:改变像素值的数据类型(转变成float32),
max_value=None输入像素值的最大值 - ToGray:转变成灰度图
引入全局噪声
- GaussNoise:增加高斯噪声,
var_limit=(10.0, 50.0)噪声的方差范围;mean=0噪声的均值;per_channel=True每个通道独立增加噪声 - GlassBlur:增加玻璃噪声,
sigma=0.7高斯核的标准差;max_delta=4交换像素的最大距离;iterations=2迭代次数;mode='fast'计算模式,fast或exact - ISONoise:增加相机传感器噪声,
color_shift=(0.01, 0.05)色调的改变方差;intensity=(0.1, 0.5)控制色彩强度和亮度的因子 - RandomFog:图像加雾,
fog_coef_lower=0.3加雾的最低程度;fog_coef_upper=1加雾的最高程度;alpha_coef=0.08加雾的透明度 - RandomGamma:增加伽马噪声,
gamma_limit=(80, 120)噪声的范围 - RandomRain图像加雨,
slant_lower=-10雨倾斜程度的最小值;slant_upper=10雨倾斜程度的最大值;drop_length=20雨的长度;drop_width=1雨的宽度;drop_color=(200, 200, 200)雨的颜色;blur_value=7雨的扰动程度;brightness_coefficient=0.7下雨时的阴天程度 - RandomShadow:图像加阴影,
shadow_roi=(0, 0.5, 1, 1)图像出现阴影的区域;num_shadows_lower=1阴影区域的最小值;num_shadows_upper=2阴影区域的最大值;shadow_dimension=5阴影区域是几边形 - RandomSnow:图像加雪,
snow_point_lower=0.1最小降雪量;snow_point_upper=0.3最大降雪量;brightness_coeff=2.5雪的大小 - RandomSunFlare:图像加太阳耀斑,
flare_roi=(0, 0, 1, 0.5))图像出现耀斑的区域;angle_lower=0最小角度;angle_upper=1最大角度;num_flare_circles_lower=6最小耀斑数量;num_flare_circles_upper=10最大耀斑数量;src_radius=400耀斑半径;src_color=(255, 255, 255)耀斑颜色 - RandomToneCurve:通过色调曲线随机改变明亮区域和阴暗区域之间的关系,
scale=0.1两个控制点之间的距离分布的标准差 - ToSepia:对图像应用棕褐色过滤器(减去较暗的色调)
平滑滤波:模糊图像
- Blur:随机平滑,
blur_limit=7平滑核的最大尺寸 - GaussianBlur使用高斯核进行平滑,
blur_limit=(3, 7)平滑核的尺寸范围;sigma_limit=0高斯核的标准差 - MedianBlur:中值滤波,
blur_limit=7平滑核的最大尺寸 - MotionBlur:为图像增加运动模糊,
blur_limit=7平滑核的最大尺寸
锐化滤波:增强轮廓
- Emboss:使用emboss滤波器提取轮廓并与原图叠加;
alpha=(0.2, 0.5)轮廓的可见度;strength=(0.2, 0.7)emboss的强度范围 - Sharpen:锐化图像并与原图叠加;
alpha=(0.2, 0.5)锐化图像的可见度;lightness=(0.5, 1.0)锐化图像的亮度
对比度变换
- Equalize:直方图均衡化,
by_channels=True对不同通道分别进行,否则只进行Y通道;mask=None对指定区域的像素进行均衡化 - CLAHE:限制对比度的自适应直方图均衡化,
clip_limit=(1,4)对比度限制的范围;tile_grid_size=(8,8)网格大小 - ColorJitter:随机改变图像的亮度,对比度和饱和度,
brightness=0.2亮度改变的程度,比例随机从$[max(0,1-brightness),1+brightness]$采样;contrast=0.2对比度改变的程度,同上;saturation=0.2饱和度改变的程度,同上;hue=0.2色调改变的程度,比例随机从$[-hue,hue]$采样 - HistogramMatching:直方图匹配,
reference_images直方图参考图像;blend_ratio=(0.5, 1.0)混合程度;read_fn=lambda x: x读取图像的函数 - HueSaturationValue:随机改变图像的色调,饱和度和像素值,
hue_shift_limit=20色调改变的范围;sat_shift_limit=30饱和度改变的范围;val_shift_limit像素值改变的范围 - RandomBrightnessContrast随机改变图像的亮度和对比度,
brightness_limit=0.2亮度改变的范围;contrast_limit=0.2对比度改变的范围;brightness_by_max=True通过最大值还是均值调整对比度
颜色变换
- ChannelDropout:随机丢弃图像的通道,
channel_drop_range=(1, 1)丢弃的通道数量范围;fill_value=0对被丢弃的通道重新赋值 - ChannelShuffle:对图像的通道进行随机重排
- FancyPCA:对图像所有像素增加在该像素集中通过PCA计算得到的固定值$[p_1,p_2,p_3][\alpha_1 \lambda_1,\alpha_2 \lambda_2,\alpha_3 \lambda_3]^T$,
alpha=0.1扰动特征值的程度,从$\mathcal{N}(0,\alpha)$中采样 - InvertImg:反转图像的像素值(255-当前值)
- MultiplicativeNoise:图像像素值乘以随机数,
multiplier=(0.9, 1.1)随机数的范围;per_channel=False是否通道独立操作;elementwise=False是否像素独立操作 - Posterize:减少每个颜色通道的bit数,;
num_bits=4颜色存储的比特数 - RGBShift:随机改变图像的像素颜色值,
r_shift_limit=20红色分量改变的范围;g_shift_limit=20绿色分量改变的范围;b_shift_limit=20蓝色分量改变的范围 - Solarize:反转图像中大于阈值像素的像素值,
threshold=128像素阈值
下游任务
- FDA:通过傅里叶变换进行域自适应的风格迁移,
reference_images目标风格图像;beta_limit=0.1方法的系数;read_fn=lambda x: x读取图像的函数 - Superpixels:将图像转变成超像素(图像分割),
p_replace=0.1每块超像素由其颜色均值替代的概率;n_segments=100超像素的估计数量;max_size=128图像增强的最大尺寸,interpolation=1插值方法
⚪ spatial-level transforms
空间级的变换同时改变图像及其标注(如mask,检测框,关键点),适用于图像分割、目标检测、姿态估计等任务。
| Transform | Image | Masks | BBoxes | Keypoints |
|---|---|---|---|---|
| Affine | ✓ | ✓ | ✓ | ✓ |
| CenterCrop | ✓ | ✓ | ✓ | ✓ |
| CoarseDropout | ✓ | ✓ | ||
| Crop | ✓ | ✓ | ✓ | ✓ |
| CropAndPad | ✓ | ✓ | ✓ | ✓ |
| CropNonEmptyMaskIfExists | ✓ | ✓ | ✓ | ✓ |
| ElasticTransform | ✓ | ✓ | ||
| Flip | ✓ | ✓ | ✓ | ✓ |
| GridDistortion | ✓ | ✓ | ||
| GridDropout | ✓ | ✓ | ||
| HorizontalFlip | ✓ | ✓ | ✓ | ✓ |
| Lambda | ✓ | ✓ | ✓ | ✓ |
| LongestMaxSize | ✓ | ✓ | ✓ | ✓ |
| MaskDropout | ✓ | ✓ | ||
| NoOp | ✓ | ✓ | ✓ | ✓ |
| OpticalDistortion | ✓ | ✓ | ||
| PadIfNeeded | ✓ | ✓ | ✓ | ✓ |
| Perspective | ✓ | ✓ | ✓ | ✓ |
| PiecewiseAffine | ✓ | ✓ | ✓ | ✓ |
| RandomCrop | ✓ | ✓ | ✓ | ✓ |
| RandomCropNearBBox | ✓ | ✓ | ✓ | ✓ |
| RandomGridShuffle | ✓ | ✓ | ||
| RandomResizedCrop | ✓ | ✓ | ✓ | ✓ |
| RandomRotate90 | ✓ | ✓ | ✓ | ✓ |
| RandomScale | ✓ | ✓ | ✓ | ✓ |
| RandomSizedBBoxSafeCrop | ✓ | ✓ | ✓ | |
| RandomSizedCrop | ✓ | ✓ | ✓ | ✓ |
| Resize | ✓ | ✓ | ✓ | ✓ |
| Rotate | ✓ | ✓ | ✓ | ✓ |
| SafeRotate | ✓ | ✓ | ✓ | ✓ |
| ShiftScaleRotate | ✓ | ✓ | ✓ | ✓ |
| SmallestMaxSize | ✓ | ✓ | ✓ | ✓ |
| Transpose | ✓ | ✓ | ✓ | ✓ |
| VerticalFlip | ✓ | ✓ | ✓ | ✓ |
2. Albumentations的使用
Albumentations的简单使用如下:
import albumentations as A
import cv2
# Declare an augmentation pipeline
transform = A.Compose([
A.RandomCrop(width=256, height=256), # 随机裁剪
A.HorizontalFlip(p=0.5), # 随机水平翻转
A.RandomBrightnessContrast(p=0.2), # 随机明亮对比度
A.OneOf([
A.Blur(blur_limit=3, p=0.1), # 使用随机大小的内核模糊图像
A.MedianBlur(blur_limit=3, p=0.1), # 中值滤波
], p=0.2),
])
# Read an image with OpenCV and convert it to the RGB colorspace
image = cv2.imread("image.jpg")
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# Augment an image
transformed = transform(image=image)
transformed_image = transformed["image"]
Albumentations的两个主要方法:
A.Compose:顺序执行内部的变换A.OneOf:随机选择一种变换执行
Albumentations已经集成在mmdetection框架下。使用时直接修改config文件内的train_pipeline即可:
albu_train_transforms = [
dict(type='HorizontalFlip', p=0.5),
dict(type='OneOf', transforms=[
dict(type='Blur', blur_limit=3, p=0.5),
dict(type='MedianBlur', blur_limit=3, p=0.5),
],
p=0.1),
]
train_pipeline = [
dict(type='LoadImageFromFile'),
dict(type='LoadAnnotations', with_bbox=True),
dict(type='Albu', transforms=albu_train_transforms), # 数据增强
dict(type='Resize', img_scale=(1333, 800), keep_ratio=True),
dict(type='RandomFlip', flip_ratio=0.5),
dict(
type='Normalize',
mean=[123.675, 116.28, 103.53],
std=[58.395, 57.12, 57.375],
to_rgb=True),
dict(type='Pad', size_divisor=32),
dict(type='DefaultFormatBundle'),
dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels'])
]