Johannes Meier* · Jonathan Michel* · Oussema Dhaouadi · Yung-Hsu Yang · Christoph Reich · Zuria Bauer · Stefan Roth · Marc Pollefeys · Jacques Kaiser · Daniel Cremers
DeepScenario · ETH Zurich · TU Munich · University of Cambridge · MCML · TU Darmstadt · ELIZA · hessian.AI · Microsoft
LeAD-M3D predicts accurate 3D bounding boxes from a single RGB image in real time (KITTI val set).
| Component | What it does |
|---|---|
| A2D2 — Asymmetric Augmentation Denoising Distillation | Transfers geometric depth knowledge from a clean-image teacher via a quality- and importance-weighted feature loss. No LiDAR needed. |
| CM-3D — 3D-aware Consistent Matching | Integrates 3D MGIoU into the assignment score for stable, precise supervision. |
| CGI-3D — Confidence-Gated 3D Inference | Routes only the top-k confident locations through the expensive 3D regression head — up to 3.6× faster than prior high-accuracy models. |
| Model | Params | GFLOPs | Time (FP32) | Time (TRT FP16) | Easy | Mod. | Hard |
|---|---|---|---|---|---|---|---|
| LeAD-M3D-N | 3.8 M | 14.2 | 8.2 ms | 1.2 ms | 24.31 | 16.49 | 14.14 |
| LeAD-M3D-S | 10.1 M | 37.4 | 10.9 ms | 2.1 ms | 27.28 | 18.87 | 16.37 |
| LeAD-M3D-M | 19.7 M | 87.6 | 12.9 ms | 3.7 ms | 28.08 | 19.47 | 17.66 |
| LeAD-M3D-B | 24.9 M | 131.9 | 14.1 ms | 4.5 ms | 29.10 | 20.17 | 18.34 |
| LeAD-M3D-X | 36.3 M | 217.1 | 24.3 ms | 7.8 ms | 30.76 | 21.20 | 18.76 |
Inference on a single image (384×1280) on NVIDIA Quadro RTX 8000, batch size 1. TRT FP16 uses TensorRT 8.6.1 with 16 GB workspace, median of 1000 runs.
| Model | Params | GFLOPs | Time (FP32) | Time (TRT FP16) | Easy | Mod. | Hard |
|---|---|---|---|---|---|---|---|
| LeAD-M3D-N | 3.8 M | 14.2 | 8.2 ms | 1.2 ms | 23.85 | 18.38 | 16.69 |
| LeAD-M3D-S | 10.1 M | 37.4 | 10.9 ms | 2.1 ms | 26.34 | 20.67 | 18.55 |
| LeAD-M3D-M | 19.7 M | 87.6 | 12.9 ms | 3.7 ms | 27.98 | 22.40 | 19.76 |
| LeAD-M3D-B | 24.9 M | 131.9 | 14.1 ms | 4.5 ms | 28.44 | 22.65 | 19.87 |
| LeAD-M3D-X | 36.3 M | 217.1 | 24.3 ms | 7.8 ms | 28.30 | 22.96 | 21.09 |
conda create -n lead_m3d python=3.9 -y
conda activate lead_m3d
# PyTorch — adjust for your CUDA version
pip install torch==2.0.1+cu117 torchvision==0.15.2+cu117 \
--extra-index-url https://download.pytorch.org/whl/cu117
# Install this package in editable mode
pip install -e .
# Remaining dependencies
pip install -r requirements.txtCPU-only or other CUDA versions: replace the
torchline with the appropriate build from pytorch.org.
Download the KITTI 3D Object Detection dataset and arrange it as:
kitti/
├── training/
│ ├── image_2/ # RGB images
│ ├── label_2/ # 3D annotations
│ └── calib/ # calibration files
├── testing/
│ ├── image_2/
│ └── calib/
└── ImageSets/
├── train.txt
├── val.txt
└── test.txt
Set the dataset root in lead_m3d/cfg/datasets/kitti.yaml:
path: /path/to/kittiDownload pre-trained checkpoints and place them under checkpoints/:
| Model | Val AP3D Mod. | Download |
|---|---|---|
| LeAD-M3D-N | 18.41 | lead_m3d_n.pt |
| LeAD-M3D-S | 20.73 | lead_m3d_s.pt |
| LeAD-M3D-M | 22.46 | lead_m3d_m.pt |
| LeAD-M3D-B | 22.71 | lead_m3d_b.pt |
| LeAD-M3D-X | 23.01 | lead_m3d_x.pt |
python infer_kitti.py \
--weights checkpoints/lead_m3d_b.pt \
--data lead_m3d/cfg/datasets/kitti.yaml \
--topk 25| Argument | Default | Description |
|---|---|---|
--config |
— | Per-model config YAML (e.g. configs/kitti_b.yaml) |
--weights |
— | Path to .pt checkpoint |
--data |
lead_m3d/cfg/datasets/kitti.yaml |
Dataset YAML |
--topk |
25 |
CGI-3D k: candidates per scale for the 3D head |
--batch |
8 |
Batch size |
--output |
runs/kitti_eval |
Output directory |
--half |
False |
FP16 inference |
--device |
"" |
CUDA device (0, 1, …, or cpu) |
pip install "onnx==1.14.1" onnxsim tensorrt==8.6.1
export LD_LIBRARY_PATH="$(python -c 'import os, torch; print(os.path.join(os.path.dirname(torch.__file__), "lib"))'):$LD_LIBRARY_PATH"
python export_trt.py --models n s m b x --device 0Exports each model to ONNX, builds a FP16 TensorRT engine, and reports median latency over 1000 forward passes. Engines are saved under runs/trt_engines/.
visualize.py is a standalone script (no LeAD-M3D imports needed) that renders 3D bounding boxes on KITTI images given prediction files:
python visualize.py \
--pred runs/kitti_eval/preds/ \
--images /path/to/kitti/training/image_2/ \
--calib /path/to/kitti/training/calib/ \
--output vis_output/ \
--score 0.3@inproceedings{meier2026leadm3d,
title = {{LeAD-M3D}: Leveraging Asymmetric Distillation for Real-Time Monocular {3D} Detection},
author = {Meier, Johannes and Michel, Jonathan and Dhaouadi, Oussema and Yang, Yung-Hsu
and Reich, Christoph and Bauer, Zuria and Roth, Stefan and Pollefeys, Marc
and Kaiser, Jacques and Cremers, Daniel},
booktitle = {European Conference on Computer Vision (ECCV)},
year = {2026},
}This codebase builds on YOLOv10 (Wang et al., 2024) and MonoLSS (Li et al., 2024). We thank the authors for their open-source contributions.