DINO-WM (PreJEPA) β PushT Β· patch tokens + proprio
νλ μμ μΌλ¦° DINOv2-small λ°±λ³ΈμΌλ‘ latent μΈμ½λ©νκ³ , causal predictor λ‘ λ€μ latent μ μμΈ‘νλ world model (DINO-WM κ³μ΄, JEPA loss). ν½μ μ¬κ΅¬μ± μμ.
- backbone:
dinov2_small(frozen),pixel_token=patchβ νλ μλΉ 256 ν¨μΉ Γ 384-d - predictor:
CausalPredictor,dim=404(= pixel 384 + proprio_emb 10 + action_emb 10) history_size=3,num_pred=1,frameskip=5- λΆκ°μ
λ ₯:
proprio(in_chans=4: agent pos+vel),action(in_chans=10 = raw 2 Γ frameskip 5) - env:
swm/PushT-v1
νμΌ
| νμΌ | μ€λͺ |
|---|---|
weights.pt |
λͺ¨λΈ κ°μ€μΉ (epoch 10) |
config.json |
ꡬ쑰 (hydra instantiate μ©) |
norm_stats.json |
proprio/action ZScore meanΒ·std (eval μ κ·ν 볡μ) |
μ€μΉ
pip install stable-worldmodel # λλ μ μ₯μμμ editable μ€μΉ
λ‘λ (public repo β λ΄μ₯ λ‘λ)
import stable_worldmodel as swm
model = swm.wm.utils.load_pretrained("kotmul/dinowm_patch_prop_pusht")
model = model.eval().requires_grad_(False)
model.interpolate_pos_encoding = True
load_pretrained λ config.json + weights.pt λ₯Ό <cache>/checkpoints/ μλλ‘ λ°μ
instantiate(config) ν κ°μ€μΉλ₯Ό λ‘λνλ€.
μ κ·ν (μ€μ)
- pixels: ImageNet mean/std μ κ·ν ν 224Γ224
- proprio / action: μλ
norm_stats.jsonμ ZScore (νμ΅κ³Ό λ°λμ λμΌν΄μΌ ν¨)
import json, numpy as np
from huggingface_hub import hf_hub_download
norm = json.load(open(hf_hub_download("kotmul/dinowm_patch_prop_pusht", "norm_stats.json")))
p_mean, p_std = np.array(norm["proprio"]["mean"][0]), np.array(norm["proprio"]["std"][0])
a_mean, a_std = np.array(norm["action"]["mean"][0]), np.array(norm["action"]["std"][0])
μΆλ‘ β νλ μ μΈμ½λ© & λ€μ μ€ν μμΈ‘
import torch, numpy as np
import stable_pretraining as spt
from torchvision.transforms import v2 as T
tf = T.Compose([
T.ToImage(), T.ToDtype(torch.float32, scale=True),
T.Normalize(**spt.data.dataset_stats.ImageNet), T.Resize(224),
])
H, FS = model.history_size, 5 # 3 history steps, frameskip 5
# frames_uint8: (H, 224, 224, 3) uint8 β history_size κ°μ μ°μ νλ μ(frameskip κ°κ²©)
# proprio_raw : (H, 4) κ° μ€ν
μ [agent_x, agent_y, agent_vx, agent_vy]
# action_raw : (H, FS*2) κ° model-step μ raw action FSκ° λ¬Άμ ([-1,1]^2 Γ FS)
pixels = torch.stack([tf(im) for im in frames_uint8])[None] # (1,H,3,224,224)
proprio = torch.tensor(((proprio_raw - p_mean) / p_std)[None], dtype=torch.float32) # (1,H,4)
action = ((action_raw.reshape(H, FS, 2) - a_mean) / a_std).reshape(H, FS * 2)
action = torch.tensor(action[None], dtype=torch.float32) # (1,H,10)
with torch.no_grad():
# (a) λ¨μΌ νλ μ μΈμ½λ© (patch latent)
emb_img = model._encode_image(pixels[:, :1]) # (1, 1, 256, 384)
# (b) λ€μ μ€ν
μμΈ‘ (action/proprio λ°μ)
info = {"pixels": pixels, "proprio": proprio, "action": action}
info = model.encode(info, target="emb", is_video=False)
pred = model.predict(info["emb"][:, :H]) # (1, H, 256, 404)
next_latent = pred[:, -1] # μμΈ‘ν λ€μ latent (1, 256, 404)
# 404 = pixel(384) + proprio_emb(10) + action_emb(10).
# planning cost λ±μλ λ³΄ν΅ action ꡬκ°(λ§μ§λ§ 10)μ μ μΈν actionless λΆλΆ μ¬μ©:
actionless = next_latent[..., :394]
Planning / eval μμ μ°κΈ°
stable-worldmodel μ planning(eval) μ€ν¬λ¦½νΈλ 체ν¬ν¬μΈνΈ μμ norm_stats.json μ
μλμΌλ‘ μ°Ύμ νμ΅ λ μ κ·νλ₯Ό 볡μνλ€(option B). λ°λΌμ μΈ νμΌμ
<cache>/checkpoints/<run>/ ν ν΄λμ λκ³ policy λ₯Ό κ·Έ weights.pt λ‘ μ§μ νλ©΄ λλ€:
<cache>/checkpoints/dinowm-pusht-patch-prop/
weights.pt
config.json
norm_stats.json # eval μ΄ μ¬κΈ°μ mean/std 볡μ
MPC(CEM) planning μ world model μ imagination μΌλ‘ κ΅΄λ € cost λ₯Ό μ΅μννκ³ , μ€μ env μμ μ€ννλ€. μμΈν μ§μ μ μ 리ν¬μ§ν 리μ planning μ€ν¬λ¦½νΈλ₯Ό μ°Έκ³ .
- Downloads last month
- 36