ContactGen task-object stability benchmark (2026-07-19)
1. Question
Test whether the unmodified official ContactGen checkpoint produces stable grasp-keyframe proposals across PhysHSI task objects rather than only on the N1 cup. The benchmark contains both single-hand and two-hand task semantics and deliberately reports all samples instead of only the best-looking output.
This is a grasp-keyframe proposal benchmark. It does not claim that an isolated MANO mesh is already a dynamically executable SMPL-X grasp.
2. Fixed protocol
- Implementation: unmodified
submodules/contactgen/demo.pyat commit1aea2b6ce498ec90c4af0dd4c5fbdd4a23db761a. - Checkpoint:
submodules/contactgen/checkpoint/checkpoint.pt. - Input: canonical SAGE source mesh in Z-up; no KIMODO Y-up intermediate mesh is fed to ContactGen.
- Seed:
17. - Samples:
4per official invocation. - Official weights: contact
0.1, penetration3.0, UV0.01; official 200 global + 1000 pose iterations. - Contact coverage: hand vertices within
5 mmof the object surface, split into thumb/index/middle/ring/pinky/palm parts using the official MANO vertex labels. - Task-level penetration tolerance: at most
30 mm, as allowed for a keyframe that will undergo later physics refinement. - Strict diagnostic tolerance: at most
5 mm. - Penetration backend:
pysdf, positive inside. This is fixed because differenttrimeshversions gave inconsistent inside tests on the concave cup.
Single-hand tasks use the official right-hand model directly. ContactGen is not a native bimanual generator. For a two-hand diagnostic, the source and a reflected source are independently passed through the same official right-hand model; the reflected output is mapped back into a left-hand mesh. All 4 × 4 = 16 right-left pairs are then checked for:
- valid thumb-versus-finger object contact for each hand;
- hands on opposite sides of the object along the predeclared wide horizontal axis;
- sufficient side separation;
- no measured hand-hand interpenetration.
This is explicitly a mesh-level bimanual adaptation, not an official ContactGen capability and not yet a valid left-MANO/SMPL-X parameterization.
3. Cases and results
| Object | Task hand | Interaction | Object size (m) | Task-tolerant result (≤30 mm) |
Strict result (≤5 mm) |
|---|---|---|---|---|---|
| cup | single | pick | 0.116 × 0.116 × 0.155 |
stable wrap: 2/4; geometry 3/4 |
wrap 2/4; geometry 3/4 |
| book | single | pick | 0.159 × 0.071 × 0.258 |
best-of-N wrap: 1/4 |
wrap 0/4; geometry 0/4 |
| notebook | single | pick | 0.165 × 0.053 × 0.244 |
pinch-only: geometry 1/4 |
wrap 0/4; geometry 0/4 |
| leatherbook | single | pick | 0.235 × 0.197 × 0.064 |
no usable candidate | no usable candidate |
| round cushion | two | pick | 0.483 × 0.420 × 0.396 |
usable pairs 0/16 |
usable pairs 0/16 |
| thin cushion | two | pick | 0.491 × 0.174 × 0.475 |
usable pairs 0/16 |
usable pairs 0/16 |
| basket | two | pull | 0.332 × 0.286 × 0.321 |
usable pairs 0/16 |
usable pairs 0/16 |
| instrument tray | two | pick | 0.354 × 0.454 × 0.105 |
usable pairs 0/16 |
usable pairs 0/16 |
The 3 cm tolerance changes the thin-object interpretation but not the broad conclusion:
- cup is the only object with stable strict wraps;
- book gains one usable wrap only under the relaxed keyframe tolerance;
- notebook gains one lower-coverage pinch candidate but no wrap;
- leatherbook still lacks a thumb-opposed grasp;
- none of the four two-hand objects yields a pair in which both sides independently form a valid grasp.
The two-hand failures are not caused only by the 5 mm threshold:
- round cushion: the only right-side contact-rich sample penetrates about
51.8 mm; the task-tolerant left sample has191vertices within 5 mm but no thumb opposition; - thin cushion: contacts concentrate on ring/pinky on one side and index/palm on the other;
- basket: only
14–16near-surface vertices, primarily thumb-only; its non-watertight source also prevents a reliable object-penetration measurement; - instrument tray: all generated hands have zero vertices within 5 mm; its source is also non-watertight.
4. Conclusion for the grasp-keyframe pipeline
ContactGen should replace the HOI-FHLI local grasp solver only as a stochastic single-hand proposal source, followed by best-of-N filtering and later SMPL-X/physics refinement. It is not stable enough to accept the first sample, and the tested mirror construction does not make it a usable general bimanual keyframe generator.
The current recommended boundary is:
single hand-sized object
canonical Z-up source mesh
-> official ContactGen best-of-N
-> task/strict geometry filter
-> left/right SMPL-X attachment
-> whole-body collision/contact refinement
two-hand or wide object
use task-level two-hand contact anchors / a native bimanual model
-> joint two-hand optimization
-> SMPL-X attachment and whole-body refinement
The 30 mm task tolerance is acceptable only at the proposal stage. Physics execution must still reduce penetration and verify force closure/contact persistence.
5. Reproducible artifacts
- Case manifest:
data/hsi_generation/references/contactgen_task_object_benchmark_20260719.json. - Runner:
tools/contactgen/run_task_object_benchmark.py. - Scoring/rendering:
utils/contactgen/benchmark.py. - Summary:
output/auto_experiments/20260719_contactgen_task_object_benchmark/benchmark_summary.json. - Batch HTML:
output/auto_experiments/20260719_contactgen_task_object_benchmark/gallery.html. - Best-sample overview:
output/auto_experiments/20260719_contactgen_task_object_benchmark/best_samples_overview.png.
The HTML includes all 48 official ContactGen samples: all four single-hand samples per single-hand object, all four source-side and all four mirrored-side samples per two-hand object, and the top four of each object's 16 right-left pairings.