MMDetection3D使用学习(mmdet v1.1 rc)

文章目录

  • 前言
  • MMDetection3D介绍及安装使用
    • MMDet3D的安装和依赖
  • 使用MMDet3D预训练模型在点云和图像数据上推理
    • second模型测试
    • pointpillars 模型测试
    • centerpoint模型测试
    • smoke图像3D检测
  • KITTI数据集介绍以及MMDet3D坐标系规范(以下代码都是在v1.0的环境下运行的)
  • 使用MMDetection3D进行训练

前言

本文所观看视频教程的mmdet3d版本为v1.0.0 rc5,而我使用的是v1.1.0 rc3。v1.0.0 rc5的一些实现可以参考我的另一篇博客基于MMDet3D的pointpillars和centernet推理(mmdet3d v1.0 rc)或者官方文档。本文会记录学习中遇到的问题。视频链接

MMDetection3D介绍及安装使用

支持点云、视觉、多模态检测算法,支持室内、室外场景的数据集MMDetection3D使用学习(mmdet v1.1 rc)_第1张图片
MMDetection3D目前有两个稳定的版本(总共有三个版本)

  • 2018-10 发布
  • 2022-02 v1.0 rc (统一的坐标系。重构过坐标系的1.0版本,也是目前master分支对应的版本,这个版本是基于原始架构的)
  • 2022-09 v1.1 rc (新架构,基于MMEngine和全新架构的)
    代码地址: http://github.com/open-mmlab/mmdetection3d/

MMDet3D的安装和依赖

MMDetection3D使用学习(mmdet v1.1 rc)_第2张图片
创建conda环境

conda create -n mmdet3d python=3.8
conda activate mmdet3d
conda install pytorch==1.12.1 torchvision==0.13.1 torchaudio==0.12.1 cudatoolkit=11.3 -c pytorch
或:pip install torch==1.12.1+cu113 torchvision==0.13.1+cu113 torchaudio==0.12.1 --extra-index-url https://download.pytorch.org/whl/cu113

安装mim包管理工具

pip install openmim

安装mmdet3d有两种安装方式
①直接安装

mim install mmdet3d

②从源码安装

git clone https://github.com/open-mmlab/mmdetection3d.git
cd mmdetection3d
mim install -e .

参考:https://mmdetection3d.readthedocs.io/zh_CN/latest/getting_started.html
我安装完成后的环境(mmdet3d v1.1环境):

mmcv       2.0.0      https://github.com/open-mmlab/mmcv
mmdet      3.0.0      https://github.com/open-mmlab/mmdetection
mmdet3d    1.1.0rc3   /home/qsz/mmdetection3d
mmengine   0.7.2      https://github.com/open-mmlab/mmengine

mmdet3d v1.0的环境:

mmcls           0.25.0     https://github.com/open-mmlab/mmclassification
mmcv            1.6.0      https://github.com/open-mmlab/mmcv
mmcv-full       1.6.0      https://github.com/open-mmlab/mmcv
mmdet           2.28.2     https://github.com/open-mmlab/mmdetection
mmdet3d         1.0.0rc6   /home/qsz/my_projects/openmmlab_mmdet3d/mmdetection3d-master
mmengine        0.7.2      https://github.com/open-mmlab/mmengine
mmsegmentation  0.30.0     http://github.com/open-mmlab/mmsegmentation

使用MMDet3D预训练模型在点云和图像数据上推理

second模型测试

参考:https://mmdetection3d.readthedocs.io/zh_CN/latest/demo.html
下载好预训练权重,我直接在mmdetection3d的文件夹下进行推理,运行

python demo/pcd_demo.py demo/data/kitti/000008.bin configs/second/second_hv_secfpn_8xb6-80e_kitti-3d-car.py checkpoints/hv_second_secfpn_6x8_80e_kitti-3d-car_20200620_230238-393f000c.pth

但是报错:

ModuleNotFoundError: No module named 'mmdet3d'

这是因为我把安装mmdet3d的文件夹mmdetection3d移动了位置,环境中就找不到了mmdet3d这个包,对移动后的mmdetection3d重新编译一下:

