MMDetection3d的实用工具脚本

简介: MMDetection3d的实用工具脚本

1. 日志分析


1.1 曲线绘制

  • 绘制某次运行的损失loss
python tools/analysis_tools/analyze_logs.py plot_curve work_dirs/3dssd_4x4_kitti-3d-car/20221013_094855.log.json --keys loss --legend 3dssd  --mode train --interval 1


输出:

image.png


  • 绘制某次运行的学习率lr,并且保存图片为pdf格式
python tools/analysis_tools/analyze_logs.py plot_curve work_dirs/3dssd_4x4_kitti-3d-car/20221013_094855.log.json --keys lr --legend 3dssd  --mode train --interval 1 --out lr.pdf


保存的pdf文件:

image.png

  • 同一张图像绘制两个模型运行时的损失loss,并且保存图片为pdf格式
python tools/analysis_tools/analyze_logs.py plot_curve work_dirs/3dssd_4x4_kitti-3d-car/20221013_094855.log.json work_dirs/hv_pointpillars_secfpn_6x8_160e_kitti-3d-3class/20221012_114205.log.json --keys loss --legend 3dssd pointpillars  --mode train --interval 1 --out lr.pdf


保存的pdf文件:

image.png


在model=val也就是在验证模式下,log会输出一些精度信息,类似于:"KITTI/Car_3D_AP11_easy_strict": 26.5527,"KITTI/Car_BEV_AP11_easy_strict": 69.40167,"KITTI/Car_2D_AP11_easy_strict": 69.93827。这些信息的keys正常来说应该就是KITTI/Car_3D_AP11_easy_strict,但是在代码中是无法正常读取的。也就说,只能读取train中包含的keys,如下所示:

image.png


除了以上的keys之外的信息是没有办法绘制图像的,不过既然有了json文件,如果想要对val的精度信息绘制曲线,也可以自行编码实现。


1.2 平均训练速度绘制

python tools/analysis_tools/analyze_logs.py cal_train_time work_dirs/3dssd_4x4_kitti-3d-car/20221013_094855.log.json


结果输出:


-----Analyze train time of work_dirs/3dssd_4x4_kitti-3d-car/20221013_094855.log.json-----
slowest epoch 11, average time is 0.2238
fastest epoch 72, average time is 0.1832
time std over epochs is 0.0049
average iter time: 0.1873 s/iter


2. 可视化


2.1 结果可视化

  • 观察模型预测结果,同时获取评测结果
python tools/test.py ${CONFIG_FILE} ${CKPT_PATH} --eval 'mAP' --eval-options 'show=True' 'out_dir=${SHOW_DIR}'


ps:

1)3D 单模态检测任务中的 ***_points.obj 和 ***_pred.obj 将会被保存在 ${SHOW_DIR} 中

2)多模态检测任务中的 ***_points.obj,***_pred.obj,***_gt.obj,***_img.png 和 ***_pred.png 将会被保存在 ${SHOW_DIR} 中


当您在没有 GUI 的远程服务器上运行测试的时候,无法进行在线可视化,您可以设定 show=False。对于离线可视化可以选择利用Open3D来可视化结果,但是远程服务器一般无法使用。所以可以选择将结果保存到本地,然后使用3D 可视化软件,例如 MeshLab 来打开这些在 ${SHOW_DIR} 目录下的文件,从而查看 3D 检测输出。具体来说,打开 ***_points.obj 查看输入点云,打开 ***_pred.obj 查看预测的 3D 边界框。


2.2 数据集可视化

  • 浏览KITTI数据集

可以使用 tools/misc/browse_dataset.py 来在线显示载入的数据和真值标签,并且保存进磁盘。为了浏览 KITTI 数据集,您可以运行下面的指令:


python tools/misc/browse_dataset.py configs/base/datasets/kitti-3d-3class.py --task det --output-dir ${OUTPUT_DIR} --online


ps:如果没有显示器,直接移除 --online 标志,从而仅仅保存可视化结果并且进行离线浏览


