EgoRayFormer: Ray-Space Stereo Refinement for Egocentric 3D Human Pose Estimation
Organizations: Boden AI
Abstract
Head-mounted stereo fisheye cameras provide a compact view of the wearer's body, but strong distortion, partial visibility and a short baseline make 3D pose estimation difficult. Existing refinement decoders sample image features independently in each view, without requiring the samples to correspond to a common 3D hypothesis. We introduce EgoRayFormer, a causal pose estimator that couples stereo feature sampling and geometric refinement in ray space. For each joint, the decoder projects shared 3D hypotheses along and around its viewing ray into both images. A geometric branch then corrects the projected joint locations and intersects the resulting rays; a learned gate blends this geometric estimate with a learned pose update. This formulation introduces an explicit stereo constraint while retaining flexibility when the rays provide weak depth constraints. In local evaluations on the official device-relative test splits, EgoRayFormer achieves three-seed mean MPJPEs of 17.64 mm on UnrealEgo2 and 49.55 mm on UnrealEgo-RW, improving to 47.57 mm with UnrealEgo2 pre-training. In paired validation ablations, removing the geometric branch increases MPJPE in all three seeds at both input resolutions. With a common ResNet-18 encoder and input resolution, our system reduces RW test MPJPE by 9.09 mm relative to the device-relative EgoPoseFormer baseline. A separate protocol analysis quantifies the difference between device-relative and oracle-root evaluation.
Figures & tables
| UnrealEgo2 | RW, trained on RW | RW, trained on UE2 + RW | |||||||
|---|---|---|---|---|---|---|---|---|---|
| Method | Backbone | Frames | Extra input | MPJPE | PA | MPJPE | PA | MPJPE | PA |
| EgoGlass † [ 37 ] | R18 | 1 | – | 79.64 | 58.22 | – | – | 97.86 | 69.92 |
| UnrealEgo [ 1 ] | R18 | 1 | – | 72.82 | 52.90 | – | – | 92.48 | 67.15 |
| Akada et al . [ 2 ] | R18 | 5 | scene depth | 30.53 | 26.72 | 104.14 | 82.18 | 72.89 | 56.19 |
| EgoRayFormer (ours) | ViT-S+ | stream | calibration | 17.64 0.12 | 16.86 0.08 | 49.55 0.40 | 40.59 0.30 | 47.57 0.34 | 37.21 0.46 |
| Val | Test | |||
| Method | Frames | MPJPE | MPJPE | PA |
| UnrealEgo-RW, trained on RW | ||||
| EPF-device [ 36 ] | 1 | 60.17 1.48 | 77.85 3.20 | 62.02 1.22 |
| TSR-like | 8, causal | 77.97 3.23 | 98.92 7.27 | 77.32 4.81 |
| EgoRayFormer-R18 | stream | 54.73 0.68 | 68.76 1.36 | 52.78 1.22 |
| UnrealEgo2, trained on UnrealEgo2 | ||||
| Variant | MPJPE / | worse | PA / | MPJVE / |
|---|---|---|---|---|
| Full model, input | 43.79 0.64 | – | 31.74 | 12.02 |
| input | +2.83 0.78 | 3/3 | +4.15 | +0.94 |
| w/o geometric branch | +0.92 0.51 | 3/3 | +0.65 | +0.19 |
| w/o trajectory sampling | 0.04 0.94 | 2/3 | 0.25 | 0.07 |
| w/o track prior | 0.54 1.59 | 2/3 | 0.34 | +0.22 |
| plain encoder | +0.05 1.84 | 1/3 | 0.47 | 0.24 |
| Protocol | MPJPE (own) | RA-MPJPE | PA-MPJPE |
|---|---|---|---|
| Device | 77.97 3.23 | 79.45 4.42 | 61.45 3.71 |
| Oracle root | 57.35 0.74 | 57.41 0.79 | 48.57 0.57 |
| Difference | 20.62 3.12 | 22.04 4.23 | 12.88 3.71 |
| Pairs lower | 3/3 | 3/3 | 3/3 |
| Params | GFLOPs | Latency | |||
|---|---|---|---|---|---|
| Model | Input | (M) | total | encoder | (ms) |
| EgoRayFormer | 384 | 35.1 | 106.9 | 97.4 | 42.8–43.7 |
| EgoRayFormer-R18 | 256 | 13.7 | 17.9 | 13.6 | 35.4 |
| TSR-like | 256 | 12.8 | 17.4 | 13.6 | 11.2 |
| EPF-device ‡ | 256 | 14.2 | 14.7 | 13.6 | 7.5 |
Appendix figures & tables5 assets
Supplementary material from the paper’s appendix.
Appendix
| Method | Encoder, input, pre-training | 3D training data | Temporal context | Extra input at inference | Numbers |
|---|---|---|---|---|---|
| EgoRayFormer (ours) | DINOv3 ViT-S+/16, ; LVD-1689M, then heatmap stage on the target training split | UE2: 3 epochs on UE2. RW: 12 epochs on RW. UE2 + RW: UE2 model of the same seed, then 12 epochs on RW | causal stream over the whole sequence; temporal attention over 8 frames, trajectory sampling over 4 past frames, previous-frame prior | calibration: synthetic UE2 rig; RW intrinsics of the dataset and per-session extrinsics fitted to training annotations | device-relative; local, frozen, 3 seeds |
| Akada et al . [ 2 ] (T=5) | 2D module ResNet-18, , ImageNet; backbones of the depth and heatmap feature extractors not stated | UE2: UE2. RW, UE2 + RW: UE2 pre-training, RW fine-tuning. RW only: as labelled on the leaderboard | stereo video, 5 frames with skip 3, last time step is predicted | depth rendered from a structure-from-motion reconstruction of a 4 s window; whether the window extends beyond the current frame is not stated | leaderboard |
| UnrealEgo [ 1 ] | ResNet-18, ; pre-training of the leaderboard entry not stated | UE2: UE2. RW: UE2, then RW | single stereo frame | none | leaderboard |
| EgoGlass † [ 37 ] | ResNet-18, ; re-implemented without the body-part segmentation branch | as UnrealEgo | single stereo frame | none | leaderboard |
| TSR-Ego [ 4 ] | ResNet-18 + FPN, ; dataset-specific heatmap pre-training | official training splits; no UE2 pre-training reported for RW | causal windows of 8 frames; test windows with stride 8 | fisheye calibration; the root in each camera as projection origin (UE2 pelvis, RW mid-hip); ground-truth or predicted root at inference not stated | root-relative, preprint |
| EgoPoseFormer ∗ [ 36 ] | official code: ResNet-18 + FPN, ; ImageNet, then heatmap stage | not stated | single frame | the official data loader uses the ground-truth pelvis of each frame as projection origin; whether the retraining kept it is not stated | root-relative, reported by [ 4 ] |
| EgoRayFormer | |||||
|---|---|---|---|---|---|
| Session | Frames | RW | UE2 + RW | R18 | EPF-device |
| 2023-01-17 § | 9,023 | 47.99 | 43.01 | 64.91 | 75.28 |
| 2023-08-23 | 7,306 | 44.72 | 43.34 | 58.27 | 59.34 |
| 2023-08-25 | 7,683 | 55.97 | 56.94 | 83.25 | 98.46 |
| Upper body | 31.43 | 32.21 | 42.67 | 50.66 | |
| Lower body | 67.67 | 62.92 | 94.85 | 105.04 | |
| final output | last layer | ||||||
|---|---|---|---|---|---|---|---|
| cm | % | MPJPE | along | lateral | learned | gate | |
| 0–20 | 6.4 | 13.5 | 9.0 | 9.6 | 13.5 | 13.6 | 0.46 |
| 20–40 | 20.9 | 21.6 | 14.4 | 15.6 | 21.3 | 21.4 | 0.39 |
| 40–60 | 14.6 | 28.7 | 22.6 | 19.0 | 28.1 | 29.0 | 0.35 |
| 60–80 | 18.3 | 33.2 | 24.4 | 21.7 | 32.5 | 33.7 | 0.34 |
| 80–100 | 5.6 | 41.4 | 32.6 | 30.3 | 40.6 | 41.9 | 0.34 |
| UnrealEgo2 | RW, trained on RW | |||
| Method | MPJPE | PA | MPJPE | PA |
| root-relative, as reported | ||||
| EgoPoseFormer [ 36 ] ∗ | 23.12 | 21.69 | 74.31 | 61.79 |
| TSR-Ego [ 4 ] , 2 layers | 22.36 | 21.23 | 65.58 | 56.03 |
| TSR-Ego [ 4 ] , 4 layers | – | – | 62.8 | 55.3 |
| root-aligned, three-seed mean | ||||
3D Human Pose Estimation
3D human pose estimation recovers people’s body-joint positions or full-body shape and motion from images, video, and other sensors.
See all 113 papers