Repository files navigation

UFM: A Simple Path towards Unified Dense Correspondence with Flow

PaperarXivProject Page

Carnegie Mellon University

Yuchen Zhang, Nikhil Keetha, Chenwei Lyu, Bhuvan Jhamb, Yutian Chen, Yuheng Qiu, Jay Karhade, Shreyas Jha, Yaoyu Hu, Deva Ramanan, Sebastian Scherer, Wenshan Wang

example
UFM unifies the tasks of Optical Flow Estimation and Wide Baseline Matching and provides accurate dense correspondences for in-the-wild images at significantly fast inference speeds.

Updates

  • [2026/04/03] UFM-G version initialized from DINOv2-G weights. More robust and accurate!
  • [2026/02/20] Smaller UFM initialized from DINOv2 weights, faster at similar performance.
  • [2025/10/21] Complete training and most data processing scripts. (branch: train)
  • [2025/10/20] Benchmark & data script for primary results. (branch: benchmark)
  • [2025/10/08] Released 980 resolution models.
  • [2025/06/10] Initial release of model checkpoint and inference code.

Stay Tuned for the Upcoming Updates!

  • UFM-Tiny for real-time applications such as robotics.

Models

CheckpointTypical Runtime (ms, RTX 5090)ParametersHuggingFace
UFM-Base330.4Binfinity1096/UFM-Base
UFM-Refine440.4Binfinity1096/UFM-Refine
UFM-Base-980770.4Binfinity1096/UFM-Base-980
UFM-Refine-980960.4Binfinity1096/UFM-Refine-980
UFM-Base-DINOv2L-init280.3Binfinity1096/UFM-Base-DINOv2L-init
UFM-Base-DINOv2G-init551Binfinity1096/UFM-Base-DINOv2G-init

Overview

UFM (Unified Flow & Matching, UniFlowMatch) is a simple, end-to-end trained transformer model that directly regresses pixel displacement images (flow) and can be applied concurrently to both optical flow and wide-baseline matching tasks.

Quick Start

Installation

We use UniCeption, a library which contains modular, config-swappable components for assembling end-to-end networks. To install UFM, recursively clone this repository and install the package with all dependencies:

git clone --recursive https://github.com/UniFlowMatch/UFM.git
cd UFM
# In case you cloned without --recursive:# git submodule update --init# Create and activate conda environment
conda create -n ufm python=3.11 -y
conda activate ufm
# Install UniCeption dependencycd UniCeption
pip install -e .cd ..
# Install UFM with all dependencies
pip install -e .# Optional: Install with specific extras# pip install -e ".[dev]" # For development# pip install -e ".[demo]" # For demo# pip install -e ".[all]" # All optional dependencies# Optional: For development and linting
pre-commit install # Install pre-commit hooks

Verify Installation

Verify your installation by running the basic model test:

# Test installation
ufm test# Or run the basic model test
python uniflowmatch/models/ufm.py

Verify that ufm_output.png looks like examples/example_ufm_output.png.

Command Line Interface

UFM provides a convenient CLI for common tasks:

# Test installation
ufm test# Launch interactive demo
ufm demo
# Launch demo with specific settings
ufm demo --port 8080 --share --model refine
# Run inference on image pair
ufm infer source.jpg target.jpg --output results/
# Run inference with refinement model
ufm infer img1.png img2.png --model refine --output ./output

Python API

importcv2importtorch# Load the base model (for general use)fromuniflowmatch.models.ufmimportUniFlowMatchConfidencemodel=UniFlowMatchConfidence.from_pretrained("infinity1096/UFM-Base")
# Or load the refinement model (for higher accuracy)fromuniflowmatch.models.ufmimportUniFlowMatchClassificationRefinementmodel=UniFlowMatchClassificationRefinement.from_pretrained("infinity1096/UFM-Refine")
# Choose from# UFM-Base, UFM-Refine, UFM-Base-980, UFM-Refine-980, UFM-Base-DINOv2L-init, UFM-Base-DINOv2G-init# Set the model to evaluation modemodel.eval()
# Load images using cv2 or PILsource_image=cv2.imread("path/to/source.jpg")
target_image=cv2.imread("path/to/target.jpg")
source_rgb=cv2.cvtColor(source_image, cv2.COLOR_BGR2RGB) # Convert to RGBtarget_rgb=cv2.cvtColor(target_image, cv2.COLOR_BGR2RGB) # Convert to RGB# Convert to torch tensors (uint8 or float32)# Forward call takes care of normalizing uint8 images appropriate to the UFM modelsource_image=torch.from_numpy(source_rgb) # Shape: (H, W, 3)target_image=torch.from_numpy(target_rgb) # Shape: (H, W, 3)# Predict correspondenceswithtorch.no_grad():
result=model.predict_correspondences_batched(
source_image=source_image,
target_image=target_image,
)
flow=result.flow.flow_output[0].cpu().numpy()
covisibility=result.covisibility.mask[0].cpu().numpy()

Interactive Demo

Online Demo

Try our online demo without installation: 🤗 Hugging Face Demo

Local Gradio Demo

Run the interactive Gradio demo locally to visualize UFM outputs:

# Using the CLI (recommended)
ufm demo
# Or run directly
python gradio_demo.py
# Advanced options
ufm demo --port 8080 --share --model refine

License

This code is licensed under a fully open-source BSD-3-Clause license. The pre-trained UFM model checkpoints inherit the licenses of the underlying training datasets and as result, may not be used for commercial purposes (CC BY-NC-SA 4.0). Please refer to the respective training dataset licenses for more details.

Based on community interest, we can look into releasing an Apache 2.0 licensed version of the model in the future. Please upvote the issue here if you would like to see this happen.

Acknowledgements

We thank the folowing projects for their open-source code: DUSt3R, MASt3R, RoMA, and DINOv2.

Citation

If you find our repository useful, please consider giving it a star ⭐ and citing our paper in your work:

@inproceedings{zhang2025ufm,
title={UFM: A Simple Path towards Unified Dense Correspondence with Flow},
author={Zhang, Yuchen and Keetha, Nikhil and Lyu, Chenwei and Jhamb, Bhuvan and Chen, Yutian and Qiu, Yuheng and Karhade, Jay and Jha, Shreyas and Hu, Yaoyu and Ramanan, Deva and Scherer, Sebastian and Wang, Wenshan},
booktitle={arXiV},
year={2025}
}

About

UFM: A Unified Dense Image Correspondence Estimator for both Optical Flow & Wide Baseline Matching Tasks. Matches any pair of images. (NeurIPS 2025)

Topics

Resources

Stars

350 stars

Watchers