mim install -e . -i https://pypi.tuna.tsinghua.edu.cn/simple

还有需要注意的就是mmdet3d v1.1版本(main分支)相对于mmdet3d v1.1(master分支)很多文件的名字发生了改动,比如预训练模型、config中的配置文件以及demo中的bin文件。运行demo的时候要注意这些文件的名字。
在mmdet3d v1.0中运行完demo会保存成一个文件夹,而在mmdet3d v2.0中运行完demo会直接显示图像。如下:
MMDetection3D使用学习(mmdet v1.1 rc)_第3张图片
以上是在mmdet3d v1.1 的环境下运行demo跑出来的结果。
同样在mmdet3d v1.0rc下运行如下代码可进行demo测试:

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

和mmdet3d v1,1相比只有文件名字不一样。

pointpillars 模型测试

同样也可以自己写一个demo程序,在mmdet3
d v 1.0的环境下,代码如下:

from mmdet3d.apis import init_model, inference_detector, show_result_meshlab

config_file = r'./configs/pointpillars/hv_pointpillars_secfpn_6x8_160e_kitti-3d-3class.py'
checkpoint_file = r'./checkpoints/hv_pointpillars_secfpn_6x8_160e_kitti-3d-3class.pth'
model = init_model(config_file, checkpoint_file, device='cuda:0')

pcd = './demo/data/kitti/kitti_000008.bin'
result, data = inference_detector(model, pcd)

out_dir = './test_results'
show_result_meshlab(data, result, out_dir, show=True)

结果如下:
MMDetection3D使用学习(mmdet v1.1 rc)_第4张图片
视频教程是在mmdet3d v 1.0的环境下演示的,我在mmdet3d v 1.1环境下运行相似的程序没有跑通,可能是某些环境包的问题。
对于mmdet3d v1.1,不用自己定义的api进行测试的话,可以运行以下命令来对pointpillars进行测试:

python demo/pcd_demo.py demo/data/kitti/000008.bin configs/pointpillars/pointpillars_hv_secfpn_8xb6-160e_kitti-3d-3class.py checkpoints/hv_pointpillars_secfpn_6x8_160e_kitti-3d-3class.pth

测试结果如下:
MMDetection3D使用学习(mmdet v1.1 rc)_第5张图片

centerpoint模型测试

由于centerpoint只有nus数据集的模型,所以需要把bin文件改成nus的bin文件,提前下载好模型,运行以下代码:

python demo/pcd_demo.py /home/qsz/qsz_datasets/nuscenes/samples/LIDAR_TOP/n008-2018-08-01-15-16-36-0400__LIDAR_TOP__1533151603547590.pcd.bin configs/centerpoint/centerpoint_pillar02_second_secfpn_8xb4-cyclic-20e_nus-3d.py checkpoints/centerpoint_02pillar_second_secfpn_circlenms_4x8_cyclic_20e_nus_20220811_031844-191a3822.pth

测试结果:
MMDetection3D使用学习(mmdet v1.1 rc)_第6张图片

smoke图像3D检测

下载好预训练权重以后,在v1.0版本下运行以下代码:(v1.1版本的demo文件夹nus下没有json文件)

python demo/mono_det_demo.py demo/data/nuscenes/n015-2018-07-24-11-22-45+0800__CAM_BACK__1532402927637525.jpg demo/data/nuscenes/n015-2018-07-24-11-22-45+0800__CAM_BACK__1532402927637525_mono3d.coco.json configs/fcos3d/fcos3d_r101_caffe_fpn_gn-head_dcn_2x8_1x_nus-mono3d_finetune.py checkpoints/fcos3d_r101_caffe_fpn_gn-head_dcn_2x8_1x_nus-mono3d_20210715_235813-4bed5239.pth

运行结果如下:

目前在v1.1版本上没有运行成功,可能是因为配置没有写好。回头用到再尝试一下。

KITTI数据集介绍以及MMDet3D坐标系规范(以下代码都是在v1.0的环境下运行的)

import numpy as np

