Skip to main content

NAPA

NAPA is a fast AprilTag detector that skips most of the pixels in each frame. Give it a greyscale frame and it returns tag IDs and sub-pixel corners, plus poses with covariances if you give it a camera calibration. It reads every AprilTag family, with tag36h11, the FRC family, as the default.

python -m pip install napa-vision

Compared with AprilTag

These results compare NAPA with upstream AprilTag 3 at decimate 2 (WPILib's default) and decimate 1 (full resolution, PhotonVision's default). The benchmark is 3,000 rendered frames holding 5,521 tags, each with exact ground truth, and every detector ran single-threaded on the same CPU core.

AprilTag, decimate 2 AprilTag, decimate 1 NAPA
Tags found 86.2% 99.4% 99.8%
Smallest tag found every time (range test) 80 px 36 px 22 px
Median error of a tag's worst corner 0.099 px 0.098 px 0.021 px
Wrong IDs in 3,000 frames 0 3 1

NAPA was faster than both on every frame:

Resolution vs. decimate 2, median (slowest frame) vs. decimate 1, median (slowest frame)
640×480 13× (3.6×) 62× (12×)
1280×720 30× (4.2×) 142× (14×)
1920×1080 60× (4.5×) 273× (13×)
All frames 19× (3.6×) 87× (12×)

Range scales with the inverse of the smallest tag found, so on the same camera NAPA sees about 3.6× as far as decimate 2 and 1.6× as far as decimate 1.

NAPA's one wrong ID was a tag-shaped decoy whose random pattern fell within 2 bits of a real code. On tag16h5, the 2023 FRC family, AprilTag at its default two-bit correction reported 581 wrong IDs in the family benchmark, and NAPA reported none.

The frames are synthetic. To check NAPA on your own camera, score it on your own footage. The benchmark guide has the results for every scene, resolution, and tag family.

How it works

NAPA finds likely tags on a sparse grid of pixels and only does full-resolution work on the tags themselves. How NAPA works explains each step.

Quick start

Requires Python 3.11 or newer.

from napa_vision import NapaDetector

detector = NapaDetector()
for tag in detector.detect(image):  # uint8 greyscale, BGR, or BGRA
    print(tag.tag_id, tag.corners)

Code written for pupil_apriltags or dt-apriltags works after changing one import:

from napa_vision.compat import Detector  # was: from pupil_apriltags import Detector

For poses, install OpenCV with the headless extra and give NAPA a calibration:

python -m pip install "napa-vision[headless]"
from napa_vision import VisionProcessor, load_calibration_data

processor = VisionProcessor(calibration=load_calibration_data("camera.json"), tag_size_m=0.1651)
result = processor.process(frame, timestamp=capture_time)

Documentation

Command-line tools

Command Purpose
napa-tag Write tags to print: SVG at an exact printed size, or PNG
napa-calibrate Measure camera intrinsics from checkerboard photographs
napa-benchmark Score NAPA on your own labeled images, with optional recall, precision, and latency gates

License

Copyright © 2026 Zachary Wilson. NAPA is free for noncommercial use under the PolyForm Noncommercial License 1.0.0: personal projects, research, education, student robotics teams, and other noncommercial organizations can use, modify, and share it. Copies, forks, and works based on NAPA must include the license and its notices crediting Zachary Wilson. Commercial use, including selling NAPA or products built on it, needs a separate license. Ask through the repository.

The tag families' codewords come from AprilTag under its BSD license. See THIRD_PARTY_NOTICES.

Metadata

Release files for napa-vision 0.4.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for napa-vision 0.4.3
File Size Uploaded Provenance Actions
napa_vision-0.4.3.tar.gz 1.5 MB With provenance Details for napa_vision-0.4.3.tar.gz

Built distributions (wheels)

Table of built distributions (wheels) for napa-vision 0.4.3
File Actions
napa_vision-0.4.3-py3-none-win_amd64.whl Python 3 none Windows x86-64 Details for napa_vision-0.4.3-py3-none-win_amd64.whl
napa_vision-0.4.3-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl Python 3 none Linux glibc 2.17+ x86-64, Linux glibc 2.28+ x86-64 Details for napa_vision-0.4.3-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
napa_vision-0.4.3-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl Python 3 none Linux glibc 2.28+ ARM64, Linux glibc 2.17+ ARM64 Details for napa_vision-0.4.3-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
napa_vision-0.4.3-py3-none-macosx_11_0_arm64.whl Python 3 none macOS 11.0+ ARM64 Details for napa_vision-0.4.3-py3-none-macosx_11_0_arm64.whl
napa_vision-0.4.3-py3-none-macosx_10_9_x86_64.whl Python 3 none macOS 10.9+ x86-64 Details for napa_vision-0.4.3-py3-none-macosx_10_9_x86_64.whl
napa_vision-0.4.3-py3-none-android_24_x86_64.whl Python 3 none Android API level 24+ x86-64 Details for napa_vision-0.4.3-py3-none-android_24_x86_64.whl
napa_vision-0.4.3-py3-none-android_24_arm64_v8a.whl Python 3 none Android API level 24+ ARM64 v8a Details for napa_vision-0.4.3-py3-none-android_24_arm64_v8a.whl

