Ultralytics v8.4.78 is out!
Quick summary: v8.4.78 is a lightweighting and usability release focused on smaller installs, cleaner internals, and clearer docs. The headline change is the removal of SciPy from core dependencies
, making the Ultralytics YOLO package easier to install with no intended behavior changes.
If you’re building with YOLO26, this update helps keep your environments lean and portable while improving documentation around counting workflows and predictor behavior.
Highlights
Smaller installs: SciPy removed from core dependencies
The biggest change in v8.4.78 comes from PR #24927 by @glenn-jocher, contributed by @glenn-jocher.
This update replaces the remaining SciPy-based operations with NumPy-based equivalents, including an internal replacement for linear_sum_assignment. These code paths are used in important areas such as:
- RT-DETR
- SAM and mask matching
- validation
- tracking utilities
The new implementation was validated against SciPy to machine precision, so this is intended to be a drop-in infrastructure improvement with no expected functional differences ![]()
Cleaner installation footprint
Since SciPy was one of the heaviest required packages, removing it noticeably reduces the base install size. That means:
- faster setup
- fewer dependency headaches
- smaller environments for CI and Docker
- better portability for notebooks, cloud workflows, and edge deployments
Documentation improvements
Region counting guide reworked
PR #24816 by @raimbekovm, from @raimbekovm, refreshes the RegionCounter guide around real usage.
The updated guide now better explains:
- how region counting works frame by frame
- how to define one or multiple regions
- how to access counts in code
- the difference between live occupancy and cumulative counting
This should make counting workflows much easier to understand and adopt.
Clarified model.embed() predictor behavior
PR #24926 by @raimbekovm, from @raimbekovm, adds an important note about predictor argument persistence.
A loaded model may reuse the same predictor across calls, so arguments like embed can persist unless explicitly reset, for example with embed=None.
That small note should help avoid confusing behavior in mixed model.embed() and model.predict() workflows.
Large docs link cleanup
PR #24915 by @raimbekovm, also from @raimbekovm, converts many internal documentation links from absolute URLs to relative links.
This improves the docs experience for:
- local builds
- GitHub previews
- translated and localized documentation
Why this release matters
v8.4.78 is a quality-of-life release, but an important one:
- lighter dependencies for easier installs

- better portability across environments

- no intended model behavior changes from the SciPy removal

- clearer advanced workflow docs for counting and embeddings

- better documentation navigation across previews and languages

What changed
- PR #24915 by @raimbekovm from @raimbekovm — use relative cross-file links across docs pages
- PR #24926 by @raimbekovm from @raimbekovm — document
embedargument persistence on the reused predictor - PR #24816 by @raimbekovm from @raimbekovm — restructure region counting guide around
RegionCounterusage - PR #24927 by @glenn-jocher from @glenn-jocher — remove SciPy from core dependencies
For the full diff, check the full changelog from v8.4.77 to v8.4.78, and you can browse the release directly on the Ultralytics v8.4.78 release page.
Try it out
Update with:
pip install -U ultralytics
Then let us know how it works in your workflows, especially if you rely on lightweight environments, tracking, RT-DETR, SAM, or counting pipelines.
Thanks as always to everyone contributing improvements, testing updates, and sharing feedback with the community ![]()