OpenPCDet

在PCDet中搭建3D目标检测框架只需要写config文件将所需模块定义清楚,然后PCDet将自动根据模块间的拓扑顺序组合为3D目标检测框架,来进行训练和测试

STRUCTURE

数据处理流程

Dataset Preparation 以KITTI数据集为例:

更改数据集配置文件: tools/cfgs/dataset_configs/kitti_dataset.yaml

生成the data infos:

1
python -m pcdet.datasets.kitti.kitti_dataset create_kitti_infos tools/cfgs/dataset_configs/kitti_dataset.yaml

Pretrained Models

Training & Testing

使用预训练模型测试和使用多GPUs测试

  • 要测试特定训练设置的所有已保存检查点并在 Tensorboard 上绘制性能曲线,请添加参数:--eval_all

    1
    python test.py --cfg_file ${CONFIG_FILE} --batch_size ${BATCH_SIZE} --eval_all
  • 要使用多个 GPU 进行测试,要执行以下操作:

1
2
3
4
5
6
7
sh scripts/dist_test.sh ${NUM_GPUS} \
--cfg_file ${CONFIG_FILE} --batch_size ${BATCH_SIZE}

# or

sh scripts/slurm_test_mgpu.sh ${PARTITION} ${NUM_GPUS} \
--cfg_file ${CONFIG_FILE} --batch_size ${BATCH_SIZE}

使用多GPUs训练

1
2
3
4
5
sh scripts/dist_train.sh ${NUM_GPUS} --cfg_file ${CONFIG_FILE}

# or

sh scripts/slurm_train.sh ${PARTITION} ${JOB_NAME} ${NUM_GPUS} --cfg_file ${CONFIG_FILE}

以VOD数据集为例子PP-Radar复现

按照openPCDet框架中数据集中Kitti的格式,生成XXXXinfo.pkl 文件

需要更改两个cfg文件:一个是数据集的cfg文件,一个是模型的cfg文件【采用的是PointPillar Config】。

在PillarVFE需要进行更改:原因是因为在点云中没有RCS和Doppler特征。

在tensorboard进行查看:

可视化

结果:

result

需要注意的是evaluate方法的修改~

MMDet3D

work flow

workflow

train

stream: batch → backbone → neck → head [cls + reg]→ gt bbox encoder→ loss

backbone

路径:mmdetection3d/mmdet3d/models/backbones

对backbone进行扩展,可以继承上述网络,然后通过注册器机制注册使用。通过 MMCV 中的注册器机制,你可以通过 dict 形式的配置来实例化任何已经注册的类

LEARN ABOUT CONFIGS

路径:mmdetection3d/configs/_base_

把这个路径下每个文件夹的内容选取组件进行组合,一共有4个组件:数据集 (dataset),模型 (model),训练策略 (schedule:Optimization config) 和运行时的默认设置 (default runtime:Hook config)

configs文件的命名风格:

1
2
3
4
5
6
7
8
9
10
11
{model}_[model setting]_{backbone}_{neck}_[norm setting]_[misc]_[gpu x batch_per_gpu]_{schedule}_{dataset}
*{xxx} 是被要求填写的字段而 [yyy] 是可选的
{model}:模型种类,例如 hv_pointpillars (Hard Voxelization PointPillars)、VoteNet 等。
[model setting]:某些模型的特殊设定。
{backbone}: 主干网络种类例如 regnet-400mf、regnet-1.6gf 等。
{neck}:模型颈部的种类包括 fpn、secfpn 等。
[norm_setting]:如无特殊声明,默认使用 bn (Batch Normalization),其他类型可以有 gn (Group Normalization)、sbn (Synchronized Batch Normalization) 等。 gn-head/gn-neck 表示 GN 仅应用于网络的头部或颈部,而 gn-all 表示 GN 用于整个模型,例如主干网络、颈部和头部。
[misc]:模型中各式各样的设置/插件,例如 strong-aug 意味着在训练过程中使用更强的数据增广策略。
[batch_per_gpu x gpu]:每个 GPU 的样本数和 GPU 数量,默认使用 4x8。
{schedule}:训练方案,选项是 1x、2x、20e 等。 1x 和 2x 分别代表训练 12 和 24 轮。 20e 在级联模型中使用,表示训练 20 轮。 对于 1x/2x,初始学习率在第 8/16 和第 11/22 轮衰减 10 倍;对于 20e,初始学习率在第 16 和第 19 轮衰减 10 倍。
{dataset}:数据集,例如 nus-3d、kitti-3d、lyft-3d、scannet-3d、sunrgbd-3d 等。 当某一数据集存在多种设定时,我们也标记下所使用的类别数量,例如 kitti-3d-3class 和 kitti-3d-car 分别意味着在 KITTI 的所有三类上和单独车这一类上进行训练。

DATASET PREPARATION

离线转换的方法将其转换为 KITTI数据集的格式,因此只需要在转换后修改配置文件中的数据标注文件的路径和标注数据所包含类别;对于那些与现有数据格式相似的新数据集,如 Lyft 数据集和 nuScenes 数据集,我们建议直接调用数据转换器和现有的数据集类别信息,在这个过程中,可以考虑通过继承的方式来减少实施数据转换的负担。

当现有数据集与新数据集存在差异时,可以通过定义一个从现有数据集类继承而来的新数据集类来处理具体的差异;最后,用户需要进一步修改配置文件来调用新的数据集。【waymo例子】

路径:mmdetection3d/mmdet3d/datasets

自定义数据集:将标注信息重新组织成一个 pickle 文件格式的字典列表 标注框的标注信息会被存储在 annotation.pkl 文件中 在 mmdet3d/datasets/my_dataset.py 中创建一个新的数据集类来进行数据的加载。

统合数据集或者修改数据集的分布,并应用到模型的训练中。

  • RepeatDataset:简单地重复整个数据集
  • ClassBalancedDataset:以类别平衡的方式重复数据集
  • ConcatDataset:拼接多个数据集

CUSTOMIZE DATA PIPELINES

数据加载、预处理、格式化、测试时的数据增强

CUSTOMIZE Model

通常把模型的各个组成成分分成6种类型:

  • 编码器(encoder):包括 voxel layer、voxel encoder 和 middle encoder 等进入 backbone 前所使用的基于 voxel 的方法,如 HardVFE 和 PointPillarsScatter。
  • 骨干网络(backbone):通常采用 FCN 网络来提取特征图,如 ResNet 和 SECOND。
  • 颈部网络(neck):位于 backbones 和 heads 之间的组成模块,如 FPN 和 SECONDFPN。
  • 检测头(head):用于特定任务的组成模块,如检测框的预测和掩码的预测。
  • RoI 提取器(RoI extractor):用于从特征图中提取 RoI 特征的组成模块,如 H3DRoIHead 和 PartAggregationROIHead。
  • 损失函数(loss):heads 中用于计算损失函数的组成模块,如 FocalLoss、L1Loss 和 GHMLoss。

针对每个组成成分进行添加和修改。

INFERENCE