Add your description here
Project description
easy-local-features
Unified, minimal wrappers around many local feature extractors and matchers (classical + learned).
⚠️ CRITICAL LICENSE DISCLAIMER
This repository aggregates wrappers around MANY third‑party local feature extractors and matchers. Each baseline/model keeps its OWN original license (BSD, MIT, Apache 2.0, GPLv3, Non‑Commercial, CC BY‑NC‑SA, custom research licenses, etc.). Your rights for a given baseline are governed only by that baseline’s upstream license. Some components here are non‑commercial only (e.g., SuperGlue, original SuperPoint, R2D2) or copyleft (e.g., DISK under GPLv3). Others are permissive (BSD/MIT/Apache 2.0). Before any research publication, internal deployment, redistribution, or commercial/production use, YOU MUST review and comply with every relevant upstream license, including attribution, notice reproduction, share‑alike, copyleft, and patent clauses.
The maintainers provide NO warranty, NO guarantee of license correctness, and accept NO liability for misuse. This notice and any summaries are not legal advice. If in doubt, consult qualified counsel.
See:
LICENSES.mdfor an overview and links to included full license texts. Built with DINOv3.
Installation
pip install easy-local-features
Installing from source
pip install -e .
Usage
Stable minimal API
getExtractor(name, conf)→ returns an extractor.to(device)→"cpu" | "cuda" | "mps".match(img0, img1)→{"mkpts0": (M,2), "mkpts1": (M,2), ...}- Descriptor-only methods additionally support
.addDetector(detector)
Detector-only methods
- Some methods only implement
detect(image) -> keypoints(no descriptors, no matching). UsegetDetector(name, conf)for those.
Example:
from easy_local_features import getDetector
from easy_local_features.utils import io
img = io.fromPath("tests/assets/megadepth0.jpg")
det = getDetector("rekd", {"num_keypoints": 1500}).to("cpu")
kps = det.detect(img) # [1, N, 2]
Discover available config keys (no model init)
In code:
from easy_local_features import describe
print(describe("superpoint"))
On the CLI:
easy-local-features --describe superpoint
Detect+Describe (one-liner matching)
from easy_local_features import getExtractor
from easy_local_features.utils import io, ops, vis
img0 = io.fromPath("tests/assets/megadepth0.jpg")
img1 = io.fromPath("tests/assets/megadepth1.jpg")
img0 = ops.resize_short_edge(img0, 320)[0]
img1 = ops.resize_short_edge(img1, 320)[0]
extractor = getExtractor("aliked", {"top_k": 2048}).to("cpu")
out = extractor.match(img0, img1)
vis.plot_pair(img0, img1, title="ALIKED")
vis.plot_matches(out["mkpts0"], out["mkpts1"])
vis.save("tests/results/aliked.png")
Descriptor-only (attach a detector)
from easy_local_features import getExtractor
from easy_local_features.feature.baseline_superpoint import SuperPoint_baseline
from easy_local_features.utils import io, ops
img0 = ops.resize_short_edge(io.fromPath("tests/assets/megadepth0.jpg"), 320)[0]
img1 = ops.resize_short_edge(io.fromPath("tests/assets/megadepth1.jpg"), 320)[0]
desc = getExtractor("sosnet").to("cpu")
det = SuperPoint_baseline({"top_k": 2048, "detection_threshold": 0.005}).to("cpu")
desc.addDetector(det)
out = desc.match(img0, img1)
End-to-end matchers
from easy_local_features import getExtractor
from easy_local_features.utils import io, ops
img0 = ops.resize_short_edge(io.fromPath("tests/assets/megadepth0.jpg"), 320)[0]
img1 = ops.resize_short_edge(io.fromPath("tests/assets/megadepth1.jpg"), 320)[0]
roma = getExtractor("romav2", {"top_k": 2000}).to("cpu")
out = roma.match(img0, img1)
CLI
easy-local-features --list
easy-local-features --list-detectors
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file easy_local_features-0.8.24.tar.gz.
File metadata
- Download URL: easy_local_features-0.8.24.tar.gz
- Upload date:
- Size: 4.6 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.8.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3e3b86f9466254861645cd25ce81cb304514e57bf74160685c745d4abb2283cb
|
|
| MD5 |
039168fb440c4fea4a6b22d9ffad5517
|
|
| BLAKE2b-256 |
550cac85472765db7d32c2e4b12075a7c3c0c964b13be19112ff74abb1ca634b
|
File details
Details for the file easy_local_features-0.8.24-py3-none-any.whl.
File metadata
- Download URL: easy_local_features-0.8.24-py3-none-any.whl
- Upload date:
- Size: 512.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.8.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b147907a2389e2fe698357d5089d313f0941e107352e736f9fff8f005b343a9c
|
|
| MD5 |
66d9cb07c5a69cffb1ce67e781e33a2f
|
|
| BLAKE2b-256 |
1d8d9101b2a822cce7b336d1ca37f2e5fc7bfeed299a73439165280278605467
|