# Component Fit Matrix — C2: Visual Place Recognition (VPR)

> Mode A Phase 2 — engine Step 7.5 (Component Applicability Gate, structured per-component candidate-selection table). Status vocabulary in [`00_summary.md`](00_summary.md). Detailed fact cards backing every status verdict live in [`../02_fact_cards/C2_vpr.md`](../02_fact_cards/C2_vpr.md).
>
> Index: [`00_summary.md`](00_summary.md). Sibling components: [C1 VIO](C1_vio.md), [C3 Matchers](C3_matchers.md), [C4 Pose](C4_pose_estimation.md), [C5–C10 pending](C5-C10_pending.md). Cross-component gates: [`99_cross_component_gates.md`](99_cross_component_gates.md).

---

## C2 — Visual Place Recognition (VPR) [mandatory pre-screen CLOSED at documentary level 2026-05-08; conditional candidates AnyLoc/BoQ/DINOv2-VLAD remain GATED on prerequisite INT8 quantization survey]

**Pinned mode** (per-frame retrieval contract, identical for every C2 candidate; per-candidate mode variations are: input image size, backbone, descriptor dimensionality, training-domain provenance, inference runtime):

- inputs: `{1× ADTi 20MP nav frame stream → center-cropped + bilinearly downscaled to candidate's native input size + ImageNet-normalised}` on `Jetson Orin Nano Super (8 GB shared, JetPack 6, ROS 2 Humble; PyTorch fp16 baseline; final inference runtime selection deferred to C7)`
- outputs: `{global descriptor per frame; cosine top-K (K=10 per Fact #25) retrieval against pre-cached descriptor table over the project's ~400 km² operational area's tiles at AC-8.1 resolution floor (≥0.5 m/px)}` feeding C3 (cross-domain matcher)

