3D 目标检测 NuScenes 数据集

本页提供了有关在 MMDetection3D 中使用 nuScenes 数据集的具体教程。

准备之前

您可以在这里下载 nuScenes 3D 检测数据并解压缩所有 zip 文件。

像准备数据集的一般方法一样,建议将数据集根目录软链接$MMDETECTION3D/data

在我们处理之前,文件夹结构应按如下方式组织。

mmdetection3d
├── mmdet3d
├── tools
├── configs
├── data
│   ├── nuscenes
│   │   ├── maps
│   │   ├── samples
│   │   ├── sweeps
│   │   ├── v1.0-test
|   |   ├── v1.0-trainval

数据准备

我们通常需要通过特定样式来使用 .pkl 或 .json 文件组织有用的数据信息,例如用于组织图像及其标注的 coco 样式。
要为 nuScenes 准备这些文件,请运行以下命令:

python tools/create_data.py nuscenes --root-path ./data/nuscenes --out-dir ./data/nuscenes --extra-tag nuscenes

处理后的文件夹结构应该如下

mmdetection3d
├── mmdet3d
├── tools
├── configs
├── data
│   ├── nuscenes
│   │   ├── maps
│   │   ├── samples
│   │   ├── sweeps
│   │   ├── v1.0-test
|   |   ├── v1.0-trainval
│   │   ├── nuscenes_database
│   │   ├── nuscenes_infos_train.pkl
│   │   ├── nuscenes_infos_trainval.pkl
│   │   ├── nuscenes_infos_val.pkl
│   │   ├── nuscenes_infos_test.pkl
│   │   ├── nuscenes_dbinfos_train.pkl
│   │   ├── nuscenes_infos_train_mono3d.coco.json
│   │   ├── nuscenes_infos_trainval_mono3d.coco.json
│   │   ├── nuscenes_infos_val_mono3d.coco.json
│   │   ├── nuscenes_infos_test_mono3d.coco.json

