文章目录
- 1. Dataset 配置文件解析
- 1. 1 定义全局变量
- 1. 1 数据处理pipeline
- (1) train_pipeline
- (2) test_pipeline
- (3) eval_pipeline
- 1. 2 data 字典的定义
- 2. model 配置文件解析
- 2. 1 体素化voxel_layer
- 2. 2 voxel_encoder
- 2. 3 middle_encoder
- 2. 4 2D 检测网络(backbone + neck + detection head)
- 2.4.1 backone+neck
- 2.4.2 detection head
- 2. 5 train_cfg 和 test_cfg
- 2.5.1 train_cfg
- 2.5.1 test_cfg
本文以Kitti数据集
以及PointPillar
模型的配置文件来举例,详细解析数据集和模型配置相关的内容。
在MMDetection3D(mmdet3d)项目的
configs
目录下提供了不同版本的各类3d模型
的配置文件
,大概有40多种
主流和前沿的3D模型。支持Lidar-based
、Camera-based
、Multi-moda
l (多模态)3D 目标检测
模型以及3D语义分割
模型。模型的配置文件在项目的confgs
文件夹中,根据项目需要找到对应的模型
,比如pointpillars
可以看到mmdet3d帮我们适配了各种版本
的pointpillars模型
。配置文件中包含了:模型结构
、数据处理的pipeline
、训练相关的配置
(优化器、超参数、训练验证的轮数以及指标评估)等。
-
当我们需要训练一个3D模型时,只需要准备好
配置文件
、预训练权重
以及自定义数据集
即可。其中不同模型训练的配置文件
MMDetection3D已经提供了,另外也提供了对应版本的SOTA预训练
权重,可到官网进行下载。 -
配置文件中包含了:
模型结构配置
、数据处理的pipeline
、训练相关的配置
,因此配置文件中它会继承, 通过_base_
变量存储需要继承的文件:模型的配置文件
、dataset的配置文件
、优化器相关的配置文件
、以及runtime的配置
文件(定义日志级别、workdir、resume的模型路径等)
-
另外,如果我们自己需要修改配置文件,只需要
继承官方
提供的配置文件基础上,做一些局部
的改动即可,大部分配置都不需要修改,使用起来非常便利。
- 整个训练和测试的配置文件,包含了:
模型的配置文件
、dataset的配置文件
、优化器相关的配置文件
、以及runtime的配置
文件, 其中模型的配置文件
和dataset的配置文件
是两个最核心
的配置文件,因此接下来会重点介绍这两个配置文件。优化器和runtime的配置比较简单,基本看看就明白。
1. Dataset 配置文件解析
以KITTI数据集
为例进行解析,Dataset的配置文件路径在: configs/_base_/datasets/kitti-3d-3class.py
。它定义了:数据采样db_sampler
,数据处理的pipeline : train_pipeline、test_pipeline、val_pipeline, 以及data(完整的data处理定义); 还有一些全局变量,如:dataset_type、data_root、class_names、point_cloud_range
1. 1 定义全局变量
在kitti-3d-3clas.py
定义了如下几个全局变量
dataset_type
: 因为是kitti数据集,所以默认为KittiDataset
。也可以是其他数据集,比如 LyftDataset,
WaymoDataset,
NuScenesDataset, 也可以是自定义的数据集类型。data_root
:定义数据存放的跟目录,比如data/kitti/
class_names
: 数据的类别名,比如KITTI数据集的类型为:[‘Pedestrian’, ‘Cyclist’, ‘Car’]point_cloud_range
: 点云覆盖的有效范围,用于过滤点云数据。比如KITTI 对应的范围为:[-50, -50, -5, 50, 50, 3]
- input_modality: 设定使用的数据对应的模态信息。对于
pointpillars
,用于lidar点云检测,所以use_lidar=True
input_modality = dict( use_lidar=True, use_camera=False, use_radar=False, use_map=False, use_external=False)
1. 1 数据处理pipeline
当代码解析了数据的类型dataset_type, 就会获取点云路径
、图像路径
和.pkl
格式的标注数据路径,得到了数据的路径和标注之后,对于训练和测试我们需要对点云数据
做一定的处理
,才能送入模型进程训练或推理
,数据的pipeline
就是用来数据处理的,主要包括train_pipeline(用于处理训练数据)和test_pipeline(默认test和val都使用一样的pipeline)以及eval_pipeline(处理数据,用于评估模型效果)
(1) train_pipeline
train_pipeline是用来处理用于训练的点云数据,脚本如下:
train_pipeline = [dict(type='LoadPointsFromFile',coord_type='LIDAR',load_dim=4,use_dim=4,file_client_args=file_client_args),dict(type='LoadAnnotations3D',with_bbox_3d=True,with_label_3d=True,file_client_args=file_client_args),dict(type='ObjectSample', db_sampler=db_sampler),dict(type='ObjectNoise',num_try=100,translation_std=[1.0, 1.0, 0.5],global_rot_range=[0.0, 0.0],rot_range=[-0.78539816, 0.78539816]),dict(type='RandomFlip3D', flip_ratio_bev_horizontal=0.5),dict(type='GlobalRotScaleTrans',rot_range=[-0.78539816, 0.78539816],scale_ratio_range=[0.95, 1.05]),dict(type='PointsRangeFilter', point_cloud_range=point_cloud_range),dict(type='ObjectRangeFilter', point_cloud_range=point_cloud_range),dict(type='PointShuffle'),dict(type='DefaultFormatBundle3D', class_names=class_names),dict(type='Collect3D', keys=['points', 'gt_bboxes_3d', 'gt_labels_3d'])
]
- 可以看到pipeline中定义的第一个数据处理操作,就是从文件中读取点云(LoadPointsFromFile),根据我们定义点云路径,把点云文件中存储的
nx4
的数据读取出来 - 第二个操作是加载3D标注数据,它会把我们处理好(create_data.py)的
标注文件
数据读取出来。 - 然后定义了一个数据增强的操作
ObjectSample
,也就是会把其他场景中的一些物体的点云,迁移到当前场景的点云数据中,做数据增强。 - 紧接着
ObjectNoise
也是一种数据增强操作,对点云数据做一些微小的平移和旋转,增加一些扰动的噪声 - 然后会对点云数据做一些随机的翻转(
RandomFlip3D
),以及旋转、缩放和平移操作GlobalRotScaleTrans
- 紧接着会把我们关注范围以内的点云数据筛选出来(PointsRangeFilter和ObjectRangeFilter),可能点云数据放大、旋转、平移后有些数据就出去了,需要过滤掉。
- 然后,对点云数据随机打乱顺序
- 最后将所需要的数据,包括点云,3D 标注框和标签数据打包在一起(
Collect3D
),形成一个字典,供模型的训练或推理测试。
(2) test_pipeline
测试的pipeline的脚本如下:
test_pipeline = [dict(type='LoadPointsFromFile',coord_type='LIDAR',load_dim=4,use_dim=4,file_client_args=file_client_args),dict(type='MultiScaleFlipAug3D',img_scale=(1333, 800),pts_scale_ratio=1