**Locked-in research-time defaults** (carried forward from C1 — Fact #41):
- D-C1-1 = (c) **keep both license tracks open** through Plan; final license decision deferred to post-Jetson-MVE.
- D-C1-2 = (b) **defer Jetson Orin Nano Super hardware MVE to a dedicated bring-up phase** between research and Plan; research closes with documentary ranking + per-candidate `Verify` gates.
- **C2-specific**: most C2 candidates are MIT/Apache permissive — license-track concern is less material than C1's GPL-3.0 vs BSD split; this row tracks license but does not split by track.

| # | Candidate | License | Per-mode verification | Status | Lead reason / disqualifier | Sub-matrix cite |
|---|---|---|---|---|---|---|
| 1 | **MixVPR** (ResNet50+MixVPR @ 320×320 → 2048-D) | MIT (BSD/permissive track) | ✅ Fact #42 + Source #57 + #58 | **Documentary lead with aerial-domain-training caveat** | OpenVPRLab canonical reference implementation; runnable per-mode example with project's pinned config; FAISS retrieval harness; descriptor cache ~650 MB fp16 within 10 GB AC-8.1 budget; 1.21 ms A100 latency baseline extrapolates well within AC-4.1 budget. **Caveat**: canonical weights are GSV-Cities (street-view) trained — Plan-phase decision required between (a) project-domain retrain on AerialVL, (b) aerial-trained community checkpoint, (c) elevate alternate C2 candidate | `../02_fact_cards/C2_vpr.md` → "MixVPR — per-numbered binding" |
| 2 | **SALAD** (DINOv2 ViT-B/14 + SALAD aggregator @ 322×322 → 8448-D full / 2112-D / 544-D slim) | **GPL-3.0** (canonical, GPL-3.0 track) | ✅ Fact #43 + Source #59 + #60 + #61 | **Documentary lead with aerial-domain-training caveat + GPL-3.0-license-track caveat + DINOv2-ViT-export risk caveat** | Canonical CVPR 2024 implementation (`serizba/salad`); Torch-Hub one-liner `torch.hub.load("serizba/salad", "dinov2_salad")` for full variant; eval CLI ships three pretrained checkpoints (full 8448-D, slim 2112-D, slim 544-D); 2.41 ms RTX 3090 latency baseline extrapolates ~20–30 ms on Jetson Orin Nano Super at fp16 with TensorRT; **+11 R@1 absolute over MixVPR on MSLS Challenge** (75.0 vs 64.0 per paper Table 1) and **+17.6 R@1 on NordLand** (76.0 vs 58.4) — strongest cross-season generalization signal among the documented C2 candidates. Single-stage design (no re-ranking), built-in dustbin discards uninformative regions, optimal-transport assignment is bidirectional (feature-to-cluster + cluster-to-feature). **Three caveats vs MixVPR**: (i) GPL-3.0 license places SALAD on copyleft track — interacts with D-C1-1 license posture; under BSD/permissive lock at Plan, SALAD is excluded; (ii) DINOv2 ViT-B export to TensorRT fp16/INT8 on Jetson is paper-acknowledged "slower than ResNet" + industry-known harder than CNN export — D-C2-5 deferred Jetson MVE risk; (iii) full 8448-D descriptor cache consumes ~2.7 GB / ~27% of 10 GB AC-8.3 cache budget vs MixVPR's ~650 MB / 6.5% — D-C2-6 descriptor-size-choice trade-off; slim 544-D variant restores feasibility (~0.17 GB / 1.7%) at cost of ~5 R@1 points on MSLS Challenge | `../02_fact_cards/C2_vpr.md` → "SALAD — per-numbered binding" |
| 3 | **SelaVPR** (DINOv2 ViT-L/14 frozen + Global+Local Adaptation adapters @ 224×224 → 1024-D global + 61×61×128 dense local; two-stage retrieval+rerank) | **MIT** (BSD/permissive track) | ✅ Fact #44 + Source #62 + #63 + #61 | **Documentary lead with aerial-domain-training caveat + DINOv2-ViT-L-export risk caveat (HARSHER than SALAD-ViT-B) + two-stage-latency-and-local-feature-cache-strategy risk caveat** | Canonical ICLR 2024 implementation (`Lu-Feng/SelaVPR`); training+eval CLIs (`python3 train.py --foundation_model_path=/path/to/dinov2_vitl14_pretrain.pth`, `python3 eval.py --rerank_num={20,100}`); two pretrained checkpoints (MSLS-finetuned for diverse scenes / Pitts30k-further-finetuned for urban) + optional `--registers` variant. **First DINOv2-based C2 candidate on BSD/permissive track — materially expands BSD/permissive C2 axis options vs MixVPR-only state**. RTX-3090 baseline 0.027 s extraction + 0.085 s matching (rerank_num=100) = 0.112 s total per query (paper Table 3). Extrapolation to Jetson Orin Nano Super: ~200–270 ms extraction + ~150 ms matching at rerank_num=20 = ~350 ms (tight against AC-4.1 400 ms budget; **rerank_num=100 FAILS budget**). Global descriptor 1024-D = ~320 MB cache (smallest of all C2 candidates, 3.2% of 10 GB AC-8.3 budget); **dense 61×61×128 local-feature cache ~150 GB across operational area = INFEASIBLE without D-C2-7 mitigation strategy** (cache global only + on-demand local-feature re-extraction, OR precompute top-K, OR disable rerank). **Three caveats vs MixVPR**: (i) DINOv2-ViT-L (300M params) backbone is 3.5× larger than SALAD-ViT-B's 86M and 12× larger than MixVPR-ResNet50's 25M — D-C2-5 export risk **harshest in C2 row so far**; counter-mitigation by frozen-backbone canonical TensorRT export pathway (FB AI Public Files); (ii) two-stage retrieval+rerank is structurally novel — D-C2-7 strategy choice; (iii) input size 224×224 is more aggressive downscale from 5472×3648 than MixVPR's 320×320 / SALAD's 322×322. **Documentary advantage**: Tokyo24/7 R@1=94.0 (best in paper Table 2 across all compared methods, +9 absolute over MixVPR's 85.1, +5.4 over prior SOTA R²Former 88.6); Nordland-test R@1=85.2 (vs SALAD's 76.0 and MixVPR's 58.4) — strongest cross-illumination + cross-season generalization signal among C2 candidates so far on ground-level (aerial unverified — D-C2-1) | `../02_fact_cards/C2_vpr.md` → "SelaVPR — per-numbered binding" |
| 4 | **NetVLAD** (VGG-16 cropped at conv5_3 + NetVLAD pooling `vlad_preL2_intra` K=64 + PCA-whitening @ 224×224 → 4096-D global descriptor; canonical Pittsburgh-30k-pretrained variant) | **MIT** canonical (`Relja/netvlad`); **license-uncertain** Nanne PyTorch port (BSD/permissive track on canonical) | ✅ Fact #45 + Source #64 + #65 + #66 | **Mandatory simple-baseline** with MIT license + license-uncertain-Nanne-port caveat + established-baseline-accuracy-deficit-as-feature + runtime-stack-port-risk caveat + 4096-D-descriptor-cache caveat + aerial-domain-training caveat | Canonical learned-VLAD reference baseline for the entire VPR field (CVPR 2016, > 4000 citations); cited as the baseline in every subsequent VPR paper (MixVPR Table 1+4, SALAD Table 1, SelaVPR Table 2+3, AnyLoc, BoQ). Role per engine Component Option Breadth rule: **mandatory simple-VLAD baseline that establishes the long-established reference point against which modern C2 leads must show measurable advantage to justify added complexity**. Documented Recall@K deficit vs modern leads is expected and IS the role's purpose: Pitts30k-test R@1=84.1 (paper) / 85.2 (PyTorch reproduction) — **5-11 absolute below** MixVPR/SALAD/SelaVPR; Tokyo24/7 R@1=73.3 — **11.8-20.7 absolute below**; Nordland-test R@1≈33 — **25-52 absolute below**. **POSITIVE structural advantage**: VGG-16 backbone + single-stage retrieval = **LOWEST D-C2-4 + D-C2-5 risk among C2 candidates** (VGG-16 has the most-export-friendly TensorRT pathway; no DINOv2 ViT export-risk applies; no two-stage re-ranking latency variance; no local-feature cache pressure). **NEW caveats vs prior C2 candidates**: (i) runtime-stack port-risk (canonical MATLAB + MatConvNet not deployable on JetPack 6 → PyTorch port required); (ii) Nanne port license-uncertainty (README does NOT cite LICENSE file → Plan-phase verification gate); (iii) 4096-D PCA-whitened descriptor consumes ~13% of AC-8.3 cache budget — largest single-stage descriptor cache so far (256-D / 512-D `cropToDim` variants documented for tighter budgets at cost of further Recall@K loss). | `../02_fact_cards/C2_vpr.md` → "NetVLAD — per-numbered binding" |
| 5 | **EigenPlaces** (ResNet50 + GeM + FC @ 224×224 → 2048-D global descriptor; canonical PyTorch-Hub best-Recall@K variant) | **MIT** (BSD/permissive track) | ✅ Fact #46 + Source #67 + #68 | **Documentary lead with aerial-domain-training caveat + structurally-simplest-modern-competitive-CNN advantage + 60%-less-VRAM-retrain advantage + viewpoint-robust-training-paradigm advantage + extreme-cross-season-third-place caveat** | Canonical ICCV 2023 implementation (`gmberton/EigenPlaces`); PyTorch Hub one-liner `torch.hub.load("gmberton/eigenplaces", "get_trained_model", backbone="ResNet50", fc_output_dim=2048)`; eleven canonical pretrained checkpoints PyTorch-Hub-distributed (more than any other C2 candidate evaluated); companion `gmberton/VPR-methods-evaluation` fair-comparison harness. **Three POSITIVE structural advantages vs all prior C2 candidates**: (i) **STRUCTURALLY-SIMPLEST MODERN COMPETITIVE CNN ARCHITECTURE** in C2 row (ResNet-50 + GeM + FC — fewer moving parts than MixVPR's MLP-Mixer / SALAD's optimal-transport+DINOv2-B / SelaVPR's two-stage DINOv2-L+adapters / NetVLAD's soft-assignment+PCA-whitening) → **lowest D-C2-4 + D-C2-5 risk among modern competitive C2 leads**, ~15-30 ms total per frame on Jetson Orin Nano Super extrapolation, ~58 MB total weights at fp16 (smallest model footprint of any C2 candidate evaluated); (ii) **60%-LESS-VRAM-RETRAIN advantage** vs MixVPR (paper §4.4: <7 GB VRAM training vs MixVPR's 18 GB at canonical batch) → **most retrain-friendly C2 candidate for D-C2-1 aerial-domain retrain decision**; (iii) **VIEWPOINT-ROBUST TRAINING PARADIGM** (paper §3 lateral+frontal CosFace dual loss with SVD-based class construction — explicitly designed for viewpoint shifts) → **most semantically-aligned training prior for aerial nadir VPR** where UAV multi-heading flights generate exactly the multi-viewpoint training signal EigenPlaces is designed to exploit. **Documented Recall@1 vs other C2 candidates (best-config-of-each)**: Pitts30k 92.5 (vs MixVPR 91.5, SALAD 95.1 different paper, SelaVPR 92.8, NetVLAD 84.1); Tokyo24/7 **93.0** (best in EigenPlaces paper Tab 3 across all compared methods, second only to SelaVPR's 94.0 in C2 row); AmsterTime **48.9** (BEST in C2 row for extreme decade-scale cross-time domain shift — relevant to Ukraine-active-conflict scene-change scenarios); SF-XL test v1 **84.1** (BEST in row, +44 over NetVLAD); Nordland 71.2 (third in C2 row — SelaVPR wins by +14 absolute; viewpoint-robustness comes at the cost of being weaker than DINOv2-based on extreme cross-season); SVOX-Night 58.9 (fourth — MixVPR-4096 wins by +5.5). Cache footprint at 2048-D = ~650 MB / 6.5% (identical to MixVPR-2048; smaller sibling modes 128/256/512-D documented as PyTorch-Hub-distributed). **Closes the BSD/permissive C2 axis with a 4th materially-different design point** alongside MixVPR + SelaVPR + NetVLAD. README explicitly recommends MegaLoc as a SOTA successor — for the project's mandatory-pre-screen role this is acceptable; Plan-phase may want to also evaluate MegaLoc as a separately-cataloged sibling/successor candidate | `../02_fact_cards/C2_vpr.md` → "EigenPlaces — per-numbered binding" |
| 6 | **AnyLoc** (DINOv2 ViT-G+VLAD) | (TBD) | NOT STARTED — conditional on INT8 quantization | **Conditional** | DINOv2 ViT-G is too large for Jetson Orin Nano Super at fp16; INT8 quantization path is the only route to inclusion (per Fact #26 pre-screen rule) | (conditional next session) |
| 7 | **BoQ** (DINOv2 ViT-B+BoQ) | MIT | NOT STARTED — conditional on INT8 quantization | **Conditional** | Same author as MixVPR (amaralibey); also bundled in OpenVPRLab; transformer-based aggregation with learnable queries; Jetson cost of DINOv2 ViT-B + BoQ requires INT8 path | (conditional next session) |
| 8 | **DINOv2-VLAD** (DINOv2 direct + VLAD pooling) | (TBD) | NOT STARTED — conditional on INT8 quantization | **Conditional** | Heaviest of the conditional candidates; only worthwhile if INT8 path proven for any other DINOv2-based candidate first | (conditional next session) |
| 9 | **SuperGlue-as-reranker** | (N/A) | (pruned outright per pre-screen) | **Pruned outright** | Matcher-class, not VPR-class; no global-descriptor stage | (no entry; pruned at SQ3+SQ4 pre-screen) |

### C2 — Plan-phase deliverables raised by MixVPR + SALAD + SelaVPR + NetVLAD + EigenPlaces closures (mandatory pre-screen complete; conditional candidates may compound)

1. **D-C2-1 VPR canonical-weights vs aerial-retrain vs aerial-community-checkpoint** (raised by MixVPR; reaffirmed by SALAD + SelaVPR with identical caveat) — must be presented to user as a structured Choose block at Plan time; applies to **every** ground-level-pretrained C2 candidate, so the decision is project-wide. Options: (a) project-domain retrain on AerialVL / AerialExtreMatch, (b) source aerial-trained community checkpoint at Plan time, (c) elevate a candidate with already-aerial-trained weights as the C2 lead.
2. **D-C2-2 descriptor-cache carve-out vs raw-tile-cache budget** (raised by MixVPR; harshened by SALAD; **materially-changed-shape by SelaVPR**) — AC-8.3 explicitly requires Plan-phase decision on whether the C2 descriptor table is part of the 10 GB cache budget or carved out separately. Per-variant lower bounds (global-descriptor stage only): **SelaVPR 1024-D ~320 MB fp16 / 3.2%** (smallest of all C2 candidates so far); MixVPR 2048-D ~650 MB fp16 / 6.5%; SALAD-slim 544-D ~0.17 GB / 1.7%; SALAD-slim 2112-D ~0.68 GB / 6.8%; **SALAD-full 8448-D ~2.7 GB / 27%**; conditional candidates (AnyLoc 49152-D, BoQ 16384-D, DINOv2-VLAD) push descriptor cache to ~10 GB alone, forcing the carve-out decision. **NEW SelaVPR-specific local-feature-cache pressure**: 61×61×128 dense local features × 160k tiles × 2 bytes (fp16) = ~150 GB — fundamentally infeasible without D-C2-7 mitigation strategy.
3. **D-C2-3 input-resolution shape (224×224 vs 320×320 vs 322×322 vs higher)** (raised by MixVPR/SALAD at 320–322; **harshened by SelaVPR's 224×224**) — SelaVPR's 224×224 is more aggressive downscale from 5472×3648 than MixVPR's 320×320 / SALAD's 322×322; SelaVPR is at the small-input extreme of the C2 candidate space, MixVPR + SALAD are at the medium-input baseline, AnyLoc + BoQ may be at the higher-resolution end (next sessions). Plan-phase decision after all C2 candidates have per-Mode entries.
4. **D-C2-4 deferred Jetson Orin Nano Super hardware MVE phase coverage** (raised by MixVPR; broadened by SALAD; **broadened further by SelaVPR**) — same artifact as D-C1-2; must now also produce DINOv2 ViT-B AND ViT-L → TensorRT fp16/INT8 export-quality numbers + per-C2-candidate latency + memory + AerialExtreMatch Recall@K numbers + SelaVPR two-stage re-ranking latency profile + on-demand local-feature extraction performance; promotes Documentary leads to Selected.
5. **D-C2-5 DINOv2 ViT-export to TensorRT fp16/INT8 path on Jetson Orin Nano Super** (raised by SALAD; **harshened by SelaVPR**) — applies to every ViT-based C2 candidate (SALAD-ViT-B, SelaVPR-ViT-L, AnyLoc-ViT-G, BoQ-ViT-B, DINOv2-VLAD). SelaVPR's ViT-L is 3.5× larger than SALAD's ViT-B; export risk profile materially elevated. Counter-mitigation by frozen-backbone canonical TensorRT export pathway (SelaVPR's frozen DINOv2-L weights have a well-documented optimization path via FB AI Public Files distribution, vs SALAD's fine-tuned-backbone). Jetson MVE prerequisite for any ViT-based C2 candidate to advance from Documentary lead to Selected. Likely rolls into D-C1-2 + the C7 inference-runtime row.
6. **D-C2-6 SALAD descriptor-size choice (8448-D / 2112-D / 544-D)** (raised by SALAD only — does not apply to SelaVPR which has fixed 1024-D global descriptor) — Plan-phase trade-off; full variant gives best R@1 (MSLS Challenge 75.0) but consumes ~27% of cache budget; slim 2112-D variant (R@1 73.7) consumes ~6.8%; slim 544-D variant (R@1 70.8) fits within 1.7% of cache budget. Interacts with D-C2-2.
7. **D-C2-7 (NEW from SelaVPR closure 2026-05-08) — SelaVPR re-ranking strategy choice (full re-rank with on-demand local-feature extraction / cache top-K local features per likely query path / disable re-ranking entirely and use SelaVPR-global-only mode)** — only applies to SelaVPR (first two-stage C2 candidate evaluated). Plan-phase decision; full re-rank at rerank_num=100 fails AC-4.1 latency budget on Jetson extrapolation; rerank_num=20 fits but tight; on-demand local-feature extraction + global-only-cache (~320 MB) is the most cache-efficient mitigation; precompute-top-K-local-features (~3 GB at K=20 with selective coverage) is the moderate option; disable-rerank gives back the two-stage advantage but drops MSLS-challenge R@1 from 73.5 to 69.6 (still ahead of MixVPR's 64.0). **Three-way interaction with D-C2-2 (cache carve-out) and AC-8.3 (10 GB budget) and AC-4.1 (400 ms latency budget)**.
8. **D-C2-8 (NEW from NetVLAD closure 2026-05-08) — NetVLAD PyTorch-port-strategy choice (Nanne/pytorch-NetVlad with license-uncertainty / re-port from canonical Relja/netvlad with MIT preservation / OpenVPRLab-NetVLAD-on-ResNet50 as separately-cataloged sibling mode)** — only applies to NetVLAD (canonical implementation is MATLAB + MatConvNet, not deployable on JetPack 6). Plan-phase decision; Nanne port is fastest path but README does NOT cite a LICENSE file — Plan-phase verification gate is required before Nanne adoption; re-port from canonical Relja/netvlad MATLAB to PyTorch directly preserves MIT licensing but requires ~1 week of engineering + cluster-init prerequisite; OpenVPRLab-NetVLAD-on-ResNet50 (per Source #57) is apples-to-apples vs MixVPR but is a *different mode* per Per-Mode API rule (different backbone, different pretrained checkpoint provenance) and would be cataloged as a separate sibling candidate. Recommendation: re-port from canonical to preserve MIT licensing alignment with MixVPR + SelaVPR on the BSD/permissive track.
9. **D-C2-9 (NEW from NetVLAD closure 2026-05-08) — NetVLAD descriptor-dimension choice (canonical 4096-D PCA-whitened / 512-D `cropToDim` for tighter cache / 256-D `cropToDim` for tightest cache)** — only applies to NetVLAD; analogous to D-C2-6 SALAD descriptor-size choice but for NetVLAD's PCA-whitened output. Plan-phase decision; canonical 4096-D consumes ~1.3 GB / 13% of 10 GB AC-8.3 cache budget — largest single-stage descriptor cache of any C2 candidate so far; 512-D `cropToDim` reduces to ~160 MB / 1.6% at additional Recall@K loss; 256-D `cropToDim` reduces to ~80 MB / 0.8% at further loss. Only valid for `+whitening` networks. Interacts with D-C2-2 carve-out decision.
10. **D-C2-10 (NEW from EigenPlaces closure 2026-05-08) — EigenPlaces descriptor-dimension choice (canonical 2048-D / 512-D / 256-D / 128-D — eleven backbone+dim sibling modes documented PyTorch-Hub-distributed)** — only applies to EigenPlaces; analogous to D-C2-6 SALAD and D-C2-9 NetVLAD descriptor-dimension choices. Plan-phase decision; canonical ResNet-50 + 2048-D consumes ~650 MB / 6.5% of AC-8.3 cache budget (identical to MixVPR-2048 for direct apples-to-apples comparison); 512-D variant reduces to ~160 MB / 1.6% at modest Recall@1 loss (paper Tab 3: Pitts30k 91.9 at 512 vs 92.5 at 2048 = -0.6, Tokyo24/7 89.8 at 512 vs 93.0 at 2048 = -3.2 — extreme cross-domain hurts most); 256-D reduces to ~80 MB / 0.8% at moderate Recall@K loss; 128-D reduces to ~40 MB / 0.4% at substantial Recall@K loss on cross-domain (paper §4.3 explicit observation that lower-D variants struggle on AmsterTime/Tokyo24/7/SVOX-Night). Interacts with D-C2-2 carve-out decision.
11. **D-C2-11 (NEW from EigenPlaces closure 2026-05-08, conditional) — MegaLoc successor evaluation as separately-cataloged sibling candidate** — EigenPlaces canonical README explicitly recommends MegaLoc as a SOTA successor ("EigenPlaces is quite old. Looking for SOTA Visual Place Recognition (VPR)? Check out MegaLoc"). Plan-phase decision: (a) treat MegaLoc as a separately-cataloged sibling candidate at Plan time (would require its own per-mode API capability verification + sub-matrix), (b) defer MegaLoc evaluation to a post-research session if EigenPlaces fails Jetson MVE, (c) skip MegaLoc and rely on the closed mandatory pre-screen (5/5: MixVPR + SALAD + SelaVPR + NetVLAD + EigenPlaces). Recommendation: defer to post-research session — EigenPlaces closes the mandatory pre-screen at the documentary-required floor, and MegaLoc's Plan-phase relevance depends on which D-C1-1 license-track is chosen and how Jetson MVE results land.

### C2 — Per-candidate ranking (mandatory pre-screen complete at 5 of 5; final ranking deferred to Jetson MVE phase)

Status: **5 of 5 mandatory pre-screen candidates** have per-Mode entries (MixVPR + SALAD + SelaVPR + NetVLAD + EigenPlaces). Final ranking deferred to D-C1-2 + D-C2-4 dedicated Jetson Orin Nano Super hardware MVE phase between research and Plan. **Conditional pre-screen candidates (AnyLoc / BoQ / DINOv2-VLAD) remain GATED on a prerequisite INT8 quantization survey** before they can be added to per-mode rows (per Fact #26 pre-screen rule).

Per-license-track preliminary picture (mandatory pre-screen final picture; will be re-ranked at Jetson MVE phase if conditional candidates are added):

**BSD/permissive track** (track lead under D-C1-1 = (b) or default (c)):
1. **SelaVPR** — Documentary lead with three caveats (MIT, 1024-D global + 61×61×128 dense local, 224×224 input, DINOv2 ViT-L/14 frozen backbone, two-stage retrieval+rerank, `Lu-Feng/SelaVPR` canonical implementation). **Strongest documentary cross-illumination + cross-season recall numbers** among C2 candidates so far on ground-level: Tokyo24/7 R@1=94.0 (best in paper Table 2 across all compared methods including SOTA R²Former 88.6) and Nordland-test R@1=85.2 (vs SALAD's 76.0 and MixVPR's 58.4). Carries D-C2-5 (DINOv2-ViT-L export risk, harshest in C2 row) + D-C2-7 (re-ranking strategy choice, NEW) + D-C2-3 (smallest-input downscale-from-5472×3648).
2. **MixVPR** — Documentary lead with aerial-domain-training caveat (MIT, 2048-D descriptor, 320×320 input, ResNet50 backbone, OpenVPRLab canonical implementation). Cleanest BSD/permissive-track candidate: simplest backbone + simplest export path + smallest model footprint + medium descriptor cache.
3. **EigenPlaces** — Documentary lead with five distinguishing characteristics (MIT, 2048-D / 512-D / 256-D / 128-D PyTorch-Hub-distributed sibling modes [eleven canonical pretrained checkpoints total — most of any C2 candidate], 224×224 input, ResNet-50 + GeM + FC structurally-simplest-modern-competitive-CNN backbone, single-stage retrieval, `gmberton/EigenPlaces` canonical implementation). **Distinguishing positive structural advantages vs MixVPR + SelaVPR + NetVLAD on this track**: (i) STRUCTURALLY-SIMPLEST modern competitive CNN (lowest D-C2-4 + D-C2-5 runtime risk among modern competitive C2 leads; smallest model footprint ~58 MB at fp16); (ii) 60%-LESS-VRAM-RETRAIN advantage vs MixVPR (most retrain-friendly C2 candidate for D-C2-1 aerial-domain decision); (iii) VIEWPOINT-ROBUST training paradigm (most semantically-aligned training prior for aerial nadir VPR — UAV multi-heading flights generate the multi-viewpoint training signal). **Documented Recall@K**: BEST in C2 row on multi-view (Pitts30k 92.5, AmsterTime 48.9 [BEST in C2 row for extreme decade-scale cross-time], SF-XL-v1 84.1) and second-only-to-SelaVPR on Tokyo24/7 (93.0 vs 94.0 — with much lower deployment risk than SelaVPR); third-place on extreme cross-season Nordland (71.2 vs SelaVPR 85.2 = -14) and SVOX-Night (58.9 vs MixVPR-4096 64.4 = -5.5). Carries NEW D-C2-10 (descriptor-dimension choice) + conditional D-C2-11 (MegaLoc successor evaluation deferral).
4. **NetVLAD** — Mandatory simple-baseline (MIT canonical / license-uncertain Nanne PyTorch port, 4096-D PCA-whitened / 512-D / 256-D `cropToDim` variants, 224×224 input, VGG-16 cropped-at-conv5_3 backbone, single-stage retrieval, `Relja/netvlad` canonical MATLAB + `Nanne/pytorch-NetVlad` PyTorch reproduction + canonical paper Arandjelović 2016). **Long-established VPR reference baseline** — cited as the baseline in every modern VPR paper. **Documented Recall@K deficit vs modern leads (5-25 absolute R@1 across Pitts30k/Tokyo24/7/Nordland) IS the role's purpose** per engine Component Option Breadth rule. **POSITIVE structural advantages**: LOWEST D-C2-4 + D-C2-5 risk overall (VGG-16 → TensorRT is the most-export-friendly path of any C2 candidate; no DINOv2 ViT export-risk; no two-stage re-ranking variance; no local-feature cache pressure). Carries NEW D-C2-8 (PyTorch port-strategy choice) + NEW D-C2-9 (descriptor-dimension choice).

**Comparison: MixVPR vs SelaVPR vs EigenPlaces vs NetVLAD on BSD/permissive track** — four materially-different design points on the same license track (modern competitive lead [MLP-Mixer] vs modern competitive lead [DINOv2-L two-stage] vs modern competitive lead [viewpoint-robust ResNet-50] vs long-established baseline [VLAD]):

| Dimension | MixVPR | SelaVPR | EigenPlaces | NetVLAD (mandatory baseline) |
|---|---|---|---|---|
| Backbone | ResNet50 (~25M params) | DINOv2 ViT-L/14 (~300M params, FROZEN) | ResNet50 (~25M params) | VGG-16 cropped at conv5_3 (~50-60M params) |
| Aggregator/Adapter | MLP-Mixer aggregation | Lightweight serial+parallel adapters per ViT block + LocalAdapt up-conv | **GeM (Generalized Mean Pooling, parameter-free) + single FC layer** | NetVLAD soft-assignment-VLAD pooling K=64 + PCA-whitening |
| Input size | 320×320 | 224×224 (more aggressive downscale) | 224×224 (same as SelaVPR + NetVLAD) | 224×224 (same as SelaVPR + EigenPlaces) |
| Global descriptor | 2048-D | 1024-D | **2048-D** canonical / 512-D / 256-D / 128-D / VGG16+512-D PyTorch-Hub-distributed sibling modes (eleven canonical pretrained checkpoints) | **4096-D PCA-whitened** (canonical) / 512-D / 256-D `cropToDim` variants |
| Retrieval architecture | Single-stage | Two-stage (top-K via global + rerank via local MNN cross-match) | **Single-stage** | Single-stage |
| Global descriptor cache (~400 km² @ 0.5 m/px) | ~650 MB fp16 / 6.5% | ~320 MB fp16 / 3.2% | **~650 MB fp16 / 6.5% (canonical 2048-D — identical to MixVPR-2048)** / ~160 MB / 1.6% (512-D) / ~80 MB / 0.8% (256-D) / ~40 MB / 0.4% (128-D) | **~1.3 GB fp16 / 13%** (canonical 4096-D) / ~160 MB / 1.6% (512-D) / ~80 MB / 0.8% (256-D) |
| Local-feature cache | (none — single-stage) | 61×61×128 dense local features = ~150 GB if naive cache; needs D-C2-7 mitigation | (none — single-stage) | (none — single-stage) |
| Model footprint at fp16 | ~50 MB (ResNet50 + MLP-Mixer) | ~600 MB (DINOv2-L + adapters + LocalAdapt) | **~58 MB (smallest of any C2 candidate evaluated — ResNet50 + GeM + FC)** | ~400 MB (VGG-16 + NetVLAD + PCA-whitening) |
| RTX-3090 latency baseline | 1.21 ms (paper Table 4, A100) | 27 ms extraction + 85 ms matching @ rerank_num=100 = 112 ms total (paper Table 3) | ~5 ms (ResNet-50 fp16 + GeM + FC contemporary benchmark extrapolation; paper §4.4 says "extraction time negligible at scale") | ~10-20 ms VGG-16 forward pass + ~1-2 ms NetVLAD aggregation + ~1-2 ms PCA-whitening MatMul |
| Jetson Orin Nano Super extrapolated latency | ~10–30 ms | ~200–270 ms extraction + ~150 ms matching @ rerank_num=20 = ~350 ms total (FAILS AC-4.1 at rerank_num=100) | **~15-30 ms total (LOWEST among modern competitive C2 leads; D-C2-5 ViT-export-risk does not apply)** | ~40-60 ms total (LOWEST runtime risk overall in C2 row; D-C2-5 ViT-export-risk does not apply but VGG-16 is older + larger than ResNet-50) |
| Training GPU memory cost (canonical batch) | ~18 GB (paper §4.4) | ~24 GB (DINOv2-L finetune; estimated) | **<7 GB (paper §4.4 — 60% LESS than MixVPR)** | (not directly reported; canonical training is on cluster) |
| MSLS-Val R@1 | 87.2 (@4096) / 83.6 (@512) | 90.8 | **89.1 (@2048)** | (not in MSLS-Val paper Table; documented as baseline floor) |
| Pitts30k-test R@1 (canonical) | ~90 | 92.8 | **92.5 (@2048)** | **84.1 (paper) / 85.2 (PyTorch reproduction)** — baseline floor |
| Tokyo24/7 R@1 (cross-illumination day/night) | 85.1 | **94.0** (best in SelaVPR paper Table 2) | **93.0 (@2048; second-place in C2 row, with much lower deployment risk than SelaVPR)** | **73.3** — baseline floor (-11.8 to -20.7 absolute vs modern leads) |
| AmsterTime R@1 (extreme decade-scale cross-time) | 40.2 (@4096) | (not reported in SelaVPR paper) | **48.9 (BEST in C2 row — relevant to Ukraine-active-conflict scene-change scenarios)** | 16.3 (VGG16+4096) — baseline floor |
| Nordland-test R@1 (extreme cross-season) | 58.4 (canonical paper) / 76.2 (EigenPlaces paper Tab 4 @4096) | **85.2** | 71.2 (@2048; third-place, viewpoint-robustness comes at the cost of being weaker than DINOv2 on extreme cross-season) | **~33** (per MixVPR paper Table 1 baseline) — baseline floor |
| SVOX-Night R@1 (extreme illumination) | 64.4 (@4096) | (not reported in SelaVPR paper) | 58.9 (@2048; fourth-place; MixVPR-4096 wins by +5.5) | 8.0 (VGG16+4096) — baseline floor |
| Aerial-domain training | None (D-C2-1 applies) | None (D-C2-1 applies) | None (D-C2-1 applies) **but EigenPlaces is the MOST retrain-friendly candidate** at <7 GB GPU VRAM — D-C2-1 = (a) project-domain retrain on AerialVL is materially cheaper to execute on EigenPlaces than on any other candidate | None (D-C2-1 applies) — but NetVLAD's mandatory-baseline role does NOT require aerial-domain training to be useful |
| Training paradigm semantic alignment with aerial nadir VPR | Standard metric learning (multi-similarity loss on GSV-Cities) — generic | DINOv2 frozen + adapter fine-tuning (parameter-efficient transfer learning) — generic | **Lateral+Frontal CosFace dual loss with SVD-based viewpoint-shift class construction** — most semantically-aligned training prior for UAV multi-heading flights generating multi-viewpoint training signal | Weakly supervised triplet ranking with hard negative mining on Google Street View Time Machine — generic |
| Role per engine Component Option Breadth | Modern competitive lead (compact-descriptor leader) | Modern competitive lead (best documented cross-illumination/cross-season ground-level recall via two-stage) | Modern competitive lead (**viewpoint-robust + structurally-simplest + most retrain-friendly + best AmsterTime cross-time**) | **Mandatory simple-VLAD reference baseline** that establishes the long-established floor against which modern leads must measurably exceed |

**GPL-3.0 track** (track lead under D-C1-1 = (a) or default (c)):
1. **SALAD** — Documentary lead with three caveats (GPL-3.0, 8448-D / 2112-D / 544-D descriptor variants, 322×322 input, DINOv2 ViT-B/14 backbone with last 4 blocks fine-tuned, `serizba/salad` canonical implementation). Strongest single-stage MSLS Challenge R@1 (75.0 full vs SelaVPR's 73.5 and MixVPR's 64.0). Carries DINOv2-ViT-B export risk (D-C2-5, harsher than MixVPR's CNN, lighter than SelaVPR's ViT-L) and descriptor-cache budget pressure (D-C2-6).
2. (no other GPL-3.0 C2 leads pending in the mandatory pre-screen — SelaVPR landed on the BSD/permissive track, contradicting the prior session's assumption that it would be the "most likely additional GPL-3.0 candidate").

