ultralytics 8.3.198__tar.gz → 8.3.200__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.198 → ultralytics-8.3.200}/PKG-INFO +1 -1
- {ultralytics-8.3.198 → ultralytics-8.3.200}/tests/test_cuda.py +2 -3
- ultralytics-8.3.200/ultralytics/__init__.py +43 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/default.yaml +1 -1
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/engine/exporter.py +19 -167
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/engine/trainer.py +31 -28
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/engine/tuner.py +2 -1
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/nn/modules/head.py +1 -5
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/nn/tasks.py +1 -1
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/utils/benchmarks.py +1 -1
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/utils/dist.py +11 -3
- ultralytics-8.3.198/ultralytics/utils/export.py → ultralytics-8.3.200/ultralytics/utils/export/__init__.py +9 -7
- ultralytics-8.3.200/ultralytics/utils/export/imx.py +289 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/utils/plotting.py +5 -1
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/utils/torch_utils.py +5 -49
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics.egg-info/PKG-INFO +1 -1
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics.egg-info/SOURCES.txt +3 -2
- ultralytics-8.3.198/ultralytics/__init__.py +0 -30
- {ultralytics-8.3.198 → ultralytics-8.3.200}/LICENSE +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/README.md +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/pyproject.toml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/setup.cfg +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/tests/__init__.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/tests/conftest.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/tests/test_cli.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/tests/test_engine.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/tests/test_exports.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/tests/test_integrations.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/tests/test_python.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/tests/test_solutions.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/assets/bus.jpg +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/assets/zidane.jpg +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/__init__.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/datasets/HomeObjects-3K.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/datasets/VOC.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/datasets/coco.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/datasets/coco128.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/datasets/coco8-grayscale.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/datasets/coco8-multispectral.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/datasets/coco8.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/datasets/construction-ppe.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/datasets/dog-pose.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/datasets/dota8-multispectral.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/datasets/dota8.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/datasets/hand-keypoints.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/datasets/lvis.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/datasets/medical-pills.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/datasets/signature.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/datasets/xView.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/11/yolo11-cls-resnet18.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/11/yolo11-cls.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/11/yolo11-obb.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/11/yolo11-pose.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/11/yolo11-seg.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/11/yolo11.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/11/yoloe-11-seg.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/11/yoloe-11.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/12/yolo12-cls.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/12/yolo12-obb.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/12/yolo12-pose.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/12/yolo12-seg.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/12/yolo12.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/v10/yolov10b.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/v10/yolov10l.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/v10/yolov10m.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/v10/yolov10n.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/v10/yolov10s.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/v10/yolov10x.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/v8/yoloe-v8-seg.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/v8/yoloe-v8.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/v9/yolov9m.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/v9/yolov9s.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/models/v9/yolov9t.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/trackers/botsort.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/data/__init__.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/data/annotator.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/data/augment.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/data/base.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/data/build.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/data/converter.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/data/dataset.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/data/loaders.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/data/scripts/download_weights.sh +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/data/scripts/get_coco.sh +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/data/scripts/get_coco128.sh +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/data/scripts/get_imagenet.sh +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/data/split.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/data/split_dota.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/data/utils.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/engine/__init__.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/engine/model.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/engine/predictor.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/engine/results.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/engine/validator.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/hub/__init__.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/hub/auth.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/hub/google/__init__.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/hub/session.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/hub/utils.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/__init__.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/fastsam/__init__.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/fastsam/model.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/fastsam/predict.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/fastsam/utils.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/fastsam/val.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/nas/__init__.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/nas/model.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/nas/predict.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/nas/val.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/rtdetr/__init__.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/rtdetr/model.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/rtdetr/predict.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/rtdetr/train.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/rtdetr/val.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/sam/__init__.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/sam/amg.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/sam/build.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/sam/model.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/sam/modules/__init__.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/sam/modules/blocks.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/sam/modules/decoders.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/sam/modules/encoders.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/sam/modules/memory_attention.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/sam/modules/sam.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/sam/modules/transformer.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/sam/modules/utils.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/sam/predict.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/utils/__init__.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/utils/loss.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/utils/ops.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/yolo/__init__.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/yolo/classify/__init__.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/yolo/classify/predict.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/yolo/classify/train.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/yolo/classify/val.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/yolo/detect/__init__.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/yolo/detect/predict.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/yolo/detect/train.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/yolo/detect/val.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/yolo/model.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/yolo/obb/__init__.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/yolo/obb/predict.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/yolo/obb/train.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/yolo/obb/val.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/yolo/pose/__init__.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/yolo/pose/predict.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/yolo/pose/train.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/yolo/pose/val.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/yolo/segment/__init__.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/yolo/segment/predict.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/yolo/segment/train.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/yolo/segment/val.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/yolo/world/__init__.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/yolo/world/train.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/yolo/world/train_world.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/yolo/yoloe/__init__.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/yolo/yoloe/predict.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/yolo/yoloe/train.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/yolo/yoloe/train_seg.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/models/yolo/yoloe/val.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/nn/__init__.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/nn/autobackend.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/nn/modules/__init__.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/nn/modules/activation.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/nn/modules/block.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/nn/modules/conv.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/nn/modules/transformer.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/nn/modules/utils.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/nn/text_model.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/py.typed +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/solutions/__init__.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/solutions/ai_gym.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/solutions/analytics.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/solutions/config.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/solutions/distance_calculation.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/solutions/heatmap.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/solutions/instance_segmentation.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/solutions/object_blurrer.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/solutions/object_counter.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/solutions/object_cropper.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/solutions/parking_management.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/solutions/queue_management.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/solutions/region_counter.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/solutions/security_alarm.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/solutions/similarity_search.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/solutions/solutions.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/solutions/speed_estimation.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/solutions/streamlit_inference.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/solutions/templates/similarity-search.html +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/solutions/trackzone.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/solutions/vision_eye.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/trackers/__init__.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/trackers/basetrack.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/trackers/bot_sort.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/trackers/byte_tracker.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/trackers/track.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/trackers/utils/__init__.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/trackers/utils/gmc.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/trackers/utils/kalman_filter.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/trackers/utils/matching.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/utils/__init__.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/utils/autobatch.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/utils/autodevice.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/utils/callbacks/__init__.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/utils/callbacks/base.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/utils/callbacks/clearml.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/utils/callbacks/comet.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/utils/callbacks/dvc.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/utils/callbacks/hub.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/utils/callbacks/mlflow.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/utils/callbacks/neptune.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/utils/callbacks/platform.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/utils/callbacks/raytune.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/utils/callbacks/tensorboard.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/utils/callbacks/wb.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/utils/checks.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/utils/cpu.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/utils/downloads.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/utils/errors.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/utils/events.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/utils/files.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/utils/git.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/utils/instance.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/utils/logger.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/utils/loss.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/utils/metrics.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/utils/nms.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/utils/ops.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/utils/patches.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/utils/tal.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/utils/tqdm.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/utils/triton.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics/utils/tuner.py +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics.egg-info/dependency_links.txt +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics.egg-info/entry_points.txt +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/ultralytics.egg-info/requires.txt +0 -0
- {ultralytics-8.3.198 → ultralytics-8.3.200}/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.200
|
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>
|
@@ -68,7 +68,7 @@ def test_export_onnx_matrix(task, dynamic, int8, half, batch, simplify, nms):
|
|
68
68
|
half=half,
|
69
69
|
batch=batch,
|
70
70
|
simplify=simplify,
|
71
|
-
nms=nms
|
71
|
+
nms=nms,
|
72
72
|
device=DEVICES[0],
|
73
73
|
)
|
74
74
|
YOLO(file)([SOURCE] * batch, imgsz=64 if dynamic else 32, device=DEVICES[0]) # exported model inference
|
@@ -76,7 +76,6 @@ def test_export_onnx_matrix(task, dynamic, int8, half, batch, simplify, nms):
|
|
76
76
|
|
77
77
|
|
78
78
|
@pytest.mark.slow
|
79
|
-
@pytest.mark.skipif(True, reason="CUDA export tests disabled pending additional Ultralytics GPU server availability")
|
80
79
|
@pytest.mark.skipif(not DEVICES, reason="No CUDA devices available")
|
81
80
|
@pytest.mark.parametrize(
|
82
81
|
"task, dynamic, int8, half, batch",
|
@@ -164,7 +163,7 @@ def test_autobatch():
|
|
164
163
|
|
165
164
|
|
166
165
|
@pytest.mark.slow
|
167
|
-
@pytest.mark.skipif(
|
166
|
+
@pytest.mark.skipif(not DEVICES, reason="No CUDA devices available")
|
168
167
|
def test_utils_benchmarks():
|
169
168
|
"""Profile YOLO models for performance benchmarks."""
|
170
169
|
from ultralytics.utils.benchmarks import ProfileModels
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
|
2
|
+
|
3
|
+
__version__ = "8.3.200"
|
4
|
+
|
5
|
+
import importlib
|
6
|
+
import os
|
7
|
+
|
8
|
+
# Set ENV variables (place before imports)
|
9
|
+
if not os.environ.get("OMP_NUM_THREADS"):
|
10
|
+
os.environ["OMP_NUM_THREADS"] = "1" # default for reduced CPU utilization during training
|
11
|
+
|
12
|
+
from ultralytics.utils import ASSETS, SETTINGS
|
13
|
+
from ultralytics.utils.checks import check_yolo as checks
|
14
|
+
from ultralytics.utils.downloads import download
|
15
|
+
|
16
|
+
settings = SETTINGS
|
17
|
+
|
18
|
+
MODELS = ("YOLO", "YOLOWorld", "YOLOE", "NAS", "SAM", "FastSAM", "RTDETR")
|
19
|
+
|
20
|
+
__all__ = (
|
21
|
+
"__version__",
|
22
|
+
"ASSETS",
|
23
|
+
*MODELS,
|
24
|
+
"checks",
|
25
|
+
"download",
|
26
|
+
"settings",
|
27
|
+
)
|
28
|
+
|
29
|
+
|
30
|
+
def __getattr__(name: str):
|
31
|
+
"""Lazy-import model classes on first access."""
|
32
|
+
if name in MODELS:
|
33
|
+
return getattr(importlib.import_module("ultralytics.models"), name)
|
34
|
+
raise AttributeError(f"module {__name__} has no attribute {name}")
|
35
|
+
|
36
|
+
|
37
|
+
def __dir__():
|
38
|
+
"""Extend dir() to include lazily available model names for IDE autocompletion."""
|
39
|
+
return sorted(set(globals()) | set(MODELS))
|
40
|
+
|
41
|
+
|
42
|
+
if __name__ == "__main__":
|
43
|
+
print(__version__)
|
@@ -37,7 +37,7 @@ fraction: 1.0 # (float) fraction of training dataset to use (1.0 = all)
|
|
37
37
|
profile: False # (bool) profile ONNX/TensorRT speeds during training for loggers
|
38
38
|
freeze: # (int | list, optional) freeze first N layers (int) or specific layer indices (list)
|
39
39
|
multi_scale: False # (bool) multiscale training by varying image size
|
40
|
-
compile: False # (bool | str) enable torch.compile() backend='inductor'; True="default", False=off, or "default|reduce-overhead|max-autotune"
|
40
|
+
compile: False # (bool | str) enable torch.compile() backend='inductor'; True="default", False=off, or "default|reduce-overhead|max-autotune-no-cudagraphs"
|
41
41
|
|
42
42
|
# Segmentation
|
43
43
|
overlap_mask: True # (bool) merge instance masks into one mask during training (segment only)
|
@@ -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
|
@@ -284,7 +284,8 @@ class Exporter:
|
|
284
284
|
# Get the closest match if format is invalid
|
285
285
|
matches = difflib.get_close_matches(fmt, fmts, n=1, cutoff=0.6) # 60% similarity required to match
|
286
286
|
if not matches:
|
287
|
-
|
287
|
+
msg = "Model is already in PyTorch format." if fmt == "pt" else f"Invalid export format='{fmt}'."
|
288
|
+
raise ValueError(f"{msg} Valid formats are {fmts}")
|
288
289
|
LOGGER.warning(f"Invalid export format='{fmt}', updating to format='{matches[0]}'")
|
289
290
|
fmt = matches[0]
|
290
291
|
flags = [x == fmt for x in fmts]
|
@@ -408,9 +409,9 @@ class Exporter:
|
|
408
409
|
model = model.fuse()
|
409
410
|
|
410
411
|
if imx:
|
411
|
-
from ultralytics.utils.
|
412
|
+
from ultralytics.utils.export.imx import FXModel
|
412
413
|
|
413
|
-
model = FXModel(model)
|
414
|
+
model = FXModel(model, self.imgsz)
|
414
415
|
for m in model.modules():
|
415
416
|
if isinstance(m, Classify):
|
416
417
|
m.export = True
|
@@ -425,15 +426,6 @@ class Exporter:
|
|
425
426
|
elif isinstance(m, C2f) and not is_tf_format:
|
426
427
|
# EdgeTPU does not support FlexSplitV while split provides cleaner ONNX graph
|
427
428
|
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
429
|
|
438
430
|
y = None
|
439
431
|
for _ in range(2): # dry runs
|
@@ -609,7 +601,7 @@ class Exporter:
|
|
609
601
|
self.args.opset = opset_version # for NMSModel
|
610
602
|
|
611
603
|
with arange_patch(self.args):
|
612
|
-
|
604
|
+
torch2onnx(
|
613
605
|
NMSModel(self.model, self.args) if self.args.nms else self.model,
|
614
606
|
self.im,
|
615
607
|
f,
|
@@ -922,7 +914,8 @@ class Exporter:
|
|
922
914
|
import tensorrt as trt # noqa
|
923
915
|
except ImportError:
|
924
916
|
if LINUX:
|
925
|
-
|
917
|
+
cuda_version = torch.version.cuda.split(".")[0]
|
918
|
+
check_requirements(f"tensorrt-cu{cuda_version}>7.0.0,!=10.1.0")
|
926
919
|
import tensorrt as trt # noqa
|
927
920
|
check_version(trt.__version__, ">=7.0.0", hard=True)
|
928
921
|
check_version(trt.__version__, "!=10.1.0", msg="https://github.com/ultralytics/ultralytics/pull/14239")
|
@@ -931,7 +924,7 @@ class Exporter:
|
|
931
924
|
LOGGER.info(f"\n{prefix} starting export with TensorRT {trt.__version__}...")
|
932
925
|
assert Path(f_onnx).exists(), f"failed to export ONNX file: {f_onnx}"
|
933
926
|
f = self.file.with_suffix(".engine") # TensorRT engine file
|
934
|
-
|
927
|
+
onnx2engine(
|
935
928
|
f_onnx,
|
936
929
|
f,
|
937
930
|
self.args.workspace,
|
@@ -1167,7 +1160,6 @@ class Exporter:
|
|
1167
1160
|
@try_export
|
1168
1161
|
def export_imx(self, prefix=colorstr("IMX:")):
|
1169
1162
|
"""Export YOLO model to IMX format."""
|
1170
|
-
gptq = False
|
1171
1163
|
assert LINUX, (
|
1172
1164
|
"export only supported on Linux. "
|
1173
1165
|
"See https://developer.aitrios.sony-semicon.com/en/raspberrypi-ai-camera/documentation/imx500-converter"
|
@@ -1180,13 +1172,6 @@ class Exporter:
|
|
1180
1172
|
check_requirements("imx500-converter[pt]>=3.16.1") # Separate requirements for imx500-converter
|
1181
1173
|
check_requirements("mct-quantizers>=1.6.0") # Separate for compatibility with model-compression-toolkit
|
1182
1174
|
|
1183
|
-
import model_compression_toolkit as mct
|
1184
|
-
import onnx
|
1185
|
-
from edgemdt_tpc import get_target_platform_capabilities
|
1186
|
-
from sony_custom_layers.pytorch import multiclass_nms_with_indices
|
1187
|
-
|
1188
|
-
LOGGER.info(f"\n{prefix} starting export with model_compression_toolkit {mct.__version__}...")
|
1189
|
-
|
1190
1175
|
# Install Java>=17
|
1191
1176
|
try:
|
1192
1177
|
java_output = subprocess.run(["java", "--version"], check=True, capture_output=True).stdout.decode()
|
@@ -1197,150 +1182,17 @@ class Exporter:
|
|
1197
1182
|
cmd = (["sudo"] if is_sudo_available() else []) + ["apt", "install", "-y", "openjdk-21-jre"]
|
1198
1183
|
subprocess.run(cmd, check=True)
|
1199
1184
|
|
1200
|
-
|
1201
|
-
|
1202
|
-
|
1203
|
-
|
1204
|
-
|
1205
|
-
|
1206
|
-
|
1207
|
-
|
1208
|
-
|
1209
|
-
if "C2PSA" in self.model.__str__(): # YOLO11
|
1210
|
-
if self.model.task == "detect":
|
1211
|
-
layer_names = ["sub", "mul_2", "add_14", "cat_21"]
|
1212
|
-
weights_memory = 2585350.2439
|
1213
|
-
n_layers = 238 # 238 layers for fused YOLO11n
|
1214
|
-
elif self.model.task == "pose":
|
1215
|
-
layer_names = ["sub", "mul_2", "add_14", "cat_22", "cat_23", "mul_4", "add_15"]
|
1216
|
-
weights_memory = 2437771.67
|
1217
|
-
n_layers = 257 # 257 layers for fused YOLO11n-pose
|
1218
|
-
else: # YOLOv8
|
1219
|
-
if self.model.task == "detect":
|
1220
|
-
layer_names = ["sub", "mul", "add_6", "cat_17"]
|
1221
|
-
weights_memory = 2550540.8
|
1222
|
-
n_layers = 168 # 168 layers for fused YOLOv8n
|
1223
|
-
elif self.model.task == "pose":
|
1224
|
-
layer_names = ["add_7", "mul_2", "cat_19", "mul", "sub", "add_6", "cat_18"]
|
1225
|
-
weights_memory = 2482451.85
|
1226
|
-
n_layers = 187 # 187 layers for fused YOLO11n-pose
|
1227
|
-
|
1228
|
-
# Check if the model has the expected number of layers
|
1229
|
-
if len(list(self.model.modules())) != n_layers:
|
1230
|
-
raise ValueError("IMX export only supported for YOLOv8n and YOLO11n models.")
|
1231
|
-
|
1232
|
-
for layer_name in layer_names:
|
1233
|
-
bit_cfg.set_manual_activation_bit_width([mct.core.common.network_editors.NodeNameFilter(layer_name)], 16)
|
1234
|
-
|
1235
|
-
config = mct.core.CoreConfig(
|
1236
|
-
mixed_precision_config=mct.core.MixedPrecisionQuantizationConfig(num_of_images=10),
|
1237
|
-
quantization_config=mct.core.QuantizationConfig(concat_threshold_update=True),
|
1238
|
-
bit_width_config=bit_cfg,
|
1239
|
-
)
|
1240
|
-
|
1241
|
-
resource_utilization = mct.core.ResourceUtilization(weights_memory=weights_memory)
|
1242
|
-
|
1243
|
-
quant_model = (
|
1244
|
-
mct.gptq.pytorch_gradient_post_training_quantization( # Perform Gradient-Based Post Training Quantization
|
1245
|
-
model=self.model,
|
1246
|
-
representative_data_gen=representative_dataset_gen,
|
1247
|
-
target_resource_utilization=resource_utilization,
|
1248
|
-
gptq_config=mct.gptq.get_pytorch_gptq_config(
|
1249
|
-
n_epochs=1000, use_hessian_based_weights=False, use_hessian_sample_attention=False
|
1250
|
-
),
|
1251
|
-
core_config=config,
|
1252
|
-
target_platform_capabilities=tpc,
|
1253
|
-
)[0]
|
1254
|
-
if gptq
|
1255
|
-
else mct.ptq.pytorch_post_training_quantization( # Perform post training quantization
|
1256
|
-
in_module=self.model,
|
1257
|
-
representative_data_gen=representative_dataset_gen,
|
1258
|
-
target_resource_utilization=resource_utilization,
|
1259
|
-
core_config=config,
|
1260
|
-
target_platform_capabilities=tpc,
|
1261
|
-
)[0]
|
1262
|
-
)
|
1263
|
-
|
1264
|
-
class NMSWrapper(torch.nn.Module):
|
1265
|
-
"""Wrap PyTorch Module with multiclass_nms layer from sony_custom_layers."""
|
1266
|
-
|
1267
|
-
def __init__(
|
1268
|
-
self,
|
1269
|
-
model: torch.nn.Module,
|
1270
|
-
score_threshold: float = 0.001,
|
1271
|
-
iou_threshold: float = 0.7,
|
1272
|
-
max_detections: int = 300,
|
1273
|
-
task: str = "detect",
|
1274
|
-
):
|
1275
|
-
"""
|
1276
|
-
Initialize NMSWrapper with PyTorch Module and NMS parameters.
|
1277
|
-
|
1278
|
-
Args:
|
1279
|
-
model (torch.nn.Module): Model instance.
|
1280
|
-
score_threshold (float): Score threshold for non-maximum suppression.
|
1281
|
-
iou_threshold (float): Intersection over union threshold for non-maximum suppression.
|
1282
|
-
max_detections (int): The number of detections to return.
|
1283
|
-
task (str): Task type, either 'detect' or 'pose'.
|
1284
|
-
"""
|
1285
|
-
super().__init__()
|
1286
|
-
self.model = model
|
1287
|
-
self.score_threshold = score_threshold
|
1288
|
-
self.iou_threshold = iou_threshold
|
1289
|
-
self.max_detections = max_detections
|
1290
|
-
self.task = task
|
1291
|
-
|
1292
|
-
def forward(self, images):
|
1293
|
-
"""Forward pass with model inference and NMS post-processing."""
|
1294
|
-
# model inference
|
1295
|
-
outputs = self.model(images)
|
1296
|
-
|
1297
|
-
boxes, scores = outputs[0], outputs[1]
|
1298
|
-
nms_outputs = multiclass_nms_with_indices(
|
1299
|
-
boxes=boxes,
|
1300
|
-
scores=scores,
|
1301
|
-
score_threshold=self.score_threshold,
|
1302
|
-
iou_threshold=self.iou_threshold,
|
1303
|
-
max_detections=self.max_detections,
|
1304
|
-
)
|
1305
|
-
if self.task == "pose":
|
1306
|
-
kpts = outputs[2] # (bs, max_detections, kpts 17*3)
|
1307
|
-
out_kpts = torch.gather(kpts, 1, nms_outputs.indices.unsqueeze(-1).expand(-1, -1, kpts.size(-1)))
|
1308
|
-
return nms_outputs.boxes, nms_outputs.scores, nms_outputs.labels, out_kpts
|
1309
|
-
return nms_outputs
|
1310
|
-
|
1311
|
-
quant_model = NMSWrapper(
|
1312
|
-
model=quant_model,
|
1313
|
-
score_threshold=self.args.conf or 0.001,
|
1314
|
-
iou_threshold=self.args.iou,
|
1315
|
-
max_detections=self.args.max_det,
|
1316
|
-
task=self.model.task,
|
1317
|
-
).to(self.device)
|
1318
|
-
|
1319
|
-
f = Path(str(self.file).replace(self.file.suffix, "_imx_model"))
|
1320
|
-
f.mkdir(exist_ok=True)
|
1321
|
-
onnx_model = f / Path(str(self.file.name).replace(self.file.suffix, "_imx.onnx")) # js dir
|
1322
|
-
mct.exporter.pytorch_export_model(
|
1323
|
-
model=quant_model, save_model_path=onnx_model, repr_dataset=representative_dataset_gen
|
1324
|
-
)
|
1325
|
-
|
1326
|
-
model_onnx = onnx.load(onnx_model) # load onnx model
|
1327
|
-
for k, v in self.metadata.items():
|
1328
|
-
meta = model_onnx.metadata_props.add()
|
1329
|
-
meta.key, meta.value = k, str(v)
|
1330
|
-
|
1331
|
-
onnx.save(model_onnx, onnx_model)
|
1332
|
-
|
1333
|
-
subprocess.run(
|
1334
|
-
["imxconv-pt", "-i", str(onnx_model), "-o", str(f), "--no-input-persistency", "--overwrite-output"],
|
1335
|
-
check=True,
|
1185
|
+
return torch2imx(
|
1186
|
+
self.model,
|
1187
|
+
self.file,
|
1188
|
+
self.args.conf,
|
1189
|
+
self.args.iou,
|
1190
|
+
self.args.max_det,
|
1191
|
+
metadata=self.metadata,
|
1192
|
+
dataset=self.get_int8_calibration_dataloader(prefix),
|
1193
|
+
prefix=prefix,
|
1336
1194
|
)
|
1337
1195
|
|
1338
|
-
# Needed for imx models.
|
1339
|
-
with open(f / "labels.txt", "w", encoding="utf-8") as file:
|
1340
|
-
file.writelines([f"{name}\n" for _, name in self.model.names.items()])
|
1341
|
-
|
1342
|
-
return f
|
1343
|
-
|
1344
1196
|
def _add_tflite_metadata(self, file):
|
1345
1197
|
"""Add metadata to *.tflite models per https://ai.google.dev/edge/litert/models/metadata."""
|
1346
1198
|
import zipfile
|
@@ -1530,7 +1382,7 @@ class NMSModel(torch.nn.Module):
|
|
1530
1382
|
for i in range(bs):
|
1531
1383
|
box, cls, score, extra = boxes[i], classes[i], scores[i], extras[i]
|
1532
1384
|
mask = score > self.args.conf
|
1533
|
-
if self.is_tf:
|
1385
|
+
if self.is_tf or (self.args.format == "onnx" and self.obb):
|
1534
1386
|
# TFLite GatherND error if mask is empty
|
1535
1387
|
score *= mask
|
1536
1388
|
# 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:
|
@@ -1543,8 +1543,8 @@ def parse_model(d, ch, verbose=True):
|
|
1543
1543
|
max_channels = float("inf")
|
1544
1544
|
nc, act, scales = (d.get(x) for x in ("nc", "activation", "scales"))
|
1545
1545
|
depth, width, kpt_shape = (d.get(x, 1.0) for x in ("depth_multiple", "width_multiple", "kpt_shape"))
|
1546
|
+
scale = d.get("scale")
|
1546
1547
|
if scales:
|
1547
|
-
scale = d.get("scale")
|
1548
1548
|
if not scale:
|
1549
1549
|
scale = tuple(scales.keys())[0]
|
1550
1550
|
LOGGER.warning(f"no model scale passed. Assuming scale='{scale}'.")
|
@@ -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"
|
@@ -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
|