MatcherCompassBack to selection

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 release26.05
Python3.12.3
PyTorch2.12.0a0+5aff3928d8.nv26.05
CUDA toolkit13.2.1.009 (PyTorch CUDA 13.2)
cuDNN9.22.0.52
OpenCV4.15.0-dev, built with CUDA
COLMAP / PyCOLMAP3.13.0, built with CUDA
NumPy / Pillow2.4.2 / 12.2.0
PlatformCPU architecturePower settingFrequency settings
RTX 5070 Tix86_64300 WCPU governor: performance
RTX 5060 Tix86_64180 WCPU governor: performance
Jetson AGX Thoraarch64MAXNNo additional clock lock
Jetson Orin Nanoaarch64MAXN_SUPERNo 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.

PipelineSettings
ORBCUDA ORB; up to 500 features; scale factor 1.2; up to 8 pyramid levels; FAST threshold 20; Hamming distance with cross-check.
SIFTGPU SIFT; up to 8192 features; octave resolution 3; peak threshold 0.0066667; RootSIFT; ratio 0.8, maximum distance 0.7, cross-check.
SuperPoint+SuperGlueSuperPoint threshold 0.005, NMS radius 4, no feature cap; SuperGlue outdoor weights, 20 Sinkhorn iterations, matching threshold 0.2.
SuperPoint+LightGlueSuperPoint threshold 0.0005, NMS radius 4, no feature cap; LightGlue threshold 0.1, depth confidence 0.95, width confidence 0.99; Flash disabled.
LoFTROutdoor dual-softmax weights; coarse threshold 0.2; grayscale conversion and internal crop to a multiple of 8.
ELoFTROutdoor 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.
DKMDKMv3 outdoor; threshold-balanced sampling of 10,000 correspondences, threshold 0.05; Gaussian-process solve remains FP32 in mixed precision.
MASt3RPublic ViTLarge 512 metric weights; dot-product reciprocal nearest-neighbor matching, stride 8, at most 10 iterations, 3-pixel border exclusion; no added confidence threshold.

Download checkpoint hashes.

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.

PlatformMeasured power
RTX 5070 Ti / RTX 5060 TiGPU board power
Jetson AGX ThorGPU rail, VDD_GPU
Jetson Orin NanoCombined 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.