这里,.pkl 文件一般用于涉及点云的方法coco 风格的 .json 文件更适合基于图像的方法,例如基于图像的 2D 和 3D 检测。
接下来,我们将详细说明这些信息文件中记录的细节。

  • nuscenes_database/xxxxx.bin:训练数据集的每个 3D 包围框中包含的点云数据。
  • nuscenes_infos_train.pkl:训练数据集信息,每帧信息有两个键值: metadatainfosmetadata 包含数据集本身的基本信息,例如 {'version': 'v1.0-trainval'},而 infos 包含详细信息如下:
    • info[‘lidar_path’]:激光雷达点云数据的文件路径。
    • info[‘token’]:样本数据标记。
    • info[‘sweeps’]:扫描信息(nuScenes 中的 sweeps 是指没有标注的中间帧,而 samples 是指那些带有标注的关键帧)。
      • info[‘sweeps’][i][‘data_path’]:第 i 次扫描的数据路径。
      • info[‘sweeps’][i][‘type’]:扫描数据类型,例如“激光雷达”。
      • info[‘sweeps’][i][‘sample_data_token’]:扫描样本数据标记。
      • info[‘sweeps’][i][‘sensor2ego_translation’]:从当前传感器(用于收集扫描数据)到自车(包含感知周围环境传感器的车辆,车辆坐标系固连在自车上)的平转换(1x3 列表)。
      • info[‘sweeps’][i][‘sensor2ego_rotation’]:从当前传感器(用于收集扫描数据)到自车的旋转(四元数格式的 1x4 列表)。
      • info[‘sweeps’][i][‘ego2global_translation’]:从自车到全局坐标的转换(1x3 列表)。
      • info[‘sweeps’][i][‘ego2global_rotation’]:从自车到全局坐标的旋转(四元数格式的 1x4 列表)。
      • info[‘sweeps’][i][‘timestamp’]:扫描数据的时间戳。
      • info[‘sweeps’][i][‘sensor2lidar_translation’]:从当前传感器(用于收集扫描数据)到激光雷达的转换(1x3 列表)。
      • info[‘sweeps’][i][‘sensor2lidar_rotation’]:从当前传感器(用于收集扫描数据)到激光雷达的旋转(四元数格式的 1x4 列表)。
    • info[‘cams’]:相机校准信息。它包含与每个摄像头对应的六个键值: 'CAM_FRONT', 'CAM_FRONT_RIGHT', 'CAM_FRONT_LEFT', 'CAM_BACK', 'CAM_BACK_LEFT', 'CAM_BACK_RIGHT'
      每个字典包含每个扫描数据按照上述方式的详细信息(每个信息的关键字与上述相同)。
    • info[‘lidar2ego_translation’]:从激光雷达到自车的转换(1x3 列表)。
    • info[‘lidar2ego_rotation’]:从激光雷达到自车的旋转(四元数格式的 1x4 列表)。
    • info[‘ego2global_translation’]:从自车到全局坐标的转换(1x3 列表)。
    • info[‘ego2global_rotation’]:从自我车辆到全局坐标的旋转(四元数格式的 1x4 列表)。
    • info[‘timestamp’]:样本数据的时间戳。
    • info[‘gt_boxes’]:7 个自由度的 3D 包围框,一个 Nx7 数组。
    • info[‘gt_names’]:3D 包围框的类别,一个 1xN 数组。
    • info[‘gt_velocity’]:3D 包围框的速度(由于不准确,没有垂直测量),一个 Nx2 数组。
    • info[‘num_lidar_pts’]:每个 3D 包围框中包含的激光雷达点数。
    • info[‘num_radar_pts’]:每个 3D 包围框中包含的雷达点数。
    • info[‘valid_flag’]:每个包围框是否有效。一般情况下,我们只将包含至少一个激光雷达或雷达点的 3D 框作为有效框。
  • nuscenes_infos_train_mono3d.coco.json:训练数据集 coco 风格的信息。该文件将基于图像的数据组织为三类(键值):'categories', 'images', 'annotations'
    • info[‘categories’]:包含所有类别名称的列表。每个元素都遵循字典格式并由两个键值组成:'id''name'
    • info[‘images’]:包含所有图像信息的列表。
      • info[‘images’][i][‘file_name’]:第 i 张图像的文件名。
      • info[‘images’][i][‘id’]:第 i 张图像的样本数据标记。
      • info[‘images’][i][‘token’]:与该帧对应的样本标记。
      • info[‘images’][i][‘cam2ego_rotation’]:从相机到自车的旋转(四元数格式的 1x4 列表)。
      • info[‘images’][i][‘cam2ego_translation’]:从相机到自车的转换(1x3 列表)。
      • info[‘images’][i][‘ego2global_rotation’’]:从自车到全局坐标的旋转(四元数格式的 1x4 列表)。
      • info[‘images’][i][‘ego2global_translation’]:从自车到全局坐标的转换(1x3 列表)。
      • info[‘images’][i][‘cam_intrinsic’]: 相机内参矩阵(3x3 列表)。
      • info[‘images’][i][‘width’]:图片宽度, nuScenes 中默认为 1600。
      • info[‘images’][i][‘height’]:图像高度, nuScenes 中默认为 900。
    • info[‘annotations’]: 包含所有标注信息的列表。
      • info[‘annotations’][i][‘file_name’]:对应图像的文件名。
      • info[‘annotations’][i][‘image_id’]:对应图像的图像 ID (标记)。
      • info[‘annotations’][i][‘area’]:2D 包围框的面积。
      • info[‘annotations’][i][‘category_name’]:类别名称。
      • info[‘annotations’][i][‘category_id’]:类别 id。
      • info[‘annotations’][i][‘bbox’]:2D 包围框标注(3D 投影框的外部矩形),1x4 列表跟随 [x1, y1, x2-x1, y2-y1]。x1/y1 是沿图像水平/垂直方向的最小坐标。
      • info[‘annotations’][i][‘iscrowd’]:该区域是否拥挤。默认为 0。
      • info[‘annotations’][i][‘bbox_cam3d’]:3D 包围框(重力)中心位置(3)、大小(3)、(全局)偏航角(1)、1x7 列表。
      • info[‘annotations’][i][‘velo_cam3d’]:3D 包围框的速度(由于不准确,没有垂直测量),一个 Nx2 数组。
      • info[‘annotations’][i][‘center2d’]:包含 2.5D 信息的投影 3D 中心:图像上的投影中心位置(2)和深度(1),1x3 列表。
      • info[‘annotations’][i][‘attribute_name’]:属性名称。
      • info[‘annotations’][i][‘attribute_id’]:属性 ID。
        我们为属性分类维护了一个属性集合和映射。更多的细节请参考这里。
      • info[‘annotations’][i][‘id’]:标注 ID。默认为 i

