Skip to content

Repository files navigation

🚗 LeAD-M3D

Leveraging Asymmetric Distillation for Real-Time Monocular 3D Detection

ECCV 2026 Project Page

arXiv License: AGPL-3.0 KITTI

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).


✨ Highlights

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.

📊 Results

KITTI Test — Car, AP40 @ IoU ≥ 0.7

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.

KITTI Val — Car, AP40 3D (k=25)

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

⚙️ Installation

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.txt

CPU-only or other CUDA versions: replace the torch line with the appropriate build from pytorch.org.


📁 Dataset Setup

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/kitti

📦 Model Zoo

Download 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

🚀 Inference & Evaluation

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)

⚡ TensorRT Inference

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 0

Exports each model to ONNX, builds a FP16 TensorRT engine, and reports median latency over 1000 forward passes. Engines are saved under runs/trt_engines/.


🎨 Visualisation

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

📝 Citation

@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},
}

🙏 Acknowledgements

This codebase builds on YOLOv10 (Wang et al., 2024) and MonoLSS (Li et al., 2024). We thank the authors for their open-source contributions.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages