3D点云目标检测:MPPNet网络训练waymo数据集

本文详细记录了MPPNet网络在Waymo数据集上的训练过程,包括数据预处理、centerpoint网络训练、MPPNet网络训练以及训练结果。预处理阶段强调了内存要求和gt_sampling策略对内存的影响。训练结果显示,使用gt_sampling的数据增强策略能提高模型精度,但需要大量内存。此外,还讨论了不使用该策略时的精度下降问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里记录一下MPPNet网络训练waymo数据的过程。MPPNet是一个使用连续帧点云进行3D目标检测的网络。
paper:https://arxiv.org/abs/2205.05979
代码地址:https://github.com/open-mmlab/OpenPCDet

一、waymo数据预处理

1.1、waymo数据简介

waymo数据集版本为v1.4.0,其中训练集包括798个场景,验证集有202个场景,测试集有150个场景,每个场景是连续的大概20s左右的数据,每秒10帧,每个场景200帧左右,每个场景用一个tfrecord文件保存。
在这里插入图片描述
注意:验证集的版本要新一点,旧的的验证集合没有目标的点数,无法区分level1和level2

1.2、 waymo数据集预处理

这里主要是解析waymo数据集得到目标检测所用到的点云和真实标签。
首先将所有的场景即tfrecord数据放在同一个路径下,该路径下有两个文件夹,
在这里插入图片描述
ImageSets文件夹中是train.txt和val.txt,保存的是场景名。raw_data文件夹里面是1000个tfrecord文件。然后需要将输入路径修改为自己的数据的路径,yaml文件为cfgs/dataset_configs/waymo_dataset_multiframe.yaml,把DATA_PATH改为自己的数据集路径。
在这里插入图片描述
执行下面的命令
安装waymo数据处理工具

pip3 install waymo-open-dataset-tf-2-5-0 --user

开始处理waymo数据

python -m pcdet.datasets.waymo.waymo_dataset --func create_waymo_infos \
    --cfg_file tools/cfgs/dataset_configs/waymo_dataset_multiframe.yaml

注意事项:
1):如果训练模型时要使用gt_sampling增强策略,预处理时要求机器内存大于200G,越大越好,waymo有20多万的数据量,我在做的时候使用80G内存的机器都内存报错,最后用了320G内存的机器才正常处理完,原因是程序会把gt_sampling使用的样本库写到一个pkl文件中,这个文件只有在所有数据处理完才会保存,之前一直存在内存中,这样内存占用会越来愈大,而且不要使用share_memory策略,虽然代码里说用share_memory会提升速度,但是我使用的时候还是会报错,关掉这个功能就能正常跑通,但是处理时间真的很慢。
2):如果实在没有这么大内存的机器,还想跑通waymo数据集的同学可以选择关掉gt_sampling策略,即训练模型的时候不使用gt_sampling增强,这样需要很小的内存就能把预处理跑完,修改方式如下,还是在刚才的yaml文件,在DATA_AUGMENTOR结点的DISABLE_AUG_LIST子结点中加入gt_sampling,但是这样的坏处时模型的精度会降低很多,后面会在实验结果中给出两种训练的精度。

DATA_AUGMENTOR:
    DISABLE_AUG_LIST: ['placeholder','gt_sampling']
    AUG_CONFIG_LIST:
        - NAME: gt_sampling
          USE_ROAD_PLANE: False
          DB_INFO_PATH:
              - waymo_processed_data_v0_5_0_waymo_dbinfos_train_sampled_1_multiframe_-4_to_0.pkl

          USE_SHARED_MEMORY: False  # set it to True to speed up (it costs about 50GB? shared memory)
          DB_DATA_PATH:
              - waymo_processed_data_v0_5_0_gt_database_train_sampled_1_multiframe_-4_to_0_global.npy

解析后的结果包括以下几个文件夹
在这里插入图片描述
实际点云数据存在waymo_processed_data_v0_5_0文件件中以每个场景命名的子文件夹中,每一帧存储为一个npy文件,标签存储在pkl文件中。

在这里插入图片描述

二、训练centerpoint网络

MPPNet网络是two-stage网络,先单独训练第一个stage网络得到预选框,论文选用的是centerpoint网络,而且是将4帧叠加后做为单帧点云的输入,叠加方式就是使用自车的pose信息,将历史帧的点云坐标转换到当前帧的坐标系下后合并。效果如下:
不做坐标转换直接拼接

