参考:自定义数据预处理流程 --- MMDetection3D 1.4.0 文档
数据预处理流程的设计
预处理流程中的各项操作主要分为数据加载、预处理、格式化、测试时的数据增强。
接下来将展示一个用于 PointPillars 模型的数据集预处理流程的例子。
python
train_pipeline = [
dict(
type='LoadPointsFromFile',
load_dim=5,
use_dim=5,
backend_args=backend_args),
dict(
type='LoadPointsFromMultiSweeps',
sweeps_num=10,
backend_args=backend_args),
dict(type='LoadAnnotations3D', with_bbox_3d=True, with_label_3d=True),
dict(
type='GlobalRotScaleTrans',
rot_range=[-0.3925, 0.3925],
scale_ratio_range=[0.95, 1.05],
translation_std=[0, 0, 0]),
dict(type='RandomFlip3D', flip_ratio_bev_horizontal=0.5),
dict(type='PointsRangeFilter', point_cloud_range=point_cloud_range),
dict(type='ObjectRangeFilter', point_cloud_range=point_cloud_range),
dict(type='ObjectNameFilter', classes=class_names),
dict(type='PointShuffle'),
dict(type='DefaultFormatBundle3D', class_names=class_names),
dict(type='Collect3D', keys=['points', 'gt_bboxes_3d', 'gt_labels_3d'])
]
test_pipeline = [
dict(
type='LoadPointsFromFile',
load_dim=5,
use_dim=5,
backend_args=backend_args),
dict(
type='LoadPointsFromMultiSweeps',
sweeps_num=10,
backend_args=backend_args),
dict(
type='MultiScaleFlipAug',
img_scale=(1333, 800),
pts_scale_ratio=1.0,
flip=False,
pcd_horizontal_flip=False,
pcd_vertical_flip=False,
transforms=[
dict(
type='GlobalRotScaleTrans',
rot_range=[0, 0],
scale_ratio_range=[1., 1.],
translation_std=[0, 0, 0]),
dict(type='RandomFlip3D'),
dict(
type='PointsRangeFilter', point_cloud_range=point_cloud_range),
dict(
type='DefaultFormatBundle3D',
class_names=class_names,
with_label=False),
dict(type='Collect3D', keys=['points'])
])
]
对于每项操作,我们将列出相关的被添加/更新/移除的字典项。
数据加载
LoadPointsFromFile
- 添加:points
LoadPointsFromMultiSweeps
- 更新:points
LoadAnnotations3D
- 添加:gt_bboxes_3d, gt_labels_3d, gt_bboxes, gt_labels, pts_instance_mask, pts_semantic_mask, bbox3d_fields, pts_mask_fields, pts_seg_fields
预处理
GlobalRotScaleTrans
-
添加:pcd_trans, pcd_rotation, pcd_scale_factor
-
更新:points, *bbox3d_fields
RandomFlip3D
-
添加:flip, pcd_horizontal_flip, pcd_vertical_flip
-
更新:points, *bbox3d_fields
PointsRangeFilter
- 更新:points
ObjectRangeFilter
- 更新:gt_bboxes_3d, gt_labels_3d
ObjectNameFilter
- 更新:gt_bboxes_3d, gt_labels_3d
PointShuffle
- 更新:points
PointsRangeFilter
- 更新:points
格式化
DefaultFormatBundle3D
- 更新:points, gt_bboxes_3d, gt_labels_3d, gt_bboxes, gt_labels
Collect3D
-
添加:img_meta (由
meta_keys
指定的键值构成的 img_meta) -
移除:所有除
keys
指定的键值以外的其他键值
测试时的数据增强
MultiScaleFlipAug
- 更新: scale, pcd_scale_factor, flip, flip_direction, pcd_horizontal_flip, pcd_vertical_flip (与这些指定的参数对应的增强后的数据列表)
扩展并使用自定义数据集预处理方法
-
在任意文件中写入新的数据集预处理方法,如
my_pipeline.py
,该预处理方法的输入和输出均为字典pythonfrom mmdet.datasets import PIPELINES @PIPELINES.register_module() class MyTransform: def __call__(self, results): results['dummy'] = True return results
-
导入新的预处理方法类
pythonfrom .my_pipeline import MyTransform
-
在配置文件中使用该数据集预处理方法
pythontrain_pipeline = [ dict( type='LoadPointsFromFile', load_dim=5, use_dim=5, backend_args=backend_args), dict( type='LoadPointsFromMultiSweeps', sweeps_num=10, backend_args=backend_args), dict(type='LoadAnnotations3D', with_bbox_3d=True, with_label_3d=True), dict( type='GlobalRotScaleTrans', rot_range=[-0.3925, 0.3925], scale_ratio_range=[0.95, 1.05], translation_std=[0, 0, 0]), dict(type='RandomFlip3D', flip_ratio_bev_horizontal=0.5), dict(type='PointsRangeFilter', point_cloud_range=point_cloud_range), dict(type='ObjectRangeFilter', point_cloud_range=point_cloud_range), dict(type='ObjectNameFilter', classes=class_names), dict(type='MyTransform'), dict(type='PointShuffle'), dict(type='DefaultFormatBundle3D', class_names=class_names), dict(type='Collect3D', keys=['points', 'gt_bboxes_3d', 'gt_labels_3d']) ]