12 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

UFM: A Simple Path towards Unified Dense Correspondence with Flow

PaperarXivProject Page

Carnegie Mellon University

Yuchen Zhang, Nikhil Keetha, Chenwei Lyu, Bhuvan Jhamb, Yutian Chen, Yuheng Qiu, Jay Karhade, Shreyas Jha, Yaoyu Hu, Deva Ramanan, Sebastian Scherer, Wenshan Wang

example
UFM unifies the tasks of Optical Flow Estimation and Wide Baseline Matching and provides accurate dense correspondences for in-the-wild images at significantly fast inference speeds.

Updates

  • [2026/04/03] UFM-G version initialized from DINOv2-G weights. More robust and accurate!
  • [2026/02/20] Smaller UFM initialized from DINOv2 weights, faster at similar performance.
  • [2025/10/21] Complete training and most data processing scripts. (branch: train)
  • [2025/10/20] Benchmark & data script for primary results. (branch: benchmark)
  • [2025/10/08] Released 980 resolution models.
  • [2025/06/10] Initial release of model checkpoint and inference code.

Stay Tuned for the Upcoming Updates!

  • UFM-Tiny for real-time applications such as robotics.

Models

CheckpointTypical Runtime (ms, RTX 5090)ParametersHuggingFace
UFM-Base330.4Binfinity1096/UFM-Base
UFM-Refine440.4Binfinity1096/UFM-Refine
UFM-Base-980770.4Binfinity1096/UFM-Base-980
UFM-Refine-980960.4Binfinity1096/UFM-Refine-980
UFM-Base-DINOv2L-init280.3Binfinity1096/UFM-Base-DINOv2L-init
UFM-Base-DINOv2G-init551Binfinity1096/UFM-Base-DINOv2G-init

Overview

UFM (Unified Flow & Matching, UniFlowMatch) is a simple, end-to-end trained transformer model that directly regresses pixel displacement images (flow) and can be applied concurrently to both optical flow and wide-baseline matching tasks.

Quick Start

Installation

We use UniCeption, a library which contains modular, config-swappable components for assembling end-to-end networks. To install UFM, recursively clone this repository and install the package with all dependencies:

git clone --recursive https://github.com/UniFlowMatch/UFM.git
cd UFM
# In case you cloned without --recursive:# git submodule update --init# Create and activate conda environment
conda create -n ufm python=3.11 -y
conda activate ufm
# Install UniCeption dependencycd UniCeption
pip install -e .cd ..
# Install UFM with all dependencies
pip install -e .# Optional: Install with specific extras# pip install -e ".[dev]" # For development# pip install -e ".[demo]" # For demo# pip install -e ".[all]" # All optional dependencies# Optional: For development and linting
pre-commit install # Install pre-commit hooks

Verify Installation

Verify your installation by running the basic model test:

# Test installation
ufm test# Or run the basic model test
python uniflowmatch/models/ufm.py

Verify that ufm_output.png looks like examples/example_ufm_output.png.

Command Line Interface

UFM provides a convenient CLI for common tasks:

# Test installation
ufm test# Launch interactive demo
ufm demo
# Launch demo with specific settings
ufm demo --port 8080 --share --model refine
# Run inference on image pair
ufm infer source.jpg target.jpg --output results/
# Run inference with refinement model
ufm infer img1.png img2.png --model refine --output ./output

Python API

importcv2importtorch# Load the base model (for general use)fromuniflowmatch.models.ufmimportUniFlowMatchConfidencemodel=UniFlowMatchConfidence.from_pretrained("infinity1096/UFM-Base")
# Or load the refinement model (for higher accuracy)fromuniflowmatch.models.ufmimportUniFlowMatchClassificationRefinementmodel=UniFlowMatchClassificationRefinement.from_pretrained("infinity1096/UFM-Refine")
# Choose from# UFM-Base, UFM-Refine, UFM-Base-980, UFM-Refine-980, UFM-Base-DINOv2L-init, UFM-Base-DINOv2G-init# Set the model to evaluation modemodel.eval()
# Load images using cv2 or PILsource_image=cv2.imread("path/to/source.jpg")
target_image=cv2.imread("path/to/target.jpg")
source_rgb=cv2.cvtColor(source_image, cv2.COLOR_BGR2RGB) # Convert to RGBtarget_rgb=cv2.cvtColor(target_image, cv2.COLOR_BGR2RGB) # Convert to RGB# Convert to torch tensors (uint8 or float32)# Forward call takes care of normalizing uint8 images appropriate to the UFM modelsource_image=torch.from_numpy(source_rgb) # Shape: (H, W, 3)target_image=torch.from_numpy(target_rgb) # Shape: (H, W, 3)# Predict correspondenceswithtorch.no_grad():
result=model.predict_correspondences_batched(
source_image=source_image,
target_image=target_image,
)
flow=result.flow.flow_output[0].cpu().numpy()
covisibility=result.covisibility.mask[0].cpu().numpy()

Interactive Demo

Online Demo

Try our online demo without installation: 🤗 Hugging Face Demo

Local Gradio Demo

Run the interactive Gradio demo locally to visualize UFM outputs:

# Using the CLI (recommended)
ufm demo
# Or run directly
python gradio_demo.py
# Advanced options
ufm demo --port 8080 --share --model refine

License

This code is licensed under a fully open-source BSD-3-Clause license. The pre-trained UFM model checkpoints inherit the licenses of the underlying training datasets and as result, may not be used for commercial purposes (CC BY-NC-SA 4.0). Please refer to the respective training dataset licenses for more details.

Based on community interest, we can look into releasing an Apache 2.0 licensed version of the model in the future. Please upvote the issue here if you would like to see this happen.

Acknowledgements

We thank the folowing projects for their open-source code: DUSt3R, MASt3R, RoMA, and DINOv2.

Citation

If you find our repository useful, please consider giving it a star ⭐ and citing our paper in your work:

@inproceedings{zhang2025ufm,
title={UFM: A Simple Path towards Unified Dense Correspondence with Flow},
author={Zhang, Yuchen and Keetha, Nikhil and Lyu, Chenwei and Jhamb, Bhuvan and Chen, Yutian and Qiu, Yuheng and Karhade, Jay and Jha, Shreyas and Hu, Yaoyu and Ramanan, Deva and Scherer, Sebastian and Wang, Wenshan},
booktitle={arXiV},
year={2025}
}

About

UFM: A Unified Dense Image Correspondence Estimator for both Optical Flow & Wide Baseline Matching Tasks. Matches any pair of images. (NeurIPS 2025)

Topics

Resources

Stars

350 stars

Watchers

12 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

