Ultralytics v8.3.226 β Security-first release, safer parsing, custom Albumentations, and smoother NCNN export 

Quick summary: v8.3.226 focuses on security and reliability by replacing unsafe eval() across the codebase, while adding Python API support for custom Albumentations, simplifying NCNN export via the PNNX Python interface, stabilizing multi-GPU training, and improving installer logs and docs. YOLO11 remains the latest stable and recommended Ultralytics model for all use cases.
Highlights
- Security-first:
eval()fully replaced with safe parsing usingast.literal_eval()across configs, loaders, image size checks, and Triton utils. - New: Custom Albumentations via a Python
augmentationsparameter inmodel.train(...). - Simpler deployment: NCNN export now uses the PNNX Python package directly, with clearer logs.
- Stability: DDP
final_epochfix forval=Falseand safer default Matplotlib settings for analytics. - UX and docs: Improved requirement checks and logs, link hygiene across docs, and a new one-click KITTI training notebook for YOLO11.
New Features 
- Add custom Albumentations in Python with the new
augmentationsparameter; see the contribution in custom Albumentations in the Python API by @onuralpszr. - NCNN export pipeline now calls the PNNX Python API directly for a simpler, more reliable workflow; details in Use PNNX Python interface for NCNN conversion by @Y-T-G.
Security & Parsing 
- All
eval()usage replaced withast.literal_eval()for deterministic, safe parsing:- Config parsing via
cfg.smart_value()is now secure. - Webcam sources like
"0"are safely parsed as integers. - Image sizes like
"[640, 640]"parse predictably. - Triton model metadata parsing is hardened.
- Config parsing via
- Track the main change in Replace eval() with ast.literal_eval() by @onuralpszr.
Improvements 
- Training stability:
- Fixed undefined
final_epochfor DDP whenval=False; see Fix undefined final_epoch for DDP when val=False by @Y-T-G. - Analytics now imports safe Matplotlib settings by default; covered in Add plt_settings import for Analytics by @onuralpszr.
- Fixed undefined
- Installation & tooling:
- More informative requirement checks and better behavior with the
uvpackage manager as shown in Improve check_requirements() output with uv by @glenn-jocher. - CI link checks are less flaky with a longer retry window via Increase link check retry delay by @glenn-jocher.
- More informative requirement checks and better behavior with the
- Docs & UX polish:
- A ready-to-run notebook was added in Add KITTI notebook in docs by @RizwanMunawar.
- Code and link hygiene improved in Python 3.9 target in Markdown and Python and URL/301 refactor, both by @glenn-jocher.
Bug Fixes 
- Resolved rare crash in multi-GPU runs when
val=Falsethrough a robustfinal_epochdefinition as captured in Fix undefined final_epoch for DDP when val=False by @Y-T-G. - Prevented CI issues with Matplotlib backend settings via Analytics plt_settings import fix by @onuralpszr.
- Ensured requirement checks render correctly under
uvin Improve check_requirements() output with uv by @glenn-jocher.
Try it now 
Upgrade to the latest version:
pip install -U ultralytics
Example: use custom Albumentations directly from Python
import albumentations as A
from ultralytics import YOLO
model = YOLO("yolo11n.pt")
custom_transforms = [
A.Blur(blur_limit=7, p=0.5),
A.CLAHE(clip_limit=4.0, p=0.5),
]
model.train(data="coco8.yaml", epochs=100, imgsz=640, augmentations=custom_transforms)
Resources 
- Review the full list of changes in the release notes at Ultralytics v8.3.226.
- Explore every commit between versions in the full changelog diff from v8.3.225 to v8.3.226.
- Learn how to configure augmentations in the YOLO data augmentation guide.
- Get started with deployment using the NCNN export documentation.
- Train YOLO11 on KITTI in one click via the KITTI dataset guide with Colab quickstart.
Whatβs Changed (PRs and authors)
- Custom Albumentations in the Python API by @onuralpszr.
- Use PNNX Python interface for NCNN conversion by @Y-T-G.
- Analytics Matplotlib settings fix by @onuralpszr.
- Add KITTI notebook in docs by @RizwanMunawar.
- Increase CI link check retry delay by @glenn-jocher.
- Python 3.9 target in Markdown by @glenn-jocher.
- Fix undefined final_epoch for DDP when val=False by @Y-T-G.
- Python and URL/301 refactor by @glenn-jocher.
- Improve check_requirements() output with uv by @glenn-jocher.
- Replace eval() with ast.literal_eval() for security by @onuralpszr.
Thanks and feedback 
Huge thanks to the YOLO community and Ultralytics team for the contributions in v8.3.226. Please upgrade, try the new features, and share your experience or questions in our discussions. Your feedback helps us prioritize and improve future releases!