JEPA4Japan · チュートリアル

第22章―Walking Tours:10本の長編を学習データにするまで

1,616文字 5分で読めます #LeVJEPA#JEPA#自己教師あり動画学習#SIGReg

取得、15 fpsでの抽出、Lanceへの保存、エピソード境界、無作為な動画窓、データ費用を追います。

コース進捗 コース目次 34レッスン中 34件を公開中

第0部―まず地図を広げる

  1. 01 第0章―始める前に:この講座でできるようになること 公開中
  2. 02 第1章―同じ動画を、二つの窓から見る 公開中
  3. 03 第2章―Yann LeCun の研究路線をたどる 公開中
  4. 04 第3章―名前に迷わないための JEPA 家系図 公開中

第1部―簡単な目的で、なぜ動画が分かるのか

  1. 05 第4章―動画は自分で問題を作れる 公開中
  2. 06 第5章―全ピクセルではなく、意味を残す 公開中
  3. 07 第6章―二枚は同じに。でも全部を白紙にはしない 公開中
  4. 08 第7章―SIGReg:点の雲を影から調べる 公開中
  5. 09 第8章―一行の目的関数で LeVJEPA を読む 公開中

第2部―一本の動画を一台のエンコーダーへ

  1. 10 第9章―大域ビューと局所ビューの作り方 公開中
  2. 11 第10章―動画を時空間の小片に切る 公開中
  3. 12 第11章―一台のエンコーダー、一つの投影ヘッド、一枚の要約札 公開中
  4. 13 第12章―一回の前向き計算を端から端まで 公開中
  5. 14 第13章―95%捨てると、なぜかよく見える 公開中
  6. 15 第14章―ブロック因果注意:同じ時刻は見える、未来は見えない 公開中
  7. 16 第15章―RoPE、1フレーム tubelet、思いがけない密特徴 公開中

第3部―実験を読めてこそ、論文を読んだと言える

  1. 17 第16章―五段のアブレーションが答えること 公開中
  2. 18 第17章―同じ周回数は、同じ費用ではない 公開中
  3. 19 第18章―ImageNet、K400、SSv2 は何を試すか 公開中
  4. 20 第19章―論文の結果を帳簿にする 公開中
  5. 21 第20章―まだ言ってはいけない結論 公開中

第4部―公式リポジトリから自分の実験へ

  1. 22 第21章―公式リポジトリの見取り図 公開中
  2. 23 第22章―Walking Tours:10本の長編を学習データにするまで 現在のレッスン
  3. 24 第23章―既定設定を読み、学習を始める 公開中
  4. 25 第24章―うそをつかない小さな動作確認から始める 公開中
  5. 26 第25章―学習なしで公開重みから特徴を出す 公開中
  6. 27 第26章―自分の動画を凍結評価する 公開中

第5部―表現を世界モデル構想へ戻す

  1. 28 第27章―大事な境界:LeVJEPA は計画器ではない 公開中
  2. 29 第28章―LeVJEPA を次の世界モデルへつなぐ 公開中
  3. 30 第29章―入門から論文まで、10の研究プロジェクト 公開中

付録―必要なときに開く技術リュック

  1. 31 付録A―これだけは要る数学道具箱 公開中
  2. 32 付録B―完全テンソル形状表 公開中
  3. 33 付録C―用語集と論文年表 公開中
  4. 34 付録D―再現とレビューのチェックリスト 公開中

10本の長編から16枚へ

  1. URL 10本街歩き動画
  2. 取得720p 約25 GB
  3. 抽出15 fps・短辺384
  4. Lance約33 GB
  5. 無作為動画窓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 があることも確認します。一つの巨大なエピソードしかなければ、並べ替えか索引付けの故障です。

データの領収書

三つの保管規則

  1. データページはURLを配り、スクリプトが約25 GBの動画を取得します。
  2. 約15 fps、128フレーム単位のエピソードとして Lance に格納し、学習時には2フレームおきに16枚を取ります。
  3. 約33 GB、6,067エピソードという値は著者の保存時点の記録であり、不変の保証ではありません。

倉庫番への質問

  1. Wildlife に60 fps動画と同じ固定の間引き幅を使えない理由は。
  2. 既定の16フレーム動画窓は約何秒を覆いますか。
  3. Lance へ書き込む前に行を無作為に並べ替えてはいけない理由は。
答え
  1. Wildlife は約30 fpsなので、同じ幅では保存時のフレームレートが半分になるからです。
  2. 約2.1秒。
  3. データ読み込み器が連続する episode_idx の変化から境界を探すため、順序を乱すとエピソードを誤って結合・分割するからです。