UFM: A Simple Path towards Unified Dense Correspondence with Flow

PaperarXivProject Page

Carnegie Mellon University

Yuchen Zhang, Nikhil Keetha, Chenwei Lyu, Bhuvan Jhamb, Yutian Chen, Yuheng Qiu, Jay Karhade, Shreyas Jha, Yaoyu Hu, Deva Ramanan, Sebastian Scherer, Wenshan Wang

example
UFM unifies the tasks of Optical Flow Estimation and Wide Baseline Matching and provides accurate dense correspondences for in-the-wild images at significantly fast inference speeds.

Updates

  • [2026/04/03] UFM-G version initialized from DINOv2-G weights. More robust and accurate!
  • [2026/02/20] Smaller UFM initialized from DINOv2 weights, faster at similar performance.
  • [2025/10/21] Complete training and most data processing scripts. (branch: train)
  • [2025/10/20] Benchmark & data script for primary results. (branch: benchmark)
  • [2025/10/08] Released 980 resolution models.
  • [2025/06/10] Initial release of model checkpoint and inference code.

Stay Tuned for the Upcoming Updates!

  • UFM-Tiny for real-time applications such as robotics.

Models

CheckpointTypical Runtime (ms, RTX 5090)ParametersHuggingFace
UFM-Base330.4Binfinity1096/UFM-Base
UFM-Refine440.4Binfinity1096/UFM-Refine
UFM-Base-980770.4Binfinity1096/UFM-Base-980
UFM-Refine-980960.4Binfinity1096/UFM-Refine-980
UFM-Base-DINOv2L-init280.3Binfinity1096/UFM-Base-DINOv2L-init
UFM-Base-DINOv2G-init551Binfinity1096/UFM-Base-DINOv2G-init

Overview

UFM (Unified Flow & Matching, UniFlowMatch) is a simple, end-to-end trained transformer model that directly regresses pixel displacement images (flow) and can be applied concurrently to both optical flow and wide-baseline matching tasks.

Quick Start

Installation

We use UniCeption, a library which contains modular, config-swappable components for assembling end-to-end networks. To install UFM, recursively clone this repository and install the package with all dependencies:

git clone --recursive https://github.com/UniFlowMatch/UFM.git
cd UFM
# In case you cloned without --recursive:# git submodule update --init# Create and activate conda environment
conda create -n ufm python=3.11 -y
conda activate ufm
# Install UniCeption dependencycd UniCeption
pip install -e .cd ..
# Install UFM with all dependencies
pip install -e .# Optional: Install with specific extras# pip install -e ".[dev]" # For development# pip install -e ".[demo]" # For demo# pip install -e ".[all]" # All optional dependencies# Optional: For development and linting
pre-commit install # Install pre-commit hooks

Verify Installation

Verify your installation by running the basic model test:

# Test installation
ufm test# Or run the basic model test
python uniflowmatch/models/ufm.py

Verify that ufm_output.png looks like examples/example_ufm_output.png.

Command Line Interface

UFM provides a convenient CLI for common tasks:

# Test installation
ufm test# Launch interactive demo
ufm demo
# Launch demo with specific settings
ufm demo --port 8080 --share --model refine
# Run inference on image pair
ufm infer source.jpg target.jpg --output results/
# Run inference with refinement model
ufm infer img1.png img2.png --model refine --output ./output

Python API

importcv2importtorch# Load the base model (for general use)fromuniflowmatch.models.ufmimportUniFlowMatchConfidencemodel=UniFlowMatchConfidence.from_pretrained("infinity1096/UFM-Base")
# Or load the refinement model (for higher accuracy)fromuniflowmatch.models.ufmimportUniFlowMatchClassificationRefinementmodel=UniFlowMatchClassificationRefinement.from_pretrained("infinity1096/UFM-Refine")
# Choose from# UFM-Base, UFM-Refine, UFM-Base-980, UFM-Refine-980, UFM-Base-DINOv2L-init, UFM-Base-DINOv2G-init# Set the model to evaluation modemodel.eval()
# Load images using cv2 or PILsource_image=cv2.imread("path/to/source.jpg")
target_image=cv2.imread("path/to/target.jpg")
source_rgb=cv2.cvtColor(source_image, cv2.COLOR_BGR2RGB) # Convert to RGBtarget_rgb=cv2.cvtColor(target_image, cv2.COLOR_BGR2RGB) # Convert to RGB# Convert to torch tensors (uint8 or float32)# Forward call takes care of normalizing uint8 images appropriate to the UFM modelsource_image=torch.from_numpy(source_rgb) # Shape: (H, W, 3)target_image=torch.from_numpy(target_rgb) # Shape: (H, W, 3)# Predict correspondenceswithtorch.no_grad():
result=model.predict_correspondences_batched(
source_image=source_image,
target_image=target_image,
)
flow=result.flow.flow_output[0].cpu().numpy()
covisibility=result.covisibility.mask[0].cpu().numpy()

Interactive Demo

Online Demo

Try our online demo without installation: 🤗 Hugging Face Demo

Local Gradio Demo

Run the interactive Gradio demo locally to visualize UFM outputs:

# Using the CLI (recommended)
ufm demo
# Or run directly
python gradio_demo.py
# Advanced options
ufm demo --port 8080 --share --model refine

License

This code is licensed under a fully open-source BSD-3-Clause license. The pre-trained UFM model checkpoints inherit the licenses of the underlying training datasets and as result, may not be used for commercial purposes (CC BY-NC-SA 4.0). Please refer to the respective training dataset licenses for more details.

Based on community interest, we can look into releasing an Apache 2.0 licensed version of the model in the future. Please upvote the issue here if you would like to see this happen.

Acknowledgements

We thank the folowing projects for their open-source code: DUSt3R, MASt3R, RoMA, and DINOv2.

Citation

If you find our repository useful, please consider giving it a star ⭐ and citing our paper in your work:

@inproceedings{zhang2025ufm,
title={UFM: A Simple Path towards Unified Dense Correspondence with Flow},
author={Zhang, Yuchen and Keetha, Nikhil and Lyu, Chenwei and Jhamb, Bhuvan and Chen, Yutian and Qiu, Yuheng and Karhade, Jay and Jha, Shreyas and Hu, Yaoyu and Ramanan, Deva and Scherer, Sebastian and Wang, Wenshan},
booktitle={arXiV},
year={2025}
}

About

UFM: A Unified Dense Image Correspondence Estimator for both Optical Flow & Wide Baseline Matching Tasks. Matches any pair of images. (NeurIPS 2025)

Topics

Resources

Stars

350 stars

Watchers

12 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

