xdg / README.md
xtcpete's picture
Release XDG checkpoint, configuration, and model card
0d7703d verified
|
Raw History Blame Contribute Delete
5.26 kB
---
license: apache-2.0
library_name: pytorch
base_model: depth-anything/DA3-BASE
base_model_relation: finetune
tags:
- arxiv:2608.29733
- computer-vision
- image-pair-classification
- structure-from-motion
- visual-disambiguation
- doppelgangers
---
# XDG: Accelerated Visual Disambiguation
XDG scores image pairs to detect visually similar but geometrically inconsistent
matches before Structure from Motion (SfM). Filtering these pairs helps prevent
incorrect connections and corrupted reconstructions.
[Paper](https://arxiv.org/abs/2608.29733) ·
[Code](https://github.com/xtcpete/xdg) ·
[Project page](https://xtcpete.github.io/xdg/)
## Model details
The released model uses a Depth Anything 3 base backbone with rank-8 LoRA,
camera-token features from four stages, and a binary classifier. It aggregates
features from both image orders. The default inference configuration resizes
RGB images to 560 × 560 pixels.
`xdg.pth` contains the complete PyTorch state dictionary, including the backbone,
LoRA weights, and classifier (121,403,650 parameters). A separate DA3 weight
download is not needed at inference time. The architecture implementation is
provided by the linked code repository, including its vendored DA3 dependency.
This is a custom PyTorch model; use the XDG inference code below.
| File | Contents |
| --- | --- |
| `xdg.pth` | Released checkpoint |
| `xdg.yaml` | Matching architecture and inference configuration |
| `LICENSE` | Apache 2.0 license for XDG code and checkpoint |
| `LICENSE-Depth-Anything-3` | Vendored Depth Anything 3 license |
## Usage
Install the code and dependencies:
```bash
git clone https://github.com/xtcpete/xdg.git
cd xdg
conda env create -f environment.yml
conda activate xdg
```
Download the checkpoint and its matching configuration:
```python
from huggingface_hub import hf_hub_download
for filename in ("xdg.pth", "xdg.yaml"):
hf_hub_download("xtcpete/xdg", filename, local_dir="weights")
```
Create `pairs.txt` with two whitespace-separated image paths per line, relative
to your image directory:
```text
image_0001.jpg image_0002.jpg
subdir/image_0003.jpg subdir/image_0004.jpg
```
Score the pairs from the root of the code checkout:
```bash
python remove_doppelgangers.py \
--config weights/xdg.yaml \
--ckpt weights/xdg.pth \
--pairs_txt pairs.txt \
--input_image_path path/to/images \
--output_path output/pairs \
--batch_size 1
```
CUDA is the default device; add `--device cpu` for CPU execution. Start with a
batch size of 1 and increase it to suit available memory. Use a fresh output
directory for each run: existing probability files are reused by the script.
The output `output/pairs/pair_probability_list.npy` contains a dictionary whose
`prob` array has shape `(number_of_pairs, 2)`, in input-pair order. Column 1 is
the score for a valid (non-doppelganger) pair. The database filter removes pairs
whose column-1 score is below the chosen threshold (default: 0.8).
To filter an existing COLMAP database, replace `--pairs_txt pairs.txt` with
`--database_path path/to/database.db` and optionally set `--threshold 0.8`.
The database must contain geometrically verified pairs in `two_view_geometries`.
The script creates a filtered copy and preserves the input database.
## Training and evaluation
The released training configuration references Doppelgangers training pairs,
MegaDepth-derived pairs, and VisymScenes training pairs, following the dataset
setup used by [Doppelgangers++](https://github.com/doppelgangers25/doppelgangers-plusplus).
See the code repository's
[training configuration](https://github.com/xtcpete/xdg/blob/main/configs/training_configs/training.yaml)
for hyperparameters and data layout.
The project reports comparable disambiguation performance to DG++ with 3.5×
faster inference across its pairwise and SfM benchmarks. See the paper for the
benchmark conditions and detailed results. Use `test.py` in the code repository
to evaluate the checkpoint on the Doppelgangers and VisymScenes test sets.
## Intended use and limitations
XDG is intended for image-pair disambiguation and filtering matches before SfM.
Its scores are learned predictions, not a guarantee of geometric consistency.
False positives can remove useful matches, and false negatives can leave
incorrect connections. Choose the threshold for the reconstruction and dataset;
the published results do not guarantee the same performance on other imagery.
The checkpoint does not include feature matching, geometric verification, or
COLMAP reconstruction itself.
## License
The original XDG code and checkpoint are released under Apache 2.0. Depth
Anything 3 retains its own included license. Training and evaluation datasets
remain subject to their providers' licenses and terms.
## Citation
```bibtex
@misc{chen2026xdgacceleratedvisualdisambiguation,
title={XDG: Accelerated Visual Disambiguation},
author={Gonglin Chen and Ben Southall and Hanyuan Xiao and Wenbin Teng and Haolin Xiong and Tianwen Fu and Junyi Ouyang and Kshitij Singh Minhas and Supun Samarasekera and Rakesh Kumar and Yajie Zhao},
year={2026},
eprint={2608.29733},
archivePrefix={arXiv},
primaryClass={cs.CV},
url={https://arxiv.org/abs/2608.29733},
}
```