ultralytics 8.3.199__tar.gz → 8.3.201__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {ultralytics-8.3.199 → ultralytics-8.3.201}/PKG-INFO +1 -1
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/__init__.py +1 -1
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/__init__.py +1 -1
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/datasets/SKU-110K.yaml +1 -1
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/engine/exporter.py +23 -169
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/engine/trainer.py +31 -28
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/engine/tuner.py +2 -1
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/nn/modules/head.py +1 -5
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/nn/tasks.py +0 -1
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/utils/benchmarks.py +1 -1
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/utils/checks.py +2 -2
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/utils/dist.py +11 -3
- ultralytics-8.3.199/ultralytics/utils/export.py → ultralytics-8.3.201/ultralytics/utils/export/__init__.py +9 -7
- ultralytics-8.3.201/ultralytics/utils/export/imx.py +289 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/utils/torch_utils.py +1 -48
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics.egg-info/PKG-INFO +1 -1
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics.egg-info/SOURCES.txt +3 -2
- {ultralytics-8.3.199 → ultralytics-8.3.201}/LICENSE +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/README.md +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/pyproject.toml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/setup.cfg +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/tests/__init__.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/tests/conftest.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/tests/test_cli.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/tests/test_cuda.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/tests/test_engine.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/tests/test_exports.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/tests/test_integrations.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/tests/test_python.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/tests/test_solutions.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/assets/bus.jpg +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/assets/zidane.jpg +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/datasets/HomeObjects-3K.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/datasets/VOC.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/datasets/coco.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/datasets/coco128.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/datasets/coco8-grayscale.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/datasets/coco8-multispectral.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/datasets/coco8.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/datasets/construction-ppe.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/datasets/dog-pose.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/datasets/dota8-multispectral.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/datasets/dota8.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/datasets/hand-keypoints.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/datasets/lvis.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/datasets/medical-pills.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/datasets/signature.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/datasets/xView.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/default.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/11/yolo11-cls-resnet18.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/11/yolo11-cls.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/11/yolo11-obb.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/11/yolo11-pose.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/11/yolo11-seg.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/11/yolo11.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/11/yoloe-11-seg.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/11/yoloe-11.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/12/yolo12-cls.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/12/yolo12-obb.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/12/yolo12-pose.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/12/yolo12-seg.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/12/yolo12.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/v10/yolov10b.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/v10/yolov10l.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/v10/yolov10m.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/v10/yolov10n.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/v10/yolov10s.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/v10/yolov10x.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/v8/yoloe-v8-seg.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/v8/yoloe-v8.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/v9/yolov9m.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/v9/yolov9s.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/models/v9/yolov9t.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/trackers/botsort.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/data/__init__.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/data/annotator.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/data/augment.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/data/base.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/data/build.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/data/converter.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/data/dataset.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/data/loaders.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/data/scripts/download_weights.sh +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/data/scripts/get_coco.sh +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/data/scripts/get_coco128.sh +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/data/scripts/get_imagenet.sh +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/data/split.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/data/split_dota.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/data/utils.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/engine/__init__.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/engine/model.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/engine/predictor.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/engine/results.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/engine/validator.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/hub/__init__.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/hub/auth.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/hub/google/__init__.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/hub/session.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/hub/utils.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/__init__.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/fastsam/__init__.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/fastsam/model.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/fastsam/predict.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/fastsam/utils.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/fastsam/val.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/nas/__init__.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/nas/model.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/nas/predict.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/nas/val.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/rtdetr/__init__.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/rtdetr/model.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/rtdetr/predict.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/rtdetr/train.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/rtdetr/val.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/sam/__init__.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/sam/amg.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/sam/build.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/sam/model.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/sam/modules/__init__.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/sam/modules/blocks.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/sam/modules/decoders.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/sam/modules/encoders.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/sam/modules/memory_attention.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/sam/modules/sam.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/sam/modules/transformer.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/sam/modules/utils.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/sam/predict.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/utils/__init__.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/utils/loss.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/utils/ops.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/yolo/__init__.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/yolo/classify/__init__.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/yolo/classify/predict.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/yolo/classify/train.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/yolo/classify/val.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/yolo/detect/__init__.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/yolo/detect/predict.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/yolo/detect/train.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/yolo/detect/val.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/yolo/model.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/yolo/obb/__init__.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/yolo/obb/predict.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/yolo/obb/train.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/yolo/obb/val.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/yolo/pose/__init__.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/yolo/pose/predict.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/yolo/pose/train.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/yolo/pose/val.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/yolo/segment/__init__.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/yolo/segment/predict.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/yolo/segment/train.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/yolo/segment/val.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/yolo/world/__init__.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/yolo/world/train.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/yolo/world/train_world.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/yolo/yoloe/__init__.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/yolo/yoloe/predict.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/yolo/yoloe/train.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/yolo/yoloe/train_seg.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/models/yolo/yoloe/val.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/nn/__init__.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/nn/autobackend.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/nn/modules/__init__.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/nn/modules/activation.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/nn/modules/block.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/nn/modules/conv.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/nn/modules/transformer.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/nn/modules/utils.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/nn/text_model.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/py.typed +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/solutions/__init__.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/solutions/ai_gym.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/solutions/analytics.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/solutions/config.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/solutions/distance_calculation.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/solutions/heatmap.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/solutions/instance_segmentation.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/solutions/object_blurrer.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/solutions/object_counter.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/solutions/object_cropper.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/solutions/parking_management.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/solutions/queue_management.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/solutions/region_counter.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/solutions/security_alarm.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/solutions/similarity_search.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/solutions/solutions.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/solutions/speed_estimation.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/solutions/streamlit_inference.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/solutions/templates/similarity-search.html +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/solutions/trackzone.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/solutions/vision_eye.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/trackers/__init__.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/trackers/basetrack.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/trackers/bot_sort.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/trackers/byte_tracker.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/trackers/track.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/trackers/utils/__init__.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/trackers/utils/gmc.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/trackers/utils/kalman_filter.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/trackers/utils/matching.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/utils/__init__.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/utils/autobatch.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/utils/autodevice.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/utils/callbacks/__init__.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/utils/callbacks/base.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/utils/callbacks/clearml.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/utils/callbacks/comet.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/utils/callbacks/dvc.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/utils/callbacks/hub.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/utils/callbacks/mlflow.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/utils/callbacks/neptune.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/utils/callbacks/platform.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/utils/callbacks/raytune.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/utils/callbacks/tensorboard.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/utils/callbacks/wb.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/utils/cpu.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/utils/downloads.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/utils/errors.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/utils/events.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/utils/files.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/utils/git.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/utils/instance.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/utils/logger.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/utils/loss.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/utils/metrics.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/utils/nms.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/utils/ops.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/utils/patches.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/utils/plotting.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/utils/tal.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/utils/tqdm.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/utils/triton.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics/utils/tuner.py +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics.egg-info/dependency_links.txt +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics.egg-info/entry_points.txt +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics.egg-info/requires.txt +0 -0
- {ultralytics-8.3.199 → ultralytics-8.3.201}/ultralytics.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: ultralytics
|
3
|
-
Version: 8.3.
|
3
|
+
Version: 8.3.201
|
4
4
|
Summary: Ultralytics YOLO 🚀 for SOTA object detection, multi-object tracking, instance segmentation, pose estimation and image classification.
|
5
5
|
Author-email: Glenn Jocher <glenn.jocher@ultralytics.com>, Jing Qiu <jing.qiu@ultralytics.com>
|
6
6
|
Maintainer-email: Ultralytics <hello@ultralytics.com>
|
@@ -856,7 +856,6 @@ def entrypoint(debug: str = "") -> None:
|
|
856
856
|
return
|
857
857
|
|
858
858
|
special = {
|
859
|
-
"help": lambda: LOGGER.info(CLI_HELP_MSG),
|
860
859
|
"checks": checks.collect_system_info,
|
861
860
|
"version": lambda: LOGGER.info(__version__),
|
862
861
|
"settings": lambda: handle_yolo_settings(args[1:]),
|
@@ -866,6 +865,7 @@ def entrypoint(debug: str = "") -> None:
|
|
866
865
|
"logout": lambda: handle_yolo_hub(args),
|
867
866
|
"copy-cfg": copy_default_cfg,
|
868
867
|
"solutions": lambda: handle_yolo_solutions(args[1:]),
|
868
|
+
"help": lambda: LOGGER.info(CLI_HELP_MSG), # help below hub for -h flag precedence
|
869
869
|
}
|
870
870
|
full_args_dict = {**DEFAULT_CFG_DICT, **{k: None for k in TASKS}, **{k: None for k in MODES}, **special}
|
871
871
|
|
@@ -45,7 +45,7 @@ download: |
|
|
45
45
|
# Convert labels
|
46
46
|
names = "image", "x1", "y1", "x2", "y2", "class", "image_width", "image_height" # column names
|
47
47
|
for d in "annotations_train.csv", "annotations_val.csv", "annotations_test.csv":
|
48
|
-
x = pl.read_csv(dir / "annotations" / d,
|
48
|
+
x = pl.read_csv(dir / "annotations" / d, has_header=False, new_columns=names, infer_schema_length=None).to_numpy() # annotations
|
49
49
|
images, unique_images = x[:, 0], np.unique(x[:, 0])
|
50
50
|
with open((dir / d).with_suffix(".txt").__str__().replace("annotations_", ""), "w", encoding="utf-8") as f:
|
51
51
|
f.writelines(f"./images/{s}\n" for s in unique_images)
|
@@ -106,7 +106,7 @@ from ultralytics.utils.checks import (
|
|
106
106
|
is_sudo_available,
|
107
107
|
)
|
108
108
|
from ultralytics.utils.downloads import attempt_download_asset, get_github_assets, safe_download
|
109
|
-
from ultralytics.utils.export import
|
109
|
+
from ultralytics.utils.export import onnx2engine, torch2imx, torch2onnx
|
110
110
|
from ultralytics.utils.files import file_size, spaces_in_path
|
111
111
|
from ultralytics.utils.metrics import batch_probiou
|
112
112
|
from ultralytics.utils.nms import TorchNMS
|
@@ -194,8 +194,11 @@ def try_export(inner_func):
|
|
194
194
|
dt = 0.0
|
195
195
|
try:
|
196
196
|
with Profile() as dt:
|
197
|
-
f = inner_func(*args, **kwargs)
|
198
|
-
|
197
|
+
f = inner_func(*args, **kwargs) # exported file/dir or tuple of (file/dir, *)
|
198
|
+
path = f if isinstance(f, (str, Path)) else f[0]
|
199
|
+
mb = file_size(path)
|
200
|
+
assert mb > 0.0, "0.0 MB output model size"
|
201
|
+
LOGGER.info(f"{prefix} export success ✅ {dt.t:.1f}s, saved as '{path}' ({mb:.1f} MB)")
|
199
202
|
return f
|
200
203
|
except Exception as e:
|
201
204
|
LOGGER.error(f"{prefix} export failure {dt.t:.1f}s: {e}")
|
@@ -284,7 +287,8 @@ class Exporter:
|
|
284
287
|
# Get the closest match if format is invalid
|
285
288
|
matches = difflib.get_close_matches(fmt, fmts, n=1, cutoff=0.6) # 60% similarity required to match
|
286
289
|
if not matches:
|
287
|
-
|
290
|
+
msg = "Model is already in PyTorch format." if fmt == "pt" else f"Invalid export format='{fmt}'."
|
291
|
+
raise ValueError(f"{msg} Valid formats are {fmts}")
|
288
292
|
LOGGER.warning(f"Invalid export format='{fmt}', updating to format='{matches[0]}'")
|
289
293
|
fmt = matches[0]
|
290
294
|
flags = [x == fmt for x in fmts]
|
@@ -408,9 +412,9 @@ class Exporter:
|
|
408
412
|
model = model.fuse()
|
409
413
|
|
410
414
|
if imx:
|
411
|
-
from ultralytics.utils.
|
415
|
+
from ultralytics.utils.export.imx import FXModel
|
412
416
|
|
413
|
-
model = FXModel(model)
|
417
|
+
model = FXModel(model, self.imgsz)
|
414
418
|
for m in model.modules():
|
415
419
|
if isinstance(m, Classify):
|
416
420
|
m.export = True
|
@@ -425,15 +429,6 @@ class Exporter:
|
|
425
429
|
elif isinstance(m, C2f) and not is_tf_format:
|
426
430
|
# EdgeTPU does not support FlexSplitV while split provides cleaner ONNX graph
|
427
431
|
m.forward = m.forward_split
|
428
|
-
if isinstance(m, Detect) and imx:
|
429
|
-
from ultralytics.utils.tal import make_anchors
|
430
|
-
|
431
|
-
m.anchors, m.strides = (
|
432
|
-
x.transpose(0, 1)
|
433
|
-
for x in make_anchors(
|
434
|
-
torch.cat([s / m.stride.unsqueeze(-1) for s in self.imgsz], dim=1), m.stride, 0.5
|
435
|
-
)
|
436
|
-
)
|
437
432
|
|
438
433
|
y = None
|
439
434
|
for _ in range(2): # dry runs
|
@@ -609,7 +604,7 @@ class Exporter:
|
|
609
604
|
self.args.opset = opset_version # for NMSModel
|
610
605
|
|
611
606
|
with arange_patch(self.args):
|
612
|
-
|
607
|
+
torch2onnx(
|
613
608
|
NMSModel(self.model, self.args) if self.args.nms else self.model,
|
614
609
|
self.im,
|
615
610
|
f,
|
@@ -932,7 +927,7 @@ class Exporter:
|
|
932
927
|
LOGGER.info(f"\n{prefix} starting export with TensorRT {trt.__version__}...")
|
933
928
|
assert Path(f_onnx).exists(), f"failed to export ONNX file: {f_onnx}"
|
934
929
|
f = self.file.with_suffix(".engine") # TensorRT engine file
|
935
|
-
|
930
|
+
onnx2engine(
|
936
931
|
f_onnx,
|
937
932
|
f,
|
938
933
|
self.args.workspace,
|
@@ -963,7 +958,7 @@ class Exporter:
|
|
963
958
|
"tf_keras<=2.19.0", # required by 'onnx2tf' package
|
964
959
|
"sng4onnx>=1.0.1", # required by 'onnx2tf' package
|
965
960
|
"onnx_graphsurgeon>=0.3.26", # required by 'onnx2tf' package
|
966
|
-
"ai-edge-litert>=1.2.0,<1.4.0", # required by 'onnx2tf' package
|
961
|
+
"ai-edge-litert>=1.2.0" + (",<1.4.0" if MACOS else ""), # required by 'onnx2tf' package
|
967
962
|
"onnx>=1.12.0",
|
968
963
|
"onnx2tf>=1.26.3",
|
969
964
|
"onnxslim>=0.1.67",
|
@@ -1168,7 +1163,6 @@ class Exporter:
|
|
1168
1163
|
@try_export
|
1169
1164
|
def export_imx(self, prefix=colorstr("IMX:")):
|
1170
1165
|
"""Export YOLO model to IMX format."""
|
1171
|
-
gptq = False
|
1172
1166
|
assert LINUX, (
|
1173
1167
|
"export only supported on Linux. "
|
1174
1168
|
"See https://developer.aitrios.sony-semicon.com/en/raspberrypi-ai-camera/documentation/imx500-converter"
|
@@ -1181,13 +1175,6 @@ class Exporter:
|
|
1181
1175
|
check_requirements("imx500-converter[pt]>=3.16.1") # Separate requirements for imx500-converter
|
1182
1176
|
check_requirements("mct-quantizers>=1.6.0") # Separate for compatibility with model-compression-toolkit
|
1183
1177
|
|
1184
|
-
import model_compression_toolkit as mct
|
1185
|
-
import onnx
|
1186
|
-
from edgemdt_tpc import get_target_platform_capabilities
|
1187
|
-
from sony_custom_layers.pytorch import multiclass_nms_with_indices
|
1188
|
-
|
1189
|
-
LOGGER.info(f"\n{prefix} starting export with model_compression_toolkit {mct.__version__}...")
|
1190
|
-
|
1191
1178
|
# Install Java>=17
|
1192
1179
|
try:
|
1193
1180
|
java_output = subprocess.run(["java", "--version"], check=True, capture_output=True).stdout.decode()
|
@@ -1198,150 +1185,17 @@ class Exporter:
|
|
1198
1185
|
cmd = (["sudo"] if is_sudo_available() else []) + ["apt", "install", "-y", "openjdk-21-jre"]
|
1199
1186
|
subprocess.run(cmd, check=True)
|
1200
1187
|
|
1201
|
-
|
1202
|
-
|
1203
|
-
|
1204
|
-
|
1205
|
-
|
1206
|
-
|
1207
|
-
|
1208
|
-
|
1209
|
-
|
1210
|
-
if "C2PSA" in self.model.__str__(): # YOLO11
|
1211
|
-
if self.model.task == "detect":
|
1212
|
-
layer_names = ["sub", "mul_2", "add_14", "cat_21"]
|
1213
|
-
weights_memory = 2585350.2439
|
1214
|
-
n_layers = 238 # 238 layers for fused YOLO11n
|
1215
|
-
elif self.model.task == "pose":
|
1216
|
-
layer_names = ["sub", "mul_2", "add_14", "cat_22", "cat_23", "mul_4", "add_15"]
|
1217
|
-
weights_memory = 2437771.67
|
1218
|
-
n_layers = 257 # 257 layers for fused YOLO11n-pose
|
1219
|
-
else: # YOLOv8
|
1220
|
-
if self.model.task == "detect":
|
1221
|
-
layer_names = ["sub", "mul", "add_6", "cat_17"]
|
1222
|
-
weights_memory = 2550540.8
|
1223
|
-
n_layers = 168 # 168 layers for fused YOLOv8n
|
1224
|
-
elif self.model.task == "pose":
|
1225
|
-
layer_names = ["add_7", "mul_2", "cat_19", "mul", "sub", "add_6", "cat_18"]
|
1226
|
-
weights_memory = 2482451.85
|
1227
|
-
n_layers = 187 # 187 layers for fused YOLO11n-pose
|
1228
|
-
|
1229
|
-
# Check if the model has the expected number of layers
|
1230
|
-
if len(list(self.model.modules())) != n_layers:
|
1231
|
-
raise ValueError("IMX export only supported for YOLOv8n and YOLO11n models.")
|
1232
|
-
|
1233
|
-
for layer_name in layer_names:
|
1234
|
-
bit_cfg.set_manual_activation_bit_width([mct.core.common.network_editors.NodeNameFilter(layer_name)], 16)
|
1235
|
-
|
1236
|
-
config = mct.core.CoreConfig(
|
1237
|
-
mixed_precision_config=mct.core.MixedPrecisionQuantizationConfig(num_of_images=10),
|
1238
|
-
quantization_config=mct.core.QuantizationConfig(concat_threshold_update=True),
|
1239
|
-
bit_width_config=bit_cfg,
|
1240
|
-
)
|
1241
|
-
|
1242
|
-
resource_utilization = mct.core.ResourceUtilization(weights_memory=weights_memory)
|
1243
|
-
|
1244
|
-
quant_model = (
|
1245
|
-
mct.gptq.pytorch_gradient_post_training_quantization( # Perform Gradient-Based Post Training Quantization
|
1246
|
-
model=self.model,
|
1247
|
-
representative_data_gen=representative_dataset_gen,
|
1248
|
-
target_resource_utilization=resource_utilization,
|
1249
|
-
gptq_config=mct.gptq.get_pytorch_gptq_config(
|
1250
|
-
n_epochs=1000, use_hessian_based_weights=False, use_hessian_sample_attention=False
|
1251
|
-
),
|
1252
|
-
core_config=config,
|
1253
|
-
target_platform_capabilities=tpc,
|
1254
|
-
)[0]
|
1255
|
-
if gptq
|
1256
|
-
else mct.ptq.pytorch_post_training_quantization( # Perform post training quantization
|
1257
|
-
in_module=self.model,
|
1258
|
-
representative_data_gen=representative_dataset_gen,
|
1259
|
-
target_resource_utilization=resource_utilization,
|
1260
|
-
core_config=config,
|
1261
|
-
target_platform_capabilities=tpc,
|
1262
|
-
)[0]
|
1263
|
-
)
|
1264
|
-
|
1265
|
-
class NMSWrapper(torch.nn.Module):
|
1266
|
-
"""Wrap PyTorch Module with multiclass_nms layer from sony_custom_layers."""
|
1267
|
-
|
1268
|
-
def __init__(
|
1269
|
-
self,
|
1270
|
-
model: torch.nn.Module,
|
1271
|
-
score_threshold: float = 0.001,
|
1272
|
-
iou_threshold: float = 0.7,
|
1273
|
-
max_detections: int = 300,
|
1274
|
-
task: str = "detect",
|
1275
|
-
):
|
1276
|
-
"""
|
1277
|
-
Initialize NMSWrapper with PyTorch Module and NMS parameters.
|
1278
|
-
|
1279
|
-
Args:
|
1280
|
-
model (torch.nn.Module): Model instance.
|
1281
|
-
score_threshold (float): Score threshold for non-maximum suppression.
|
1282
|
-
iou_threshold (float): Intersection over union threshold for non-maximum suppression.
|
1283
|
-
max_detections (int): The number of detections to return.
|
1284
|
-
task (str): Task type, either 'detect' or 'pose'.
|
1285
|
-
"""
|
1286
|
-
super().__init__()
|
1287
|
-
self.model = model
|
1288
|
-
self.score_threshold = score_threshold
|
1289
|
-
self.iou_threshold = iou_threshold
|
1290
|
-
self.max_detections = max_detections
|
1291
|
-
self.task = task
|
1292
|
-
|
1293
|
-
def forward(self, images):
|
1294
|
-
"""Forward pass with model inference and NMS post-processing."""
|
1295
|
-
# model inference
|
1296
|
-
outputs = self.model(images)
|
1297
|
-
|
1298
|
-
boxes, scores = outputs[0], outputs[1]
|
1299
|
-
nms_outputs = multiclass_nms_with_indices(
|
1300
|
-
boxes=boxes,
|
1301
|
-
scores=scores,
|
1302
|
-
score_threshold=self.score_threshold,
|
1303
|
-
iou_threshold=self.iou_threshold,
|
1304
|
-
max_detections=self.max_detections,
|
1305
|
-
)
|
1306
|
-
if self.task == "pose":
|
1307
|
-
kpts = outputs[2] # (bs, max_detections, kpts 17*3)
|
1308
|
-
out_kpts = torch.gather(kpts, 1, nms_outputs.indices.unsqueeze(-1).expand(-1, -1, kpts.size(-1)))
|
1309
|
-
return nms_outputs.boxes, nms_outputs.scores, nms_outputs.labels, out_kpts
|
1310
|
-
return nms_outputs.boxes, nms_outputs.scores, nms_outputs.labels, nms_outputs.n_valid
|
1311
|
-
|
1312
|
-
quant_model = NMSWrapper(
|
1313
|
-
model=quant_model,
|
1314
|
-
score_threshold=self.args.conf or 0.001,
|
1315
|
-
iou_threshold=self.args.iou,
|
1316
|
-
max_detections=self.args.max_det,
|
1317
|
-
task=self.model.task,
|
1318
|
-
).to(self.device)
|
1319
|
-
|
1320
|
-
f = Path(str(self.file).replace(self.file.suffix, "_imx_model"))
|
1321
|
-
f.mkdir(exist_ok=True)
|
1322
|
-
onnx_model = f / Path(str(self.file.name).replace(self.file.suffix, "_imx.onnx")) # js dir
|
1323
|
-
mct.exporter.pytorch_export_model(
|
1324
|
-
model=quant_model, save_model_path=onnx_model, repr_dataset=representative_dataset_gen
|
1325
|
-
)
|
1326
|
-
|
1327
|
-
model_onnx = onnx.load(onnx_model) # load onnx model
|
1328
|
-
for k, v in self.metadata.items():
|
1329
|
-
meta = model_onnx.metadata_props.add()
|
1330
|
-
meta.key, meta.value = k, str(v)
|
1331
|
-
|
1332
|
-
onnx.save(model_onnx, onnx_model)
|
1333
|
-
|
1334
|
-
subprocess.run(
|
1335
|
-
["imxconv-pt", "-i", str(onnx_model), "-o", str(f), "--no-input-persistency", "--overwrite-output"],
|
1336
|
-
check=True,
|
1188
|
+
return torch2imx(
|
1189
|
+
self.model,
|
1190
|
+
self.file,
|
1191
|
+
self.args.conf,
|
1192
|
+
self.args.iou,
|
1193
|
+
self.args.max_det,
|
1194
|
+
metadata=self.metadata,
|
1195
|
+
dataset=self.get_int8_calibration_dataloader(prefix),
|
1196
|
+
prefix=prefix,
|
1337
1197
|
)
|
1338
1198
|
|
1339
|
-
# Needed for imx models.
|
1340
|
-
with open(f / "labels.txt", "w", encoding="utf-8") as file:
|
1341
|
-
file.writelines([f"{name}\n" for _, name in self.model.names.items()])
|
1342
|
-
|
1343
|
-
return f
|
1344
|
-
|
1345
1199
|
def _add_tflite_metadata(self, file):
|
1346
1200
|
"""Add metadata to *.tflite models per https://ai.google.dev/edge/litert/models/metadata."""
|
1347
1201
|
import zipfile
|
@@ -1531,7 +1385,7 @@ class NMSModel(torch.nn.Module):
|
|
1531
1385
|
for i in range(bs):
|
1532
1386
|
box, cls, score, extra = boxes[i], classes[i], scores[i], extras[i]
|
1533
1387
|
mask = score > self.args.conf
|
1534
|
-
if self.is_tf:
|
1388
|
+
if self.is_tf or (self.args.format == "onnx" and self.obb):
|
1535
1389
|
# TFLite GatherND error if mask is empty
|
1536
1390
|
score *= mask
|
1537
1391
|
# Explicit length otherwise reshape error, hardcoded to `self.args.max_det * 5`
|
@@ -174,7 +174,22 @@ class BaseTrainer:
|
|
174
174
|
|
175
175
|
# Callbacks
|
176
176
|
self.callbacks = _callbacks or callbacks.get_default_callbacks()
|
177
|
-
|
177
|
+
|
178
|
+
if isinstance(self.args.device, str) and len(self.args.device): # i.e. device='0' or device='0,1,2,3'
|
179
|
+
world_size = len(self.args.device.split(","))
|
180
|
+
elif isinstance(self.args.device, (tuple, list)): # i.e. device=[0, 1, 2, 3] (multi-GPU from CLI is list)
|
181
|
+
world_size = len(self.args.device)
|
182
|
+
elif self.args.device in {"cpu", "mps"}: # i.e. device='cpu' or 'mps'
|
183
|
+
world_size = 0
|
184
|
+
elif torch.cuda.is_available(): # i.e. device=None or device='' or device=number
|
185
|
+
world_size = 1 # default to device 0
|
186
|
+
else: # i.e. device=None or device=''
|
187
|
+
world_size = 0
|
188
|
+
|
189
|
+
self.ddp = world_size > 1 and "LOCAL_RANK" not in os.environ
|
190
|
+
self.world_size = world_size
|
191
|
+
# Run subprocess if DDP training, else train normally
|
192
|
+
if RANK in {-1, 0} and not self.ddp:
|
178
193
|
callbacks.add_integration_callbacks(self)
|
179
194
|
# Start console logging immediately at trainer initialization
|
180
195
|
self.run_callbacks("on_pretrain_routine_start")
|
@@ -194,19 +209,8 @@ class BaseTrainer:
|
|
194
209
|
|
195
210
|
def train(self):
|
196
211
|
"""Allow device='', device=None on Multi-GPU systems to default to device=0."""
|
197
|
-
if isinstance(self.args.device, str) and len(self.args.device): # i.e. device='0' or device='0,1,2,3'
|
198
|
-
world_size = len(self.args.device.split(","))
|
199
|
-
elif isinstance(self.args.device, (tuple, list)): # i.e. device=[0, 1, 2, 3] (multi-GPU from CLI is list)
|
200
|
-
world_size = len(self.args.device)
|
201
|
-
elif self.args.device in {"cpu", "mps"}: # i.e. device='cpu' or 'mps'
|
202
|
-
world_size = 0
|
203
|
-
elif torch.cuda.is_available(): # i.e. device=None or device='' or device=number
|
204
|
-
world_size = 1 # default to device 0
|
205
|
-
else: # i.e. device=None or device=''
|
206
|
-
world_size = 0
|
207
|
-
|
208
212
|
# Run subprocess if DDP training, else train normally
|
209
|
-
if
|
213
|
+
if self.ddp:
|
210
214
|
# Argument checks
|
211
215
|
if self.args.rect:
|
212
216
|
LOGGER.warning("'rect=True' is incompatible with Multi-GPU training, setting 'rect=False'")
|
@@ -218,7 +222,7 @@ class BaseTrainer:
|
|
218
222
|
self.args.batch = 16
|
219
223
|
|
220
224
|
# Command
|
221
|
-
cmd, file = generate_ddp_command(
|
225
|
+
cmd, file = generate_ddp_command(self)
|
222
226
|
try:
|
223
227
|
LOGGER.info(f"{colorstr('DDP:')} debug command {' '.join(cmd)}")
|
224
228
|
subprocess.run(cmd, check=True)
|
@@ -228,7 +232,7 @@ class BaseTrainer:
|
|
228
232
|
ddp_cleanup(self, str(file))
|
229
233
|
|
230
234
|
else:
|
231
|
-
self._do_train(
|
235
|
+
self._do_train()
|
232
236
|
|
233
237
|
def _setup_scheduler(self):
|
234
238
|
"""Initialize training learning rate scheduler."""
|
@@ -238,20 +242,19 @@ class BaseTrainer:
|
|
238
242
|
self.lf = lambda x: max(1 - x / self.epochs, 0) * (1.0 - self.args.lrf) + self.args.lrf # linear
|
239
243
|
self.scheduler = optim.lr_scheduler.LambdaLR(self.optimizer, lr_lambda=self.lf)
|
240
244
|
|
241
|
-
def _setup_ddp(self
|
245
|
+
def _setup_ddp(self):
|
242
246
|
"""Initialize and set the DistributedDataParallel parameters for training."""
|
243
247
|
torch.cuda.set_device(RANK)
|
244
248
|
self.device = torch.device("cuda", RANK)
|
245
|
-
# LOGGER.info(f'DDP info: RANK {RANK}, WORLD_SIZE {world_size}, DEVICE {self.device}')
|
246
249
|
os.environ["TORCH_NCCL_BLOCKING_WAIT"] = "1" # set to enforce timeout
|
247
250
|
dist.init_process_group(
|
248
251
|
backend="nccl" if dist.is_nccl_available() else "gloo",
|
249
252
|
timeout=timedelta(seconds=10800), # 3 hours
|
250
253
|
rank=RANK,
|
251
|
-
world_size=world_size,
|
254
|
+
world_size=self.world_size,
|
252
255
|
)
|
253
256
|
|
254
|
-
def _setup_train(self
|
257
|
+
def _setup_train(self):
|
255
258
|
"""Build dataloaders and optimizer on correct rank process."""
|
256
259
|
ckpt = self.setup_model()
|
257
260
|
self.model = self.model.to(self.device)
|
@@ -293,13 +296,13 @@ class BaseTrainer:
|
|
293
296
|
callbacks_backup = callbacks.default_callbacks.copy() # backup callbacks as check_amp() resets them
|
294
297
|
self.amp = torch.tensor(check_amp(self.model), device=self.device)
|
295
298
|
callbacks.default_callbacks = callbacks_backup # restore callbacks
|
296
|
-
if RANK > -1 and world_size > 1: # DDP
|
299
|
+
if RANK > -1 and self.world_size > 1: # DDP
|
297
300
|
dist.broadcast(self.amp.int(), src=0) # broadcast from rank 0 to all other ranks; gloo errors with boolean
|
298
301
|
self.amp = bool(self.amp) # as boolean
|
299
302
|
self.scaler = (
|
300
303
|
torch.amp.GradScaler("cuda", enabled=self.amp) if TORCH_2_4 else torch.cuda.amp.GradScaler(enabled=self.amp)
|
301
304
|
)
|
302
|
-
if world_size > 1:
|
305
|
+
if self.world_size > 1:
|
303
306
|
self.model = nn.parallel.DistributedDataParallel(self.model, device_ids=[RANK], find_unused_parameters=True)
|
304
307
|
|
305
308
|
# Check imgsz
|
@@ -312,7 +315,7 @@ class BaseTrainer:
|
|
312
315
|
self.args.batch = self.batch_size = self.auto_batch()
|
313
316
|
|
314
317
|
# Dataloaders
|
315
|
-
batch_size = self.batch_size // max(world_size, 1)
|
318
|
+
batch_size = self.batch_size // max(self.world_size, 1)
|
316
319
|
self.train_loader = self.get_dataloader(
|
317
320
|
self.data["train"], batch_size=batch_size, rank=LOCAL_RANK, mode="train"
|
318
321
|
)
|
@@ -350,11 +353,11 @@ class BaseTrainer:
|
|
350
353
|
self.scheduler.last_epoch = self.start_epoch - 1 # do not move
|
351
354
|
self.run_callbacks("on_pretrain_routine_end")
|
352
355
|
|
353
|
-
def _do_train(self
|
356
|
+
def _do_train(self):
|
354
357
|
"""Train the model with the specified world size."""
|
355
|
-
if world_size > 1:
|
356
|
-
self._setup_ddp(
|
357
|
-
self._setup_train(
|
358
|
+
if self.world_size > 1:
|
359
|
+
self._setup_ddp()
|
360
|
+
self._setup_train()
|
358
361
|
|
359
362
|
nb = len(self.train_loader) # number of batches
|
360
363
|
nw = max(round(self.args.warmup_epochs * nb), 100) if self.args.warmup_epochs > 0 else -1 # warmup iterations
|
@@ -365,7 +368,7 @@ class BaseTrainer:
|
|
365
368
|
self.run_callbacks("on_train_start")
|
366
369
|
LOGGER.info(
|
367
370
|
f"Image sizes {self.args.imgsz} train, {self.args.imgsz} val\n"
|
368
|
-
f"Using {self.train_loader.num_workers * (world_size or 1)} dataloader workers\n"
|
371
|
+
f"Using {self.train_loader.num_workers * (self.world_size or 1)} dataloader workers\n"
|
369
372
|
f"Logging results to {colorstr('bold', self.save_dir)}\n"
|
370
373
|
f"Starting training for " + (f"{self.args.time} hours..." if self.args.time else f"{self.epochs} epochs...")
|
371
374
|
)
|
@@ -417,7 +420,7 @@ class BaseTrainer:
|
|
417
420
|
loss, self.loss_items = unwrap_model(self.model).loss(batch, preds)
|
418
421
|
self.loss = loss.sum()
|
419
422
|
if RANK != -1:
|
420
|
-
self.loss *= world_size
|
423
|
+
self.loss *= self.world_size
|
421
424
|
self.tloss = (
|
422
425
|
(self.tloss * i + self.loss_items) / (i + 1) if self.tloss is not None else self.loss_items
|
423
426
|
)
|
@@ -341,7 +341,8 @@ class Tuner:
|
|
341
341
|
hyp[k] = round(min(max(hyp[k], bounds[0]), bounds[1]), 5)
|
342
342
|
|
343
343
|
# Update types
|
344
|
-
|
344
|
+
if "close_mosaic" in hyp:
|
345
|
+
hyp["close_mosaic"] = int(round(hyp["close_mosaic"]))
|
345
346
|
|
346
347
|
return hyp
|
347
348
|
|
@@ -162,7 +162,7 @@ class Detect(nn.Module):
|
|
162
162
|
# Inference path
|
163
163
|
shape = x[0].shape # BCHW
|
164
164
|
x_cat = torch.cat([xi.view(shape[0], self.no, -1) for xi in x], 2)
|
165
|
-
if self.
|
165
|
+
if self.dynamic or self.shape != shape:
|
166
166
|
self.anchors, self.strides = (x.transpose(0, 1) for x in make_anchors(x, self.stride, 0.5))
|
167
167
|
self.shape = shape
|
168
168
|
|
@@ -182,8 +182,6 @@ class Detect(nn.Module):
|
|
182
182
|
dbox = self.decode_bboxes(self.dfl(box) * norm, self.anchors.unsqueeze(0) * norm[:, :2])
|
183
183
|
else:
|
184
184
|
dbox = self.decode_bboxes(self.dfl(box), self.anchors.unsqueeze(0)) * self.strides
|
185
|
-
if self.export and self.format == "imx":
|
186
|
-
return dbox.transpose(1, 2), cls.sigmoid().permute(0, 2, 1)
|
187
185
|
return torch.cat((dbox, cls.sigmoid()), 1)
|
188
186
|
|
189
187
|
def bias_init(self):
|
@@ -387,8 +385,6 @@ class Pose(Detect):
|
|
387
385
|
if self.training:
|
388
386
|
return x, kpt
|
389
387
|
pred_kpt = self.kpts_decode(bs, kpt)
|
390
|
-
if self.export and self.format == "imx":
|
391
|
-
return (*x, pred_kpt.permute(0, 2, 1))
|
392
388
|
return torch.cat([x, pred_kpt], 1) if self.export else (torch.cat([x[0], pred_kpt], 1), (x[1], kpt))
|
393
389
|
|
394
390
|
def kpts_decode(self, bs: int, kpts: torch.Tensor) -> torch.Tensor:
|
@@ -145,7 +145,7 @@ def benchmark(
|
|
145
145
|
assert not is_end2end
|
146
146
|
assert not isinstance(model, YOLOWorld), "YOLOWorldv2 IMX exports not supported"
|
147
147
|
assert model.task == "detect", "IMX only supported for detection task"
|
148
|
-
assert "C2f" in model.__str__(), "IMX only supported for
|
148
|
+
assert "C2f" in model.__str__(), "IMX only supported for YOLOv8n and YOLO11n"
|
149
149
|
if format == "rknn":
|
150
150
|
assert not isinstance(model, YOLOWorld), "YOLOWorldv2 RKNN exports not supported yet"
|
151
151
|
assert not is_end2end, "End-to-end models not supported by RKNN yet"
|
@@ -363,8 +363,8 @@ def check_requirements(requirements=ROOT.parent / "requirements.txt", exclude=()
|
|
363
363
|
Check if installed dependencies meet Ultralytics YOLO models requirements and attempt to auto-update if needed.
|
364
364
|
|
365
365
|
Args:
|
366
|
-
requirements (Path | str | list[str]): Path to a requirements.txt file, a single package
|
367
|
-
string, or a list of package requirements as strings.
|
366
|
+
requirements (Path | str | list[str] | tuple[str]): Path to a requirements.txt file, a single package
|
367
|
+
requirement as a string, or a list of package requirements as strings.
|
368
368
|
exclude (tuple): Tuple of package names to exclude from checking.
|
369
369
|
install (bool): If True, attempt to auto-update packages that don't meet requirements.
|
370
370
|
cmds (str): Additional commands to pass to the pip install command when auto-updating.
|
@@ -76,12 +76,11 @@ if __name__ == "__main__":
|
|
76
76
|
return file.name
|
77
77
|
|
78
78
|
|
79
|
-
def generate_ddp_command(
|
79
|
+
def generate_ddp_command(trainer):
|
80
80
|
"""
|
81
81
|
Generate command for distributed training.
|
82
82
|
|
83
83
|
Args:
|
84
|
-
world_size (int): Number of processes to spawn for distributed training.
|
85
84
|
trainer (ultralytics.engine.trainer.BaseTrainer): The trainer containing configuration for distributed training.
|
86
85
|
|
87
86
|
Returns:
|
@@ -95,7 +94,16 @@ def generate_ddp_command(world_size: int, trainer):
|
|
95
94
|
file = generate_ddp_file(trainer)
|
96
95
|
dist_cmd = "torch.distributed.run" if TORCH_1_9 else "torch.distributed.launch"
|
97
96
|
port = find_free_network_port()
|
98
|
-
cmd = [
|
97
|
+
cmd = [
|
98
|
+
sys.executable,
|
99
|
+
"-m",
|
100
|
+
dist_cmd,
|
101
|
+
"--nproc_per_node",
|
102
|
+
f"{trainer.world_size}",
|
103
|
+
"--master_port",
|
104
|
+
f"{port}",
|
105
|
+
file,
|
106
|
+
]
|
99
107
|
return cmd, file
|
100
108
|
|
101
109
|
|
@@ -9,8 +9,10 @@ import torch
|
|
9
9
|
|
10
10
|
from ultralytics.utils import IS_JETSON, LOGGER
|
11
11
|
|
12
|
+
from .imx import torch2imx # noqa
|
12
13
|
|
13
|
-
|
14
|
+
|
15
|
+
def torch2onnx(
|
14
16
|
torch_model: torch.nn.Module,
|
15
17
|
im: torch.Tensor,
|
16
18
|
onnx_file: str,
|
@@ -47,7 +49,7 @@ def export_onnx(
|
|
47
49
|
)
|
48
50
|
|
49
51
|
|
50
|
-
def
|
52
|
+
def onnx2engine(
|
51
53
|
onnx_file: str,
|
52
54
|
engine_file: str | None = None,
|
53
55
|
workspace: int | None = None,
|
@@ -98,12 +100,12 @@ def export_engine(
|
|
98
100
|
# Engine builder
|
99
101
|
builder = trt.Builder(logger)
|
100
102
|
config = builder.create_builder_config()
|
101
|
-
|
103
|
+
workspace_bytes = int((workspace or 0) * (1 << 30))
|
102
104
|
is_trt10 = int(trt.__version__.split(".", 1)[0]) >= 10 # is TensorRT >= 10
|
103
|
-
if is_trt10 and
|
104
|
-
config.set_memory_pool_limit(trt.MemoryPoolType.WORKSPACE,
|
105
|
-
elif
|
106
|
-
config.max_workspace_size =
|
105
|
+
if is_trt10 and workspace_bytes > 0:
|
106
|
+
config.set_memory_pool_limit(trt.MemoryPoolType.WORKSPACE, workspace_bytes)
|
107
|
+
elif workspace_bytes > 0: # TensorRT versions 7, 8
|
108
|
+
config.max_workspace_size = workspace_bytes
|
107
109
|
flag = 1 << int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH)
|
108
110
|
network = builder.create_network(flag)
|
109
111
|
half = builder.platform_has_fast_fp16 and half
|