Releases: ultralytics/ultralytics
v8.3.149 - `ultralytics 8.3.149` Fix group-convolutions export bug for Edge TPU (#20919)
🌟 Summary
This release enhances model export compatibility, improves usability for video and visualization workflows, and expands documentation and reporting features across Ultralytics tools. 🚀
📊 Key Changes
- Export Fix for EdgeTPU & TF.js: Resolved a bug that caused errors when exporting models with group convolutions to EdgeTPU and TensorFlow.js formats. Group convolutions are now automatically disabled for these exports.
- Video Stream Handling Improvements: Refined how video streams and OpenCV windows are managed, preventing unwanted window closures and making quitting streams more reliable.
- Confusion Matrix Export Upgrades: Added options to normalize and set decimal precision when exporting confusion matrices, making results easier to analyze and share.
- Expanded IMX500 Export Support: Updated documentation and export tables to clarify that both YOLOv8n and YOLO11n models are now supported for IMX500 hardware.
- Visualization Documentation Cleanup: Improved and clarified documentation for visualization arguments, especially for the
plot()
method, ensuring all options are up-to-date and easy to find. - YOLOv7 ONNX/TensorRT Guide Update: Made the YOLOv7 integration guide clearer and easier to follow, with improved code formatting and simplified export instructions.
🎯 Purpose & Impact
- Smoother EdgeTPU & TF.js Deployments: Users can now export models to EdgeTPU and TF.js without running into group convolution errors, making deployment on these platforms more reliable and accessible.
- Better Video & Window Management: Prevents accidental closure of unrelated OpenCV windows and reduces interruptions during video stream processing, improving the experience for users working with multiple video feeds.
- Flexible Reporting: Enhanced confusion matrix exports allow for more customizable and interpretable performance reports, supporting both technical and non-technical audiences.
- Clearer Hardware Support: Users working with Sony IMX500 hardware can confidently use the latest YOLO models, thanks to clearer documentation and expanded export support.
- Improved Usability & Onboarding: Updated guides and documentation make it easier for both new and experienced users to leverage Ultralytics features effectively, reducing confusion and setup time.
✨ This update is all about making Ultralytics tools more robust, user-friendly, and ready for deployment across a wider range of platforms and workflows!
What's Changed
- Enable
normalize
anddecimals
support for confusion matrix export by @RizwanMunawar in #20912 - Fix YOLOv7 ONNX/TensorRT inference guide by @Laughing-q in #20911
- Fix incorrect args in
visualization-args.md
by @RizwanMunawar in #20910 - Add
yolo11n
model support forIMX
format in export table by @RizwanMunawar in #20884 - Move
waitKey()
anddestroyAllWindows()
to Predictor by @Y-T-G in #20913 ultralytics 8.3.149
Fix group-convolutions export bug for Edge TPU by @Y-T-G in #20919
Full Changelog: v8.3.148...v8.3.149
v8.3.148 - `ultralytics 8.3.148` update `onnxslim>=0.1.56` dependency (#20905)
🌟 Summary
This release updates key dependencies and improves error handling, making model exports more reliable and troubleshooting easier for users. 🚀🔧
📊 Key Changes
- Updated the
onnxslim
dependency to version0.1.56
for ONNX and TensorFlow SavedModel exports, ensuring compatibility with the latest features and bug fixes. - Enhanced error handling when loading dataset caches and model weights, especially for missing modules and outdated NumPy versions.
- Improved error messages to clearly guide users on how to resolve issues related to missing or incompatible dependencies.
🎯 Purpose & Impact
- Boosts the reliability of exporting models to ONNX and TensorFlow formats, reducing the risk of export failures. 📦
- Makes it easier for users to identify and fix issues with their Python environment, especially around NumPy and other dependencies.
- Delivers a smoother, more user-friendly experience for both new and experienced users—no changes to core workflows, so you can upgrade with confidence! 👍✨
What's Changed
- Handle
numpy._core
error while loading cache by @Y-T-G in #20904 ultralytics 8.3.148
updateonnxslim>=0.1.56
dependency by @glenn-jocher in #20905
Full Changelog: v8.3.147...v8.3.148
v8.3.147 - `ultralytics 8.3.147` Confusion Matrix export to CSV, XML, HTML, JSON, and SQL formats (#20834)
🌟 Summary
This release brings powerful new ways to export confusion matrix results, improved YOLOv7 ONNX/TensorRT inference support, enhanced OpenVINO documentation for YOLO11, and several usability and documentation updates. 📊🚀
📊 Key Changes
-
Confusion Matrix Export Enhancements
- You can now export confusion matrix results from model validation in multiple formats: CSV, XML, HTML, JSON, and SQL.
- ConfusionMatrix class improved to support class names and easier export.
- Documentation and tests updated to reflect these new export options.
-
YOLOv7 ONNX & TensorRT Inference Support
- Added detailed guides and scripts to help users export YOLOv7 models to ONNX/TensorRT and run inference with Ultralytics.
- Clarified that only inference (not training) is supported for YOLOv7 in Ultralytics.
-
OpenVINO Documentation Update for YOLO11
- All OpenVINO integration docs now reference YOLO11, with updated export instructions, usage examples, and benchmarks for Intel CPUs, GPUs, and NPUs.
- Added new hardware compatibility tips and troubleshooting guidance.
-
Prediction Arguments & OBB Documentation
- Added documentation for the new
rect
argument, explaining its effect on image padding and inference speed. - Fixed code example for accessing oriented bounding box (OBB) results.
- Added documentation for the new
-
BatchNorm Initialization Fix
- Prevents unintended changes to BatchNorm statistics when initializing models from YAML files, ensuring more stable model behavior.
-
Training Parameter Docstring Update
- Updated training function documentation to use the correct parameter name
batch
instead ofbatch_size
.
- Updated training function documentation to use the correct parameter name
🎯 Purpose & Impact
-
Easier, Flexible Analysis
- Exporting confusion matrices in various formats makes it simple to analyze, share, or report results using your preferred tools. Great for research, presentations, or audits.
-
Broader Model Compatibility
- YOLOv7 ONNX/TensorRT inference support lets users leverage more model types within Ultralytics, expanding deployment options.
-
Up-to-date Hardware Guidance
- OpenVINO documentation now fully supports YOLO11 and the latest Intel hardware, helping users achieve optimal performance.
-
Improved Usability
- Clearer documentation and parameter naming reduce confusion and help both new and experienced users get the most out of Ultralytics.
-
More Reliable Training
- Fixes to BatchNorm initialization ensure consistent model behavior, especially when loading custom architectures.
In summary:
This update makes validation results more accessible, expands model and hardware support, and improves the overall user experience for both developers and non-experts. 🎉
What's Changed
- Add guide for YOLOv7 ONNX inference by @Y-T-G in #18453
- OpenVINO docs update by @ambitious-octopus in #20731
- Fix OBB predict example by @Y-T-G in #20855
- Add
rect
to prediction arguments by @Y-T-G in #20857 - Prevent BatchNorm stats from being changed on model initialization from
yaml
by @Y-T-G in #18149 - Update train method docstrings to reflect correct
batch
parameter by @erfan-zekri in #20888 ultralytics 8.3.147
Confusion Matrix export to CSV, XML, HTML, JSON, and SQL formats by @RizwanMunawar in #20834
Full Changelog: v8.3.146...v8.3.147
v8.3.146 - `ultralytics 8.3.146` New COCO8-Grayscale dataset (#20827)
🌟 Summary
Ultralytics 8.3.146 introduces full support for grayscale object detection workflows, highlighted by the new COCO8-Grayscale dataset, a dedicated grayscale YOLO11n model, and comprehensive grayscale testing and documentation. 🖤📦
📊 Key Changes
- COCO8-Grayscale Dataset Added:
- A small, single-channel (grayscale) version of the COCO8 dataset is now available for rapid testing and debugging.
- Includes a YAML config, download script, and full documentation.
- Grayscale Model Support:
- The new
yolo11n-grayscale.pt
model is now available for download and use. - Test suites updated to cover grayscale training, validation, and prediction.
- The new
- Documentation Enhancements:
- New docs page for COCO8-Grayscale with usage examples, FAQs, and integration tips for YOLO11 and Ultralytics HUB.
- Dataset indexes updated to include COCO8-Grayscale.
- Other Improvements:
- Added a deprecation notice for Neural Magic integrations.
- Improved analytics chart performance and visuals.
- Enhanced code quality with better type hints and docstrings.
- Various documentation cleanups and minor bug fixes.
🎯 Purpose & Impact
- Broader Research & Application:
- Enables users to easily experiment with and benchmark grayscale object detection, which is valuable for medical imaging, industrial inspection, and other fields where grayscale data is common.
- Faster Prototyping:
- The small COCO8-Grayscale dataset allows for quick pipeline checks before scaling to larger datasets, saving time and resources.
- Seamless Integration:
- Full compatibility with YOLO11 and Ultralytics HUB ensures users can leverage cloud training, monitoring, and dataset management for grayscale projects.
- Improved User Experience:
- Smoother analytics, clearer documentation, and robust model export/benchmarking processes make the platform more reliable and user-friendly.
- Future-Proofing:
- Codebase improvements and deprecation notices help users and developers stay up-to-date and avoid deprecated tools.
In summary:
This release makes Ultralytics a more versatile platform for both color and grayscale object detection, while also delivering a range of usability, performance, and documentation improvements. 🚀
What's Changed
- Docs - adding neural-magic deprecation notice by @Burhan-Q in #20817
- Clean up: use
{}
instead ofset([])
by @RizwanMunawar in #20803 - Update type hints and docstrings by @Laughing-q in #20812
- Reuse existing
r_s
variable for intersection check by @RizwanMunawar in #20829 - Remove duplicate warning in tracker docs by @Y-T-G in #20826
- Optimize analytics graph rendering by updating every X frames by @RizwanMunawar in #20823
- Remove
save_crop
from validation arguments by @Y-T-G in #20821 - Fix
NoneType
result when using ReID with CLI by @Y-T-G in #20814 - Refactor benchmark checks to use format names instead of indices by @lakshanthad in #20819
- Standardize YOLO-NAS docstrings with other models by @RizwanMunawar in #20824
- Fix
uv
always installing to--system
environment by @Burhan-Q in #20837 ultralytics 8.3.146
New COCO8-Grayscale dataset by @Laughing-q in #20827
Full Changelog: v8.3.145...v8.3.146
v8.3.145 - `ultralytics 8.3.145` Support all export arguments for benchmark (#20257)
🌟 Summary
This release brings major improvements to model benchmarking flexibility, chart interactivity in documentation, and tracking code clarity—making Ultralytics tools easier and more powerful for everyone! 🚀📊
📊 Key Changes
- Benchmarking Flexibility:
- The
benchmark
method now acceptsdata
,format
, andverbose
directly, and supports all export-specific arguments for more customizable benchmarking.
- The
- Interactive Documentation Charts:
- Added a new toolbar to YOLO model comparison charts in the docs, allowing users to download charts as PNG images or CSV data, with improved styling and usability.
- Chart exports now only include visible (selected) models and use clearer CSV headers.
- Improved chart code for easier maintenance and consistent color-coding for each model (e.g., YOLO11, YOLOv10).
- Fixed toolbar positioning and loading for a smoother user experience.
- Tracking & Solutions Code Simplification:
- Introduced a new
is_track
property for easier and more consistent tracking checks across code, examples, and docs. - Standardized and simplified how tracking and segmentation results are handled in Ultralytics solutions.
- Introduced a new
- Documentation Enhancements:
- Embedded a new YouTube video guide on YOLO11 deployment options.
- Clarified the
verbose
argument in benchmark documentation. - Improved installation instructions for the YOLOv8 Region Counter example.
- Minor code formatting and dependency updates for better readability and build reliability.
🎯 Purpose & Impact
- For All Users:
- Easier Benchmarking: Quickly test models with custom datasets, formats, and export options—no advanced setup required.
- Better Documentation: Download charts and data for your own analysis, and follow video guides for smoother deployment.
- Smoother Setup: Clearer instructions and improved code formatting reduce confusion and errors.
- For Developers & Advanced Users:
- Custom Benchmarking: Pass advanced export arguments for tailored performance evaluations.
- Cleaner Codebase: Refactored chart and tracking logic makes it easier to maintain, extend, and debug.
- Consistent Tracking: The new
is_track
property standardizes tracking checks, reducing bugs and improving code clarity.
- Overall:
- These updates make Ultralytics tools more flexible, user-friendly, and robust—helping you get the most out of YOLO models and documentation, whether you're a beginner or a pro! 🌟
Enjoy the new features and improvements! If you have feedback or questions, the Ultralytics community is here to help. 💡
What's Changed
- Fix issue region counter by changing the imshow name to YOLO by @christymanthara in #20788
- Simplify benchmark.js by @glenn-jocher in #20789
- New chart-widget.js for charts PNG and CSV downloads by @RizwanMunawar in #20771
- Fix chart-widget.js initial positioning by @glenn-jocher in #20790
- Enable selected model CSV export in
chart-widget.js
by @RizwanMunawar in #20794 - Simplify track check with
is_track
attribute by @Laughing-q in #20792 - Improve
verbose
argument description in benchmark doc by @lakshanthad in #20791 - Add https://youtu.be/QkCsj2SvZc4 to docs by @RizwanMunawar in #20796
- Simplify Solutions code by @Laughing-q in #20784
ultralytics 8.3.145
Support all export arguments for benchmark by @Y-T-G in #20257
New Contributors
- @christymanthara made their first contribution in #20788
Full Changelog: v8.3.144...v8.3.145
v8.3.144 - `ultralytics 8.3.144` Declarative docstrings and type hints (#20777)
🌟 Summary
This release focuses on improved code clarity and reliability, introducing enhanced docstrings and type hints across the Ultralytics codebase, smarter GPU selection, and documentation updates for better user experience. 📝🚀
📊 Key Changes
- Declarative Docstrings & Type Hints: Comprehensive updates to docstrings and type hints throughout the code, making it easier for users and developers to understand and extend Ultralytics functionalities. (PR #20777)
- Smarter GPU Selection: The
select_idle_gpu
function now considers both free memory and GPU utilization, allowing for more efficient and conflict-free device selection. Users can customize thresholds via environment variables. (PR #20780) - Validation Logic Improvements: Enhanced validation for Sony IMX models and dynamic models, ensuring more accurate evaluation results. (PR #20769)
- Documentation Updates: Default IoU threshold in validation docs updated from 0.6 to 0.7, reflecting best practices and helping users achieve cleaner validation results. (PR #20776)
- General Code & Docs Cleanup: Minor corrections, improved function descriptions, and better parameter explanations across examples and core modules.
🎯 Purpose & Impact
- Easier Development & Maintenance: Clearer docstrings and type hints make the codebase more approachable for both new and experienced developers, reducing onboarding time and minimizing errors.
- Better Resource Management: Enhanced GPU selection logic leads to more stable and efficient training, especially in multi-GPU environments.
- Improved Model Evaluation: More accurate validation logic and updated documentation help users configure experiments correctly and interpret results with confidence.
- Seamless Integration: Ongoing improvements ensure better compatibility and smoother workflows with Ultralytics HUB and other tools.
✨ This update makes Ultralytics more robust, user-friendly, and ready for both production and research use!
What's Changed
- Fix default
iou
in validation docs by @Y-T-G in #20776 - AutoDevice: Add utilization criteria by @Laughing-q in #20780
- Fix Sony IMX validation by @Laughing-q in #20769
ultralytics 8.3.144
Declarative docstrings and type hints by @glenn-jocher in #20777
Full Changelog: v8.3.143...v8.3.144
v8.3.143 - `ultralytics 8.3.143` Add Profiling for Solutions (#20730)
🌟 Summary
This release introduces detailed performance profiling to Ultralytics Solutions, giving users clear insights into how fast tracking and processing steps run, along with improved logging and more robust object tracking. 🚀⏱️
📊 Key Changes
- Performance Profiling Added: Solutions now measure and report the speed of tracking/prediction and overall processing, with speed metrics included in results.
- Enhanced Logging: When verbose mode is enabled, logs now display detailed timing information for each frame, making it easier to monitor performance.
- Simplified Tracking History: The object counter solution no longer requires specifying bounding box types; it automatically adapts, making tracking more robust and the code cleaner.
- Minor Improvements: General code clean-up and version update to 8.3.143.
🎯 Purpose & Impact
- Greater Transparency: Users can see exactly how long each step takes, helping to identify and resolve performance bottlenecks.
- Easier Optimization: Developers and users can monitor and optimize the speed of their workflows with real-time feedback.
- Simpler Integration: Tracking history is now more flexible and easier to use, reducing the chance of errors and making the codebase easier to maintain.
- Improved Debugging: Enhanced logs and profiling make troubleshooting and understanding solution behavior much more straightforward.
This update is especially valuable for anyone looking to monitor, debug, or optimize their use of Ultralytics Solutions.
What's Changed
- Remove
is_obb
usage fromstore_tracking_history
by @RizwanMunawar in #20760 ultralytics 8.3.143
Add Profiling for Solutions by @RizwanMunawar in #20730
Full Changelog: v8.3.142...v8.3.143
v8.3.142 - `ultralytics 8.3.142` Simplify `Annotator.box_label` (#20754)
🌟 Summary
This release streamlines how bounding boxes are drawn and improves overall usability, robustness, and documentation clarity across the Ultralytics ecosystem. 🖼️✨
📊 Key Changes
- Simplified Bounding Box Drawing: The
box_label
function no longer requires arotated
parameter; it now automatically detects and handles both standard and oriented bounding boxes. - Improved CLI Error Messages: Command-line help and error messages now display valid options in a clearer, list-based format.
- Updated Minimum Requirements: Documentation now reflects updated minimum versions—Python 3.8+ and PyTorch 1.8+.
- More Robust Object Counting: Enhanced checks prevent errors when tracking data is missing or incomplete, especially for oriented bounding boxes.
- Smarter Mouse Event Handling: Mouse callbacks for distance measurement are now only enabled when display is active and supported, reducing unnecessary processing in headless environments.
🎯 Purpose & Impact
- Cleaner, Easier Code: Developers benefit from simpler, more intuitive code for drawing bounding boxes, reducing the chance for mistakes and making future updates easier.
- Better User Experience: Clearer CLI messages and robust error handling make Ultralytics tools more accessible and reliable for all users.
- Accurate Documentation: Users are guided to use supported Python and PyTorch versions, helping avoid compatibility issues.
- Improved Automation & Server Use: Smarter handling of mouse events ensures smooth operation in automated or non-GUI environments.
- No Breaking Changes: These updates are behind-the-scenes improvements—there’s no change to how you use Ultralytics models or features day-to-day.
🚀 This release is all about making Ultralytics tools smoother, smarter, and more user-friendly for everyone!
What's Changed
- Update
Minimum requirements
in docs by @Laughing-q in #20743 - Refine OBB check by validating
track_data
and itsid
by @RizwanMunawar in #20741 - Remove
frozenset
fromValueError
logs by @RizwanMunawar in #20746 - Disable
setMouseCallback
whereimshow
not supported by @RizwanMunawar in #20753 ultralytics 8.3.142
SimplifyAnnotator.box_label
by @Laughing-q in #20754
Full Changelog: v8.3.141...v8.3.142
v8.3.141 - `ultralytics 8.3.141` Automatically detect RTDETR models (#20578)
🌟 Summary
This update introduces automatic detection and seamless handling of RTDETR models, along with several improvements for GPU selection, code clarity, dataset accessibility, and overall robustness. 🚀
📊 Key Changes
- Automatic RTDETR Model Detection:
- The
YOLO
class now automatically recognizes and initializes RTDETR models from checkpoints, making it effortless to use RTDETR alongside other Ultralytics models. - You can now re-initialize a model from an existing model instance without duplicating memory or data.
- The
- Smarter GPU Selection:
- GPU selection now uses a percentage of free memory (e.g., 20%) instead of a fixed amount, improving compatibility across different hardware.
- YOLO Libtorch C++ Fix:
- Fixed CUDA device errors in the YOLOv8 C++ example by specifying the device during model loading.
- Cleaner Code & Maintenance:
- Simplified the TaskAlignedAssigner module and classification loss function for better readability and maintainability.
- Improved handling of legacy image transforms in classification prediction to prevent errors.
- Streamlined the Open Images V7 dataset download script for easier setup.
- Enhanced Testing & Docs:
- VisualAISearch tests now auto-download required images and skip unsupported environments for more reliable testing.
- Added a Colab badge to the HomeObjects-3K dataset docs for one-click model training in Google Colab.
🎯 Purpose & Impact
- Effortless Model Usage:
- Users can now load RTDETR models just like any other YOLO model, with no extra steps or manual configuration.
- Developers can pass model instances directly to the
YOLO
class, avoiding unnecessary duplication and saving memory.
- Better Hardware Compatibility:
- GPU selection adapts to different devices, making it easier to run Ultralytics tools on a wide range of systems without manual tuning.
- Improved Reliability:
- Fixes and enhancements across C++ inference, testing, and prediction make the platform more robust for both developers and end users.
- Faster Onboarding & Prototyping:
- The new Colab badge and simplified dataset scripts lower the barrier for beginners and speed up experimentation for researchers.
- Cleaner, More Maintainable Codebase:
- Ongoing code quality improvements help ensure long-term stability and ease of contribution.
✨ This release makes Ultralytics models—especially RTDETR—even easier to use, more reliable, and more accessible for everyone!
What's Changed
- Fix CUDA Error in YOLO Libtorch C++ Implementation by @ssapsu in #16390
- Clean up
TaskAlignedAssigner
module by @Laughing-q in #20725 - Update
Autodevice
memory check by using percentage form by @Laughing-q in #20714 - Speed up semantic search test with 4 images for fast embedding by @RizwanMunawar in #20704
- Eliminate
loss.detach()
temp return variable by @genji970 in #20721 - Add
HomeObjects-3K
notebook in docs by @RizwanMunawar in #20732 - Handle legacy
CenterCrop
in Classify prediction by @Y-T-G in #20715 - Simplify open-images-v7.yaml by @glenn-jocher in #20733
ultralytics 8.3.141
Automatically detect RTDETR models by @Y-T-G in #20578
New Contributors
Full Changelog: v8.3.140...v8.3.141
v8.3.140 - `ultralytics 8.3.140` Fix `uv` checks with `uv -V` (#20710)
🌟 Summary
This release brings improved reliability for package management, enhanced export and benchmarking features, clearer documentation, and new video tutorials to help users get the most out of Ultralytics YOLO models. 🚀
📊 Key Changes
- Improved "uv" Package Manager Detection: Added a robust check for the "uv" package manager to reduce installation issues and updated auto-install logic for smoother dependency management.
- Flexible Data Export: Enhanced the
to_df
andto_sql
methods, allowing users to control normalization, decimal precision, and dynamic SQL table creation for easier data analysis and reporting. - Expanded Benchmarking Support: Added IMX as a supported backend, enabling benchmarking of YOLO models on IMX devices.
- ONNX Testing for Jetson: Re-enabled ONNX export tests on NVIDIA Jetson devices, increasing test coverage and reliability for edge hardware.
- Documentation Improvements:
- Reorganized integration docs for easier navigation and discovery of deployment options.
- Highlighted SONY IMX500 as a new integration.
- Embedded YouTube tutorials for DOTA dataset training and thread-safe inference, making it easier for users to learn key workflows.
- Cleaner Test Suite: Simplified test conditions by removing unnecessary Python version checks, resulting in broader and more maintainable test coverage.
🎯 Purpose & Impact
- Smoother Installations: More reliable detection of the "uv" package manager means fewer installation errors and a better setup experience for all users. 🛠️
- Easier Data Handling: Users can now export results with custom formatting and directly to SQL databases, making it simpler to analyze and share results. 📊
- Broader Hardware Support: Benchmarking and testing improvements ensure YOLO models work well on more devices, including IMX and Jetson platforms. 💻
- Better Learning Resources: New video tutorials and clearer documentation lower the barrier for new users and help everyone get up to speed faster. 🎥
- Improved Developer Experience: Cleaner, more precise tests help catch issues early and keep the codebase robust and easy to maintain.
This update is all about making Ultralytics tools more reliable, flexible, and user-friendly—whether you're a developer, researcher, or just getting started with computer vision! 🚀✨
What's Changed
- Reorder integrations Docs by @glenn-jocher in #20693
- Enable ONNX tests for NVIDIA Jetson CIs by @lakshanthad in #20696
- Add https://youtu.be/jMbvN6uCIos and https://youtu.be/JjQ-URE0LJE to docs by @RizwanMunawar in #20703
- Fix
to_df
method inDataExportMixin
by @Laughing-q in #20706 - Update Docstring for IMX benchmarks by @lakshanthad in #20701
- Remove
IS_PYTHON_3_11
constant by @RizwanMunawar in #20713 - Adjust
to_sql
method for validation metrics by @RizwanMunawar in #20702 ultralytics 8.3.140
Fixuv
ch 4FD6 ecks withuv -V
by @glenn-jocher in #20710
Full Changelog: v8.3.139...v8.3.140