ultralytics-opencv-headless 8.3.250__tar.gz → 8.3.251__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_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/PKG-INFO +1 -1
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/__init__.py +1 -1
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/__init__.py +3 -3
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/TT100K.yaml +67 -77
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/engine/model.py +4 -3
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/engine/trainer.py +21 -22
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/engine/tuner.py +1 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/benchmarks.py +1 -1
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/callbacks/platform.py +65 -57
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/checks.py +11 -4
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/plotting.py +3 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/tuner.py +0 -3
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics_opencv_headless.egg-info/PKG-INFO +1 -1
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/LICENSE +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/README.md +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/pyproject.toml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/setup.cfg +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/tests/__init__.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/tests/conftest.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/tests/test_cli.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/tests/test_cuda.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/tests/test_engine.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/tests/test_exports.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/tests/test_integrations.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/tests/test_python.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/tests/test_solutions.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/assets/bus.jpg +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/assets/zidane.jpg +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/HomeObjects-3K.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/VOC.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/coco.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/coco128.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/coco8-grayscale.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/coco8-multispectral.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/coco8.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/construction-ppe.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/dog-pose.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/dota8-multispectral.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/dota8.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/hand-keypoints.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/kitti.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/lvis.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/medical-pills.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/signature.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/xView.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/default.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/11/yolo11-cls-resnet18.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/11/yolo11-cls.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/11/yolo11-obb.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/11/yolo11-pose.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/11/yolo11-seg.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/11/yolo11.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/11/yoloe-11-seg.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/11/yoloe-11.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/12/yolo12-cls.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/12/yolo12-obb.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/12/yolo12-pose.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/12/yolo12-seg.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/12/yolo12.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v10/yolov10b.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v10/yolov10l.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v10/yolov10m.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v10/yolov10n.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v10/yolov10s.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v10/yolov10x.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v8/yoloe-v8-seg.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v8/yoloe-v8.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v9/yolov9m.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v9/yolov9s.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v9/yolov9t.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/trackers/botsort.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/data/__init__.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/data/annotator.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/data/augment.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/data/base.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/data/build.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/data/converter.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/data/dataset.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/data/loaders.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/data/scripts/download_weights.sh +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/data/scripts/get_coco.sh +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/data/scripts/get_coco128.sh +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/data/scripts/get_imagenet.sh +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/data/split.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/data/split_dota.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/data/utils.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/engine/__init__.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/engine/exporter.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/engine/predictor.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/engine/results.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/engine/validator.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/hub/__init__.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/hub/auth.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/hub/google/__init__.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/hub/session.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/hub/utils.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/__init__.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/fastsam/__init__.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/fastsam/model.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/fastsam/predict.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/fastsam/utils.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/fastsam/val.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/nas/__init__.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/nas/model.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/nas/predict.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/nas/val.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/rtdetr/__init__.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/rtdetr/model.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/rtdetr/predict.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/rtdetr/train.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/rtdetr/val.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/__init__.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/amg.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/build.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/build_sam3.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/model.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/modules/__init__.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/modules/blocks.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/modules/decoders.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/modules/encoders.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/modules/memory_attention.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/modules/sam.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/modules/transformer.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/modules/utils.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/predict.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/sam3/__init__.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/sam3/decoder.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/sam3/encoder.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/sam3/geometry_encoders.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/sam3/maskformer_segmentation.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/sam3/model_misc.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/sam3/necks.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/sam3/sam3_image.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/sam3/text_encoder_ve.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/sam3/vitdet.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/sam3/vl_combiner.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/utils/__init__.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/utils/loss.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/utils/ops.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/__init__.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/classify/__init__.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/classify/predict.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/classify/train.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/classify/val.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/detect/__init__.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/detect/predict.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/detect/train.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/detect/val.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/model.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/obb/__init__.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/obb/predict.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/obb/train.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/obb/val.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/pose/__init__.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/pose/predict.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/pose/train.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/pose/val.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/segment/__init__.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/segment/predict.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/segment/train.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/segment/val.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/world/__init__.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/world/train.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/world/train_world.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/yoloe/__init__.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/yoloe/predict.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/yoloe/train.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/yoloe/train_seg.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/yoloe/val.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/nn/__init__.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/nn/autobackend.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/nn/modules/__init__.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/nn/modules/activation.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/nn/modules/block.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/nn/modules/conv.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/nn/modules/head.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/nn/modules/transformer.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/nn/modules/utils.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/nn/tasks.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/nn/text_model.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/py.typed +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/solutions/__init__.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/solutions/ai_gym.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/solutions/analytics.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/solutions/config.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/solutions/distance_calculation.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/solutions/heatmap.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/solutions/instance_segmentation.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/solutions/object_blurrer.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/solutions/object_counter.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/solutions/object_cropper.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/solutions/parking_management.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/solutions/queue_management.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/solutions/region_counter.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/solutions/security_alarm.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/solutions/similarity_search.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/solutions/solutions.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/solutions/speed_estimation.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/solutions/streamlit_inference.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/solutions/templates/similarity-search.html +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/solutions/trackzone.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/solutions/vision_eye.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/trackers/__init__.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/trackers/basetrack.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/trackers/bot_sort.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/trackers/byte_tracker.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/trackers/track.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/trackers/utils/__init__.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/trackers/utils/gmc.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/trackers/utils/kalman_filter.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/trackers/utils/matching.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/__init__.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/autobatch.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/autodevice.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/callbacks/__init__.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/callbacks/base.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/callbacks/clearml.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/callbacks/comet.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/callbacks/dvc.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/callbacks/hub.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/callbacks/mlflow.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/callbacks/neptune.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/callbacks/raytune.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/callbacks/tensorboard.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/callbacks/wb.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/cpu.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/dist.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/downloads.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/errors.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/events.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/export/__init__.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/export/engine.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/export/imx.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/export/tensorflow.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/files.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/git.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/instance.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/logger.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/loss.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/metrics.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/nms.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/ops.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/patches.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/tal.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/torch_utils.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/tqdm.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/triton.py +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics_opencv_headless.egg-info/SOURCES.txt +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics_opencv_headless.egg-info/dependency_links.txt +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics_opencv_headless.egg-info/entry_points.txt +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics_opencv_headless.egg-info/requires.txt +0 -0
- {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics_opencv_headless.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ultralytics-opencv-headless
|
|
3
|
-
Version: 8.3.
|
|
3
|
+
Version: 8.3.251
|
|
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>
|
|
@@ -414,7 +414,7 @@ def get_save_dir(args: SimpleNamespace, name: str | None = None) -> Path:
|
|
|
414
414
|
nested = args.project and len(Path(args.project).parts) > 1 # e.g. "user/project" or "org\repo"
|
|
415
415
|
project = runs / args.project if nested else args.project or runs
|
|
416
416
|
name = name or args.name or f"{args.mode}"
|
|
417
|
-
save_dir = increment_path(Path(project) / name, exist_ok=args.exist_ok if RANK in {-1, 0} else True)
|
|
417
|
+
save_dir = increment_path(Path(project) / name, exist_ok=args.exist_ok if RANK in {-1, 0} else True, mkdir=True)
|
|
418
418
|
|
|
419
419
|
return Path(save_dir).resolve() # resolve to display full path in console
|
|
420
420
|
|
|
@@ -727,8 +727,8 @@ def handle_yolo_solutions(args: list[str]) -> None:
|
|
|
727
727
|
)
|
|
728
728
|
if solution_name == "analytics": # analytical graphs follow fixed shape for output i.e w=1920, h=1080
|
|
729
729
|
w, h = 1280, 720
|
|
730
|
-
save_dir = get_save_dir(SimpleNamespace(
|
|
731
|
-
save_dir.mkdir(parents=True) # create the output directory i.e. runs/solutions/exp
|
|
730
|
+
save_dir = get_save_dir(SimpleNamespace(task="solutions", name="exp", exist_ok=False, project=None))
|
|
731
|
+
save_dir.mkdir(parents=True, exist_ok=True) # create the output directory i.e. runs/solutions/exp
|
|
732
732
|
vw = cv2.VideoWriter(str(save_dir / f"{solution_name}.avi"), cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))
|
|
733
733
|
|
|
734
734
|
try: # Process video frames
|
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
# Ultralytics
|
|
2
|
-
|
|
3
|
-
#
|
|
1
|
+
# Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
|
|
2
|
+
|
|
3
|
+
# Tsinghua-Tencent 100K (TT100K) dataset https://cg.cs.tsinghua.edu.cn/traffic-sign/ by Tsinghua University
|
|
4
|
+
# Documentation: https://cg.cs.tsinghua.edu.cn/traffic-sign/tutorial.html
|
|
4
5
|
# Paper: Traffic-Sign Detection and Classification in the Wild (CVPR 2016)
|
|
5
|
-
#
|
|
6
|
+
# License: CC BY-NC 2.0 license for non-commercial use only
|
|
6
7
|
# Example usage: yolo train data=TT100K.yaml
|
|
7
8
|
# parent
|
|
8
9
|
# ├── ultralytics
|
|
9
10
|
# └── datasets
|
|
10
|
-
# └── TT100K
|
|
11
|
+
# └── TT100K ← downloads here (~18 GB)
|
|
11
12
|
|
|
12
|
-
# Train/val/test sets
|
|
13
|
+
# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
|
|
13
14
|
path: TT100K # dataset root dir
|
|
14
|
-
train: images/train # train images (relative to 'path')
|
|
15
|
-
val: images/val # val images (relative to 'path')
|
|
16
|
-
test: images/test # test images (relative to 'path')
|
|
15
|
+
train: images/train # train images (relative to 'path') 6105 images
|
|
16
|
+
val: images/val # val images (relative to 'path') 7641 images (original 'other' split)
|
|
17
|
+
test: images/test # test images (relative to 'path') 3071 images
|
|
17
18
|
|
|
18
|
-
# Classes
|
|
19
|
-
nc: 221
|
|
19
|
+
# Classes (221 traffic sign categories, 45 with sufficient training instances)
|
|
20
20
|
names:
|
|
21
21
|
0: pl5
|
|
22
22
|
1: pl10
|
|
@@ -242,57 +242,52 @@ names:
|
|
|
242
242
|
|
|
243
243
|
# Download script/URL (optional) ---------------------------------------------------------------------------------------
|
|
244
244
|
download: |
|
|
245
|
-
import os
|
|
246
245
|
import json
|
|
247
246
|
import shutil
|
|
248
247
|
from pathlib import Path
|
|
249
|
-
|
|
248
|
+
|
|
249
|
+
from PIL import Image
|
|
250
|
+
|
|
250
251
|
from ultralytics.utils import TQDM
|
|
252
|
+
from ultralytics.utils.downloads import download
|
|
253
|
+
|
|
251
254
|
|
|
252
255
|
def tt100k2yolo(dir):
|
|
253
|
-
"""Convert TT100K annotations to YOLO format."""
|
|
254
|
-
from PIL import Image
|
|
255
|
-
|
|
256
|
+
"""Convert TT100K annotations to YOLO format with images/{split} and labels/{split} structure."""
|
|
256
257
|
data_dir = dir / "data"
|
|
257
258
|
anno_file = data_dir / "annotations.json"
|
|
258
|
-
|
|
259
|
+
|
|
259
260
|
print("Loading annotations...")
|
|
260
|
-
with open(anno_file,
|
|
261
|
+
with open(anno_file, encoding="utf-8") as f:
|
|
261
262
|
data = json.load(f)
|
|
262
|
-
|
|
263
|
-
#
|
|
264
|
-
|
|
265
|
-
for
|
|
266
|
-
|
|
267
|
-
classes.add(obj['category'])
|
|
268
|
-
class_to_idx = {cls: idx for idx, cls in enumerate(yaml["names"]) if cls in classes}
|
|
269
|
-
class_to_idx = {cls: idx for idx, cls in enumerate(classes)}
|
|
270
|
-
|
|
271
|
-
print(f"Found {len(classes)} traffic sign classes")
|
|
272
|
-
|
|
263
|
+
|
|
264
|
+
# Build class name to index mapping from yaml
|
|
265
|
+
names = yaml["names"]
|
|
266
|
+
class_to_idx = {v: k for k, v in names.items()}
|
|
267
|
+
|
|
273
268
|
# Create directories
|
|
274
|
-
for split in [
|
|
275
|
-
(dir /
|
|
276
|
-
(dir /
|
|
277
|
-
|
|
269
|
+
for split in ["train", "val", "test"]:
|
|
270
|
+
(dir / "images" / split).mkdir(parents=True, exist_ok=True)
|
|
271
|
+
(dir / "labels" / split).mkdir(parents=True, exist_ok=True)
|
|
272
|
+
|
|
278
273
|
print("Converting annotations to YOLO format...")
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
274
|
+
skipped = 0
|
|
275
|
+
for img_id, img_data in TQDM(data["imgs"].items(), desc="Processing"):
|
|
276
|
+
img_path_str = img_data["path"]
|
|
277
|
+
if "train" in img_path_str:
|
|
278
|
+
split = "train"
|
|
279
|
+
elif "test" in img_path_str:
|
|
280
|
+
split = "test"
|
|
285
281
|
else:
|
|
286
|
-
split =
|
|
287
|
-
|
|
282
|
+
split = "val"
|
|
283
|
+
|
|
288
284
|
# Source and destination paths
|
|
289
285
|
src_img = data_dir / img_path_str
|
|
290
286
|
if not src_img.exists():
|
|
291
287
|
continue
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
288
|
+
|
|
289
|
+
dst_img = dir / "images" / split / src_img.name
|
|
290
|
+
|
|
296
291
|
# Get image dimensions
|
|
297
292
|
try:
|
|
298
293
|
with Image.open(src_img) as img:
|
|
@@ -300,57 +295,52 @@ download: |
|
|
|
300
295
|
except Exception as e:
|
|
301
296
|
print(f"Error reading {src_img}: {e}")
|
|
302
297
|
continue
|
|
298
|
+
|
|
299
|
+
# Copy image to destination
|
|
303
300
|
shutil.copy2(src_img, dst_img)
|
|
304
|
-
|
|
301
|
+
|
|
302
|
+
# Convert annotations
|
|
303
|
+
label_file = dir / "labels" / split / f"{src_img.stem}.txt"
|
|
305
304
|
lines = []
|
|
306
|
-
|
|
307
|
-
for obj in img_data.get(
|
|
308
|
-
category = obj[
|
|
305
|
+
|
|
306
|
+
for obj in img_data.get("objects", []):
|
|
307
|
+
category = obj["category"]
|
|
309
308
|
if category not in class_to_idx:
|
|
309
|
+
skipped += 1
|
|
310
310
|
continue
|
|
311
|
-
|
|
312
|
-
bbox = obj[
|
|
313
|
-
xmin, ymin = bbox[
|
|
314
|
-
xmax, ymax = bbox[
|
|
315
|
-
|
|
311
|
+
|
|
312
|
+
bbox = obj["bbox"]
|
|
313
|
+
xmin, ymin = bbox["xmin"], bbox["ymin"]
|
|
314
|
+
xmax, ymax = bbox["xmax"], bbox["ymax"]
|
|
315
|
+
|
|
316
316
|
# Convert to YOLO format (normalized center coordinates and dimensions)
|
|
317
317
|
x_center = ((xmin + xmax) / 2.0) / img_width
|
|
318
318
|
y_center = ((ymin + ymax) / 2.0) / img_height
|
|
319
319
|
width = (xmax - xmin) / img_width
|
|
320
320
|
height = (ymax - ymin) / img_height
|
|
321
|
-
|
|
322
|
-
#
|
|
321
|
+
|
|
322
|
+
# Clip to valid range
|
|
323
323
|
x_center = max(0, min(1, x_center))
|
|
324
324
|
y_center = max(0, min(1, y_center))
|
|
325
325
|
width = max(0, min(1, width))
|
|
326
326
|
height = max(0, min(1, height))
|
|
327
|
-
|
|
327
|
+
|
|
328
328
|
cls_idx = class_to_idx[category]
|
|
329
329
|
lines.append(f"{cls_idx} {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}\n")
|
|
330
|
-
|
|
330
|
+
|
|
331
331
|
# Write label file
|
|
332
332
|
if lines:
|
|
333
333
|
label_file.write_text("".join(lines), encoding="utf-8")
|
|
334
|
-
|
|
335
|
-
print(f"Conversion complete!")
|
|
336
|
-
print(f"Found {len(classes)} classes: {classes[:10]}..." if len(classes) > 10 else f"Classes: {classes}")
|
|
337
|
-
|
|
338
|
-
return classes
|
|
339
|
-
|
|
340
|
-
# Download dataset
|
|
341
|
-
dir = Path(yaml['path']) # dataset root dir
|
|
342
334
|
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
]
|
|
335
|
+
if skipped:
|
|
336
|
+
print(f"Skipped {skipped} annotations with unknown categories")
|
|
337
|
+
print("Conversion complete!")
|
|
347
338
|
|
|
348
|
-
print("Downloading TT100K dataset...")
|
|
349
|
-
print("Note: This dataset is large (~30GB). Download may take some time.")
|
|
350
|
-
print("Dataset is under CC-BY-NC license for non-commercial use only.")
|
|
351
339
|
|
|
352
|
-
# Download
|
|
353
|
-
|
|
340
|
+
# Download
|
|
341
|
+
dir = Path(yaml["path"]) # dataset root dir
|
|
342
|
+
urls = ["https://cg.cs.tsinghua.edu.cn/traffic-sign/data_model_code/data.zip"]
|
|
343
|
+
download(urls, dir=dir, curl=True, threads=1)
|
|
354
344
|
|
|
355
|
-
# Convert
|
|
356
|
-
|
|
345
|
+
# Convert
|
|
346
|
+
tt100k2yolo(dir)
|
|
@@ -275,7 +275,7 @@ class Model(torch.nn.Module):
|
|
|
275
275
|
>>> model._load("yolo11n.pt")
|
|
276
276
|
>>> model._load("path/to/weights.pth", task="detect")
|
|
277
277
|
"""
|
|
278
|
-
if weights.lower().startswith(("https://", "http://", "rtsp://", "rtmp://", "tcp://")):
|
|
278
|
+
if weights.lower().startswith(("https://", "http://", "rtsp://", "rtmp://", "tcp://", "ul://")):
|
|
279
279
|
weights = checks.check_file(weights, download_dir=SETTINGS["weights_dir"]) # download and return local file
|
|
280
280
|
weights = checks.check_model_file_from_stem(weights) # add suffix, i.e. yolo11n -> yolo11n.pt
|
|
281
281
|
|
|
@@ -403,7 +403,7 @@ class Model(torch.nn.Module):
|
|
|
403
403
|
}
|
|
404
404
|
torch.save({**self.ckpt, **updates}, filename)
|
|
405
405
|
|
|
406
|
-
def info(self, detailed: bool = False, verbose: bool = True):
|
|
406
|
+
def info(self, detailed: bool = False, verbose: bool = True, imgsz: int | list[int, int] = 640):
|
|
407
407
|
"""Display model information.
|
|
408
408
|
|
|
409
409
|
This method provides an overview or detailed information about the model, depending on the arguments
|
|
@@ -412,6 +412,7 @@ class Model(torch.nn.Module):
|
|
|
412
412
|
Args:
|
|
413
413
|
detailed (bool): If True, shows detailed information about the model layers and parameters.
|
|
414
414
|
verbose (bool): If True, prints the information. If False, returns the information as a list.
|
|
415
|
+
imgsz (int | list[int, int]): Input image size used for FLOPs calculation.
|
|
415
416
|
|
|
416
417
|
Returns:
|
|
417
418
|
(list[str]): A list of strings containing various types of information about the model, including model
|
|
@@ -423,7 +424,7 @@ class Model(torch.nn.Module):
|
|
|
423
424
|
>>> info_list = model.info(detailed=True, verbose=False) # Returns detailed info as a list
|
|
424
425
|
"""
|
|
425
426
|
self._check_is_pytorch_model()
|
|
426
|
-
return self.model.info(detailed=detailed, verbose=verbose)
|
|
427
|
+
return self.model.info(detailed=detailed, verbose=verbose, imgsz=imgsz)
|
|
427
428
|
|
|
428
429
|
def fuse(self) -> None:
|
|
429
430
|
"""Fuse Conv2d and BatchNorm2d layers in the model for optimized inference.
|
|
@@ -157,6 +157,27 @@ class BaseTrainer:
|
|
|
157
157
|
if self.device.type in {"cpu", "mps"}:
|
|
158
158
|
self.args.workers = 0 # faster CPU training as time dominated by inference, not dataloading
|
|
159
159
|
|
|
160
|
+
# Callbacks - initialize early so on_pretrain_routine_start can capture original args.data
|
|
161
|
+
self.callbacks = _callbacks or callbacks.get_default_callbacks()
|
|
162
|
+
|
|
163
|
+
if isinstance(self.args.device, str) and len(self.args.device): # i.e. device='0' or device='0,1,2,3'
|
|
164
|
+
world_size = len(self.args.device.split(","))
|
|
165
|
+
elif isinstance(self.args.device, (tuple, list)): # i.e. device=[0, 1, 2, 3] (multi-GPU from CLI is list)
|
|
166
|
+
world_size = len(self.args.device)
|
|
167
|
+
elif self.args.device in {"cpu", "mps"}: # i.e. device='cpu' or 'mps'
|
|
168
|
+
world_size = 0
|
|
169
|
+
elif torch.cuda.is_available(): # i.e. device=None or device='' or device=number
|
|
170
|
+
world_size = 1 # default to device 0
|
|
171
|
+
else: # i.e. device=None or device=''
|
|
172
|
+
world_size = 0
|
|
173
|
+
|
|
174
|
+
self.ddp = world_size > 1 and "LOCAL_RANK" not in os.environ
|
|
175
|
+
self.world_size = world_size
|
|
176
|
+
# Run on_pretrain_routine_start before get_dataset() to capture original args.data (e.g., ul:// URIs)
|
|
177
|
+
if RANK in {-1, 0} and not self.ddp:
|
|
178
|
+
callbacks.add_integration_callbacks(self)
|
|
179
|
+
self.run_callbacks("on_pretrain_routine_start")
|
|
180
|
+
|
|
160
181
|
# Model and Dataset
|
|
161
182
|
self.model = check_model_file_from_stem(self.args.model) # add suffix, i.e. yolo11n -> yolo11n.pt
|
|
162
183
|
with torch_distributed_zero_first(LOCAL_RANK): # avoid auto-downloading dataset multiple times
|
|
@@ -180,28 +201,6 @@ class BaseTrainer:
|
|
|
180
201
|
self.plot_idx = [0, 1, 2]
|
|
181
202
|
self.nan_recovery_attempts = 0
|
|
182
203
|
|
|
183
|
-
# Callbacks
|
|
184
|
-
self.callbacks = _callbacks or callbacks.get_default_callbacks()
|
|
185
|
-
|
|
186
|
-
if isinstance(self.args.device, str) and len(self.args.device): # i.e. device='0' or device='0,1,2,3'
|
|
187
|
-
world_size = len(self.args.device.split(","))
|
|
188
|
-
elif isinstance(self.args.device, (tuple, list)): # i.e. device=[0, 1, 2, 3] (multi-GPU from CLI is list)
|
|
189
|
-
world_size = len(self.args.device)
|
|
190
|
-
elif self.args.device in {"cpu", "mps"}: # i.e. device='cpu' or 'mps'
|
|
191
|
-
world_size = 0
|
|
192
|
-
elif torch.cuda.is_available(): # i.e. device=None or device='' or device=number
|
|
193
|
-
world_size = 1 # default to device 0
|
|
194
|
-
else: # i.e. device=None or device=''
|
|
195
|
-
world_size = 0
|
|
196
|
-
|
|
197
|
-
self.ddp = world_size > 1 and "LOCAL_RANK" not in os.environ
|
|
198
|
-
self.world_size = world_size
|
|
199
|
-
# Run subprocess if DDP training, else train normally
|
|
200
|
-
if RANK in {-1, 0} and not self.ddp:
|
|
201
|
-
callbacks.add_integration_callbacks(self)
|
|
202
|
-
# Start console logging immediately at trainer initialization
|
|
203
|
-
self.run_callbacks("on_pretrain_routine_start")
|
|
204
|
-
|
|
205
204
|
def add_callback(self, event: str, callback):
|
|
206
205
|
"""Append the given callback to the event's callback list."""
|
|
207
206
|
self.callbacks[event].append(callback)
|
|
@@ -378,6 +378,7 @@ class Tuner:
|
|
|
378
378
|
metrics = {}
|
|
379
379
|
train_args = {**vars(self.args), **mutated_hyp}
|
|
380
380
|
save_dir = get_save_dir(get_cfg(train_args))
|
|
381
|
+
train_args["save_dir"] = str(save_dir) # pass save_dir to subprocess to ensure same path is used
|
|
381
382
|
weights_dir = save_dir / "weights"
|
|
382
383
|
try:
|
|
383
384
|
# Train YOLO model with mutated hyperparameters (run in subprocess to avoid dataloader hang)
|
|
@@ -460,7 +460,7 @@ class ProfileModels:
|
|
|
460
460
|
if file.suffix in {".pt", ".yaml", ".yml"}:
|
|
461
461
|
model = YOLO(str(file))
|
|
462
462
|
model.fuse() # to report correct params and GFLOPs in model.info()
|
|
463
|
-
model_info = model.info()
|
|
463
|
+
model_info = model.info(imgsz=self.imgsz)
|
|
464
464
|
if self.trt and self.device.type != "cpu" and not engine_file.is_file():
|
|
465
465
|
engine_file = model.export(
|
|
466
466
|
format="engine",
|
|
@@ -11,9 +11,6 @@ from time import time
|
|
|
11
11
|
from ultralytics.utils import ENVIRONMENT, GIT, LOGGER, PYTHON_VERSION, RANK, SETTINGS, TESTS_RUNNING, colorstr
|
|
12
12
|
|
|
13
13
|
PREFIX = colorstr("Platform: ")
|
|
14
|
-
_last_upload = 0 # Rate limit model uploads
|
|
15
|
-
_console_logger = None # Global console logger instance
|
|
16
|
-
_system_logger = None # Cached system logger instance
|
|
17
14
|
|
|
18
15
|
try:
|
|
19
16
|
assert not TESTS_RUNNING # do not log pytest
|
|
@@ -78,8 +75,6 @@ def resolve_platform_uri(uri, hard=True):
|
|
|
78
75
|
else:
|
|
79
76
|
raise ValueError(f"Invalid platform URI: {uri}. Use ul://user/datasets/name or ul://user/project/model")
|
|
80
77
|
|
|
81
|
-
LOGGER.info(f"Resolving {uri} from Ultralytics Platform...")
|
|
82
|
-
|
|
83
78
|
try:
|
|
84
79
|
r = requests.head(url, headers=headers, allow_redirects=False, timeout=30)
|
|
85
80
|
|
|
@@ -139,22 +134,28 @@ def _interp_plot(plot, n=101):
|
|
|
139
134
|
return result
|
|
140
135
|
|
|
141
136
|
|
|
142
|
-
def _send(event, data, project, name):
|
|
143
|
-
"""Send event to Platform endpoint."""
|
|
137
|
+
def _send(event, data, project, name, model_id=None):
|
|
138
|
+
"""Send event to Platform endpoint. Returns response JSON on success."""
|
|
144
139
|
try:
|
|
145
|
-
|
|
140
|
+
payload = {"event": event, "project": project, "name": name, "data": data}
|
|
141
|
+
if model_id:
|
|
142
|
+
payload["modelId"] = model_id
|
|
143
|
+
r = requests.post(
|
|
146
144
|
"https://alpha.ultralytics.com/api/webhooks/training/metrics",
|
|
147
|
-
json=
|
|
145
|
+
json=payload,
|
|
148
146
|
headers={"Authorization": f"Bearer {_api_key}"},
|
|
149
147
|
timeout=10,
|
|
150
|
-
)
|
|
148
|
+
)
|
|
149
|
+
r.raise_for_status()
|
|
150
|
+
return r.json()
|
|
151
151
|
except Exception as e:
|
|
152
152
|
LOGGER.debug(f"Platform: Failed to send {event}: {e}")
|
|
153
|
+
return None
|
|
153
154
|
|
|
154
155
|
|
|
155
|
-
def _send_async(event, data, project, name):
|
|
156
|
+
def _send_async(event, data, project, name, model_id=None):
|
|
156
157
|
"""Send event asynchronously using bounded thread pool."""
|
|
157
|
-
_executor.submit(_send, event, data, project, name)
|
|
158
|
+
_executor.submit(_send, event, data, project, name, model_id)
|
|
158
159
|
|
|
159
160
|
|
|
160
161
|
def _upload_model(model_path, project, name):
|
|
@@ -250,13 +251,12 @@ def _get_environment_info():
|
|
|
250
251
|
|
|
251
252
|
def on_pretrain_routine_start(trainer):
|
|
252
253
|
"""Initialize Platform logging at training start."""
|
|
253
|
-
global _console_logger, _last_upload
|
|
254
|
-
|
|
255
254
|
if RANK not in {-1, 0} or not trainer.args.project:
|
|
256
255
|
return
|
|
257
256
|
|
|
258
|
-
#
|
|
259
|
-
|
|
257
|
+
# Per-trainer state to isolate concurrent training runs
|
|
258
|
+
trainer._platform_model_id = None
|
|
259
|
+
trainer._platform_last_upload = time()
|
|
260
260
|
|
|
261
261
|
project, name = str(trainer.args.project), str(trainer.args.name or "train")
|
|
262
262
|
url = f"https://alpha.ultralytics.com/{project}/{name}"
|
|
@@ -265,45 +265,43 @@ def on_pretrain_routine_start(trainer):
|
|
|
265
265
|
# Create callback to send console output to Platform
|
|
266
266
|
def send_console_output(content, line_count, chunk_id):
|
|
267
267
|
"""Send batched console output to Platform webhook."""
|
|
268
|
-
_send_async(
|
|
268
|
+
_send_async(
|
|
269
|
+
"console_output",
|
|
270
|
+
{"chunkId": chunk_id, "content": content, "lineCount": line_count},
|
|
271
|
+
project,
|
|
272
|
+
name,
|
|
273
|
+
getattr(trainer, "_platform_model_id", None),
|
|
274
|
+
)
|
|
269
275
|
|
|
270
276
|
# Start console capture with batching (5 lines or 5 seconds)
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
# Gather model info for richer metadata
|
|
275
|
-
model_info = {}
|
|
276
|
-
try:
|
|
277
|
-
info = model_info_for_loggers(trainer)
|
|
278
|
-
model_info = {
|
|
279
|
-
"parameters": info.get("model/parameters", 0),
|
|
280
|
-
"gflops": info.get("model/GFLOPs", 0),
|
|
281
|
-
"classes": getattr(trainer.model, "yaml", {}).get("nc", 0), # number of classes
|
|
282
|
-
}
|
|
283
|
-
except Exception:
|
|
284
|
-
pass
|
|
277
|
+
trainer._platform_console_logger = ConsoleLogger(batch_size=5, flush_interval=5.0, on_flush=send_console_output)
|
|
278
|
+
trainer._platform_console_logger.start_capture()
|
|
285
279
|
|
|
286
280
|
# Collect environment info (W&B-style metadata)
|
|
287
281
|
environment = _get_environment_info()
|
|
288
282
|
|
|
289
|
-
|
|
283
|
+
# Build trainArgs - callback runs before get_dataset() so args.data is still original (e.g., ul:// URIs)
|
|
284
|
+
# Note: model_info is sent later in on_fit_epoch_end (epoch 0) when the model is actually loaded
|
|
285
|
+
train_args = {k: str(v) for k, v in vars(trainer.args).items()}
|
|
286
|
+
|
|
287
|
+
# Send synchronously to get modelId for subsequent webhooks
|
|
288
|
+
response = _send(
|
|
290
289
|
"training_started",
|
|
291
290
|
{
|
|
292
|
-
"trainArgs":
|
|
291
|
+
"trainArgs": train_args,
|
|
293
292
|
"epochs": trainer.epochs,
|
|
294
293
|
"device": str(trainer.device),
|
|
295
|
-
"modelInfo": model_info,
|
|
296
294
|
"environment": environment,
|
|
297
295
|
},
|
|
298
296
|
project,
|
|
299
297
|
name,
|
|
300
298
|
)
|
|
299
|
+
if response and response.get("modelId"):
|
|
300
|
+
trainer._platform_model_id = response["modelId"]
|
|
301
301
|
|
|
302
302
|
|
|
303
303
|
def on_fit_epoch_end(trainer):
|
|
304
304
|
"""Log training and system metrics at epoch end."""
|
|
305
|
-
global _system_logger
|
|
306
|
-
|
|
307
305
|
if RANK not in {-1, 0} or not trainer.args.project:
|
|
308
306
|
return
|
|
309
307
|
|
|
@@ -312,44 +310,55 @@ def on_fit_epoch_end(trainer):
|
|
|
312
310
|
|
|
313
311
|
if trainer.optimizer and trainer.optimizer.param_groups:
|
|
314
312
|
metrics["lr"] = trainer.optimizer.param_groups[0]["lr"]
|
|
313
|
+
|
|
314
|
+
# Extract model info at epoch 0 (sent as separate field, not in metrics)
|
|
315
|
+
model_info = None
|
|
315
316
|
if trainer.epoch == 0:
|
|
316
317
|
try:
|
|
317
|
-
|
|
318
|
+
info = model_info_for_loggers(trainer)
|
|
319
|
+
model_info = {
|
|
320
|
+
"parameters": info.get("model/parameters", 0),
|
|
321
|
+
"gflops": info.get("model/GFLOPs", 0),
|
|
322
|
+
"speedMs": info.get("model/speed_PyTorch(ms)", 0),
|
|
323
|
+
}
|
|
318
324
|
except Exception:
|
|
319
325
|
pass
|
|
320
326
|
|
|
321
|
-
# Get system metrics (cache SystemLogger for efficiency)
|
|
327
|
+
# Get system metrics (cache SystemLogger on trainer for efficiency)
|
|
322
328
|
system = {}
|
|
323
329
|
try:
|
|
324
|
-
if
|
|
325
|
-
|
|
326
|
-
system =
|
|
330
|
+
if not hasattr(trainer, "_platform_system_logger"):
|
|
331
|
+
trainer._platform_system_logger = SystemLogger()
|
|
332
|
+
system = trainer._platform_system_logger.get_metrics(rates=True)
|
|
327
333
|
except Exception:
|
|
328
334
|
pass
|
|
329
335
|
|
|
336
|
+
payload = {
|
|
337
|
+
"epoch": trainer.epoch,
|
|
338
|
+
"metrics": metrics,
|
|
339
|
+
"system": system,
|
|
340
|
+
"fitness": trainer.fitness,
|
|
341
|
+
"best_fitness": trainer.best_fitness,
|
|
342
|
+
}
|
|
343
|
+
if model_info:
|
|
344
|
+
payload["modelInfo"] = model_info
|
|
345
|
+
|
|
330
346
|
_send_async(
|
|
331
347
|
"epoch_end",
|
|
332
|
-
|
|
333
|
-
"epoch": trainer.epoch,
|
|
334
|
-
"metrics": metrics,
|
|
335
|
-
"system": system,
|
|
336
|
-
"fitness": trainer.fitness,
|
|
337
|
-
"best_fitness": trainer.best_fitness,
|
|
338
|
-
},
|
|
348
|
+
payload,
|
|
339
349
|
project,
|
|
340
350
|
name,
|
|
351
|
+
getattr(trainer, "_platform_model_id", None),
|
|
341
352
|
)
|
|
342
353
|
|
|
343
354
|
|
|
344
355
|
def on_model_save(trainer):
|
|
345
356
|
"""Upload model checkpoint (rate limited to every 15 min)."""
|
|
346
|
-
global _last_upload
|
|
347
|
-
|
|
348
357
|
if RANK not in {-1, 0} or not trainer.args.project:
|
|
349
358
|
return
|
|
350
359
|
|
|
351
360
|
# Rate limit to every 15 minutes (900 seconds)
|
|
352
|
-
if time() -
|
|
361
|
+
if time() - getattr(trainer, "_platform_last_upload", 0) < 900:
|
|
353
362
|
return
|
|
354
363
|
|
|
355
364
|
model_path = trainer.best if trainer.best and Path(trainer.best).exists() else trainer.last
|
|
@@ -358,22 +367,20 @@ def on_model_save(trainer):
|
|
|
358
367
|
|
|
359
368
|
project, name = str(trainer.args.project), str(trainer.args.name or "train")
|
|
360
369
|
_upload_model_async(model_path, project, name)
|
|
361
|
-
|
|
370
|
+
trainer._platform_last_upload = time()
|
|
362
371
|
|
|
363
372
|
|
|
364
373
|
def on_train_end(trainer):
|
|
365
374
|
"""Log final results, upload best model, and send validation plot data."""
|
|
366
|
-
global _console_logger
|
|
367
|
-
|
|
368
375
|
if RANK not in {-1, 0} or not trainer.args.project:
|
|
369
376
|
return
|
|
370
377
|
|
|
371
378
|
project, name = str(trainer.args.project), str(trainer.args.name or "train")
|
|
372
379
|
|
|
373
380
|
# Stop console capture
|
|
374
|
-
if
|
|
375
|
-
|
|
376
|
-
|
|
381
|
+
if hasattr(trainer, "_platform_console_logger") and trainer._platform_console_logger:
|
|
382
|
+
trainer._platform_console_logger.stop_capture()
|
|
383
|
+
trainer._platform_console_logger = None
|
|
377
384
|
|
|
378
385
|
# Upload best model (blocking to ensure it completes)
|
|
379
386
|
model_path = None
|
|
@@ -411,6 +418,7 @@ def on_train_end(trainer):
|
|
|
411
418
|
},
|
|
412
419
|
project,
|
|
413
420
|
name,
|
|
421
|
+
getattr(trainer, "_platform_model_id", None),
|
|
414
422
|
)
|
|
415
423
|
url = f"https://alpha.ultralytics.com/{project}/{name}"
|
|
416
424
|
LOGGER.info(f"{PREFIX}View results at {url}")
|
|
@@ -592,7 +592,7 @@ def check_file(file, suffix="", download=True, download_dir=".", hard=True):
|
|
|
592
592
|
"""Search/download file (if necessary), check suffix (if provided), and return path.
|
|
593
593
|
|
|
594
594
|
Args:
|
|
595
|
-
file (str): File name or path,
|
|
595
|
+
file (str): File name or path, URL, platform URI (ul://), or GCS path (gs://).
|
|
596
596
|
suffix (str | tuple): Acceptable suffix or tuple of suffixes to validate against the file.
|
|
597
597
|
download (bool): Whether to download the file if it doesn't exist locally.
|
|
598
598
|
download_dir (str): Directory to download the file to.
|
|
@@ -616,13 +616,20 @@ def check_file(file, suffix="", download=True, download_dir=".", hard=True):
|
|
|
616
616
|
url = resolve_platform_uri(file, hard=hard) # Convert to signed HTTPS URL
|
|
617
617
|
if url is None:
|
|
618
618
|
return [] # Not found, soft fail (consistent with file search behavior)
|
|
619
|
-
|
|
619
|
+
# Use URI path for unique directory structure: ul://user/project/model -> user/project/model/filename.pt
|
|
620
|
+
uri_path = file[5:] # Remove "ul://"
|
|
621
|
+
local_file = Path(download_dir) / uri_path / url2file(url)
|
|
620
622
|
if local_file.exists():
|
|
621
623
|
LOGGER.info(f"Found {clean_url(url)} locally at {local_file}")
|
|
622
624
|
else:
|
|
625
|
+
local_file.parent.mkdir(parents=True, exist_ok=True)
|
|
623
626
|
downloads.safe_download(url=url, file=local_file, unzip=False)
|
|
624
627
|
return str(local_file)
|
|
625
|
-
elif download and file.lower().startswith(
|
|
628
|
+
elif download and file.lower().startswith(
|
|
629
|
+
("https://", "http://", "rtsp://", "rtmp://", "tcp://", "gs://")
|
|
630
|
+
): # download
|
|
631
|
+
if file.startswith("gs://"):
|
|
632
|
+
file = "https://storage.googleapis.com/" + file[5:] # convert gs:// to public HTTPS URL
|
|
626
633
|
url = file # warning: Pathlib turns :// -> :/
|
|
627
634
|
file = Path(download_dir) / url2file(file) # '%2F' to '/', split https://url.com/file.txt?auth
|
|
628
635
|
if file.exists():
|
|
@@ -957,7 +964,7 @@ def is_rockchip():
|
|
|
957
964
|
with open("/proc/device-tree/compatible") as f:
|
|
958
965
|
dev_str = f.read()
|
|
959
966
|
*_, soc = dev_str.split(",")
|
|
960
|
-
if soc.replace("\x00", "") in RKNN_CHIPS:
|
|
967
|
+
if soc.replace("\x00", "").split("-", 1)[0] in RKNN_CHIPS:
|
|
961
968
|
return True
|
|
962
969
|
except OSError:
|
|
963
970
|
return False
|
|
@@ -972,6 +972,9 @@ def plot_tune_results(csv_file: str = "tune_results.csv", exclude_zero_fitness_p
|
|
|
972
972
|
if exclude_zero_fitness_points:
|
|
973
973
|
mask = fitness > 0 # exclude zero-fitness points
|
|
974
974
|
x, fitness = x[mask], fitness[mask]
|
|
975
|
+
if len(fitness) == 0:
|
|
976
|
+
LOGGER.warning("No valid fitness values to plot (all iterations may have failed)")
|
|
977
|
+
return
|
|
975
978
|
# Iterative sigma rejection on lower bound only
|
|
976
979
|
for _ in range(3): # max 3 iterations
|
|
977
980
|
mean, std = fitness.mean(), fitness.std()
|