コース進捗 コース目次 34レッスン中 34件を公開中
第0部―まず地図を広げる
第1部―簡単な目的で、なぜ動画が分かるのか
第2部―一本の動画を一台のエンコーダーへ
第3部―実験を読めてこそ、論文を読んだと言える
第4部―公式リポジトリから自分の実験へ
第5部―表現を世界モデル構想へ戻す
付録―必要なときに開く技術リュック
10本の長編から16枚へ
- URL 10本街歩き動画
- 取得720p 約25 GB
- 抽出15 fps・短辺384
- Lance約33 GB
- 無作為動画窓16枚、約2.1秒
厚い旅行アルバムの棚
厚いアルバム10冊を毎回机へ運ぶのは大変です。写真を順番に引き出しへ収め、128枚ごとに「同じ旅」の札を付けます。学習では一つの引き出しを選び、一枚おきに16枚を取ります。次の動画へまたぐ事故も防げます。
URL から Lance まで
Walking Tours が配布するのは YouTube URL で、動画ファイルそのものではありません。固定スクリプトは1–7時間ほどの一人称動画10本を取得し、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
構築時は元動画ごとの実測フレームレートから間引き幅を計算します。9本は約60 fps、Wildlife は約30 fpsですが、どちらも保存時には約 15 fps になります。各フレームを短辺384画素へ縮小し、JPEG品質90で保存します。連続する128フレーム、約8.5秒が一つのエピソードです。Lance の一行は episode_idx:int32、step_idx:int32、frame:binary、h/w:int16、label:int16 で、ラベルがないため値は -1 です。エピソード順に並べなければ、データ読み込み器が境界を取り違えます。
128フレームに満たない動画末尾は書き込みません。エピソードの復号に失敗した場合は failed に数えて飛ばし、成功した分だけに連番を振ります。終了コードが0というだけで安心せず、10ファイルそれぞれの容量、元URL、実測フレームレート、エピソード数、最後の failed の値を保存します。元動画が差し替わったときに照合できる、データの指紋になります。
既定の学習では、15 fpsの倉庫から num_frames=16、frame_stride=2 で取り出すため、実効フレームレートは約7.5 fps、時間幅は約2.1秒です。開始点は一つのエピソード内に収まり、データ読み込み器は選ばれた行だけを読みます。設定ファイルの注記にある6,067エピソードは、著者が構築した時点の値です。変化し得るウェブ上の元動画に対する形式上の保証ではありません。
添字は start + [0,2,4,…,30] です。実装は span=16×2=32 で長さを判定し、既定の pad_short=false では短いエピソードを除きます。詰め物を有効にすると、最終フレームを繰り返します。各有効エピソードから一周につき clips_per_video=200 回抽出します。これは抽選回数であり、独立した動画が200本増えるわけではありません。近接する動画窓どうしは強く相関するため、下流評価の分割は元動画単位で行います。
別の場所へ保存するならコードを直しません。
LEVJEPA_DATA_ROOT=/mnt/levjepa-data uv run python main.py --cfg job
データ読み込み器は $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より大きく、六つの列からなる想定どおりの構造であることを確かめます。構築記録の failed=0 と、複数の episode_idx があることも確認します。一つの巨大なエピソードしかなければ、並べ替えか索引付けの故障です。
データの領収書
三つの保管規則
- データページはURLを配り、スクリプトが約25 GBの動画を取得します。
- 約15 fps、128フレーム単位のエピソードとして Lance に格納し、学習時には2フレームおきに16枚を取ります。
- 約33 GB、6,067エピソードという値は著者の保存時点の記録であり、不変の保証ではありません。
倉庫番への質問
- Wildlife に60 fps動画と同じ固定の間引き幅を使えない理由は。
- 既定の16フレーム動画窓は約何秒を覆いますか。
- Lance へ書き込む前に行を無作為に並べ替えてはいけない理由は。
答え
- Wildlife は約30 fpsなので、同じ幅では保存時のフレームレートが半分になるからです。
- 約2.1秒。
- データ読み込み器が連続する
episode_idxの変化から境界を探すため、順序を乱すとエピソードを誤って結合・分割するからです。