当前位置:   article > 正文

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

mmdet3d

前言

本文所观看视频教程的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
  • 1
  • 2
  • 3
  • 4

安装mim包管理工具

pip install openmim
  • 1

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

mim install mmdet3d
  • 1

②从源码安装

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

参考: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
  • 1
  • 2
  • 3
  • 4

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

使用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
  • 1

但是报错:

ModuleNotFoundError: No module named 'mmdet3d'

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

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

还有需要注意的就是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
  • 1

和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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

结果如下:
请添加图片描述
视频教程是在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
  • 1

测试结果如下:
请添加图片描述

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
  • 1

测试结果:
请添加图片描述

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
  • 1

运行结果如下:
请添加图片描述
目前在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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

MMDET3D提供的可视化工具

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

使用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
  • 1

!!!写自己训练的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'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

使用单个gpu进行训练:

python ./tools/train.py ./qsz_config.py
  • 1

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

bash ./tools/dist_train.sh ./qsz_config.py 3
  • 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/364943
推荐阅读
相关标签
  

闽ICP备14008679号