测试样例(以下样例均来自000003.png):

image.png


  • 浏览数据增强后的KITTI数据集

为了验证数据的一致性和数据增强的效果,您还可以使用以下命令添加 --aug 标志来可视化数据增强后的数据

python tools/misc/browse_dataset.py configs/base/datasets/kitti-3d-3class.py --task det --aug --output-dir ${OUTPUT_DIR} --online


测试样例:

image.png


  • 浏览支持多模态的KITTI数据集

显示 2D 图像以及投影的 3D 边界框,则需要找到支持多模态数据加载的配置文件,然后将 --task 参数更改为 multi_modality-det

python tools/misc/browse_dataset.py configs/mvxnet/dv_mvx-fpn_second_secfpn_adamw_2x8_80e_kitti-3d-3class.py --task multi_modality-det --output-dir ${OUTPUT_DIR} --online


测试样例:

image.png



不仅仅可以浏览KITTI数据集,也可以简单的使用不同的配置文件来浏览不同的数据集:


  • 在 3D 语义分割任务中可视化 ScanNet 数据集
python tools/misc/browse_dataset.py configs/_base_/datasets/scannet_seg-3d-20class.py --task seg --output-dir ${OUTPUT_DIR} --online


  • 在单目 3D 检测任务中浏览 nuScenes 数据集
python tools/misc/browse_dataset.py configs/_base_/datasets/nus-mono3d.py --task mono-det --output-dir ${OUTPUT_DIR} --online


2.3 单点云结果推理

在mmdet3d开源算法库中,其实还提供了一些API的接口以供我们使用。对于KITTI数据集的单个bin样本,可以使用 demo/ pcd_demo.py 脚本来测试。配置文件可以自行选择,预训练模型可以从模型库中下载,运行如下命令可以去测试点云场景下一个单模态的 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 \
    --out-dir demo/data/single_modelity


同样的,在输出的目录下,就会出现单个点云场景***_points.obj 和 ***_pred.obj文件。这两个文件可以直接通过一些3D软件来查看。


2.4 点云api接口处理

这里有一个例子去说明如何构建模型以及测试给出的点云:


from mmdet3d.apis import init_model, inference_detector
config_file = '../configs/pointpillars/hv_pointpillars_secfpn_6x8_160e_kitti-3d-3class.py'
checkpoint_file = '../checkpoints/pointpillars/hv_pointpillars_secfpn_6x8_160e_kitti-3d-3class_20220301_150306-37dc2420.pth'
# 从配置文件和预训练的模型文件中构建模型
model = init_model(config_file, checkpoint_file, device='cuda:1')
# 测试单个文件并可视化结果
point_cloud = '../data/kitti/training/velodyne/000100.bin'
result, data = inference_detector(model, point_cloud)
# 可视化结果并且将结果保存到 'results' 文件夹
model.show_results(data, result, out_dir='result_dirs')


同样的,在输出的目录下,就会出现单个点云场景***_points.obj 和 ***_pred.obj文件。这两个文件可以直接通过一些3D软件来查看。


3. 模型复杂度


mmdet3d中提供了 tools/analysis_tools/get_flops.py 脚本来计算一个模型的计算量 (FLOPS) 和参数量 (params),具体是通过 mmcv.cnn.get_model_complexity_info() 这个函数来计算得到的。


  • 测试PointPillars模型
python tools/analysis_tools/get_flops.py configs/pointpillars/hv_pointpillars_secfpn_6x8_160e_kitti-3d-3class.py


输出:


==============================
Input shape: (40000, 4)
Flops: 34.33 GFLOPs
Params: 4.83 M
==============================


  • 测试3D-SSD模型
python tools/analysis_tools/get_flops.py configs/3dssd/3dssd_4x4_kitti-3d-car.py


输出:


==============================
Input shape: (40000, 4)
Flops: 16.03 GFLOPs
Params: 2.51 M
==============================


