hotcoco
hotcoco is a perception evaluation toolkit, written in Rust with Python bindings. It's a drop-in replacement for pycocotools — the same numbers bit for bit, up to 84× faster — plus the analysis that usually lives in separate tools: TIDE error analysis, confusion matrices, confidence calibration, model comparison, label-error detection, and a dataset browser.
It covers detection today — boxes, masks, keypoints, and oriented boxes on the COCO, LVIS, and Open Images protocols. Panoptic and tracking are planned, on the same engine.
Pure Rust, available as a Python package, CLI tool, and Rust library.
Documentation | Changelog | Roadmap
Performance
Bbox evaluation on COCO val2017 runs in 0.06s against 4.92s for pycocotools; segm is ~80× faster and keypoints ~50×. Peak memory is a third of pycocotools' or less at every scale measured. Two other Rust evaluators, ultrafast-pycocotools and vernier, are in the same speed class; the benchmarks page compares all five on time and memory. The precision, recall, and scores arrays and every summary metric are bit-identical to pycocotools', so your AP scores don't change.
Full tables, hardware, the Objects365 scale run, phase breakdowns, and parity verification: Benchmarks.
Get started
pip install hotcoco
No Cython, no C compiler, no Microsoft Build Tools. Prebuilt wheels for Linux, macOS, and Windows.
Already using pycocotools? One line:
from hotcoco import init_as_pycocotools
init_as_pycocotools()
Or use it directly — the API is identical:
from hotcoco import COCO, COCOeval
coco_gt = COCO("instances_val2017.json")
coco_dt = coco_gt.load_res("detections.json")
ev = COCOeval(coco_gt, coco_dt, "bbox")
ev.run()
What's included
Evaluate
- COCO, LVIS, and Open Images evaluation — bbox, segmentation, keypoints, and oriented bounding box (OBB); all standard metrics plus LVIS federated eval (APr/APc/APf) and Open Images hierarchy-aware eval (group-of matching, GT expansion). OBB evaluation uses rotated IoU via polygon clipping for aerial imagery, document analysis, and scene text. See the evaluation guide and LVIS and Open Images.
- Streaming evaluation —
StreamingEvalmatches each image as its detections arrive, so a validation epoch ends with onlyaccumulate()andsummarize()left to run; the numbers are identical to a batch run. See streaming evaluation. - Evaluation reports —
ev.report()returns metrics, per-class and per-group breakdowns, plottable PR curves, and aprovenancefield that says whether each number is comparable to a published leaderboard or is a hotcoco extension. See the evaluation report.
Diagnose
- TIDE error analysis — classifies every false positive and false negative into one of six error types and reports how much AP each type costs. See TIDE errors.
- Confusion matrix — cross-category matching with per-class breakdowns. See confusion matrix.
- Confidence calibration — ECE/MCE metrics and reliability diagrams measure whether your model's confidence scores are meaningful. See calibration.
- Per-image diagnostics and label errors — per-image F1/AP scores, automatic detection of wrong labels and missing annotations in your ground truth. See diagnostics.
- Model comparison —
hotcoco.compare(eval_a, eval_b)with per-metric deltas, per-category AP breakdown, and bootstrap confidence intervals for statistical significance. See model comparison. - F-scores — F-beta averaging over precision/recall curves, analogous to mAP. See F-scores.
- Sliced evaluation — re-accumulate metrics for named image subsets (indoor/outdoor, day/night) without recomputing IoU. See sliced evaluation.
- Plotting — publication-quality PR curves, per-category AP, confusion matrices, and TIDE error breakdowns. Light and dark themes (
cyanotype,cyanotype-dark) withpaper_modefor LaTeX/PowerPoint embedding.report()generates a single-page PDF summary.pip install hotcoco[plot]. See plotting.
Explore your data
- Dataset browser —
coco.browse()/coco exploreopens a local browser with category filter, annotation overlays (bbox/segm/keypoints/OBB), hover-to-highlight, zoom/pan, and detection comparison. Passeval=to enable an interactive eval dashboard with PR curves, confusion matrix, TIDE errors, calibration, and per-image F1.pip install hotcoco[browse]. See Dataset browser. - Dataset healthcheck — 4-layer validation (structural, quality, distribution, GT/DT compatibility) catches duplicate IDs, degenerate bboxes, category imbalance, and more. See healthcheck.
- Format conversion — COCO ↔ YOLO, Pascal VOC, CVAT, DOTA (oriented boxes), and Open Images CSV, from Python or the CLI. See format conversion.
Compose and integrate
- Metric functions on plain arrays —
hotcoco.metricsandhotcoco.primitivesexpose the engine as free functions, the waysklearn.metricsandtorchmetrics.functionaldo. No evaluator, no dataset, no COCO JSON:metrics.average_precision(scores, matched, num_gt=...),primitives.lsap(cost).COCOevalcalls the same functions, so the numbers cannot diverge. See metrics and primitives. - PyTorch integrations —
CocoDetectionandCocoEvaluatordrop-in replacements for torchvision's detection classes; no torchvision or pycocotools dependency required. See PyTorch integration. - Experiment tracker integration —
get_results(prefix="val/bbox", per_class=True)returns a flat dict ready for W&B, MLflow, or any logger. See logging metrics. - Python CLI (
coco) — included withpip install hotcoco;eval,healthcheck,stats,filter,merge,split,sample,convert,compare, andexploresubcommands. See CLI reference. - Rust CLI (
coco-eval) — lightweight eval-only binary;cargo install hotcoco-cli. See CLI reference. - Type stubs — ships with
.pyistubs andpy.typedmarker for full autocomplete and type checking in VS Code, PyCharm, and other IDEs. - Rust library — use hotcoco directly in your Rust projects via
cargo add hotcoco. See Rust API.
Contributing
Contributions are welcome. See CONTRIBUTING.md for the architecture overview, build and test workflow, and pre-commit checks.
Parity with pycocotools is a hard requirement for any change to evaluation logic; CONTRIBUTING.md describes how to verify it.
License
MIT
Metadata
Release files for hotcoco 1.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| hotcoco-1.1.0.tar.gz | 1.6 MB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| hotcoco-1.1.0-cp39-abi3-win_amd64.whl | CPython 3.9 | abi3 | Windows x86-64 | Details |
| hotcoco-1.1.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | CPython 3.9 | abi3 | Linux glibc 2.17+ x86-64 | Details |
| hotcoco-1.1.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl | CPython 3.9 | abi3 | Linux glibc 2.17+ ARM64 | Details |
| hotcoco-1.1.0-cp39-abi3-macosx_11_0_arm64.whl | CPython 3.9 | abi3 | macOS 11.0+ ARM64 | Details |
| hotcoco-1.1.0-cp39-abi3-macosx_10_12_x86_64.whl | CPython 3.9 | abi3 | macOS 10.12+ x86-64 | Details |
Total release size: 13.2 MB
Release files / hotcoco-1.1.0.tar.gz
| Download URL | hotcoco-1.1.0.tar.gz |
|---|---|
| Size | 1.6 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
df26d78776d4bae815c0568cd098e4c0a5e5470b63a6a7eb10445970ebfeb58e
|
|
BLAKE2b-256 checksum How to use checksums |
7ba9b5c82546d63fbc55133c31378728a4619f3fdf5d448852130f82fb9700f1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / hotcoco-1.1.0-cp39-abi3-win_amd64.whl
| Download URL | hotcoco-1.1.0-cp39-abi3-win_amd64.whl |
|---|---|
| Size | 2.2 MB |
| Tags | CPython 3.9 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
c5f9427f47fd370d9e94c34176de7f4a87f8fdf4d3f4715a1439370be901ffbe
|
|
BLAKE2b-256 checksum How to use checksums |
7c0cc90d0b35f02e2b203c8bd734dd54e99d7287ec618815e16dd7b22851b198
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / hotcoco-1.1.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | hotcoco-1.1.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 2.4 MB |
| Tags | CPython 3.9 Linux glibc 2.17+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
38b2edf34eddafa565962f379b9a8b22aef5f4ee7a84b201b536448109bbbe5b
|
|
BLAKE2b-256 checksum How to use checksums |
60c5ae52035c133e440ed93484529fbe04a66dc4ff6db4046400c6cb884577d3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / hotcoco-1.1.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | hotcoco-1.1.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 2.4 MB |
| Tags | CPython 3.9 Linux glibc 2.17+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
8164bbc4d597416db52a51c6f2f5d47c443ada8f67de01ac2191e4a216cc3f05
|
|
BLAKE2b-256 checksum How to use checksums |
d75c3392c215a9e0a75caa59dce29a36d8d2d3d03927ed83234d8ab78d9c6f79
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / hotcoco-1.1.0-cp39-abi3-macosx_11_0_arm64.whl
| Download URL | hotcoco-1.1.0-cp39-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 2.3 MB |
| Tags | CPython 3.9 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
635c531642e156c7055643902a071b2deef388a8a3c4c7f69638918fed825b3e
|
|
BLAKE2b-256 checksum How to use checksums |
08848d89afe44cb1f082798c80eda860ddb2f8c66c9d9369f2d7fc924d0f1f5f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / hotcoco-1.1.0-cp39-abi3-macosx_10_12_x86_64.whl
| Download URL | hotcoco-1.1.0-cp39-abi3-macosx_10_12_x86_64.whl |
|---|---|
| Size | 2.3 MB |
| Tags | CPython 3.9 abi3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
ce0ff01ccccada83aa363abfd4aa1a1e1afd27e7334d27cbe82e34d065605a51
|
|
BLAKE2b-256 checksum How to use checksums |
513ba565992b847f3085d933a3dfe10af025a553f13d9865ba1f7495216dcac3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|