Simon-Kotchou/dinov3-convnext-small-geoguessr-25k-384
DINOv3 ConvNeXt-Small for GeoGuessr Country Classification
A DINOv3 ConvNeXt-Small model fine-tuned for geographic image classification on Google Street View images. The model predicts the country of origin among 55 countries with 74.31% test accuracy.
Model Details
Why DINOv3?
DINOv3 models are distilled from a 7B-parameter Vision Transformer trained with self-supervision on 1.7 billion diverse web images. This pretraining distribution—spanning global visual patterns like road markings, vegetation, architecture, and signage—creates representations inherently suited to geographic reasoning.
Our core finding: A smaller model with domain-aligned features outperforms larger models with weaker transfer. The 50M parameter DINOv3 ConvNeXt-Small beats the 87M ConvNeXtV2-Base by 13 percentage points.
Results
Test Set Performance
Comparison with Previous Work
Training Progression
Per-Country Performance
Top 5 Countries (by accuracy):
Bottom 5 Countries (by accuracy):
Training Recipe
Core Thesis
Self-Distillation based pretraining on diverse global data produces features that transfer better than generative self-supervised pretraining, and pretraining distribution matters more than model capacity for geographic tasks.
Key Design Decisions
1. BCE Loss with Multi-Label MixUp/CutMix
Standard MixUp interpolates labels (y = 0.7*A + 0.3*B), but when you look at a mixed image, both concepts are visible. Following Wightman et al. [2], we treat mixed samples as multi-label (both classes = 1) with BCE loss. This better matches visual reality and gave consistent improvements.
2. Short-Schedule Optimization
For 50-epoch fine-tuning, aggressive regularization hurts more than helps [2]:
- MixUp α = 0.1 (not 0.2-0.8)
- CutMix α = 1.0
- RandAugment magnitude 6 (not 7-9)
- No label smoothing
- No stochastic depth
- Test crop ratio 0.95 (not 0.875) [6]
3. Resolution Matters
GeoGuessr images are ~1.5k pixels wide. Critical details (text on signs, road markings) are lost at 224px. Training at 384px preserves these geographic cues [6].
4. Class Imbalance Handling
Japan/France comprise ~20% of training data. We used WeightedRandomSampler to ensure each class is seen equally often.
Training Configuration
Hardware: NVIDIA RTX 3080 Ti (12GB)
Batch size: 16 (hardware constrained)
Epochs: 50
Optimizer: AdamW (lr=5e-5, weight_decay=0.01)
Schedule: Cosine decay with 10% warmup
Image size: 384
Dropout: 0.1
Augmentation: RandAugment(n=2, m=6) + MixUp(0.1) + CutMix(1.0)Usage
import torch
from PIL import Image
# Load model and processor (trust_remote_code required for custom model)
from transformers import AutoImageProcessor, AutoModelForImageClassification
processor = AutoImageProcessor.from_pretrained("Simon-Kotchou/convnext-dinov3-small-geoguessr-25k-384")
model = AutoModelForImageClassification.from_pretrained(
"Simon-Kotchou/convnext-dinov3-small-geoguessr-25k-384",
trust_remote_code=True,
)
# Load and process image
image = Image.open("street_view.jpg")
inputs = processor(images=image, return_tensors="pt")
# Get prediction
with torch.no_grad():
outputs = model(**inputs)
logits = outputs.logits
probs = torch.softmax(logits, dim=-1)
predicted_class = logits.argmax(-1).item()
confidence = probs[0, predicted_class].item()
# Map to country name
country = model.config.id2label[str(predicted_class)]
print(f"Predicted: {country} ({confidence:.1%})")
# Get top-3 predictions
top3 = torch.topk(probs, 3, dim=-1)
for i, (prob, idx) in enumerate(zip(top3.values[0], top3.indices[0])):
country = model.config.id2label[str(idx.item())]
print(f" {i+1}. {country}: {prob.item():.1%}")Limitations and Future Work
Why Latvia Fails Completely
Latvia achieves 0% accuracy despite representing 0.35% of training data. The previous ConvNeXtV2 model also struggled (14.29%). This suggests:
- Visual similarity to neighbors: Latvia shares visual characteristics with Lithuania, Estonia, and other Baltic states
- Insufficient training signal: ~88 training samples may be below the threshold for learning discriminative features
- Lack of distinctive markers: Unlike Japan (unique script) or Australia (distinctive landscapes), Baltic countries lack globally unique visual signatures
Potential Improvements
Hardware Constraints
Training was conducted on a single RTX 3080 Ti with 12GB VRAM, limiting batch size to 16. Larger batches with gradient accumulation or multi-GPU training could improve optimization dynamics.
Key Takeaways
- Pretraining distribution > model capacity: A 50M model pretrained on 1.7B diverse images beats an 87M model pretrained on ImageNet-22k
- Modern ConvNets remain competitive: In the age of Vision Transformers, ConvNeXt architectures offer strong performance with better efficiency and spatial inductive bias
- DINOv3 transfers remarkably well: Self-supervised pretraining on diverse monocular images creates representations that generalize to geographic visual reasoning
- The long tail is hard: Even with weighted sampling, rare classes with subtle distinguishing features remain challenging
Citation
If you use this model, please cite:
@misc{dinov3-geoguessr-2025,
title={DINOv3 ConvNeXt-Small Fine-tuned for GeoGuessr Country Classification},
author={Simon Kotchou},
year={2025},
publisher={HuggingFace},
url={https://huggingface.co/Simon-Kotchou/dinov3-convnext-small-geoguessr-25k-384}
}References
[1] Siméoni et al. "DINOv3." arXiv:2508.10104, 2025.
[2] Wightman, Touvron, Jégou. "ResNet Strikes Back: An improved training procedure in timm." arXiv:2110.00476, 2021.
[3] Liu et al. "A ConvNet for the 2020s." CVPR 2022. arXiv:2201.03545.
[4] Zhang et al. "MixUp: Beyond Empirical Risk Minimization." ICLR 2018. arXiv:1710.09412.
[5] Yun et al. "CutMix: Regularization Strategy to Train Strong Classifiers." ICCV 2019. arXiv:1905.04899.
[6] Touvron et al. "Fixing the train-test resolution discrepancy." NeurIPS 2019. arXiv:1906.06423.
Model Card Authors
Simon Kotchou
Acknowledgments
- Meta AI for the DINOv3 foundation models
- The GeoGuessr dataset creators
- The HuggingFace and PyTorch communities