# 读入点云数据(截取FOV90°内的点云)
points = np.fromfile("/home/qsz/qsz_datasets/kitti/training/velodyne_reduced/000008.bin", dtype=np.float32)
# points = np.fromfile("/home/qsz/my_projects/Lane_detection/2022-04-18-3-DONE/LIDAR/001650278870937.bin", dtype=np.int32)
print(points.shape)

pts = points.reshape(-1, 4)
print(pts.shape)

# 绘制BEV
from matplotlib import pyplot as plt
plt.figure(figsize=(12, 8))
plt.scatter(pts[:, 0], pts[:, 1], 0.5)
plt.axis('image')
plt.show()

# 基于Open3D绘制点云数据和标注框、坐标系转换
# 读入点云数据(截取FOV90°内的点云)
pts = np.fromfile("/home/qsz/my_projects/openmmlab_mmdet3d/mmdetection3d-master/demo/data/kitti/kitti_000008.bin", dtype=np.float32).reshape(-1, 4)
# 读入标注,每行的最后7个数字是标注框,为相机坐标系下的高、宽、长、X、Y、Z坐标、转角。
bbxs = np.loadtxt("/home/qsz/qsz_datasets/kitti/training/label_2/000008.txt", max_rows=6, usecols=range(8, 15)).reshape(-1, 7)
print(bbxs)

# 错误示范,坐标系没有转换,相机坐标系的Z轴在激光雷达坐标系中是天上
from mmdet3d.core.visualizer.show_result import show_result
show_result(pts, bbxs[:, [3, 4, 5, 0, 1, 2, 6]], None, '.', '3-show', show=True)

# 坐标系变换,XYZ调换顺序,相机和雷达前后方向27cm偏移
R_velo_to_cam = np.array([[0, -1, 0],
                          [0, 0, -1],
                          [1, 0, 0]])
coors = bbxs[:, 3:6] @ R_velo_to_cam[:, :3] + [0.27, 0, 0]

# MMDet3D的雷达坐标系中,右对应yaw = -90,前对应yaw=0。KITTI中,右对应yaw=0,前对应-90。因此,yaw_in_mmdet3d=-pi/2-yaw_in_kitti
yaw = -1.57 - bbxs[:, 6:7]

# 调用mmdet3d的API实现点云绘图
from mmdet3d.core.visualizer.show_result import show_result
show_result(pts, np.hstack((coors, bbxs[:, [2, 1, 0]], yaw)), None, '.', '3-show', show=True)

MMDET3D提供的可视化工具

python tools/misc/browse_dataset.py  configs/_base_/datasets/kitti-3d-3class.py --task det --output-dir tmp --online

使用MMDetection3D进行训练

本小节主要参考我的上一篇博客基于MMDet3D的pointpillars和centernet推理(mmdet3d v1.0 rc)和官方文档数据预处理、使用已有模型在标准数据集上进行推理和训练。下边做一些补充。
对模型进行测试。

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

!!!写自己训练的config文件并进行训练,config文件如下:

_base_ = [
    'configs/pointpillars/hv_pointpillars_secfpn_6x8_160e_kitti-3d-3class.py'
]

data = dict(
    samples_pergpu=4,
    workers_per_gpu=1,
    persistent_workers=True,
    train=dict(dataset=dict(ann_file='data/kitti/kitti_infos_val.pkl'),)
    # test=dict(
    #     split='testing',
    #     ann_file='data/kitti/kitti_infos_test.pkl',
    # )
)

optimizer = dict(
    type='AdamW', lr=0.0001, betas=(0.95, 0.99), weight_decay=0.01)
lr_config = None
momentum_config = None

runner = dict(max_epochs=5)
checkpoints_config = dict(interval=5)
evaluation = dict(interval=5)
log_config = dict(interval=5)

load_from = './checkpoints/hv_pointpillars_secfpn_6x8_160e_kitti-3d-3class.pth'

使用单个gpu进行训练:

python ./tools/train.py ./qsz_config.py

使用多gpu进行训练,其中3代表gpu数目:

bash ./tools/dist_train.sh ./qsz_config.py 3

你可能感兴趣的:(3d,学习,pytorch)