Skip to content

Commit 51a5266

Browse files
derekallmanclaude
andcommitted
release: bump to v0.2.0
- Publish Objects365 scale benchmark: hotcoco 39× vs pycocotools, 14× vs faster-coco-eval; 8 GB committed vs 24–30 GB for alternatives (80k images, 365 categories, ~1.2M detections) - Update sales pitch in README and docs/index.md to lead with scale story - Promote [Unreleased] → [0.2.0] in CHANGELOG; update ROADMAP - Bump workspace version to 0.2.0 in Cargo.toml, pyproject.toml, and path dep pins - Fix feature table: faster-coco-eval Python floor (3.7+), metric parity (exact), LVIS support, per-class AP - Update parity tolerance claim: bbox ≤1e-4, segm ≤2e-4, keypoints exact - Add adversarial test fixtures, parity scripts (LVIS, TIDE), test_parity.py, adversarial harness - Docs audit: add citations (COCO, OKS, LVIS, TIDE), clarify area range notation, fix LVIS frequency definition Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent b73657f commit 51a5266

104 files changed

Lines changed: 25465 additions & 55 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,8 @@ site/
133133
crates/hotcoco-pyo3/data/annotations/
134134
crates/hotcoco-pyo3/data/*.json
135135
crates/hotcoco-pyo3/data/__pycache__/
136+
# Adversarial harness output (generated, not committed)
137+
crates/hotcoco-pyo3/data/parity_failures/
136138

137139
# uv lock file (transient dev env)
138140
crates/hotcoco-pyo3/uv.lock

CHANGELOG.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,30 @@ and this project adheres to [Semantic Versioning](https://semver.org/).
77

88
## [Unreleased]
99

10+
## [0.2.0] - 2026-03-11
11+
1012
### Added
1113

14+
- Objects365 benchmark results (80k images, 365 categories, ~1.2M detections): hotcoco **39×** vs pycocotools and **14×** vs faster-coco-eval; peak committed RAM 8 GB vs 24–30 GB for alternatives
15+
- `bench_objects365.py` now includes pycocotools as a third runner; Windows support (`peak_wset` + pagefile for memory measurement, `.exe` binary name); `_bench_python_runner` shared helper; process-tree memory tracking via psutil
16+
17+
### Changed
18+
19+
- Feature comparison table in `docs/benchmarks.md` corrected: faster-coco-eval installation (prebuilt wheels available), metric parity (exact vs pycocotools), LVIS support (`lvis_style=True`), per-class AP (`extended_metrics`), Python version floor (3.7+)
20+
- Parity tolerance claim updated from flat "≤1e-4" to per-type breakdown: bbox ≤1e-4, segm ≤2e-4, keypoints exact
21+
- Benchmark numbers in `README.md` and `docs/index.md` synced to current bench.py output (bbox 0.41s 23×, segm 0.49s 18.6×, kpts 0.21s 12.7×); corrected detection count from ~43,700 to 36,781
22+
- Documentation: added paper citations for COCO eval (Lin et al. ECCV 2014), OKS (cocodataset.org), LVIS (Gupta et al. ECCV 2019), and TIDE (Bolya et al. ECCV 2020 arxiv); area range notation clarified to square pixels (px²); LVIS frequency definition corrected from instance count to training image count
23+
24+
### Added
25+
26+
- `ConfusionMatrix.cat_names` / `confusion_matrix()` dict now includes `"cat_names"` — category names parallel to `cat_ids`, eliminating a manual `load_cats` lookup after computing a confusion matrix
27+
- `EvalResults.hotcoco_version` — records the library version that produced the results file; included in the `results()` dict and saved JSON
28+
- `TideErrors` now derives `Serialize` (Rust) — can be serialized directly with `serde_json`
29+
30+
### Changed
31+
32+
- `EvalResults::to_json_string()` renamed to `to_json()` for consistency with Rust naming conventions
33+
1234
- `COCOeval.results(per_class=False)` — return serializable evaluation results as a dict; `save_results(path, per_class=False)` writes the same structure as pretty-printed JSON
1335
- `coco-eval --output / -o <path>` — CLI flag to write evaluation results JSON after evaluation (always includes per-category AP)
1436
- `AreaRange` struct in `hotcoco::params` (re-exported from crate root) — replaces the two parallel `area_rng` / `area_rng_lbl` vecs in `Params` with a single `Vec<AreaRange { label, range }>`

Cargo.lock

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ members = ["crates/hotcoco", "crates/hotcoco-cli", "crates/hotcoco-pyo3"]
33
resolver = "2"
44

55
[workspace.package]
6-
version = "0.1.0"
6+
version = "0.2.0"
77
edition = "2021"
88
rust-version = "1.74"
99
authors = ["Derek Allman <derek.allman@yahoo.com>"]

README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,21 @@
55
[![Crates.io](https://img.shields.io/crates/v/hotcoco)](https://crates.io/crates/hotcoco)
66
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
77

8-
11-26x faster COCO evaluation — a drop-in replacement for [pycocotools](https://github.com/ppwwyyxx/cocoapi) that works with Ultralytics YOLO, Detectron2, mmdetection, RF-DETR, and any pycocotools-based pipeline.
8+
Fast enough for every epoch, lean enough for every dataset. A drop-in replacement for [pycocotools](https://github.com/ppwwyyxx/cocoapi) that doesn't become the bottleneck — in your training loop or at foundation model scale. Up to 23× faster on standard COCO, 39× faster on Objects365, and fits comfortably in memory where alternatives run out.
99

1010
Available as a **Python package**, **CLI tool**, and **Rust library**. Pure Rust — no Cython, no C compiler, no Microsoft Build Tools. Prebuilt wheels for Linux, macOS, and Windows.
1111

1212
**[Documentation](https://derekallman.github.io/hotcoco/)** | **[Changelog](CHANGELOG.md)** | **[Roadmap](ROADMAP.md)**
1313

1414
## Performance
1515

16-
Benchmarked on COCO val2017 (5,000 images, 36,781 ground truth annotations, ~43,700 detections), Apple M1 MacBook Air:
16+
Benchmarked on COCO val2017 (5,000 images, 36,781 synthetic detections), Apple M1 MacBook Air:
1717

1818
| Eval Type | pycocotools | faster-coco-eval | hotcoco |
1919
|-----------|-------------|------------------|-----------|
20-
| bbox | 11.79s | 3.47s (3.4x) | 0.74s (15.9x) |
21-
| segm | 19.49s | 10.52s (1.9x) | 1.58s (12.3x) |
22-
| keypoints | 4.79s | 3.08s (1.6x) | 0.19s (25.0x) |
20+
| bbox | 9.46s | 2.45s (3.9x) | **0.41s (23.0x)** |
21+
| segm | 9.16s | 4.36s (2.1x) | **0.49s (18.6x)** |
22+
| keypoints | 2.62s | 1.78s (1.5x) | **0.21s (12.7x)** |
2323

2424
Speedups in parentheses are vs pycocotools. Results verified against pycocotools on COCO val2017 with a 10,000+ case parity test suite — your AP scores won't change.
2525

ROADMAP.md

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ All implemented in Rust core, exposed via Python CLI and Python API.
5656

5757
**Shipped.**
5858

59-
~~Standard COCO evaluation protocol over 365 categories and ~2M images.~~ Verified working on real O365 annotation data. Published benchmark numbers coming soon — pending runs on more capable hardware.
59+
~~Standard COCO evaluation protocol over 365 categories and ~2M images.~~ Verified working on real O365 annotation data. Benchmark numbers published: 39× vs pycocotools, 14× vs faster-coco-eval on 80k images / 365 categories / 1.2M detections, using 8 GB committed vs 24–30 GB for alternatives.
6060

6161
### LVIS
6262

@@ -72,14 +72,6 @@ All implemented in Rust core, exposed via Python CLI and Python API.
7272

7373
---
7474

75-
## Tier 1 — Next
76-
77-
### O365 Benchmark Numbers
78-
79-
Publish benchmark results for Objects365-scale evaluation once runs on more capable hardware are complete.
80-
81-
---
82-
8375
## Tier 2 — Medium Term
8476

8577
### Format Conversion

crates/hotcoco-cli/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,5 @@ name = "coco-eval"
1717
path = "src/main.rs"
1818

1919
[dependencies]
20-
hotcoco = { version = "0.1.0", path = "../hotcoco" }
20+
hotcoco = { version = "0.2.0", path = "../hotcoco" }
2121
clap = { version = "4", features = ["derive"] }

crates/hotcoco-pyo3/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ name = "hotcoco"
1515
crate-type = ["cdylib"]
1616

1717
[dependencies]
18-
hotcoco-core = { version = "0.1.0", path = "../hotcoco", package = "hotcoco" }
18+
hotcoco-core = { version = "0.2.0", path = "../hotcoco", package = "hotcoco" }
1919
pyo3 = { version = "0.23", features = ["extension-module", "abi3-py39"] }
2020
numpy = "0.23"
2121
serde_json = "1"

0 commit comments

Comments
 (0)