[CVPR 2026] A²GC: Asymmetric Aggregation with Geometric Constraints for Locally Aggregated Descriptors

April 27, 2026 · View on GitHub

A PyTorch implementation of A²GC (Asymmetric Aggregation with Geometric Constraints) for Visual Place Recognition (VPR), featuring support for DINOv2 backbones.

🚀 Features

  • Multiple Backbone Support: DINOv2 (ViT-B/14, ViT-L/14, ViT-G/14), and ResNet
  • Asymmetric Aggregation with Geometric Constraints: A²GC aggregator for robust feature aggregation
  • Comprehensive Evaluation: Support for multiple VPR benchmarks (Pittsburgh, MSLS, Nordland, SPED, SF-XL)
  • Flexible Training: PyTorch Lightning-based training with various loss functions and optimizers
  • Visualization Tools: Feature matching and heatmap visualization utilities

🔧 Installation

Prerequisites

  • Python 3.8+
  • CUDA-capable GPU
  • PyTorch 1.12+

Setup

  1. Clone the repository:
git clone https://github.com/CV4RA/A2GC.git
cd A2GC
  1. Create a conda environment:
conda env create -f environment.yml
conda activate A2GC
  1. Install additional dependencies:
pip install pytorch-lightning faiss-cpu  # or faiss-gpu for GPU support

🚀 Quick Start

Evaluation with Pre-trained Model

python eval.py \
    --ckpt_path weights/your_best.ckpt \
    --backbone_arch dinov2_vitb14 \
    --val_datasets pitts30k_test msls_val \
    --faiss_gpu

Training

python main.py

Modify main.py to customize training parameters, backbone architecture, and aggregator configuration.

📦 Dataset

Supported Datasets

Dataset Structure

data/
├── Pittsburgh/
│   ├── queries_real/
│   └── [000-010]/
├── mapillary/
│   ├── train_val/
│   └── test/
├── Nordland/
│   ├── query/
│   └── ref/
└── ...

datasets/
├── Pittsburgh/
│   ├── pitts30k_test_dbImages.npy
│   ├── pitts30k_test_qImages.npy
│   └── pitts30k_test_gt.npy
└── ...

🏋️ Training

Configuration

Edit main.py to configure:

  • Backbone: backbone_arch (e.g., 'dinov2_vitb14')
  • Aggregator: agg_arch (e.g., 'ASYOT' for A²GC)
  • Training parameters: learning rate, batch size, optimizer, etc.

Training on GSV-Cities

The default training uses GSV-Cities dataset. Ensure the dataset is properly set up in data/GSVCities/.

📈 Results

Performance on Standard Benchmarks

MethodPitts30k (R@1/5/10)Pitts250k-test (R@1/5/10)MSLS-val (R@1/5/10)MSLS-challenge (R@1/5/10)
NetVLAD (CVPR 2016)81.9/91.2/93.790.5/96.2/97.453.1/66.5/71.135.1/47.4/51.7
CosPlace (CVPR 2022)88.5/94.5/95.292.4/97.2/98.182.8/89.7/92.061.4/72.0/76.6
MixVPR (WACV 2023)91.5/95.5/96.394.6/98.3/99.088.2/93.1/94.364.0/75.9/80.6
R²Former (CVPR 2023)91.1/95.2/96.393.2/97.5/98.389.7/95.0/96.273.0/85.9/88.8
EigenPlaces (ICCV 2023)92.5/96.8/97.694.1/98.0/98.789.1/93.8/95.067.4/77.1/81.7
SelaVPR (ICLR 2024)92.8/96.8/97.795.7/98.8/99.290.8/96.4/97.273.5/87.5/90.6
CricaVPR (CVPR 2024)94.9/97.3/98.295.6/98.9/99.590.0/95.4/96.469.0/82.1/85.7
SALAD (CVPR 2024)92.4/96.3/97.495.1/98.5/99.192.2/96.2/97.075.0/88.8/91.3
FoL (AAAI 2025)94.5/97.4/98.297.0/99.2/99.593.5/96.9/97.680.0/90.9/93.0
Pair-VPR (RAL 2025)95.4/97.5/98.095.4/97.3/97.781.7/90.2/91.3
A²GC (Ours)95.6/99.3/99.897.3/99.3/99.793.6/97.5/97.980.6/90.9/92.5

Impact of Input Resolution

Input SizePitts30k (R@1/5/10)MSLS-val (R@1/5/10)
224×22494.9/98.5/99.590.4/95.3/96.1
364×36494.9/99.1/99.691.0/96.0/96.6
406×40695.2/99.2/99.893.2/96.7/97.2
588×58896.7/99.8/10096.4/97.9/98.6

🎨 Visualization

Feature Matching Visualization

Visualize feature matches between query and reference images:

python tools/visualize_feature_matching.py \
    --query path/to/query.jpg \
    --ref path/to/reference.jpg \
    --ckpt weights/a2gc.ckpt \
    --backbone dinov2_vitb14 \
    --top-k 200 \
    --threshold 0.3 \
    --out ./viz_matching

This generates:

  • feature_matching_lines.png: Matching points with color-coded similarity scores
  • similarity_matrix.png: Full similarity matrix visualization
  • feature_heatmap_comparison.png: Feature activation heatmaps

Visualization

python tools/visualize_feature_maps.py \
    --image path/to/image.jpg \
    --ckpt weights/a2gc.ckpt \
    --backbone dinov2_vitb14 \
    --out ./viz_features

alt text

🏗️ Architecture

Model Components

  1. Backbone: Feature extraction (DINOv2/ResNet)
  2. Aggregator: Feature aggregation (ASYOT for A²GC)
  3. Loss Function: Metric learning loss (MultiSimilarityLoss)

A²GC Aggregator

The Asymmetric Aggregation with Geometric Constraints (A²GC) aggregator uses asymmetric optimal transport with geometric constraints to aggregate spatial features, providing robust place descriptors that are invariant to viewpoint changes and partial occlusions.

🙏 Acknowledgments