一、 NAVSIM数据集介绍
NAVSIM 数据集覆盖感知→规划→控制的完整链路,适合端到端模型从开环训练到闭环落地的全流程评测。现在越来越多的端到端自动驾驶方法 (DiffusionDrive)都是基于这个数据集系统进行评估。相比 nuScenes,NAVSIM 数据集在数据规模、场景多样性和标注完整性上都有优势,相信未来会有更多的优秀工作是基于这个基准数据集。
官方 GitHub 网址:https://github.com/autonomousvision/navsim
二、数据集下载痛点问题
由于官方 GitHub中给的下载脚本都是从国外的一些网站 (amazonaws/huggingface)进行爬取下载,我们国内由于网络限制,无法直接下载。
如果挂梯子,下载也会经常不稳定,中断,十分令人头疼…
三、免翻墙高速并行下载方法
为了解决上述痛点问题,直接的思路是利用国内 huggingface 镜像网址进行 NAVSIM 下载。
HuggingFace国内镜像地址:https://hf-mirror.com/datasets/OpenDriveLab/OpenScene/tree/main
最简单的下载方式是直接从上面的镜像地址中逐个下载各个 .tgz 压缩包,然后再本地慢慢解压。当然,这种方式一是不够优雅,其次浏览器下载还是有中断可能,然后需要重新下载。所以,我们接着介绍推荐的高速并行下载方法(网络中断后,也可以保留进度,继续下载)。
NAVSIM数据集主要包含:
-map-trainval-test-mini-private_test_hard-navhard_two_stage-warmup_two_stage-private_test_hard_two_stage其中前三个map/trainval/test为必须下载的部分,分别对应地图、训练集、测试集。map数据比较小,可以直接在上面的镜像地址中下载解压。而 trainval 400多GB,test 200多GB,浏览器直接下载会经常网络中断。这时,我们可以通过 tmux 和 aria2c 来进行并行高速下载。以 trainval为例,一键下载代码如下:
#!/bin/bash# 检测 tmux 是否安装if!command-vtmux&>/dev/null;thenecho"tmux could not be found. Please install tmux to continue."exit1fi# 创建临时下载目录mkdir-p./tmp_download# 创建新的 tmux 会话SESSION_NAME="download_session"tmux new-session-d-s"$SESSION_NAME"-n"main_window"# 定义函数:下载文件到 ./tmp_downloaddownload_file_in_pane(){url=$1filename=$2tmux send-keys-t"$SESSION_NAME""echo Downloading$urlas$filename...; aria2c -x 16 -s 16 -j 8 -d ./tmp_download -o '$filename' '$url'"C-m}# 定义函数:解压并同步数据extract_and_sync_in_pane(){tar_file=$1folder_name=$2# 当前逻辑:解压并保留 .tgztmux send-keys-t"$SESSION_NAME""echo 'Extracting$tar_file...'; tar -xzf '$tar_file' -C ./tmp_download"C-m# 同步解压后的文件到 trainval_sensor_blobs/trainvaltmux send-keys-t"$SESSION_NAME""echo Syncing files from$folder_nameto trainval_sensor_blobs/trainval...; rsync -rv ./tmp_download/$folder_name/ ./trainval_sensor_blobs/trainval"C-m# 清理临时解压目录tmux send-keys-t"$SESSION_NAME""echo Cleaning up$folder_name...; rm -rf ./tmp_download/$folder_name"C-m}# 定义函数:处理单个 split(下载 current 与 history)process_split_in_pane(){split=$1file_name_current="navtrain_current_${split}.tgz"file_name_history="navtrain_history_${split}.tgz"# 下载 current 包download_file_in_pane"https://hf-mirror.com/datasets/OpenDriveLab/OpenScene/resolve/main/navsim/navtrain_current_${split}.tgz""$file_name_current"# 解压并同步 current 包# extract_and_sync_in_pane "./tmp_download/$file_name_current" "navtrain_current_${split}"# 水平分屏,新面板处理 history 包tmux split-window-h-t"$SESSION_NAME"# 下载 history 包download_file_in_pane"https://hf-mirror.com/datasets/OpenDriveLab/OpenScene/resolve/main/navsim/navtrain_history_${split}.tgz""$file_name_history"# 解压并同步 history 包# extract_and_sync_in_pane "./tmp_download/$file_name_history" "navtrain_history_${split}"}# 新建窗口处理 OpenScene 元数据tmux new-window-t"$SESSION_NAME"-n"openscene"download_file_in_pane"https://hf-mirror.com/datasets/OpenDriveLab/OpenScene/resolve/main/openscene-v1.1/openscene_metadata_trainval.tgz""openscene_metadata_trainval.tgz"# 解压并保留 openscene_metadata_trainval.tgz# tmux send-keys -t "$SESSION_NAME" "echo 'Extracting OpenScene metadata...'; tar -xzf ./tmp_download/openscene_metadata_trainval.tgz -C ./tmp_download; mv ./tmp_download/openscene-v1.1/meta_datas trainval_navsim_logs; rm -rf ./tmp_download/openscene-v1.1" C-m# 创建目标目录mkdir-ptrainval_sensor_blobs/trainval# 循环创建窗口并处理 split 1..32,建议每次下载 8 个文件(4个current,4个history),太多可能容易崩掉# 手动替换{}中的内容 1..4/ 5..8/ ....../ 29..32forsplitin{1..4};dotmux new-window-t"$SESSION_NAME"-n"split_${split}"process_split_in_pane"$split"done# 附着到 tmux 会话,实时查看执行情况tmux attach-session-t"$SESSION_NAME"新建一个down_trainval.sh文件,将上述代码复制进去,然后在终端运行:
sh./down_trainval.sh即可开始快速下载!
注意:上述代码的整个流程是先下载“openscene_metadata_trainval.tgz”,然后开始并行下载“navtrain_history_id.tgz" 和 “navtrain_history_id.tgz”,最后再分别解压。考虑到下载的过程中可能会多次中断,所以强烈建议大家先把所有 .tgz 压缩包下载完成后,再统一解压。
上述代码中,解压 .tgz 的相关代码被注释了。下载完所有压缩文件后,需要手动将下载部分代码注释掉,然后取消解压部分代码注释,再次重新运行程序即可实现自动解压。详情见代码注释内容。
四、常见问题:
Q1:在下载过程中网络不稳定,中断了怎么办?
A1:只需要关注 tmp_download文件夹中的 .tgz 和 .aria2文件,.aria2是 aria2c 下载时生成的控制文件,与目标文件同名并加 .aria2 后缀,记录分段、进度与校验信息,用于断点续传。下载成功会自动删除;如果它还在多半未完成或异常,重新执行代码继续下载即可。
Q2: 下载解压完成后,如何验证数据集是否完整?
A2:官方提供了完整数据名称列表的 .yaml文件,用下面的代码进行校验即可,记得修改相关路径:
importyamlimportglobimportosimportpickleimporttqdm# 路径换成官方指定的位置# 训练的yaml_path="navsim/planning/script/config/common/train_test_split/scene_filter/navtrain.yaml"# # 测试的# yaml_path = "navsim/planning/script/config/common/train_test_split/scene_filter/navtest.yaml"withopen(yaml_path,"r")asf:data=yaml.load(f,Loader=yaml.FullLoader)logs=data["log_names"]tokens=data["tokens"]#路径要改成自己的# # 训练的# log_path = "download/trainval_navsim_logs/trainval/"# sensor_data_path = "download/trainval_sensor_blobs/trainval/"# # 测试的# log_path = "/home/server/data1/navsim_workspace/navsim/download/test_navsim_logs/test/"# sensor_data_path = "/home/server/data1/navsim_workspace/navsim/download/test_sensor_blobs/test/"log_path="download/trainval_navsim_logs/meta_datas/trainval"sensor_data_path="download/trainval_sensor_blobs/trainval"log_data_base_name_list=set([os.path.basename(x).split('.pkl')[0]forxinglob.glob(f"{log_path}/*.pkl")])log_data_list=glob.glob(f"{log_path}/*.pkl")# check if all logs are in the log_data_listlog_miss_list=[]forloginlogs:iflognotinlog_data_base_name_list:print(f"Log{log}not found in{log_path}")log_miss_list.append(log)print("Miss log list: ",log_miss_list)# check if all tokens are in the log_data_listforpkl_pathintqdm.tqdm(log_data_list):withopen(pkl_path,"rb")asf:pkl_data=pickle.load(f)forframe_datainpkl_data:token=frame_data["token"]log_name=frame_data["log_name"]iftokennotintokens:continuelidar_path=os.path.join(sensor_data_path,frame_data['lidar_path'])# import pdb; pdb.set_trace()ifnotos.path.exists(lidar_path):print(f"{lidar_path}not found")forcam_name,cam_datainframe_data['cams'].items():curr_cam_path=os.path.join(sensor_data_path,cam_data['data_path'])ifnotos.path.exists(lidar_path):print(f"{curr_cam_path}not found")如果没有校验成功,可能是前面哪个 .tgz没有下载完整,需要重新下载。
Q3:有 trainval部分的下载,那 test的呢?
A3: 有的,有的,兄弟有的。原理和用法和前面的 down_trainval.sh 一样:
#!/bin/bash# 检查是否安装 tmuxif!command-vtmux&>/dev/null;thenecho"tmux could not be found. Please install tmux to continue."exit1fi# 创建临时下载目录mkdir-p./tmp_download# 创建新的 tmux 会话SESSION_NAME="test_download_session"tmux new-session-d-s"$SESSION_NAME"-n"main_window"# 定义函数:下载文件到 ./tmp_downloaddownload_file_in_pane(){url=$1filename=$2tmux send-keys-t"$SESSION_NAME""echo Downloading$urlas$filename...; aria2c -x 16 -s 64 -j 8 -d ./tmp_download -o '$filename' '$url'"C-m}# 定义函数:解压并同步extract_and_sync_in_pane(){tar_file=$1folder_name=$2tmux send-keys-t"$SESSION_NAME""echo 'Extracting$tar_file...'; tar -xzf '$tar_file' -C ./tmp_download; rm '$tar_file'"C-m# 同步到目标目录tmux send-keys-t"$SESSION_NAME""echo Syncing files from$folder_nameto test_sensor_blobs...; rsync -rv ./tmp_download/$folder_name/ ./test_sensor_blobs"C-m# 清理解压目录tmux send-keys-t"$SESSION_NAME""echo Cleaning up$folder_name...; rm -rf ./tmp_download/$folder_name"C-m}# 定义函数:处理一个 split(包含 camera 和 lidar)process_split_in_pane(){split=$1file_name_camera="openscene_sensor_test_camera_${split}.tgz"file_name_lidar="openscene_sensor_test_lidar_${split}.tgz"# 当前面板下载 cameradownload_file_in_pane"https://hf-mirror.com/datasets/OpenDriveLab/OpenScene/resolve/main/openscene-v1.1/openscene_sensor_test_camera/$file_name_camera""$file_name_camera"# 解压时的代码,记得取消注释# extract_and_sync_in_pane "./tmp_download/$file_name_camera" "openscene_sensor_test_camera_${split}"# 新开分屏下载 lidartmux split-window-h-t"$SESSION_NAME"# 新面板下载 lidardownload_file_in_pane"https://hf-mirror.com/datasets/OpenDriveLab/OpenScene/resolve/main/openscene-v1.1/openscene_sensor_test_lidar/$file_name_lidar""$file_name_lidar"# 解压时的代码,记得取消注释# extract_and_sync_in_pane "./tmp_download/$file_name_lidar" "openscene_sensor_test_lidar_${split}"}# 第一步:下载 metadatatmux new-window-t"$SESSION_NAME"-n"metadata"download_file_in_pane"https://hf-mirror.com/datasets/OpenDriveLab/OpenScene/resolve/main/openscene-v1.1/openscene_metadata_test.tgz""openscene_metadata_test.tgz"# 解压时的代码,记得取消注释# tmux send-keys -t "$SESSION_NAME" "echo 'Extracting metadata...'; tar -xzf ./tmp_download/openscene_metadata_test.tgz -C ./tmp_download; rm ./tmp_download/openscene_metadata_test.tgz; mv ./tmp_download/openscene-v1.1/meta_datas test_navsim_logs; rm -rf ./tmp_download/openscene-v1.1" C-m# 创建目标目录mkdir-ptest_sensor_blobs# 第二步:并行下载 splits(每个 split = 新窗口 + 2 个面板)forsplitin{0..31};dotmux new-window-t"$SESSION_NAME"-n"split_${split}"process_split_in_pane"$split"done# 附着到 tmux 会话tmux attach-session-t"$SESSION_NAME"