这里我们只解释训练信息文件中记录的数据。这同样适用于验证和测试集。
获取 nuscenes_infos_xxx.pklnuscenes_infos_xxx_mono3d.coco.json 的核心函数分别为 _fill_trainval_infos 和 get_2d_boxes。更多细节请参考 nuscenes_converter.py。

训练流程

基于 LiDAR 的方法

nuScenes 上基于 LiDAR 的 3D 检测(包括多模态方法)的典型训练流程如下。

train_pipeline = [dict(type='LoadPointsFromFile',coord_type='LIDAR',load_dim=5,use_dim=5,file_client_args=file_client_args),dict(type='LoadPointsFromMultiSweeps',sweeps_num=10,file_client_args=file_client_args),dict(type='LoadAnnotations3D', with_bbox_3d=True, with_label_3d=True),dict(type='GlobalRotScaleTrans',rot_range=[-0.3925, 0.3925],scale_ratio_range=[0.95, 1.05],translation_std=[0, 0, 0]),dict(type='RandomFlip3D', flip_ratio_bev_horizontal=0.5),dict(type='PointsRangeFilter', point_cloud_range=point_cloud_range),dict(type='ObjectRangeFilter', point_cloud_range=point_cloud_range),dict(type='ObjectNameFilter', classes=class_names),dict(type='PointShuffle'),dict(type='DefaultFormatBundle3D', class_names=class_names),dict(type='Collect3D', keys=['points', 'gt_bboxes_3d', 'gt_labels_3d'])
]

与一般情况相比,nuScenes 有一个特定的 'LoadPointsFromMultiSweeps' 流水线来从连续帧加载点云。这是此设置中使用的常见做法。
更多细节请参考 nuScenes 原始论文。
'LoadPointsFromMultiSweeps' 中的默认 use_dim[0, 1, 2, 4],其中前 3 个维度是指点坐标,最后一个是指时间戳差异。
由于在拼接来自不同帧的点时使用点云的强度信息会产生噪声,因此默认情况下不使用点云的强度信息

基于视觉的方法

nuScenes 上基于图像的 3D 检测的典型训练流水线如下。

train_pipeline = [dict(type='LoadImageFromFileMono3D'),dict(type='LoadAnnotations3D',with_bbox=True,with_label=True,with_attr_label=True,with_bbox_3d=True,with_label_3d=True,with_bbox_depth=True),dict(type='Resize', img_scale=(1600, 900), keep_ratio=True),dict(type='RandomFlip3D', flip_ratio_bev_horizontal=0.5),dict(type='Normalize', **img_norm_cfg),dict(type='Pad', size_divisor=32),dict(type='DefaultFormatBundle3D', class_names=class_names),dict(type='Collect3D',keys=['img', 'gt_bboxes', 'gt_labels', 'attr_labels', 'gt_bboxes_3d','gt_labels_3d', 'centers2d', 'depths']),
]

它遵循 2D 检测的一般流水线,但在一些细节上有所不同:

  • 它使用单目流水线加载图像,其中包括额外的必需信息,如相机内参矩阵。
  • 它需要加载 3D 标注。
  • 一些数据增强技术需要调整,例如RandomFlip3D
    目前我们不支持更多的增强方法,因为如何迁移和应用其他技术仍在探索中。

评估

