New Release: Ultralytics v8.4.78

:rocket: 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 :feather:, 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.


:glowing_star: Highlights

:feather: 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 :white_check_mark:

:package: 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

:books: Documentation improvements

:bullseye: 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.

:memo: 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.

:link: 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

:hammer_and_wrench: Why this release matters

v8.4.78 is a quality-of-life release, but an important one:

  • lighter dependencies for easier installs :high_voltage:
  • better portability across environments :globe_showing_europe_africa:
  • no intended model behavior changes from the SciPy removal :white_check_mark:
  • clearer advanced workflow docs for counting and embeddings :robot:
  • better documentation navigation across previews and languages :open_book:

:clipboard: What changed

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.


:raising_hands: 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 :blue_heart: