Readme
GeoCalib on Replicate
Single-Image Camera Calibration with Geometric Optimization
Paper: ECCV 2024 | Authors: Veicht, Sarlin, Lindenberger, Pollefeys (ETH Zurich / Microsoft Research) | Code: github.com/cvg/GeoCalib
GeoCalib estimates camera intrinsics (focal length, field of view, lens distortion) and gravity direction (roll and pitch) from a single image — no calibration pattern, no multi-view setup, no EXIF data needed.
It works on both outdoor scenes (streets, buildings, landscapes, aerial views) and indoor environments (rooms, hallways, offices, warehouses).
Default Example
Default input image:
https://cdn.sanity.io/images/k55su7ch/production2/d9e35a73891d43ccb0bc665bf2e0d5d9d6f1ea2b-4200x2363.jpg?w=1920&q=75&auto=format
import replicate
output = replicate.run("visionaix/geocalib", input={
"image": "https://cdn.sanity.io/images/k55su7ch/production2/d9e35a73891d43ccb0bc665bf2e0d5d9d6f1ea2b-4200x2363.jpg?w=1920&q=75&auto=format",
"camera_model": "pinhole",
"return_visualization": True,
})
Default output:
{
"camera": {
"image_width": 1920,
"image_height": 1080,
"focal_length_x": 897.49,
"focal_length_y": 897.49,
"principal_point_x": 960.0,
"principal_point_y": 540.0,
"vertical_fov_deg": 62.07,
"horizontal_fov_deg": 93.86,
"intrinsic_matrix_K": [
[897.49, 0.0, 960.0],
[0.0, 897.49, 540.0],
[0.0, 0.0, 1.0]
]
},
"gravity": {
"roll_deg": 0.322,
"pitch_deg": -0.528,
"gravity_vector_3d": [-0.00561, -0.99994, -0.00922]
},
"uncertainty": {
"roll_uncertainty_deg": 0.630,
"pitch_uncertainty_deg": 0.936,
"focal_uncertainty_px": 222.37,
"vfov_uncertainty_deg": 17.74,
"gravity_uncertainty": 0.0168
},
"performance": {
"inference_time_seconds": 1.39,
"device": "cuda"
}
}
| Parameter | Value | Meaning |
|---|---|---|
| Focal length | 897.5 px | Moderate wide-angle lens (~62 deg vertical FoV) |
| Roll | +0.32 deg | Camera is nearly perfectly level |
| Pitch | -0.53 deg | Slightly tilted upward |
| Gravity uncertainty | 0.017 | Very high confidence |
| Inference time | 1.39s | On NVIDIA T4 GPU |
Indoor vs. Outdoor
GeoCalib is trained on diverse datasets covering both indoor and outdoor environments:
Outdoor: Urban streetscapes, architectural photography, landscapes, aerial/drone imagery
Indoor: Office spaces, hallways and corridors, warehouses/factories, residential rooms
The model extracts gravity cues from any vertical or horizontal structures. Confidence maps automatically downweight textureless regions (sky, uniform walls) and focus on structurally informative areas.
Inputs
| Parameter | Type | Default | Description |
|---|---|---|---|
image |
File | required | Input image (JPEG, PNG, WebP) |
camera_model |
Choice | "pinhole" |
pinhole, simple_radial, radial, simple_divisional |
use_distorted_weights |
Boolean | false |
Enable for fisheye/wide-angle |
focal_length_prior |
Float | 0.0 |
Known focal length in pixels (0 = auto) |
return_visualization |
Boolean | true |
Generate diagnostic visualization |
Camera Models
| Model | Use When |
|---|---|
pinhole |
Standard lenses, phone cameras, DSLRs |
simple_radial |
Slight barrel/pincushion distortion |
radial |
Moderate lens distortion |
simple_divisional |
Fisheye and ultra-wide lenses |
Output
calibration_json— Full calibration data (intrinsics, gravity, uncertainty, performance)visualization— 6-panel diagnostic PNG (input + fields + confidence + summary)
Advanced Usage
Known Focal Length Prior
output = replicate.run("visionaix/geocalib", input={
"image": "photo.jpg",
"focal_length_prior": 1500.0,
})
Fisheye Lenses
output = replicate.run("visionaix/geocalib", input={
"image": "fisheye.jpg",
"camera_model": "simple_divisional",
"use_distorted_weights": True,
})
Citation
@inproceedings{veicht2024geocalib,
title = {GeoCalib: Single-Image Calibration with Geometric Optimization},
author = {Veicht, Alexander and Sarlin, Paul-Edouard and Lindenberger, Philipp and Pollefeys, Marc},
booktitle = {European Conference on Computer Vision (ECCV)},
year = {2024},
}
License
This endpoint wraps GeoCalib. See the original license.