使用 8 个 GPU 以及 nuScenes 指标评估的 PointPillars 的示例如下

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 8 --eval bbox

指标

NuScenes 提出了一个综合指标,即 nuScenes 检测分数(NDS),以评估不同的方法并设置基准测试
它由平均精度(mAP)平均平移误差(ATE)平均尺度误差(ASE)平均方向误差(AOE)平均速度误差(AVE)和**平均属性误差(AAE)**组成。
更多细节请参考其官方网站。

我们也采用这种方法对 nuScenes 进行评估。打印的评估结果示例如下:

mAP: 0.3197
mATE: 0.7595
mASE: 0.2700
mAOE: 0.4918
mAVE: 1.3307
mAAE: 0.1724
NDS: 0.3905
Eval time: 170.8sPer-class results:
Object Class    AP      ATE     ASE     AOE     AVE     AAE
car     0.503   0.577   0.152   0.111   2.096   0.136
truck   0.223   0.857   0.224   0.220   1.389   0.179
bus     0.294   0.855   0.204   0.190   2.689   0.283
trailer 0.081   1.094   0.243   0.553   0.742   0.167
construction_vehicle    0.058   1.017   0.450   1.019   0.137   0.341
pedestrian      0.392   0.687   0.284   0.694   0.876   0.158
motorcycle      0.317   0.737   0.265   0.580   2.033   0.104
bicycle 0.308   0.704   0.299   0.892   0.683   0.010
traffic_cone    0.555   0.486   0.309   nan     nan     nan
barrier 0.466   0.581   0.269   0.169   nan     nan

测试和提交

使用 8 个 GPU 在 nuScenes 上测试 PointPillars 并生成对排行榜的提交的示例如下

./tools/dist_test.sh configs/pointpillars/hv_pointpillars_fpn_sbn-all_4x8_2x_nus-3d.py work_dirs/hv_pointpillars_secfpn_6x8_160e_kitti-3d-3class/latest.pth 8 --out work_dirs/pp-nus/results_eval.pkl --format-only --eval-options 'jsonfile_prefix=work_dirs/pp-nus/results_eval'

请注意,在这里测试信息应更改为测试集而不是验证集。

生成 work_dirs/pp-nus/results_eval.json 后,您可以压缩并提交给 nuScenes 基准测试。更多信息请参考 nuScenes 官方网站。

我们还可以使用我们开发的可视化工具将预测结果可视化。更多细节请参考可视化文档。

注意

NuScenesBox 和我们的 CameraInstanceBoxes 之间的转换。

总的来说,NuScenesBox 和我们的 CameraInstanceBoxes 的主要区别主要体现在转向角(yaw)定义上。 NuScenesBox 定义了一个四元数或三个欧拉角的旋转,而我们的由于实际情况只定义了一个转向角(yaw),它需要我们在预处理和后处理中手动添加一些额外的旋转,例如这里。

另外,请注意,角点和位置的定义在 NuScenesBox 中是分离的。例如,在单目 3D 检测中,框位置的定义在其相机坐标中(有关汽车设置,请参阅其官方插图),即与我们的一致。相比之下,它的角点是通过惯例 定义的,“x 向前, y 向左, z 向上”。它导致了与我们的 CameraInstanceBoxes 不同的维度和旋转定义理念。一个移除相似冲突的例子是 PR #744。同样的问题也存在于 LiDAR 系统中。为了解决它们,我们通常会在预处理和后处理中添加一些转换,以保证在整个训练和推理过程中框都在我们的坐标系系统里。

