Muxin Liu1,2,*,
Tianbo Liu1,*,
Jing Xia1,*,
Xiaoyang Lyu1,
Xiaoshan Wu1,
Bo Wang1,
Peng Dai1,
Zhongrui Wang3,
Shaoshuai Shi2,✉,
Xiaojuan Qi1,✉
1The University of Hong Kong
2Voyager Research, Didi Chuxing
3Southern University of Science and Technology
*Equal Contribution
✉Corresponding Author
This work presents OptiGeo, which redefines transparent and reflective depth estimation as localized bias correction within monocular geometry training.
· 🧭 Rehabilitates biased real-depth supervision with a clean-geometry teacher and residual-trimmed alignment.
· ⚡ Delivers a 30M model for accurate and efficient embodied perception in optically challenging scenes.
- Release paper and project page
- Release OptiGeo model weights
- Release inference, evaluation, and training code
- Release training and evaluation configuration files
- Release OptiGeo dataset and rendering pipeline
- Release edge computing variants and navigation system setup pipeline
git clone https://github.com/mx-liu6/OptiGeo.git
cd OptiGeo
conda create -n optigeo python=3.10 -y
conda activate optigeo
pip install -r requirements.txtFor editable local development, install the package as well:
pip install -e .If you install PyTorch manually, choose the build that matches your CUDA version from the official PyTorch instructions before running pip install -r requirements.txt.
The released OptiGeo model weights are hosted on Hugging Face:
| Weights | Description | Parameters |
|---|---|---|
| mxliu-hku/OptiGeo | Efficient monocular geometry model for optically challenging scenes | 30M |
The weights are downloaded automatically when --pretrained is omitted or set to mxliu-hku/OptiGeo.
# Run inference on one image or a folder of images
python optigeo/scripts/infer.py \
--input path/to/image_or_folder \
--output output/optigeo \
--pretrained mxliu-hku/OptiGeo \
--device cuda \
--maps \
--ply \
--glbOutputs are saved under output/optigeo and can include:
image.jpg: resized input image used by inferencedepth.exranddepth_vis.png: metric depth and visualizationpoints.exr: metric point mapmask.png: valid prediction maskfov.json: estimated camera field of viewpointcloud.plyandmesh.glb: 3D exports
Useful options:
# Faster inference with half precision
python optigeo/scripts/infer.py -i path/to/images -o output/fast --fp16 --maps
# Control inference resolution; higher is sharper but slower
python optigeo/scripts/infer.py -i path/to/images -o output/high --resolution_level 9 --maps
# Use a known horizontal camera field of view in degrees
python optigeo/scripts/infer.py -i path/to/image.jpg -o output/fov --fov_x 70 --mapsEvaluation instructions are available in docs/eval.md. The evaluation pipeline wraps baseline models, runs configured benchmarks, and writes metrics to JSON.
We provide training code and configuration files:
- OptiGeo-S:
configs/train/OptiGeo.json - OptiGeo-H+:
configs/train/OptiGeo_Hplus_w_refine.json - OptiGeo-L:
configs/train/OptiGeo_Large_w_refine.json - Multi-GPU launch script:
scripts/train.sh
Training datasets are expected under data/train. Each dataset should contain an index file and per-sample folders:
data/train/somedataset
├── index.txt
├── sample_000001
│ ├── image.jpg
│ ├── depth.png
│ └── meta.json
└── ...
index.txt stores one sample folder per line. meta.json should include normalized camera intrinsics:
{
"intrinsics": [[fx, 0.0, cx], [0.0, fy, cy], [0.0, 0.0, 1.0]]
}Depth maps can be read and written with the helpers in optigeo/utils/io.py. You can inspect prepared samples with:
python optigeo/scripts/vis_data.py data/train/somedataset/sample_000001 --plyFor a single-machine launch, call accelerate directly and adjust --num_processes, batch size, workspace, and checkpoint path as needed:
accelerate launch --multi_gpu --num_processes 8 \
optigeo/scripts/train.py \
--config configs/train/OptiGeo.json \
--workspace workspace/OptiGeo \
--gradient_accumulation_steps 1 \
--batch_size_forward 16 \
--checkpoint latest \
--enable_gradient_checkpointing False \
--enable_mlflow TrueThe provided launch script is designed for multi-GPU or multi-node training environments. It reads distributed settings from environment variables such as RESOURCE_NUM_GPU, DISTRIBUTED_NODE_COUNT, DISTRIBUTED_NODE_RANK, and DISTRIBUTED_MASTER_HOSTS:
bash scripts/train.shMore details are available in docs/train.md.
If you find our work useful, please consider citing:
@misc{liu2026optigeo,
title={OptiGeo: Efficient Monocular Geometry for Embodied Perception in Optically Challenging Scenes},
author={Muxin Liu and Tianbo Liu and Jing Xia and Xiaoyang Lyu and Xiaoshan Wu and Bo Wang and Peng Dai and Zhongrui Wang and Shaoshuai Shi and Xiaojuan Qi},
year={2026},
eprint={2608.29881},
archivePrefix={arXiv},
primaryClass={cs.CV},
url={https://arxiv.org/abs/2608.29881},
}Please also consider citing our monocular foundation geometry model, FoundationGeo:
@misc{liu2026foundationgeo,
title={FoundationGeo: Learning Spatial Pixel-Wise Fields for Monocular Metric Geometry},
author={Muxin Liu and Xiaoyang Lyu and Tianhe Ren and Peng Dai and Xiaoshan Wu and Zhiyue Zhang and Jiaqi Zhang and Jiehong Lin and Shaoshuai Shi and Xiaojuan Qi},
year={2026},
eprint={2607.11588},
archivePrefix={arXiv},
primaryClass={cs.CV},
url={https://arxiv.org/abs/2607.11588},
}OptiGeo original code and documentation are released under the MIT License. Third-party components retain their original license terms; see the source-file headers for details.
We thank the MoGe series of works and DINOv3.