UFM: A Simple Path towards Unified Dense Correspondence with Flow

PaperarXivProject Page

Carnegie Mellon University

Yuchen Zhang, Nikhil Keetha, Chenwei Lyu, Bhuvan Jhamb, Yutian Chen, Yuheng Qiu, Jay Karhade, Shreyas Jha, Yaoyu Hu, Deva Ramanan, Sebastian Scherer, Wenshan Wang

example
UFM unifies the tasks of Optical Flow Estimation and Wide Baseline Matching and provides accurate dense correspondences for in-the-wild images at significantly fast inference speeds.

Updates

  • [2026/04/03] UFM-G version initialized from DINOv2-G weights. More robust and accurate!
  • [2026/02/20] Smaller UFM initialized from DINOv2 weights, faster at similar performance.
  • [2025/10/21] Complete training and most data processing scripts. (branch: train)
  • [2025/10/20] Benchmark & data script for primary results. (branch: benchmark)
  • [2025/10/08] Released 980 resolution models.
  • [2025/06/10] Initial release of model checkpoint and inference code.

Stay Tuned for the Upcoming Updates!

  • UFM-Tiny for real-time applications such as robotics.

Models

CheckpointTypical Runtime (ms, RTX 5090)ParametersHuggingFace
UFM-Base330.4Binfinity1096/UFM-Base
UFM-Refine440.4Binfinity1096/UFM-Refine
UFM-Base-980770.4Binfinity1096/UFM-Base-980
UFM-Refine-980960.4Binfinity1096/UFM-Refine-980
UFM-Base-DINOv2L-init280.3Binfinity1096/UFM-Base-DINOv2L-init
UFM-Base-DINOv2G-init551Binfinity1096/UFM-Base-DINOv2G-init

Overview

UFM (Unified Flow & Matching, UniFlowMatch) is a simple, end-to-end trained transformer model that directly regresses pixel displacement images (flow) and can be applied concurrently to both optical flow and wide-baseline matching tasks.

Quick Start

Installation

We use UniCeption, a library which contains modular, config-swappable components for assembling end-to-end networks. To install UFM, recursively clone this repository and install the package with all dependencies:

git clone --recursive https://github.com/UniFlowMatch/UFM.git
cd UFM
# In case you cloned without --recursive:# git submodule update --init# Create and activate conda environment
conda create -n ufm python=3.11 -y
conda activate ufm
# Install UniCeption dependencycd UniCeption
pip install -e .cd ..
# Install UFM with all dependencies
pip install -e .# Optional: Install with specific extras# pip install -e ".[dev]" # For development# pip install -e ".[demo]" # For demo# pip install -e ".[all]" # All optional dependencies# Optional: For development and linting
pre-commit install # Install pre-commit hooks

Verify Installation

Verify your installation by running the basic model test:

# Test installation
ufm test# Or run the basic model test
python uniflowmatch/models/ufm.py

Verify that ufm_output.png looks like examples/example_ufm_output.png.

Command Line Interface

UFM provides a convenient CLI for common tasks:

# Test installation
ufm test# Launch interactive demo
ufm demo
# Launch demo with specific settings
ufm demo --port 8080 --share --model refine
# Run inference on image pair
ufm infer source.jpg target.jpg --output results/
# Run inference with refinement model
ufm infer img1.png img2.png --model refine --output ./output

Python API

importcv2importtorch# Load the base model (for general use)fromuniflowmatch.models.ufmimportUniFlowMatchConfidencemodel=UniFlowMatchConfidence.from_pretrained("infinity1096/UFM-Base")
# Or load the refinement model (for higher accuracy)fromuniflowmatch.models.ufmimportUniFlowMatchClassificationRefinementmodel=UniFlowMatchClassificationRefinement.from_pretrained("infinity1096/UFM-Refine")
# Choose from# UFM-Base, UFM-Refine, UFM-Base-980, UFM-Refine-980, UFM-Base-DINOv2L-init, UFM-Base-DINOv2G-init# Set the model to evaluation modemodel.eval()
# Load images using cv2 or PILsource_image=cv2.imread("path/to/source.jpg")
target_image=cv2.imread("path/to/target.jpg")
source_rgb=cv2.cvtColor(source_image, cv2.COLOR_BGR2RGB) # Convert to RGBtarget_rgb=cv2.cvtColor(target_image, cv2.COLOR_BGR2RGB) # Convert to RGB# Convert to torch tensors (uint8 or float32)# Forward call takes care of normalizing uint8 images appropriate to the UFM modelsource_image=torch.from_numpy(source_rgb) # Shape: (H, W, 3)target_image=torch.from_numpy(target_rgb) # Shape: (H, W, 3)# Predict correspondenceswithtorch.no_grad():
result=model.predict_correspondences_batched(
source_image=source_image,
target_image=target_image,
)
flow=result.flow.flow_output[0].cpu().numpy()
covisibility=result.covisibility.mask[0].cpu().numpy()

Interactive Demo

Online Demo

Try our online demo without installation: 🤗 Hugging Face Demo

Local Gradio Demo

Run the interactive Gradio demo locally to visualize UFM outputs:

# Using the CLI (recommended)
ufm demo
# Or run directly
python gradio_demo.py
# Advanced options
ufm demo --port 8080 --share --model refine

License

This code is licensed under a fully open-source BSD-3-Clause license. The pre-trained UFM model checkpoints inherit the licenses of the underlying training datasets and as result, may not be used for commercial purposes (CC BY-NC-SA 4.0). Please refer to the respective training dataset licenses for more details.

Based on community interest, we can look into releasing an Apache 2.0 licensed version of the model in the future. Please upvote the issue here if you would like to see this happen.

Acknowledgements

We thank the folowing projects for their open-source code: DUSt3R, MASt3R, RoMA, and DINOv2.

Citation

If you find our repository useful, please consider giving it a star ⭐ and citing our paper in your work:

@inproceedings{zhang2025ufm,
title={UFM: A Simple Path towards Unified Dense Correspondence with Flow},
author={Zhang, Yuchen and Keetha, Nikhil and Lyu, Chenwei and Jhamb, Bhuvan and Chen, Yutian and Qiu, Yuheng and Karhade, Jay and Jha, Shreyas and Hu, Yaoyu and Ramanan, Deva and Scherer, Sebastian and Wang, Wenshan},
booktitle={arXiV},
year={2025}
}

About

UFM: A Unified Dense Image Correspondence Estimator for both Optical Flow & Wide Baseline Matching Tasks. Matches any pair of images. (NeurIPS 2025)

Topics

Resources

Stars

350 stars

Watchers

12 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

