Mask pixel-area counting used `np.sum` — `np.array([np.sum(m) for m in masks])` in `Detections.area` and `np.sum(mask, axis=(1, 2))` in the metrics `get_mask_size_category`. For boolean masks `np.count_nonzero` (with no axis) dispatches to NumPy's SIMD popcount over the raw byte buffer, whereas every axis-reduction form — `np.sum(..., axis=...)` and even `np.count_nonzero(..., axis=...)` — falls back to a slower generic reduction. So counting per mask with `np.count_nonzero` is several times faster than the "obvious" vectorized sum, while producing bit-identical integer counts. Route both sites through `np.fromiter((np.count_nonzero(m) for m in masks), dtype=np.int64, count=len(masks))`. `dtype=np.int64` preserves the documented `Detections.area` mask-branch dtype on every platform (a bare `np.array([...])` of Python ints would be int32 on Windows). Measured ~5x on 640x640 masks (e.g. `Detections.area`, N=300: ~24ms -> ~4ms), faster across densities. `get_mask_size_category` feeds the size-bucketed F1/Precision/Recall/mAP/mAR metrics, where it is invoked repeatedly per dataset. Counts are integer-exact (verified over 400 randomized trials plus empty / all-true / all-false / 1x1 edge cases). Adds parity tests for `Detections.area` (dense mask) and `get_mask_size_category` against an `np.sum` reference. --------- Co-authored-by: Jirka Borovec <6035284+Borda@users.noreply.github.com> Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>
0 lines
0 B
Python
0 lines
0 B
Python
The file is empty.