🌟 Summary
📊 v8.4.109 improves profiling accuracy, export reliability, inference efficiency, tracking stability, and Ultralytics Platform integrations—led by correctly reporting GFLOPs for the actual training image size.
📊 Key Changes
-
Accurate GFLOPs logging at training resolution 🎯
model_info_for_loggers()now passes the trainer’s actualimgszto FLOPs profiling.- Logging integrations—including W&B, Comet, ClearML, DVC, Neptune, HUB, and Platform—no longer report the default 640-pixel GFLOPs for every run.
- Classification and other models with size-independent operations also receive more accurate measurements through the updated
ultralytics-thopdependency.
-
Improved model fusion and profiling ⚙️
model.fuse()now accepts animgszargument so reported model information matches the intended input resolution.- Export workflows pass the export image size during fusion and profiling.
-
More reliable INT8 calibration 📦
- Classification exports now honor the
fractionsetting when selecting calibration images. - OpenVINO INT8 calibration uses the complete requested calibration dataset instead of silently limiting calibration to NNCF’s default 300 batches.
- Classification exports now honor the
-
Faster and more efficient mask plotting 🖼️
- Removed an unused GPU image construction and unnecessary tensor allocations.
- Mask rendering now avoids redundant resizing and host-to-device transfers, reducing memory use and plotting overhead.
-
Inference warmup now uses the real input shape 🔥
- Predictors warm up using the first preprocessed input rather than a fixed square dummy image.
- This better supports rectangular images, tensor sources, dynamic shapes, and shape-specialized backends.
-
Training recovery behavior made safer 🛡️
- Healthy runs are no longer stopped simply because an early validation fitness value rounds to zero.
- Recovery remains enabled for genuine NaN or infinite loss and fitness values.
-
Tracking and numerical stability improvements 🚦
- ReID embeddings are consistently processed as float32 for more dependable association decisions.
- Embedding-distance calculations use the appropriate dtype precision.
- macOS tracking workflows avoid spurious NumPy warnings and can run faster during covariance updates.
-
Heatmap and validation performance improvements 📈
- Heatmap regions are drawn once per frame, preventing flicker when no objects are tracked and avoiding repeated work.
- Confusion-matrix matching replaces repeated array scans with direct lookups.
-
Expanded Ultralytics Platform documentation and integrations 🌐
- Added Labelbox import documentation, including direct NDJSON upload workflows.
- Added coming-soon documentation for CVAT and Label Studio integrations, with supported YOLO export paths available today.
- Updated Cityscapes guidance and removed broken Platform dataset links.
- For dataset annotation, training, and deployment, users can use Ultralytics Platform.
-
System and CI maintenance 🧰
- Removed stale persistent CPU-name caching and the macOS subprocess probe.
- CI now tests newer OpenVINO Conda packages and uses
actions/stale@v11. - Cleaned up augmentation documentation image sizing for consistent rendering.
🎯 Purpose & Impact
- ✅ More trustworthy experiment tracking: GFLOPs now reflect the resolution actually used for training or export, making model comparisons and resource estimates more meaningful.
- 🚀 Better deployment preparation: INT8 calibration respects user-selected data limits and OpenVINO can use the full requested calibration set, potentially improving quantization quality.
- ⚡ Lower inference and visualization overhead: Real-shape warmup and optimized mask plotting can reduce first-inference delays, memory use, and unnecessary computation.
- 🛡️ Fewer unexpected failures: Valid early-stage training runs are less likely to be incorrectly treated as corrupted, while real numerical failures still trigger recovery.
- 🎥 More stable tracking outputs: ReID precision and macOS matrix-operation fixes improve consistency and reduce distracting runtime warnings.
- 🌍 Simpler dataset workflows: New Platform integration guidance helps users move data from labeling tools into annotation, training, and deployment workflows with fewer conversion steps.
What's Changed
- Remove discarded im_gpu build and reduce mask plotting allocations by @onuralpszr in #25454
- Bump actions/stale from 10 to 11 in /.github/workflows by @dependabot[bot] in #25471
- Remove OpenVINO version constraint in conda CI environment by @onuralpszr in #24366
- Add Labelbox, CVAT, and Label Studio Platform integration docs by @glenn-jocher in #25464
- Fix stale cached CPU name and remove the subprocess probe by @glenn-jocher in #25478
- Remove broken Platform links by @raimbekovm in #25479
- Fit the size-independent term in
get_flopsby @JESUSROYETH in #25468 - Draw the
Heatmapcounting region once per frame instead of once per object by @JESUSROYETH in #25467 - Replace the per-object array scans in
ConfusionMatrix.process_batchwith a lookup by @JESUSROYETH in #25466 - Fix INT8 export calibration ignoring
fractionfor classify models by @synml in #25469 - Calibrate OpenVINO INT8 on the full dataset instead of nncf's 300-batch default by @synml in #25470
- Preserve embedding distance dtype by @raimbekovm in #25482
- Pin float32 when stacking TrackTrack ReID embeddings by @raimbekovm in #25475
- Keep the gmc covariance warp operand c-contiguous by @raimbekovm in #25473
- Drop hand-tuned image widths from the augmentation guide tables by @raimbekovm in #25472
- Warm up the predictor on the real input shape by @glenn-jocher in #25477
- Stop killing healthy runs on fitness collapse; stop orphaned console capture by @glenn-jocher in #25486
- Log GFLOPs at the training
imgszby @JESUSROYETH in #25483
Full Changelog: v8.4.108...v8.4.109