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
- Detection: tuning, tag families, printing tags, and switching from
pupil_apriltags - Poses and filters: metric poses, coordinate frames, and WPILib pose estimators
- Camera calibration
- Stereo rigs: one pose from two calibrated cameras
- Platforms: C and C++, Android and Meta Quest, and building from source
- Measuring on your own footage
- How NAPA works: the pipeline, obstructions, and limits
- API reference: every class, method, and field
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)
| 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)
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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logSecurity 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.
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 logA 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.