dgenerate-ultralytics-headless 8.3.217__tar.gz → 8.3.220__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.
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/PKG-INFO +1 -1
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/dgenerate_ultralytics_headless.egg-info/PKG-INFO +1 -1
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/tests/test_cli.py +8 -1
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/tests/test_exports.py +37 -9
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/__init__.py +1 -1
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/default.yaml +1 -1
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/data/build.py +106 -1
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/engine/exporter.py +57 -4
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/engine/predictor.py +1 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/engine/trainer.py +37 -31
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/engine/validator.py +27 -9
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/fastsam/predict.py +10 -16
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/classify/train.py +2 -15
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/classify/val.py +15 -1
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/detect/val.py +17 -1
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/nn/autobackend.py +27 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/solutions/similarity_search.py +2 -2
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/torch_utils.py +1 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/LICENSE +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/README.md +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/dgenerate_ultralytics_headless.egg-info/SOURCES.txt +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/dgenerate_ultralytics_headless.egg-info/dependency_links.txt +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/dgenerate_ultralytics_headless.egg-info/entry_points.txt +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/dgenerate_ultralytics_headless.egg-info/requires.txt +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/dgenerate_ultralytics_headless.egg-info/top_level.txt +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/pyproject.toml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/setup.cfg +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/tests/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/tests/conftest.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/tests/test_cuda.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/tests/test_engine.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/tests/test_integrations.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/tests/test_python.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/tests/test_solutions.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/assets/bus.jpg +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/assets/zidane.jpg +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/HomeObjects-3K.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/VOC.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/coco.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/coco128.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/coco8-grayscale.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/coco8-multispectral.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/coco8.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/construction-ppe.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/dog-pose.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/dota8-multispectral.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/dota8.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/hand-keypoints.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/lvis.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/medical-pills.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/signature.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/xView.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/11/yolo11-cls-resnet18.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/11/yolo11-cls.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/11/yolo11-obb.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/11/yolo11-pose.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/11/yolo11-seg.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/11/yolo11.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/11/yoloe-11-seg.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/11/yoloe-11.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/12/yolo12-cls.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/12/yolo12-obb.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/12/yolo12-pose.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/12/yolo12-seg.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/12/yolo12.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v10/yolov10b.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v10/yolov10l.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v10/yolov10m.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v10/yolov10n.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v10/yolov10s.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v10/yolov10x.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v8/yoloe-v8-seg.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v8/yoloe-v8.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v9/yolov9m.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v9/yolov9s.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v9/yolov9t.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/trackers/botsort.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/data/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/data/annotator.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/data/augment.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/data/base.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/data/converter.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/data/dataset.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/data/loaders.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/data/scripts/download_weights.sh +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/data/scripts/get_coco.sh +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/data/scripts/get_coco128.sh +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/data/scripts/get_imagenet.sh +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/data/split.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/data/split_dota.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/data/utils.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/engine/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/engine/model.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/engine/results.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/engine/tuner.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/hub/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/hub/auth.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/hub/google/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/hub/session.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/hub/utils.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/fastsam/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/fastsam/model.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/fastsam/utils.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/fastsam/val.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/nas/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/nas/model.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/nas/predict.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/nas/val.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/rtdetr/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/rtdetr/model.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/rtdetr/predict.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/rtdetr/train.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/rtdetr/val.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/sam/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/sam/amg.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/sam/build.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/sam/model.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/sam/modules/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/sam/modules/blocks.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/sam/modules/decoders.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/sam/modules/encoders.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/sam/modules/memory_attention.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/sam/modules/sam.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/sam/modules/transformer.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/sam/modules/utils.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/sam/predict.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/utils/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/utils/loss.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/utils/ops.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/classify/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/classify/predict.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/detect/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/detect/predict.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/detect/train.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/model.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/obb/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/obb/predict.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/obb/train.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/obb/val.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/pose/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/pose/predict.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/pose/train.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/pose/val.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/segment/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/segment/predict.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/segment/train.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/segment/val.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/world/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/world/train.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/world/train_world.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/yoloe/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/yoloe/predict.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/yoloe/train.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/yoloe/train_seg.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/yoloe/val.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/nn/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/nn/modules/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/nn/modules/activation.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/nn/modules/block.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/nn/modules/conv.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/nn/modules/head.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/nn/modules/transformer.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/nn/modules/utils.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/nn/tasks.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/nn/text_model.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/py.typed +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/solutions/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/solutions/ai_gym.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/solutions/analytics.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/solutions/config.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/solutions/distance_calculation.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/solutions/heatmap.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/solutions/instance_segmentation.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/solutions/object_blurrer.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/solutions/object_counter.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/solutions/object_cropper.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/solutions/parking_management.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/solutions/queue_management.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/solutions/region_counter.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/solutions/security_alarm.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/solutions/solutions.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/solutions/speed_estimation.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/solutions/streamlit_inference.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/solutions/templates/similarity-search.html +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/solutions/trackzone.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/solutions/vision_eye.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/trackers/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/trackers/basetrack.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/trackers/bot_sort.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/trackers/byte_tracker.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/trackers/track.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/trackers/utils/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/trackers/utils/gmc.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/trackers/utils/kalman_filter.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/trackers/utils/matching.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/autobatch.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/autodevice.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/benchmarks.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/callbacks/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/callbacks/base.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/callbacks/clearml.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/callbacks/comet.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/callbacks/dvc.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/callbacks/hub.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/callbacks/mlflow.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/callbacks/neptune.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/callbacks/platform.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/callbacks/raytune.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/callbacks/tensorboard.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/callbacks/wb.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/checks.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/cpu.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/dist.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/downloads.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/errors.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/events.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/export/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/export/imx.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/files.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/git.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/instance.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/logger.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/loss.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/metrics.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/nms.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/ops.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/patches.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/plotting.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/tal.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/tqdm.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/triton.py +0 -0
- {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/tuner.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dgenerate-ultralytics-headless
|
|
3
|
-
Version: 8.3.
|
|
3
|
+
Version: 8.3.220
|
|
4
4
|
Summary: Automatically built Ultralytics package with python-opencv-headless dependency instead of python-opencv
|
|
5
5
|
Author-email: Glenn Jocher <glenn.jocher@ultralytics.com>, Jing Qiu <jing.qiu@ultralytics.com>
|
|
6
6
|
Maintainer-email: Ultralytics <hello@ultralytics.com>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dgenerate-ultralytics-headless
|
|
3
|
-
Version: 8.3.
|
|
3
|
+
Version: 8.3.220
|
|
4
4
|
Summary: Automatically built Ultralytics package with python-opencv-headless dependency instead of python-opencv
|
|
5
5
|
Author-email: Glenn Jocher <glenn.jocher@ultralytics.com>, Jing Qiu <jing.qiu@ultralytics.com>
|
|
6
6
|
Maintainer-email: Ultralytics <hello@ultralytics.com>
|
{dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/tests/test_cli.py
RENAMED
|
@@ -8,7 +8,7 @@ from PIL import Image
|
|
|
8
8
|
|
|
9
9
|
from tests import CUDA_DEVICE_COUNT, CUDA_IS_AVAILABLE, MODELS, TASK_MODEL_DATA
|
|
10
10
|
from ultralytics.utils import ARM64, ASSETS, LINUX, WEIGHTS_DIR, checks
|
|
11
|
-
from ultralytics.utils.torch_utils import TORCH_1_11
|
|
11
|
+
from ultralytics.utils.torch_utils import TORCH_1_11, TORCH_2_9, WINDOWS
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
def run(cmd: str) -> None:
|
|
@@ -129,3 +129,10 @@ def test_train_gpu(task: str, model: str, data: str) -> None:
|
|
|
129
129
|
def test_solutions(solution: str) -> None:
|
|
130
130
|
"""Test yolo solutions command-line modes."""
|
|
131
131
|
run(f"yolo solutions {solution} verbose=False")
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
@pytest.mark.skipif(not checks.IS_PYTHON_MINIMUM_3_10 or not TORCH_2_9, reason="Requires Python>=3.10 and Torch>=2.9.0")
|
|
135
|
+
@pytest.mark.skipif(WINDOWS, reason="Skipping test on Windows")
|
|
136
|
+
def test_export_executorch() -> None:
|
|
137
|
+
"""Test exporting a YOLO model to ExecuTorch format via CLI."""
|
|
138
|
+
run("yolo export model=yolo11n.pt format=executorch imgsz=32")
|
|
@@ -12,15 +12,8 @@ import pytest
|
|
|
12
12
|
from tests import MODEL, SOURCE
|
|
13
13
|
from ultralytics import YOLO
|
|
14
14
|
from ultralytics.cfg import TASK2DATA, TASK2MODEL, TASKS
|
|
15
|
-
from ultralytics.utils import
|
|
16
|
-
|
|
17
|
-
IS_RASPBERRYPI,
|
|
18
|
-
LINUX,
|
|
19
|
-
MACOS,
|
|
20
|
-
WINDOWS,
|
|
21
|
-
checks,
|
|
22
|
-
)
|
|
23
|
-
from ultralytics.utils.torch_utils import TORCH_1_11, TORCH_1_13, TORCH_2_1
|
|
15
|
+
from ultralytics.utils import ARM64, IS_RASPBERRYPI, LINUX, MACOS, WINDOWS, checks
|
|
16
|
+
from ultralytics.utils.torch_utils import TORCH_1_11, TORCH_1_13, TORCH_2_1, TORCH_2_9
|
|
24
17
|
|
|
25
18
|
|
|
26
19
|
def test_export_torchscript():
|
|
@@ -262,3 +255,38 @@ def test_export_imx():
|
|
|
262
255
|
model = YOLO("yolov8n.pt")
|
|
263
256
|
file = model.export(format="imx", imgsz=32)
|
|
264
257
|
YOLO(file)(SOURCE, imgsz=32)
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
@pytest.mark.skipif(not checks.IS_PYTHON_MINIMUM_3_10 or not TORCH_2_9, reason="Requires Python>=3.10 and Torch>=2.9.0")
|
|
261
|
+
@pytest.mark.skipif(WINDOWS, reason="Skipping test on Windows")
|
|
262
|
+
def test_export_executorch():
|
|
263
|
+
"""Test YOLO model export to ExecuTorch format."""
|
|
264
|
+
file = YOLO(MODEL).export(format="executorch", imgsz=32)
|
|
265
|
+
assert Path(file).exists(), f"ExecuTorch export failed, directory not found: {file}"
|
|
266
|
+
# Check that .pte file exists in the exported directory
|
|
267
|
+
pte_file = Path(file) / Path(MODEL).with_suffix(".pte").name
|
|
268
|
+
assert pte_file.exists(), f"ExecuTorch .pte file not found: {pte_file}"
|
|
269
|
+
# Check that metadata.yaml exists
|
|
270
|
+
metadata_file = Path(file) / "metadata.yaml"
|
|
271
|
+
assert metadata_file.exists(), f"ExecuTorch metadata.yaml not found: {metadata_file}"
|
|
272
|
+
# Note: Inference testing skipped as ExecuTorch requires special runtime setup
|
|
273
|
+
shutil.rmtree(file, ignore_errors=True) # cleanup
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
@pytest.mark.slow
|
|
277
|
+
@pytest.mark.skipif(not checks.IS_PYTHON_MINIMUM_3_10 or not TORCH_2_9, reason="Requires Python>=3.10 and Torch>=2.9.0")
|
|
278
|
+
@pytest.mark.skipif(WINDOWS, reason="Skipping test on Windows")
|
|
279
|
+
@pytest.mark.parametrize("task", TASKS)
|
|
280
|
+
def test_export_executorch_matrix(task):
|
|
281
|
+
"""Test YOLO export to ExecuTorch format for various task types."""
|
|
282
|
+
file = YOLO(TASK2MODEL[task]).export(format="executorch", imgsz=32)
|
|
283
|
+
assert Path(file).exists(), f"ExecuTorch export failed for task '{task}', directory not found: {file}"
|
|
284
|
+
# Check that .pte file exists in the exported directory
|
|
285
|
+
model_name = Path(TASK2MODEL[task]).with_suffix(".pte").name
|
|
286
|
+
pte_file = Path(file) / model_name
|
|
287
|
+
assert pte_file.exists(), f"ExecuTorch .pte file not found for task '{task}': {pte_file}"
|
|
288
|
+
# Check that metadata.yaml exists
|
|
289
|
+
metadata_file = Path(file) / "metadata.yaml"
|
|
290
|
+
assert metadata_file.exists(), f"ExecuTorch metadata.yaml not found for task '{task}': {metadata_file}"
|
|
291
|
+
# Note: Inference testing skipped as ExecuTorch requires special runtime setup
|
|
292
|
+
shutil.rmtree(file, ignore_errors=True) # cleanup
|
|
@@ -80,7 +80,7 @@ show_boxes: True # (bool) draw bounding boxes on images
|
|
|
80
80
|
line_width: # (int, optional) line width of boxes; auto-scales with image size if not set
|
|
81
81
|
|
|
82
82
|
# Export settings ------------------------------------------------------------------------------------------------------
|
|
83
|
-
format: torchscript # (str) target format, e.g. torchscript|onnx|openvino|engine|coreml|saved_model|pb|tflite|edgetpu|tfjs|paddle|mnn|ncnn|imx|rknn
|
|
83
|
+
format: torchscript # (str) target format, e.g. torchscript|onnx|openvino|engine|coreml|saved_model|pb|tflite|edgetpu|tfjs|paddle|mnn|ncnn|imx|rknn|executorch
|
|
84
84
|
keras: False # (bool) TF SavedModel only (format=saved_model); enable Keras layers during export
|
|
85
85
|
optimize: False # (bool) TorchScript only; apply mobile optimizations to the scripted model
|
|
86
86
|
int8: False # (bool) INT8/PTQ where supported (openvino, tflite, tfjs, engine, imx); needs calibration data/fraction
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
import math
|
|
5
6
|
import os
|
|
6
7
|
import random
|
|
7
8
|
from collections.abc import Iterator
|
|
@@ -11,6 +12,7 @@ from urllib.parse import urlsplit
|
|
|
11
12
|
|
|
12
13
|
import numpy as np
|
|
13
14
|
import torch
|
|
15
|
+
import torch.distributed as dist
|
|
14
16
|
from PIL import Image
|
|
15
17
|
from torch.utils.data import dataloader, distributed
|
|
16
18
|
|
|
@@ -112,6 +114,103 @@ class _RepeatSampler:
|
|
|
112
114
|
yield from iter(self.sampler)
|
|
113
115
|
|
|
114
116
|
|
|
117
|
+
class ContiguousDistributedSampler(torch.utils.data.Sampler):
|
|
118
|
+
"""
|
|
119
|
+
Distributed sampler that assigns contiguous batch-aligned chunks of the dataset to each GPU.
|
|
120
|
+
|
|
121
|
+
Unlike PyTorch's DistributedSampler which distributes samples in a round-robin fashion (GPU 0 gets indices
|
|
122
|
+
[0,2,4,...], GPU 1 gets [1,3,5,...]), this sampler gives each GPU contiguous batches of the dataset
|
|
123
|
+
(GPU 0 gets batches [0,1,2,...], GPU 1 gets batches [k,k+1,...], etc.). This preserves any ordering or
|
|
124
|
+
grouping in the original dataset, which is critical when samples are organized by similarity (e.g., images
|
|
125
|
+
sorted by size to enable efficient batching without padding when using rect=True).
|
|
126
|
+
|
|
127
|
+
The sampler handles uneven batch counts by distributing remainder batches to the first few ranks, ensuring
|
|
128
|
+
all samples are covered exactly once across all GPUs.
|
|
129
|
+
|
|
130
|
+
Args:
|
|
131
|
+
dataset (torch.utils.data.Dataset): Dataset to sample from. Must implement __len__.
|
|
132
|
+
num_replicas (int, optional): Number of distributed processes. Defaults to world size.
|
|
133
|
+
batch_size (int, optional): Batch size used by dataloader. Defaults to dataset batch size.
|
|
134
|
+
rank (int, optional): Rank of current process. Defaults to current rank.
|
|
135
|
+
shuffle (bool, optional): Whether to shuffle indices within each rank's chunk. Defaults to False.
|
|
136
|
+
When True, shuffling is deterministic and controlled by set_epoch() for reproducibility.
|
|
137
|
+
|
|
138
|
+
Example:
|
|
139
|
+
>>> # For validation with size-grouped images
|
|
140
|
+
>>> sampler = ContiguousDistributedSampler(val_dataset, batch_size=32, shuffle=False)
|
|
141
|
+
>>> loader = DataLoader(val_dataset, batch_size=32, sampler=sampler)
|
|
142
|
+
>>> # For training with shuffling
|
|
143
|
+
>>> sampler = ContiguousDistributedSampler(train_dataset, batch_size=32, shuffle=True)
|
|
144
|
+
>>> for epoch in range(num_epochs):
|
|
145
|
+
... sampler.set_epoch(epoch)
|
|
146
|
+
... for batch in loader:
|
|
147
|
+
... ...
|
|
148
|
+
"""
|
|
149
|
+
|
|
150
|
+
def __init__(self, dataset, num_replicas=None, batch_size=None, rank=None, shuffle=False):
|
|
151
|
+
"""Initialize the sampler with dataset and distributed training parameters."""
|
|
152
|
+
if num_replicas is None:
|
|
153
|
+
num_replicas = dist.get_world_size() if dist.is_initialized() else 1
|
|
154
|
+
if rank is None:
|
|
155
|
+
rank = dist.get_rank() if dist.is_initialized() else 0
|
|
156
|
+
if batch_size is None:
|
|
157
|
+
batch_size = getattr(dataset, "batch_size", 1)
|
|
158
|
+
|
|
159
|
+
self.dataset = dataset
|
|
160
|
+
self.num_replicas = num_replicas
|
|
161
|
+
self.batch_size = batch_size
|
|
162
|
+
self.rank = rank
|
|
163
|
+
self.epoch = 0
|
|
164
|
+
self.shuffle = shuffle
|
|
165
|
+
self.total_size = len(dataset)
|
|
166
|
+
self.num_batches = math.ceil(self.total_size / self.batch_size)
|
|
167
|
+
|
|
168
|
+
def _get_rank_indices(self):
|
|
169
|
+
"""Calculate the start and end sample indices for this rank."""
|
|
170
|
+
# Calculate which batches this rank handles
|
|
171
|
+
batches_per_rank_base = self.num_batches // self.num_replicas
|
|
172
|
+
remainder = self.num_batches % self.num_replicas
|
|
173
|
+
|
|
174
|
+
# This rank gets an extra batch if rank < remainder
|
|
175
|
+
batches_for_this_rank = batches_per_rank_base + (1 if self.rank < remainder else 0)
|
|
176
|
+
|
|
177
|
+
# Calculate starting batch: base position + number of extra batches given to earlier ranks
|
|
178
|
+
start_batch = self.rank * batches_per_rank_base + min(self.rank, remainder)
|
|
179
|
+
end_batch = start_batch + batches_for_this_rank
|
|
180
|
+
|
|
181
|
+
# Convert batch indices to sample indices
|
|
182
|
+
start_idx = start_batch * self.batch_size
|
|
183
|
+
end_idx = min(end_batch * self.batch_size, self.total_size)
|
|
184
|
+
|
|
185
|
+
return start_idx, end_idx
|
|
186
|
+
|
|
187
|
+
def __iter__(self):
|
|
188
|
+
"""Generate indices for this rank's contiguous chunk of the dataset."""
|
|
189
|
+
start_idx, end_idx = self._get_rank_indices()
|
|
190
|
+
indices = list(range(start_idx, end_idx))
|
|
191
|
+
|
|
192
|
+
if self.shuffle:
|
|
193
|
+
g = torch.Generator()
|
|
194
|
+
g.manual_seed(self.epoch)
|
|
195
|
+
indices = [indices[i] for i in torch.randperm(len(indices), generator=g).tolist()]
|
|
196
|
+
|
|
197
|
+
return iter(indices)
|
|
198
|
+
|
|
199
|
+
def __len__(self):
|
|
200
|
+
"""Return the number of samples in this rank's chunk."""
|
|
201
|
+
start_idx, end_idx = self._get_rank_indices()
|
|
202
|
+
return end_idx - start_idx
|
|
203
|
+
|
|
204
|
+
def set_epoch(self, epoch):
|
|
205
|
+
"""
|
|
206
|
+
Set the epoch for this sampler to ensure different shuffling patterns across epochs.
|
|
207
|
+
|
|
208
|
+
Args:
|
|
209
|
+
epoch (int): Epoch number to use as the random seed for shuffling.
|
|
210
|
+
"""
|
|
211
|
+
self.epoch = epoch
|
|
212
|
+
|
|
213
|
+
|
|
115
214
|
def seed_worker(worker_id: int): # noqa
|
|
116
215
|
"""Set dataloader worker seed for reproducibility across worker processes."""
|
|
117
216
|
worker_seed = torch.initial_seed() % 2**32
|
|
@@ -213,7 +312,13 @@ def build_dataloader(
|
|
|
213
312
|
batch = min(batch, len(dataset))
|
|
214
313
|
nd = torch.cuda.device_count() # number of CUDA devices
|
|
215
314
|
nw = min(os.cpu_count() // max(nd, 1), workers) # number of workers
|
|
216
|
-
sampler =
|
|
315
|
+
sampler = (
|
|
316
|
+
None
|
|
317
|
+
if rank == -1
|
|
318
|
+
else distributed.DistributedSampler(dataset, shuffle=shuffle)
|
|
319
|
+
if shuffle
|
|
320
|
+
else ContiguousDistributedSampler(dataset)
|
|
321
|
+
)
|
|
217
322
|
generator = torch.Generator()
|
|
218
323
|
generator.manual_seed(6148914691236517205 + RANK)
|
|
219
324
|
return InfiniteDataLoader(
|
|
@@ -20,6 +20,7 @@ MNN | `mnn` | yolo11n.mnn
|
|
|
20
20
|
NCNN | `ncnn` | yolo11n_ncnn_model/
|
|
21
21
|
IMX | `imx` | yolo11n_imx_model/
|
|
22
22
|
RKNN | `rknn` | yolo11n_rknn_model/
|
|
23
|
+
ExecuTorch | `executorch` | yolo11n_executorch_model/
|
|
23
24
|
|
|
24
25
|
Requirements:
|
|
25
26
|
$ pip install "ultralytics[export]"
|
|
@@ -48,6 +49,7 @@ Inference:
|
|
|
48
49
|
yolo11n_ncnn_model # NCNN
|
|
49
50
|
yolo11n_imx_model # IMX
|
|
50
51
|
yolo11n_rknn_model # RKNN
|
|
52
|
+
yolo11n_executorch_model # ExecuTorch
|
|
51
53
|
|
|
52
54
|
TensorFlow.js:
|
|
53
55
|
$ cd .. && git clone https://github.com/zldrobit/tfjs-yolov5-example.git && cd tfjs-yolov5-example
|
|
@@ -112,7 +114,7 @@ from ultralytics.utils.metrics import batch_probiou
|
|
|
112
114
|
from ultralytics.utils.nms import TorchNMS
|
|
113
115
|
from ultralytics.utils.ops import Profile
|
|
114
116
|
from ultralytics.utils.patches import arange_patch
|
|
115
|
-
from ultralytics.utils.torch_utils import TORCH_1_11, TORCH_1_13, TORCH_2_1, TORCH_2_4, select_device
|
|
117
|
+
from ultralytics.utils.torch_utils import TORCH_1_11, TORCH_1_13, TORCH_2_1, TORCH_2_4, TORCH_2_9, select_device
|
|
116
118
|
|
|
117
119
|
|
|
118
120
|
def export_formats():
|
|
@@ -148,6 +150,7 @@ def export_formats():
|
|
|
148
150
|
["NCNN", "ncnn", "_ncnn_model", True, True, ["batch", "half"]],
|
|
149
151
|
["IMX", "imx", "_imx_model", True, True, ["int8", "fraction", "nms"]],
|
|
150
152
|
["RKNN", "rknn", "_rknn_model", False, False, ["batch", "name"]],
|
|
153
|
+
["ExecuTorch", "executorch", "_executorch_model", False, False, ["batch"]],
|
|
151
154
|
]
|
|
152
155
|
return dict(zip(["Format", "Argument", "Suffix", "CPU", "GPU", "Arguments"], zip(*x)))
|
|
153
156
|
|
|
@@ -322,9 +325,24 @@ class Exporter:
|
|
|
322
325
|
flags = [x == fmt for x in fmts]
|
|
323
326
|
if sum(flags) != 1:
|
|
324
327
|
raise ValueError(f"Invalid export format='{fmt}'. Valid formats are {fmts}")
|
|
325
|
-
(
|
|
326
|
-
|
|
327
|
-
|
|
328
|
+
(
|
|
329
|
+
jit,
|
|
330
|
+
onnx,
|
|
331
|
+
xml,
|
|
332
|
+
engine,
|
|
333
|
+
coreml,
|
|
334
|
+
saved_model,
|
|
335
|
+
pb,
|
|
336
|
+
tflite,
|
|
337
|
+
edgetpu,
|
|
338
|
+
tfjs,
|
|
339
|
+
paddle,
|
|
340
|
+
mnn,
|
|
341
|
+
ncnn,
|
|
342
|
+
imx,
|
|
343
|
+
rknn,
|
|
344
|
+
executorch,
|
|
345
|
+
) = flags # export booleans
|
|
328
346
|
|
|
329
347
|
is_tf_format = any((saved_model, pb, tflite, edgetpu, tfjs))
|
|
330
348
|
|
|
@@ -543,6 +561,8 @@ class Exporter:
|
|
|
543
561
|
f[13] = self.export_imx()
|
|
544
562
|
if rknn:
|
|
545
563
|
f[14] = self.export_rknn()
|
|
564
|
+
if executorch:
|
|
565
|
+
f[15] = self.export_executorch()
|
|
546
566
|
|
|
547
567
|
# Finish
|
|
548
568
|
f = [str(x) for x in f if x] # filter out '' and None
|
|
@@ -1122,6 +1142,39 @@ class Exporter:
|
|
|
1122
1142
|
f = saved_model / f"{self.file.stem}_float32.tflite"
|
|
1123
1143
|
return str(f)
|
|
1124
1144
|
|
|
1145
|
+
@try_export
|
|
1146
|
+
def export_executorch(self, prefix=colorstr("ExecuTorch:")):
|
|
1147
|
+
"""Exports a model to ExecuTorch (.pte) format into a dedicated directory and saves the required metadata,
|
|
1148
|
+
following Ultralytics conventions.
|
|
1149
|
+
"""
|
|
1150
|
+
LOGGER.info(f"\n{prefix} starting export with ExecuTorch...")
|
|
1151
|
+
assert TORCH_2_9, f"ExecuTorch export requires torch>=2.9.0 but torch=={TORCH_VERSION} is installed"
|
|
1152
|
+
# TorchAO release compatibility table bug https://github.com/pytorch/ao/issues/2919
|
|
1153
|
+
# Setuptools bug: https://github.com/pypa/setuptools/issues/4483
|
|
1154
|
+
check_requirements("setuptools<71.0.0") # Setuptools bug: https://github.com/pypa/setuptools/issues/4483
|
|
1155
|
+
check_requirements(("executorch==1.0.0", "flatbuffers"))
|
|
1156
|
+
|
|
1157
|
+
import torch
|
|
1158
|
+
from executorch.backends.xnnpack.partition.xnnpack_partitioner import XnnpackPartitioner
|
|
1159
|
+
from executorch.exir import to_edge_transform_and_lower
|
|
1160
|
+
|
|
1161
|
+
file_directory = Path(str(self.file).replace(self.file.suffix, "_executorch_model"))
|
|
1162
|
+
file_directory.mkdir(parents=True, exist_ok=True)
|
|
1163
|
+
|
|
1164
|
+
file_pte = file_directory / self.file.with_suffix(".pte").name
|
|
1165
|
+
sample_inputs = (self.im,)
|
|
1166
|
+
|
|
1167
|
+
et_program = to_edge_transform_and_lower(
|
|
1168
|
+
torch.export.export(self.model, sample_inputs), partitioner=[XnnpackPartitioner()]
|
|
1169
|
+
).to_executorch()
|
|
1170
|
+
|
|
1171
|
+
with open(file_pte, "wb") as file:
|
|
1172
|
+
file.write(et_program.buffer)
|
|
1173
|
+
|
|
1174
|
+
YAML.save(file_directory / "metadata.yaml", self.metadata)
|
|
1175
|
+
|
|
1176
|
+
return str(file_directory)
|
|
1177
|
+
|
|
1125
1178
|
@try_export
|
|
1126
1179
|
def export_edgetpu(self, tflite_model="", prefix=colorstr("Edge TPU:")):
|
|
1127
1180
|
"""Export YOLO model to Edge TPU format https://coral.ai/docs/edgetpu/models-intro/."""
|
|
@@ -318,18 +318,18 @@ class BaseTrainer:
|
|
|
318
318
|
self.train_loader = self.get_dataloader(
|
|
319
319
|
self.data["train"], batch_size=batch_size, rank=LOCAL_RANK, mode="train"
|
|
320
320
|
)
|
|
321
|
+
# Note: When training DOTA dataset, double batch size could get OOM on images with >2000 objects.
|
|
322
|
+
self.test_loader = self.get_dataloader(
|
|
323
|
+
self.data.get("val") or self.data.get("test"),
|
|
324
|
+
batch_size=batch_size if self.args.task == "obb" else batch_size * 2,
|
|
325
|
+
rank=LOCAL_RANK,
|
|
326
|
+
mode="val",
|
|
327
|
+
)
|
|
328
|
+
self.validator = self.get_validator()
|
|
329
|
+
self.ema = ModelEMA(self.model)
|
|
321
330
|
if RANK in {-1, 0}:
|
|
322
|
-
# Note: When training DOTA dataset, double batch size could get OOM on images with >2000 objects.
|
|
323
|
-
self.test_loader = self.get_dataloader(
|
|
324
|
-
self.data.get("val") or self.data.get("test"),
|
|
325
|
-
batch_size=batch_size if self.args.task == "obb" else batch_size * 2,
|
|
326
|
-
rank=-1,
|
|
327
|
-
mode="val",
|
|
328
|
-
)
|
|
329
|
-
self.validator = self.get_validator()
|
|
330
331
|
metric_keys = self.validator.metrics.keys + self.label_loss_items(prefix="val")
|
|
331
332
|
self.metrics = dict(zip(metric_keys, [0] * len(metric_keys)))
|
|
332
|
-
self.ema = ModelEMA(self.model)
|
|
333
333
|
if self.args.plots:
|
|
334
334
|
self.plot_training_labels()
|
|
335
335
|
|
|
@@ -467,10 +467,10 @@ class BaseTrainer:
|
|
|
467
467
|
final_epoch = epoch + 1 >= self.epochs
|
|
468
468
|
self.ema.update_attr(self.model, include=["yaml", "nc", "args", "names", "stride", "class_weights"])
|
|
469
469
|
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
470
|
+
# Validation
|
|
471
|
+
if self.args.val or final_epoch or self.stopper.possible_stop or self.stop:
|
|
472
|
+
self._clear_memory(threshold=0.5) # prevent VRAM spike
|
|
473
|
+
self.metrics, self.fitness = self.validate()
|
|
474
474
|
|
|
475
475
|
# NaN recovery
|
|
476
476
|
if self._handle_nan_recovery(epoch):
|
|
@@ -510,11 +510,11 @@ class BaseTrainer:
|
|
|
510
510
|
break # must break all DDP ranks
|
|
511
511
|
epoch += 1
|
|
512
512
|
|
|
513
|
+
seconds = time.time() - self.train_time_start
|
|
514
|
+
LOGGER.info(f"\n{epoch - self.start_epoch + 1} epochs completed in {seconds / 3600:.3f} hours.")
|
|
515
|
+
# Do final val with best.pt
|
|
516
|
+
self.final_eval()
|
|
513
517
|
if RANK in {-1, 0}:
|
|
514
|
-
# Do final val with best.pt
|
|
515
|
-
seconds = time.time() - self.train_time_start
|
|
516
|
-
LOGGER.info(f"\n{epoch - self.start_epoch + 1} epochs completed in {seconds / 3600:.3f} hours.")
|
|
517
|
-
self.final_eval()
|
|
518
518
|
if self.args.plots:
|
|
519
519
|
self.plot_metrics()
|
|
520
520
|
self.run_callbacks("on_train_end")
|
|
@@ -695,7 +695,13 @@ class BaseTrainer:
|
|
|
695
695
|
metrics (dict): Dictionary of validation metrics.
|
|
696
696
|
fitness (float): Fitness score for the validation.
|
|
697
697
|
"""
|
|
698
|
+
if self.ema and self.world_size > 1:
|
|
699
|
+
# Sync EMA buffers from rank 0 to all ranks
|
|
700
|
+
for buffer in self.ema.ema.buffers():
|
|
701
|
+
dist.broadcast(buffer, src=0)
|
|
698
702
|
metrics = self.validator(self)
|
|
703
|
+
if metrics is None:
|
|
704
|
+
return None, None
|
|
699
705
|
fitness = metrics.pop("fitness", -self.loss.detach().cpu().numpy()) # use loss as fitness measure if not found
|
|
700
706
|
if not self.best_fitness or self.best_fitness < fitness:
|
|
701
707
|
self.best_fitness = fitness
|
|
@@ -768,20 +774,20 @@ class BaseTrainer:
|
|
|
768
774
|
|
|
769
775
|
def final_eval(self):
|
|
770
776
|
"""Perform final evaluation and validation for object detection YOLO model."""
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
if
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
777
|
+
model = self.best if self.best.exists() else None
|
|
778
|
+
with torch_distributed_zero_first(LOCAL_RANK): # strip only on GPU 0; other GPUs should wait
|
|
779
|
+
if RANK in {-1, 0}:
|
|
780
|
+
ckpt = strip_optimizer(self.last) if self.last.exists() else {}
|
|
781
|
+
if model:
|
|
782
|
+
# update best.pt train_metrics from last.pt
|
|
783
|
+
strip_optimizer(self.best, updates={"train_results": ckpt.get("train_results")})
|
|
784
|
+
if model:
|
|
785
|
+
LOGGER.info(f"\nValidating {model}...")
|
|
786
|
+
self.validator.args.plots = self.args.plots
|
|
787
|
+
self.validator.args.compile = False # disable final val compile as too slow
|
|
788
|
+
self.metrics = self.validator(model=model)
|
|
789
|
+
self.metrics.pop("fitness", None)
|
|
790
|
+
self.run_callbacks("on_fit_epoch_end")
|
|
785
791
|
|
|
786
792
|
def check_resume(self, overrides):
|
|
787
793
|
"""Check if resume checkpoint exists and update arguments accordingly."""
|
|
@@ -29,11 +29,12 @@ from pathlib import Path
|
|
|
29
29
|
|
|
30
30
|
import numpy as np
|
|
31
31
|
import torch
|
|
32
|
+
import torch.distributed as dist
|
|
32
33
|
|
|
33
34
|
from ultralytics.cfg import get_cfg, get_save_dir
|
|
34
35
|
from ultralytics.data.utils import check_cls_dataset, check_det_dataset
|
|
35
36
|
from ultralytics.nn.autobackend import AutoBackend
|
|
36
|
-
from ultralytics.utils import LOGGER, TQDM, callbacks, colorstr, emojis
|
|
37
|
+
from ultralytics.utils import LOGGER, RANK, TQDM, callbacks, colorstr, emojis
|
|
37
38
|
from ultralytics.utils.checks import check_imgsz
|
|
38
39
|
from ultralytics.utils.ops import Profile
|
|
39
40
|
from ultralytics.utils.torch_utils import attempt_compile, select_device, smart_inference_mode, unwrap_model
|
|
@@ -160,7 +161,7 @@ class BaseValidator:
|
|
|
160
161
|
callbacks.add_integration_callbacks(self)
|
|
161
162
|
model = AutoBackend(
|
|
162
163
|
model=model or self.args.model,
|
|
163
|
-
device=select_device(self.args.device),
|
|
164
|
+
device=select_device(self.args.device) if RANK == -1 else torch.device("cuda", RANK),
|
|
164
165
|
dnn=self.args.dnn,
|
|
165
166
|
data=self.args.data,
|
|
166
167
|
fp16=self.args.half,
|
|
@@ -223,21 +224,34 @@ class BaseValidator:
|
|
|
223
224
|
preds = self.postprocess(preds)
|
|
224
225
|
|
|
225
226
|
self.update_metrics(preds, batch)
|
|
226
|
-
if self.args.plots and batch_i < 3:
|
|
227
|
+
if self.args.plots and batch_i < 3 and RANK in {-1, 0}:
|
|
227
228
|
self.plot_val_samples(batch, batch_i)
|
|
228
229
|
self.plot_predictions(batch, preds, batch_i)
|
|
229
230
|
|
|
230
231
|
self.run_callbacks("on_val_batch_end")
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
self.
|
|
234
|
-
|
|
235
|
-
|
|
232
|
+
|
|
233
|
+
stats = {}
|
|
234
|
+
self.gather_stats()
|
|
235
|
+
if RANK in {-1, 0}:
|
|
236
|
+
stats = self.get_stats()
|
|
237
|
+
self.speed = dict(zip(self.speed.keys(), (x.t / len(self.dataloader.dataset) * 1e3 for x in dt)))
|
|
238
|
+
self.finalize_metrics()
|
|
239
|
+
self.print_results()
|
|
240
|
+
self.run_callbacks("on_val_end")
|
|
241
|
+
|
|
236
242
|
if self.training:
|
|
237
243
|
model.float()
|
|
238
|
-
|
|
244
|
+
# Reduce loss across all GPUs
|
|
245
|
+
loss = self.loss.clone().detach()
|
|
246
|
+
if trainer.world_size > 1:
|
|
247
|
+
dist.reduce(loss, dst=0, op=dist.ReduceOp.AVG)
|
|
248
|
+
if RANK > 0:
|
|
249
|
+
return
|
|
250
|
+
results = {**stats, **trainer.label_loss_items(loss.cpu() / len(self.dataloader), prefix="val")}
|
|
239
251
|
return {k: round(float(v), 5) for k, v in results.items()} # return results as 5 decimal place floats
|
|
240
252
|
else:
|
|
253
|
+
if RANK > 0:
|
|
254
|
+
return stats
|
|
241
255
|
LOGGER.info(
|
|
242
256
|
"Speed: {:.1f}ms preprocess, {:.1f}ms inference, {:.1f}ms loss, {:.1f}ms postprocess per image".format(
|
|
243
257
|
*tuple(self.speed.values())
|
|
@@ -336,6 +350,10 @@ class BaseValidator:
|
|
|
336
350
|
"""Return statistics about the model's performance."""
|
|
337
351
|
return {}
|
|
338
352
|
|
|
353
|
+
def gather_stats(self):
|
|
354
|
+
"""Gather statistics from all the GPUs during DDP training to GPU 0."""
|
|
355
|
+
pass
|
|
356
|
+
|
|
339
357
|
def print_results(self):
|
|
340
358
|
"""Print the results of the model's predictions."""
|
|
341
359
|
pass
|
|
@@ -4,7 +4,7 @@ import torch
|
|
|
4
4
|
from PIL import Image
|
|
5
5
|
|
|
6
6
|
from ultralytics.models.yolo.segment import SegmentationPredictor
|
|
7
|
-
from ultralytics.utils import DEFAULT_CFG
|
|
7
|
+
from ultralytics.utils import DEFAULT_CFG
|
|
8
8
|
from ultralytics.utils.metrics import box_iou
|
|
9
9
|
from ultralytics.utils.ops import scale_masks
|
|
10
10
|
from ultralytics.utils.torch_utils import TORCH_1_10
|
|
@@ -101,7 +101,7 @@ class FastSAMPredictor(SegmentationPredictor):
|
|
|
101
101
|
continue
|
|
102
102
|
masks = result.masks.data
|
|
103
103
|
if masks.shape[1:] != result.orig_shape:
|
|
104
|
-
masks = scale_masks(masks[None], result.orig_shape)[0]
|
|
104
|
+
masks = (scale_masks(masks[None].float(), result.orig_shape)[0] > 0.5).byte()
|
|
105
105
|
# bboxes prompt
|
|
106
106
|
idx = torch.zeros(len(result), dtype=torch.bool, device=self.device)
|
|
107
107
|
if bboxes is not None:
|
|
@@ -161,20 +161,14 @@ class FastSAMPredictor(SegmentationPredictor):
|
|
|
161
161
|
Returns:
|
|
162
162
|
(torch.Tensor): Similarity matrix between given images and texts with shape (M, N).
|
|
163
163
|
"""
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
tokenized_text = clip.tokenize(texts).to(self.device)
|
|
173
|
-
image_features = self.clip_model.encode_image(images)
|
|
174
|
-
text_features = self.clip_model.encode_text(tokenized_text)
|
|
175
|
-
image_features /= image_features.norm(dim=-1, keepdim=True) # (N, 512)
|
|
176
|
-
text_features /= text_features.norm(dim=-1, keepdim=True) # (M, 512)
|
|
177
|
-
return (image_features * text_features[:, None]).sum(-1) # (M, N)
|
|
164
|
+
from ultralytics.nn.text_model import CLIP
|
|
165
|
+
|
|
166
|
+
if not hasattr(self, "clip"):
|
|
167
|
+
self.clip = CLIP("ViT-B/32", device=self.device)
|
|
168
|
+
images = torch.stack([self.clip.image_preprocess(image).to(self.device) for image in images])
|
|
169
|
+
image_features = self.clip.encode_image(images)
|
|
170
|
+
text_features = self.clip.encode_text(self.clip.tokenize(texts))
|
|
171
|
+
return text_features @ image_features.T # (M, N)
|
|
178
172
|
|
|
179
173
|
def set_prompts(self, prompts):
|
|
180
174
|
"""Set prompts to be used during inference."""
|
|
@@ -11,9 +11,9 @@ from ultralytics.data import ClassificationDataset, build_dataloader
|
|
|
11
11
|
from ultralytics.engine.trainer import BaseTrainer
|
|
12
12
|
from ultralytics.models import yolo
|
|
13
13
|
from ultralytics.nn.tasks import ClassificationModel
|
|
14
|
-
from ultralytics.utils import DEFAULT_CFG,
|
|
14
|
+
from ultralytics.utils import DEFAULT_CFG, RANK
|
|
15
15
|
from ultralytics.utils.plotting import plot_images
|
|
16
|
-
from ultralytics.utils.torch_utils import is_parallel,
|
|
16
|
+
from ultralytics.utils.torch_utils import is_parallel, torch_distributed_zero_first
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
class ClassificationTrainer(BaseTrainer):
|
|
@@ -194,19 +194,6 @@ class ClassificationTrainer(BaseTrainer):
|
|
|
194
194
|
loss_items = [round(float(loss_items), 5)]
|
|
195
195
|
return dict(zip(keys, loss_items))
|
|
196
196
|
|
|
197
|
-
def final_eval(self):
|
|
198
|
-
"""Evaluate trained model and save validation results."""
|
|
199
|
-
for f in self.last, self.best:
|
|
200
|
-
if f.exists():
|
|
201
|
-
strip_optimizer(f) # strip optimizers
|
|
202
|
-
if f is self.best:
|
|
203
|
-
LOGGER.info(f"\nValidating {f}...")
|
|
204
|
-
self.validator.args.data = self.args.data
|
|
205
|
-
self.validator.args.plots = self.args.plots
|
|
206
|
-
self.metrics = self.validator(model=f)
|
|
207
|
-
self.metrics.pop("fitness", None)
|
|
208
|
-
self.run_callbacks("on_fit_epoch_end")
|
|
209
|
-
|
|
210
197
|
def plot_training_samples(self, batch: dict[str, torch.Tensor], ni: int):
|
|
211
198
|
"""
|
|
212
199
|
Plot training samples with their annotations.
|