Evaluation and measurement
Software and hardware
All four platforms use builds based on NVIDIA PyTorch 26.05. OpenCV and COLMAP are compiled with CUDA support for each GPU architecture.
| NVIDIA PyTorch container release | 26.05 |
|---|---|
| Python | 3.12.3 |
| PyTorch | 2.12.0a0+5aff3928d8.nv26.05 |
| CUDA toolkit | 13.2.1.009 (PyTorch CUDA 13.2) |
| cuDNN | 9.22.0.52 |
| OpenCV | 4.15.0-dev, built with CUDA |
| COLMAP / PyCOLMAP | 3.13.0, built with CUDA |
| NumPy / Pillow | 2.4.2 / 12.2.0 |
| Platform | CPU architecture | Power setting | Frequency settings |
|---|---|---|---|
| RTX 5070 Ti | x86_64 | 300 W | CPU governor: performance |
| RTX 5060 Ti | x86_64 | 180 W | CPU governor: performance |
| Jetson AGX Thor | aarch64 | MAXN | No additional clock lock |
| Jetson Orin Nano | aarch64 | MAXN_SUPER | No additional clock lock |
RTX CPU governors use the performance setting, and GPU persistence mode is enabled. Jetson uses the listed power modes without an additional clock lock.
Inputs and configurations
We evaluate nine matching pipelines at 128, 256, 512 and 1024 pixels on the longest image side. Every configuration uses the same 100 image pairs within a task. Common resizing uses Pillow bilinear interpolation; each matcher then applies its own preprocessing.
For accuracy evaluation, visible STheReO images are reconstructed as RGB from BGGR Bayer data. Resource measurements use the original single-channel Bayer images. RUBIK uses its original RGB images. Thermal images use fixed clipping bounds from the 0.5th and 99.5th percentiles of the sampled frames, followed by linear conversion from 14 to 8 bits.
FP32 uses FP32 weights and inputs. MP keeps FP32 weights and enables FP16 autocasting. FP16 uses FP16 weights and inputs in supported pipelines. The common runner disables autocasting for FP32 and FP16, and TF32 is disabled. ORB and SIFT use their native numerical formats; DKM and MASt3R do not support the evaluated FP16 mode.
Pose accuracy
Accuracy is evaluated on RTX 5070 Ti using the SuperGlue pose evaluation protocol. Pose error is the larger of the rotation error and translation-direction error, with translation sign ambiguity accounted for.
Camera calibration is used to undistort the correspondences. Coordinates and intrinsics are then scaled to the evaluation resolution. Essential-matrix estimation uses OpenCV RANSAC with a 1-pixel threshold at that resolution and confidence 0.99999. Pairs with fewer than five correspondences are not passed to the estimator.
Pose AUC integrates the error–recall curve up to 5°, 10° or 20°, normalizes by that threshold, and is reported as a percentage. All 100 pairs are included; failed estimates have infinite error. Success ratio is the percentage of pairs whose pose error is within the selected angle.
Example images
Summary metrics use all 100 pairs in the selected task. The example viewer shows up to five successful and five failed pairs spread across the pose-error range for the chosen angle. All returned correspondences are drawn. Green and red indicate whether the squared symmetric epipolar distance is below or at least 5 × 10−4, using the reference pose in undistorted, normalized camera coordinates.
Task previews use pair 50 of 100 for RUBIK and daytime visible–thermal matching, and pair 25 for both day–night tasks, after ranking pairs by decreasing success count across the nine matchers at 10°, then increasing mean pose error, at 512 px with FP32 or Native precision. For this preview ranking only, unestimated poses are assigned 180°. The ranking is computed independently for each task.
Matcher settings
We use public pretrained weights without additional training. MatchAnything refers to its ELoFTR-based variant. For learned matchers, preprocessing and matching parameters are based on the authors’ public code. These settings are kept fixed across datasets and hardware platforms. No common limit is applied to the number of returned correspondences.
| Pipeline | Settings |
|---|---|
| ORB | CUDA ORB; up to 500 features; scale factor 1.2; up to 8 pyramid levels; FAST threshold 20; Hamming distance with cross-check. |
| SIFT | GPU SIFT; up to 8192 features; octave resolution 3; peak threshold 0.0066667; RootSIFT; ratio 0.8, maximum distance 0.7, cross-check. |
| SuperPoint+SuperGlue | SuperPoint threshold 0.005, NMS radius 4, no feature cap; SuperGlue outdoor weights, 20 Sinkhorn iterations, matching threshold 0.2. |
| SuperPoint+LightGlue | SuperPoint threshold 0.0005, NMS radius 4, no feature cap; LightGlue threshold 0.1, depth confidence 0.95, width confidence 0.99; Flash disabled. |
| LoFTR | Outdoor dual-softmax weights; coarse threshold 0.2; grayscale conversion and internal crop to a multiple of 8. |
| ELoFTR | Outdoor weights; coarse threshold 0.1; internal linear interpolation and multiple-of-32 dimensions; no square padding; RepVGG inference conversion. |
| MatchAnything (ELoFTR) | ELoFTR-based public weights; coarse threshold 0.1; LANCZOS interpolation and multiple-of-32 dimensions; no square padding or RepVGG conversion; author MTD_SPVS candidate selection; strict weight loading. |
| DKM | DKMv3 outdoor; threshold-balanced sampling of 10,000 correspondences, threshold 0.05; Gaussian-process solve remains FP32 in mixed precision. |
| MASt3R | Public ViTLarge 512 metric weights; dot-product reciprocal nearest-neighbor matching, stride 8, at most 10 iterations, 3-pixel border exclusion; no added confidence threshold. |
Runtime
Each configuration begins with 3 seconds of idle time, 10 warm-up calls and two passes over all 16 resource pairs, for 42 warm-up calls. Runtime is measured in a separate container with CUPTI disabled. We report the median of three calls per pair, followed by the median over four pairs per task.
The timed interval includes matcher-specific preprocessing, CPU–GPU transfers, matching, correspondence return, result checks and GPU completion synchronization. Image loading, common resizing, model loading, warm-up and pose estimation are outside this interval.
GPU memory
CUPTI records CUDA allocation and release events from before model loading. For each pair, we take the peak process allocation during its measurement interval after warm-up. This includes allocations still in use, such as model weights and buffers. The reported value is the median of the four per-pair peaks, converted from MiB to GiB by dividing by 1024.
Energy per pair
After memory measurement, CUPTI is disabled and each pair is matched repeatedly for at least 6 seconds and at least five calls. Power is sampled at a target interval of 100 ms. We integrate power over the active interval and divide by the number of completed calls, without subtracting idle power. The reported value is the median over four pairs per task.
| Platform | Measured power |
|---|---|
| RTX 5070 Ti / RTX 5060 Ti | GPU board power |
| Jetson AGX Thor | GPU rail, VDD_GPU |
| Jetson Orin Nano | Combined CPU/GPU/CV rail, VDD_CPU_GPU_CV |
The power domains follow the telemetry available on each platform. Orin Nano's energy includes the CPU and CV rail as well as the GPU, so its measurement scope differs from the other platforms.
OOM and unsupported modes
The resource dataset contains 1,344 configurations. The 56 Orin Nano configurations that ran out of memory have missing measurements and zero valid pairs. Unsupported precision modes are recorded separately. The selection tool lists configurations that satisfy the selected limits and highlights those with the highest positive pose AUC.
Data and sources
Accuracy · Resource measurements · Pair results · Input manifest · Data source hashes
The accuracy manifest identifies 400 image pairs and their image hashes. Images come from RUBIK and STheReO. Dataset rights remain with their authors; this site displays reduced-size previews.