文章目录

前言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目前有两个稳定的版本(总共有三个版本)

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

MMDet3D的安装和依赖

创建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会直接显示图像。如下: 以上是在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)

结果如下: 视频教程是在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

测试结果如下:

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

测试结果:

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

参考链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: