ultralytics 8.3.161__tar.gz → 8.3.163__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {ultralytics-8.3.161/ultralytics.egg-info → ultralytics-8.3.163}/PKG-INFO +9 -1
- {ultralytics-8.3.161 → ultralytics-8.3.163}/pyproject.toml +9 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/tests/conftest.py +2 -2
- {ultralytics-8.3.161 → ultralytics-8.3.163}/tests/test_python.py +2 -2
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/__init__.py +1 -1
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/data/augment.py +2 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/data/converter.py +2 -2
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/data/split_dota.py +1 -1
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/data/utils.py +3 -2
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/engine/exporter.py +7 -6
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/engine/predictor.py +6 -6
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/engine/tuner.py +2 -2
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/nas/model.py +2 -1
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/sam/modules/tiny_encoder.py +1 -1
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/detect/val.py +1 -1
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/world/train.py +1 -1
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/world/train_world.py +11 -3
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/yoloe/train.py +1 -1
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/nn/tasks.py +6 -3
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/solutions/region_counter.py +29 -32
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/solutions/solutions.py +1 -1
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/__init__.py +1 -2
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/checks.py +21 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/metrics.py +4 -3
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/patches.py +1 -2
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/plotting.py +2 -2
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/torch_utils.py +2 -1
- {ultralytics-8.3.161 → ultralytics-8.3.163/ultralytics.egg-info}/PKG-INFO +9 -1
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics.egg-info/requires.txt +9 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/LICENSE +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/README.md +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/setup.cfg +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/tests/__init__.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/tests/test_cli.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/tests/test_cuda.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/tests/test_engine.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/tests/test_exports.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/tests/test_integrations.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/tests/test_solutions.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/assets/bus.jpg +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/assets/zidane.jpg +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/__init__.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/HomeObjects-3K.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/VOC.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/coco.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/coco128.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/coco8-grayscale.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/coco8-multispectral.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/coco8.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/dog-pose.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/dota8-multispectral.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/dota8.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/hand-keypoints.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/lvis.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/medical-pills.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/signature.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/xView.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/default.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/11/yolo11-cls-resnet18.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/11/yolo11-cls.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/11/yolo11-obb.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/11/yolo11-pose.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/11/yolo11-seg.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/11/yolo11.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/11/yoloe-11-seg.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/11/yoloe-11.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/12/yolo12-cls.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/12/yolo12-obb.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/12/yolo12-pose.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/12/yolo12-seg.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/12/yolo12.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v10/yolov10b.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v10/yolov10l.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v10/yolov10m.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v10/yolov10n.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v10/yolov10s.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v10/yolov10x.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v8/yoloe-v8-seg.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v8/yoloe-v8.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v9/yolov9m.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v9/yolov9s.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v9/yolov9t.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/trackers/botsort.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/data/__init__.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/data/annotator.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/data/base.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/data/build.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/data/dataset.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/data/loaders.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/data/scripts/download_weights.sh +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/data/scripts/get_coco.sh +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/data/scripts/get_coco128.sh +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/data/scripts/get_imagenet.sh +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/data/split.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/engine/__init__.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/engine/model.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/engine/results.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/engine/trainer.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/engine/validator.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/hub/__init__.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/hub/auth.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/hub/google/__init__.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/hub/session.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/hub/utils.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/__init__.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/fastsam/__init__.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/fastsam/model.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/fastsam/predict.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/fastsam/utils.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/fastsam/val.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/nas/__init__.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/nas/predict.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/nas/val.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/rtdetr/__init__.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/rtdetr/model.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/rtdetr/predict.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/rtdetr/train.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/rtdetr/val.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/sam/__init__.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/sam/amg.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/sam/build.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/sam/model.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/sam/modules/__init__.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/sam/modules/blocks.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/sam/modules/decoders.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/sam/modules/encoders.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/sam/modules/memory_attention.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/sam/modules/sam.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/sam/modules/transformer.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/sam/modules/utils.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/sam/predict.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/utils/__init__.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/utils/loss.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/utils/ops.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/__init__.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/classify/__init__.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/classify/predict.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/classify/train.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/classify/val.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/detect/__init__.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/detect/predict.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/detect/train.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/model.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/obb/__init__.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/obb/predict.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/obb/train.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/obb/val.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/pose/__init__.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/pose/predict.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/pose/train.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/pose/val.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/segment/__init__.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/segment/predict.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/segment/train.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/segment/val.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/world/__init__.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/yoloe/__init__.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/yoloe/predict.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/yoloe/train_seg.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/yoloe/val.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/nn/__init__.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/nn/autobackend.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/nn/modules/__init__.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/nn/modules/activation.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/nn/modules/block.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/nn/modules/conv.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/nn/modules/head.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/nn/modules/transformer.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/nn/modules/utils.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/nn/text_model.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/solutions/__init__.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/solutions/ai_gym.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/solutions/analytics.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/solutions/config.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/solutions/distance_calculation.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/solutions/heatmap.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/solutions/instance_segmentation.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/solutions/object_blurrer.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/solutions/object_counter.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/solutions/object_cropper.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/solutions/parking_management.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/solutions/queue_management.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/solutions/security_alarm.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/solutions/similarity_search.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/solutions/speed_estimation.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/solutions/streamlit_inference.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/solutions/templates/similarity-search.html +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/solutions/trackzone.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/solutions/vision_eye.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/trackers/__init__.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/trackers/basetrack.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/trackers/bot_sort.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/trackers/byte_tracker.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/trackers/track.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/trackers/utils/__init__.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/trackers/utils/gmc.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/trackers/utils/kalman_filter.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/trackers/utils/matching.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/autobatch.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/autodevice.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/benchmarks.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/callbacks/__init__.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/callbacks/base.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/callbacks/clearml.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/callbacks/comet.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/callbacks/dvc.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/callbacks/hub.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/callbacks/mlflow.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/callbacks/neptune.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/callbacks/raytune.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/callbacks/tensorboard.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/callbacks/wb.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/dist.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/downloads.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/errors.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/export.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/files.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/instance.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/loss.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/ops.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/tal.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/triton.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/tuner.py +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics.egg-info/SOURCES.txt +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics.egg-info/dependency_links.txt +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics.egg-info/entry_points.txt +0 -0
- {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: ultralytics
|
3
|
-
Version: 8.3.
|
3
|
+
Version: 8.3.163
|
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>
|
@@ -79,6 +79,14 @@ Requires-Dist: hub-sdk>=0.0.12; extra == "extra"
|
|
79
79
|
Requires-Dist: ipython; extra == "extra"
|
80
80
|
Requires-Dist: albumentations>=1.4.6; extra == "extra"
|
81
81
|
Requires-Dist: faster-coco-eval>=1.6.7; extra == "extra"
|
82
|
+
Provides-Extra: typing
|
83
|
+
Requires-Dist: pandas-stubs; extra == "typing"
|
84
|
+
Requires-Dist: scipy-stubs; extra == "typing"
|
85
|
+
Requires-Dist: types-pillow; extra == "typing"
|
86
|
+
Requires-Dist: types-psutil; extra == "typing"
|
87
|
+
Requires-Dist: types-pyyaml; extra == "typing"
|
88
|
+
Requires-Dist: types-requests; extra == "typing"
|
89
|
+
Requires-Dist: types-shapely; extra == "typing"
|
82
90
|
Dynamic: license-file
|
83
91
|
|
84
92
|
<div align="center">
|
@@ -117,6 +117,15 @@ extra = [
|
|
117
117
|
"albumentations>=1.4.6", # training augmentations
|
118
118
|
"faster-coco-eval>=1.6.7", # COCO mAP
|
119
119
|
]
|
120
|
+
typing = [
|
121
|
+
"pandas-stubs",
|
122
|
+
"scipy-stubs",
|
123
|
+
"types-pillow",
|
124
|
+
"types-psutil",
|
125
|
+
"types-pyyaml",
|
126
|
+
"types-requests",
|
127
|
+
"types-shapely",
|
128
|
+
]
|
120
129
|
|
121
130
|
[project.urls]
|
122
131
|
"Homepage" = "https://ultralytics.com"
|
@@ -56,11 +56,11 @@ def pytest_terminal_summary(terminalreporter, exitstatus, config):
|
|
56
56
|
from ultralytics.utils import WEIGHTS_DIR
|
57
57
|
|
58
58
|
# Remove files
|
59
|
-
models = [path for x in
|
59
|
+
models = [path for x in {"*.onnx", "*.torchscript"} for path in WEIGHTS_DIR.rglob(x)]
|
60
60
|
for file in ["decelera_portrait_min.mov", "bus.jpg", "yolo11n.onnx", "yolo11n.torchscript"] + models:
|
61
61
|
Path(file).unlink(missing_ok=True)
|
62
62
|
|
63
63
|
# Remove directories
|
64
|
-
models = [path for x in
|
64
|
+
models = [path for x in {"*.mlpackage", "*_openvino_model"} for path in WEIGHTS_DIR.rglob(x)]
|
65
65
|
for directory in [WEIGHTS_DIR / "path with spaces", TMP.parents[1] / ".pytest_cache", TMP] + models:
|
66
66
|
shutil.rmtree(directory, ignore_errors=True)
|
@@ -204,7 +204,7 @@ def test_track_stream(model):
|
|
204
204
|
@pytest.mark.parametrize("task,model,data", TASK_MODEL_DATA)
|
205
205
|
def test_val(task: str, model: str, data: str) -> None:
|
206
206
|
"""Test the validation mode of the YOLO model."""
|
207
|
-
for plots in
|
207
|
+
for plots in {True, False}: # Test both cases i.e. plots=True and plots=False
|
208
208
|
metrics = YOLO(model).val(data=data, imgsz=32, plots=plots)
|
209
209
|
metrics.to_df()
|
210
210
|
metrics.to_csv()
|
@@ -390,7 +390,7 @@ def test_cfg_init():
|
|
390
390
|
check_dict_alignment({"a": 1}, {"b": 2})
|
391
391
|
copy_default_cfg()
|
392
392
|
(Path.cwd() / DEFAULT_CFG_PATH.name.replace(".yaml", "_copy.yaml")).unlink(missing_ok=False)
|
393
|
-
[smart_value(x) for x in
|
393
|
+
[smart_value(x) for x in {"none", "true", "false"}]
|
394
394
|
|
395
395
|
|
396
396
|
def test_utils_init():
|
@@ -1805,6 +1805,8 @@ class CopyPaste(BaseMixTransform):
|
|
1805
1805
|
def _transform(self, labels1, labels2={}):
|
1806
1806
|
"""Apply Copy-Paste augmentation to combine objects from another image into the current image."""
|
1807
1807
|
im = labels1["img"]
|
1808
|
+
if "mosaic_border" not in labels1:
|
1809
|
+
im = im.copy() # avoid modifying original non-mosaic image
|
1808
1810
|
cls = labels1["cls"]
|
1809
1811
|
h, w = im.shape[:2]
|
1810
1812
|
instances = labels1.pop("instances")
|
@@ -496,7 +496,7 @@ def convert_dota_to_yolo_obb(dota_root_path: str):
|
|
496
496
|
formatted_coords = [f"{coord:.6g}" for coord in normalized_coords]
|
497
497
|
g.write(f"{class_idx} {' '.join(formatted_coords)}\n")
|
498
498
|
|
499
|
-
for phase in
|
499
|
+
for phase in {"train", "val"}:
|
500
500
|
image_dir = dota_root_path / "images" / phase
|
501
501
|
orig_label_dir = dota_root_path / "labels" / f"{phase}_original"
|
502
502
|
save_dir = dota_root_path / "labels" / phase
|
@@ -684,7 +684,7 @@ def create_synthetic_coco_dataset():
|
|
684
684
|
# Create synthetic images
|
685
685
|
shutil.rmtree(dir / "labels" / "test2017", ignore_errors=True) # Remove test2017 directory as not needed
|
686
686
|
with ThreadPoolExecutor(max_workers=NUM_THREADS) as executor:
|
687
|
-
for subset in
|
687
|
+
for subset in {"train2017", "val2017"}:
|
688
688
|
subset_dir = dir / "images" / subset
|
689
689
|
subset_dir.mkdir(parents=True, exist_ok=True)
|
690
690
|
|
@@ -295,7 +295,7 @@ def split_trainval(
|
|
295
295
|
for r in rates:
|
296
296
|
crop_sizes.append(int(crop_size / r))
|
297
297
|
gaps.append(int(gap / r))
|
298
|
-
for split in
|
298
|
+
for split in {"train", "val"}:
|
299
299
|
split_images_and_labels(data_root, save_dir, split, crop_sizes, gaps)
|
300
300
|
|
301
301
|
|
@@ -214,8 +214,9 @@ def verify_image_label(args: Tuple) -> List:
|
|
214
214
|
else:
|
215
215
|
assert lb.shape[1] == 5, f"labels require 5 columns, {lb.shape[1]} columns detected"
|
216
216
|
points = lb[:, 1:]
|
217
|
-
|
218
|
-
assert
|
217
|
+
# Coordinate points check with 1% tolerance
|
218
|
+
assert points.max() <= 1.01, f"non-normalized or out of bounds coordinates {points[points > 1.01]}"
|
219
|
+
assert lb.min() >= -0.01, f"negative class labels {lb[lb < -0.01]}"
|
219
220
|
|
220
221
|
# All labels
|
221
222
|
if single_cls:
|
@@ -100,6 +100,7 @@ from ultralytics.utils.checks import (
|
|
100
100
|
check_is_path_safe,
|
101
101
|
check_requirements,
|
102
102
|
check_version,
|
103
|
+
is_intel,
|
103
104
|
is_sudo_available,
|
104
105
|
)
|
105
106
|
from ultralytics.utils.downloads import attempt_download_asset, get_github_assets, safe_download
|
@@ -107,7 +108,7 @@ from ultralytics.utils.export import export_engine, export_onnx
|
|
107
108
|
from ultralytics.utils.files import file_size, spaces_in_path
|
108
109
|
from ultralytics.utils.ops import Profile, nms_rotated
|
109
110
|
from ultralytics.utils.patches import arange_patch
|
110
|
-
from ultralytics.utils.torch_utils import TORCH_1_13,
|
111
|
+
from ultralytics.utils.torch_utils import TORCH_1_13, get_latest_opset, select_device
|
111
112
|
|
112
113
|
|
113
114
|
def export_formats():
|
@@ -372,9 +373,9 @@ class Exporter:
|
|
372
373
|
raise SystemError("TF.js exports are not currently supported on ARM64 Linux")
|
373
374
|
# Recommend OpenVINO if export and Intel CPU
|
374
375
|
if SETTINGS.get("openvino_msg"):
|
375
|
-
if
|
376
|
+
if is_intel():
|
376
377
|
LOGGER.info(
|
377
|
-
"💡 ProTip: Export to OpenVINO format for best performance on Intel
|
378
|
+
"💡 ProTip: Export to OpenVINO format for best performance on Intel hardware."
|
378
379
|
" Learn more at https://docs.ultralytics.com/integrations/openvino/"
|
379
380
|
)
|
380
381
|
SETTINGS["openvino_msg"] = False
|
@@ -573,7 +574,7 @@ class Exporter:
|
|
573
574
|
"""Export YOLO model to ONNX format."""
|
574
575
|
requirements = ["onnx>=1.12.0,<1.18.0"]
|
575
576
|
if self.args.simplify:
|
576
|
-
requirements += ["onnxslim>=0.1.
|
577
|
+
requirements += ["onnxslim>=0.1.59", "onnxruntime" + ("-gpu" if torch.cuda.is_available() else "")]
|
577
578
|
check_requirements(requirements)
|
578
579
|
import onnx # noqa
|
579
580
|
|
@@ -948,10 +949,10 @@ class Exporter:
|
|
948
949
|
"tf_keras", # required by 'onnx2tf' package
|
949
950
|
"sng4onnx>=1.0.1", # required by 'onnx2tf' package
|
950
951
|
"onnx_graphsurgeon>=0.3.26", # required by 'onnx2tf' package
|
951
|
-
"ai-edge-litert>=1.2.0", # required by 'onnx2tf' package
|
952
|
+
"ai-edge-litert>=1.2.0,<1.4.0", # required by 'onnx2tf' package
|
952
953
|
"onnx>=1.12.0,<1.18.0",
|
953
954
|
"onnx2tf>=1.26.3",
|
954
|
-
"onnxslim>=0.1.
|
955
|
+
"onnxslim>=0.1.59",
|
955
956
|
"onnxruntime-gpu" if cuda else "onnxruntime",
|
956
957
|
"protobuf>=5",
|
957
958
|
),
|
@@ -452,16 +452,16 @@ class BasePredictor:
|
|
452
452
|
if self.args.show:
|
453
453
|
self.show(str(p))
|
454
454
|
if self.args.save:
|
455
|
-
self.save_predicted_images(
|
455
|
+
self.save_predicted_images(self.save_dir / p.name, frame)
|
456
456
|
|
457
457
|
return string
|
458
458
|
|
459
|
-
def save_predicted_images(self, save_path:
|
459
|
+
def save_predicted_images(self, save_path: Path, frame: int = 0):
|
460
460
|
"""
|
461
461
|
Save video predictions as mp4 or images as jpg at specified path.
|
462
462
|
|
463
463
|
Args:
|
464
|
-
save_path (
|
464
|
+
save_path (Path): Path to save the results.
|
465
465
|
frame (int): Frame number for video mode.
|
466
466
|
"""
|
467
467
|
im = self.plotted_img
|
@@ -469,7 +469,7 @@ class BasePredictor:
|
|
469
469
|
# Save videos and streams
|
470
470
|
if self.dataset.mode in {"stream", "video"}:
|
471
471
|
fps = self.dataset.fps if self.dataset.mode == "video" else 30
|
472
|
-
frames_path = f"{save_path.
|
472
|
+
frames_path = self.save_dir / f"{save_path.stem}_frames" # save frames to a separate directory
|
473
473
|
if save_path not in self.vid_writer: # new video
|
474
474
|
if self.args.save_frames:
|
475
475
|
Path(frames_path).mkdir(parents=True, exist_ok=True)
|
@@ -484,11 +484,11 @@ class BasePredictor:
|
|
484
484
|
# Save video
|
485
485
|
self.vid_writer[save_path].write(im)
|
486
486
|
if self.args.save_frames:
|
487
|
-
cv2.imwrite(f"{frames_path}{frame}.jpg", im)
|
487
|
+
cv2.imwrite(f"{frames_path}/{save_path.stem}_{frame}.jpg", im)
|
488
488
|
|
489
489
|
# Save images
|
490
490
|
else:
|
491
|
-
cv2.imwrite(str(
|
491
|
+
cv2.imwrite(str(save_path.with_suffix(".jpg")), im) # save to JPG for best support
|
492
492
|
|
493
493
|
def show(self, p: str = ""):
|
494
494
|
"""Display an image in a window."""
|
@@ -21,10 +21,10 @@ import time
|
|
21
21
|
from typing import Dict, List, Optional
|
22
22
|
|
23
23
|
import numpy as np
|
24
|
-
import torch
|
25
24
|
|
26
25
|
from ultralytics.cfg import get_cfg, get_save_dir
|
27
26
|
from ultralytics.utils import DEFAULT_CFG, LOGGER, YAML, callbacks, colorstr, remove_colorstr
|
27
|
+
from ultralytics.utils.patches import torch_load
|
28
28
|
from ultralytics.utils.plotting import plot_tune_results
|
29
29
|
|
30
30
|
|
@@ -198,7 +198,7 @@ class Tuner:
|
|
198
198
|
cmd = [*launch, "train", *(f"{k}={v}" for k, v in train_args.items())]
|
199
199
|
return_code = subprocess.run(cmd, check=True).returncode
|
200
200
|
ckpt_file = weights_dir / ("best.pt" if (weights_dir / "best.pt").exists() else "last.pt")
|
201
|
-
metrics =
|
201
|
+
metrics = torch_load(ckpt_file)["train_metrics"]
|
202
202
|
assert return_code == 0, "training failed"
|
203
203
|
|
204
204
|
except Exception as e:
|
@@ -8,6 +8,7 @@ import torch
|
|
8
8
|
from ultralytics.engine.model import Model
|
9
9
|
from ultralytics.utils import DEFAULT_CFG_DICT
|
10
10
|
from ultralytics.utils.downloads import attempt_download_asset
|
11
|
+
from ultralytics.utils.patches import torch_load
|
11
12
|
from ultralytics.utils.torch_utils import model_info
|
12
13
|
|
13
14
|
from .predict import NASPredictor
|
@@ -56,7 +57,7 @@ class NAS(Model):
|
|
56
57
|
|
57
58
|
suffix = Path(weights).suffix
|
58
59
|
if suffix == ".pt":
|
59
|
-
self.model =
|
60
|
+
self.model = torch_load(attempt_download_asset(weights))
|
60
61
|
elif suffix == "":
|
61
62
|
self.model = super_gradients.training.models.get(weights, pretrained_weights="coco")
|
62
63
|
|
@@ -931,7 +931,7 @@ class TinyViT(nn.Module):
|
|
931
931
|
if layer.downsample is not None:
|
932
932
|
layer.downsample.apply(lambda x: _set_lr_scale(x, lr_scales[i - 1]))
|
933
933
|
assert i == depth
|
934
|
-
for m in
|
934
|
+
for m in {self.norm_head, self.head}:
|
935
935
|
m.apply(lambda x: _set_lr_scale(x, lr_scales[-1]))
|
936
936
|
|
937
937
|
for k, p in self.named_parameters():
|
@@ -71,7 +71,7 @@ class DetectionValidator(BaseValidator):
|
|
71
71
|
"""
|
72
72
|
batch["img"] = batch["img"].to(self.device, non_blocking=True)
|
73
73
|
batch["img"] = (batch["img"].half() if self.args.half else batch["img"].float()) / 255
|
74
|
-
for k in
|
74
|
+
for k in {"batch_idx", "cls", "bboxes"}:
|
75
75
|
batch[k] = batch[k].to(self.device)
|
76
76
|
|
77
77
|
return batch
|
@@ -153,7 +153,7 @@ class WorldTrainer(DetectionTrainer):
|
|
153
153
|
cache_path = cache_dir / f"text_embeddings_{model.replace(':', '_').replace('/', '_')}.pt"
|
154
154
|
if cache_path.exists():
|
155
155
|
LOGGER.info(f"Reading existed cache from '{cache_path}'")
|
156
|
-
txt_map = torch.load(cache_path)
|
156
|
+
txt_map = torch.load(cache_path, map_location=self.device)
|
157
157
|
if sorted(txt_map.keys()) == sorted(texts):
|
158
158
|
return txt_map
|
159
159
|
LOGGER.info(f"Caching text embeddings to '{cache_path}'")
|
@@ -1,9 +1,11 @@
|
|
1
1
|
# Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
|
2
2
|
|
3
|
+
from pathlib import Path
|
4
|
+
|
3
5
|
from ultralytics.data import YOLOConcatDataset, build_grounding, build_yolo_dataset
|
4
6
|
from ultralytics.data.utils import check_det_dataset
|
5
7
|
from ultralytics.models.yolo.world import WorldTrainer
|
6
|
-
from ultralytics.utils import DEFAULT_CFG, LOGGER
|
8
|
+
from ultralytics.utils import DATASETS_DIR, DEFAULT_CFG, LOGGER
|
7
9
|
from ultralytics.utils.torch_utils import de_parallel
|
8
10
|
|
9
11
|
|
@@ -136,7 +138,7 @@ class WorldTrainerFromScratch(WorldTrainer):
|
|
136
138
|
if d.get("minival") is None: # for lvis dataset
|
137
139
|
continue
|
138
140
|
d["minival"] = str(d["path"] / d["minival"])
|
139
|
-
for s in
|
141
|
+
for s in {"train", "val"}:
|
140
142
|
final_data[s] = [d["train" if s == "train" else val_split] for d in data[s]]
|
141
143
|
# save grounding data if there's one
|
142
144
|
grounding_data = data_yaml[s].get("grounding_data")
|
@@ -145,8 +147,14 @@ class WorldTrainerFromScratch(WorldTrainer):
|
|
145
147
|
grounding_data = grounding_data if isinstance(grounding_data, list) else [grounding_data]
|
146
148
|
for g in grounding_data:
|
147
149
|
assert isinstance(g, dict), f"Grounding data should be provided in dict format, but got {type(g)}"
|
150
|
+
for k in {"img_path", "json_file"}:
|
151
|
+
path = Path(g[k])
|
152
|
+
if not path.exists() and not path.is_absolute():
|
153
|
+
g[k] = str((DATASETS_DIR / g[k]).resolve()) # path relative to DATASETS_DIR
|
148
154
|
final_data[s] += grounding_data
|
149
|
-
|
155
|
+
# assign the first val dataset as currently only one validation set is supported
|
156
|
+
data["val"] = data["val"][0]
|
157
|
+
final_data["val"] = final_data["val"][0]
|
150
158
|
# NOTE: to make training work properly, set `nc` and `names`
|
151
159
|
final_data["nc"] = data["val"]["nc"]
|
152
160
|
final_data["names"] = data["val"]["names"]
|
@@ -217,7 +217,7 @@ class YOLOETrainerFromScratch(YOLOETrainer, WorldTrainerFromScratch):
|
|
217
217
|
cache_path = cache_dir / f"text_embeddings_{model.replace(':', '_').replace('/', '_')}.pt"
|
218
218
|
if cache_path.exists():
|
219
219
|
LOGGER.info(f"Reading existed cache from '{cache_path}'")
|
220
|
-
txt_map = torch.load(cache_path)
|
220
|
+
txt_map = torch.load(cache_path, map_location=self.device)
|
221
221
|
if sorted(txt_map.keys()) == sorted(texts):
|
222
222
|
return txt_map
|
223
223
|
LOGGER.info(f"Caching text embeddings to '{cache_path}'")
|
@@ -80,6 +80,7 @@ from ultralytics.utils.loss import (
|
|
80
80
|
v8SegmentationLoss,
|
81
81
|
)
|
82
82
|
from ultralytics.utils.ops import make_divisible
|
83
|
+
from ultralytics.utils.patches import torch_load
|
83
84
|
from ultralytics.utils.plotting import feature_visualization
|
84
85
|
from ultralytics.utils.torch_utils import (
|
85
86
|
fuse_conv_and_bn,
|
@@ -248,6 +249,8 @@ class BaseModel(torch.nn.Module):
|
|
248
249
|
m.forward = m.forward_fuse
|
249
250
|
if isinstance(m, v10Detect):
|
250
251
|
m.fuse() # remove one2many head
|
252
|
+
if isinstance(m, YOLOEDetect) and hasattr(self, "pe"):
|
253
|
+
m.fuse(self.pe.to(next(self.model.parameters()).device))
|
251
254
|
self.info(verbose=verbose)
|
252
255
|
|
253
256
|
return self
|
@@ -1441,9 +1444,9 @@ def torch_safe_load(weight, safe_only=False):
|
|
1441
1444
|
safe_pickle.Unpickler = SafeUnpickler
|
1442
1445
|
safe_pickle.load = lambda file_obj: SafeUnpickler(file_obj).load()
|
1443
1446
|
with open(file, "rb") as f:
|
1444
|
-
ckpt =
|
1447
|
+
ckpt = torch_load(f, pickle_module=safe_pickle)
|
1445
1448
|
else:
|
1446
|
-
ckpt =
|
1449
|
+
ckpt = torch_load(file, map_location="cpu")
|
1447
1450
|
|
1448
1451
|
except ModuleNotFoundError as e: # e.name is missing module name
|
1449
1452
|
if e.name == "models":
|
@@ -1469,7 +1472,7 @@ def torch_safe_load(weight, safe_only=False):
|
|
1469
1472
|
f"run a command with an official Ultralytics model, i.e. 'yolo predict model=yolo11n.pt'"
|
1470
1473
|
)
|
1471
1474
|
check_requirements(e.name) # install missing module
|
1472
|
-
ckpt =
|
1475
|
+
ckpt = torch_load(file, map_location="cpu")
|
1473
1476
|
|
1474
1477
|
if not isinstance(ckpt, dict):
|
1475
1478
|
# File is likely a YOLO instance saved with i.e. torch.save(model, "saved_model.pt")
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
|
2
2
|
|
3
|
-
from typing import Any, List, Tuple
|
3
|
+
from typing import Any, Dict, List, Tuple
|
4
4
|
|
5
5
|
import numpy as np
|
6
6
|
|
@@ -26,6 +26,7 @@ class RegionCounter(BaseSolution):
|
|
26
26
|
Methods:
|
27
27
|
add_region: Add a new counting region with specified attributes.
|
28
28
|
process: Process video frames to count objects in each region.
|
29
|
+
initialize_regions: Initialize zones to count the objects in each one. Zones could be multiple as well.
|
29
30
|
|
30
31
|
Examples:
|
31
32
|
Initialize a RegionCounter and add a counting region
|
@@ -42,12 +43,12 @@ class RegionCounter(BaseSolution):
|
|
42
43
|
"name": "Default Region",
|
43
44
|
"polygon": None,
|
44
45
|
"counts": 0,
|
45
|
-
"dragging": False,
|
46
46
|
"region_color": (255, 255, 255),
|
47
47
|
"text_color": (0, 0, 0),
|
48
48
|
}
|
49
49
|
self.region_counts = {}
|
50
50
|
self.counting_regions = []
|
51
|
+
self.initialize_regions()
|
51
52
|
|
52
53
|
def add_region(
|
53
54
|
self,
|
@@ -55,7 +56,7 @@ class RegionCounter(BaseSolution):
|
|
55
56
|
polygon_points: List[Tuple],
|
56
57
|
region_color: Tuple[int, int, int],
|
57
58
|
text_color: Tuple[int, int, int],
|
58
|
-
) ->
|
59
|
+
) -> Dict[str, Any]:
|
59
60
|
"""
|
60
61
|
Add a new region to the counting list based on the provided template with specific attributes.
|
61
62
|
|
@@ -64,6 +65,9 @@ class RegionCounter(BaseSolution):
|
|
64
65
|
polygon_points (List[Tuple]): List of (x, y) coordinates defining the region's polygon.
|
65
66
|
region_color (Tuple[int, int, int]): BGR color for region visualization.
|
66
67
|
text_color (Tuple[int, int, int]): BGR color for the text within the region.
|
68
|
+
|
69
|
+
Returns:
|
70
|
+
(Dict[str, any]): Returns a dictionary including the region information i.e. name, region_color etc.
|
67
71
|
"""
|
68
72
|
region = self.region_template.copy()
|
69
73
|
region.update(
|
@@ -75,6 +79,17 @@ class RegionCounter(BaseSolution):
|
|
75
79
|
}
|
76
80
|
)
|
77
81
|
self.counting_regions.append(region)
|
82
|
+
return region
|
83
|
+
|
84
|
+
def initialize_regions(self):
|
85
|
+
"""Initialize regions only once."""
|
86
|
+
if self.region is None:
|
87
|
+
self.initialize_region()
|
88
|
+
if not isinstance(self.region, dict): # Ensure self.region is initialized and structured as a dictionary
|
89
|
+
self.region = {"Region#01": self.region}
|
90
|
+
for i, (name, pts) in enumerate(self.region.items()):
|
91
|
+
region = self.add_region(name, pts, colors(i, True), (255, 255, 255))
|
92
|
+
region["prepared_polygon"] = self.prep(region["polygon"])
|
78
93
|
|
79
94
|
def process(self, im0: np.ndarray) -> SolutionResults:
|
80
95
|
"""
|
@@ -90,39 +105,21 @@ class RegionCounter(BaseSolution):
|
|
90
105
|
self.extract_tracks(im0)
|
91
106
|
annotator = SolutionAnnotator(im0, line_width=self.line_width)
|
92
107
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
annotator.draw_region(reg_pts, color, self.line_width * 2)
|
101
|
-
self.add_region(region_name, reg_pts, color, annotator.get_txt_color())
|
102
|
-
|
103
|
-
# Prepare regions for containment check (only process valid ones)
|
104
|
-
for region in self.counting_regions:
|
105
|
-
if "prepared_polygon" not in region:
|
106
|
-
region["prepared_polygon"] = self.prep(region["polygon"])
|
107
|
-
|
108
|
-
# Convert bounding boxes to NumPy array for center points
|
109
|
-
boxes_np = np.array([((box[0] + box[2]) / 2, (box[1] + box[3]) / 2) for box in self.boxes], dtype=np.float32)
|
110
|
-
points = [self.Point(pt) for pt in boxes_np] # Convert centers to Point objects
|
111
|
-
|
112
|
-
# Process bounding boxes & check containment
|
113
|
-
if points:
|
114
|
-
for point, cls, track_id, box, conf in zip(points, self.clss, self.track_ids, self.boxes, self.confs):
|
115
|
-
annotator.box_label(box, label=self.adjust_box_label(cls, conf, track_id), color=colors(track_id, True))
|
116
|
-
|
117
|
-
for region in self.counting_regions:
|
118
|
-
if region["prepared_polygon"].contains(point):
|
119
|
-
region["counts"] += 1
|
120
|
-
self.region_counts[region["name"]] = region["counts"]
|
108
|
+
for box, cls, track_id, conf in zip(self.boxes, self.clss, self.track_ids, self.confs):
|
109
|
+
annotator.box_label(box, label=self.adjust_box_label(cls, conf, track_id), color=colors(track_id, True))
|
110
|
+
center = self.Point(((box[0] + box[2]) / 2, (box[1] + box[3]) / 2))
|
111
|
+
for region in self.counting_regions:
|
112
|
+
if region["prepared_polygon"].contains(center):
|
113
|
+
region["counts"] += 1
|
114
|
+
self.region_counts[region["name"]] = region["counts"]
|
121
115
|
|
122
116
|
# Display region counts
|
123
117
|
for region in self.counting_regions:
|
118
|
+
x1, y1, x2, y2 = map(int, region["polygon"].bounds)
|
119
|
+
pts = [(x1, y1), (x2, y1), (x2, y2), (x1, y2)]
|
120
|
+
annotator.draw_region(pts, region["region_color"], self.line_width * 2)
|
124
121
|
annotator.text_label(
|
125
|
-
|
122
|
+
[x1, y1, x2, y2],
|
126
123
|
label=str(region["counts"]),
|
127
124
|
color=region["region_color"],
|
128
125
|
txt_color=region["text_color"],
|
@@ -115,7 +115,7 @@ class BaseSolution:
|
|
115
115
|
self.device = self.CFG["device"]
|
116
116
|
|
117
117
|
self.track_add_args = { # Tracker additional arguments for advance configuration
|
118
|
-
k: self.CFG[k] for k in
|
118
|
+
k: self.CFG[k] for k in {"iou", "conf", "device", "max_det", "half", "tracker"}
|
119
119
|
} # verbose must be passed to track method; setting it False in YOLO still logs the track information.
|
120
120
|
|
121
121
|
if is_cli and self.CFG["source"] is None:
|
@@ -25,7 +25,7 @@ import torch
|
|
25
25
|
import tqdm
|
26
26
|
|
27
27
|
from ultralytics import __version__
|
28
|
-
from ultralytics.utils.patches import imread, imshow, imwrite,
|
28
|
+
from ultralytics.utils.patches import imread, imshow, imwrite, torch_save # for patches
|
29
29
|
|
30
30
|
# PyTorch Multi-GPU DDP Constants
|
31
31
|
RANK = int(os.getenv("RANK", -1))
|
@@ -1593,7 +1593,6 @@ TESTS_RUNNING = is_pytest_running() or is_github_action_running()
|
|
1593
1593
|
set_sentry()
|
1594
1594
|
|
1595
1595
|
# Apply monkey patches
|
1596
|
-
torch.load = torch_load
|
1597
1596
|
torch.save = torch_save
|
1598
1597
|
if WINDOWS:
|
1599
1598
|
# Apply cv2 patches for non-ASCII and non-UTF characters in image paths
|
@@ -896,6 +896,27 @@ def is_rockchip():
|
|
896
896
|
return False
|
897
897
|
|
898
898
|
|
899
|
+
def is_intel():
|
900
|
+
"""
|
901
|
+
Check if the system has Intel hardware (CPU or GPU).
|
902
|
+
|
903
|
+
Returns:
|
904
|
+
(bool): True if Intel hardware is detected, False otherwise.
|
905
|
+
"""
|
906
|
+
from ultralytics.utils.torch_utils import get_cpu_info
|
907
|
+
|
908
|
+
# Check CPU
|
909
|
+
if "intel" in get_cpu_info().lower():
|
910
|
+
return True
|
911
|
+
|
912
|
+
# Check GPU via xpu-smi
|
913
|
+
try:
|
914
|
+
result = subprocess.run(["xpu-smi", "discovery"], capture_output=True, text=True, timeout=5)
|
915
|
+
return "intel" in result.stdout.lower()
|
916
|
+
except (subprocess.TimeoutExpired, FileNotFoundError, subprocess.SubprocessError):
|
917
|
+
return False
|
918
|
+
|
919
|
+
|
899
920
|
def is_sudo_available() -> bool:
|
900
921
|
"""
|
901
922
|
Check if the sudo command is available in the environment.
|
@@ -488,7 +488,7 @@ class ConfusionMatrix(DataExportMixin):
|
|
488
488
|
if ticklabels != "auto":
|
489
489
|
ax.set_xticklabels(ticklabels, fontsize=tick_fontsize, rotation=90, ha="center")
|
490
490
|
ax.set_yticklabels(ticklabels, fontsize=tick_fontsize)
|
491
|
-
for s in
|
491
|
+
for s in {"left", "right", "bottom", "top", "outline"}:
|
492
492
|
if s != "outline":
|
493
493
|
ax.spines[s].set_visible(False) # Confusion matrix plot don't have outline
|
494
494
|
cbar.ax.spines[s].set_visible(False)
|
@@ -1006,6 +1006,7 @@ class DetMetrics(SimpleClass, DataExportMixin):
|
|
1006
1006
|
save_dir=save_dir,
|
1007
1007
|
names=self.names,
|
1008
1008
|
on_plot=on_plot,
|
1009
|
+
prefix="Box",
|
1009
1010
|
)[2:]
|
1010
1011
|
self.box.nc = len(self.names)
|
1011
1012
|
self.box.update(results)
|
@@ -1135,7 +1136,7 @@ class SegmentMetrics(DetMetrics):
|
|
1135
1136
|
Returns:
|
1136
1137
|
(Dict[str, np.ndarray]): Dictionary containing concatenated statistics arrays.
|
1137
1138
|
"""
|
1138
|
-
stats = DetMetrics.process(self, on_plot=on_plot) # process box stats
|
1139
|
+
stats = DetMetrics.process(self, save_dir, plot, on_plot=on_plot) # process box stats
|
1139
1140
|
results_mask = ap_per_class(
|
1140
1141
|
stats["tp_m"],
|
1141
1142
|
stats["conf"],
|
@@ -1270,7 +1271,7 @@ class PoseMetrics(DetMetrics):
|
|
1270
1271
|
Returns:
|
1271
1272
|
(Dict[str, np.ndarray]): Dictionary containing concatenated statistics arrays.
|
1272
1273
|
"""
|
1273
|
-
stats = DetMetrics.process(self, on_plot=on_plot) # process box stats
|
1274
|
+
stats = DetMetrics.process(self, save_dir, plot, on_plot=on_plot) # process box stats
|
1274
1275
|
results_pose = ap_per_class(
|
1275
1276
|
stats["tp_p"],
|
1276
1277
|
stats["conf"],
|
@@ -90,7 +90,6 @@ def imshow(winname: str, mat: np.ndarray) -> None:
|
|
90
90
|
|
91
91
|
|
92
92
|
# PyTorch functions ----------------------------------------------------------------------------------------------------
|
93
|
-
_torch_load = torch.load # copy to avoid recursion errors
|
94
93
|
_torch_save = torch.save
|
95
94
|
|
96
95
|
|
@@ -116,7 +115,7 @@ def torch_load(*args, **kwargs):
|
|
116
115
|
if TORCH_1_13 and "weights_only" not in kwargs:
|
117
116
|
kwargs["weights_only"] = False
|
118
117
|
|
119
|
-
return
|
118
|
+
return torch.load(*args, **kwargs)
|
120
119
|
|
121
120
|
|
122
121
|
def torch_save(*args, **kwargs):
|
@@ -610,8 +610,8 @@ def plot_labels(boxes, cls, names=(), save_dir=Path(""), on_plot=None):
|
|
610
610
|
ax[3].hist2d(x["width"], x["height"], bins=50, cmap=subplot_3_4_color)
|
611
611
|
ax[3].set_xlabel("width")
|
612
612
|
ax[3].set_ylabel("height")
|
613
|
-
for a in
|
614
|
-
for s in
|
613
|
+
for a in {0, 1, 2, 3}:
|
614
|
+
for s in {"top", "right", "left", "bottom"}:
|
615
615
|
ax[a].spines[s].set_visible(False)
|
616
616
|
|
617
617
|
fname = save_dir / "labels.jpg"
|
@@ -30,6 +30,7 @@ from ultralytics.utils import (
|
|
30
30
|
colorstr,
|
31
31
|
)
|
32
32
|
from ultralytics.utils.checks import check_version
|
33
|
+
from ultralytics.utils.patches import torch_load
|
33
34
|
|
34
35
|
# Version checks (all default to version>=min_version)
|
35
36
|
TORCH_1_9 = check_version(torch.__version__, "1.9.0")
|
@@ -724,7 +725,7 @@ def strip_optimizer(f: Union[str, Path] = "best.pt", s: str = "", updates: Dict[
|
|
724
725
|
>>> strip_optimizer(f)
|
725
726
|
"""
|
726
727
|
try:
|
727
|
-
x =
|
728
|
+
x = torch_load(f, map_location=torch.device("cpu"))
|
728
729
|
assert isinstance(x, dict), "checkpoint is not a Python dictionary"
|
729
730
|
assert "model" in x, "'model' missing from checkpoint"
|
730
731
|
except Exception as e:
|