Paper · 2021-04-01 · cs.CV, cs.RO
LoFTR: Detector-Free Local Feature Matching with Transformers
LoFTR matches two images without a keypoint detector. A CNN-FPN gives coarse (1/8) and fine (1/2) features; linear-attention Transformer layers make them scene-aware; dual-softmax with mutual-nearest selection gives coarse matches, refined to sub-pixel in 5x5 windows. Author-reported: 40.8 pose AUC@10 on ScanNet and 69.19 on MegaDepth (dual-softmax).
Local feature matchingSelf-attentionLinear attentionOptimal transportlocal-feature-matchingdetector-freetransformerlinear-attentionvisual-localizationrelative-pose
arXivPDFCodeMarkdown16 min read
AI-compiled by claude-haiku-5-5 on 2026-10-19, not yet reviewed by a human. Every claim cites its source; check it when a detail matters.
In plain words
Matching two photos of the same scene usually starts by finding distinctive corners or blobs in each photo and then pairing them up. On a blank wall or a repeating tile pattern there are few such spots, so the pairing breaks down. This paper skips the spot-picking step. It looks at every location in both images and decides which location in the other image it corresponds to.
Each location gets a description that depends on the whole scene. An attention layer lets every location look at every other location, both in its own image and in the other image, so a plain patch of wall can be recognised by where it sits relative to nearby edges. To keep the work affordable, the method first matches on a coarse grid, keeps the confident pairs, and then zooms into a small neighbourhood around each pair to place it precisely.
The approach is aimed at the places where spot-based matching struggles, such as indoor rooms with large plain or repetitive areas. Good matches there are what camera-pose and localisation pipelines need.
TL;DR
LoFTR is a detector-free local feature matcher. It builds dense matches between two images from Transformer features instead of from detected keypoints. Coarse matches come from a dual-softmax confidence with a mutual-nearest-neighbour filter, then each match is refined to sub-pixel accuracy inside a 5x5 window. The paper reports gains over detector-based and detector-free baselines on HPatches, ScanNet and MegaDepth. Before reimplementing, read "Paper vs code": the released code differs from the paper in the optimiser, the coarse loss, the fine-loss weighting and the positional encoding.
Problem
Detector-based pipelines (detect, describe, match) need interest points that repeat between the two images. Detectors often find too few of them under poor texture, repetitive patterns, viewpoint change, illumination change and motion blur. The problem is most visible indoors, where low-texture or repetitive regions can cover most of the view §1.
Earlier detector-free methods that match dense CNN features have a limited receptive field, so they cannot tell apart regions that look alike locally. The authors argue that a large receptive field is needed for those regions §1.
Full self-attention over all positions costs O(N²) in the number of positions. The authors call it impractical even after the CNN has reduced the grid, which is why they use a linear variant §3.2. At 640×480 input the coarse 1/8 grid has 80×60 = 4,800 positions (our arithmetic from the stated resolutions).
Method
LoFTR runs in two stages. A coarse stage (1/8 of the image side) finds candidate correspondences with Transformer features. A fine stage (1/2 of the image side) refines each candidate to a sub-pixel position §3.1 §3.4.
1. Local feature CNN. A ResNet with a feature pyramid (FPN) produces a coarse map at 1/8 and a fine map at 1/2 of the image side §3.1. The official code takes a single grayscale channel resnet_fpn.py.
2. Positional encoding and LoFTR module (coarse). A 2-D sinusoidal encoding, extended from DETR, is added once to the coarse features of each image, which are then flattened to sequences §3.2. The module alternates self-attention (an image attends to itself) and cross-attention (an image attends to the other image). The paper uses this alternation N_c = 4 times §3.2 §3.6. The attention is linear: the softmax kernel is replaced by φ(x) = elu(x) + 1, which lets the sum over positions be reordered and cost O(N) §3.2.
3. Coarse matching. The features are compared with a scaled dot product. The paper turns the scores into a confidence matrix in one of two ways §3.3:
- Dual softmax: the product of a softmax over the other image's positions and a softmax over the first image's positions.
- Optimal transport: a Sinkhorn solver with three iterations and a learned "dustbin" score for unmatched positions §3.3 §3.6.
Coarse matches are pairs whose confidence is at least θ_c = 0.2 and that are mutual nearest neighbours §3.3 §3.6.
4. Coarse-to-fine refinement. For each coarse match (i, j), the method locates the match on the 1/2 fine maps, crops a w×w window (w = 5) around each side, and runs a smaller LoFTR module on the two windows, with N_f = 1 §3.4 §3.6. The fine features of the window are concatenated with the coarse feature of the match, which the paper describes as upsampled coarse features §3.6. The centre feature of window 0 is correlated with all features of window 1, giving a heatmap. The sub-pixel position is the expectation of that heatmap §3.4. The total variance of the heatmap is the match's uncertainty §3.5.
5. Supervision. The coarse loss is a negative log-likelihood over the ground-truth coarse pairs §3.5. Ground truth comes from camera poses and depth maps: two 1/8-grid cells are a ground-truth pair when they are mutual nearest neighbours after reprojection §3.5. The fine loss is an L2 distance between the predicted position and the position warped with the ground-truth pose and depth, weighted by the inverse of the heatmap variance. The gradient does not flow through that weight. Windows where the warped point falls outside the window are skipped §3.5. The total loss is the sum of the two terms §3.5.
The pseudocode below gives the inference path. Shapes are for one image pair on a 640×480 input; the channel counts are not stated in the paper and are taken from the code defaults default.py.
# LoFTR inference for one image pair [§3.1] to [§3.4]
# Input: image0, image1: grayscale images (1, H, W)
# Output: matches (point in image0, sub-pixel point in image1)
def loftr(image0, image1):
# 1. Local feature CNN: coarse map at 1/8, fine map at 1/2 [§3.1]
coarse0, fine0 = backbone(image0) # (d, H/8, W/8), (d_f, H/2, W/2)
coarse1, fine1 = backbone(image1)
# 2. One sine encoding per image, then flatten to sequences [§3.2]
coarse0 = flatten(coarse0 + sine_encoding(coarse0)) # (L, d)
coarse1 = flatten(coarse1 + sine_encoding(coarse1)) # (S, d)
# 3. Alternate self and cross linear attention, N_c = 4 times [§3.2]
# Each attend() call is attention plus a feed-forward block, see
# "Paper vs code" [code: src/loftr/loftr_module/transformer.py#L91-L99]
for layer_name in ["self", "cross"] * 4:
if layer_name == "self":
coarse0 = attend(coarse0, coarse0)
coarse1 = attend(coarse1, coarse1)
else:
coarse0 = attend(coarse0, coarse1)
coarse1 = attend(coarse1, coarse0)
# 4. Dual-softmax confidence over all coarse pairs [§3.3]
# Code divides the dot product by d and by the temperature 0.1
# [code: src/loftr/utils/coarse_matching.py#L109-L119]
scores = matmul(coarse0, transpose(coarse1)) / (d * 0.1) # (L, S)
confidence = row_softmax(scores) * column_softmax(scores) # (L, S)
# 5. Keep pairs above theta_c = 0.2 that are mutual nearest [§3.3]
# Code also clears a 2-cell border (BORDER_RM = 2), not in the paper
matches = mutual_nearest(confidence) & (confidence > 0.2)
coarse_matches = list_of_pairs(matches) # (i, j) pairs
# 6. Crop a 5x5 fine window around each coarse match [§3.4] [§3.6]
for (i, j) in coarse_matches:
window0 = crop(fine0, centre=i, size=5) # (25, d_f)
window1 = crop(fine1, centre=j, size=5) # (25, d_f)
# Coarse feature of the match, projected and joined to every
# window position
# [code: src/loftr/loftr_module/fine_preprocess.py#L49-L58]
window0 = merge(window0, project(coarse0[i]))
window1 = merge(window1, project(coarse1[j]))
# 7. One fine self and cross round on the windows [§3.6]
window0, window1 = fine_transformer(window0, window1)
# 8. Heatmap: centre of window0 against all of window1 [§3.4]
heatmap = softmax(window1 @ window0[centre] / sqrt(d_f)) # (25,)
# 9. Sub-pixel offset: expectation of the heatmap [§3.4]
# Code scales the offset by (W // 2) * 2 pixels
# [code: src/loftr/utils/fine_matching.py#L69]
offset = expectation(heatmap) # in [-1, 1]^2
point1 = centre_of(j) + offset * 2 * (5 // 2)
# Uncertainty: total variance of the heatmap [§3.5]
variance = total_variance(heatmap)
return matchesHyperparameters
| Name | Value | Where | Notes |
|---|---|---|---|
| Coarse / fine feature resolution | 1/8 and 1/2 of image side | §3.1 | code: RESOLUTION (8, 2) default.py |
| Self/cross rounds, coarse (N_c) | 4 | §3.6 | code: 8 layers, alternating self and cross default.py |
| Self/cross rounds, fine (N_f) | 1 | §3.6 | default.py |
| Fine window size w | 5 | §3.6 | odd, in fine cells default.py |
| Coarse threshold θ_c | 0.2 | §3.6 | default.py |
| Dual-softmax temperature τ | not stated | §3.3 | code: 0.1 default.py |
| Sinkhorn iterations (OT variant) | 3 | §3.6 | default.py |
| Sinkhorn dustbin score init | not stated | §3.3 | code: 1.0 default.py |
| Coarse width d / heads | not stated | - | code: 256 / 8 default.py |
| Fine width d_f / heads | not stated | - | code: 128 / 8 default.py |
| Attention kernel | linear, φ(x) = elu(x) + 1 | §3.2 | linear_attention.py |
| Backbone | "modified ResNet-18" | §3.6 | code: 1-channel stem, block dims [128, 196, 256] default.py |
| Positional encoding | 2-D sine, added once | §3.2 | DETR-style; channel layout in supplement |
| Optimiser (ScanNet) | Adam, lr 1e-3 | §3.6 | code uses AdamW, see "Paper vs code" |
| Batch size (ScanNet) | 64 | §3.6 | |
| Training time (ScanNet) | about 24 h on 64 GTX 1080Ti | §3.6 | |
| Weight decay | not stated | - | code: 0.1 for AdamW default.py |
| Learning-rate schedule | not stated | - | code: linear warm-up 4800 steps, then MultiStepLR γ = 0.5 at [3, 6, 9, 12] default.py |
| Gradient clipping | not stated | - | code: 0.5 default.py |
| Coarse sampling in training | not stated | - | code: 0.2 indoor, 0.3 outdoor default.py loftr_ds.py |
| Coarse loss | NLL on ground-truth pairs | §3.5 | code: focal, α = 0.25, γ = 2 default.py |
| Fine correct threshold | not stated | §3.5 | code: ∞-norm < 1.0 default.py |
| Image size, ScanNet | 640×480 (grayscale) | §4.2 | scannet.py |
| Training overlap, ScanNet | 0.4 to 0.8 | §4.2 | code: minimum 0.4 only scannet.py |
| Image size, MegaDepth | longer side 840 train, 1200 val | §4.2 | code: 840 for training megadepth_trainval_840.py |
| Image size, HPatches | shorter side 480 | §4.1 | |
| Max matches, HPatches | 1K | §4.1 | same cap for baselines with direct matches |
| Pose RANSAC threshold | not stated (RANSAC) | §4.2 | code: 0.5 px default.py |
| Epipolar threshold (figures) | 5e-4 indoor, 1e-4 outdoor | fig. 1 fig. 4 | normalised image coordinates |
| Inference time, 640×480 | 116 ms (dual-softmax), 130 ms (OT) | §3.6 | RTX 2080Ti |
Results
Author-reported. The setups are as follows. HPatches: 52 illumination and 56 viewpoint sequences, one reference paired with five images, LoFTR trained on MegaDepth, OpenCV RANSAC for homography §4.1. ScanNet: 1500 test pairs from SuperGlue's list, training on 230M pairs, essential-matrix RANSAC §4.2. MegaDepth: 1500 pairs from two validation scenes §4.2. Aachen Day-Night v1.1 and InLoc through HLoc §4.3. The baselines and their defaults are given in §4.1 and §4.2.
Homography estimation, HPatches tab. 1. AUC of the corner error (%), at 3, 5 and 10 px. Max 1K matches for LoFTR.
| Category | Method | @3px | @5px | @10px | #matches |
|---|---|---|---|---|---|
| Detector-based | D2Net + NN | 23.2 | 35.9 | 53.6 | 0.2K |
| Detector-based | R2D2 + NN | 50.6 | 63.9 | 76.8 | 0.5K |
| Detector-based | DISK + NN | 52.3 | 64.9 | 78.9 | 1.1K |
| Detector-based | SuperPoint + SuperGlue | 53.9 | 68.3 | 81.7 | 0.6K |
| Detector-free | Sparse-NCNet | 48.9 | 54.2 | 67.1 | 1.0K |
| Detector-free | DRC-Net | 50.6 | 56.2 | 68.3 | 1.0K |
| Detector-free | LoFTR-DS | 65.9 | 75.6 | 84.6 | 1.0K |
Relative pose, ScanNet (indoor) tab. 2. Pose AUC (%) at 5°, 10°, 20°. DRC-Net and LoFTR-OT† are models trained on MegaDepth (†).
| Category | Method | @5° | @10° | @20° |
|---|---|---|---|---|
| Detector-based | ORB + GMS | 5.21 | 13.65 | 25.36 |
| Detector-based | D2-Net + NN | 5.25 | 14.53 | 27.96 |
| Detector-based | ContextDesc + ratio test | 6.64 | 15.01 | 25.75 |
| Detector-based | SuperPoint + NN | 9.43 | 21.53 | 36.40 |
| Detector-based | SuperPoint + PointCN | 11.40 | 25.47 | 41.41 |
| Detector-based | SuperPoint + OANet | 11.76 | 26.90 | 43.85 |
| Detector-based | SuperPoint + SuperGlue | 16.16 | 33.81 | 51.84 |
| Detector-free | DRC-Net † | 7.69 | 17.93 | 30.49 |
| Detector-free | LoFTR-OT † | 16.88 | 33.62 | 50.62 |
| Detector-free | LoFTR-OT | 21.51 | 40.39 | 57.96 |
| Detector-free | LoFTR-DS | 22.06 | 40.8 | 57.62 |
Relative pose, MegaDepth (outdoor) tab. 3. Pose AUC (%) at 5°, 10°, 20°. The text reports LoFTR-DS as 61% above DRC-Net and 13% above SuperGlue at AUC@10°; these match the DS row against the rows below §4.2.
| Category | Method | @5° | @10° | @20° |
|---|---|---|---|---|
| Detector-based | SuperPoint + SuperGlue | 42.18 | 61.16 | 75.96 |
| Detector-free | DRC-Net | 27.01 | 42.96 | 58.31 |
| Detector-free | LoFTR-OT | 50.31 | 67.14 | 79.93 |
| Detector-free | LoFTR-DS | 52.8 | 69.19 | 81.18 |
Visual localisation, Aachen Day-Night v1.1 tab. 4. Accuracy (%) at (0.25 m, 2°) / (0.5 m, 5°) / (1.0 m, 10°). Night only for the local-feature track, where the day column is not reported.
| Track | Method | Day | Night |
|---|---|---|---|
| Local features | R2D2 + NN | - | 71.2 / 86.9 / 98.9 |
| Local features | LISRD + SuperPoint + AdaLam | - | 73.3 / 86.9 / 97.9 |
| Local features | ISRF + NN | - | 69.1 / 87.4 / 98.4 |
| Local features | SuperPoint + SuperGlue | - | 73.3 / 88.0 / 98.4 |
| Local features | LoFTR-DS | - | 72.8 / 88.5 / 99.0 |
| Full HLoc | SuperPoint + SuperGlue | 89.8 / 96.1 / 99.4 | 77.0 / 90.6 / 100.0 |
| Full HLoc | LoFTR-OT | 88.7 / 95.6 / 99.0 | 78.5 / 90.6 / 99.0 |
Visual localisation, InLoc tab. 5. Accuracy (%) at (0.25 m, 10°) / (0.5 m, 10°) / (1.0 m, 10°), for the DUC1 and DUC2 query sets.
| Method | DUC1 | DUC2 |
|---|---|---|
| ISRF | 39.4 / 58.1 / 70.2 | 41.2 / 61.1 / 69.5 |
| KAPTURE + R2D2 | 41.4 / 60.1 / 73.7 | 47.3 / 67.2 / 73.3 |
| HLoc + SuperPoint + SuperGlue | 49.0 / 68.7 / 80.8 | 53.4 / 77.1 / 82.4 |
| HLoc + LoFTR-OT | 47.5 / 72.2 / 84.8 | 54.2 / 74.8 / 85.5 |
Ablation, ScanNet, OT matching tab. 6. Pose AUC (%) at 5°, 10°, 20°.
| Variant | @5° | @10° | @20° |
|---|---|---|---|
| 1) LoFTR module replaced by convolution (similar parameter count) | 14.98 | 32.04 | 49.92 |
| 2) 1/16 coarse and 1/4 fine resolution (104 ms) | 16.75 | 34.82 | 54.0 |
| 3) Positional encoding at every layer (DETR style) | 18.02 | 35.64 | 52.77 |
| 4) Larger model, N_c = 8, N_f = 2 | 20.87 | 40.23 | 57.56 |
| Full, N_c = 4, N_f = 1 | 20.06 | 40.8 | 57.62 |
The paper's text describes the ablation as using OT matching, but the Full row does not match the OT row of tab. 2. See Pitfalls.
Paper vs code
Code: the official repository at code_commit (df7ca80), Apache-2.0.
- Optimiser and learning rate. Paper: Adam, lr 1e-3, batch 64 on ScanNet §3.6. Code: AdamW with weight decay 0.1 and a canonical learning rate of 6e-3 at batch 64, scaled linearly by world size times per-GPU batch default.py train.py [code: src/optimizers/init.py#L10-L12]. The outdoor config uses 8e-3 with warm-up loftr_ds.py.
- Learning-rate warm-up and schedule. The paper states neither. The default is a linear warm-up over 4800 steps from 0 and MultiStepLR with γ = 0.5; the indoor configs use milestones up to epoch 29 default.py loftr_ds.py lightning_loftr.py.
- Coarse loss. Paper: NLL over ground-truth pairs with no focal term §3.5. Code default: focal loss with α = 0.25 and γ = 2 default.py, applied only to ground-truth positives when dual-softmax is used with sparse supervision, so unmatched cells receive no negative term loftr_loss.py loftr_loss.py.
- Fine loss. Paper: distance (norm, not squared), weighted by 1/σ² where σ² is the total variance §3.5. Code: squared distance, weighted by 1/(σx + σy) (sum of per-axis standard deviations), normalised to mean 1 and detached loftr_loss.py fine_matching.py.
- Fine-level context. Paper: coarse features are upsampled and concatenated with the fine features §3.6. Code: a linear projection of the single coarse vector at the match, copied to all 25 window positions, then concatenated and merged fine_preprocess.py. No spatial upsampling of the coarse map is visible in the code path.
- Positional encoding. Paper: DETR-style 2-D sine, added once, formula in
the supplement §3.2. Code keeps two variants behind
TEMP_BUG_FIX; the default is the corrected one, and the comment says the original buggy version is kept for backward compatibility with released models position_encoding.py default.py. The buggy variant is in loftr_ot.py. - Border removal. Paper: not mentioned. Code: removes a 2-cell border of coarse matches by default default.py coarse_matching.py. The ScanNet evaluation config sets it to 0 and states that this matches the paper's 40.8 AUC@10 loftr_ds_eval_new.py.
- Dual-softmax scaling. Paper: a score scaled by 1/τ, with no value for τ §3.3. Code: both features are divided by √d before the dot product, then the result is divided by τ = 0.1 coarse_matching.py default.py.
- Cross-attention update order. Paper: "interleave" the self and cross layers §3.2. Code: image 0 is updated first, and image 1's cross-attention then reads the updated image-0 features transformer.py.
- Feed-forward block. Paper: not described beyond the Transformer encoder
§3.2. Code: a two-layer MLP with hidden width 2d and ReLU, no bias, plus
LayerNorm after attention and after the MLP, with residual connections
transformer.py. The config keys
D_FFNare defined default.py but not read. - Backbone. Paper: "modified ResNet-18" §3.6. Code: single-channel 7×7 stem with stride 2, three residual stages of two blocks each, and a bilinear-upsampling FPN that returns the 1/8 and 1/2 maps resnet_fpn.py.
- Sinkhorn variant. Paper: OT with three iterations §3.6. Code: imports
superglue.pyat run time and stops with "download superglue.py first!" when it is absent coarse_matching.py. No file with that name is in the cloned repository. - ScanNet training overlap. Paper: pairs with overlap 0.4 to 0.8 §4.2. Code: minimum 0.4 is applied scannet.py. This file shows no maximum.
- Coarse sampling in training. Paper: not mentioned. Code: subsamples candidate coarse matches to a fraction of the batch (0.2 indoor, 0.3 outdoor) and pads them with ground-truth pairs at confidence 0, with a floor of 200 coarse_matching.py default.py loftr_ds.py.
- Fine supervision window. Paper: skip a pair whose warped point leaves the window §3.5. Code: keeps pairs whose ∞-norm offset is below 1.0 in normalised window units loftr_loss.py default.py.
- Pose RANSAC threshold. Paper: RANSAC on the essential matrix, threshold not stated §4.2. Code: 0.5 px default.py.
- MegaDepth training overlap. Paper: not stated. Code: 0.0 megadepth_trainval_840.py.
Pitfalls
- Equations are not numbered in the source. All displayed equations in the method use the starred environment, so they have no number in the PDF. Cite them by section, for example §3.3, and do not invent equation numbers.
- Supplement not in our source. The paper defers the positional-encoding formula, the full training details, the timing analysis and the visual localisation protocol to a supplement. We did not have it, so those values are "not stated" here. The code covers some of them, and the table above says which.
- Missing overview figure. The method section refers to an overview figure.
The source contains its file (
figures/sys-arch.tex), but no\inputincludes it. Figure numbers in this card are counted from the included figures: teaser fig. 1, attention layer fig. 2, self/cross attention fig. 3, qualitative matches fig. 4, qualitative attention fig. 5. If the compiled PDF numbers them differently, follow the PDF. - Ablation does not match the table. The ablation text says OT matching is used §4.4, and the Full row is "N_c = 4, N_f = 1". Its values (20.06 / 40.8 / 57.62) differ from the OT row of tab. 2 (21.51 / 40.39 / 57.96) at 5° and 10°. The 10° and 20° values match the DS row (40.8 / 57.62). Treat the ablation as internally inconsistent and compare its rows only with each other.
- Text claim against InLoc table. The text says LoFTR-OT outperforms all published methods on InLoc §4.3. In tab. 5, HLoc + SuperPoint + SuperGlue is higher at DUC1 (0.25 m) and DUC2 (0.5 m), so read the claim against the table.
- Linear attention numerics. The code divides the values by the sequence length before the reduction and multiplies back afterwards, to avoid fp16 overflow. It also adds ε = 1e-6 to the normaliser. Neither appears in the paper's formula linear_attention.py linear_attention.py.
- Coordinate scale in the fine stage. The heatmap offset lives in normalised window units. The code converts it to pixels by multiplying by the window half-width and by the fine-to-image scale, which is 2 at 640 px input. Getting this factor wrong shifts every fine match fine_matching.py fine_matching.py.
- Variance is clamped. Per-axis variances are clamped at 1e-10 before the square root, and the weight in the fine loss is detached fine_matching.py loftr_loss.py.
- Borders are zero-padded. Window extraction pads with zeros, so windows near the image border contain zero-valued features fine_preprocess.py.
- Empty match sets. With no coarse match, the fine stage returns empty results at inference. During training the code asserts that this cannot happen fine_matching.py.
- Dual-softmax leaves negatives unsupervised. Cells that are not ground-truth pairs get no training signal under dual-softmax with sparse supervision. Only the OT variant has a negative term loftr_loss.py.
- Which positional encoding to load. The code keeps two variants, and the paper does not say which one produced its reported numbers. Use the checkpoint's own configuration. The ScanNet evaluation config for the corrected encoding is in loftr_ds_eval_new.py.
- Border sensitivity. The repository says the border-removal bug fix moves the ScanNet AUC@10 from 40.8 to 39.5, which is a small change. Note which setting you use when comparing with the paper loftr_ds_eval_new.py.
- Timing. The paper reports 116 ms for dual-softmax and 130 ms for OT at 640×480 on an RTX 2080 Ti, and 104 ms for the smaller variant §3.6 §4.4. These are author measurements on one GPU.
Lineage
- Builds on: SuperGlue (Sarlin et al., 2019) for Transformer matching with self and cross attention, and for optimal transport §1 §3.2 §3.3. Linear Transformer (Katharopoulos et al., 2020) for the linear attention kernel §3.2. DETR (Carion et al., 2020), linked as DETR, for the sinusoidal positional encoding §3.2. Dual-softmax matching from neighbourhood consensus networks (Rocco et al., 2018) and DISK (Tyszkiewicz et al., 2020) §3.3. Correlation-based sub-pixel refinement (Wang et al., 2020) §3.4.
- Compared against: detector-based D2-Net, R2D2, DISK, SuperPoint with SuperGlue, ORB with GMS, ContextDesc, PointCN and OANet; detector-free Sparse-NCNet and DRC-Net §4.1 §4.2.
- Superseded by: none recorded in this wiki yet.
Source and license
Adapted from “LoFTR: Detector-Free Local Feature Matching with Transformers” by Jiaming Sun, Zehong Shen, Yuang Wang, Hujun Bao, Xiaowei Zhou (arXiv:2104.00680), used under CC BY 4.0. Changes: condensed and restructured for implementation, with tables, equations and algorithms taken from the paper and its code, each cited to its source. Not affiliated with or endorsed by the authors. Code citations refer to https://github.com/zju3dv/LoFTR at commit df7ca80f9173 (Apache-2.0). Any quoted code is shown under that license.