UFM: A Simple Path towards Unified Dense Correspondence with Flow

PaperarXivProject Page

Carnegie Mellon University

Yuchen Zhang, Nikhil Keetha, Chenwei Lyu, Bhuvan Jhamb, Yutian Chen, Yuheng Qiu, Jay Karhade, Shreyas Jha, Yaoyu Hu, Deva Ramanan, Sebastian Scherer, Wenshan Wang

example
UFM unifies the tasks of Optical Flow Estimation and Wide Baseline Matching and provides accurate dense correspondences for in-the-wild images at significantly fast inference speeds.

Updates

  • [2026/04/03] UFM-G version initialized from DINOv2-G weights. More robust and accurate!
  • [2026/02/20] Smaller UFM initialized from DINOv2 weights, faster at similar performance.
  • [2025/10/21] Complete training and most data processing scripts. (branch: train)
  • [2025/10/20] Benchmark & data script for primary results. (branch: benchmark)
  • [2025/10/08] Released 980 resolution models.
  • [2025/06/10] Initial release of model checkpoint and inference code.

Stay Tuned for the Upcoming Updates!

  • UFM-Tiny for real-time applications such as robotics.

Models

CheckpointTypical Runtime (ms, RTX 5090)ParametersHuggingFace
UFM-Base330.4Binfinity1096/UFM-Base
UFM-Refine440.4Binfinity1096/UFM-Refine
UFM-Base-980770.4Binfinity1096/UFM-Base-980
UFM-Refine-980960.4Binfinity1096/UFM-Refine-980
UFM-Base-DINOv2L-init280.3Binfinity1096/UFM-Base-DINOv2L-init
UFM-Base-DINOv2G-init551Binfinity1096/UFM-Base-DINOv2G-init

Overview

UFM (Unified Flow & Matching, UniFlowMatch) is a simple, end-to-end trained transformer model that directly regresses pixel displacement images (flow) and can be applied concurrently to both optical flow and wide-baseline matching tasks.

Quick Start

Installation

We use UniCeption, a library which contains modular, config-swappable components for assembling end-to-end networks. To install UFM, recursively clone this repository and install the package with all dependencies:

git clone --recursive https://github.com/UniFlowMatch/UFM.git
cd UFM
# In case you cloned without --recursive:# git submodule update --init# Create and activate conda environment
conda create -n ufm python=3.11 -y
conda activate ufm
# Install UniCeption dependencycd UniCeption
pip install -e .cd ..
# Install UFM with all dependencies
pip install -e .# Optional: Install with specific extras# pip install -e ".[dev]" # For development# pip install -e ".[demo]" # For demo# pip install -e ".[all]" # All optional dependencies# Optional: For development and linting
pre-commit install # Install pre-commit hooks

Verify Installation

Verify your installation by running the basic model test:

# Test installation
ufm test# Or run the basic model test
python uniflowmatch/models/ufm.py

Verify that ufm_output.png looks like examples/example_ufm_output.png.

Command Line Interface

UFM provides a convenient CLI for common tasks:

# Test installation
ufm test# Launch interactive demo
ufm demo
# Launch demo with specific settings
ufm demo --port 8080 --share --model refine
# Run inference on image pair
ufm infer source.jpg target.jpg --output results/
# Run inference with refinement model
ufm infer img1.png img2.png --model refine --output ./output

Python API

importcv2importtorch# Load the base model (for general use)fromuniflowmatch.models.ufmimportUniFlowMatchConfidencemodel=UniFlowMatchConfidence.from_pretrained("infinity1096/UFM-Base")
# Or load the refinement model (for higher accuracy)fromuniflowmatch.models.ufmimportUniFlowMatchClassificationRefinementmodel=UniFlowMatchClassificationRefinement.from_pretrained("infinity1096/UFM-Refine")
# Choose from# UFM-Base, UFM-Refine, UFM-Base-980, UFM-Refine-980, UFM-Base-DINOv2L-init, UFM-Base-DINOv2G-init# Set the model to evaluation modemodel.eval()
# Load images using cv2 or PILsource_image=cv2.imread("path/to/source.jpg")
target_image=cv2.imread("path/to/target.jpg")
source_rgb=cv2.cvtColor(source_image, cv2.COLOR_BGR2RGB) # Convert to RGBtarget_rgb=cv2.cvtColor(target_image, cv2.COLOR_BGR2RGB) # Convert to RGB# Convert to torch tensors (uint8 or float32)# Forward call takes care of normalizing uint8 images appropriate to the UFM modelsource_image=torch.from_numpy(source_rgb) # Shape: (H, W, 3)target_image=torch.from_numpy(target_rgb) # Shape: (H, W, 3)# Predict correspondenceswithtorch.no_grad():
result=model.predict_correspondences_batched(
source_image=source_image,
target_image=target_image,
)
flow=result.flow.flow_output[0].cpu().numpy()
covisibility=result.covisibility.mask[0].cpu().numpy()

Interactive Demo

Online Demo

Try our online demo without installation: 🤗 Hugging Face Demo

Local Gradio Demo

Run the interactive Gradio demo locally to visualize UFM outputs:

# Using the CLI (recommended)
ufm demo
# Or run directly
python gradio_demo.py
# Advanced options
ufm demo --port 8080 --share --model refine

License

This code is licensed under a fully open-source BSD-3-Clause license. The pre-trained UFM model checkpoints inherit the licenses of the underlying training datasets and as result, may not be used for commercial purposes (CC BY-NC-SA 4.0). Please refer to the respective training dataset licenses for more details.

Based on community interest, we can look into releasing an Apache 2.0 licensed version of the model in the future. Please upvote the issue here if you would like to see this happen.

Acknowledgements

We thank the folowing projects for their open-source code: DUSt3R, MASt3R, RoMA, and DINOv2.

Citation

If you find our repository useful, please consider giving it a star ⭐ and citing our paper in your work:

@inproceedings{zhang2025ufm,
title={UFM: A Simple Path towards Unified Dense Correspondence with Flow},
author={Zhang, Yuchen and Keetha, Nikhil and Lyu, Chenwei and Jhamb, Bhuvan and Chen, Yutian and Qiu, Yuheng and Karhade, Jay and Jha, Shreyas and Hu, Yaoyu and Ramanan, Deva and Scherer, Sebastian and Wang, Wenshan},
booktitle={arXiV},
year={2025}
}

About

UFM: A Unified Dense Image Correspondence Estimator for both Optical Flow & Wide Baseline Matching Tasks. Matches any pair of images. (NeurIPS 2025)

Topics

Resources

Stars

350 stars

Watchers

12 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

UFM: A Simple Path towards Unified Dense Correspondence with Flow

PaperarXivProject Page

Carnegie Mellon University

Yuchen Zhang, Nikhil Keetha, Chenwei Lyu, Bhuvan Jhamb, Yutian Chen, Yuheng Qiu, Jay Karhade, Shreyas Jha, Yaoyu Hu, Deva Ramanan, Sebastian Scherer, Wenshan Wang

example
UFM unifies the tasks of Optical Flow Estimation and Wide Baseline Matching and provides accurate dense correspondences for in-the-wild images at significantly fast inference speeds.

Updates

  • [2026/04/03] UFM-G version initialized from DINOv2-G weights. More robust and accurate!
  • [2026/02/20] Smaller UFM initialized from DINOv2 weights, faster at similar performance.
  • [2025/10/21] Complete training and most data processing scripts. (branch: train)
  • [2025/10/20] Benchmark & data script for primary results. (branch: benchmark)
  • [2025/10/08] Released 980 resolution models.
  • [2025/06/10] Initial release of model checkpoint and inference code.

Stay Tuned for the Upcoming Updates!

  • UFM-Tiny for real-time applications such as robotics.

Models

CheckpointTypical Runtime (ms, RTX 5090)ParametersHuggingFace
UFM-Base330.4Binfinity1096/UFM-Base
UFM-Refine440.4Binfinity1096/UFM-Refine
UFM-Base-980770.4Binfinity1096/UFM-Base-980
UFM-Refine-980960.4Binfinity1096/UFM-Refine-980
UFM-Base-DINOv2L-init280.3Binfinity1096/UFM-Base-DINOv2L-init
UFM-Base-DINOv2G-init551Binfinity1096/UFM-Base-DINOv2G-init

Overview

UFM (Unified Flow & Matching, UniFlowMatch) is a simple, end-to-end trained transformer model that directly regresses pixel displacement images (flow) and can be applied concurrently to both optical flow and wide-baseline matching tasks.

Quick Start

Installation

We use UniCeption, a library which contains modular, config-swappable components for assembling end-to-end networks. To install UFM, recursively clone this repository and install the package with all dependencies:

git clone --recursive https://github.com/UniFlowMatch/UFM.git
cd UFM
# In case you cloned without --recursive:# git submodule update --init# Create and activate conda environment
conda create -n ufm python=3.11 -y
conda activate ufm
# Install UniCeption dependencycd UniCeption
pip install -e .cd ..
# Install UFM with all dependencies
pip install -e .# Optional: Install with specific extras# pip install -e ".[dev]" # For development# pip install -e ".[demo]" # For demo# pip install -e ".[all]" # All optional dependencies# Optional: For development and linting
pre-commit install # Install pre-commit hooks

Verify Installation

Verify your installation by running the basic model test:

# Test installation
ufm test# Or run the basic model test
python uniflowmatch/models/ufm.py

Verify that ufm_output.png looks like examples/example_ufm_output.png.

Command Line Interface

UFM provides a convenient CLI for common tasks:

# Test installation
ufm test# Launch interactive demo
ufm demo
# Launch demo with specific settings
ufm demo --port 8080 --share --model refine
# Run inference on image pair
ufm infer source.jpg target.jpg --output results/
# Run inference with refinement model
ufm infer img1.png img2.png --model refine --output ./output

Python API

importcv2importtorch# Load the base model (for general use)fromuniflowmatch.models.ufmimportUniFlowMatchConfidencemodel=UniFlowMatchConfidence.from_pretrained("infinity1096/UFM-Base")
# Or load the refinement model (for higher accuracy)fromuniflowmatch.models.ufmimportUniFlowMatchClassificationRefinementmodel=UniFlowMatchClassificationRefinement.from_pretrained("infinity1096/UFM-Refine")
# Choose from# UFM-Base, UFM-Refine, UFM-Base-980, UFM-Refine-980, UFM-Base-DINOv2L-init, UFM-Base-DINOv2G-init# Set the model to evaluation modemodel.eval()
# Load images using cv2 or PILsource_image=cv2.imread("path/to/source.jpg")
target_image=cv2.imread("path/to/target.jpg")
source_rgb=cv2.cvtColor(source_image, cv2.COLOR_BGR2RGB) # Convert to RGBtarget_rgb=cv2.cvtColor(target_image, cv2.COLOR_BGR2RGB) # Convert to RGB# Convert to torch tensors (uint8 or float32)# Forward call takes care of normalizing uint8 images appropriate to the UFM modelsource_image=torch.from_numpy(source_rgb) # Shape: (H, W, 3)target_image=torch.from_numpy(target_rgb) # Shape: (H, W, 3)# Predict correspondenceswithtorch.no_grad():
result=model.predict_correspondences_batched(
source_image=source_image,
target_image=target_image,
)
flow=result.flow.flow_output[0].cpu().numpy()
covisibility=result.covisibility.mask[0].cpu().numpy()

Interactive Demo

Online Demo

Try our online demo without installation: 🤗 Hugging Face Demo

Local Gradio Demo

Run the interactive Gradio demo locally to visualize UFM outputs:

# Using the CLI (recommended)
ufm demo
# Or run directly
python gradio_demo.py
# Advanced options
ufm demo --port 8080 --share --model refine

License

This code is licensed under a fully open-source BSD-3-Clause license. The pre-trained UFM model checkpoints inherit the licenses of the underlying training datasets and as result, may not be used for commercial purposes (CC BY-NC-SA 4.0). Please refer to the respective training dataset licenses for more details.

Based on community interest, we can look into releasing an Apache 2.0 licensed version of the model in the future. Please upvote the issue here if you would like to see this happen.

Acknowledgements

We thank the folowing projects for their open-source code: DUSt3R, MASt3R, RoMA, and DINOv2.

Citation

If you find our repository useful, please consider giving it a star ⭐ and citing our paper in your work:

@inproceedings{zhang2025ufm,
title={UFM: A Simple Path towards Unified Dense Correspondence with Flow},
author={Zhang, Yuchen and Keetha, Nikhil and Lyu, Chenwei and Jhamb, Bhuvan and Chen, Yutian and Qiu, Yuheng and Karhade, Jay and Jha, Shreyas and Hu, Yaoyu and Ramanan, Deva and Scherer, Sebastian and Wang, Wenshan},
booktitle={arXiV},
year={2025}
}

About

UFM: A Unified Dense Image Correspondence Estimator for both Optical Flow & Wide Baseline Matching Tasks. Matches any pair of images. (NeurIPS 2025)

Topics

Resources

Stars

350 stars

Watchers

12 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

