数据处理¶
在 MMClassification 中,数据处理和数据集是解耦的。数据集只定义了如何从文件系统中获取样本的基本信息。这些基本信息包括分类标签和原始图像数据/图像的路径。完整的数据处理流程包括了数据变换(data transform)、数据预处理器(data preprocessor)及批量数据增强(batch augmentation)。
数据变换
:数据变换包括了数据的加载、部分预处理/增强、数据格式化等操作数据预处理器
:主要负责批量数据的收集、归一化、堆叠、通道翻转等操作。批量数据增强
:批量数据增强是数据预处理器的功能之一,负责处理涉及多个样本的数据增强操作,例如 Mixup 和 CutMix。
数据变换¶
为了准备输入数据,我们需要对数据集中保存的基本信息做一些变换。这些变换包括数据加载、部分预处理和增强、格式化。一系列的数据变换组成了数据流水线(data pipeline)。因此,在数据集的配置参数中通常存在一个 pipeline
参数,例如:
train_pipeline = [
dict(type='LoadImageFromFile'),
dict(type='RandomResizedCrop', scale=224),
dict(type='RandomFlip', prob=0.5, direction='horizontal'),
dict(type='PackClsInputs'),
]
train_dataloader = dict(
....
dataset=dict(
pipeline=train_pipeline,
....),
....
)
pipeline
列表中的每一项都是以下数据变换类之一。如果您想添加自定义数据变换类,可以参考 自定义数据流水线教程。
组合式增强¶
使用 Albumentations 库进行数据变换的封装类 |
|
随机改变图像的亮度、对比度和饱和度 |
|
EfficientNet 风格的中心裁剪 |
|
EfficientNet 风格的随机缩放裁剪 |
|
使用 AlexNet 风格的 PCA 抖动随机调整图像照明 |
|
在随机位置裁剪给定图像 |
|
在图像中随机选择一个矩形区域并擦除像素 |
|
将给定图像按照随机尺寸和纵横比进行裁剪 |
|
按照指定边长调整图像尺寸 |
组合式增强¶
组合式增强将一系列数据增强方法组合在一起,实现对样本的整体增强,例如 AutoAugment
和 RandAugment
Auto augmentation. |
|
Random augmentation. |
为了指定增强组合的策略(即上述变换中的 policies
参数),你可以使用字符串从一系列预设策略中指定。
预设策略 |
用于 |
说明 |
---|---|---|
“imagenet” |
用于 ImageNet 数据集的增强组合,来自 DeepVoltaire/AutoAugment 仓库 |
|
“timm_increasing” |
timm 仓库中的 |
你还可以通过根据下表手动配置一组策略。
自动调整图像对比度 |
|
自动调整图像亮度 |
|
自动调整图像平衡 |
|
改变图像对比度 |
|
擦除部分图像区域 |
|
均衡化图像直方图 |
|
反转图像色阶 |
|
图像像素化(降低各色彩通道的比特数) |
|
旋转图像 |
|
改变图像锐度 |
|
图像切变 |
|
图像日光化(反转高于某一阈值的所有图像色阶) |
|
图像过曝(为低于某一阈值的所有色阶增加一个固定值) |
|
平移图像 |
|
用于组合式增强的数据变换基类 |
格式化¶
收集并仅保留指定字段的数据 |
|
将输入数据整理成为用于分类任务的数据格式。 |
|
将对象转变为 |
|
将图片从 OpenCV 格式转为为 |
|
转置 NumPy 数组 |
MMCV 中的数据变换¶
我们还在 MMCV 中提供了很多数据转换类。你可以在配置文件中直接使用它们。这里我们列举了一些常用的数据变换类,完整的数据变换类列表可以在 mmcv.transforms 中找到。
从图片路径加载图片 |
|
缩放图像、bbox、分割图、关键点等 |
|
随机缩放图像、bbox、关键点等 |
|
随机翻转图像、bbox、关键点等 |
|
随机灰度化图像 |
|
裁剪一张图像的中心区域(同时处理分割图、bbox、关键点等)。如果裁剪尺寸超出原图区域,并且指定了 |
|
归一化图像 |
|
顺序组合一系列数据变换 |
数据预处理器¶
数据预处理器也是在数据进入神经网络之前,对数据进行处理的组件。与数据变换相比,数据预处理器是模型的一个的模块,并且可以获得一个批次的数据进行处理,这意味着它可以使用模型所在的设备(如 GPU),并利用批量处理,实现加速。
MMClassification 中使用的默认的数据预处理器可以进行以下操作:
将数据移动到模型所在的设备
将不同尺寸的输入填充至统一的尺寸
将一系列输入的 tensor 组成 batch
如果输入的 tensor 形状为 (3, H, W),则可以执行 BGR 到 RGB 的通道转换
根据给定的均值和方差对图像进行归一化
在训练时进行批量数据增强,如 Mixup 和 CutMix
你可以在配置文件的 data_preprocessor
字段,或是 model.data_preprocessor
字段对数据预处理器进行配置。一个典型的用法如下:
data_preprocessor = dict(
# RGB format normalization parameters
mean=[123.675, 116.28, 103.53],
std=[58.395, 57.12, 57.375],
to_rgb=True, # convert image from BGR to RGB
)
或者在 model.data_preprocessor
字段配置如下:
model = dict(
backbone = ...,
neck = ...,
head = ...,
data_preprocessor = dict(
mean=[123.675, 116.28, 103.53],
std=[58.395, 57.12, 57.375],
to_rgb=True)
train_cfg=...,
)
请注意如果在两处均进行了配置,model.data_preprocessor
拥有更高的优先级。
用于分类任务的图像预处理器 |
批量数据增强¶
批量数据增强是数据预处理器的一个功能。它可以利用一个批次的多个样本,以某种方式进行混合增强,如 Mixup 和 CutMix。
这些数据增强只会在训练过程中生效,因此,我们使用 model.train_cfg
字段来配置这些功能。
model = dict(
backbone=...,
neck=...,
head=...,
train_cfg=dict(augments=[
dict(type='Mixup', alpha=0.8),
dict(type='CutMix', alpha=1.0),
]),
)
你也可以通过 probs
字段指定每一个批量数据增强的概率。
model = dict(
backbone=...,
neck=...,
head=...,
train_cfg=dict(augments=[
dict(type='Mixup', alpha=0.8),
dict(type='CutMix', alpha=1.0),
], probs=[0.3, 0.7])
)
这里是 MMClassification 中支持的所有批量数据增强列表。
Mixup batch augmentation. |
|
CutMix batch agumentation. |
|
ResizeMix Random Paste layer for a batch of data. |