做完坐标转换再拼接

训练命令:

bash scripts/dist_train.sh 8 --cfg_file cfgs/waymo_models/centerpoint_4frames.yaml

我这里使用8张V100(32G),不使用gt_sampling策略训练的7天,使用gt_sampling策略训练了9天。

三、训练mppnet网络

训练完centerpoint后需要用得到的模型将训练集和验证集都推理一遍,保存推理结果作为第二阶段网络的预选框proposal。
推理训练集

bash scripts/dist_test.sh 8  --cfg_file cfgs/waymo_models/centerpoint_4frames.yaml \
--ckpt ../output/waymo_models/centerpoint_4frames/default/ckpt/checkpoint_epoch_36.pth \
--set DATA_CONFIG.DATA_SPLIT.test train

结果存储在eval/epoch_36/train/default/result.pkl中
推理验证集

bash scripts/dist_test.sh 8  --cfg_file cfgs/waymo_models/centerpoint_4frames.yaml \
--ckpt ../output/waymo_models/centerpoint_4frames/default/ckpt/checkpoint_epoch_36.pth \
--set DATA_CONFIG.DATA_SPLIT.test val

结果存储在eval/epoch_36/val/default/result.pkl中

训练MPPNet网络, DATA_CONFIG.ROI_BOXES_PATH.train 指定训练集的推理结果,DATA_CONFIG.ROI_BOXES_PATH.test验证集的推理结果

bash scripts/dist_train.sh 8 --cfg_file cfgs/waymo_models/mppnet_4frames.yaml --batch_size  32  \
--set DATA_CONFIG.ROI_BOXES_PATH.train  ../output/waymo_models/centerpoint_4frames/default/eval/epoch_36/train/default/result.pkl \
DATA_CONFIG.ROI_BOXES_PATH.test  ../output/waymo_models/centerpoint_4frames/default/eval/epoch_36/val/default/result.pkl

四、训练结果

下图是我自己复现MPPNet的结果,v1是不使用gt_sampling数据增强结果,可以看到精度相比论文差距比较大,v2是使用gt_sampling的结果,除CYC类相差2个点外,其他两类基本持平。

五、注意事项

1、不使用gt_sampling增强策略精度差距很大。
2、使用gt_sampling策略在做数据预处理时需要特别大的内存,最好是200G以上,不然无法生产gt_sampling需要的npy文件。
3、使用的数据版本尽可能新,在做精度评价的时候会根据目标包含的点数将目标划分为level1和level2,初版的数据集没有记录目标的点数。

### 如何使用 `DrawingContext` 实现旋转操作 为了实现基于 `DrawingContext` 的旋转绘制,可以利用变换矩阵来改变绘图对象的位置和方向。具体来说,在 WPF 中可以通过应用旋转变换来修改 `DrawingVisual` 对象的方向。 在定义好要绘制的对象之后,可以在调用 `DrawLine`, `DrawGeometry` 或其他绘图命令之前先设置一个变换。对于旋转而言,通常会创建一个新的 `RotateTransform` 并将其应用于当前的 `DrawingContext` 上: ```csharp using System.Windows; using System.Windows.Media; // 创建 DrawingVisual 和关联的 DrawingContext var visual = new DrawingVisual(); using (var dc = visual.RenderOpen()) { var centerPoint = new Point(100, 100); // 定义旋转中心点 // 应用旋转变换到指定的角度 angleDegrees 绕着 centerPoint 点旋转 dc.PushTransform(new RotateTransform(angleDegrees, centerPoint.X, centerPoint.Y)); // 执行实际的绘图指令... // 关闭变换作用域 dc.Pop(); } ``` 上述代码片段展示了如何围绕特定点执行旋转操作[^1]。这里的关键在于使用 `PushTransform()` 方法将新的变换推入堆栈中,这样后续所有的绘图都会受到该变换的影响;而当不再需要此变换时,则可通过 `Pop()` 来移除它[^2]。 另外需要注意的是,默认情况下 Canvas 的坐标体系是以左上角作为原点,并且 Y 轴向下增长,这可能与直觉不符。因此有时还需要额外考虑是否有必要调整整个场景的坐标系以便更方便地处理几何变换[^3]。 最后值得注意的一点是在三维空间内进行类似的旋转时,除了提供角度外还需指明绕哪个轴线转动以及具体的中心位置[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GHZhao_GIS_RS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值