【mmdetection3d】——3D目标检测NuScenes数据集

更新时间:2023-06-04 13:00:31 阅读: 评论:0

【mmdetection3d】——3D⽬标检测NuScenes数据集
3D ⽬标检测 NuScenes 数据集
本页提供了有关在 MMDetection3D 中使⽤ nuScenes 数据集的具体教程。
准备之前
您可以在下载 nuScenes 3D 检测数据并解压缩所有 zip ⽂件。
像准备数据集的⼀般⽅法⼀样,建议将数据集根⽬录软链接到 $MMDETECTION3D/data。
在我们处理之前,⽂件夹结构应按如下⽅式组织。
mmdetection3d
├── mmdet3d
├── tools
cicy├── 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_databa
││├── nuscenes_infos_train.pkl
││├── nuscenes_infos_trainval.pkl
││├── nuscenes_infos_val.pkl
││├── nuscenes_infos_test.pkl
││├── nuscenes_dbinfos_train.pkl
││├── nuscenes_infos_json
广式凉茶││├── nuscenes_infos_json
││├── nuscenes_infos_json
冰箱除冰││├── nuscenes_infos_json
这⾥,.pkl ⽂件⼀般⽤于涉及点云的⽅法,coco 风格的 .json ⽂件更适合基于图像的⽅法,例如基于图像的 2D 和 3D 检测。
接下来,我们将详细说明这些信息⽂件中记录的细节。
nuscenes_databa/xxxxx.bin:训练数据集的每个 3D 包围框中包含的点云数据。
nuscenes_infos_train.pkl:训练数据集信息,每帧信息有两个键值: metadata 和 infos。 metadata 包含数据集本⾝的基本信息,例如{'version': 'v1.0-trainval'},⽽ infos 包含详细信息如下:
{'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][‘nsor2ego_translation’]:从当前传感器(⽤于收集扫描数据)到⾃车(包含感知周围环境传感器的车辆,车辆坐标系固连在⾃车上)的平转换(1x3 列表)。
info[‘sweeps’][i][‘nsor2ego_rotation’]:从当前传感器(⽤于收集扫描数据)到⾃车的旋转(四元数格式的 1x4列表)。
info[‘sweeps’][i][‘ego2global_translation’]:从⾃车到全局坐标的转换(1x3 列表)。
info[‘sweeps’][i][‘ego2global_rotation’]:从⾃车到全局坐标的旋转(四元数格式的 1x4 列表)。
info[‘sweeps’][i][‘timestamp’]:扫描数据的时间戳。
info[‘sweeps’][i][‘nsor2lidar_translation’]:从当前传感器(⽤于收集扫描数据)到激光雷达的转换(1x3 列表)。
info[‘sweeps’][i][‘nsor2lidar_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_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][‘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.pkl 和 nuscenes_infos_json 的核⼼函数分别为 和 。更多细节请参考 。
训练流程
基于 LiDAR 的⽅法
nuScenes 上基于 LiDAR 的 3D 检测(包括多模态⽅法)的典型训练流程如下。
train_pipeline =[
dict(
type='LoadPointsFromFile',
coord_type='LIDAR',
load_dim=5,
u_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', class=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' 中的默认 u_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_20200 620_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.8s
Per-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_cfpn_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 基准测试。更多信息请参考 。
我们还可以使⽤我们开发的可视化⼯具将预测结果可视化。更多细节请参考。
注意
NuScenesBox和我们的CameraInstanceBoxes之间的转换。
总的来说,NuScenesBox 和我们的 CameraInstanceBoxes 的主要区别主要体现在转向⾓(yaw)定义上。 NuScenesBox 定义了⼀个四元数或三个欧拉⾓的旋转,⽽我们的由于实际情况只定义了⼀个转向⾓(yaw),它需要我们在预处理和后处理中⼿动添加⼀些额外的旋转,例如。
另外,请注意,⾓点和位置的定义在 NuScenesBox 中是分离的。例如,在单⽬ 3D 检测中,框位置的定义在其相机坐标中(有关汽车设置,请参阅其官⽅),即与⼀致。相⽐之下,它的⾓点是通过 定义的,“x 向前, y 向左, z 向上”。它导致了与我们的CameraInstanceBoxes 不同的维度和旋转定义理念。⼀个移除相似冲突的例⼦是 PR 。同样的问题也存在于 LiDAR 系统中。为了解决它们,我们通常会在预处理和后处理中添加⼀些转换,以保证在整个训练和推理过程中框都在我们的坐标系系统⾥。

本文发布于:2023-06-04 13:00:31,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/860277.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   信息   包含   图像   例如
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图