DexFlow MLP Stage-2 v3 (Selective Grounding)
V3-E: Dual Reader + selective proprio + 16D compact Body↔Hand messages on plastic and pill.
Org: Humantwin
Repo: Humantwin/dexflow-v3-stage2-tasks
Not ACT / DiT. DexFlowMLPPolicy (policy_variant=dexflow_mlp) with:
split_head=truedual_reader=trueselective_obs=truemessage_dim=16- balanced loss
0.5 L_body + 0.5 L_hand
Stage-1 init: dexflow_mlp_stage1_core4_current_state_gate_20260910/stage1_step02000.ckpt
Seed: 20260910 · Gate: G2 · Checkpoint: 15k (stage2_step15000.ckpt)
Layout
selective/{plastic,pill}/
stage2_step15000.ckpt
norm_stats.json
gate_step15000.json
Also mirrored as stage2.ckpt (= 15k) for deploy loaders that expect that name.
Open-loop (train-set, G2 PASS @ 15k)
| Path | nRMSE | body RMSE | hand MAE |
|---|---|---|---|
selective/plastic |
0.0576 | 0.0060 | 3.07 |
selective/pill |
0.0656 | 0.0072 | 4.74 |
Load
from deploy.real_robot.load_p0_policy import load_dexflow_policy
from dexflow.data.normalize import ActionStateNormalizer
model = load_dexflow_policy("selective/plastic/stage2.ckpt", device="cuda")
normalizer = ActionStateNormalizer.load("selective/plastic/norm_stats.json")
# image [B,1,3,480,640] float 0-1; state [B,41] MEAN_STD-normalized
chunk_n = model.predict_action_chunk({"image": img, "state": state_n})
action = normalizer.unnormalize_action(chunk_n) # [B,30,41]
from_checkpoint restores mlp_cfg.split_head, dual_reader, selective_obs, and message_dim from the ckpt.