μ¬ν μ½λ
2026 INHA AI Challenge Β· SO-100 action-conditioned video world model. 첫 νλ μ ν μ₯κ³Ό 6μΆ κ΄μ μ§λ Ή 16νμ λ°μ μ΄μ΄μ§λ 16νλ μμ λ§λ λ€.
μ μΆ CSV submission_features.csv
sha256 c4481e1e724ae6592cb7207855832c7fac95e8a98d6334bfbfbb411f6307fa93
μ΄λν° LoRA rank 1280 Β· 50,000 step Β· EMA
λ°±λ³Έ nvidia/Cosmos3-Nano @ 411f42a8fdfb8c5b2583cb8786e0938f49796eaa (OpenMDW 1.1)
μ΄ λ²λ€μ΄ λ΄μ§ μλ κ²
μ°λ¦¬κ° κ³μ°νκ±°λ κ²μΆν κ°μ κ³ μ λ³ΈμΌλ‘ μ£μ§ μλλ€. μ¬ν μ€μ μ½λκ° λ€μ λ§λ λ€. μ λΆ κ²°μ μ μ΄λΌ κ°μ μ λ ₯μ΄λ©΄ κ°μ κ²°κ³Όκ° λμ¨λ€.
| μ°μΆλ¬Ό | λ§λλ μ½λ | μΈμ |
|---|---|---|
κ΄μ μ κ·ν ν΅κ³ joint_stats.json |
make_joint_stats.py |
νμ΅Β·μΆλ‘ μμ μ μλ |
μ μ§ νλ μ μ‘°νν still_table.json |
still_frames.py |
νμ΅ μμ μ μλ |
μ°½ 보λ₯ λͺ©λ‘ window_spans.json |
run_gate.py |
μΊμλ₯Ό κ΅¬μ΄ λ€ μλ 1ν |
κΈ°λ sha256 μ pinned.json μ regenerated μ μ μ΄ λμλ€. μ¬νμ΄ λ§κ² λμλμ§
κ·Έ κ°μΌλ‘ νμΈν μ μλ€.
νμ΅ λ°μ΄ν°Β·λ μ΄ν΄νΈ μΊμΒ·λ°±λ³Έ μ€λ μ·Β·μ£Όμ΅μΈ‘ μ μΆ ν·μ λ΄μ§ μλλ€.
νκ²½
requirements.txt Β· environment.txt. GPU ν μ₯μ μ΄λ€. νμ΅ νΌν¬ 62 GiB.
runtime_paths.py κ° κ²½λ‘λ₯Ό νΌλ€ β SO100_* νκ²½λ³μλ₯Ό λ¨Όμ λ³΄κ³ , μμΌλ©΄ κΈ°λ³Έκ°μ
μ°λ κ·Έ κΈ°λ³Έκ°μ΄ μλ κΈ°κ³μμλ μ΄ νμΌ κΈ°μ€ μλ κ²½λ‘λ‘ λ¨μ΄μ§λ€. λ€λ₯Έ κΈ°κ³μμ
μ§μ ν κ²μ λ·μ΄λ€: SO100_ROOT(μμ
루νΈ) Β· SO100_DATASET(μ 곡 λ°μ΄ν°μ
) Β·
SO100_SNAPSHOT(λ°±λ³Έ μ€λ
μ·) Β· SO100_PYTHON(κ°μνκ²½ νμ΄μ¬).
λ°±λ³Έμ nvidia/Cosmos3-Nano λ₯Ό μ 리λΉμ μΌλ‘ λ°μ λκ³ SO100_SNAPSHOT μΌλ‘ κ·Έ
κ²½λ‘λ₯Ό μ€λ€.
huggingface-cli download nvidia/Cosmos3-Nano \
--revision 411f42a8fdfb8c5b2583cb8786e0938f49796eaa --local-dir <μ€λ
μ·κ²½λ‘>
1. μΆλ‘ β μ΄λν°λ‘ 216νΈμ λ§λ λ€
μ΄λν° λ νμΌμ weights/ μ μλ€ β νμΌλͺ
Β·ν¬κΈ°Β·sha256 μ WEIGHTS.md μ μλ€.
--lora μ κ·Έ ν΄λλ₯Ό μ€λ€. νμ ema/ λ₯Ό λ§λ€μ§ μλλ€.
cd code
python render_eval.py \
--lora ../weights \
--challenge <λ°μ΄ν°μ
>/data/eval \
--out ../out \
--steps 30 --seed 31337 --dtype fp16 --domain-id 10 \
--action-encoder joint
μμν λ κ΄μ μ κ·ν ν΅κ³κ° μμΌλ©΄ μ 곡 νμ΅ λ°μ΄ν°μμ λ§λ λ€(3~4λΆ). κ·Έλμ μΆλ‘ μλ νμ΅ λ°μ΄ν°κ° νμνλ€.
216μν Γ 12.2μ΄ β 44λΆ. μ΄μ΄μ μ μΆ ν·μΌλ‘ CSV λ₯Ό λ§λ λ€. κ²°κ³Όλ 648νμ΄λ€ (216μν Γ 3 component).
cd <λ°μ΄ν°μ
>/submission_kit
python make_submission_csv.py \
--prediction-root <mp4 ν΄λ> \
--challenge-root ../data/eval \
--output-csv submission_features.csv \
--action-stats-path ../data/train/so100_action_statistics.json
μμ± μ€μ μ΄ μ΄λν°μ λ§μμΌ νλ€. 쑰건 ννμ κ΄μ 18μ±λμ΄κ³ , μ΄λν°μ
train_state.json μ κ·Έ κ°μ΄ μ ν μλ€. render_eval.py κ° μμν λ λμ‘°ν΄
μ΄κΈλλ©΄ λ©μΆλ€ β ννμ΄ ν리면 μμμ λ©μ©‘ν λμ€λ©΄μ μ‘°κ±΄λ§ μ΄κΈλκΈ° λλ¬Έμ΄λ€.
2. μ μ²λ¦¬ β λ μ΄ν΄νΈ μΊμλ₯Ό κ΅½λλ€
python bake_latents.py --augment mix --aug-seed 0 \
--stride1 4 --stride2 4 --out <μ¦κ°μΊμ>
python bake_latents.py --stride1 2 --stride2 2 --out <μ μ¬μΊμ>
--augment λ κ°μ λ°λλ€ (mix Β· final_grain Β· final_grain_inv).
μ μ¬ μΊμμ stride λ 2 λ€. νμ΅μ΄ --cache-mod - 4:2 λ‘ μ μ¬ λ±
ν¬μμ
start % 4 == 2 μΈ μ°½λ§ μ°κΈ° λλ¬Έμ΄λ€. stride_plan μ μνΌμλλ§λ€ μμμ 0 μμ
μΆλ°ν΄ μ 12κ°λ stride1, κ·Έ λ€λ stride2 κ°κ²©μΌλ‘ νμΌλ―λ‘, stride 4 λ‘ κ΅¬μ°λ©΄
μμμ μ΄ μ λΆ 4μ λ°°μλΌ κ·Έ 격μμ ν μ°½λ μ κ±Έλ¦°λ€. stride 2 λ μμμ μ μ§μλ‘
λμ μ λ°μ΄ % 4 == 2 κ° λλ€. μ¦κ° μΊμλ 격μλ₯Ό μ κ±Έλ―λ‘ stride 4 κ·Έλλ‘λ€.
λΈ μ²΄ν¬ν¬μΈνΈμ μ μ¬ μΊμλ λ°λλ₯Ό μ¬λ € κ°λ©° μ¬λ¬ λ²μ λλ κ΅¬μ΄ κ²μ΄λΌ stride
(1,1)Β·(2,2)Β·(4,4) μ€λκ° μμΈ 274 μ€λλ€. μ΄μ΄ κ΅½κΈ°λ --exclude-file λ‘ μ΄λ―Έ ꡬμ΄
μ°½μ κ³νμμ λΉΌλ©΄μ νλ€. 4:2 격μκ° κ³ λ₯΄λ μ°½ μ§ν©μ stride 2 λ‘ ν λ²μ κ΅½λ
κ²κ³Ό κ°μ μ’νκ³μ΄λ―λ‘, μ²μλΆν° μ¬νν λλ μ ν μ€μ΄λ©΄ λλ€.
3. μ°½ 보λ₯ λͺ©λ‘ β νμ΅μ λ£μ§ μμ ꡬκ°μ μ°Ύλλ€
μΊμλ₯Ό κ΅¬μ΄ λ€ ν λ² λλ¦°λ€.
python run_gate.py <μμ
ν΄λ>
λ€μ― λ¨κ³κ° μμλλ‘ λλ€. κ° λ¨κ³λ κ²°κ³Όλ₯Ό μμ ν΄λμ λ¨κΈ°κ³ μ΄λ―Έ μ²λ¦¬ν μμμ 건λλ°λ―λ‘ μ€λ¨ν΄λ μ΄μ΄μ λμκ°λ€.
| λ¨κ³ | νλ μΌ | μ°μΆ |
|---|---|---|
pick_sources.py |
μΊμ meta μμ νμ΅μ΄ μ€μ λ‘ μ°λ μμλ§ μΆλ¦°λ€ | sources.json |
measure_motion.py |
νλ μκ° νλ©΄ λ³νλ, actionΒ·observation.state λ³νλ |
motion.jsonl |
measure_skin.py |
YCrCb νΌλΆμ λΉμ¨κ³Ό μ΅λ λ©μ΄λ¦¬ λμ΄ | skin.jsonl |
detect_hands.py |
MediaPipe HandLandmarker μ κ²μΆ μ μ | hand.jsonl |
merge_gate_spans.py |
μ μ ν©μ³ 보λ₯ κ΅¬κ° | window_spans.json |
λ²λ¦¬λ κΈ°μ€ λ:
- person β μ κ²μΆ 0.5 μ΄μ κ·Έλ¦¬κ³ νΌλΆ λ©μ΄λ¦¬ 3.5% μ΄μμΈ νλ μμ΄ μ°μ 2νλ μ μ΄μ (ν νλ μμ§λ¦¬ μ€κ²μΆμ λΊλ€)
- action0-motion β μ§λ ΉΒ·μν λ³νλμ΄ λ λ€ 0.5 λ―Έλ§μΈλ° νλ©΄ μμ§μλ§ κ·Έ μμ μ€μκ°λ³΄λ€ 5 μ΄μ ν° νλ μ (λ‘λ΄μ λ©μΆ° μλλ° νλ©΄μ΄ μμ§μλ€)
μ°Ύμ νλ μμ μλ€ 2νλ μμ© λλ¦¬κ³ κ°κ²© 2 μ΄νλ μλλ€. νμ΅μ μ°½ 17νλ μ μ€ 1νλ μμ΄λΌλ μ΄ κ΅¬κ°μ κ±ΈμΉλ©΄ κ·Έ μ°½μ λ²λ¦°λ€.
μ κ²μΆ λͺ¨λΈ gate_scan/hand_landmarker.task λ Google MediaPipe μ κ³΅κ° λͺ¨λΈμ
κ·Έλλ‘ λλ΄ν κ²μ΄λ€. κ²μΆμ νλ μ λ¨μ IMAGE λͺ¨λλΌ μμμ μμ‘΄νμ§ μλλ€.
λ³λ ¬λλ NPROC λ‘ μ‘°μ νλ€.
4. νμ΅
python fit_adapter.py \
--out <μΆλ ₯> --cache <μ¦κ°μΊμ> <μ μ¬μΊμ> --cache-mod - 4:2 \
--exclude-frames <μμ
ν΄λ>/window_spans.json \
--exclude-scenes held_out_scenes.json \
--rank 1280 --lr 8e-05 --accum 4 --seed 0 \
--preset D --steps 60000 \
--action-encoder joint --action-mode joint \
--t-dist waver --shift 5.0 \
--lr-shape linear --f-max 0.4 --f-min 0.1 --warmup 0 \
--proj-lr-mult 5.0 --action-proj-init official \
--weight-decay 0.05 --beta2 0.99 --eps 1e-8 \
--ema-rate 0.10 --autocast off \
--scene-balance uniform --sample-policy seq \
--domain-id 10 --checkpointing
μ μΆ μ΄λν°λ <μΆλ ₯>/step_050000/ema λ€. --steps λ νμ΅ κΈΈμ΄κ° μλλΌ
νμ΅λ₯ μ€μΌμ€μ μ§νμ΄λ€. 60000 μ μ£Όκ³ 50,000 μμ κΊΌλ΄λ κ²κ³Ό 50000 μ μ£Όκ³
50,000 μ λλ κ²μ lr 곑μ μ΄ λ€λ₯΄λ―λ‘, μ κ°μ κ·Έλλ‘ λλ€.
--ema-rate κΈ°λ³Έκ°μ 0.0 μ΄κ³ 0 μ΄λ©΄ ema/ κ° μκΈ°μ§ μλλ€.
νμ΅ μΊμ μ°½ μ 269,782κ° = μ¦κ° λ± ν¬ 136,328 + μ μ¬ λ± ν¬ 133,454. μ¬ λ³΄λ₯ 24κ°μ μ°½ 보λ₯κΉμ§ λ€ μ μ©ν λ€μ μλ€:
μλ³Έ μ€λ³΅ μ κ±° 격μ 4:2 μ¬ λ³΄λ₯ μ°½ 보λ₯
μ¦κ° λ±
ν¬ 232,686 198,179 - 138,187 136,328
μ μ¬ λ±
ν¬ 501,276 501,276 193,337 135,264 133,454
ν©κ³ 269,782
보λ₯ λͺ©λ‘μ record 324νΈ Β· κ΅¬κ° 445κ° Β· νλ μ 3,840κ°μ΄κ³ , κ·Έ κ²°κ³Ό μ°½μ΄
273,451 β 269,782 λ‘ μ€μ΄λ λ€(1.34%). μ΄λν°μ train_state.json μ μ ν
cache_n κ³Ό κ°μ μλ€.
μμ μκ°
κ΄μ ν΅κ³ μνΌμλ 10,544νΈ β 4λΆ (CPU)
μ μ²λ¦¬ 273,451μ°½ Β· 1.7~2.5μ°½/s β 30~45μκ°
μ°½ 보λ₯ λͺ©λ‘ μμ 6,730νΈ Β· CPU 48λ³λ ¬ β 10λΆ (CPU)
μ μ§ μ‘°νν μ°½ 501,276κ° β 6λΆ (CPU)
νμ΅ 50,000 step Γ 1.36 s/step β 19μκ°
μΆλ‘ 12.2 s/μν Γ 216 β 44λΆ
νμΌ
| νμΌ | μν |
|---|---|
bake_latents.py Β· degrade_clips.py |
μ μ²λ¦¬ β λ μ΄ν΄νΈ μΊμ, ν½μ μ¦κ° |
run_gate.py Β· window_gate.py Β· gate_scan/ |
μ°½ 보λ₯ λͺ©λ‘ μμ±κ³Ό μ μ© |
fit_adapter.py Β· step_kernel.py |
νμ΅ |
render_eval.py |
μΆλ‘ |
joint_channels.py Β· make_joint_stats.py |
쑰건 μΈμ½λ(κ΄μ 18μ±λ)μ κ·Έ μ κ·ν ν΅κ³ |
window_source.py Β· still_frames.py Β· prompt_text.py |
λ°μ΄ν°μ Β· μ μ§ νλ μ Β· ν둬ννΈ |
runtime_paths.py Β· catalog.json Β· held_out_scenes.json |
κ²½λ‘ Β· split Β· 보λ₯ μ¬ |
pinned.json |
CSV Β· μ΄λν° Β· μμ€ sha256 κ³Ό μ¬μμ±λ¬Ό κΈ°λ sha256 |
Model tree for SSLcom-007/dacon-inha-2026-submission
Base model
nvidia/Cosmos3-Nano