Skip to content

πŸ“ CHANGELOG

πŸš€ SAHI v0.12.5 Release Notes

A patch release that finishes the postprocessing memory work started in 0.12.2, which turned out to help only when boxes were spread out, and fixes two correctness problems found while testing it.

πŸ› Fixes

  • Postprocessing memory no longer depends on how crowded the boxes are (#1417). Avoiding the N x N overlap matrix by storing one entry per intersecting pair is only a saving while boxes are spread out. Boxes piled on top of each other intersect nearly everything, so the pair count approaches N^2 and the stored list costs about as much as the matrix it replaced, which is exactly the layout that sliced inference produces on crowd scenes and small-object imagery. The merge loops read one row of matches at a time, and NMS and greedy NMM only ever read rows of boxes that survived, so rows are now answered from the STRtree on demand and peak memory is bounded by O(N + max_degree) whatever the layout. NMM reads a row per box rather than per survivor, so it keeps the stored pair list until that list is projected to be large.
  • A non-positive match_threshold no longer builds a metric matrix (#1417). Both metrics are non-negative, so metric >= 0 holds for every pair and the adjacency is the complete graph. The dense path was still computing every overlap to discover this, which made the one configuration that needs no overlap computation the most expensive one and reproduced the out-of-memory failure from #1374 at 25000 boxes. The result now follows from the score order alone.
  • NMM no longer merges a keeper into itself (#1416). A keeper was marked by leaving its merge_to_keep entry at -1, the same value that marks a box as unclaimed, so a box processed later could claim a keeper and append it to a merge list. With tied scores on duplicate boxes this produced a keeper listed inside its own merge list, and an index reachable as both a keeper and a merged box. Keepers now point at themselves, which makes them unclaimable without changing any other outcome.
  • Zero-area boxes no longer trigger a divide-by-zero warning (#1416). The metric computed inter / denom for every pair and discarded the invalid entries afterwards, so a degenerate box emitted a RuntimeWarning. The division is now masked instead of the result.

⚑ Performance

Postprocessing on crowded and scattered layouts, IOS / 0.3:

layout boxes NMS before NMS after peak memory before peak memory after
crowded 33337 47180 ms 135 ms 3416 MB 4 MB
crowded 20000 15931 ms 57 ms 1232 MB 2 MB
crowded 10000 2717 ms 25 ms 311 MB 1 MB
scattered 33336 539 ms 188 ms 65 MB 4 MB
  • The numba backend picks its path by box density (#1418). Its NMS and greedy NMM loops ran an exhaustive pairwise scan whatever the input. Routing them by prediction count alone would regress crowded scenes, because the JIT loop skips suppressed candidates and stays competitive long after the numpy one stops being viable, so the neighbour count decides instead and is estimated from a sample of the boxes. The score sort was also an insertion sort, quadratic in its own right, and now uses the same lexsort the other backends share, which produces an identical order including ties.
average neighbours per box, 20000 boxes NMS before NMS after greedy NMM before greedy NMM after
0.0 909 ms 43 ms 842 ms 89 ms
0.8 781 ms 52 ms 757 ms 84 ms
5.1 495 ms 118 ms 479 ms 151 ms
20.1 241 ms 146 ms 236 ms 148 ms
78.9 141 ms 73 ms 143 ms 71 ms

πŸš€ SAHI v0.12.4 Release Notes

A patch release that fixes the sahi command line interface, which was broken on any installation that did not already have matplotlib present.

πŸ› Fixes

  • matplotlib is now a declared dependency (#1414). sahi.cli imports sahi.scripts.coco_error_analysis, which imports matplotlib at module level, but matplotlib was never listed in [project].dependencies or in any extra. Because the import is eager, every sahi command failed on a clean install, including ones unrelated to plotting such as sahi version. The issue went unnoticed because matplotlib is usually already installed alongside other packages in a typical environment.

πŸš€ SAHI v0.12.3 Release Notes

A patch release that puts Apple Silicon GPUs to work, adds a Turkish translation of the documentation, and clears CI maintenance gathered since 0.12.2.

πŸ› Fixes

  • Apple MPS is now detected for device selection and postprocessing (#1408). select_device() only looked for CUDA, so macOS users fell back to CPU even with a working Metal backend. Automatic selection is now CUDA β†’ MPS β†’ CPU, and the torchvision postprocessing backend is picked when either GPU is present. Detection goes through torch.backends.mps.is_available(), which exists on every supported torch version and reports False on non-Apple builds.
  • threading.currentThread() replaced with current_thread() (#1392), removing a DeprecationWarning on newer Python versions.

πŸ“š Documentation

  • Turkish translation of the documentation, with a build step and zensical configuration to match (#1401, #1402, #1404).
  • Multilingual subpath links now resolve correctly (#1403).
  • Backend documentation lists MPS alongside CUDA (#1410).

🧹 Maintenance & CI

  • Device selection and postprocessing backend resolution are covered by tests (#1409).
  • Bumped astral-sh/setup-uv 8.3.2 β†’ 9.0.0 (#1399), actions/setup-python 6.3.0 β†’ 7.0.0 (#1400) and actions/checkout 7.0.0 β†’ 7.0.1 (#1398).
  • Relaxed the twine requirement to >=5.1.1,<8.0.0 (#1406).

⚑ Performance

NMS with the IOU metric, best of 5 runs, on an Apple M2 Pro:

boxes numpy numba torchvision (MPS)
100 0.14 ms 0.02 ms 1.44 ms
500 1.53 ms 0.36 ms 1.42 ms
1000 5.46 ms 1.40 ms 1.45 ms
5000 81.37 ms 34.16 ms 4.05 ms
20000 1237.70 ms 462.56 ms 11.75 ms

Below roughly 500 boxes numba stays ahead, but the difference there is about a millisecond.

Full Changelog: https://github.com/obss/sahi/compare/0.12.2...0.12.3

πŸš€ SAHI v0.12.2 Release Notes

A patch release fixing out-of-memory failures and severe slowdowns when postprocessing large prediction sets, plus model, packaging and documentation fixes gathered since 0.12.1.

πŸ› Fixes

  • Postprocessing no longer allocates an N x N matrix for large inputs (#1395). v0.11 used a shapely STRtree and only compared nearby boxes; v0.12 replaced it with a dense matrix that is O(N^2) in time and memory regardless of layout. The TorchVision backend had no size guard and built seven N x N tensors on the GPU, so it ran out of memory first. The greedy loops only ever use matrix >= match_threshold, never the metric values, so the thresholded adjacency is now built directly from the pairs an STRtree reports as intersecting and stored as CSR. Fixes #1374.
  • RF-DETR local models can be loaded by class name, with corrected Roboflow docs (#1394).
  • MMDetection has_mask now handles RepeatDataset (#1387).
  • Dependency and minimum-version checks are enforced in import_utils (#1377).
  • All OpenCV distributions are kept on one version, avoiding conflicting installs (#1393).

πŸ“š Documentation

  • Chinese translations updated and completed (#1371).
  • Docs default to YOLO26 and link the Ultralytics YOLO26 page (#1386), and YOLO26 is listed among the CLI models (#1378).

🧹 Maintenance & CI

  • Bumped astral-sh/setup-uv 8.2.0 β†’ 8.3.2 (#1389) and updated actions/checkout / actions/cache (#1385).
  • Relaxed the build requirement to >=0.10,<1.6 (#1382).

⚑ Performance

33337 boxes, IOS metric, threshold 0.3. Same outputs before and after (6571 predictions for greedy_nmm, 4639 for nmm).

CPU (Intel Core i7-13850HX):

backend greedy_nmm before after nmm before after
numpy 15.88s 0.18s 27.06s 0.21s
torchvision 6.22s 0.18s 17.34s 0.21s
numba 1.53s 1.55s 18.56s 0.22s

CUDA (RTX 4000 Ada Laptop, 12 GB):

backend greedy_nmm before after nmm before after
numpy 15.93s 0.26s 27.00s 0.21s
torchvision OOM, 4.14 GiB 0.17s OOM, 4.14 GiB 0.23s
numba 1.09s 1.09s 18.82s 0.22s

Inputs below 2000 boxes, and any non-positive threshold, stay on the dense path where it is faster.

Full Changelog: https://github.com/obss/sahi/compare/0.12.1...0.12.2

πŸš€ SAHI v0.12.0 Release Notes

One of the largest SAHI releases to date β€” 95 commits since 0.11.34 (rolling in the 0.11.35/0.11.36 hotfixes) β€” featuring a re-architected postprocessing engine, true batch inference, a torch-free core, new open-vocabulary and segmentation models, and a full documentation overhaul.

πŸš€ Key Updates

⚑ Batch inference, torch-free core & accelerated postprocessing backends

  • Batch inference β€” slices are processed in batches end-to-end for major GPU throughput gains (#1336).
  • Torch-free core β€” the core slicing/postprocessing path no longer hard-depends on PyTorch; install only what your backend needs (#1336).
  • Pluggable postprocessing backends β€” NMS/NMM run on a selectable backend: NumPy (zero heavy deps), Numba (JIT-accelerated CPU), or TorchVision (GPU), auto-selected for your environment (#1336).

🧠 New model support

  • GroundingDINO (HuggingFace) β€” zero-shot, text-prompted open-vocabulary detection through SAHI's sliced pipeline, with a dedicated demo notebook (#1361).
  • Universal segmentation from HuggingFace (#1360).
  • RF-DETR-Seg segmentation models (#1315).
  • YOLOE detection model (#1268).
  • YOLO-World open-vocabulary detection (#1267).
  • YOLO26 support across the Ultralytics backend, CLI, docs, and notebooks (#1321, #1322, #1356).

🎚️ Finer control over slicing & postprocessing

  • force_postprocess_type in get_sliced_prediction (#1346).
  • Per-call confidence_threshold override across prediction APIs (#1352).
  • Progress bar + progress callback for get_sliced_prediction in both the Python API and CLI (#1255).

πŸ“š Documentation

  • Migrated docs to Zensical with full code typing & formatting cleanup (#1344).
  • Chinese (zh) translation added and kept in sync (#1253, #1332, #1347).
  • New API reference, postprocessing backends guide, security policy, and Code of Conduct (#1257, #1272, #1349).

✨ Performance & Improvements

  • Significantly faster post-processing β€” NMS, NMM, and GREEDYNMM now use a shapely STRtree spatial index, dramatically speeding up merging on images with many slices/detections (#1248).
  • Faster read_image_as_pil for quicker slicing throughput (#1353).
  • Improved performance & resource management in prediction and slicing (#1263).
  • Better nms performance with correct empty-prediction handling (#1288).
  • Replaced pybboxes with a lightweight in-house yolo_bbox_to_voc_bbox (#1320) and removed the pybboxes / pinned opencv-python constraints (#1325).

🐞 Bug Fixes

  • Fixed empty bounding boxes caused by an empty shapely_annotation.multipolygon (#1140).
  • Fixed invalid segmentation masks for Detectron2 models (#1262).
  • Corrected margin calculation in BoundingBox (#1286).
  • Fixed CHW-format image handling in read_image_as_pil (#1287).
  • Validate overlap ratios in get_slice_bboxes (must be < 1.0) (#1285).
  • Corrected error message for invalid model path in RTDetrDetectionModel (#1266).
  • Fixed incorrect type annotations in the postprocess module (#1327).
  • Ultralytics model supports additional formats with improved task handling (#1321).
  • Added pywinpty for Windows dev compatibility (#1319).

🧹 Maintenance & CI

  • Pinned all GitHub Actions to commit SHAs for supply-chain security (#1351).
  • Multi-OS CI matrix and clearer workflow naming (#1334).
  • Bumped to Python 3.12/3.13 in CI and docs (#1259, #1260).
  • Removed deprecated YOLOv5 helpers, legacy requirements.txt, MMDet workflow, and unused Netlify config (#1326, #1342, #1341, #1335).
  • numpy<3.0, torchvision 0.23.0, and many Dependabot dependency bumps (now also covering pip).

πŸ™Œ New Contributors

  • @vinnik-dmitry07 made their first contribution in #1140
  • @nikvo1 made their first contribution in #1248
  • Christopher Field (@volks73) made their first contribution in #1262
  • Haotian Gong (@ZephyrKeXiner) made their first contribution in #1253
  • Yogendra Singh (@yogendrasinghx) made their first contribution in #1326
  • Ivan Buldakov (@ibuldakov) made their first contribution in #1315
  • Vignesh Suresh (@srikrishnavignesh) made their first contribution in #1360
  • Γ–mer GΓΌnaydΔ±n (@siromermer) made their first contribution in #1361

Full Changelog: https://github.com/obss/sahi/compare/0.11.34...0.12.0

πŸš€ SAHI v0.11.31 Release Notes

We're excited to announce SAHI v0.11.31 with important bug fixes and improvements!

πŸ†• What's Changed

πŸ™Œ New Contributors

Full Changelog: https://github.com/obss/sahi/compare/0.11.30...0.11.31

πŸš€ SAHI v0.11.30 Release Notes

We're excited to announce SAHI v0.11.30 with improved performance tracking, enhanced testing infrastructure, and better developer experience!

πŸ“ˆ Milestones

  • Academic papers citing SAHI reached 400! (#1168)

πŸš€ Key Updates

⚑️ Performance & Monitoring

  • Fixed postprocess duration tracking in get_sliced_prediction - now properly separates slice, prediction, and postprocess timings for accurate performance monitoring (#1201) - Thanks @Toprak2!

🧩 Framework Updates

  • Refactored Ultralytics support with ONNX model support and better compatibility (#1184)
  • Updated TorchVision support to latest API (#1182)
  • Improved Detectron2 support with better config handling to prevent KeyError issues (#1116) - Thanks @Arnesh1411!
  • Added Roboflow framework support for RF-DETR models from the Roboflow Universe (#1161) - Thanks @nok!
  • Removed deepsparse integration as the framework is no longer maintained (#1164)

πŸ§ͺ Testing Infrastructure

  • Migrated test suite to pytest (#1187)
  • Tests now run faster with better parallel execution
  • Extended Python version coverage (3.8, 3.9, 3.10, 3.11, 3.12)
  • Updated to more recent PyTorch versions for better compatibility testing
  • Improved test organization and maintainability
  • Refactored MMDetection tests for better reliability (#1185)

πŸ’» Developer Experience

  • Added Context7 MCP integration for AI-assisted development (#1198)
  • SAHI's documentation is now indexed in Context7 MCP
  • Provides AI coding assistants with up-to-date, version-specific code examples
  • Includes llms.txt file for AI-readable documentation
  • Check out the Context7 MCP installation guide to integrate SAHI docs with your AI workflow

πŸ› οΈ Improvements

🧹 Code Quality & Safety

  • Immutable bounding boxes for thread-safe operations (#1194, #1191) - Thanks @gboeer!
  • Enhanced type hints and docstrings throughout the codebase (#1195) - Thanks @gboeer!
  • Overloaded operators for prediction scores enabling intuitive score comparisons (#1190) - Thanks @gboeer!
  • PyTorch is now a soft dependency improving flexibility (#1162) - Thanks @ducviet00!

πŸ—οΈ Infrastructure & Stability

  • Improved dependency management and documentation (#1183)
  • Enhanced pyproject.toml configuration for better package management (#1181)
  • Optimized CI/CD workflows for MMDetection tests (#1186)

πŸ› Bug Fixes

  • Fixed CUDA device selection to support devices other than cuda:0 (#1158) - Thanks @0xf21!
  • Corrected parameter naming from 'confidence' to 'threshold' for consistency (#1180) - Thanks @nok!
  • Fixed regex string formatting in device selection function (#1165)
  • Resolved torch import errors when PyTorch is not installed (#1172) - Thanks @ducviet00!
  • Fixed model instantiation issues with AutoDetectionModel.from_pretrained (#1158)

πŸ“¦ Dependencies

  • Updated OpenCV packages from 4.10.0.84 to 4.11.0.86 (#1171) - Thanks @ducviet00-h2!
  • Removed unmaintained matplotlib-stubs dependency (#1169)
  • Cleaned up unused configuration files (#1199)

πŸ“š Documentation

  • Added context7.json for better AI tool integration (#1200)
  • Updated README with new contributors (#1175, #1179)
  • Added Roboflow+SAHI Colab tutorial link (#1177)

πŸ™ Acknowledgments

Special thanks to all contributors who made this release possible: @nok, @gboeer, @Toprak2, @Arnesh1411, @0xf21, @ducviet00, @ducviet00-h2, @p-constant, and @fcakyon!


Full Changelog: https://github.com/obss/sahi/compare/0.11.24...0.11.30

πŸš€ SAHI v0.11.29 Release Notes

πŸ†• What's Changed

Full Changelog: https://github.com/obss/sahi/compare/0.11.28...0.11.29

πŸš€ SAHI v0.11.28 Release Notes

πŸ†• What's Changed

πŸ™Œ New Contributors

Full Changelog: https://github.com/obss/sahi/compare/0.11.27...0.11.28

πŸš€ SAHI v0.11.27 Release Notes

πŸ†• What's Changed

Full Changelog: https://github.com/obss/sahi/compare/0.11.26...0.11.27

πŸš€ SAHI v0.11.26 Release Notes

πŸ†• What's Changed

πŸ™Œ New Contributors

Full Changelog: https://github.com/obss/sahi/compare/0.11.25...0.11.26

πŸš€ SAHI v0.11.25 Release Notes

πŸ†• What's Changed

Full Changelog: https://github.com/obss/sahi/compare/0.11.24...0.11.25

πŸš€ SAHI v0.11.24 Release Notes

πŸ†• What's Changed

πŸ™Œ New Contributors

Full Changelog: https://github.com/obss/sahi/compare/0.11.23...0.11.24

πŸš€ SAHI v0.11.23 Release Notes

πŸ†• What's Changed

πŸ™Œ New Contributors

Full Changelog: https://github.com/obss/sahi/compare/0.11.22...0.11.23

πŸš€ SAHI v0.11.22 Release Notes

πŸ†• What's Changed

Full Changelog: https://github.com/obss/sahi/compare/0.11.21...0.11.22

πŸ“š Core Documentation Files

πŸ“¦ Prediction Utilities

  • Detailed guide for performing object detection inference
  • Standard and sliced inference examples
  • Batch prediction usage
  • Class exclusion during inference
  • Visualization parameters and export formats
  • Interactive examples with various model integrations (YOLOv8, MMDetection, etc.)

βœ‚οΈ Slicing Utilities

  • Guide for slicing large images and datasets
  • Image slicing examples
  • COCO dataset slicing examples
  • Interactive demo notebook reference

πŸ’ COCO Utilities

  • Comprehensive guide for working with COCO format datasets
  • Dataset creation and manipulation
  • Slicing COCO datasets
  • Dataset splitting (train/val)
  • Category filtering and updates
  • Area-based filtering
  • Dataset merging
  • Format conversion (COCO ↔ YOLO)
  • Dataset sampling utilities
  • Statistics calculation
  • Result validation

πŸ’» CLI Commands

  • Complete reference for SAHI command-line interface
  • Prediction commands
  • FiftyOne integration
  • COCO dataset operations
  • Environment information
  • Version checking
  • Custom script usage

πŸ‘οΈ FiftyOne Integration

  • Guide for visualizing and analyzing predictions with FiftyOne
  • Dataset visualization
  • Result exploration
  • Interactive analysis

πŸ““ Interactive Examples

All documentation files are complemented by interactive Jupyter notebooks in the demo directory:

  • slicing.ipynb - Slicing operations demonstration
  • inference_for_ultralytics.ipynb - YOLOv8/YOLO11/YOLO12 integration
  • inference_for_yolov5.ipynb - YOLOv5 integration
  • inference_for_mmdetection.ipynb - MMDetection integration
  • inference_for_huggingface.ipynb - HuggingFace models integration
  • inference_for_torchvision.ipynb - TorchVision models integration
  • inference_for_rtdetr.ipynb - RT-DETR integration
  • inference_for_sparse_yolov5.ipynb - DeepSparse optimized inference

🚦 Getting Started

If you're new to SAHI:

  1. Start with the prediction utilities to understand basic inference
  2. Explore the slicing utilities to learn about processing large images
  3. Check out the CLI commands for command-line usage
  4. Dive into COCO utilities for dataset operations
  5. Try the interactive notebooks in the demo directory for hands-on experience

πŸš€ SAHI v0.11.21 Release Notes

πŸ†• What's Changed

πŸ™Œ New Contributors

Full Changelog: https://github.com/obss/sahi/compare/0.11.20...0.11.21

πŸš€ SAHI v0.11.20 Release Notes

πŸ†• What's Changed

Full Changelog: https://github.com/obss/sahi/compare/0.11.19...0.11.20

πŸš€ SAHI v0.11.19 Release Notes

πŸ†• What's Changed

πŸ™Œ New Contributors

Full Changelog: https://github.com/obss/sahi/compare/0.11.18...0.11.19

πŸš€ SAHI v0.11.18 Release Notes

πŸ†• What's Changed

πŸ™Œ New Contributors

Full Changelog: https://github.com/obss/sahi/compare/0.11.16...0.11.18

πŸš€ SAHI v0.11.16 Release Notes

πŸš€ SAHI v0.11.15 Release Notes

πŸš€ SAHI v0.11.14 Release Notes

πŸ†• What's Changed

πŸ™Œ New Contributors

Full Changelog: https://github.com/obss/sahi/compare/0.11.13...0.11.14

πŸš€ SAHI v0.11.13 Release Notes

πŸš€ SAHI v0.11.12 Release Notes

πŸš€ SAHI v0.11.11 Release Notes

πŸš€ SAHI v0.11.10 Release Notes

πŸš€ SAHI v0.11.9 Release Notes

πŸš€ SAHI v0.11.8 Release Notes

πŸš€ SAHI v0.11.7 Release Notes

πŸš€ SAHI v0.11.6 Release Notes

πŸš€ SAHI v0.11.5 Release Notes

πŸš€ SAHI v0.11.4 Release Notes

πŸš€ SAHI v0.11.3 Release Notes

πŸš€ SAHI v0.11.2 Release Notes

πŸš€ SAHI v0.11.1 Release Notes