UFM: A Simple Path towards Unified Dense Correspondence with Flow

PaperarXivProject Page

Carnegie Mellon University

Yuchen Zhang, Nikhil Keetha, Chenwei Lyu, Bhuvan Jhamb, Yutian Chen, Yuheng Qiu, Jay Karhade, Shreyas Jha, Yaoyu Hu, Deva Ramanan, Sebastian Scherer, Wenshan Wang

example
UFM unifies the tasks of Optical Flow Estimation and Wide Baseline Matching and provides accurate dense correspondences for in-the-wild images at significantly fast inference speeds.

Updates

  • [2026/04/03] UFM-G version initialized from DINOv2-G weights. More robust and accurate!
  • [2026/02/20] Smaller UFM initialized from DINOv2 weights, faster at similar performance.
  • [2025/10/21] Complete training and most data processing scripts. (branch: train)
  • [2025/10/20] Benchmark & data script for primary results. (branch: benchmark)
  • [2025/10/08] Released 980 resolution models.
  • [2025/06/10] Initial release of model checkpoint and inference code.

Stay Tuned for the Upcoming Updates!

  • UFM-Tiny for real-time applications such as robotics.

Models

CheckpointTypical Runtime (ms, RTX 5090)ParametersHuggingFace
UFM-Base330.4Binfinity1096/UFM-Base
UFM-Refine440.4Binfinity1096/UFM-Refine
UFM-Base-980770.4Binfinity1096/UFM-Base-980
UFM-Refine-980960.4Binfinity1096/UFM-Refine-980
UFM-Base-DINOv2L-init280.3Binfinity1096/UFM-Base-DINOv2L-init
UFM-Base-DINOv2G-init551Binfinity1096/UFM-Base-DINOv2G-init

Overview

UFM (Unified Flow & Matching, UniFlowMatch) is a simple, end-to-end trained transformer model that directly regresses pixel displacement images (flow) and can be applied concurrently to both optical flow and wide-baseline matching tasks.

Quick Start

Installation

We use UniCeption, a library which contains modular, config-swappable components for assembling end-to-end networks. To install UFM, recursively clone this repository and install the package with all dependencies:

git clone --recursive https://github.com/UniFlowMatch/UFM.git
cd UFM
# In case you cloned without --recursive:# git submodule update --init# Create and activate conda environment
conda create -n ufm python=3.11 -y
conda activate ufm
# Install UniCeption dependencycd UniCeption
pip install -e .cd ..
# Install UFM with all dependencies
pip install -e .# Optional: Install with specific extras# pip install -e ".[dev]" # For development# pip install -e ".[demo]" # For demo# pip install -e ".[all]" # All optional dependencies# Optional: For development and linting
pre-commit install # Install pre-commit hooks

Verify Installation

Verify your installation by running the basic model test:

# Test installation
ufm test# Or run the basic model test
python uniflowmatch/models/ufm.py

Verify that ufm_output.png looks like examples/example_ufm_output.png.

Command Line Interface

UFM provides a convenient CLI for common tasks:

# Test installation
ufm test# Launch interactive demo
ufm demo
# Launch demo with specific settings
ufm demo --port 8080 --share --model refine
# Run inference on image pair
ufm infer source.jpg target.jpg --output results/
# Run inference with refinement model
ufm infer img1.png img2.png --model refine --output ./output

Python API

importcv2importtorch# Load the base model (for general use)fromuniflowmatch.models.ufmimportUniFlowMatchConfidencemodel=UniFlowMatchConfidence.from_pretrained("infinity1096/UFM-Base")
# Or load the refinement model (for higher accuracy)fromuniflowmatch.models.ufmimportUniFlowMatchClassificationRefinementmodel=UniFlowMatchClassificationRefinement.from_pretrained("infinity1096/UFM-Refine")
# Choose from# UFM-Base, UFM-Refine, UFM-Base-980, UFM-Refine-980, UFM-Base-DINOv2L-init, UFM-Base-DINOv2G-init# Set the model to evaluation modemodel.eval()
# Load images using cv2 or PILsource_image=cv2.imread("path/to/source.jpg")
target_image=cv2.imread("path/to/target.jpg")
source_rgb=cv2.cvtColor(source_image, cv2.COLOR_BGR2RGB) # Convert to RGBtarget_rgb=cv2.cvtColor(target_image, cv2.COLOR_BGR2RGB) # Convert to RGB# Convert to torch tensors (uint8 or float32)# Forward call takes care of normalizing uint8 images appropriate to the UFM modelsource_image=torch.from_numpy(source_rgb) # Shape: (H, W, 3)target_image=torch.from_numpy(target_rgb) # Shape: (H, W, 3)# Predict correspondenceswithtorch.no_grad():
result=model.predict_correspondences_batched(
source_image=source_image,
target_image=target_image,
)
flow=result.flow.flow_output[0].cpu().numpy()
covisibility=result.covisibility.mask[0].cpu().numpy()

Interactive Demo

Online Demo

Try our online demo without installation: 🤗 Hugging Face Demo

Local Gradio Demo

Run the interactive Gradio demo locally to visualize UFM outputs:

# Using the CLI (recommended)
ufm demo
# Or run directly
python gradio_demo.py
# Advanced options
ufm demo --port 8080 --share --model refine

License

This code is licensed under a fully open-source BSD-3-Clause license. The pre-trained UFM model checkpoints inherit the licenses of the underlying training datasets and as result, may not be used for commercial purposes (CC BY-NC-SA 4.0). Please refer to the respective training dataset licenses for more details.

Based on community interest, we can look into releasing an Apache 2.0 licensed version of the model in the future. Please upvote the issue here if you would like to see this happen.

Acknowledgements

We thank the folowing projects for their open-source code: DUSt3R, MASt3R, RoMA, and DINOv2.

Citation

If you find our repository useful, please consider giving it a star ⭐ and citing our paper in your work:

@inproceedings{zhang2025ufm,
title={UFM: A Simple Path towards Unified Dense Correspondence with Flow},
author={Zhang, Yuchen and Keetha, Nikhil and Lyu, Chenwei and Jhamb, Bhuvan and Chen, Yutian and Qiu, Yuheng and Karhade, Jay and Jha, Shreyas and Hu, Yaoyu and Ramanan, Deva and Scherer, Sebastian and Wang, Wenshan},
booktitle={arXiV},
year={2025}
}

About

UFM: A Unified Dense Image Correspondence Estimator for both Optical Flow & Wide Baseline Matching Tasks. Matches any pair of images. (NeurIPS 2025)

Topics

Resources

Stars

350 stars

Watchers

12 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

UFM: A Simple Path towards Unified Dense Correspondence with Flow

