Document seed-conditioned models and results
Browse files
README.md
CHANGED
|
@@ -102,3 +102,83 @@ Note: `me-full_25000_*` checkpoints were trained with flax 0.11 using a per-path
|
|
| 102 |
`nnx.Param` layout in `TPWithWeightsAndBiases` (`kin_flow/net/module/fctp.py`) β
|
| 103 |
restore with a matching code state; they are not compatible with the original
|
| 104 |
Param-of-list layout.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 102 |
`nnx.Param` layout in `TPWithWeightsAndBiases` (`kin_flow/net/module/fctp.py`) β
|
| 103 |
restore with a matching code state; they are not compatible with the original
|
| 104 |
Param-of-list layout.
|
| 105 |
+
|
| 106 |
+
---
|
| 107 |
+
|
| 108 |
+
# Seed-conditioned models
|
| 109 |
+
|
| 110 |
+
Extension of the multi-embodiment model with an **equivariant seed point** β a 3D point
|
| 111 |
+
marking *which* object to grasp β after SeededGrasp ([arXiv 2607.20207](https://arxiv.org/abs/2607.20207)),
|
| 112 |
+
expressed in irreps so SE(3) equivariance is preserved by construction.
|
| 113 |
+
|
| 114 |
+
These are fine-tuned from `me-full_25000_120`. The seed enters the scene encoder as one
|
| 115 |
+
virtual graph edge from every node to the seed point, contributing an β=1 direction vector
|
| 116 |
+
and β=0 distance β the two quantities the encoder already consumes. Only ~10k new
|
| 117 |
+
parameters (`unet.seed_mlp`) on an 18.8M-parameter model.
|
| 118 |
+
|
| 119 |
+
## Models
|
| 120 |
+
|
| 121 |
+
| Folder | Fine-tune | Epoch | Best for | seeded `targeted` |
|
| 122 |
+
|---|---|---|---|---|
|
| 123 |
+
| `me-seed-anneal_25000_4` | annealed LR | 4 | **best overall** Β· Panda Β· Allegro | 0.4582 (Panda) |
|
| 124 |
+
| `me-seed-anneal_25000_6` | annealed LR | 6 | VX300 | 0.4339 |
|
| 125 |
+
| `me-seed-anneal_25000_8` | annealed LR | 8 | DexEE | 0.1599 |
|
| 126 |
+
| `me-seed_25000_2` | constant LR | 2 | Shadow Hand | 0.3502 |
|
| 127 |
+
|
| 128 |
+
`me-seed-anneal_25000_4` has the highest mean across all five grippers (0.3289) and is the
|
| 129 |
+
recommended default. The `-anneal` runs use a learning rate annealed 8e-5 β 0; the original
|
| 130 |
+
schedule held a constant 8e-5 (`decay_steps` was 10,000 against a 200k-step run) which
|
| 131 |
+
degraded results over training.
|
| 132 |
+
|
| 133 |
+
## Evaluation
|
| 134 |
+
|
| 135 |
+
`targeted = yield Γ hit Γ SR|target` β successful grasps on the *intended* object per raw
|
| 136 |
+
sample drawn. Measured on 119 held-out cluttered scenes (4 objects each), 100 grasps per
|
| 137 |
+
scene, both conditions scored on identical grasps (same RNG, same seed point, differing only
|
| 138 |
+
in whether the seed mask is on).
|
| 139 |
+
|
| 140 |
+
| Gripper | DoF | unseeded | seeded | + collision projection | total gain |
|
| 141 |
+
|---|---|---|---|---|---|
|
| 142 |
+
| Panda | 2 | 0.2067 | 0.4611 | **0.5190** | +151% |
|
| 143 |
+
| VX300 | 2 | 0.2027 | 0.4410 | **0.4752** | +134% |
|
| 144 |
+
| DexEE | 12 | 0.0914 | 0.1578 | **0.1597** | +75% |
|
| 145 |
+
| Allegro | 16 | 0.1261 | 0.2601 | **0.3220** | +155% |
|
| 146 |
+
| Shadow Hand | 22 | 0.1510 | 0.3060 | **0.3813** | +152% |
|
| 147 |
+
| **mean** | | **0.1556** | **0.3252** | **0.3714** | **+139%** |
|
| 148 |
+
|
| 149 |
+
Seed conditioning raises the fraction of grasps aimed at the intended object from chance
|
| 150 |
+
(~0.28 for ~3.5 objects/scene) to 0.61β0.79. Collision projection is a separate, training-free
|
| 151 |
+
post-processing step that recovers the collision-free yield seeding costs.
|
| 152 |
+
|
| 153 |
+
**Supporting numbers** β 46 evaluations across 15 checkpoints and 5 grippers. Seeded and
|
| 154 |
+
unseeded results are identical to 4 decimal places on the pre-fine-tune checkpoint, where the
|
| 155 |
+
seed pathway is zero-initialised, confirming the conditioning is inert at initialisation.
|
| 156 |
+
|
| 157 |
+
## Caveats
|
| 158 |
+
|
| 159 |
+
- Test clouds are **analytically sampled** from MuJoCo geometry, not rendered scans (the
|
| 160 |
+
renderer segfaults on our hardware). Validated to 2 mm geometric agreement but carrying a
|
| 161 |
+
measured β2.7 pp systematic offset β valid for A/B comparison, **not** directly comparable
|
| 162 |
+
to the `me-full_25000_*` numbers above.
|
| 163 |
+
- Performance saturates within ~4,000 steps; epochs 2β8 are statistically indistinguishable
|
| 164 |
+
and longer training does not help.
|
| 165 |
+
- DexEE is an outlier (+75%, `SR|target` 0.26 vs 0.55β0.77 elsewhere): it aims correctly but
|
| 166 |
+
still fails to hold objects.
|
| 167 |
+
|
| 168 |
+
## Loading
|
| 169 |
+
|
| 170 |
+
Same as the `me-full_*` checkpoints, but the model must be built with seed conditioning so
|
| 171 |
+
`unet.seed_mlp` exists:
|
| 172 |
+
|
| 173 |
+
```python
|
| 174 |
+
# model config needs seed_zero_init; then
|
| 175 |
+
model = Trainer.get_model_from_checkpoint(model, "<path>/me-seed-anneal_25000_4",
|
| 176 |
+
partial=True)
|
| 177 |
+
|
| 178 |
+
# inference: seed is (xyz, mask) in world metres; mask=0 => unconditional
|
| 179 |
+
se3, dof = inference("Flow", model, sample, num_samples, cfg,
|
| 180 |
+
seed=(seed_xyz, np.float32(1.0)))
|
| 181 |
+
```
|
| 182 |
+
|
| 183 |
+
`partial=True` restores only the parameters present in a checkpoint, which is also how these
|
| 184 |
+
were created from the unconditional model.
|