【mmdetection3d】——3D 目标检测 NuScenes 数据集相关推荐

  1. 3D目标检测之数据集

    目录 1. KITTI Dataset 2. Waymo Open Dataset 3. NuScenes DataSet 4. Appllo Scape 5. Lyft L5 6. Argovers ...

  2. 史上最全综述:3D目标检测算法汇总!

    来源:自动驾驶之心 本文约16000字,建议阅读10+分钟 本文将演示如何通过阈值调优来提高模型的性能.本文的结构安排如下:首先,第2节中介绍了3D目标检测问题的定义.数据集和评价指标.然后,我们回顾 ...

  3. 【单目3D目标检测】SMOKE论文解析与代码复现

    文章目录 yacs Introduction Usage SMOKE Preface Abstract Contributions Pipeline Backbone Head Branch Orie ...

  4. 室内环境下的3D 目标检测调研

    任务: 调研室内场景下基于单帧图像的3D目标检测的研究情况. 思路: 首先了解相关数据集,benchmark,在数据集的基础上比较不同算法. 1. 室内场景的3D数据集 sunrgbd:室内场景,3D ...

  5. 【单目3D目标检测】项目实战-道路车辆/行人3D目标检测

    [单目3D目标检测]项目实战-道路车辆/行人3D目标检测 任务定义 传统激光雷达3D检测模型 VS 单目3D检测模型 单目3D目标检测优点 单目3D目标检测难点 数据集 KITTI数据集标注及网络输出 ...

  6. MMdetection3d环境搭建、使用MMdetection3d做3D目标检测训练自己的数据集、测试、可视化,以及常见的错误

    MMdetection3d环境搭建.使用MMdetection3d做3D目标检测训练自己的数据集.测试.可视化,以及常见的错误 1 mmdetection3d环境搭建与测试 1.1 从docker开始 ...

  7. MMDetection3D:新一代通用3D目标检测平台

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者:包小张 | 来源:知乎 https://zhuanlan.zhihu.com/p/1656473 ...

  8. 收藏 | 3D目标检测综述:从数据集到2D和3D方法

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:机器之心 AI博士笔记系列推荐 周志华<机器学习> ...

  9. 3D目标检测综述:从数据集到2D和3D方法

    本文经机器之心(almosthuman2014)授权转载,禁止二次转载. 作者:Yilin Wang, Jiayi Ye 机器之心编译 编辑:Panda 目标检测一直是计算机视觉领域中一大难题.近日, ...

最新文章

  1. codeforces 282E Sausage Maximization
  2. java系统教程_Java 教程(开发环境配置+基础语法)
  3. 【ssi】增删改查六操作小框架(八)
  4. cae计算机仿真分析技术,厉害了 揭秘汽车设计中CAE仿真技术
  5. mybatis 插入数据后返回自增id
  6. cglib动态代理导致注解丢失问题及如何修改注解允许被继承
  7. Java读 写文本_java读文件写文件的方法
  8. JPA + Hibernate + PostgreSQL + Maven基本配置示例
  9. 多页Excel转换成PDF时如何保存为单独文件
  10. 美赛只用matlab够,美赛思路
  11. 最有效的清理C盘/win10如何给系统盘瘦身
  12. Endnote X6大客户版破解版+新功能介绍+视频介绍
  13. GIS投影、坐标系、坐标系转换
  14. 算法上的创新点大搜罗
  15. Docker中创建MySQL容器,将宿主机目录直接挂载到目录
  16. 海思SD3403开发板学习(一)
  17. 基于灰狼算法优化的lssvm回归预测-附代码
  18. 大数据江湖之即席查询与分析(上篇)--即席查询与分析的前世今生
  19. 个人深度学习工作站配置指南
  20. 怎样区别桃花、杏花、梨花、樱花、梅花、李花

热门文章

  1. Why we need activation function?
  2. Warmup 模型训练之标配
  3. Linux中使用交叉编译、二进制分析工具链
  4. 数值分析快速复习(1)——Matlab数值积分
  5. 虎从风跃,龙借云行--神行者Wi10无线移动硬盘开启WIFI无线存储共享新时代_MID论坛_太平洋电脑网产品论坛...
  6. lunch time food
  7. 启动类上的@MapperScan注解与yml配置中mybatis.mapper-locations和mybatis.type-aliases-package的作用
  8. hexo 利用 Markdown 语法画 mermaid 流程图
  9. linux 之atop 系统监控工具
  10. django种表单post出现CSRF verification failed( CSRF验证失败 ) 的两种解决方案