ps:计算量 (FLOPs) 和输入形状有关,但是参数量 (params) 则和输入形状无关。默认的输入形状为 (1, 40000, 4),而且现在脚本现在仅仅支持单模态输入(点云或者图片)的单阶段模型的计算量 (FLOPs) 计算。暂时不支持两阶段和多模态模型的计算,比如sassd、mvxnet这些模型的计算量都无法计算得到。


4. 模型转换


4.1 发布模型

tools/model_converters/publish_model.py 帮助用户准备他们用于发布的模型。在上传一个模型到云服务器 (AWS) 之前,您需要做以下几步:


将模型权重转换为 CPU 张量

删除记录优化器状态 (optimizer states) 的相关信息

计算检查点 (checkpoint)文件的哈希编码 (hash id) 并且把哈希编码加到文件名里


测试样例:

python tools/model_converters/publish_model.py work_dirs/3dssd_4x4_kitti-3d-car/epoch_1.pth 3dssd_kitti_1epoch_20221015.pth


最终的输出文件名将会是 3dssd_kitti_1epoch_20221015-b4ec4689.pth。其中b4ec4689就是哈希编码,作为这个权重的唯一ID。


5. 数据集转换


对于自动驾驶场景下标注信息,一般比较复杂,而其中是包含了2d的边界框信息的。那么,其实可以将这些2d信息转化为coco的标注格式,就可以使用一些经典的目标检测网络来训练自动驾驶的数据集,比如KITTI,nuscense,Waymo等。


  • 转换 nuImages 数据集为 COCO 格式
python -u tools/data_converter/nuimage_converter.py --data-root ${DATA_ROOT} --version ${VERSIONS} 
        --out-dir ${OUT_DIR} --nproc ${NUM_WORKERS} --extra-tag ${TAG}


6. 其他内容


6.1 配置文件打印

测试样例:

python tools/misc/print_config.py configs/3dssd/3dssd_4x4_kitti-3d-car.py


输出:


