Releases: ultralytics/ultralytics
Release list
v8.4.127 - Load exported YOLO models with the correct task across all 20 formats (#25886)
🌟 Summary
🚀 v8.4.127 makes exported YOLO models reliably load with the correct task and model family, while improving deployment stability, training recovery, and dataset documentation.
📊 Key Changes
-
Correct task detection for exported models across all 20 formats by @artest08
- Model loading now reads the task and architecture information embedded in export metadata instead of guessing from the filename or directory path.
- Fixes segmentation exports being loaded as detection models, which previously caused masks to disappear.
- Fixes pose exports losing keypoint outputs when weights are moved outside their training directory.
- Correctly routes RT-DETR exports to the appropriate predictor, avoiding incorrect interpretation of its output format.
- Applies consistently through both the Python API and CLI, making exported models safer to copy, deploy, and rename. 🎯
-
Improved OpenVINO inference reliability
- Uses the appropriate throughput setting for single-device dynamic batching.
- Adds a targeted fix for INT8 dynamic-shape segmentation faults on Intel AMX CPUs.
- Reduces the risk of crashes in affected CPU inference and CI environments.
-
Safer training resume behavior
- Resuming a run no longer replaces checkpoint weights with a custom
pretrainedmodel. - Preserves the actual model state, optimizer, scaler, EMA, and epoch from
last.pt. - Restores distillation model handling during resume. 🔄
- Resuming a run no longer replaces checkpoint weights with a custom
-
More robust result handling
- Semantic segmentation and depth result indexing now preserves complete dense maps instead of accidentally returning only one image row.
- Improves iteration and indexing behavior for depth and semantic results.
-
Expanded CoreML export support
nms=Truenow works for segmentation and pose exports in addition to detection.- Keeps masks and keypoints aligned with the boxes retained after suppression. 🍎
-
Tracking and YOLOE fixes
- Corrects DeepOCSORT OCR appearance matching so zero-overlap objects are not incorrectly matched.
- Aligns TrackTrack new-track prediction and confirmation behavior with its reference implementation.
- Fixes YOLOE prompt-free segmentation training crashes during final validation.
-
Checkpoint and training reproducibility improvements
- Custom Albumentations transforms are serialized as portable text representations rather than live Python objects.
- YOLO26 documentation now explains the two-stage Objects365 pretraining and COCO fine-tuning process, embedded training logs, and checkpoint code revisions. 📚
-
More direct Ultralytics Platform dataset access
- Documentation now links official dataset pages for all 52 publicly hosted datasets, including detection, segmentation, pose, depth, and OBB resources.
- Users can preview samples, inspect statistics, clone datasets, annotate, train, and deploy through the Ultralytics Platform.
-
Documentation media delivery improvements
- Documentation images and animations now use the CMS assets CDN, improving link previews and reliability across tools such as Slack and Telegram.
- Several demonstrations were upgraded from static images to videos.
🎯 Purpose & Impact
- More dependable deployment: Exported models now retain their intended behavior even when renamed or moved into a different folder—a common step in production workflows.
- Correct predictions for specialized tasks: Segmentation masks, pose keypoints, and RT-DETR outputs are now handled by the correct predictors automatically.
- Fewer interrupted training runs: Resume behavior is safer, and OpenVINO fixes reduce crashes on supported Intel hardware.
- Better portability: Checkpoints containing custom augmentations can be loaded and shared more safely, although the original transform objects may still be needed when resuming with those augmentations.
- Broader Apple deployment options: CoreML users can now export segmentation and pose models with integrated NMS processing.
- Easier experimentation: Clearer YOLO26 training documentation and checkpoint metadata make it simpler to understand, reproduce, and fine-tune official models.
- A smoother dataset workflow: Exact Platform links make it faster to move from dataset discovery to annotation, training, and deployment. 🚀
What's Changed
- Link all official Platform datasets from Docs by @glenn-jocher in #25892
- Use correct OpenVINO throughput hint by @glenn-jocher in #25893
- Serve the docs media from the CMS assets CDN by @raimbekovm in #25884
- Ignore custom pretrained weights when resuming training by @Ajaysingh-2003 in #25816
- Preserve dense maps when indexing one-result Results by @JESUSROYETH in #25880
- fix: pass last-observation IoU to DeepOCSORT OCR appearance fusion by @JESUSROYETH in #25875
- Align TrackTrack New-track prediction and confirmation with the reference by @JESUSROYETH in #25877
- Fix YOLOE prompt-free segmentation training crash and re-enable the CLIP tests on Python 3.12 by @raimbekovm in #25867
- Document YOLO26 Objects365 pretraining and training curves by @Y-T-G in #25881
- Pick the YOLOE model and validator by task in the shared trainer by @raimbekovm in #25871
- Rewrite the YOLOE docs page and label the evaluation protocol on both LVIS result pages by @raimbekovm in #25856
- Fix OpenVINO INT8 dynamic-shape segfault on Intel AMX CPUs and replace dead docs link by @glenn-jocher in #25898
- Support nms=True for CoreML Segment and Pose exports by @SergioAlmeida29 in #25873
- Serialize custom augmentations losslessly in checkpoints by @Rahulbiradar9 in #25891
- Accept Path filenames in imread by @Kagura-Ahad in #25888
- Fit TQDM output to terminal width by @Y-T-G in #25166
- Stream live progress bar updates to console log consumers by @Y-T-G in #25900
- Load exported YOLO models with the correct task across all 20 formats by @artest08 in #25886
New Contributors
- @Ajaysingh-2003 made their first contribution in #25816
- @Kagura-Ahad made their first contribution in #25888
Full Changelog: v8.4.126...v8.4.127
v8.4.126 - Make restricted checkpoint loading thread-safe and 40% faster, simplify RLE prior (#25885)
🌟 Summary
v8.4.126 makes restricted checkpoint loading safer and up to 40% faster in concurrent environments, while simplifying RLE loss calculations and preserving backward compatibility.
📊 Key Changes
-
🔒 Thread-safe restricted checkpoint loading
- Fixed a race condition when multiple threads loaded PyTorch checkpoints with restricted loading enabled.
- The shared allow-list is now registered for the process lifetime instead of being temporarily removed when one thread finishes.
- Added a regression test covering 32 concurrent restricted loads.
-
⚡ Faster restricted model loading
- Only checkpoint globals actually referenced by a file are registered, rather than rebuilding a large allow-list for every load.
- This reduces restricted-loading overhead by approximately 40% in affected cases.
-
🛡️ Improved compatibility with secure loading
- Restricted loading now requires PyTorch functionality available from version 2.6 onward; older versions continue to fall back to standard loading behavior.
- Normal, unrestricted loading remains unchanged.
- Official YOLO26 checkpoints, including YOLO26x, are protected from failures caused by concurrent loading.
-
🧠 Simplified RLE prior calculation
- Replaced the runtime multivariate distribution object with a simpler closed-form implementation.
- Retained existing checkpoint buffers so models saved before v8.4.126 can still resume correctly.
- Improved numerical behavior under mixed-precision training.
-
🏷️ Version update
- Updated the Ultralytics package version from 8.4.125 to 8.4.126.
🎯 Purpose & Impact
- ✅ More reliable production inference: Multi-threaded services and Platform CPU workers can load models concurrently without intermittent checkpoint errors.
- 🚀 Reduced startup and loading time: Restricted checkpoint loading performs less unnecessary work, benefiting applications that frequently load models.
- 🔐 Maintained security benefits: Safe loading continues to limit checkpoint reconstruction to known, approved classes.
- 🔄 Backward compatible: Existing unrestricted workflows and older saved model checkpoints continue to work as before.
- 📉 Cleaner internal implementation: The RLE change removes unnecessary distribution-object overhead without changing the intended loss behavior.
What's Changed
- Make restricted checkpoint loading thread-safe and 40% faster, simplify RLE prior by @pderrenger in #25885
Full Changelog: v8.4.125...v8.4.126
v8.4.125 - Speed up initial model loading (#25883)
🌟 Summary
Ultralytics 8.4.125 makes YOLO26 model startup significantly faster—up to 46% faster in fresh Python processes—while improving dependency loading and documentation consistency. 🚀
📊 Key Changes
- ⚡ Faster initial model loading (PR #25883 by @pderrenger):
- TorchVision transforms are now imported only when a checkpoint actually contains them.
- Matplotlib is loaded only when semantic-training label plots are requested.
- Restricted checkpoint loading is substantially faster while retaining compatibility with older PyTorch versions.
- Official YOLO26n and YOLO26x checkpoints showed approximately 44–46% faster model loading on an Apple M5 Pro.
- Restricted loading improved from 451 ms to 94 ms for YOLO26n and from 517 ms to 162 ms for YOLO26x.
- The common
from ultralytics import YOLOimport also became faster, improving from 558 ms to 471 ms.
- 🧪 Expanded loading validation:
- Verified restricted loading across YOLO26 detection, classification, segmentation, pose, OBB, depth, and semantic checkpoints.
- Confirmed multiple model types can be loaded sequentially in one process.
- Tested compatibility with internal
torch.nncheckpoint classes.
- 📦 Package version updated from
8.4.124to8.4.125. - 🔗 Canonical Ultralytics URLs (PR #25879 by @pderrenger):
- Removed trailing slashes from Ultralytics URLs across 136 files, including documentation, examples, source code, configuration, and workflow files.
- Updated several outdated or redirected external links, including dataset, CUDA/cuDNN, MediaPipe, and PASCAL VOC references.
🎯 Purpose & Impact
- 🚀 Faster startup for developers and applications: Model-based scripts, services, notebooks, and command-line workflows begin running sooner, especially in fresh Python processes.
- 🪶 Lower unnecessary import overhead: Users who do not use semantic label plotting or serialized TorchVision transforms avoid loading those large optional dependencies.
- 🛡️ Safer and more reliable checkpoint handling: The updated loading logic preserves restricted loading behavior while supporting a broad range of official YOLO26 tasks and checkpoint formats.
- 🔄 Minimal migration impact: No major model architecture or training behavior changes are introduced; existing YOLO26 workflows should continue to work normally.
- 🧭 Cleaner documentation navigation: Consistent URL formatting and refreshed external links should reduce redirects, improve link maintenance, and provide more reliable access to guides.
What's Changed
- Remove trailing slashes from Ultralytics URLs by @pderrenger in #25879
- Speed up initial model loading by @pderrenger in #25883
Full Changelog: v8.4.124...v8.4.125
v8.4.124 - Restore dynamic image sizes for NMS exports (#25874)
🌟 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
v8.4.123 - Accept existing depth dataset formats (#25859)
🌟 Summary
Ultralytics 8.4.123 expands depth-estimation dataset compatibility, allowing standard scaled PNG and floating-point NPY depth maps to be used directly across training, NDJSON conversion, and Ultralytics Platform workflows. 🚀
📊 Key Changes
-
🗂️ Broader depth format support
- Accepts plain 16-bit grayscale PNG depth maps.
- Adds support for floating-point
.npydepth maps with values stored in meters. - PNG files no longer require Ultralytics-specific embedded metadata.
-
⚙️ Configurable depth scaling
- Adds the optional
depth_scaledataset YAML field. - Defaults to
1000, meaning PNG values are interpreted as millimeters. - Supports datasets with other conventions, such as KITTI (
256) and Virtual KITTI 2 (100).
- Adds the optional
-
🔗 Improved dataset pairing and validation
- Depth files are matched by filename stem in parallel
images/anddepth/directories. - PNG files are preferred, with automatic fallback to NPY files.
- Depth maps may use a smaller resolution than RGB images when their aspect ratios match.
- Invalid values, including zero, NaN, and infinity, are safely handled.
- Depth files are matched by filename stem in parallel
-
📥 NDJSON depth dataset support
- Depth records now only require a paired
depth.url. - Dataset-level
depth_scaleis preserved when converting NDJSON to YOLO format. - Large downloads are processed in batches to reduce memory usage.
- Depth records now only require a paired
-
☁️ Ultralytics Platform integration
- Depth datasets can now be uploaded, exported, and used for training on the Platform.
- NDJSON exports include the depth task, scaling configuration, and paired depth URLs.
- Depth estimation is now fully listed among the Platform’s supported task types.
-
🧰 Dataset configurations updated
- Built-in depth datasets now preserve their native storage scales instead of converting everything to meter-based metadata PNGs.
- Documentation and tests were updated for ARKitScenes, DIODE, KITTI, TartanAir, Virtual KITTI 2, Depth8, and other depth datasets.
🎯 Purpose & Impact
- ✅ Easier dataset adoption: Existing depth datasets can be used with less preprocessing and fewer custom conversion scripts.
- 📦 Simpler, more portable files: Plain PNG and NPY formats work with common tools and do not depend on special PNG metadata.
- 🎯 More accurate dataset handling: Dataset-specific scales preserve the intended precision and depth range.
- 🚀 End-to-end depth workflows: Users can now prepare, upload, convert, and train depth datasets through the Ultralytics Platform.
⚠️ Migration consideration: Older self-describing Ultralytics depth PNGs that rely on embedded metadata may need to be converted to the new scaled PNG format. See the depth dataset format documentation.
What's Changed
- Accept existing depth dataset formats by @glenn-jocher in #25859
Full Changelog: v8.4.122...v8.4.123
v8.4.122 - Use canonical PNG depth maps (#25858)
🌟 Summary
v8.4.122 standardizes Ultralytics depth estimation around compact, self-describing 16-bit PNG depth maps—simplifying the data pipeline and significantly reducing storage requirements. 🖼️📉
📊 Key Changes
- Canonical depth format introduced: Depth targets now use 16-bit PNG files with embedded metadata describing their meter range.
- Invalid pixels are clearly represented: Pixel value
0is reserved for missing or invalid depth values, allowing training and evaluation to ignore them safely. - New depth utilities added:
save_depth_png()writes depth maps in the required format.load_depth()reconstructs meter-valued depth maps for training and inference.
- NPY support removed: The depth loader, converters, manifests, path handling, and compatibility fallbacks no longer support
.npydepth maps. - Dataset support updated: Built-in depth dataset configurations and generators—including Depth8, NYU Depth, KITTI, SUN RGB-D, DIODE, Hypersim, TartanAir, Virtual KITTI 2, and ARKitScenes—now produce and consume PNG depth maps.
- NDJSON conversion updated: Depth records must use the
linear-u16PNG encoding contract. - Documentation and tests refreshed: Depth dataset guides, task documentation, reference pages, and validation tests now describe the PNG-only workflow.
- Smaller published archives:
- Depth8 archive reduced to approximately 8.9% of its previous size.
- NYU Depth archive reduced to approximately 39.6% of its previous size. 🚀
🎯 Purpose & Impact
- Lower storage and download costs: PNG compression substantially reduces dataset and hosted asset sizes.
- More portable depth files: Each PNG contains the information needed to interpret its depth values, making files easier to move, inspect, and process independently.
- Simpler, more consistent tooling: All supported depth datasets now follow one file format and one loading path.
- Improved browser/display behavior: The encoding preserves valid depth information when 16-bit assets are viewed through systems that reduce them to 8-bit displays.
- Important migration requirement: Existing custom datasets using
.npydepth maps must be converted to the new metadata-enabled PNG format before use with this release. Existing hosted depth assets also require the planned production migration; no runtime compatibility layer is included. - No major model architecture change: This release primarily improves the YOLO26-Depth data representation and dataset pipeline, rather than changing model structure or training objectives.
What's Changed
- Use canonical PNG depth maps by @glenn-jocher in #25858
Full Changelog: v8.4.121...v8.4.122
v8.4.121 - Fix OpenVINO INT8 detection head scope (#25841)
🌟 Summary
v8.4.121 improves OpenVINO INT8 export reliability for YOLO26 models while delivering broad Platform API, dataset, annotation, deployment, and documentation updates. 🚀
📊 Key Changes
-
Fixed OpenVINO INT8 detection-head handling by @glenn-jocher:
- Replaced fragile PyTorch-based layer matching with exact names from the converted OpenVINO graph.
- Keeps Detect decoding, DFL, and Sigmoid operations in floating point as intended.
- Preserves strict NNCF validation during quantization.
- Verified with a successful YOLO26n-P2 INT8 export using 55 exact ignored operations, with no unwanted
FakeQuantizenodes. ✅ - This directly addresses export failures reported in Sentry and is the most important change in this release.
-
Expanded Ultralytics Platform API documentation:
- Documented the generated
ultralytics-platformPython SDK alongside REST examples. - Updated endpoint paths, authentication, pagination, rate limits, response formats, and OpenAPI guidance.
- Added coverage for images, dataset ingestion, exports, storage integrations, billing, usage, trash, training, deployments, and account APIs.
- Clarified that workspace API keys have owner-level permissions and are managed by workspace owners.
- Documented the generated
-
Improved Platform dataset and annotation workflows 🏷️:
- Added clearer documentation for URL, cloud-storage, and On Premise dataset imports.
- Documented class merging/deletion, conflict handling, dataset readiness checks, clustering, version restore, and expanded annotation controls.
- Added support documentation for COCO and NDJSON imports, while clarifying that Pascal VOC XML labels are not imported.
- Documented annotation visibility controls, copy/paste workflows, and new keyboard shortcuts.
-
Updated Platform account, billing, and team documentation 💳:
- Added the Usage tab, detailed credit metering, monthly credit expiration, auto top-up behavior, seat billing, renewals, and downgrade effects.
- Clarified workspace roles, owner-only API keys, team invitations, seat reuse, ownership transfer, and team deletion.
- Expanded activity exports, trash permissions, storage usage, and account deletion guidance.
-
Improved deployment and inference documentation 🌐:
- Clarified dedicated endpoint lifecycle operations, authentication, rate limits, model replacement, health checks, metrics, logs, and capacity behavior.
- Documented video inference, endpoint-specific API references, depth response options, and generated deployment URLs.
-
Security and CI improvements 🔒:
- Prevented checkout credentials from being copied into Docker images.
- Moved workflow secrets into environment variables instead of embedding them in scripts.
- Updated self-hosted runner cleanup actions to v1.4.39.
- Reduced individual SlowTests attempts from 180 to 120 minutes while retaining one retry.
- Changed Dependabot GitHub Actions checks from daily to weekly.
-
Dependency and documentation maintenance 📚:
- Bumped the package version to 8.4.121.
- Allowed newer
setuptoolsand NNCF versions, including NNCF 3.x. - Updated Rust inference examples to
ultralytics-inference0.0.35. - Corrected task banners and documentation to consistently represent YOLO26’s supported task coverage.
🎯 Purpose & Impact
- More dependable edge deployment: YOLO26 users exporting INT8 models through OpenVINO should see fewer conversion failures and more predictable quantization behavior. ⚡
- Better model accuracy preservation: Keeping detection-head decode operations in floating point helps protect inference correctness while still applying INT8 compression elsewhere.
- Easier Platform automation: The updated REST contract and generated Python SDK documentation make it simpler to build integrations, manage datasets, start training, create exports, and operate deployments.
- Clearer team and billing behavior: Users can better understand permissions, shared workspace costs, credit expiration, seat charges, and training metering before taking action.
- More capable dataset preparation: New import, annotation, class-management, clustering, and versioning guidance supports more complete end-to-end computer vision workflows.
- Safer builds and more stable CI: Docker images are less likely to contain authentication credentials, while CI jobs are better protected against hangs and stale runner state. 🛡️
What's Changed
- Trainer by @AyushExel in #24
- Prevent checkout credentials from entering Docker images by @glenn-jocher in #25805
- Bump eviden-actions/clean-self-hosted-runner from v1.4.37 to v1.4.38 in /.github/workflows by @UltralyticsAssistant in #25811
- Update Platform docs to match current product and API contract by @glenn-jocher in #25808
- Bump ultralytics-inference version to 0.0.35 in documentation by @onuralpszr in #25818
- Fix spelling in Platform account settings by @UltralyticsAssistant in #25821
- Document the ultralytics-platform SDK across the Platform docs by @glenn-jocher in #25823
- Standardize .github configuration by @glenn-jocher in #25822
- Update the supported tasks banner and the task enumerations by @raimbekovm in #25807
- Bump eviden-actions/clean-self-hosted-runner from v1.4.38 to v1.4.39 in /.github/workflows by @UltralyticsAssistant in #25836
- Update setuptools requirement from <81.0.0 to <85.0.0 by @dependabot[bot] in #25826
- Update nncf requirement from <3.0.0,>=2.14.0 to >=2.14.0,<4.0.0 by @dependabot[bot] in #25825
- Bound SlowTests retry attempts by @glenn-jocher in #25839
- Fix OpenVINO INT8 detection head scope by @glenn-jocher in #25841
Full Changelog: v8.4.120...v8.4.121
v8.4.120 - Avoid nondeterministic CUDA anchor cumsum (#25806)
🌟 Summary
Ultralytics 8.4.120 improves CUDA training determinism and TensorFlow export reliability, while expanding documentation for LLM workflows and AI coding-agent integrations. 🚀
📊 Key Changes
-
Deterministic CUDA anchor generation by @glenn-jocher
- Replaced CUDA cumulative-sum operations with deterministic
arange-based generation when creating detection anchors. - Removes recurring
cumsum_cuda_kernelwarnings during deterministic training. - Preserves runtime device handling for traced and TorchScript GPU models, avoiding device information being incorrectly fixed during tracing.
- Replaced CUDA cumulative-sum operations with deterministic
-
More reliable TensorFlow exports 🛠️
- Removed the obsolete NVIDIA package index from TensorFlow and non-YOLO export dependency installation.
onnx-graphsurgeoncan now be installed directly from PyPI, reducing DNS and connectivity issues—especially in CPU-based CI environments and isolated export setups.
-
New Ultralytics LLM documentation 🤖
- Documents the OpenAI-compatible
LLMinterface for text, image, streaming, asynchronous, provider-specific, and YOLO-combined workflows. - Provides examples for OpenAI-compatible services such as DeepSeek, Kimi, Z.AI GLM, OpenRouter, and local servers.
- Updates the default documented and runtime model to
gpt-5.6-luna.
- Documents the OpenAI-compatible
-
New Agent Skills integration guide 🧩
- Documents the official
ultralytics/skillsrepository. - Covers AI-agent skills for model selection, datasets, training, tuning, inference, and export.
- Includes installation guidance for Claude Code, Codex, and other compatible agents.
- Documents the official
-
Version update
- Bumped the Ultralytics package version from
8.4.119to8.4.120.
- Bumped the Ultralytics package version from
🎯 Purpose & Impact
- ✅ Cleaner deterministic training logs: Users no longer see repeated CUDA cumsum warnings that can obscure important training messages.
- ✅ More predictable model tracing: TorchScript and traced GPU models retain runtime device behavior without sacrificing the deterministic anchor-generation fix.
- ✅ Smoother TensorFlow export setup: Fewer external package-index dependencies should improve export reliability in restricted networks, CI pipelines, and CPU-only environments.
- ✅ Better LLM discoverability: Developers can more easily connect YOLO detection results with language and vision models through a consistent interface.
- ✅ Improved AI-assisted development: Agent Skills provide structured, workflow-specific guidance for using Ultralytics tools with supported coding agents.
- ℹ️ No major model architecture changes were introduced in this release; the primary technical improvement is improved determinism and export robustness.
What's Changed
- Document the OpenAI-compatible LLM interface by @onuralpszr in #25789
- Document Ultralytics Agent Skills by @JaviChulvi in #25787
- Avoid nondeterministic CUDA anchor cumsum by @glenn-jocher in #25806
New Contributors
- @JaviChulvi made their first contribution in #25787
Full Changelog: v8.4.119...v8.4.120
v8.4.119 - Enable OpenVINO NPU_TURBO for classification models on supported NPUs (#25784)
🌟 Summary
v8.4.119 improves Intel NPU classification performance with OpenVINO, strengthens detection and tracking reliability, expands Platform integration, and refreshes documentation and developer tooling. 🚀
📊 Key Changes
-
⚡ OpenVINO NPU_TURBO for classification
- Enables
NPU_TURBOautomatically for classification models running on supported Intel NPU devices. - Applies only when the device advertises support, preserving existing behavior for other tasks, devices, and drivers.
- Measured classification latency improvements of approximately 42–52% on an Intel Core Ultra 9 185H, with bit-identical accuracy across tested configurations.
- Turbo mode is intentionally limited to classification because larger image sizes showed little benefit and could consume unnecessary power.
- Enables
-
🔌 Platform SDK exposed from
ultralytics- Python 3.11+ users can access
Platform,AsyncPlatform,APIError, andAPIConnectionErrordirectly from the main package. - Imports are lazy, so the SDK is loaded only when needed.
- Python 3.8–3.10 users receive a clear compatibility message when requesting Platform exports.
- Python 3.11+ users can access
-
🛰️ More efficient Platform training callbacks
- Subsequent metrics, telemetry, and model uploads now reuse the registered model ID instead of repeatedly resolving project and model names.
- Reduces internal Platform traffic and improves reliability during long training runs.
-
🛡️ Improved tracking robustness
- BYTETracker now ignores detections with zero or negative width or height before creating tracks, preventing invalid Kalman filter states.
- Kalman filter operations were simplified to use direct slicing instead of unnecessary matrix operations.
- Removed redundant array copies in multi-object tracking paths.
-
🎯 Safer detection export postprocessing
- Detection top-k selection is now limited to the number of available anchors.
- Prevents export failures on very small input sizes while preserving normal behavior for standard inputs.
-
🧩 Corrected CopyPaste augmentation probability
- The
CopyPastetransform now respects its configured probability in flip mode. - Previously, eligible images could receive the augmentation unconditionally.
- The
-
📚 Documentation and usability updates
- Updated supported-task banners to cover all seven supported tasks, including semantic segmentation and depth estimation.
- Added the
Cmd/Ctrl+Deleteimage-deletion shortcut to the Platform annotation guide. - Added a YOLO26 LiteRT export and mobile deployment tutorial video.
- Restored light, dark, and system theme controls in the documentation.
- Removed documentation embeds that did not render correctly on the live site.
- Improved ASCII string checks using Python’s built-in string operation for faster annotation rendering.
-
🧰 CI maintenance
- Updated the self-hosted runner cleanup action used across several CI jobs.
🎯 Purpose & Impact
- 🚀 Faster edge inference: Supported Intel NPU users running classification models should see substantially lower latency without sacrificing accuracy.
- 🔋 Better power awareness: Restricting turbo mode to classification avoids enabling a potentially costly optimization where it provides little practical benefit.
- 🤝 Simpler Platform development: Python 3.11+ applications can use Platform SDK functionality through familiar top-level
ultralyticsimports. - 📈 More reliable training runs: Model ID reuse reduces repeated lookup work and supports smoother metric streaming and checkpoint uploads.
- 🛡️ Fewer runtime and export failures: Invalid tracking boxes and small-input detection exports are handled safely instead of producing corrupted states or indexing errors.
- 🎛️ More predictable augmentation: CopyPaste now behaves according to its documented probability setting.
- 🌐 Improved user experience: Refreshed documentation, working theme controls, clearer task coverage, and better Platform guidance make the ecosystem easier to use for both new and experienced users.
What's Changed
- Update supported tasks banner by @raimbekovm in #25788
- Document Platform image delete shortcut by @glenn-jocher in #25791
- Use model IDs for Platform training callbacks by @glenn-jocher in #25793
- Bump eviden-actions/clean-self-hosted-runner from v1.4.36 to v1.4.37 in /.github/workflows by @UltralyticsAssistant in #25797
- Add https://youtu.be/FmgrfmZlhpY to docs by @RizwanMunawar in #25795
- Expose Platform SDK from ultralytics by @glenn-jocher in #25800
- Restore dark theme palette in docs configuration by @onuralpszr in #25802
- Replace the per-character
is_asciiloop withstr.isascii()by @raimbekovm in #25801 - Remove the two docs embeds that do not render on the live site by @raimbekovm in #25792
- fix: add probability guard to CopyPaste in flip mode by @Rahulbiradar9 in #25796
- Clamp detection top-k to available anchors by @Dorablank in #25771
- Replace selection-matrix matmuls with direct slicing in the Kalman filter by @JESUSROYETH in #25770
- Reject zero/negative-height detections before track creation in
BYTETrackerby @JESUSROYETH in #25769 - Enable OpenVINO NPU_TURBO for classification models on supported NPUs by @synml in #25784
New Contributors
- @Dorablank made their first contribution in #25771
Full Changelog: v8.4.118...v8.4.119
v8.4.118 - Add standalone LLM model interface (#25761)
🌟 Summary
Ultralytics v8.4.118 introduces a standalone OpenAI-compatible LLM interface alongside YOLO, while improving OBB training, dataset handling, model training reliability, and documentation workflows. 🚀
📊 Key Changes
-
🤖 New standalone
LLMmodel interface by @glenn-jocher- Add
from ultralytics import LLMfor text and image-based language-model requests. - Supports OpenAI Responses and Chat Completions APIs, including synchronous and asynchronous calls.
- Accepts images from local paths, URLs, data URLs, NumPy arrays, and PIL images.
- Supports reusable prompts, request overrides, conversation state, API keys, and OpenAI-compatible service endpoints.
- Uses the optional
openaidependency and remains independent of Ultralytics Platform and workflow-runtime components.
- Add
-
📐 Improved oriented bounding box training
- Mosaic, CutMix, and RandomPerspective now preserve OBB orientation when objects are clipped by image boundaries.
- Prevents clipped objects from receiving incorrect rotation angles during training.
-
⚡ Faster CopyPaste augmentation
- Batches instance concatenation instead of repeatedly copying growing arrays.
- Reduces unnecessary processing overhead, especially when many objects are copied.
-
🧠 More reliable YOLOE behavior
- Validates visual prompts before modifying model state.
- Accepts flat prompts for supported batched image sources.
- Rejects invalid string class labels and mismatched vocabularies earlier with clearer errors.
- Preserves gradient settings when converting YOLOE convolution layers to linear layers.
-
🏋️ Training and inference stability fixes
- Correctly resets dataloader workers when resuming after Mosaic augmentation is closed.
- Allows repeated
train()andtune()calls on the same model object. - Prevents duplicate World model callbacks across multi-dataset training.
- Fixes classification prediction for models without predefined transforms.
- Ensures classification validation loaders do not discard samples when compiling.
- Fixes SAM and related predictor models being created with incompatible inference-only tensors.
-
🗂️ Dataset and prediction improvements
- Classification auto-splitting now recognizes all supported image formats, including JPEG, BMP, WebP, TIFF, AVIF, HEIC, and uppercase extensions.
- Missing classification images now raise a clear
FileNotFoundErrorinstead of failing later with an unrelated directory error. - Preserves original filenames when loading images after EXIF correction.
- Keeps bounding-box fallbacks for malformed grounding segmentation labels.
-
📚 Documentation and deployment updates
- Standardizes strict documentation validation on Zensical and updates contributor instructions.
- Documentation redeployment now detects Python docstring and all configuration-file changes.
- Restores model benchmark chart placeholders, including for YOLO26, while moving production site features to the centralized publisher.
- Documents replacing the model behind an existing deployment without changing its endpoint URL, API key, or deployment identity.
- Updates Albumentations examples for current 2.x constructor names and refreshes the Rust inference dependency to
0.0.34. - Adds API reference documentation for the new
LLMinterface.
🎯 Purpose & Impact
- 🚀 Broader AI capabilities: Developers can now use Ultralytics as a unified entry point for YOLO vision models and OpenAI-compatible language models, including multimodal image understanding.
- 🔌 Flexible integration: The new
LLMclass works with OpenAI and compatible providers without requiring Platform or workflow features. - 🎯 Better OBB accuracy: Rotated-object datasets should receive more consistent training targets when augmentation crops objects at image edges.
- ⚡ Improved performance: CopyPaste augmentation can run more efficiently, particularly on images containing many instances.
- 🛡️ More predictable training: Resume, compile, repeated training, World models, SAM, and classification workflows are less likely to produce silent errors or invalid results.
- 🧰 Easier maintenance: Broader dataset format support, clearer validation errors, and more accurate documentation reduce setup and debugging time for users.
What's Changed
- Preserve OBB orientation through clipped augmentations by @Nikhi00718 in #25723
- Redeploy docs when Python or cfg sources change by @glenn-jocher in #25733
- Standardize Docs validation on Zensical by @glenn-jocher in #25736
- Simplify strict Docs validation and restore model charts by @glenn-jocher in #25738
- Document deployment model replacement by @glenn-jocher in #25745
- Remove the YOLO11 podcast audio embed by @raimbekovm in #25765
- Align grounding segmentation fallback by @raimbekovm in #25743
- Batch the concatenation loop in CopyPaste.apply_instances to avoid O(n^2) growth by @JESUSROYETH in #25732
- Update the Albumentations examples to the 2.x constructor arguments by @raimbekovm in #25759
- Standardize export data defaults by @raimbekovm in #25742
- Cache external test assets before pytest by @glenn-jocher in #25737
- Accept all image formats in classification auto-split and report missing images instead of crashing by @doublecurry in #25749
- Validate yoloe visual prompts by @raimbekovm in #25744
- Reject a short YOLOE vocabulary before the head is re-parameterized by @raimbekovm in #25747
- Build loaded models outside inference mode by @raimbekovm in #25748
- Register the World pretrain hook once per model by @raimbekovm in #25758
- Build the name=model save directory from the model stem by @raimbekovm in #25763
- Reset dataloader workers when resuming after mosaic closure by @JESUSROYETH in #25762
- Restore the model override after training by @raimbekovm in #25760
- Fix:
autocast_listloses image filename afterexif_transposeby @Q-qqq in #25741 - Fix classification predict crash when the model has no transforms by @ahmet-f-gumustas in #25735
- Build SAM predictor models outside inference mode by @raimbekovm in #25756
- fix: only apply
drop_lastto the classify train loader undercompile, not val by @JESUSROYETH in #25734 - Revert "Build loaded models outside inference mode" by @glenn-jocher in #25768
- Name the ImageNet pseudo-label teacher checkpoints and correct stored dtype by @Bovey0809 in #25754
- Bump ultralytics-inference docs version to 0.0.34 by @onuralpszr in #25778
- Add standalone LLM model interface by @glenn-jocher in #25761
New Contributors
- @doublecurry made their first contribution in #25749
Full Changelog: v8.4.117...v8.4.118