π Summary
v8.4.117 improves augmentation correctness, model reliability, deployment safety, and documentation across Ultralytics YOLO and YOLO26. π
π Key Changes
-
π§© Albumentations now handles spatial transforms by type
- PR #25633 replaces the fragile hardcoded transform-name list with recursive type detection, so wrapped transforms such as
OneOfcorrectly update annotations. - Spatial augmentations now carry bounding boxes, polygons, masks, depth maps, and keypoints through the pipeline.
- Background-only images receive pixel-level augmentations even when they have no annotations.
- Keypoint flipping respects the configured
flip_idxmapping. - Probability handling now makes a zero probability a reliable off switch.
- Unsupported topology-changing transforms, such as grid shuffling with polygons or keypoints, are detected instead of silently corrupting labels.
- PR #25633 replaces the fragile hardcoded transform-name list with recursive type detection, so wrapped transforms such as
-
π Improved security for dependency installation
check_requirements()now prevents untrusted requirement strings from being interpreted as shell commands.- This protects workflows that automatically install missing dependencies while loading model files.
-
π‘οΈ More reliable dataset and mask processing
- Fixed Windows semantic-mask shape handling so grayscale masks remain two-dimensional and semantic training no longer fails during Mosaic augmentation.
- COCO conversion now keeps one consistent label format per file, warns about unusable polygons, and falls back to box-shaped polygons when necessary.
- Mixed detection and segmentation rows are rejected instead of being silently misread.
- Grounding dataset caching and validation were improved, including clearer errors for empty or invalid annotation sets.
- Degenerate polygon contours are skipped when exporting labels.
-
π§ Depth estimation improvements
- Depth postprocessing now aligns PyTorch, Hailo, and exported-model outputs before removing padding, producing more consistent results across inference backends.
- Depth validation no longer inherits rectangular batching behavior that conflicts with its intentional square stretching.
- The KITTI depth configuration now uses the canonical 652-frame left-camera evaluation split, avoiding test-set overlap and making reported results more reproducible.
- Depth metrics and documentation were updated to reflect per-image evaluation behavior.
-
β‘ Faster and more consistent inference
- YOLO26 end-to-end postprocessing uses grouped top-k selection, improving TensorRT FP16 latency by approximately 1.8% to 8.1% without changing mAP.
- RT-DETR FLOPs profiling is faster and now supports attention-based decoder architectures correctly.
- SavedModel INT8 calibration avoids an unnecessary NumPy copy.
- GMC tracking now handles textureless frames and incomplete feature matches without stopping, allowing tracking to recover cleanly.
- SAM3 video masks use the modelβs configured threshold consistently instead of a fixed threshold.
-
π― Expanded model and training support
- Pose training now accepts dataset-defined
kpt_oks_sigmas, with validation that the configuration matches the modelβs keypoint count. - OBB utilities handle empty inputs more safely, and documentation clarifies long-edge canonicalization and prediction formats.
- Predictors now report unsupported options such as augmentation, embeddings, and visualization instead of silently ignoring them.
- Cached predictors are refreshed after training so predictions use the newly trained weights and class names.
- Embedding requests now provide clearer errors for exported or third-party models that do not expose compatible internal layers.
- YOLOE class and visual-prompt validation was strengthened, supporting more reliable prompt-free vocabulary workflows.
- Pose training now accepts dataset-defined
-
π Documentation and platform updates
- Export documentation now covers additional options such as
name,split,conf,iou,max_det, andagnostic_nms. - Classification dataset inputs are consistently documented as directories or built-in dataset names rather than YAML files.
- Added reusable depth-speed comparison documentation and a new YAML2ModelGraph integration guide for generating YOLO architecture diagrams from model YAML files.
- Added Platform troubleshooting guidance for datasets, training, deployment, billing, and common questions.
- FAQ and supporting sections were reorganized for more consistent documentation rendering.
- Rust inference documentation now references
ultralytics-inferenceversion0.0.33. - Documentation publishing is now restricted to the
mainbranch to prevent accidental production releases.
- Export documentation now covers additional options such as
π― Purpose & Impact
- β More trustworthy augmentation: Labels and auxiliary data remain aligned when using custom or nested Albumentations pipelines, reducing silent training errors.
- π§ͺ Better training stability: Depth, semantic segmentation, pose, OBB, grounding, and tracking workflows handle edge cases more gracefully.
- π Improved deployment performance: YOLO26 TensorRT exports can achieve lower postprocessing latency, while depth predictions behave more consistently across backends.
- π Safer model loading: Dependency checks no longer expose shell execution risks through malicious requirement strings.
- π More reproducible evaluation: The corrected KITTI split and clarified depth metrics make comparisons easier to interpret, although results from older downloaded datasets may require rebuilding.
- π Clearer user experience: Updated documentation explains task-specific inputs, export controls, model limitations, and platform troubleshooting in more practical terms.
What's Changed
- Bump eviden-actions/clean-self-hosted-runner from v1.4.35 to v1.4.36 in /.github/workflows by @UltralyticsAssistant in #25711
- Bump ultralytics-inference version to 0.0.33 in documentation by @onuralpszr in #25712
- Publish docs only from main by @glenn-jocher in #25713
- Move the Depth Anything V2 speed table into a docs macro by @raimbekovm in #25715
- Fix Windows semantic mask shape regression by @Y-T-G in #25721
- Document the predictor data attribute as the args copy it holds by @raimbekovm in #25692
- Threshold SAM3 video semantic masks at the model logit threshold by @JESUSROYETH in #25643
- Fix shell injection in check_requirements() via untrusted requirement strings by @Zenka737 in #25720
- Document max_det, iou, conf export arguments by @raimbekovm in #25675
- feat: clarify confusion matrix confidence threshold during validation by @Rahulbiradar9 in #25677
- fix GMC empty descriptor handling by @Nikhi00718 in #25709
- Fix redundant SavedModel INT8 calibration copy by @amanharshx in #25639
- Fix depth val silently overriding its own stretch letterbox with inherited
rect=Trueby @JESUSROYETH in #25646 - Document the OBB long-edge canonicalization, convert empty box inputs, and skip degenerate segment contours by @raimbekovm in #25655
- Use the Hailo Model Zoo quantization recipe for YOLO26 HEF export by @nivosco in #25687
- Document the confidence threshold used for the val confusion matrix (#25674) by @Parth1353 in #25722
- Write one label format per file in convert_coco and document the classification data input by @raimbekovm in #25672
- Grouped topk e2e postprocess by @artest08 in #25666
- Speed up RT-DETR FLOPs profiling by @Daniiiil1 in #25652
- Document missing export and predict arguments and the classification data directory by @raimbekovm in #25690
- Support optional kpt_oks_sigmas in v8PoseLoss for training by @cosmo-gb in #25656
- Name the classification input in the export calibration, benchmark and tuner data rows by @raimbekovm in #25698
- Report unimplemented predict arguments, refresh the predictor after training, and register tracker callbacks once per model by @raimbekovm in #25688
- Remove brittle Hailo model-specific recipe by @glenn-jocher in #25728
- Move documentation FAQs to page ends by @glenn-jocher in #25730
- Use Ultralytics YOLO in task page titles and lead copy by @miles-deans-ultralytics in #25705
- Align depth postprocessing across inference backends by @JESUSROYETH in #25628
- Validate YOLOE classes and enable prompt-free vocabulary workflows by @raimbekovm in #25691
- Fix grounding label scanning, caching, and reporting by @raimbekovm in #25678
- Fix the KITTI Eigen test split: 3 test drives were in train by @JESUSROYETH in #25650
- Fix unbounded per-track solution state in continuous streams by @JESUSROYETH in #25729
- docs: add YAML2ModelGraph integration documentation by @Rahulbiradar9 in #25726
- Average DepthMetrics per image instead of pooling every valid pixel by @JESUSROYETH in #25648
- Gate
DepthLoss26gradient pyramids per image by @JESUSROYETH in #25637 - Route spatial Albumentations by type and carry masks, polygons and keypoints through it by @raimbekovm in #25633
New Contributors
- @Parth1353 made their first contribution in #25722
- @Nikhi00718 made their first contribution in #25709
- @nivosco made their first contribution in #25687
- @Daniiiil1 made their first contribution in #25652
Full Changelog: v8.4.116...v8.4.117