Repository

wild3r

Wild3R: Feed-Forward 3D Gaussian Splatting from Unconstrained Sparse Photo Collection

README

Wild3R: Feed-Forward 3D Gaussian Splatting from Unconstrained Sparse Photo Collection

<a href="https://furuschool.github.io/wild3r-page">

Project Page

</a>
Paper
Hugging Face Dataset
Hugging Face Model

Yuto Furutani*, Takashi Otonari*, Kaede Shiohara*,
Toshihiko Yamasaki <br />
The University of Tokyo. *Co-first authors.

Overview

<p align="center">

Feed-forward 3D Gaussian Splatting (3DGS) removes the need for time-consuming per-scene optimization required by traditional 3DGS.
However, existing feed-forward approaches struggle with real-world photo collections that include diverse lighting conditions and transient objects.
In this paper, we present Wild3R, a feed-forward approach for unconstrained sparse photo collections.
The main bottleneck is the lack of training data that provides multiple viewpoints, a variety of illuminations, and transient variations necessary for learning robust scene representations.
To address this, we introduce the WildCity dataset, which comprises 200 scenes, 170 lighting conditions, and transient objects, resulting in 337,500 images in total.
By leveraging the dataset, our model learns appearance consistency across viewpoints conditioned on reference views, while removing transient content.
Extensive experiments demonstrate that our method outperforms existing feed-forward approaches and achieves results competitive with prior per-scene optimization-based methods.

Installation

Our installation is the same as AnySplat.

  1. Clone Wild3R.

    git clone https://github.com/furuSchool/wild3r.git
    cd wild3r
  2. Create the environment, here we show an example using conda.

    conda create -y -n wild3r python=3.10
    conda activate wild3r
    pip install torch==2.2.0 torchvision==0.17.0 torchaudio==2.2.0 --index-url https://download.pytorch.org/whl/cu121
    pip install --no-cache-dir torch_scatter==2.1.2 -f https://data.pyg.org/whl/torch-2.2.0+cu121.html
    pip install --no-build-isolation git+https://github.com/facebookresearch/pytorch3d.git
    pip install -r requirements.txt
  3. Download the pretrained weights from Hugging Face and place the file at checkpoints/wild3r_weights.ckpt.

Quick Start

import torch
from inference import load_model_and_device
from src.utils.image import process_image
from src.misc.image_io import save_interpolated_video

# Load model
model, device = load_model_and_device(
    checkpoint_path="checkpoints/wild3r_weights.ckpt",
    config_path="config/config.yaml",
)

# Load images (replace with your own)
image_paths = ["path/to/imageA.png", "path/to/imageB.png", "path/to/imageC.png"]
images = torch.stack([process_image(p) for p in image_paths], dim=0).unsqueeze(0).to(device)
b, v, _, h, w = images.shape

# Run inference
gaussians, pred_context_pose = model.inference((images + 1) * 0.5)

# Render interpolated video
pred_extrinsic = pred_context_pose['extrinsic']
pred_intrinsic = pred_context_pose['intrinsic']
save_interpolated_video(pred_extrinsic, pred_intrinsic, b, h, w, gaussians, "outputs/", model.decoder)

Photo Tourism Benchmark

We evaluate on Brandenburg Gate, Sacre Coeur, and Trevi Fountain from the IMC-PT 2020 dataset.
Context sets are constructed with N ∈ {4, 16, 64} images randomly sampled from the official training split.
For evaluation, each test image is vertically split following the NeRF-W protocol: one half serves as the reference view for appearance conditioning, and the other half is the evaluation target.
All images are resized and cropped to 448×448 with bottom alignment.

  1. Download the three scenes (brandenburg_gate, sacre_coeur, trevi_fountain) from the IMC-PT 2020 dataset.

  2. Download the scene-split TSV files from NeRF-W and place each one inside the corresponding scene directory (e.g. brandenburg_gate/brandenburg.tsv).

  3. Run the preprocessing script for each scene:

python preprocess.py path/to/brandenburg_gate input_images --assignments json/assignments.json
python preprocess.py path/to/sacre_coeur      input_images --assignments json/assignments.json
python preprocess.py path/to/trevi_fountain   input_images --assignments json/assignments.json
input_images/
└── {scene}/
    └── {num_views}/           # e.g. 4, 16, 64
        ├── dense_train/
        │   └── images/        # N context images from training split
        ├── dense_target/
        │   └── images/        # Reference half-images (appearance conditioning)
        └── dense_test/
            └── images/        # Evaluation target half-images
outputs/
└── GT/
    └── {scene}/
        └── {num_views}/       # Evaluation target images (same as dense_test)

Inference

python batch_inference.py --batch_json json/eval.json

The JSON file specifies the checkpoint, config, and a list of runs. You can add or modify runs following the format in json/eval.json. Predicted images are saved under output_path for each run.

Evaluation

After running inference, evaluate with PSNR / SSIM / LPIPS against the GT images:

python eval.py outputs

This compares every method folder under outputs/ (e.g. outputs/wild3r/) against outputs/GT/. Per-scene results are written to result.md files, and a summary table is written to outputs/summary_result.md.

To compare with other methods, place their predicted images under outputs/{method_name}/ following the same directory structure, then re-run eval.py. Each method will appear as a separate row in the summary table.

Citation

@article{furutani2026wild3r,
  title   = {Wild3R: Feed-Forward 3D Gaussian Splatting from Unconstrained Sparse Photo Collection},
  author  = {Furutani, Yuto and Otonari, Takashi and Shiohara, Kaede and Yamasaki, Toshihiko},
  journal = {arXiv preprint arXiv:2606.11894},
  year    = {2026}
}

Acknowledgements

We thank all authors behind these projects and repositories for their excellent work: AnySplat, LightCity, SceneCity, and Sketchfab.

The code in the src/ is adopted from AnySplat, which is distributed under the MIT License.