A high-performance fiducial marker detector for robotics.
Project description
locus-tag
Locus is a high-performance fiducial marker detector (AprilTag & ArUco) written in Rust with zero-copy Python bindings. Designed for robotics and autonomous systems, it aims to balance low latency, high recall, and sub-pixel precision.
[!WARNING] Experimental Status: Locus is currently an experimental project. The API is subject to breaking changes. While performance exceeds alternatives on ICRA2020, it is not recommended for production systems. Photo-realistic benchmarks are being developed under render-tag.
Key Features
- High-Performance Core: Written in Rust (2024 Edition) with a focus on Data-Oriented Design.
- Encapsulated Facade: Simple, ergonomic
DetectorAPI that manages complex memory lifetimes (arenas, SoA batches) internally. - Runtime SIMD Dispatch: Automatically utilizes AVX2, AVX-512, or NEON based on host CPU capabilities.
- Vectorized Python API: Returns detection results as a single
DetectionBatchobject containing parallel NumPy arrays for maximum throughput. - GIL-Free Execution: Releases the Python Global Interpreter Lock (GIL) during detection to enable true multi-threaded applications.
- Memory Efficient: Uses
bumpaloarena allocation to achieve zero heap allocations in the detection hot-path. - Advanced Pose Estimation: High-precision 6-DOF recovery using IPPE-Square or weighted Levenberg-Marquardt with corner uncertainty modeling.
- Visual Debugging: Native integration with the Rerun SDK for real-time pipeline inspection.
Performance (ICRA 2020 Dataset)
Evaluated on the standard ICRA 2020 benchmark (50 images). Latency measured on a modern desktop CPU.
| Detector | Recall | RMSE | Latency (1080p avg) |
|---|---|---|---|
| Locus (Soft) | 96.23% | 0.31 px | 87.2 ms |
| Locus (Hard) | 76.84% | 0.27 px | 67.8 ms |
| AprilTag 3 | 62.34% | 0.22 px | 105.9 ms |
| OpenCV | 33.16% | 0.92 px | 108.2 ms |
Note: Locus utilizes a Structure of Arrays (SoA) layout to achieve ~3.8x speedup over previous versions in dense tag environments.
Quick Start
Installation
pip install locus-tag
For development, build from source using uv:
git clone https://github.com/NoeFontana/locus-tag
cd locus-tag
uv run maturin develop -r
Basic Usage
The simplest way to detect tags using default settings:
import cv2
import locus
# Load image in grayscale
img = cv2.imread("image.jpg", cv2.IMREAD_GRAYSCALE)
# Create detector and detect tags (defaults to AprilTag 36h11)
detector = locus.Detector()
batch = detector.detect(img)
# batch is a vectorized DetectionBatch object
for i in range(len(batch)):
print(f"ID: {batch.ids[i]}, Center: {batch.centers[i]}")
Advanced Configuration
Use semantic keyword arguments for fine-grained control and performance tuning:
from locus import Detector, TagFamily, DecodeMode
# Configure for maximum recall on small, blurry tags
detector = Detector(
decode_mode=DecodeMode.Soft,
upscale_factor=2,
families=[TagFamily.AprilTag36h11, TagFamily.ArUco4x4_50]
)
batch = detector.detect(img)
3D Pose Estimation
Recover the 6-DOF transformation between the camera and the tag:
from locus import CameraIntrinsics, PoseEstimationMode
# Camera parameters (fx, fy, cx, cy)
intrinsics = CameraIntrinsics(fx=800.0, fy=800.0, cx=640.0, cy=360.0)
# Pass intrinsics and physical tag size (meters)
batch = detector.detect(
img,
intrinsics=intrinsics,
tag_size=0.10,
pose_estimation_mode=PoseEstimationMode.Accurate
)
if batch.poses is not None:
# batch.poses is (N, 7) array: [tx, ty, tz, qx, qy, qz, qw]
print(f"First tag translation: {batch.poses[0, :3]}")
print(f"First tag quaternion: {batch.poses[0, 3:]}")
Visual Debugging with Rerun
Locus provides a powerful visualization tool to inspect every stage of the pipeline (thresholding, segmentation, quad candidates, bit grids).
# Run the visualizer on a dataset using the dev/bench dependency groups
uv run --group dev --group bench tools/cli.py visualize --scenario forward --limit 5
Development & Benchmarking
Locus includes a rigorous suite to ensure detection quality and latency targets.
# Prepare local datasets
uv run --group dev --group bench tools/cli.py bench prepare
# Run full evaluation suite and compare with competitors
uv run --group dev --group bench tools/cli.py bench real --compare
Detailed documentation for profiling, architecture, and coordinate systems is available in the Docs Site.
License
Dual-licensed under Apache 2.0 or MIT.
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 Distributions
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 locus_tag-0.2.5.tar.gz.
File metadata
- Download URL: locus_tag-0.2.5.tar.gz
- Upload date:
- Size: 192.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.10.10 {"installer":{"name":"uv","version":"0.10.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3d681dd17494eb91b412ea6d762385fdae866dcaebbfd5e0f3138a118625acf6
|
|
| MD5 |
45a91af5f5295764bca58634914b7e5f
|
|
| BLAKE2b-256 |
d8cd447d338fbc5e0d29c3e7950aede6f407fd929b7116551430a92d0a2bc640
|
File details
Details for the file locus_tag-0.2.5-cp310-abi3-manylinux_2_28_x86_64.whl.
File metadata
- Download URL: locus_tag-0.2.5-cp310-abi3-manylinux_2_28_x86_64.whl
- Upload date:
- Size: 495.9 kB
- Tags: CPython 3.10+, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: maturin/1.12.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dc4f4a36c75c869b2476aeaea4eb5f67f8fa10dfa8c94fcf8a489139ea1eb582
|
|
| MD5 |
c59abef0c9ae52331f45bdfaa3f5d8c1
|
|
| BLAKE2b-256 |
491f03a940f8e1d75d575d6cbc344ed24d5ac180f7e91831a0e857da215a3c77
|
File details
Details for the file locus_tag-0.2.5-cp310-abi3-manylinux_2_28_aarch64.whl.
File metadata
- Download URL: locus_tag-0.2.5-cp310-abi3-manylinux_2_28_aarch64.whl
- Upload date:
- Size: 443.8 kB
- Tags: CPython 3.10+, manylinux: glibc 2.28+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: maturin/1.12.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ecb3dc1a892113dbf08298fca6c00aaf5dde07bf43918b1418495bbf29322999
|
|
| MD5 |
290ded5fca7086c717d7738210d8fafb
|
|
| BLAKE2b-256 |
217508ce48fd88d4029dde6d00856426866a24a0528049b87be50d369b691545
|