原文链接:Tutorial 3: Custom Data Pipelines — mmflow documentation
教程3 自定义数据处理流程
设计数据处理流程
遵循经典的惯例,我们使用Dataset和DataLoader用于多任务数据载入。Dataset返回一个对应于模型前向传播参数的数据项的字典结构。由于进行光流估计的数据可能大小不一致,我们在MMCV中引入了一种新的DataContainer类型来便于收集和分发不同大小的数据。详情参考这里
数据准备的处理流程和数据集不是耦合的。通常一个数据集定义了如何处理标签,而数据处理流程定义了全部的数据准备步骤的字典。处理流程由一系列操作组成,每个操作以一个字典作为输入,当然也会为下一个变换输出一个字典。
这些操作可以分为 数据载入、预处理和格式化。
下面是一个PWC-Net的处理流程示例:
train_pipeline = [
dict(type='LoadImageFromFile'),
dict(type='LoadAnnotations'),
dict(type='ColorJitter', brightness=0.5, contrast=0.5, saturation=0.5,
hue=0.5),
dict(type='RandomGamma', gamma_range=(0.7, 1.5)),
dict(type='Normalize', mean=[0., 0., 0.], std=[255., 255., 255.], to_rgb=False),
dict(type='GaussianNoise', sigma_range=(0, 0.04), clamp_range=(0., 1.)),
dict(type='RandomFlip', prob=0.5, direction='horizontal'),
dict(type='RandomFlip', prob=0.5, direction='vertical'),
dict(type='RandomAffine',
global_transform=dict(
translates=(0.05, 0.05),
zoom=(1.0, 1.5),
shear=(0.86, 1.16),
rotate=(-10., 10.)
),
relative_transform=)dict(
translates=(0.00375, 0.00375),
zoom=(0.985, 1.015),
shear=(1.0, 1.0),
rotate=(-1.0, 1.0)
),
dict(type='RandomCrop', crop_size=(384, 448)),
dict(type='DefaultFormatBundle'),
dict(
type='Collect',
keys=['imgs', 'flow_gt'],
meta_keys=['img_fields', 'ann_fields', 'filename1', 'filename2',
'ori_filename1', 'ori_filename2', 'filename_flow',
'ori_filename_flow', 'ori_shape', 'img_shape',
'img_norm_cfg']),
]
对于每个操作,我们列出了相关的 (可用的)增加、更新或删除 的字典字段。
数据载入
LoadImageFromFile
-
add: img1, img2, filename1, filename2, img_shape, ori_shape, pad_shape, scale_factor, img_norm_cfg
LoadAnnotations
-
add: flow_gt, filename_flow
预处理
ColorJitter
-
update: img1, img2
RandomGamma
-
update: img1, img2
Normalize
-
update: img1, img2, img_norm_cfg
GaussianNoise
-
update: img1, img2
RandomFlip
-
update: img1, img2, flow_gt
RandomAffine
-
update: img1, img2, flow_gt
RandomCrop
-
update: img1, img2, flow_gt, img_shape
格式化
DefaultFormatBundle
-
update: img1, img2, flow_gt
Collect
-
add: img_meta (the keys of img_meta is specified by
meta_keys
) -
remove: all other keys except for those specified by
keys
扩展和使用自定义的数据处理流程
1.在任意文件(例: myPipeline.py)中写一个新的流程,以字典格式作为输入输出
from mmflow.datasets import PIPELINES
@PIPELINES.register_module()
class MyTransform:
def __call__(self, results):
results['dummy'] = True
return results
2.导入新类(MyTransform)
from .my_pipeline import MyTransform
3.在配置文件中使用它(MyTransform)
train_pipeline = [
dict(type='LoadImageFromFile'),
dict(type='LoadAnnotations'),
dict(type='ColorJitter', brightness=0.5, contrast=0.5, saturation=0.5,
hue=0.5),
dict(type='RandomGamma', gamma_range=(0.7, 1.5)),
dict(type='Normalize', mean=[0., 0., 0.], std=[255., 255., 255.], to_rgb=False),
dict(type='GaussianNoise', sigma_range=(0, 0.04), clamp_range=(0., 1.)),
dict(type='RandomFlip', prob=0.5, direction='horizontal'),
dict(type='RandomFlip', prob=0.5, direction='vertical'),
dict(type='RandomAffine',
global_transform=dict(
translates=(0.05, 0.05),
zoom=(1.0, 1.5),
shear=(0.86, 1.16),
rotate=(-10., 10.)
),
relative_transform=)dict(
translates=(0.00375, 0.00375),
zoom=(0.985, 1.015),
shear=(1.0, 1.0),
rotate=(-1.0, 1.0)
),
dict(type='RandomCrop', crop_size=(384, 448)),
dict(type='MyTransform'),
dict(type='DefaultFormatBundle'),
dict(
type='Collect',
keys=['imgs', 'flow_gt'],
meta_keys=('img_fields', 'ann_fields', 'filename1', 'filename2',
'ori_filename1', 'ori_filename2', 'filename_flow',
'ori_filename_flow', 'ori_shape', 'img_shape',
'img_norm_cfg'))]