赞
踩
本文所观看视频教程的mmdet3d版本为v1.0.0 rc5,而我使用的是v1.1.0 rc3。v1.0.0 rc5的一些实现可以参考我的另一篇博客基于MMDet3D的pointpillars和centernet推理(mmdet3d v1.0 rc)或者官方文档。本文会记录学习中遇到的问题。视频链接
支持点云、视觉、多模态检测算法,支持室内、室外场景的数据集
MMDetection3D目前有两个稳定的版本(总共有三个版本)
创建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
参考: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相比只有文件名字不一样。
同样也可以自己写一个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只有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
测试结果:
下载好预训练权重以后,在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版本上没有运行成功,可能是因为配置没有写好。回头用到再尝试一下。
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
本小节主要参考我的上一篇博客基于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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。