Config:
model = dict(
    type='SSD3DNet',
    backbone=dict(
        type='PointNet2SAMSG',
        in_channels=4,
        num_points=(4096, 512, (256, 256)),
        radii=((0.2, 0.4, 0.8), (0.4, 0.8, 1.6), (1.6, 3.2, 4.8)),
        num_samples=((32, 32, 64), (32, 32, 64), (32, 32, 32)),
        sa_channels=(((16, 16, 32), (16, 16, 32), (32, 32, 64)),
                     ((64, 64, 128), (64, 64, 128), (64, 96, 128)),
                     ((128, 128, 256), (128, 192, 256), (128, 256, 256))),
        aggregation_channels=(64, 128, 256),
        fps_mods=('D-FPS', 'FS', ('F-FPS', 'D-FPS')),
        fps_sample_range_lists=(-1, -1, (512, -1)),
        norm_cfg=dict(type='BN2d', eps=0.001, momentum=0.1),
        sa_cfg=dict(
            type='PointSAModuleMSG',
            pool_mod='max',
            use_xyz=True,
            normalize_xyz=False)),
    ......
checkpoint_config = dict(interval=1)
log_config = dict(
    interval=30,
    hooks=[dict(type='TextLoggerHook'),
           dict(type='TensorboardLoggerHook')])
......
optimizer = dict(type='AdamW', lr=0.002, weight_decay=0)
optimizer_config = dict(grad_clip=dict(max_norm=35, norm_type=2))
lr_config = dict(policy='step', warmup=None, step=[45, 60])
runner = dict(type='EpochBasedRunner', max_epochs=80)


参考资料:


https://mmdetection3d.readthedocs.io/zh_CN/latest/useful_tools.html


目录
相关文章
|
机器学习/深度学习 算法 计算机视觉
3D目标检测框架 MMDetection3D环境搭建 docker篇
本文介绍如何搭建3D目标检测框架,使用docker快速搭建MMDetection3D的开发环境,实现视觉3D目标检测、点云3D目标检测、多模态3D目标检测等等。
1367 0
|
存储 机器学习/深度学习 算法
MMDetection3d对KITT数据集的训练与评估介绍
MMDetection3d对KITT数据集的训练与评估介绍
2628 0
MMDetection3d对KITT数据集的训练与评估介绍
|
Python
MMDetection系列 | 3. MMDetection自定义模型训练
MMDetection系列 | 3. MMDetection自定义模型训练
1115 0
MMDetection系列 | 3. MMDetection自定义模型训练
|
存储 数据采集 传感器
一文多图搞懂KITTI数据集下载及解析
一文多图搞懂KITTI数据集下载及解析
14808 3
一文多图搞懂KITTI数据集下载及解析
|
数据采集 机器学习/深度学习 编解码
MMdetection框架速成系列 第02部分:整体算法流程+模型搭建流程+detection训练与测试核心组件+训练部分与测试部分的核心算法
众所周知,目标检测算法比较复杂,细节比较多,难以复现,而我们推出的 MMDetection 开源框架则希望解决上述问题。目前 MMdetection 已经复现了大部分主流和前沿模型,例如 Faster R-CNN 系列、Mask R-CNN 系列、YOLO 系列和比较新的 DETR 等等,模型库非常丰富,star 接近 13k,在学术研究和工业落地中应用非常广泛。
2214 0
|
存储 传感器 数据可视化
3D目标检测数据集 KITTI(标签格式解析、3D框可视化、点云转图像、BEV鸟瞰图)
本文介绍在3D目标检测中,理解和使用KITTI 数据集,包括KITTI 的基本情况、下载数据集、标签格式解析、3D框可视化、点云转图像、画BEV鸟瞰图等,并配有实现代码。
3550 1
|
机器学习/深度学习 Web App开发 数据可视化
过节福利 | MMCV Hook 超全使用方法(下)
在训练过程中,通常有十个关键位点,如下图所示,从训练开始到结束,所有关键位点已用红色标出,共有 10 个。我们可以在这十个位点插入各种逻辑,例如加载模型权重、保存模型权重。而我们将同一类型的逻辑组织成一个 Hook。因此,MMCV 中 Hook 的作用就是训练和验证模型时,在不改变其他代码的前提下,灵活地在不同位点插入定制化的逻辑。
2282 0
过节福利 | MMCV Hook 超全使用方法(下)
|
机器学习/深度学习 传感器 编解码
【多传感器融合】BEVFusion: 激光雷达和摄像头融合框架 NeurIPS 2022
BEVFusion提出一个融合多摄像头和激光雷达数据的框架,可用于3D检测。在自动驾驶领域,通过独立处理并融合摄像头和激光雷达数据,可以显著提升3D对象检测的准确性和稳健性,尤其是在激光雷达可能出现故障的真实场景中。
3523 57
【多传感器融合】BEVFusion: 激光雷达和摄像头融合框架 NeurIPS 2022
解决VSCode中Debug和运行路径不一致的
在VSCode调试时,如果程序运行路径不正确,可通过配置`launch.json`文件的`CWD`参数来解决。在`launch.json`中添加或修改`configurations`,例如设置`"cwd": "${fileDirname}"`,确保调试和运行时路径一致。这样可以避免因路径问题影响调试。记得`"name"`、`"type"`、`"request"`等其他关键参数也要正确配置。我是木头左,希望对你有所帮助!
解决VSCode中Debug和运行路径不一致的
|
编解码 并行计算 算法
MMdetection框架速成系列 第01部分:学习路线图与步骤+优先学习的两个目标检测模型代码+loss计算流程+遇到问题如何求助+Anaconda3下的安装教程(mmdet+mmdet3d)
Tip:目前 MMDetection 实现的算法中主要包括 one-stage 和 two-stage 算法,而 two-stage 算法可以简单认为是 one-stage + pool + one-stage 步骤。
1430 0