🌟 Summary
🚀 Ultralytics v8.4.124 restores reliable dynamic-size inference for exports with embedded NMS, while improving training stability, deployment compatibility, performance, and documentation.
📊 Key Changes
-
Dynamic NMS exports restored — PR #25874
- ONNX, OpenVINO, and TensorRT exports with
dynamic=Trueandnms=Trueonce again support runtime image heights and widths. - Exported NMS now consistently respects the configured
max_detlimit instead of using the number of anchors from the export image size. - NMS coordinate normalization now uses the actual input dimensions at inference time.
- Dynamic ONNX OBB exports are padded appropriately so candidate selection is not limited by the traced image size.
- The existing export test matrix remains unchanged, preserving broad backend coverage.
- ONNX, OpenVINO, and TensorRT exports with
-
Improved CoreML attention export
- CoreML
mlprogramexports now use a more compatible attention implementation to avoid GPU compilation crashes on recent Apple systems. - This is scoped to CoreML export and does not alter normal model execution.
- CoreML
-
More efficient RT-DETR training and TensorRT inference
- RT-DETR denoising queries are capped at the configured query budget, preventing dense images from causing excessive memory use.
- RT-DETR TensorRT Top-K processing now uses grouped selection for faster candidate filtering.
-
Training reliability fixes
- Resumed training now preserves the weights from the checkpoint instead of accidentally reloading the original pretrained weights.
- Training seeds now reach dataloader workers, making different seeds produce different augmentation and sampling sequences while preserving reproducibility.
- Dataset construction no longer mutates shared training configuration values.
- Deterministic training settings are always cleared when training finishes or fails.
- AutoBatch now raises a clear error when no tested batch size fits, rather than silently falling back to an unrelated default.
-
Prediction and result-processing improvements
- Reusing a model for
predict()ortrack()no longer carries filters such asclasses,max_det, or NMS settings into later calls. - GPU-to-CPU transfers in
Results.save_txt(),save_crop(), andsummary()are consolidated, reducing per-object synchronization overhead. - Segmentation mask encoding now transfers data to the CPU more efficiently.
- Depth tensor inputs now use the expected BGR image order.
- Coordinate restoration now handles stretched, nonuniform resizing correctly.
- Reusing a model for
-
Export and platform updates
- ONNX INT8 export uses less peak memory by releasing intermediate graphs earlier.
- TensorRT dynamic optimization profiles now handle dynamic input dimensions more safely.
- macOS dependency constraints avoid affected NumPy releases associated with Accelerate warnings.
- Platform documentation now describes depth datasets, depth-map viewing, training requirements, and updated workflow behavior.
- Hailo documentation now reflects current hardware names, AI HAT+ support, compiler generations, precision notes, and fixed-shape deployment requirements.
- Tracking documentation now identifies TrackTrack as the default tracker for documented workflows.
- CoreML documentation includes an updated YOLO26 INT8 deployment tutorial.
🎯 Purpose & Impact
- More dependable deployment across input sizes 📐 — Dynamic exported models can process images at runtime sizes without silently bypassing confidence filtering or the
max_detlimit. - Correcter detections and coordinates 🎯 — Runtime-aware normalization and nonuniform scaling fixes help ensure boxes, keypoints, and OBB predictions remain accurately positioned.
- Lower memory use and faster execution ⚡ — RT-DETR query capping, grouped Top-K selection, consolidated GPU transfers, and improved ONNX memory handling benefit both training and inference.
- Safer long-running workflows 🔁 — Reused prediction models, resumed training, seeded dataloaders, and deterministic settings now behave more predictably.
- Better edge and Apple deployment 🍎📦 — CoreML and Hailo export guidance and compatibility improvements make it easier to move YOLO models to supported hardware.
- Clearer user guidance 📚 — Updated documentation better reflects actual defaults, supported tasks, deployment limitations, and Platform workflows.
What's Changed
- Add https://youtu.be/KcTSdIUYcVE to docs by @RizwanMunawar in #25844
- Document the effective export defaults for verbose and imgsz by @raimbekovm in #25831
- Fix depth tensor source color order by @ahmet-f-gumustas in #25833
- Cap RT-DETR denoising queries at the query budget by @artest08 in #25834
- Document the defaults Solutions actually apply by @raimbekovm in #25835
- Align Platform workflow diagrams with the product by @raimbekovm in #25840
- Use
perf_counter()forProfileModelsandtime_sync()latency measurement by @raimbekovm in #25845 - Document Windows multi-GPU DDP limitation by @diaz3z in #25850
- Fix nonuniform ratio-pad coordinate scaling by @tandede in #25855
- Avoid per-box GPU syncs in
Results.save_txt/save_crop/summaryby @JESUSROYETH in #25842 - Fix hyp aliasing so dataset construction cannot mutate the shared cfg by @SergioAlmeida29 in #25863
- fix(engine): keep resumed checkpoint weights when resuming training by @Sigwendice in #25854
- Fix macOS metadata directory cleanup by @uczltw6 in #25857
- Always unset deterministic state when training ends by @Y-T-G in #25862
- perf: pack mask RLE indices and transfer to CPU once in SegmentationValidator by @JESUSROYETH in #25853
- Fix nms=True export silently dropping detection filtering under dynamic=True by @JESUSROYETH in #25843
- Document depth dataset support across the Platform docs by @laodouya in #25849
- Restore the
copy_pastecandidate fraction by @raimbekovm in #25810 - Exclude affected NumPy versions on macOS by @raimbekovm in #25848
- Fix CoreML GPU compile crash in attention export by @Y-T-G in #25860
- Reduce peak memory during ONNX INT8 export by @amanharshx in #25817
- Map semantic mask labels with a 256-entry lookup table by @raimbekovm in #25813
- Speed up RT-DETR top-k on TensorRT by @artest08 in #25755
- Raise a clear error in
autobatch()when no candidate batch size fits by @JESUSROYETH in #25739 - Fix #25764: Don't send local project paths as Platform slugs by @altf4-games in #25824
- Fix predict()/track() kwargs sticking across reused calls on the same model by @JESUSROYETH in #25731
- Refresh Hailo integration docs: hardware overview, product naming, and resource links by @eldadr in #25786
- Make
seedreach dataloader workers so augmentations vary between runs by @yentur in #25815 - Add optional channel_divisor model YAML key for channel rounding control by @HussainNizamani in #25423
- Add https://youtu.be/3Z0_Fxhm030 to docs by @RizwanMunawar in #25866
- Simplify Platform project path slugging by @glenn-jocher in #25869
- Restore balanced Hailo deployment guidance by @glenn-jocher in #25868
- Revert optional channel_divisor model YAML key by @glenn-jocher in #25870
- Restore dynamic image sizes for NMS exports by @glenn-jocher in #25874
New Contributors
- @HussainNizamani made their first contribution in #25423
- @SergioAlmeida29 made their first contribution in #25863
- @yentur made their first contribution in #25815
- @eldadr made their first contribution in #25786
- @tandede made their first contribution in #25855
- @uczltw6 made their first contribution in #25857
- @altf4-games made their first contribution in #25824
- @Sigwendice made their first contribution in #25854
Full Changelog: v8.4.123...v8.4.124