---
kind: concept
slug: pose
title: Pose (rigid position and orientation of an object)
summary: >-
  Pose is the rotation and translation that place a rigid object in a frame, six degrees of freedom. This page covers 6-D object pose. One card replaces the RANSAC-based PnP step of two-stage pipelines with an order-aware network over per-keypoint candidates. Author-reported: about twice as fast as PVNet's pipeline on the same backbone, and higher ADD-0.1d averages on Occluded-LINEMOD.
tags: [pose-estimation, 6d-object-pose, rigid-transform]
papers: ["1911.08324"]
related: [perspective-n-point, correspondence, unit-quaternion-rotation, dual-quaternion, camera-pose-encoding, pose-graph-optimization, multi-person-pose-estimation]
status: draft
updated_at: 2026-11-08
---

## Overview

A rigid object's pose has six degrees of freedom: three for orientation and
three for position. Many pipelines estimate it in two steps. A network first
finds 2-D image points that match fixed 3-D keypoints on the object model, and
a geometric solver then fits the pose to those matches [arxiv:1911.08324 §1].
The first step is trained on a 2-D error, and the second is a random-sampling
solver, so the whole chain is not trained end to end [arxiv:1911.08324 §1].

The idea shared by the variant below is to keep the 2-D matching network and
replace the solver with a small learned function. That function takes every
candidate for every keypoint and outputs a rotation, as a quaternion, and a
translation [arxiv:1911.08324 §3.1]. It has to respect two facts. Candidates
inside one keypoint's group have no order, while the groups do follow the
fixed keypoint order [arxiv:1911.08324 §3.1.1].

The word "pose" also appears in other senses on other pages: the camera pose
that a PnP solver recovers ([Perspective-n-point](/concepts/perspective-n-point)),
the camera parameters fed to a generator as positional codes
([Camera pose encoding](/concepts/camera-pose-encoding)), the human skeleton
in [Multi-person pose estimation](/concepts/multi-person-pose-estimation), and
the graph of poses in [Pose-graph optimization](/concepts/pose-graph-optimization).
This page covers only the rigid object pose sense.

## Variants

Only one paper in the wiki covers this concept, so the variants below are the
ones it compares against and the one it proposes.

### Learned replacement for RANSAC-PnP

Each candidate is embedded by a small MLP whose weights are shared across all
keypoints. For each keypoint, the features are max-pooled over its candidates.
The keypoint results are concatenated in their fixed order, and three fully
connected layers output a quaternion and a translation [arxiv:1911.08324 §3.1.2]
[arxiv:1911.08324 eq. 3]. Training uses a loss on the 3-D keypoint distance
under the predicted pose and under the true pose [arxiv:1911.08324 §3.2]
[arxiv:1911.08324 eq. 7]. The network sits after a correspondence network,
either the SegDriven or the PVNet encoder-decoder, with the 3-D keypoints
taken as the eight corners of one shared cube and 200 candidates per keypoint
[arxiv:1911.08324 §3.2]. Card:
[Single-Stage 6D Object Pose Estimation](/papers/1911.08324).

Reported gains on Occluded-LINEMOD, ADD-0.1d averages: SegDriven rises from
27.0 to 32.3 and PVNet from 40.8 to 43.3 [arxiv:1911.08324 tab. 1]. On
YCB-Video the same measure is 53.9 for this method against 39.0 for SegDriven
[arxiv:1911.08324 tab. 4]. All these numbers are the authors' own.

### Geometric PnP with RANSAC (EPnP, P3P)

The classical baseline. On synthetic data with growing 2-D noise, the
RANSAC variants do about as well as each other and beat the learned method at
very low noise [arxiv:1911.08324 §4.1] [arxiv:1911.08324 fig. 6]. The learned
method becomes clearly more accurate as noise grows [arxiv:1911.08324 fig. 6].

### Voting-based PnP (PVNet)