Total release size: 10.4 MB

Release files / napa_vision-0.4.3.tar.gz

Download URL napa_vision-0.4.3.tar.gz
Size 1.5 MB
Tags Source
SHA-256 checksum
How to use checksums
1a88af1d8cb1156bbbe1b2ed4c5d2c731a28705eb6ef5f76ba902fe87b58b8bc
BLAKE2b-256 checksum
How to use checksums
2b14cb973726ab7f423a8e776fb7473ec034a2a166fd76049182f4df1e12e951
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 29, 2026.

Transparency log

Release files / napa_vision-0.4.3-py3-none-win_amd64.whl

Download URL napa_vision-0.4.3-py3-none-win_amd64.whl
Size 1.3 MB
Tags Python 3 Windows x86-64
SHA-256 checksum
How to use checksums
b890adb7e24143605be9d3d54d19a9a79a90590bc40bfe5cb26d5f9bbde7da8c
BLAKE2b-256 checksum
How to use checksums
4363f08b5b39fc679553fb1dbd0a3e63f05f0bdcb47b88a0eb4ebd078728f418
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 29, 2026.

Transparency log

Release files / napa_vision-0.4.3-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl

Download URL napa_vision-0.4.3-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Size 1.4 MB
Tags Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64 Python 3
SHA-256 checksum
How to use checksums
321e0aefeb0d191251c7cc23d79156957961c2397077ab731d5b87e43f1d37aa
BLAKE2b-256 checksum
How to use checksums
cfdbd54b8fdc7a0830ad1200605bae63c42a5bcfbe3484572ab3b46a5caf8046
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 29, 2026.

Transparency log

Release files / napa_vision-0.4.3-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl

Download URL napa_vision-0.4.3-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Size 1.4 MB
Tags Linux glibc 2.17+ ARM64 Linux glibc 2.28+ ARM64 Python 3
SHA-256 checksum
How to use checksums
262f5f5b7cacd602c221590eb66269e860487e3414d40f60d75b5112dd6c0312
BLAKE2b-256 checksum
How to use checksums
164f5a01b28b67d610626db451c4b345e24954f4a0a16e54ba204da7a47dbcff
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 29, 2026.

Transparency log

Release files / napa_vision-0.4.3-py3-none-macosx_11_0_arm64.whl

Download URL napa_vision-0.4.3-py3-none-macosx_11_0_arm64.whl
Size 1.2 MB
Tags Python 3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
1c0da31e7fefb4f5d754e97a0a158ec6b099eca107893bc6db198ca133235298
BLAKE2b-256 checksum
How to use checksums
53eed1e2f5be882992f1b7ae74246340dfe6e68e611b9042d84e62acdbe9d42c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 29, 2026.

Transparency log

Release files / napa_vision-0.4.3-py3-none-macosx_10_9_x86_64.whl

Download URL napa_vision-0.4.3-py3-none-macosx_10_9_x86_64.whl
Size 1.2 MB
Tags Python 3 macOS 10.9+ x86-64
SHA-256 checksum
How to use checksums
1db2940c3ef4f74551a8062522c2b3df419108c8566d02286014712b66ffb7c8
BLAKE2b-256 checksum
How to use checksums
34d8db3ddcfd1f6e1dcf4b62339627740faa8e0b8b779beabd44608a4193b12a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 29, 2026.

Transparency log

Release files / napa_vision-0.4.3-py3-none-android_24_x86_64.whl

Download URL napa_vision-0.4.3-py3-none-android_24_x86_64.whl
Size 1.2 MB
Tags Android API level 24+ x86-64 Python 3
SHA-256 checksum
How to use checksums
6ce554eb0e0649a6e25f9a7fd190b6f4a007cd59d62559f9406881f056c3feb0
BLAKE2b-256 checksum
How to use checksums
81e9fc3d20301e39fd0d92525d3f0cebcb85bff2131f067453858a22b5acccc1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 29, 2026.

Transparency log

Release files / napa_vision-0.4.3-py3-none-android_24_arm64_v8a.whl

Download URL napa_vision-0.4.3-py3-none-android_24_arm64_v8a.whl
Size 1.2 MB
Tags Android API level 24+ ARM64 v8a Python 3
SHA-256 checksum
How to use checksums
d64e02d66309e3892acd8bebf3b1665eef7ce5e86a73fd093ed8b8bb7f3b1ca5
BLAKE2b-256 checksum
How to use checksums
5ba5296399584a842dd5941854337773b21c959122a69c14f4dbe8964bf80b22
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 29, 2026.

Transparency log

Security for napa-vision 0.4.3

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 8 files in this release have been uploaded with provenance metadata.

Select from 8 files

Attestation for napa_vision-0.4.3.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 29, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

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