Habitat 训练数据准备
简体中文 | English
本文的数据生产方法参考
StreamVLN:在 Matterport3D(MP3D)场景中
运行 Habitat,使用 ShortestPathFollower 沿 VLN-CE Episode 的 reference_path 生成离散
动作与 RGB observation。实际生产使用 SwiftVLN 自带的 trajectory generation CLI,不需要
安装 StreamVLN。
R2R 固定使用
R2R_VLNCE_v1-3。不要使用R2R_VLNCE_v1,也不要混用旧版 R2R trajectory annotation。
本文生产以下三组训练数据:
数据集 |
VLN-CE Episode |
训练轨迹数 |
下载链接 |
|---|---|---|---|
R2R |
|
10,819 |
|
RxR |
|
19,990 |
|
EnvDrop |
|
146,304 |
1. 准备生成环境
完成环境安装后,进入 Habitat 评测环境:
cd "${SWIFTVLN_ROOT}"
conda activate swiftvln-eval
swiftvln generate-habitat-trajectories --help
swiftvln validate-habitat-trajectories --help
该 CLI 使用 SwiftVLN 的 Habitat 配置,生成参数为:
参数 |
值 |
|---|---|
RGB 分辨率 |
|
前进步长 |
|
转向角 |
|
Expert |
Habitat |
最长轨迹 |
498 个 observation-action pair |
swiftvln generate-habitat-trajectories 默认使用单进程,适合单 Episode smoke。完整 R2R、
RxR 和 EnvDrop 应使用 torchrun 并行生成;尤其是 EnvDrop 包含 146,304 个 Episode,并会
产生约千万张 RGB,单进程生产会持续很久。
2. 准备 MP3D 场景
按照 Matterport3D 官方说明申请并下载 Habitat 场景文件,将 90 个场景保存至:
/path/to/streamvln_datasets/scene_datasets/mp3d/
场景目录格式如下:
scene_datasets/mp3d/
├── 17DRP5sb8fy/
│ ├── 17DRP5sb8fy.glb
│ └── 17DRP5sb8fy.navmesh
├── 1LXtFkjw3qL/
└── ...
3. 准备 VLN-CE Episode
安装下载工具并创建数据目录:
conda activate swiftvln-eval
python -m pip install gdown
mkdir -p /path/to/streamvln_datasets/datasets
cd /path/to/streamvln_datasets/datasets
3.1 R2R v1-3
从 VLN-CE 数据页下载
R2R_VLNCE_v1-3.zip:
gdown --id 1T9SjqZWyR2PCLSXYkFckfDeIs6Un0Rjm
unzip R2R_VLNCE_v1-3.zip
mv R2R_VLNCE_v1-3 r2r
训练 Episode 路径为:
datasets/r2r/train/train.json.gz
3.2 RxR v0
下载 RxR_VLNCE_v0.zip:
gdown --id 145xzLjxBaNTbVgBfQ8e9EsBAV8W-SM0t
unzip RxR_VLNCE_v0.zip
mv RxR_VLNCE_v0 rxr
下载包提供 multilingual guide train split:
datasets/rxr/train/train_guide.json.gz
生成时使用 --instruction-language en 选取其中 19,996 个英语 Episode。生成器按照
StreamVLN 的数据规则移除动作数超过 498 的 6 条轨迹,最终保留 19,990 条训练轨迹。
3.3 EnvDrop
下载 R2R_VLNCE_v1-3_preprocessed.zip:
gdown --id 1fo8F4NKgZDH-bPSdVU3cONAkt5EW-tyr
unzip R2R_VLNCE_v1-3_preprocessed.zip
mv R2R_VLNCE_v1-3_preprocessed/envdrop envdrop
训练 Episode 路径为:
datasets/envdrop/envdrop.json.gz
4. 生成 R2R 轨迹
先生成一个 Episode,检查 Habitat、MP3D 和 VLN-CE Episode 是否能够正常加载:
swiftvln generate-habitat-trajectories \
--dataset r2r \
--data-path /path/to/streamvln_datasets/datasets/r2r/train/train.json.gz \
--scenes-dir /path/to/streamvln_datasets/scene_datasets \
--output-dir /path/to/streamvln_datasets/smoke/R2R \
--episode-id 1
完整生产使用一张 GPU 对应一个进程。以下命令使用 8 张 GPU;使用其他 GPU 数量时同步修改
--nproc_per_node:
torchrun --standalone --nproc_per_node=8 \
-m swiftvln.data.habitat_trajectory \
--dataset r2r \
--data-path /path/to/streamvln_datasets/datasets/r2r/train/train.json.gz \
--scenes-dir /path/to/streamvln_datasets/scene_datasets \
--output-dir /path/to/streamvln_datasets/trajectory_data/R2R
每个 rank 创建独立的 Habitat Env,并按照 scene 分组后使用
episodes[rank::world_size] 分配 Episode。各 rank 完成后,rank 0 自动合并
annotations_<rank>.json,生成训练入口 annotations.json。
5. 生成 RxR 轨迹
torchrun --standalone --nproc_per_node=8 \
-m swiftvln.data.habitat_trajectory \
--dataset rxr \
--data-path /path/to/streamvln_datasets/datasets/rxr/train/train_guide.json.gz \
--instruction-language en \
--scenes-dir /path/to/streamvln_datasets/scene_datasets \
--output-dir /path/to/streamvln_datasets/trajectory_data/RxR
6. 生成 EnvDrop 轨迹
torchrun --standalone --nproc_per_node=8 \
-m swiftvln.data.habitat_trajectory \
--dataset envdrop \
--data-path /path/to/streamvln_datasets/datasets/envdrop/envdrop.json.gz \
--scenes-dir /path/to/streamvln_datasets/scene_datasets \
--output-dir /path/to/streamvln_datasets/trajectory_data/EnvDrop
任务中断后,使用相同的进程数和输出目录,并增加 --resume。生成器会读取每个 rank 的
annotation shard 或 journal,跳过已经完成的 Episode:
torchrun --standalone --nproc_per_node=8 \
-m swiftvln.data.habitat_trajectory \
--dataset envdrop \
--data-path /path/to/streamvln_datasets/datasets/envdrop/envdrop.json.gz \
--scenes-dir /path/to/streamvln_datasets/scene_datasets \
--output-dir /path/to/streamvln_datasets/trajectory_data/EnvDrop \
--resume
7. 轨迹格式
每个数据集的输出目录包含:
trajectory_data/R2R/
├── annotations.json
├── annotations_0.json
├── annotations_1.json
├── ...
├── generation_summary.json
├── generation_summary_0.json
├── generation_summary_1.json
└── images/
└── 1LXtFkjw3qL_r2r_000087/
└── rgb/
├── 001.jpg
├── 002.jpg
└── ...
单条 annotation 格式如下:
{
"id": 87,
"video": "images/1LXtFkjw3qL_r2r_000087",
"instructions": ["Walk past the table and stop near the doorway."],
"actions": [-1, 1, 1, 2, 1]
}
字段 |
说明 |
|---|---|
|
VLN-CE Episode ID |
|
Episode 图像目录相对于当前 trajectory 根目录的路径 |
|
导航指令列表 |
|
与 RGB 帧一一对应的 Habitat 离散动作 |
动作编码如下:
ID |
Action |
|---|---|
-1 |
|
0 |
|
1 |
|
2 |
|
3 |
|
每条轨迹满足:
JPEG 数量 = len(actions)
SwiftVLN 训练时移除开头的 INIT,并在序列末尾补充 STOP。
8. 校验轨迹
使用 SwiftVLN 校验器检查 annotation 字段、Episode ID、动作编码、图像目录、孤立目录以及 逐轨迹的 RGB/action 数量:
swiftvln validate-habitat-trajectories \
--data-dir /path/to/streamvln_datasets/trajectory_data/R2R \
--expected-count 10819
swiftvln validate-habitat-trajectories \
--data-dir /path/to/streamvln_datasets/trajectory_data/RxR \
--expected-count 19990
swiftvln validate-habitat-trajectories \
--data-dir /path/to/streamvln_datasets/trajectory_data/EnvDrop \
--expected-count 146304
增加 --decode-images 可以逐张解码 JPEG;完整数据解码会显著增加校验时间。
9. 整理目录并配置 SwiftVLN
完成生成后,目录结构如下:
streamvln_datasets/
├── datasets/
│ ├── r2r/train/train.json.gz
│ ├── rxr/train/train_guide.json.gz
│ └── envdrop/envdrop.json.gz
├── scene_datasets/
│ └── mp3d/<scene-id>/<scene-id>.glb
└── trajectory_data/
├── R2R/
│ ├── annotations.json
│ └── images/<episode>/rgb/*.jpg
├── RxR/
│ ├── annotations.json
│ └── images/<episode>/rgb/*.jpg
└── EnvDrop/
├── annotations.json
└── images/<episode>/rgb/*.jpg
在 ${SWIFTVLN_ROOT}/.local/env.sh 中设置训练路径:
export SWIFTVLN_HABITAT_DATA_ROOT="/path/to/streamvln_datasets"
export SWIFTVLN_HABITAT_R2R_TRAIN_PATH="${SWIFTVLN_HABITAT_DATA_ROOT}/trajectory_data/R2R"
export SWIFTVLN_HABITAT_RXR_TRAIN_PATH="${SWIFTVLN_HABITAT_DATA_ROOT}/trajectory_data/RxR"
export SWIFTVLN_HABITAT_ENVDROP_TRAIN_PATH="${SWIFTVLN_HABITAT_DATA_ROOT}/trajectory_data/EnvDrop"
训练时通过 VLN_DATA_PATH 选择数据组合:
export VLN_ENV_TYPE=habitat
export VLN_DATA_PATH="${SWIFTVLN_HABITAT_R2R_TRAIN_PATH},${SWIFTVLN_HABITAT_RXR_TRAIN_PATH},${SWIFTVLN_HABITAT_ENVDROP_TRAIN_PATH}"
数据配置完成后,进入 SwiftVLN 训练。