One model, any object, a full 9D pose
Give UniPose9D an object's mask in one RGB-D image, or in one RGB image with predicted depth, and it returns the object's rotation, translation and metric size. It needs no category label, no CAD model, no shape prior and no reference views. Instead of regressing a canonical coordinate at every pixel, it predicts them for pairs of points, calibrates metric scale from each pair, and recovers the pose with an N-hop Kabsch–Umeyama solver; flow matching handles symmetric objects. A single set of weights, trained on a mixture of public datasets, is used for every result on this page.
the same weights for all eight datasets, with no category label, CAD model, shape prior or reference view
3D-box AP at IoU 0.5 on PACE, vs 18.6 for GenPose++, the next best
of YCB-Video poses within 2 cm with RGB-D input, vs 46.5% for GenPose++; its objects and scenes were never trained on
median rotation error on YCB-Video (RGB-D), and 4.2° on HOPE, also never trained on


Yellow cuboids are the predicted metric boxes; the red, green and blue axes show the predicted orientation.
Just the image and a mask
Most pose estimators need something about the object beyond the picture. UniPose9D is category-agnostic: at inference it is not given a category name, a category template, a mean shape, an instance mesh or reference views. It learns canonical orientations from aligned pose annotations and shares one prediction head across all categories.
| Approach | Examples | Needs at inference, besides the image |
|---|---|---|
| Instance-level | PoseCNN, GDR-Net, SurfEmb | A CAD model of each target object |
| Category-level | NOCS, SecondPose, CleanPose | A fixed set of trained categories; often the category label or a mean shape |
| Reference-based | Gen6D, FoundationPose, Any6D | Reference images, a video or a 3D model of the target |
| Open-vocabulary | Oryon, OV9D, Pov9D | A text description or category prompt; some also a second view or a shape prior |
| UniPose9D | this work | Only the object's mask, with measured depth or depth predicted from the RGB image |
Point pairs instead of pixels
- FeaturesThe masked depth is back-projected to a point cloud. Each point gets a visual descriptor from DINOv2 (enhanced by 3DCorrEnhance) and a geometric one from a small multi-radius PointNet.
- Pairwise predictionPairs of points are sampled, each with three context points. A residual MLP and a transformer encode them, and a joint flow-matching head predicts the pair's two NOCS coordinates and the metric box size.
- Pose recoveryEach pair calibrates the metric scale by itself. N-hop Kabsch–Umeyama with an adaptive inlier threshold gives rotation and translation; averaging the box sizes of inlier pairs gives the size.

Why point pairs
Many more candidates
N sampled points give on the order of N² possible pairs. A budget of them is sampled (10,000 from 1,024 points by default), each seeing the object in a different context.
Differences cancel bias
The difference between two points removes any shared translation error, and the ratio of the two distances, observed over predicted, gives the metric scale directly.
Robust under occlusion
With pairs as hypotheses, RANSAC can reject the inconsistent ones and still keep enough consistent pairs when only part of the object is visible.
Symmetric objects without listing symmetries
A symmetric object has several equally valid NOCS answers for the same observation. Plain regression averages them, which matches none. The head is instead a Gaussian-mixture flow over a nine-dimensional state, the two NOCS points of a pair and the log box size, so it can represent several answers and sample one of them for the whole pair. No per-object symmetry list is needed.
From noisy pairs to a box, step by step
A toy version of the recovery stage in 2D, seen from above. The “network” here is simulated: predicted NOCS coordinates are the true ones plus noise, and a share of the pairs are pure outliers. Everything after that, the per-pair scale, the RANSAC hops with the adaptive threshold and the size average, is computed live as in the paper.
Object
Noise in predicted NOCS
Outlier pairs
Pairs sampled, T
Four benchmarks, the same weights
The training mixture is the training splits of PACE, Omni6DPose, NOCS and HouseCat6D; the model is evaluated on their held-out test sets with each benchmark's own metrics and no fine-tuning. On PACE it leads every reported metric, and on Omni6DPose it leads or ties every one. On NOCS REAL275 and HouseCat6D it is competitive with category-level specialists that are trained for each benchmark's fixed categories: close to SecondPose on REAL275 and ahead of it on HouseCat6D, while the recent specialist CleanPose scores higher on both.
Cat: a category-level specialist, trained for a fixed set of categories with category-specific inputs or branches. Gen: generalizable, needing no category label, mean shape, CAD model or reference view at inference.

What if the baselines train on the same four datasets?
Retraining GenPose++, SecondPose and CleanPose on the same mixture (“All-DS”), UniPose9D leads the jointly trained models on all four benchmarks. The NOCS-only SecondPose and CleanPose checkpoints keep a higher REAL275 score; that is a different training setting. SecondPose and CleanPose stay category-conditioned, and CleanPose needs a 190-category head for the combined taxonomy.
Datasets and categories it never trained on
YCB-Video and HOPE are not in the training mixture: none of their object instances or scenes were seen. With RGB-D input, more than 91% of poses are within 2 cm and the median rotation error is about 4°. With RGB alone, depth comes from MoGe-2. Rotation stays usable (median 8.9° and 7.6°), but metric translation mostly fails (3.4% and 1.5% within 2 cm), because any error in the predicted depth scale goes straight into the translation; on HOPE, GenPose++ is slightly better on that one number.

