简介:面向自动驾驶数据集使用者的nuScenes数据下载与解压流程源码包,适合需要快速掌握数据集准备环节的研究人员或开发者。资源围绕数据集的完整获取链路,提供了下载与解压环节的参考实现,包含HTML格式的步骤说明、编辑器环境配置以及版本管理忽略规则示例,可帮助读者理清Trainval、Test、Map expansion与CAN bus expansion的存放位置,掌握unzip、tar及Shell脚本批量解压等更稳定的处理方式,减少图形界面解压可能带来的问题。包体共3个文件,以html配置说明与inscode工程配置为主,压缩后仅6KB,轻量易上手。源码包虽小,但目录结构清晰,适合作为项目初始化时的骨架参考。目前已有309人学习,对刚接触nuScenes并希望规范数据集处理流程的开发者而言,是一份能直接对照使用的实用补充材料。 直接给你结论:nuScenes这个数据集,下载和解压这件事,坑比训练模型还多。文件大、分卷多、官网的下载方式又改了又改,很多人在第一步就卡了两三天。这篇就把我实际处理这套数据集的完整流程、踩过的坑、以及一份可以直接用的项目源码(下载+解压+校验+加载)整理出来,照着做,能省掉一大半的折腾时间。
先说清楚这篇东西是给谁看的:准备用nuScenes做自动驾驶感知、多模态融合、bev感知、端到端规划研究的同学,以及那些在服务器上拉数据集拉了一半发现硬盘满了、解压出来发现文件损坏、或者装上nuscenes-devkit却找不到数据的倒霉蛋。全程基于我在Linux服务器上的实际操作记录,Windows用户部分命令需要微调,但思路完全一致。
1. 数据集整体认知与下载前准备
1.1 nuScenes到底有多大,结构是怎样的
很多人第一次下载nuScenes,看到官网那堆链接就懵了。这个数据集不是单文件,而是按传感器模态和数据用途拆成了很多部分。完整版trainval包含850个场景,每个场景大约20秒,传感器配置是6个摄像头(CAM_FRONT、CAM_FRONT_LEFT、CAM_FRONT_RIGHT、CAM_BACK_LEFT、CAM_BACK、CAM_BACK_RIGHT)、5个毫米波雷达、1个激光雷达,还有高精地图。
关键点在于,官网把这些数据分成了几个大类:trainval(训练+验证的完整传感器数据)、test(测试集)、mini(1个训练场景+1个验证场景,只有40个样本)、map(高精地图扩展包),以及can_bus(车辆CAN总线数据)。其中trainval的lidar数据就接近100GB,全部图像数据更大,整套下来不含map就差不多300GB+。
我见过不少人在这一步就出问题:只下载了图像的压缩包,没下载lidar;或者下载了trainval却忘了map包,结果跑bevformer的时候找不到地图数据报错。下载之前务必对照官网的DATA PACKAGE表格列个清单,确认自己研究需要哪些模态。
1.2 硬件与网络准备,别等下载到一半才后悔
先说硬盘。tarinval的raw数据解压后,目录结构是samples、sweeps、maps、v1.0-trainval这几个大目录。samples里是keyframe(关键帧)数据,sweeps里是中间帧(interpolated),同一帧的6个摄像头图像加lidar点云,全部解压后trainval大约占280GB到320GB,这还不算你解压过程中的临时空间。
我的建议是准备至少600GB的剩余空间。不要有侥幸心理,我自己的服务器就是下载完发现分区只剩100GB,解压到一半直接报No space left on device,那叫一个痛。另外,训练集数据由非常多的分卷zip构成(比如lidar数据被切成了一堆2GB左右的分卷),解压时需要分卷zip在同目录且文件名完整,所以下载过程中不要中断、不要跳过任何分卷。
网络方面,官网下载需要使用官方提供的命令行工具或者AWSCLI访问S3存储桶,大文件下载建议用screen或者tmux挂后台,避免ssh断开导致下载中断。
2. 下载方式详解与源码实现
2.1 官方下载方式与账号配置
nuScenes官网下载数据需要先注册账号,然后在Downloads页面勾选需要的包,之后会给你一个下载链接或者命令。需要说明的是,官方页面提供的链接带有时效,配合s3cmd或aws cli使用。
比较推荐的方式是s3cmd,因为官网文档就是按s3cmd写的。如果服务器上没有s3cmd,先安装:
sudo apt update sudo apt install -y s3cmd然后配置访问密钥,这个密钥在官网账号的个人页面里可以找到。配置过程中会让你输入Access Key和Secret Key,其他项可以一路回车用默认值。
s3cmd --configure这里有个实操细节:s3cmd配置完后,建议先测试一下连通性:
s3cmd ls s3://nuScenes/如果能看到数据集目录列表,说明账号和网络都没问题。
2.2 分卷下载脚本实现
这才是今天的重头戏。官方下载链接的核心规律是:每个数据包在S3桶里都有对应的路径,你需要按需拼接。比如下载trainval的lidar数据,路径类似:
s3://nuScenes/v1.0-trainval/v1.0-trainval_blobs_train_lidar.tar不对,说错了,这是旧版tar包年代的路径。现在官网的数据包已经改成new-style分卷zip包,而且不同版本路径规律不同,直接写死路径反而容易踩坑。我的做法是先把官网生成的下载命令保存下来,然后用脚本去解析。
这里我给一个更通用的脚本思路:官网在你勾选完数据包之后,会生成一段Shell命令,命令里包含了完整的s3路径。你只需要把这段命令里的s3cmd ls换成s3cmd get就可以了。我自己用的下载脚本长这样:
#!/bin/bash # 下载脚本 download_nuscenes.sh # 用法:bash download_nuscenes.sh <数据包前缀> PACKAGE_PREFIX=$1 DEST_DIR="./nuScenes" mkdir -p ${DEST_DIR} cd ${DEST_DIR} export S3CMD_CONFIG="$HOME/.s3cfg" # 逐行读取官网生成的下载清单文件 urls.txt while read -r line; do echo "Downloading: ${line}" s3cmd get "${line}" if [ $? -ne 0 ]; then echo "Download failed: ${line}" exit 1 fi done < urls.txt echo "All downloads done."官网生成的下载命令其实就是一长串s3cmd get命令,把这些命令保存成一个urls.txt文件,用上面的循环脚本批量执行,比手动复制粘贴强得多。
2.3 并行下载加速技巧
单线程s3cmd下载,速度受限于单文件带宽,大文件动辄几十GB会非常慢。s3cmd自带--parallel和--multi参数,可以多线程下载和分段下载:
s3cmd get --parallel --multi 8 s3://nuScenes/v1.0-trainval/v1.0-trainval_xxx.zip ./nuScenes/--multi后面跟的数字表示分片数,实测在带宽充裕的服务器上可以把速度拉满。需要注意,如果分片下载中断,重新执行时要加--continue参数续传,否则会从头开始。另外,s3cmd在下载时会把分片文件先写到临时文件,最后合并,所以磁盘剩余空间至少要再预留一个压缩包的大小。
3. 解压与目录结构搭建实操
3.1 分卷zip的识别与合并逻辑
下载完成后,你会发现压缩包不是单个zip文件,而是一堆按序号排列的分卷,类似:
v1.0-trainval_blobs_train_cam_000.zip v1.0-trainval_blobs_train_cam_001.zip v1.0-trainval_blobs_train_cam_002.zip这种分卷压缩包在解压时,unzip可以直接识别并自动跨卷读取,前提是分卷文件名保持原始命名,且都放在同一个目录下。指定第一个分卷即可:
unzip v1.0-trainval_blobs_train_cam_000.zip -d ./raw注意,分卷zip依赖所有分卷文件的校验值,任何一个分卷损坏,unzip都会报错并中断。所以解压前可以先跑一遍校验脚本,确认所有分卷的md5与官网给的md5一致。这个校验很重要,下载过程网络抖动很容易造成某个分卷损坏。
3.2 目录结构的最终要求
解压完成后,别急着高兴,先检查目录结构。nuscenes-devkit加载数据时,默认的目录结构是:
nuScenes/ ├── maps/ # 地图文件(需另下map包) ├── samples/ # keyframe:CAM_*、LIDAR_TOP、RADAR_*等 ├── sweeps/ # 非keyframe,中间帧数据 ├── v1.0-trainval/ # 标注文件:json、category、attribute等 ├── v1.0-mini/ # mini版本的标注(如果下载了mini) └── can_bus/ # CAN总线数据(可选)如果目录结构不对,nuscenes-devkit加载时会报找不到samples目录,但很多人收到这个报错后第一反应是去重装包,其实只是目录没放对位置。我建议在解压阶段就把目录结构理顺,不要图省事把压缩包直接解压在乱七八糟的路径里。
3.3 一键解压项目源码
这里分享一个我实际在用的解压加校验脚本,可以直接复制用:
#!/bin/bash # 一键解压 nuScenes 分卷zip并校验,extract_nuscenes.sh set -e ZIP_DIR="$1" DEST_DIR="$2" cd "${ZIP_DIR}" # 遍历所有数据集分卷的000号文件,逐个解压 for first_zip in *_000.zip; do echo "Extracting ${first_zip} ..." unzip -o "${first_zip}" -d "${DEST_DIR}" done echo "Extraction completed." # 校验标注文件关键目录是否存在 if [ -d "${DEST_DIR}/samples" ] && [ -d "${DEST_DIR}/sweeps" ]; then echo "[OK] samples and sweeps directories exist." else echo "[WARN] samples/sweeps directory missing, check extraction completeness." fi这段脚本会把当前目录下所有分卷zip按顺序解压到指定目标目录,同时做最基本的完整性检查。它解决的一个核心痛点是:分卷zip按_000、_001命名,如果你手动一个个解压,漏掉任何一个分卷,后面加载数据时就会出现某个样本缺失报错,排查起来非常恶心。
4. 开发环境安装与第一个数据加载示例
4.1 nuscenes-devkit安装与版本坑
解压只是开始,能加载和可视化数据才算真的“跑通”。官方的Python工具包是nuscenes-devkit,直接pip安装:
pip install nuscenes-devkit这里有个非常关键的版本问题:nuScenes的数据集分v1.0和v1.0-mini,旧版devkit只支持v1.0的标注格式,新版devkit(1.1+)对mini版本做了更多支持。如果你的代码是从别人仓库里克隆的,用了旧版api接口,但你的环境装了新版devkit,接口名称变了(比如get_boxes改成get_boxes_with_attributes),照样跑不通。
我的建议是装完先验证一下版本:
import nuscenes print(nuscenes.__version__)如果项目对版本有要求,建议直接按照项目的requirements.txt安装,不要图省事装最新版。
4.2 初始化Nuscenes对象并加载数据样例
目录结构理顺后,初始化Nuscenes对象,官方推荐的加载方式如下:
from nuscenes.nuscenes import NuScenes DATAROOT = "./nuScenes" VERSION = "v1.0-trainval" nusc = NuScenes(version=VERSION, dataroot=DATAROOT, verbose=True)verbose=True会打印数据集样本数量、category种类、scene数量等信息,如果这段信息正常输出,基本上说明数据加载没问题。
接下来随便取一个场景的keyframe,看看传感器数据能不能正常读出来:
# 获取第一个场景 my_scene = nusc.scene[0] first_sample_token = my_scene["first_sample_token"] first_sample = nusc.get("sample", first_sample_token) # 查看该帧的传感器数据 for sensor in ["CAM_FRONT", "LIDAR_TOP", "RADAR_FRONT"]: sensor_token = first_sample["data"][sensor] sensor_data = nusc.get("sample_data", sensor_token) print(f"{sensor}: {sensor_data['filename']}")如果能打印出对应的文件路径,说明标注json和传感器数据对上了,整个数据集已经可以正常使用了。
4.3 数据可视化验证
数据加载成功后,建议做一次可视化验证,确认图像和点云数据没有因为解压问题导致损坏。官方示例代码:
# 渲染某个sample的所有传感器数据 my_sample_token = first_sample_token nusc.render_sample(my_sample_token, out_path="render_sample.png")如果输出了一张6个摄像头图像加lidar点云俯视图拼成的图片,说明解压出来的图像和点云都是可读取的,数据链路已经通了。如果这里报错,比如CV2读取不到文件、或者图像是黑屏,优先检查解压完整性,不要急着在代码层面对线。
5. 常见问题与排查技巧实录
5.1 分卷损坏与下载不全问题
| 现象 | 原因 | 解决办法 |
|---|---|---|
解压时报unzip: invalid compressed data | 某个分卷下载不完整或损坏 | 检查md5,重新下载对应分卷 |
解压时报End-of-central-directory signature not found | 分卷缺失 | 数一下分卷数量是否和官网一致 |
| 解压后没有samples目录 | 压缩包解压不完整 | 用unzip -t检查压缩包完整性后重新解压 |
这个表里的前两个坑我全踩过。尤其是md5校验,强烈建议下载完就跑一遍,别等到解压到99%才发现第37号分卷坏了,前36个分卷的解压时间全白费。官网每个分卷旁边都有md5值,在服务器上可以用md5sum批量比对。
5.2 磁盘空间不足问题
这个问题出现频率极高。很多人的服务器/home分区只有300GB,下载trainval全套之前信誓旦旦,解压到一半就爆盘。两个应对思路:
第一,下载前用df -h确认磁盘剩余空间,给解压后文件预留至少1.5倍空间。第二,如果空间确实紧张,可以下载tar格式的旧版数据包(需要标注版本的完整包),直接流式解压并删除压缩包,减少临时空间占用。但tar包只能下载完整数据集,没有按传感器模态分卷的选项,灵活性差一些。
5.3 加载数据时提示目录不存在
| 报错信息 | 原因 |
|---|---|
[Errno 2] No such file or directory: './nuScenes/samples/...' | dataroot路径没配对,或目录结构不对 |
KeyError: 'v1.0-trainval' | version参数和标注文件目录名不一致 |
AssertionError: samples directory not found | 解压后的samples目录缺失 |
这类问题九成以上是目录结构问题。我建议初始化Nuscenes对象之前,先手动检查一遍:
ls ./nuScenes/v1.0-trainval/ ls ./nuScenes/samples/CAM_FRONT/ | head确认后再跑Python代码。不要一报错就重装环境,浪费时间。
5.4 devkit接口变更导致的坑
我之前把一个老项目的代码从nuscenes-devkit 1.0迁移到1.2,发现原来用的nusc.get_sample_data虽然还能用,但很多属性名和返回结构已经变了。比如新版里get_sample_data返回的空闲标注框多了一个attribute_name字段,如果你的处理代码没有适配,很容易出现索引越界。
排查这类问题,最直接的方法是看官方docs里的API变更记录,或者在Python里用dir()查看对象的所有属性和方法,别靠记忆写代码。
6. 把数据用起来:几件下载解压之外值得做的事
6.1 索引文件预处理
数据解压完别急着开训,先做一个轻量级的索引文件预处理。nuscenes-devkit每次加载NuScenes对象都会把v1.0-trainval下的所有json读进内存,训练集场景850个,json文件不算大,但如果你频繁重启训练脚本,这部分重复加载也有时间成本。
我习惯在数据准备好后,把scene、sample、sample_data、instance几个核心表抽出来转成parquet或者pickle存好,后续做数据加载时直接读预处理文件,省掉每次解析json的耗时。这个操作本身很简单,但能明显加速数据加载阶段的调试循环。
6.2 采样频率与传感器对齐
nuScenes的数据频率是2Hz的keyframe和更高频率的sweeps,摄像头和lidar时间戳不完全对齐。很多做BEV感知的框架会在数据加载阶段做时间戳匹配,找到最近的lidar帧去匹配摄像头帧。如果你在下载解压后第一次写自己的数据加载器,建议先把各传感器的时间戳分布可视化一下,确认时间基准一致。这一步能提前暴露很多后续训练时的对齐问题。
数据链路通了,后面的事情就顺了。说实话,nuScenes这套数据的下载解压流程本身不算复杂,就是步骤多、坑多,每一步都有看似不起眼的小问题等着你。我这里把流程和踩坑记录写出来,就是希望大家不要在第一步浪费太多精力。真正的重头戏,还是把数据加载进来之后怎么设计模型、怎么做预处理、怎么调参,这些才是值得花时间的地方。
本文还有配套的精品资源,点击获取