官方文档:https://mmdetection3d.readthedocs.io/zh_CN/latest/demo.html
项目下载地址:https://github.com/open-mmlab/mmdetection3d
步骤一:首先配置pytorch环境(详见网上教程)
步骤二:如果安装的是CUDA11.0及以上版本,则可以直接通过以下命令进行MMDetection3D 的安装,否则就要使用方法二:
pip install openmim
mim install mmcv-full
mim install mmdet
mim install mmsegmentation
git clone https://github.com/open-mmlab/mmdetection3d.git
cd mmdetection3d
pip install -e .
步骤 0. 通过MIM 安装 MMCV.
步骤 1. 安装 MMDetection.
pip install mmdet
同时,如果你想修改这部分的代码,也可以通过以下命令从源码编译 MMDetection:
git clone https://github.com/open-mmlab/mmdetection.git
cd mmdetection
git checkout v2.24.0 # switch to v2.24.0 branch
pip install -r requirements/build.txt
pip install -v -e . # or "python setup.py develop"
步骤 2. 安装 MMSegmentation.
pip install mmsegmentation
同时,如果你想修改这部分的代码,也可以通过以下命令从源码编译 MMSegmentation:
git clone https://github.com/open-mmlab/mmsegmentation.git
cd mmsegmentation
git checkout v0.20.0 # switch to v0.20.0 branch
pip install -e . # or "python setup.py develop"
步骤 3. 克隆 MMDetection3D 代码仓库.
git clone https://github.com/open-mmlab/mmdetection3d.git
cd mmdetection3d
步骤 4. 安装依赖包和 MMDetection3D.
pip install -v -e . # or "python setup.py develop"
有部分注意事项详见官方文档。
我们提供了一些样例脚本去测试单个样本,预训练的模型可以从模型库中下载. 运行如下命令可以去测试点云场景下一个单模态的 3D 检测算法。
python demo/pcd_demo.py ${PCD_FILE} ${CONFIG_FILE} ${CHECKPOINT_FILE} [--device ${GPU_ID}] [--score-thr ${SCORE_THR}] [--out-dir ${OUT_DIR}]
例:
python demo/pcd_demo.py demo/data/kitti/kitti_000008.bin configs/second/hv_second_secfpn_6x8_80e_kitti-3d-car.py checkpoints/hv_second_secfpn_6x8_80e_kitti-3d-car_20200620_230238-393f000c.pth
注意:模型需要放到主目录的checkpoints文件夹中。
测试结束后会在demo文件夹下边生成一个kitti_000008文件夹,结构如下:
至此,你的MMdetection3D环境便安装成功了。
我主要对KITTI数据集以及NuScenes数据集进行了预处理。下边介绍以下这两种数据集的预处理方法。
可以在这里下载 KITTI 3D 检测数据并解压缩所有 zip 文件。此外,您可以在这里下载道路平面信息,其在训练过程中作为一个可选项,用来提高模型的性能。道路平面信息由 AVOD 生成,你可以在这里查看更多细节。
可以把数据集放到工程下的数据集文件夹,也可以把数据集放到工程外的文件夹中,但是需要使用软连接把数据集根目录链接到 $MMDETECTION3D/data
。文件夹的结构应该为:
mmdetection3d
├── mmdet3d
├── tools
├── configs
├── data
│ ├── kitti
│ │ ├── ImageSets
│ │ ├── testing
│ │ │ ├── calib
│ │ │ ├── image_2`
│ │ │ ├── velodyne
│ │ ├── training
│ │ │ ├── calib
│ │ │ ├── image_2
│ │ │ ├── label_2
│ │ │ ├── velodyne
│ │ │ ├── planes (optional)
为了创建 KITTI 点云数据,首先需要加载原始的点云数据并生成相关的包含目标标签和标注框的数据标注文件,同时还需要为 KITTI 数据集生成每个单独的训练目标的点云数据,并将其存储在 data/kitti/kitti_gt_database
的 .bin
格式的文件中,此外,需要为训练数据或者验证数据生成 .pkl
格式的包含数据信息的文件。随后,通过运行下面的命令来创建最终的 KITTI 数据:
mkdir ./data/kitti/ && mkdir ./data/kitti/ImageSets
# Download data split
wget -c https://raw.githubusercontent.com/traveller59/second.pytorch/master/second/data/ImageSets/test.txt --no-check-certificate --content-disposition -O ./data/kitti/ImageSets/test.txt
wget -c https://raw.githubusercontent.com/traveller59/second.pytorch/master/second/data/ImageSets/train.txt --no-check-certificate --content-disposition -O ./data/kitti/ImageSets/train.txt
wget -c https://raw.githubusercontent.com/traveller59/second.pytorch/master/second/data/ImageSets/val.txt --no-check-certificate --content-disposition -O ./data/kitti/ImageSets/val.txt
wget -c https://raw.githubusercontent.com/traveller59/second.pytorch/master/second/data/ImageSets/trainval.txt --no-check-certificate --content-disposition -O ./data/kitti/ImageSets/trainval.txt
python tools/create_data.py kitti --root-path ./data/kitti --out-dir ./data/kitti --extra-tag kitti --with-plane
需要注意的是,如果您的本地磁盘没有充足的存储空间来存储转换后的数据,您可以通过改变 out-dir
来指定其他任意的存储路径。如果您没有准备 planes
数据,您需要移除 --with-plane
标志。
处理后的文件夹结构应该如下:
kitti
├── ImageSets
│ ├── test.txt
│ ├── train.txt
│ ├── trainval.txt
│ ├── val.txt
├── testing
│ ├── calib
│ ├── image_2
│ ├── velodyne
│ ├── velodyne_reduced
├── training
│ ├── calib
│ ├── image_2
│ ├── label_2
│ ├── velodyne
│ ├── velodyne_reduced
│ ├── planes (optional)
├── kitti_gt_database
│ ├── xxxxx.bin
├── kitti_infos_train.pkl
├── kitti_infos_val.pkl
├── kitti_dbinfos_train.pkl
├── kitti_infos_test.pkl
├── kitti_infos_trainval.pkl
├── kitti_infos_train_mono3d.coco.json
├── kitti_infos_trainval_mono3d.coco.json
├── kitti_infos_test_mono3d.coco.json
├── kitti_infos_val_mono3d.coco.json
您可以在这里下载 nuScenes 3D 检测数据并解压缩所有 zip 文件。
像准备数据集的一般方法一样,建议将数据集根目录链接到 $MMDETECTION3D/data
。
在我们处理之前,文件夹结构应按如下方式组织。
mmdetection3d
├── mmdet3d
├── tools
├── configs
├── data
│ ├── nuscenes
│ │ ├── maps
│ │ ├── samples
│ │ ├── sweeps
│ │ ├── v1.0-test
| | ├── v1.0-trainval
注意:如果使用的是v1.0-mini,则文件夹结构应按如下方式组织,并且需要把代码create_data.py
中214行的v1.0
改成v1.0-mini
。
mmdetection3d
├── mmdet3d
├── tools
├── configs
├── data
│ ├── nuscenes
│ │ ├── maps
│ │ ├── samples
│ │ ├── sweeps
│ │ ├── v1.0-mini
我们通常需要通过特定样式来使用 .pkl 或 .json 文件组织有用的数据信息,例如用于组织图像及其标注的 coco 样式。 要为 nuScenes 准备这些文件,请运行以下命令:
python tools/create_data.py nuscenes --root-path ./data/nuscenes --out-dir ./data/nuscenes --extra-tag nuscenes
处理之后的文件夹结构应该如下:
mmdetection3d
├── mmdet3d
├── tools
├── configs
├── data
│ ├── nuscenes
│ │ ├── maps
│ │ ├── samples
│ │ ├── sweeps
│ │ ├── v1.0-test
| | ├── v1.0-trainval
│ │ ├── nuscenes_database
│ │ ├── nuscenes_infos_train.pkl
│ │ ├── nuscenes_infos_trainval.pkl
│ │ ├── nuscenes_infos_val.pkl
│ │ ├── nuscenes_infos_test.pkl
│ │ ├── nuscenes_dbinfos_train.pkl
│ │ ├── nuscenes_infos_train_mono3d.coco.json
│ │ ├── nuscenes_infos_trainval_mono3d.coco.json
│ │ ├── nuscenes_infos_val_mono3d.coco.json
│ │ ├── nuscenes_infos_test_mono3d.coco.json
如果采用的是v1.0-mini数据集,则处理过后的文件夹结构应该如下:
mmdetection3d
├── mmdet3d
├── tools
├── configs
├── data
│ ├── nuscenes
│ │ ├── maps
│ │ ├── samples
│ │ ├── sweeps
│ │ ├── v1.0-mini
│ │ ├── nuscenes_database
│ │ ├── nuscenes_infos_train.pkl
│ │ ├── nuscenes_infos_val.pkl
│ │ ├── nuscenes_dbinfos_train.pkl
│ │ ├── nuscenes_infos_train_mono3d.coco.json
│ │ ├── nuscenes_infos_val_mono3d.coco.json
对nuScenes 指标评估的 PointPillars 的示例如下:
bash ./tools/dist_test.sh configs/pointpillars/hv_pointpillars_fpn_sbn-all_4x8_2x_nus-3d.py checkpoints/hv_pointpillars_fpn_sbn-all_4x8_2x_nus-3d_20200620_230405-2fa62f3d.pth 1 --eval bbox
需要在模型库下载自己需要的模型并手动更改名字。使用以下命令可以保存测试结果。
bash ./tools/dist_test.sh configs/pointpillars/hv_pointpillars_fpn_sbn-all_4x8_2x_nus-3d.py checkpoints/hv_pointpillars_fpn_sbn-all_4x8_2x_nus-3d_20200620_230405-2fa62f3d.pth 1 --eval bbox --out work_dirs/pp-nus/results_eval.pkl --format-only --eval-options 'jsonfile_prefix=work_dirs/pp-nus/results_eval'
MMDetection3D 分别用 MMDistributedDataParallel
and MMDataParallel
实现了分布式训练和非分布式训练。
所有的输出(日志文件和模型权重文件)都会被保存到工作目录下,通过配置文件里的 work_dir
指定。
默认我们每过一个周期都在验证数据集上评测模型,你可以通过在训练配置里添加间隔参数来改变评测的时间间隔:
evaluation = dict(interval=12) # 每12个周期评估一次模型
重要:配置文件中的默认学习率对应8块显卡,配置文件名里有具体的批量大小,比如’2x8’表示一共8块显卡,每块显卡2个样本。 根据 Linear Scaling Rule,当你使用不同数量的显卡或每块显卡有不同数量的图像时,需要依批量大小按比例调整学习率。如果用4块显卡、每块显卡2幅图像时学习率为0.01,那么用16块显卡、每块显卡4幅图像时学习率应设为0.08。然而,由于大多数模型使用 ADAM 而不是 SGD 进行优化,上述规则可能并不适用,用户需要自己调整学习率。
在以上的步骤中已经准备了kitti数据集,在这里就不再讲述。
接着,我们将使用提供的配置文件训练 PointPillars。当你使用不同的 GPU 设置进行训练时,你基本上可以按照这个教程的示例脚本进行训练。假设我们在一台具有 8 块 GPU 的机器上进行分布式训练:
./tools/dist_train.sh configs/pointpillars/hv_pointpillars_secfpn_6x8_160e_kitti-3d-3class.py 8
或者使用如下命令开始训练:
python tools/train.py configs/pointpillars/hv_pointpillars_secfpn_6x8_160e_kitti-3d-3class.py
注意到,配置文件名字中的 6x8
是指训练时是用了 8 块 GPU,每块 GPU 上有 6 个样本。如果你有不同的自定义的设置,那么有时你可能需要调整学习率。可以参考这篇文献。
使用自己的电脑训练的时候,把gpu数量从8改成了1,然后运行上述命令,结果显存爆了。
我的解决方式是通过修改batch_size大小
,但是我并没有在训练参数和配置文件中找到batch_size
的设置,因此我在github上提交了issues,原来batch_size
的参数是叫samples_per_gpu
,它的默认值是6
,我改成2即可正确运行了:
修改:`configs/_base_/datasets/kitti-3d-3class.py`第113行的`sample_per_gpu=2`,大家根据自己显卡的显存进行修改
在以上的步骤中已经准备了kitti数据集,在这里就不再讲述。
接着,我们将使用提供的配置文件训练 PointPillars。当你使用不同的 GPU 设置进行训练时,你基本上可以按照这个教程的示例脚本进行训练。假设我们在一台具有 8 块 GPU 的机器上进行分布式训练:
./tools/dist_train.sh configs/pointpillars/hv_pointpillars_fpn_sbn-all_4x8_2x_nus-3d.py 8
或者使用如下命令开始训练:
python tools/train.py configs/pointpillars/hv_pointpillars_fpn_sbn-all_4x8_2x_nus-3d.py
注意到,配置文件名字中的 6x8
是指训练时是用了 8 块 GPU,每块 GPU 上有 6 个样本。如果你有不同的自定义的设置,那么有时你可能需要调整学习率。可以参考这篇文献。
但是对于NuScenes数据集,我做了如下修改:
修改:`configs/_base_/datasets/nus-3d.py`第107行的`sample_per_gpu=1`,
修改:`configs/_base_/datasets/nus-mono3d.py`第68行的`sample_per_gpu=1`,
已经把每次训练的样本数修改成为了1,但是显存还是会爆。
可视化代码:
python tools/test.py configs/pointpillars/hv_pointpillars_fpn_sbn-all_4x8_2x_nus-3d.py checkpoints/hv_pointpillars_fpn_sbn-all_4x8_2x_nus-3d_20200620_230405-2fa62f3d.pth --eval ‘mAP’ --eval-options ‘show=True’ ‘out_dir=${SHOW_DIR}’
利用mmdet3d实现centernet。首先下载centerpoint模型,然后运行命令:
python tools/test.py configs/centerpoint/centerpoint_01voxel_second_secfpn_circlenms_4x8_cyclic_20e_nus.py checkpoints/centerpoint_01voxel_second_secfpn_circlenms_4x8_cyclic_20e_nus_20220810_030004-9061688e.pth --eval 'mAP' --eval-options 'show=True' 'out_dir=./test_results/centerpoint_test_result'