PVNet's own solver. The paper reports that voting wins at low noise, and the
learned replacement is more robust at high noise [arxiv:1911.08324 fig. 8].

## When to use which

| Situation | Use | Why |
|---|---|---|
| A 2-D correspondence network already exists for a fixed set of object keypoints, and speed matters | Learned replacement for RANSAC-PnP | Author-reported total of 22 ms against 40 ms for PVNet's pipeline on the same backbone [arxiv:1911.08324 tab. 3] |
| Correspondences are very precise and noise is low | Geometric PnP with RANSAC | RANSAC variants beat the learned method at very low noise on synthetic data [arxiv:1911.08324 §4.1] [arxiv:1911.08324 fig. 6] |
| Correspondences are noisy and robustness matters more than the last bit of accuracy | Learned replacement | More robust than voting-based PnP at high noise [arxiv:1911.08324 fig. 8] |
| The keypoint set may change at test time | Plan for retraining | The paper says the network works only for a fixed set of 3-D points [arxiv:1911.08324 §4.3] |
| Symmetric objects | Use a symmetry-aware metric and restrict training poses | The paper scores symmetric objects with a symmetric metric and restricts training pose ranges to avoid symmetry confusion [arxiv:1911.08324 §4.2] |
| Need to reproduce the real-data numbers from the public code | Do not rely on the release alone | The public code omits the correspondence networks and the real-data pipeline; see the card's Paper vs code section |

## Implementation sketch

The shared core of the learned variant, with notes on what the others change.
Shapes are per batch: n keypoints, m candidates per keypoint.

```pseudocode
# Input: candidate points, grouped by keypoint, shape (n, m, 2)
# Keypoint identity is the group index, not an input feature [arxiv:1911.08324 §3.2]

def pose_from_groups(groups):
    # Shared MLP on every candidate, weights tied across keypoints
    # [arxiv:1911.08324 §3.1.2]
    feats = shared_mlp(groups)                # (n, m, D)
    # Max over the candidates of each keypoint: order inside a group is ignored
    # [arxiv:1911.08324 eq. 3]
    per_kp = feats.max(axis=1)                # (n, D)
    # Concatenate in keypoint order, so position in the vector encodes identity
    # [arxiv:1911.08324 §3.1.2]
    vec = per_kp.reshape(n * D)
    # Three fully connected layers give 4 quaternion values and 3 translation values
    # [arxiv:1911.08324 §3.1.2]
    q, t = fc_head(vec)
    return q, t

# Training signal: mean distance of the 3-D keypoints under predicted and true pose
# [arxiv:1911.08324 eq. 7]
```

A single global max over all candidates would ignore keypoint order. The paper
reports that this degrades accuracy markedly [arxiv:1911.08324 fig. 7].

## Contradictions

- **Training schedule.** The paper reports 300 synthetic epochs with Adam at a
  learning rate of 1e-3 [arxiv:1911.08324 §4.1]. The public code, as recorded
  in the card's Paper vs code section, uses 200 epochs at 1e-4. Neither side is
  resolved here.
- **Noise.** The paper describes its 2-D noise by a variance [arxiv:1911.08324 §4.1].
  The public code uses the same range as a standard deviation (see the card).
  The two readings differ by a square in the noise level.
- **Synthetic grid sampling.** The paper samples candidate cells inside the
  predicted mask [arxiv:1911.08324 §4.1]. The public code samples uniformly over
  the whole image (see the card).
- **Loss.** The paper's total loss has three terms [arxiv:1911.08324 eq. 6]. The
  public code computes only the pose term (see the card).
- **Real-data results.** The numbers in the tables are author-reported
  [arxiv:1911.08324 tab. 1] [arxiv:1911.08324 tab. 4]. No second source in the
  wiki reproduces them.

## Papers

- [Single-Stage 6D Object Pose Estimation](/papers/1911.08324): a learned, order-aware network that replaces RANSAC-PnP in two-stage 6-D pose pipelines.
