博客:nuScenes数据集使用
mmdetection3d官方对数据集下载和使用的指南
写在前面:
1.完整的nuScenes数据集约有300G,我在实际使用时仅下载了Part1数据集(约30G)。但是在应用nuScenes官方代码时,不完整的数据集会导致报错。因此,我做了部分修改。
2.目前主要针对基于激光雷达的3D目标检测,因此Camera数据仅用于可视化,Radar数据未做使用。【后续使用时,再做更新】
# 官方
mmdetection3d
├── data
│ ├── nuscenes
│ │ ├── maps
│ │ ├── samples
│ │ ├── sweeps
│ │ ├── v1.0-test
| | ├── v1.0-trainval
nuScenes下载地址
针对nuScenes下载数据集各部分的内容,在博客中有做简要讲述。在此处,我仅下载了下述三个部分。
v1.0-trainval
文件夹,该文件夹中包含所有850个场景的配置文件。samples
文件夹,该文件夹中包含12个文件夹,分别为6路摄像头数据,1路激光雷达数据,5路毫米波雷达数据。samples表示各传感器时间轴对应时的数据。samples/LIDAR_TOP
和sweeps/LIDAR_TOP
文件夹。其中,samples/LIDAR_TOP
在上一部分已经存在,因此,仅需要sweeps/LIDAR_TOP
文件夹。利用tools/create_data.py
将会生成三个pkl
文件和nuscenes_gt_database
文件夹,用于训练和评价。
但是,由于我仅下载了Part1数据集,因此需要对代码进行部分修改。
文件:mmdetection3d/tools/data_converter/nuscenes_converter.py
函数:_fill_trainval_infos
# update for part1_dataset
# for sample in mmcv.track_iter_progress(nusc.sample):
for sample in mmcv.track_iter_progress(nusc.sample[0:3376]):
# 官方
python tools/create_data.py nuscenes --root-path ./data/nuscenes --out-dir ./data/nuscenes --extra-tag nuscenes
至此,数据处理部分完成。
这里以CenterPoint举例【单GPU】
python tools/train.py configs/centerpoint/centerpoint_02pillar_second_secfpn_4x8_cyclic_20e_nus.py
- out: 存储预测结果
- eval: 调用
nuscenes
官方评价方法NuScenesEval
,因此仅包含Part1部分数据集,会导致报错。
python tools/test.py configs/centerpoint/centerpoint_02pillar_second_secfpn_4x8_cyclic_20e_nus.py work_dir/centerpoint/epoch_10.pth --eval bbox --out ./eval_results/centerpoint.pkl
File "/home/ch511/anaconda3/envs/open-mmlab/lib/python3.7/site-packages/nuscenes/eval/detection/evaluate.py", line 87, in __init__
"Samples in split doesn't match samples in predictions."
AssertionError: Samples in split doesn't match samples in predictions.
报错代码:
# evaluate.py
assert set(self.pred_boxes.sample_tokens) == set(self.gt_boxes.sample_tokens), \
"Samples in split doesn't match samples in predictions."
报错原因:
self.pred_boxes.sample_tokens = 914
,self.gt_boxes.sample_tokens = 6019
真实值包括整个数据集,但我仅使用了part1
数据集.
文件:/home/ch511/anaconda3/envs/open-mmlab/lib/python3.7/site-packages/nuscenes/eval/common/loaders.py
函数:load_gt
sample_tokens_all = [s['token'] for s in nusc.sample[0:3376]]
修改源码并非一个好办法,最好是self.nusc仅包括part1部分,这样加载数据时也会更快一些。【待更新】
nusc = NuScenes(version=self.version, dataroot=self.data_root, verbose=False)
上述操作较为耗费时间,因此我把它存储为outputs/nusc/data_false_verbose.pkl
文件。每次使用时读取即可。