Skip to main content

NAPA

Not Another Pixel Algorithm: NAPA skips most of the pixels in each frame.

NAPA is a fast AprilTag detector. 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.2

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.2
File Size Uploaded Provenance Actions
napa_vision-0.4.2.tar.gz 1.5 MB With provenance Details for napa_vision-0.4.2.tar.gz

Built distributions (wheels)

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

Total release size: 10.4 MB

Release files / napa_vision-0.4.2.tar.gz

Download URL napa_vision-0.4.2.tar.gz
Size 1.5 MB
Tags Source
SHA-256 checksum
How to use checksums
38f1e665a846882396b1de59e862610dc1b9982c66274f75541876ab070a199f
BLAKE2b-256 checksum
How to use checksums
d48297f7f445f89aef1ac835b980af764a1aebf1e3c9050ad5f3793d1f899159
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.2-py3-none-win_amd64.whl

Download URL napa_vision-0.4.2-py3-none-win_amd64.whl
Size 1.3 MB
Tags Python 3 Windows x86-64
SHA-256 checksum
How to use checksums
6a0ff6c4287ab07a411760dddd0b9db89fa38265fbe5b0238f53855a3ea7cdf2
BLAKE2b-256 checksum
How to use checksums
8509789b41c4e755f725b9f26eca9ecde513dd7850bcd09d66a89cba64c5d449
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.2-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl

Download URL napa_vision-0.4.2-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
260bf76db403c01a4a4e50ce9b55137432cb0c8024021d6cc5959e0d2a8259e4
BLAKE2b-256 checksum
How to use checksums
b9eb6068dee4d25d9a73425c7a4d91a21b5b6bfce477e4298a925f367598a6db
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.2-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl

Download URL napa_vision-0.4.2-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
aa5d658f8fcf37850c4633c606a3a8b5e0327ff2a6a1e7eee0ee5bd7e4dc2afb
BLAKE2b-256 checksum
How to use checksums
e64d7a73c6a65d6055c5006d11ef5235ef576f5cb941b8d919e899e49ee31018
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.2-py3-none-macosx_11_0_arm64.whl

Download URL napa_vision-0.4.2-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
7f006e8d04436b12d2418796b37533e0ca242e5fc4388936f5f9da4a9c9b3ef5
BLAKE2b-256 checksum
How to use checksums
338c29788f7bb49f7d676c564c6154b7b3efb1c25ed083757532ee6acc14acd6
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.2-py3-none-macosx_10_9_x86_64.whl

Download URL napa_vision-0.4.2-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
717e37d0747bb3e3002ed4ff52d8849b79cee9abf8104e3b7c7041ce2ecd4515
BLAKE2b-256 checksum
How to use checksums
e0dfc1e7fbd06ec546261d581643427fbb41cdab2d1c62ce81846c40882819e4
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.2-py3-none-android_24_x86_64.whl

Download URL napa_vision-0.4.2-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
a69b4ee808319c8ceffcc522fd0ca0e0f466a86f2f38cda2528ebabd1fc97980
BLAKE2b-256 checksum
How to use checksums
90fdd11c36a866af8296d7b7672bcf63c6bb5e171212c08ec3eae3964dc30de0
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.2-py3-none-android_24_arm64_v8a.whl

Download URL napa_vision-0.4.2-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
0be76dc033c2702332f15b37a21f77c62b294fc21423292d1f51e75f7efa200a
BLAKE2b-256 checksum
How to use checksums
55b683876d1df7b4e41522e312d0eb1f04d3dc9fe13294f336efce64fb07da86
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.2

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.2.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