【VLNs篇】13:JanusVLN 数据说明

本文档详细说明 JanusVLN 项目中使用的数据集、数据格式、数据处理流程以及如何准备和配置数据。
目录
- 数据集概述
- 数据目录结构
- 数据集详细说明
- 数据格式规范
- 数据处理流程
- 数据准备步骤
- 数据配置
数据集概述
JanusVLN 使用三类数据集进行训练:
1. 基础数据集 (Base Dataset)
-
R2R-CE (Room-to-Room Continuous Environment)
- 场景: Matterport3D (MP3D)
- 语言: 英语
- 规模: ~14k 训练轨迹
-
RxR-CE (Room-across-Room Continuous Environment)
- 场景: Matterport3D (MP3D)
- 语言: 英语、印地语、泰卢固语 (本项目使用英语)
- 规模: ~70k 训练轨迹
2. 扩展数据集 (Extra Dataset)
-
ScaleVLN
- 场景: HM3D (Habitat-Matterport 3D)
- 规模: 150k 子集
- 用途: 大规模预训练
-
DAgger 数据
- R2R DAgger: 从 R2R-CE 基础模型收集
- RxR DAgger: 从 RxR-CE 基础模型收集
- 用途: 改善模型的在线学习能力
数据目录结构
完整的数据目录组织如下:
data/
├── datasets/ # VLN-CE 原始数据集
│ ├── r2r/
│ │ ├── train/
│ │ │ ├── train.json.gz # R2R 训练集 episodes
│ │ │ └── train_gt.json.gz # R2R ground truth (用于 DAgger)
│ │ ├── val_seen/
│ │ │ └── val_seen.json.gz # R2R 验证集 (seen)
│ │ └── val_unseen/
│ │ └── val_unseen.json.gz # R2R 验证集 (unseen)
│ │
│ ├── rxr/
│ │ ├── train/
│ │ │ ├── train_guide.json.gz # RxR 训练集 (guide)
│ │ │ ├── train_guide_gt.json.gz # RxR ground truth (用于 DAgger)
│ │ │ ├── train_guide_en.json.gz # 英语指令
│ │ │ └── ...
│ │ ├── val_seen/
│ │ │ └── val_seen_guide.json.gz
│ │ └── val_unseen/
│ │ └── val_unseen_guide.json.gz
│ │
│ └── scalevln/
│ └── scalevln_subset_150k.json.gz # ScaleVLN 子集
│
├── scene_datasets/ # 3D 场景数据
│ ├── mp3d/ # Matterport3D 场景
│ │ ├── 17DRP5sb8fy/ # 场景 ID
│ │ │ ├── 17DRP5sb8fy.glb
│ │ │ ├── 17DRP5sb8fy.house
│ │ │ ├── 17DRP5sb8fy.navmesh
│ │ │ └── ...
│ │ ├── 1LXtFkjw3qL/
│ │ └── ...
│ │
│ └── hm3d/ # Habitat-Matterport3D 场景
│ ├── train/
│ │ ├── 00000-kfPV7w3FaU5/
│ │ ├── 00001-UVdNNRcVyV1/
│ │ └── ...
│ └── ...
│
├── trajectory_data/ # 预收集的观察-动作轨迹数据
│ ├── R2R-CE-640x480/
│ │ └── images/
│ │ ├── {episode_id}/
│ │ │ ├── {step_id}_move_forward.png
│ │ │ ├── {step_id}_turn_left.png
│ │ │ └── ...
│ │
│ ├── RxR-CE-640x480/
│ │ └── images/
│ │ └── (同上结构)
│ │
│ └── ScaleVLN/
│ ├── images/
│ │ └── {scene_name}/
│ │ └── rgb/
│ │ ├── 0000.jpg
│ │ ├── 0001.jpg
│ │ └── ...
│ └── annotations.json # ScaleVLN 标注文件
│
└── dagger_data/ # DAgger 收集的数据├── R2R/│ ├── images/│ │ └── {scene_name}/│ │ └── rgb/│ │ └── *.jpg│ └── annotations.json│└── RxR/├── images/└── annotations.json
数据集详细说明
R2R-CE (Room-to-Room)
来源: VLN-CE GitHub
特点:
- 基于 Matterport3D 场景
- 每条指令约 3-5 句话
- 平均路径长度: ~10米
- 动作空间: MOVE_FORWARD (0.25m), TURN_LEFT (15°), TURN_RIGHT (15°), STOP
Episode 格式:
{"episode_id": "123","scene_id": "mp3d/17DRP5sb8fy/17DRP5sb8fy.glb","start_position": [x, y, z],"start_rotation": [x, y, z, w],"goals": [{"position": [x, y, z], "radius": 3.0}],"instruction": {"instruction_text": "Walk forward and turn left...","instruction_tokens": [...]},"trajectory_id": "456","reference_path": [[x1, y1, z1], [x2, y2, z2], ...]
}
RxR-CE (Room-across-Room)
来源: RxR GitHub
特点:
- 基于 Matterport3D 场景
- 多语言支持 (英语、印地语、泰卢固语)
- 更长更详细的指令 (平均 85 个词)
- 更长的路径 (平均 ~23米)
- 提供 “guide” 和 “guide_gt” 版本
数据分片:
train_guide_en.json.gz: 英语训练指令train_guide_gt.json.gz: Ground truth 路径 (用于专家监督)
ScaleVLN
来源: StreamVLN
特点:
- 基于 HM3D 场景
- 大规模数据集 (本项目使用 150k 子集)
- 用于增强模型的泛化能力
数据格式:
{"id": "episode_id","video": "hm3d/scene_name","instructions": ["Navigate to the bedroom..."],"actions": [0, 1, 2, 3, 1, 0] // 动作序列
}
DAgger 数据
生成方式: 使用训练好的基础模型在 Habitat 仿真环境中进行推理收集
关键参数 (在 scripts/dagger.sh 中配置):
DAGGER_UPDATE_SIZE=160000 # 收集样本数量
DAGGER_COMMIT_FREQ=50 # 每 50 次更新保存一次
DAGGER_P=0 # 0=纯模型推理, >0=混合专家策略
数据格式: 同 ScaleVLN 格式
数据格式规范
训练数据格式 (JSON)
经过 create_data/create_data.py 处理后,生成统一的训练格式:
[{"id": "episode_id/image_filename","conversations": [{"from": "human","value": "You are a visual language navigation model...\n This is your historical observation:<image><image><image>\n This is your current observation:<image>\n Your task is to {instruction}\n You should take one of the following actions:\n MOVE_FORWARD\n TURN_LEFT\n TURN_RIGHT\n STOP."},{"from": "gpt","value": "MOVE_FORWARD"}],"images": ["path/to/history_image_1.png","path/to/history_image_2.png","path/to/history_image_3.png","path/to/current_image.png"]},...
]
关键字段说明
- id: 唯一标识符, 格式为
{episode_id}/{image_filename} - conversations: 对话格式
from: "human": 用户输入, 包含历史观察、当前观察和任务指令from: "gpt": 模型输出动作
- images: 图像路径列表
- 前 N-1 张为历史观察
- 最后 1 张为当前观察
- 历史观察数量: 最多 8 张 (可配置
max_history_images)
图像采样策略
max_history_images = 8if current_step <= max_history_images:# 如果步数 <= 8, 使用所有历史图像idxs = list(range(current_step + 1))
else:# 如果步数 > 8, 线性采样 9 张图像 (包括当前)idxs = np.linspace(0, current_step, 9, dtype=int).tolist()
数据处理流程
1. 数据收集流程
VLN-CE Episodes (json.gz)+
3D Scene Data (glb/navmesh)↓
Habitat Simulator↓
Observation-Action Trajectory↓
Images + Annotations (trajectory_data/)
2. 数据构建流程
# 构建基础数据集
python create_data/create_data.py
# 输出: train_r2r_rxr.json# 构建扩展数据集
python create_data/create_data.py --use_extra_data
# 输出: train_r2r_rxr_extra.json
处理步骤:
-
加载原始数据
- R2R:
data/datasets/r2r/train/train.json.gz - RxR:
data/datasets/rxr/train/train_guide.json.gz - ScaleVLN:
data/trajectory_data/ScaleVLN/annotations.json - DAgger:
data/dagger_data/{R2R,RxR}/annotations.json
- R2R:
-
处理每个 Episode
- 读取图像序列
- 采样历史图像
- 构造对话格式
- 提取动作标签
-
并行处理
- 使用
ProcessPoolExecutor并行处理 - 显示 tqdm 进度条
- 使用
-
保存结果
- 保存为 JSON 格式
- 记录总样本数
3. DAgger 收集流程
# 收集 DAgger 数据
bash scripts/dagger.sh
流程:
- 加载基础模型检查点
- 在 Habitat 环境中运行 episodes
- 使用
ShortestPathFollower作为专家 - 收集模型推理的观察和专家动作
- 保存图像和标注
数据准备步骤
Step 1: 下载场景数据
Matterport3D (用于 R2R 和 RxR)
- 访问 Matterport3D 官方页面
- 申请并下载场景数据
- 解压到
data/scene_datasets/mp3d/
HM3D (用于 ScaleVLN)
- 访问 HM3D GitHub
- 下载
trainsplit - 解压到
data/scene_datasets/hm3d/train/
Step 2: 下载 VLN-CE Episodes
# R2R-CE
wget https://drive.google.com/file/d/1fo8F4NKgZDH-bPSdVU3cONAkt5EW-tyr/view
# 重命名: R2R_VLNCE_v1-3_preprocessed/ -> r2r/
mv R2R_VLNCE_v1-3_preprocessed data/datasets/r2r# RxR-CE
wget https://drive.google.com/file/d/145xzLjxBaNTbVgBfQ8e9EsBAV8W-SM0t/view
# 重命名: RxR_VLNCE_v0/ -> rxr/
mv RxR_VLNCE_v0 data/datasets/rxr
Step 3: 下载预收集的轨迹数据
从 ModelScope 下载:
R2R-CE-640x480.tar.gzRxR-CE-640x480.tar.gzScaleVLN.tar.gz
解压到相应目录:
tar -xzf R2R-CE-640x480.tar.gz -C data/trajectory_data/
tar -xzf RxR-CE-640x480.tar.gz -C data/trajectory_data/
tar -xzf ScaleVLN.tar.gz -C data/trajectory_data/
Step 4: 下载 DAgger 数据 (可选)
如果不想自己收集 DAgger 数据,可以直接下载预收集的数据:
# 从 ModelScope 下载
tar -xzf R2R_DAgger.tar.gz -C data/dagger_data/
tar -xzf RxR_DAgger.tar.gz -C data/dagger_data/
或者使用基础模型自行收集:
bash scripts/dagger.sh
Step 5: 构建训练数据集
# 基础数据集 (R2R + RxR)
python create_data/create_data.py# 扩展数据集 (+ ScaleVLN + DAgger)
python create_data/create_data.py --use_extra_data
数据配置
配置数据集路径
编辑 src/qwen_vl/data/__init__.py:
# 取消注释并配置基础数据集
TRAIN_R2R_RxR = {"annotation_path": "train_r2r_rxr.json", # 由 create_data.py 生成"data_path": "","tag": "train_r2r_rxr"
}# 取消注释并配置扩展数据集
TRAIN_R2R_RxR_EXTRA = {"annotation_path": "train_r2r_rxr_extra.json", # 由 create_data.py --use_extra_data 生成"data_path": "","tag": "train_r2r_rxr_extra"
}# 添加到 data_dict
data_dict = {# ... 其他数据集 ..."train_r2r_rxr": TRAIN_R2R_RxR,"train_r2r_rxr_extra": TRAIN_R2R_RxR_EXTRA
}
训练脚本配置
在 scripts/train.sh 中指定使用的数据集:
# 基础训练
DATASETS="train_r2r_rxr"# 扩展训练
DATASETS="train_r2r_rxr_extra"
数据采样率
支持通过后缀指定采样率:
# 使用 50% 的数据
DATASETS="train_r2r_rxr%50"# 使用 10% 的数据
DATASETS="train_r2r_rxr%10"
数据统计
数据规模
| 数据集 | Episodes | 平均步数 | 总样本数 (估计) |
|---|---|---|---|
| R2R-CE Train | ~14k | 6 | ~84k |
| RxR-CE Train | ~70k | 8 | ~560k |
| ScaleVLN (150k) | 150k | 10 | ~1.5M |
| DAgger R2R | ~14k | 6 | ~84k |
| DAgger RxR | ~70k | 8 | ~560k |
| 基础总计 | ~84k | - | ~644k |
| 扩展总计 | ~318k | - | ~2.8M |
动作分布
在 VLN 任务中,动作分布通常为:
- MOVE_FORWARD: ~60%
- TURN_LEFT: ~15%
- TURN_RIGHT: ~15%
- STOP: ~10%
图像规格
- 分辨率: 640 × 480
- 格式: PNG (VLN-CE) / JPG (ScaleVLN, DAgger)
- 视场角 (HFOV): 79°
- 深度范围: 0.0 - 10.0m (如果使用深度)
参考资源
- VLN-CE 论文
- RxR 论文
- ScaleVLN/StreamVLN 论文
- Habitat 文档
- Matterport3D 数据集
- JanusVLN代码
