课程进度 课程大纲 已发布 34/34 课
第 0 部分——先拿到地图
第 1 部分——为什么简单目标会学会看视频
第 2 部分——把一段视频送进单编码器
第 3 部分——会读实验,才算读懂论文
第 4 部分——从官方仓库到自己的实验
第 5 部分——把表征接回世界模型路线
附录——随用随查的技术背包
十段长视频怎样变成两秒小片段
- 10 个链接长时城市漫步
- 下载720p 视频约 25 GB
- 抽帧15 fps、短边 384
- Lance约 33 GB 帧仓库
- 随机 clip16 帧约 2.1 秒
先装抽屉,再从抽屉里取照片
十本很厚的旅行相册不适合每次整本搬上桌。先按顺序把照片装进抽屉,每 128 张贴一个“同一段旅程”的标签。训练时随机选一个抽屉,隔一张取一张,共拿 16 张;这样既快,也不会误跨到下一段视频。
从十个 URL 走到 Lance 帧仓库
Walking Tours 数据集发布的是 YouTube URL,不是视频文件。冻结脚本下载十段约 1–7 小时的第一视角视频,优先取 720p60、无音频,总量约 25 GB。网络内容可能下架或受地区限制;下载前应确认来源条款、研究用途和本地剩余空间,建议为下载与约 33 GB 的 Lance 成品预留至少 70 GB。
uv sync --extra data
bash scripts/download_walking_tours.sh
uv run python scripts/build_lance_walking_tours.py --workers 16
第二步按每个源视频的实际帧率计算步长:九段约 60 fps,Wildlife 约 30 fps,统一存为约 15 fps。每帧缩到短边 384、JPEG quality 90;连续 128 帧成为约 8.5 秒的 episode。Lance 每行字段为 episode_idx:int32、step_idx:int32、frame:binary、h/w:int16、label:int16,无标签所以 label=-1。loader 靠连续的 episode 编号识别边界,因此行序一旦打乱,片段也会被错误合并或拆开。
构建器只写完整的 128 帧 episode,每段视频末尾不足 128 帧的尾巴不会写入。某个 episode 解码失败时会计入 failed 并跳过,成功 episode 再连续编号。因此“脚本退出码为 0”之外,还应保存十个下载文件的大小、源 URL、实际 fps、每视频 episode 数和最终 failed。日后源视频被替换时,这些就是判断数据是否还是同一份的指纹。
默认训练从 15 fps 仓库中取 num_frames=16、frame_stride=2,等效约 7.5 fps、覆盖约 2.1 秒。loader 把随机起点限制在同一个 episode 内,只读取被选中的行。配置注释记录作者当时构建得到 6,067 个 episode;网络源可能变化,所以本地日志才是这次数据版本的实际计数。
具体索引是 start + [0,2,4,…,30]。实现用 span=16×2=32 判断 episode 是否够长,默认 pad_short=false 会丢弃过短 episode;启用 padding 则重复最后一帧。每个有效 episode 在一个 epoch 被随机抽 clips_per_video=200 次,这扩充的是抽样次数,不是新增 200 个独立视频。近邻 clip 高度相关,若监督评估按 clip 随机切分,同一场景就可能同时出现在训练与测试;按源视频分组可以挡住这类泄漏。
数据放在别处时,可用环境变量告诉 loader 地址:
LEVJEPA_DATA_ROOT=/mnt/levjepa-data uv run python main.py --cfg job
loader 将寻找 $LEVJEPA_DATA_ROOT/walking_tours/train.lance。若输出目录已存在,构建脚本会主动停止;保留旧数据并换一个 --out 路径,比盲目删除安全。
打开仓库,数一数抽屉
uv run python - <<'PY'
import lance
ds = lance.dataset("data/walking_tours/train.lance")
print(ds.count_rows())
print(ds.schema)
PY
预期行数大于 0,schema 含上述六列。还要核对构建日志的 failed 为 0、episode_idx 有多个取值;仅看到一个巨大 episode 表示排序或索引坏了。
下载、构建与读取的路线图
把数据卡夹进实验记录
- Walking Tours 页面给 URL,下载脚本才取得约 25 GB 视频。
- 仓库按 15 fps、128 帧 episode 写 Lance;训练再以 stride 2 抽 16 帧。
- 约 33 GB 和 6,067 episodes 是作者快照,不是永远不变的保证。
检查有没有跨错抽屉
- 为什么 Wildlife 不能与 60 fps 视频使用同一个固定抽帧步长?
- 默认 16 帧训练 clip 大约覆盖多久?
- 为什么不能先把 Lance 行打乱再写入?
查看答案
- 它约为 30 fps;固定步长会让其存储帧率减半。
- 约 2.1 秒。
- loader 通过连续的
episode_idx变化找边界,乱序会错误合并或拆分 episode。