Categories absent from training
A stricter test keeps only categories with no example in the four training datasets, such as the power drill and pitcher of YCB-Video or the ladle and whisk of HANDAL. (This says nothing about what the pretrained DINOv2 or MoGe-2 saw.)
| Dataset | Unseen categories | Examples | 5° 2 cm | 5° 5 cm | 10° 2 cm | 10° 5 cm |
|---|---|---|---|---|---|---|
| YCB-Video | 5 | 3,543 | 40.6 | 40.8 | 63.8 | 64.2 |
| HOPE | 2 | 225 | 64.9 | 64.9 | 85.8 | 86.7 |
| Omni6D | 13 | 9,530 | 15.6 | 26.4 | 20.3 | 32.3 |
| HANDAL | 5 | 25 | 56.0 | 64.0 | 60.0 | 76.0 |
Omni6D is a different dataset from Omni6DPose. Its baselines train on Omni6D and are tested on its 13 held-out categories; UniPose9D is evaluated zero-shot on the same split. It is ahead on box IoU (50.7 vs 36.9) and on every rotation and joint metric, while the trained baselines are more accurate on translation alone. On HANDAL, 25 examples from five unseen categories serve as a small diagnostic.
In the wild

What matters, what it costs, where it fails
On REAL275, removing the geometric PointNet features or replacing flow matching with plain regression costs the most. Predicting NOCS per point instead of per pair, dropping the pairwise scale calibration, or using plain RANSAC instead of the N-hop loop each lose a few points.
Speed
Estimating one object's pose takes 2.8 s on an RTX A6000 with the default 10,000 pairs, and most of that is flow sampling. With 3,000 pairs the REAL275 accuracy is the same and it takes about 1 s. Mask and depth prediction for RGB input are not included.
Where the 2.8 s go
Sensitivity
How the REAL275 score moves with the pair budget, the solver settings, and corrupted masks or depth.
Limitations
The model targets rigid indoor objects of moderate size and needs an instance mask. Its accuracy depends on the mask and the depth; with RGB input, errors of the predicted depth mainly hurt the metric translation. Flow sampling dominates the runtime, which limits uses that need frequent pose updates.
Two typical failures are shown on the right: under severe occlusion too few reliable correspondences remain, and very thin objects leave the box size and orientation ambiguous.

Try it on your own image
The demo runs on Hugging Face Spaces: upload an image, mark the object with point prompts, and estimate its 9D pose. Depth and camera intrinsics are predicted when you only have RGB.
The demo is a separate app hosted by Hugging Face; it loads when you ask for it.
Run it locally
- Inference release with the checkpoint (Git LFS), a command-line tool and an interactive app.
- Masks come from SAM2 with a point prompt, or from a text prompt through GroundingDINO.
- Depth and intrinsics are optional: when missing, MoGe estimates them from the RGB image.
- Licence: Apache 2.0. The curated training set is announced as coming soon.
UniPose9D builds on DINOv2, SAM2, GroundingDINO and MoGe, each under its own licence.
git clone https://github.com/qq456cvb/UniPose9D && cd UniPose9D git lfs install git lfs pull --include=checkpoints/last.ckpt conda env create -f environment.yml conda activate unipose9d
# the bundled example: RGB only, mask from a point prompt python infer/unipose9d_inference.py \ --rgb examples/desktop_scene/example.jpg \ --sam2-point 540 430 1 # your own image, with a text prompt and sensor depth in mm python infer/unipose9d_inference.py --rgb rgb.png \ --sam2-text "object" --depth depth.npy --depth-scale 0.001 python infer/app_unipose9d_pose.py # interactive app
Read the full abstract
Object pose estimation is a fundamental problem in 3D vision. Although recent state-of-the-art approaches achieve strong performance, generalization to novel categories and unseen scenes remains challenging. We propose UniPose9D, a unified model for category-agnostic 9D object pose estimation: given an instance mask/ROI and either an RGB-D observation or an RGB image with predicted depth, the model estimates rotation, translation, and metric size without category labels, CAD models, mean-shape priors, or reference views. Specifically, UniPose9D samples point pairs from the observed object geometry and uses DINOv2 and PointNet features to predict NOCS coordinates for each pair. To improve accuracy, we introduce a point-pair-based RANSAC N-hop Kabsch–Umeyama algorithm with an adaptive threshold. We further employ flow matching to address symmetric ambiguities and construct a large-scale training set by curating and aligning pose annotations from existing public datasets. Experiments across eight datasets show that a single unified model achieves competitive performance on standard benchmarks while generalizing to unseen objects, unseen categories, and in-the-wild scenarios.
BibTeX
@misc{you2026unipose9duniversalcategoryagnosticobject,
title={UniPose9D: Universal Category-Agnostic Object Pose Estimation},
author={Yang You and Yi Du and Cole Harrison and Leonidas Guibas},
year={2026},
eprint={2607.09985},
archivePrefix={arXiv},
primaryClass={cs.CV},
url={https://arxiv.org/abs/2607.09985}
}