Paper · 2020-12-17 · cs.CV
Reconstructing Hand-Object Interactions in the Wild
Reconstructs the 3D hand and a known-model object from one in-the-wild RGB image, without 3D supervision. It fits MANO to 2D keypoints, fits the object pose by differentiable mask and depth rendering, optimises both jointly with distance and collision terms, then refines the hand with a learned contact prior. Author-reported: HO3D hand error 9.7 mm vs 14.7 mm for the baseline.
Differentiable renderingMonocular depth estimationInstance segmentationhand-object-reconstruction3d-hand-poseoptimizationdataset
AI-compiled by claude-haiku-5-5 on 2026-10-19, not yet reviewed by a human. Every claim cites its source; check it when a detail matters.
In plain words
Photos of people holding things show hands and objects that overlap, so a camera sees only part of each. Most systems that estimate 3D hand and object shapes were trained on labelled lab recordings, where the scene is simple and the object list is short. This paper asks how to get a 3D picture of a hand holding an everyday object from a single ordinary photo, without 3D labels.
The approach is a fitting process rather than a single network. It starts from a hand estimate and an object estimate, then nudges both until they agree with the 2D picture (outline of the object, hand keypoints, a depth guess). It then pushes the hand and object to touch without passing through each other, and finally adjusts the grip so the contact looks like a real one. The authors also used this tool, together with human checks, to label 500 in-the-wild images from the MOW dataset.
TL;DR
- Reconstructs a hand (MANO mesh) and an object (a 3D model supplied per image) from one RGB image, without 3D supervision §1 §3.
- Four stages: hand fit to 2D keypoints, object pose by differentiable mask and depth rendering, joint hand-object optimisation with distance and collision terms, and contact-prior refinement §3.
- Lab results (author-reported) beat the cited baseline on hand error on HO3D and FPHA; on FPHA the object error is worse §4.1 tab. 2.
- Each image needs a 3D object model chosen by a human annotator, and the loss weights are tuned per image during annotation §5.1 §5.2.
- Introduces the MOW dataset: 500 annotated in-the-wild images, 121 object categories §1 §5 tab. 1.
Problem
Monocular 3D hand-object reconstruction in lab settings relies on 3D annotations that are hard to collect outside the lab, and the existing datasets have few participants and objects §1 tab. 1. Feed-forward models trained on those datasets generalise poorly to unseen objects in the wild §4.2. A single image is also under-constrained in depth and scale, and mutual occlusion between hand and object makes it worse §1 §3.3. The paper assumes a single hand-object pair per image §3.
Method
The method has four steps, shown in fig. 3 §2. Each step is a fitting problem; the paper gives no training procedure for the hand and object steps.
- Hand pose §3.1. A learned regressor (FrankMocap) gives an initial MANO pose, shape and weak-perspective camera. The pose and shape are then fitted to 2D hand keypoints eq. 1. The camera is turned into a perspective one with a fixed focal length f, using depth f / s_h eq. 2.
- Object pose §3.2. An object mask is taken from a class-agnostic instance model, keeping the instance that overlaps the detected hand box most (highest IoU). The object's scale, rotation and translation are fitted by differentiable rendering against the mask eq. 3 and a monocular depth map eq. 4. The fit is run from many random starting rotations and the lowest-loss result is kept app. Implementation Details.
- Joint optimisation §3.3. Hand and object are optimised together with the object-pose terms plus an interaction term (symmetric chamfer distance between the two meshes) eq. 6 and a collision term that penalises object vertices inside the hand, read from a voxel signed-distance grid eq. 7 eq. 8. The total is a weighted sum eq. 9.
- Contact refinement §3.4. A small network takes the hand parameters and a distance field from hand vertices to their nearest object vertices eq. 10, updates the hand, and recomputes the field. The paper runs three iterations app. Implementation Details. It is trained on ground-truth hand poses from the GRAB MoCap data §3.4, with noise added to simulate imperfect input.
The core fitting loop, in our own notation:
# Reconstruct one hand-object pair from one image [§3]
# Input: image (H, W, 3); object_model (mesh, about 800 faces) [app. Impl.]
# Output: hand_vertices (V_h, 3); object_vertices (V_o, 3)
def reconstruct(image, object_model):
# 1. Fit the MANO hand to 2D keypoints [§3.1] [eq. 1]
hand = fit_hand_to_keypoints(image)
# 2. Object mask: the instance that best overlaps the hand box [§3.2]
object_mask = pick_instance_by_hand_iou(image, hand)
# 3. Monocular depth as the target for object depth [§3.2]
object_depth = monocular_depth(image)
# 4. Fit object scale, rotation, translation from many starts [eq. 5]
object_pose = best_of_starts(object_model, object_mask, object_depth)
# 5. Jointly optimise hand and object with all four terms [§3.3] [eq. 9]
hand, object_pose = optimise_jointly(hand, object_pose)
# 6. Refine the contact with a small network, three iterations [§3.4]
for iteration in range(3):
distance_field = hand_to_object_distances(hand, object_pose)
hand = refine_network(hand, distance_field)
return hand, object_poseKey equations, numbered as in the paper's main text, in the paper's notation (see Pitfalls for the unclear symbols):
Hand fit eq. 1: \boldsymbol{\theta}^{*}, \boldsymbol{\beta}^{*} = \arg\min_{\boldsymbol{\theta}, \boldsymbol{\beta}}\, L_{joints} + L_{reg}
Hand vertices in the camera frame eq. 2: \boldsymbol{V}^{*}_h = H(\boldsymbol{\theta}^{*}, \boldsymbol{\beta}^{*}) + [t_x, t_y, f/s_h]
Mask loss eq. 3 and depth loss eq. 4, both rendered from object scale s, rotation \boldsymbol{R} and translation \boldsymbol{T}: L_{mask} = \lVert \textrm{NR}_m (s, \boldsymbol{R}, \boldsymbol{T}) - \boldsymbol{M} \rVert L_{depth} = \lVert \textrm{NR}_d (s, \boldsymbol{R}, \boldsymbol{T}) - \boldsymbol{D} \rVert
Object objective eq. 5: s^*, \boldsymbol{R}^*, \boldsymbol{T}^* = \argmin_{s,\boldsymbol{R}, \boldsymbol{T}}\, L_{mask} + L_{depth}
Interaction loss, symmetric chamfer distance between object vertices \boldsymbol{V}_o and hand vertices \boldsymbol{V}_h eq. 6: L_{dist} = \frac{1}{|\boldsymbol{V}_o|} \sum_{x \in \boldsymbol{V}_o} \min_{y \in \boldsymbol{V}_h} \|x - y\|_2 + \frac{1}{|\boldsymbol{V}_h|}\sum_{y \in \boldsymbol{V}_h} \min_{x \in \boldsymbol{V}_o} \|x - y\|_2
Penetration value of a voxel cell, from the hand SDF eq. 7: \phi(\boldsymbol{c}) = -\min(\textrm{SDF}(c_x, c_y, c_z), 0)
Collision loss over object vertices eq. 8: L_{collision} = \sum_{\boldsymbol{v} \in \boldsymbol{V}_o^*} \phi(\boldsymbol{v})
Joint objective eq. 9: L = \lambda_1 L_{mask} + \lambda_2 L_{depth} + \lambda_3 L_{dist} + \lambda_4 L_{collision}
Refinement distance field, squared distance from each hand vertex to its nearest object vertex eq. 10: \boldsymbol{F}(\boldsymbol{v}_h) = \min_{\boldsymbol{v}_o \in \boldsymbol{V}_o^*} \lVert \boldsymbol{v}_h - \boldsymbol{v}_o \rVert^2_2
Hyperparameters
| Name | Value | Where | Notes |
|---|---|---|---|
| Hand pose θ | ∈ R^{3×15} | §3.1 eq. 1 | MANO pose, as written in the paper |
| Hand shape β | ∈ R^{10} | §3.1 eq. 1 | MANO shape |
| Hand camera | weak perspective (t_x, t_y, s_h) | §3.1 | from FrankMocap |
| Focal length f | not stated | §3.1 eq. 2 | fixed, value not given |
| Hand fit weights (L_joints, L_reg) | not stated | §3.1 eq. 1 | per-joint 2D keypoint weighting by detection confidence app. Implementation Details |
| Object model size | about 800 faces | app. Implementation Details | models are pre-simplified |
| Object rotation starts | 1000, uniform in [−π, π] | app. Implementation Details | keep lowest loss |
| Object translation start | zero | app. Implementation Details | |
| Object scale start | not stated | §3.2 | |
| λ1 (mask) | 200 | app. Implementation Details | joint objective eq. 9 |
| λ2 (depth) | 20 | app. Implementation Details | |
| λ3 (distance) | 1000 | app. Implementation Details | |
| λ4 (collision) | 5 | app. Implementation Details | |
| Hand SDF voxel grid | 32 × 32 × 32 | app. Implementation Details | over a tight box around the hand; box size not stated |
| Refinement: object vertices in distance field | 10,000 | app. Implementation Details | |
| Refinement: iterations | 3 | app. Implementation Details | |
| Refinement network: architecture, optimiser, learning rate, training epochs | not stated | §3.4 | |
| Refinement training noise | perturbed GT hand pose and translation | §3.4 | noise distribution not stated |
| Mask model | PointRend, trained on COCO, class-agnostic use | §3.2 | categories ignored |
| Hand detector | cited as Shan et al. 2020 | §3.2 | selects the object instance |
| Depth model | Ranftl et al. 2020 (monocular) | §3.2 | scale alignment not stated |
| Runtime | about 1 min per image on a GTX 2080 Ti; about 18 s object pose, about 30 s joint | app. Implementation Details |
Results
Author-reported. Setup: lab evaluation on HO3D and FPHA with the baseline of Hasson et al. (CVPR 2020), which takes the same RGB image and known object model and is trained with full 3D supervision §4.1. The method is not trained on these datasets' 3D labels, and FPHA uses a different split from the baseline's §4.1. The in-the-wild comparison is qualitative §4.2.
| Dataset | Metric | Baseline | This paper | Source |
|---|---|---|---|---|
| HO3D (68 sequences, 10 subjects, 10 objects) | Hand MAE, 21 joints (mm) | 14.7 | 9.7 | tab. 2 §4.1 |
| HO3D | Object Chamfer distance (units not stated) | 26.8 | 19.9 | tab. 2 §4.1 |
| FPHA | Hand MAE, 21 joints (mm) | 18.0 | 14.2 | tab. 2 §4.1 |
| FPHA | Object error, labelled "Obj MAE" in the table | 22.3 | 23.9 | tab. 2 §4.1 |
Ablation of the joint terms (cumulative; dataset not stated) tab. 3:
| Configuration | HO distance (text: mm) | Collision score (units not stated) |
|---|---|---|
| Individual hand and object results | 414.8 | 0 |
| + Interaction loss | 71.5 | 39.8 |
| + Depth loss | 75.2 | 17.6 |
| + Penetration loss | 76.4 | 7.7 |
| + Refinement | 75.8 | 6.5 |
Annotation quality on 100 images tab. 4 §5.2:
| Size group | Object IoU | Hand IoU |
|---|---|---|
| Large | 0.84 | 0.67 |
| Medium | 0.78 | 0.69 |
| Small | 0.64 | 0.63 |
| All | 0.77 | 0.68 |
Human quality rating on a 1–5 scale: 4.16 on average; 3D object model matches the true object in 92% of cases tab. 4. The number of raters and the size thresholds are not stated.
Dataset comparison tab. 1: HO3D (lab, video, 10 participants, 10 objects), CP (lab, video, 50, 25), GRAB (lab, MoCap, 10, 51), this work (in the wild, images, 450 participants, 121 objects).
Paper vs code
No official code for the method. The only repository the paper's project page
links is ZheC/MOW (https://github.com/ZheC/MOW), which is the dataset
release: setup script, vis_anno.py visualisation, poses.json, and example
data. It has no method code and no license (checked 2026-10-19).
Searches run for the method: the project page
(https://zhec.github.io/rhoi; the old Berkeley URL redirects there), the
GitHub user ZheC's public repositories (no hand-object method repository in
the first 20 results, the list was cut), a repository search for "RHO hand
object reconstruction" (0 results), and a search for the paper title (returned
EasyHOI by lym29 and HOTrack by PKU-EPIC; neither is by the authors, so not
used).
Discrepancy inside the dataset release: the abstract and text say 500 images §1 §5; the ZheC/MOW README states 512 images.
Pitfalls
- A 3D model per object is required. Each image needs a known 3D object model. In the annotation pipeline a human picks it from a collection or finds it online §5.1. The abstract's "without 3D supervision" does not mean the method runs without 3D input.
- Loss weights are tuned per image. The annotator chooses the loss weights, and the default weights are only a starting point §5.2. The λ values in app. Implementation Details are defaults, not settings the paper tests across data. The λ symbols are defined only in the appendix: the sentence defining them in the main text is commented out in the source §3.3.
- Human verification is part of the pipeline. Reconstructions go back and forth between reconstruction and verification until the annotator accepts them §5.2. The dataset is therefore not the output of a fully automatic method.
- Scale and depth ambiguity. Hand depth is f / s_h, so the focal length f directly changes hand depth, yet f is not stated §3.1 eq. 2. The paper itself names scale ambiguity as the reason for joint optimisation §3.3.
- Monocular depth alignment is unstated. The depth map from Ranftl et al. is compared directly with the rendered depth eq. 4. The paper does not say how the depth map's scale and shift are aligned before this comparison.
- Loss scales differ widely. λ3 = 1000 weights the distance term and λ4 = 5 weights collision, a 200× spread. The units of the mask, depth and distance terms are not stated, so the weights cannot be checked for balance from the paper alone.
- Squared vs. unsquared distances. The interaction term eq. 6 uses unsquared norms, while the refinement distance field eq. 10 uses squared norms. Use the form written for each term.
- Notation in refinement. The refinement input is written (θ, γ) but the update is written for (θ, β) §3.4. γ is not defined; the text suggests it is the translation, but this is not stated.
- Hand fit terms undefined. L_joints and L_reg are named but not written out eq. 1. Their exact form, and their weights, are not stated.
- Symmetric chamfer is over whole meshes. The interaction term uses all object and hand vertices, not only contact regions eq. 6. The contact behaviour comes from the collision and refinement terms.
- Collision grid resolution. The 32³ hand grid over a tight box trades accuracy against cost. The box margin and cell size are not stated app. Implementation Details.
- Local minima. The joint optimisation can converge to undesirable local minima, and the object fit depends on 1000 random starts app. Failure Cases app. Implementation Details.
- Cost. About one minute per image on a GTX 2080 Ti [app. Implementation Details]; the 1000 object starts are the main contributor to the object step.
- Failure modes. Hand estimation fails under heavy occlusion or cropping, object pose is wrong under mask ambiguity or a poor model, and joint optimisation can settle in local minima app. Failure Cases fig. 11.
- Baseline comparison caveats. The baseline is trained with full 3D supervision and the FPHA split differs §4.1. The FPHA object error is worse than the baseline tab. 2.
- Dataset eval is small. The annotation quality numbers come from 100 images §5.2 tab. 4.
- Ablation dataset. The dataset for the ablation table is not stated §4.3 tab. 3.
- Object-size thresholds in the dataset evaluation are not stated tab. 4.
Lineage
- Builds on: FrankMocap for the initial hand estimate §3.1 (arXiv:2008.08324); MANO hand model §3.1; PointRend for the instance mask §3.2; the neural 3D mesh renderer for differentiable rendering §3.2; monocular depth from Ranftl et al. 2020 §3.2; the GRAB MoCap data for contact priors §3.4.
- Compared against: Hasson et al., CVPR 2020, "Leveraging Photometric Consistency over Time for Sparsely Supervised Hand-Object Reconstruction" §4.1.
- Superseded by: none recorded.
Source and license
Adapted from “Reconstructing Hand-Object Interactions in the Wild” by Zhe Cao, Ilija Radosavovic, Angjoo Kanazawa, Jitendra Malik (arXiv:2012.09856), used under CC BY 4.0. Changes: condensed and restructured for implementation, with tables, equations and algorithms taken from the paper and its code, each cited to its source. Not affiliated with or endorsed by the authors.