Skip to main content

stereo_matching

CI License PyPI Python Demo

A unified Python library for stereo depth estimation

Inference - CLI - 3D Visualization - ONNX - Quantization


stereo_matching provides a single, consistent API across 8 model families and 31 registered variant IDs. You can swap RAFT-Stereo, CREStereo, AANet, FoundationStereo, IGEV-Stereo, IGEV++, S2M2, and UniMatch without rewriting your preprocessing or postprocessing code.

It is built around the practical stereo workflow: run inference with one line, inspect models from the CLI, and turn calibrated disparity into depth maps and point clouds with the same library.

Current scope: inference, model/config loading, preprocessing, postprocessing, CLI prediction, reduced-precision inference, ONNX export and quantization, and visualization are implemented. Dataset loaders, a packaged evaluator, trainer classes, and built-in losses are not included yet. Their documentation pages describe custom integration patterns and clearly mark reserved APIs.

Installation

pip install stereo_matching

See docs/dependencies.md for runtime, development, and model-specific dependencies.


Quickstart

The pipeline API is the fastest way to run any registered stereo model:

from stereo_matching import pipeline

pipe = pipeline("stereo-matching", model="raft-stereo")
result = pipe("left.png", "right.png", focal_length=721.5, baseline=0.54)

disparity = result.disparity          # np.ndarray, float32, (H, W)
depth_map = result.depth              # np.ndarray, float32, (H, W) or None
colored   = result.colored_disparity  # np.ndarray, uint8,   (H, W, 3)

For full control over preprocessing, forward pass, and postprocessing, use Auto Classes:

from stereo_matching import AutoStereoModel, AutoProcessor
import torch

model = AutoStereoModel.from_pretrained("igev-stereo", device="cuda")
processor = AutoProcessor.from_pretrained("igev-stereo")

inputs = processor("left.png", "right.png")
with torch.no_grad():
    disparity = model(inputs["left_values"].cuda(), inputs["right_values"].cuda())
result = processor.postprocess(disparity, inputs["original_sizes"], colorize=True)

Or from the command line:

stereo-matching predict --left left.png --right right.png --model raft-stereo

Why use stereo_matching?

1. One API, every model. Switch from RAFT-Stereo to FoundationStereo or UniMatch by changing a single string. pipeline(), AutoStereoModel, and AutoProcessor keep the calling pattern consistent across families.

2. Consistent model loading. Registered variants resolve through the same pipeline(), AutoStereoModel, and AutoProcessor entry points, so model selection stays simple even as the registry grows.

3. Self-contained model packages. Each family lives under src/stereo_matching/models/<family>/ with a config file, a single vendored modeling file, and lazy self-registration in the global registry.

4. Calibrated outputs beyond disparity. Pass focal_length and baseline once and the library can return metric depth, colorized disparity, and point clouds for export or interactive viewing.

5. Deployment workflows. Cast PyTorch models to FP16/BF16, dynamically quantize linear layers to INT8, or export a two-input ONNX graph and quantize it with ONNX Runtime.


Supported Models

8 model families - 31 registered IDs - see docs/models.md for the full list and per-variant notes.

All families support pipeline(), Auto Classes, and CLI prediction.

Family Variants
RAFT-Stereo raft-stereo, raft-stereo-middlebury, raft-stereo-eth3d, raft-stereo-realtime
CREStereo crestereo
AANet aanet, aanet-kitti2012, aanet-sceneflow
FoundationStereo foundation-stereo, foundation-stereo-large
IGEV-Stereo 6 registered IDs (igev-stereo*)
IGEV++ 6 registered IDs (igev-plusplus*)
S2M2 s2m2, s2m2-m, s2m2-l, s2m2-xl
UniMatch 5 registered IDs (unimatch*)

What can you do?

Inference - single pair, batch, or local script
# Single stereo pair
result = pipe("left.png", "right.png")

# Batch
results = pipe(
    ["left0.png", "left1.png"],
    ["right0.png", "right1.png"],
    batch_size=2,
)
# CLI prediction
stereo-matching predict --left left.png --right right.png --model raft-stereo --output-dir results/

# Run the demo after selecting variants in its MODELS list
python examples/demo.py
Precision and ONNX - FP16, BF16, INT8, export, and ONNX quantization
from stereo_matching import AutoStereoModel, export_onnx, quantize_onnx