PaperarXivProject Page

Carnegie Mellon University

Yuchen Zhang, Nikhil Keetha, Chenwei Lyu, Bhuvan Jhamb, Yutian Chen, Yuheng Qiu, Jay Karhade, Shreyas Jha, Yaoyu Hu, Deva Ramanan, Sebastian Scherer, Wenshan Wang

example
UFM unifies the tasks of Optical Flow Estimation and Wide Baseline Matching and provides accurate dense correspondences for in-the-wild images at significantly fast inference speeds.

Updates

  • [2026/04/03] UFM-G version initialized from DINOv2-G weights. More robust and accurate!
  • [2026/02/20] Smaller UFM initialized from DINOv2 weights, faster at similar performance.
  • [2025/10/21] Complete training and most data processing scripts. (branch: train)
  • [2025/10/20] Benchmark & data script for primary results. (branch: benchmark)
  • [2025/10/08] Released 980 resolution models.
  • [2025/06/10] Initial release of model checkpoint and inference code.

Stay Tuned for the Upcoming Updates!

  • UFM-Tiny for real-time applications such as robotics.

Models

CheckpointTypical Runtime (ms, RTX 5090)ParametersHuggingFace
UFM-Base330.4Binfinity1096/UFM-Base
UFM-Refine440.4Binfinity1096/UFM-Refine
UFM-Base-980770.4Binfinity1096/UFM-Base-980
UFM-Refine-980960.4Binfinity1096/UFM-Refine-980
UFM-Base-DINOv2L-init280.3Binfinity1096/UFM-Base-DINOv2L-init
UFM-Base-DINOv2G-init551Binfinity1096/UFM-Base-DINOv2G-init

Overview

UFM (Unified Flow & Matching, UniFlowMatch) is a simple, end-to-end trained transformer model that directly regresses pixel displacement images (flow) and can be applied concurrently to both optical flow and wide-baseline matching tasks.

Quick Start

Installation

We use UniCeption, a library which contains modular, config-swappable components for assembling end-to-end networks. To install UFM, recursively clone this repository and install the package with all dependencies:

git clone --recursive https://github.com/UniFlowMatch/UFM.git
cd UFM
# In case you cloned without --recursive:# git submodule update --init# Create and activate conda environment
conda create -n ufm python=3.11 -y
conda activate ufm
# Install UniCeption dependencycd UniCeption
pip install -e .cd ..
# Install UFM with all dependencies
pip install -e .# Optional: Install with specific extras# pip install -e ".[dev]" # For development# pip install -e ".[demo]" # For demo# pip install -e ".[all]" # All optional dependencies# Optional: For development and linting
pre-commit install # Install pre-commit hooks

Verify Installation

Verify your installation by running the basic model test:

# Test installation
ufm test# Or run the basic model test
python uniflowmatch/models/ufm.py

Verify that ufm_output.png looks like examples/example_ufm_output.png.

Command Line Interface

UFM provides a convenient CLI for common tasks:

# Test installation
ufm test# Launch interactive demo
ufm demo
# Launch demo with specific settings
ufm demo --port 8080 --share --model refine
# Run inference on image pair
ufm infer source.jpg target.jpg --output results/
# Run inference with refinement model
ufm infer img1.png img2.png --model refine --output ./output

Python API

importcv2importtorch# Load the base model (for general use)fromuniflowmatch.models.ufmimportUniFlowMatchConfidencemodel=UniFlowMatchConfidence.from_pretrained("infinity1096/UFM-Base")
# Or load the refinement model (for higher accuracy)fromuniflowmatch.models.ufmimportUniFlowMatchClassificationRefinementmodel=UniFlowMatchClassificationRefinement.from_pretrained("infinity1096/UFM-Refine")
# Choose from# UFM-Base, UFM-Refine, UFM-Base-980, UFM-Refine-980, UFM-Base-DINOv2L-init, UFM-Base-DINOv2G-init# Set the model to evaluation modemodel.eval()
# Load images using cv2 or PILsource_image=cv2.imread("path/to/source.jpg")
target_image=cv2.imread("path/to/target.jpg")
source_rgb=cv2.cvtColor(source_image, cv2.COLOR_BGR2RGB) # Convert to RGBtarget_rgb=cv2.cvtColor(target_image, cv2.COLOR_BGR2RGB) # Convert to RGB# Convert to torch tensors (uint8 or float32)# Forward call takes care of normalizing uint8 images appropriate to the UFM modelsource_image=torch.from_numpy(source_rgb) # Shape: (H, W, 3)target_image=torch.from_numpy(target_rgb) # Shape: (H, W, 3)# Predict correspondenceswithtorch.no_grad():
result=model.predict_correspondences_batched(
source_image=source_image,
target_image=target_image,
)
flow=result.flow.flow_output[0].cpu().numpy()
covisibility=result.covisibility.mask[0].cpu().numpy()

Interactive Demo

Online Demo

Try our online demo without installation: 🤗 Hugging Face Demo

Local Gradio Demo

Run the interactive Gradio demo locally to visualize UFM outputs:

# Using the CLI (recommended)
ufm demo
# Or run directly
python gradio_demo.py
# Advanced options
ufm demo --port 8080 --share --model refine

License

This code is licensed under a fully open-source BSD-3-Clause license. The pre-trained UFM model checkpoints inherit the licenses of the underlying training datasets and as result, may not be used for commercial purposes (CC BY-NC-SA 4.0). Please refer to the respective training dataset licenses for more details.

Based on community interest, we can look into releasing an Apache 2.0 licensed version of the model in the future. Please upvote the issue here if you would like to see this happen.

Acknowledgements

We thank the folowing projects for their open-source code: DUSt3R, MASt3R, RoMA, and DINOv2.

Citation

If you find our repository useful, please consider giving it a star ⭐ and citing our paper in your work:

@inproceedings{zhang2025ufm,
title={UFM: A Simple Path towards Unified Dense Correspondence with Flow},
author={Zhang, Yuchen and Keetha, Nikhil and Lyu, Chenwei and Jhamb, Bhuvan and Chen, Yutian and Qiu, Yuheng and Karhade, Jay and Jha, Shreyas and Hu, Yaoyu and Ramanan, Deva and Scherer, Sebastian and Wang, Wenshan},
booktitle={arXiV},
year={2025}
}

About

UFM: A Unified Dense Image Correspondence Estimator for both Optical Flow & Wide Baseline Matching Tasks. Matches any pair of images. (NeurIPS 2025)

Topics

Resources

Stars

350 stars

Watchers

12 watching

Forks

Releases

Packages

Contributors

Languages