model = AutoStereoModel.from_pretrained("raft-stereo", device="cuda")
export_onnx(model, "raft_stereo.fp32.onnx", input_height=384, input_width=640)
quantize_onnx("raft_stereo.fp32.onnx", "raft_stereo.int8.onnx")

fp16_model = model.quantize("fp16")  # direct reduced-precision PyTorch inference

PyTorch dynamic INT8 and ONNX quantization are separate paths. See docs/quantization.md and docs/export.md before deploying reduced-precision models.

Auto Classes - registry-based loading for registered variants
from stereo_matching import AutoStereoModel, AutoProcessor

model = AutoStereoModel.from_pretrained("foundation-stereo", device="cuda")
processor = AutoProcessor.from_pretrained("foundation-stereo")

Use stereo-matching list-models to inspect the full registry and stereo-matching info --model <id> to print a model config from the terminal.

3D Visualization - point clouds, PLY, and GLB export
from stereo_matching import pipeline, viz
import numpy as np
from PIL import Image

pipe = pipeline("stereo-matching", model="raft-stereo")
result = pipe("left.png", "right.png", focal_length=721.5, baseline=0.54)
left_rgb = np.array(Image.open("left.png").convert("RGB"))

viz.point_cloud(
    result,
    image=left_rgb,
    focal_length=721.5,
    baseline=0.54,
    save_ply="scene.ply",
    save_glb="scene.glb",
)

open3d is currently a core dependency and is imported only when its viewer backend is selected. See docs/pipeline.md for output details.

Model Comparison Demo - hosted Hugging Face Space and local Gradio app

Hosted demo: StereoMatching Compare Demo

pip install gradio gradio_sync3dcompare
python examples/compare_demo.py

The demo runs two stereo models on the same pair and shows disparity and 3D outputs side-by-side in a synchronized viewer.


Documentation

Development checks

pip install -e ".[dev]"
ruff check .
pytest tests -m "not slow"
python -m build
twine check dist/*

Mypy is currently advisory. Real pretrained-model inference runs in the weekly slow workflow; see CONTRIBUTING.md.


Adding a New Model

  1. Create src/stereo_matching/models/your_model/
  2. Add configuration_your_model.py
  3. Add modeling_your_model.py
  4. Add __init__.py with MODEL_REGISTRY.register(...)
  5. Import the package in src/stereo_matching/__init__.py

AutoStereoModel, AutoProcessor, and pipeline() resolve the new model automatically. See docs/adding_a_model.md for the full pattern.


Acknowledgments

This library builds on the work of 8 stereo matching research families. See docs/models.md#citations for the citation block.

License

MIT

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

stereo_matching-0.2.0.tar.gz (119.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

stereo_matching-0.2.0-py3-none-any.whl (127.4 kB view details)

Uploaded Python 3

File details

Details for the file stereo_matching-0.2.0.tar.gz.

File metadata

  • Download URL: stereo_matching-0.2.0.tar.gz
  • Upload date:
  • Size: 119.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for stereo_matching-0.2.0.tar.gz
Algorithm Hash digest
SHA256 61ab4f68403a2ab9f094c17e77a7476d6e6467e8774a5c6b0339eb0c13c28a15
MD5 91e9c45dc2b2fd1035478fd8c8779902
BLAKE2b-256 df4366b76e77e1618aa2723ab69c7f0e1dd6d000110ab1b6907142f371a1974b

See more details on using hashes here.

Provenance

The following attestation bundles were made for stereo_matching-0.2.0.tar.gz:

Publisher: python-publish.yml on shriarul5273/stereo_matching

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file stereo_matching-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: stereo_matching-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 127.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for stereo_matching-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 46bad3ea437d1ad45b99542780049a4e4953b11fbc01b57238ff7954b3378e97
MD5 3c55279ec2604062b644580f298ae1d1
BLAKE2b-256 d8fb1b62c4f40f4f95508f438e3a89af93eedb596a2c280fd47b5126672238ea

See more details on using hashes here.

Provenance

The following attestation bundles were made for stereo_matching-0.2.0-py3-none-any.whl:

Publisher: python-publish.yml on shriarul5273/stereo_matching

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.2.0 This release

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page