ultralytics 8.3.113__tar.gz → 8.3.115__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.113/ultralytics.egg-info → ultralytics-8.3.115}/PKG-INFO +1 -1
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/__init__.py +1 -1
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/dota8-multispectral.yaml +1 -1
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/trackers/botsort.yaml +4 -3
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/data/utils.py +3 -2
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/engine/exporter.py +1 -1
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/detect/predict.py +25 -1
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/nn/autobackend.py +1 -1
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/trackers/bot_sort.py +32 -8
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/trackers/byte_tracker.py +3 -3
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/trackers/track.py +20 -1
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/__init__.py +1 -1
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/ops.py +16 -6
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/patches.py +2 -1
- {ultralytics-8.3.113 → ultralytics-8.3.115/ultralytics.egg-info}/PKG-INFO +1 -1
- {ultralytics-8.3.113 → ultralytics-8.3.115}/LICENSE +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/README.md +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/pyproject.toml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/setup.cfg +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/tests/test_cli.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/tests/test_cuda.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/tests/test_engine.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/tests/test_exports.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/tests/test_integrations.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/tests/test_python.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/tests/test_solutions.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/assets/bus.jpg +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/assets/zidane.jpg +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/__init__.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/VOC.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/coco.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/coco128.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/coco8-multispectral.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/coco8.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/dog-pose.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/dota8.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/hand-keypoints.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/lvis.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/medical-pills.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/signature.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/xView.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/default.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/11/yolo11-cls-resnet18.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/11/yolo11-cls.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/11/yolo11-obb.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/11/yolo11-pose.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/11/yolo11-seg.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/11/yolo11.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/11/yoloe-11-seg.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/11/yoloe-11.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/12/yolo12-cls.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/12/yolo12-obb.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/12/yolo12-pose.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/12/yolo12-seg.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/12/yolo12.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v10/yolov10b.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v10/yolov10l.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v10/yolov10m.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v10/yolov10n.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v10/yolov10s.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v10/yolov10x.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v8/yoloe-v8-seg.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v8/yoloe-v8.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v9/yolov9m.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v9/yolov9s.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v9/yolov9t.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/solutions/default.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/data/__init__.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/data/annotator.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/data/augment.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/data/base.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/data/build.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/data/converter.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/data/dataset.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/data/loaders.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/data/scripts/download_weights.sh +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/data/scripts/get_coco.sh +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/data/scripts/get_coco128.sh +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/data/scripts/get_imagenet.sh +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/data/split.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/data/split_dota.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/engine/__init__.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/engine/model.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/engine/predictor.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/engine/results.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/engine/trainer.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/engine/tuner.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/engine/validator.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/hub/__init__.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/hub/auth.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/hub/google/__init__.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/hub/session.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/hub/utils.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/__init__.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/fastsam/__init__.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/fastsam/model.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/fastsam/predict.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/fastsam/utils.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/fastsam/val.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/nas/__init__.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/nas/model.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/nas/predict.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/nas/val.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/rtdetr/__init__.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/rtdetr/model.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/rtdetr/predict.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/rtdetr/train.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/rtdetr/val.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/sam/__init__.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/sam/amg.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/sam/build.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/sam/model.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/sam/modules/__init__.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/sam/modules/blocks.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/sam/modules/decoders.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/sam/modules/encoders.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/sam/modules/memory_attention.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/sam/modules/sam.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/sam/modules/transformer.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/sam/modules/utils.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/sam/predict.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/utils/__init__.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/utils/loss.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/utils/ops.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/__init__.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/classify/__init__.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/classify/predict.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/classify/train.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/classify/val.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/detect/__init__.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/detect/train.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/detect/val.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/model.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/obb/__init__.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/obb/predict.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/obb/train.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/obb/val.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/pose/__init__.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/pose/predict.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/pose/train.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/pose/val.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/segment/__init__.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/segment/predict.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/segment/train.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/segment/val.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/world/__init__.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/world/train.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/world/train_world.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/yoloe/__init__.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/yoloe/predict.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/yoloe/train.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/yoloe/train_seg.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/yoloe/val.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/nn/__init__.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/nn/modules/__init__.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/nn/modules/activation.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/nn/modules/block.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/nn/modules/conv.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/nn/modules/head.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/nn/modules/transformer.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/nn/modules/utils.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/nn/tasks.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/nn/text_model.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/solutions/__init__.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/solutions/ai_gym.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/solutions/analytics.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/solutions/distance_calculation.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/solutions/heatmap.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/solutions/instance_segmentation.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/solutions/object_blurrer.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/solutions/object_counter.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/solutions/object_cropper.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/solutions/parking_management.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/solutions/queue_management.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/solutions/region_counter.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/solutions/security_alarm.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/solutions/solutions.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/solutions/speed_estimation.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/solutions/streamlit_inference.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/solutions/trackzone.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/solutions/vision_eye.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/trackers/__init__.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/trackers/basetrack.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/trackers/utils/__init__.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/trackers/utils/gmc.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/trackers/utils/kalman_filter.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/trackers/utils/matching.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/autobatch.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/benchmarks.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/callbacks/__init__.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/callbacks/base.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/callbacks/clearml.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/callbacks/comet.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/callbacks/dvc.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/callbacks/hub.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/callbacks/mlflow.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/callbacks/neptune.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/callbacks/raytune.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/callbacks/tensorboard.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/callbacks/wb.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/checks.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/dist.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/downloads.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/errors.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/export.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/files.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/instance.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/loss.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/metrics.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/plotting.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/tal.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/torch_utils.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/triton.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/tuner.py +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics.egg-info/SOURCES.txt +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics.egg-info/dependency_links.txt +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics.egg-info/entry_points.txt +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics.egg-info/requires.txt +0 -0
- {ultralytics-8.3.113 → ultralytics-8.3.115}/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.115
|
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>
|
{ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/dota8-multispectral.yaml
RENAMED
@@ -6,7 +6,7 @@
|
|
6
6
|
# parent
|
7
7
|
# ├── ultralytics
|
8
8
|
# └── datasets
|
9
|
-
# └── dota8-multispectral ← downloads here (
|
9
|
+
# └── dota8-multispectral ← downloads here (37.3MB)
|
10
10
|
|
11
11
|
# 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, ..]
|
12
12
|
path: ../datasets/dota8-multispectral # dataset root dir
|
@@ -15,7 +15,8 @@ fuse_score: True # Whether to fuse confidence scores with the iou distances befo
|
|
15
15
|
|
16
16
|
# BoT-SORT settings
|
17
17
|
gmc_method: sparseOptFlow # method of global motion compensation
|
18
|
-
# ReID model related thresh
|
19
|
-
proximity_thresh: 0.5
|
20
|
-
appearance_thresh: 0.25
|
18
|
+
# ReID model related thresh
|
19
|
+
proximity_thresh: 0.5 # minimum IoU for valid match with ReID
|
20
|
+
appearance_thresh: 0.25 # minimum appearance similarity for ReID
|
21
21
|
with_reid: False
|
22
|
+
model: auto # uses native features if detector is YOLO else yolo11n-cls.pt
|
@@ -47,7 +47,7 @@ def img2label_paths(img_paths):
|
|
47
47
|
return [sb.join(x.rsplit(sa, 1)).rsplit(".", 1)[0] + ".txt" for x in img_paths]
|
48
48
|
|
49
49
|
|
50
|
-
def check_file_speeds(files, threshold_ms=10, max_files=5, prefix=""):
|
50
|
+
def check_file_speeds(files, threshold_ms=10, threshold_mb=50, max_files=5, prefix=""):
|
51
51
|
"""
|
52
52
|
Check dataset file access speed and provide performance feedback.
|
53
53
|
|
@@ -57,6 +57,7 @@ def check_file_speeds(files, threshold_ms=10, max_files=5, prefix=""):
|
|
57
57
|
Args:
|
58
58
|
files (list): List of file paths to check for access speed.
|
59
59
|
threshold_ms (float, optional): Threshold in milliseconds for ping time warnings.
|
60
|
+
threshold_mb (float, optional): Threshold in megabytes per second for read speed warnings.
|
60
61
|
max_files (int, optional): The maximum number of files to check.
|
61
62
|
prefix (str, optional): Prefix string to add to log messages.
|
62
63
|
|
@@ -112,7 +113,7 @@ def check_file_speeds(files, threshold_ms=10, max_files=5, prefix=""):
|
|
112
113
|
else:
|
113
114
|
speed_msg = ""
|
114
115
|
|
115
|
-
if avg_ping < threshold_ms:
|
116
|
+
if avg_ping < threshold_ms or avg_speed < threshold_mb:
|
116
117
|
LOGGER.info(f"{prefix}Fast image access ✅ ({ping_msg}{speed_msg}{size_msg})")
|
117
118
|
else:
|
118
119
|
LOGGER.warning(
|
@@ -351,7 +351,7 @@ class Exporter:
|
|
351
351
|
if self.args.int8 and not self.args.data:
|
352
352
|
self.args.data = DEFAULT_CFG.data or TASK2DATA[getattr(model, "task", "detect")] # assign default data
|
353
353
|
LOGGER.warning(
|
354
|
-
"INT8 export requires a missing 'data' arg for calibration. Using default 'data={self.args.data}'."
|
354
|
+
f"INT8 export requires a missing 'data' arg for calibration. Using default 'data={self.args.data}'."
|
355
355
|
)
|
356
356
|
if tfjs and (ARM64 and LINUX):
|
357
357
|
raise SystemError("TF.js exports are not currently supported on ARM64 Linux")
|
@@ -51,6 +51,7 @@ class DetectionPredictor(BasePredictor):
|
|
51
51
|
>>> results = predictor.predict("path/to/image.jpg")
|
52
52
|
>>> processed_results = predictor.postprocess(preds, img, orig_imgs)
|
53
53
|
"""
|
54
|
+
save_feats = getattr(self, "save_feats", False)
|
54
55
|
preds = ops.non_max_suppression(
|
55
56
|
preds,
|
56
57
|
self.args.conf,
|
@@ -61,12 +62,35 @@ class DetectionPredictor(BasePredictor):
|
|
61
62
|
nc=len(self.model.names),
|
62
63
|
end2end=getattr(self.model, "end2end", False),
|
63
64
|
rotated=self.args.task == "obb",
|
65
|
+
return_idxs=save_feats,
|
64
66
|
)
|
65
67
|
|
66
68
|
if not isinstance(orig_imgs, list): # input images are a torch.Tensor, not a list
|
67
69
|
orig_imgs = ops.convert_torch2numpy_batch(orig_imgs)
|
68
70
|
|
69
|
-
|
71
|
+
if save_feats:
|
72
|
+
obj_feats = self.get_obj_feats(self._feats, preds[1])
|
73
|
+
preds = preds[0]
|
74
|
+
|
75
|
+
results = self.construct_results(preds, img, orig_imgs, **kwargs)
|
76
|
+
|
77
|
+
if save_feats:
|
78
|
+
for r, f in zip(results, obj_feats):
|
79
|
+
r.feats = f # add object features to results
|
80
|
+
|
81
|
+
return results
|
82
|
+
|
83
|
+
def get_obj_feats(self, feat_maps, idxs):
|
84
|
+
"""Extract object features from the feature maps."""
|
85
|
+
from math import gcd
|
86
|
+
|
87
|
+
import torch
|
88
|
+
|
89
|
+
s = gcd(*[x.shape[1] for x in feat_maps]) # find smallest vector length
|
90
|
+
obj_feats = torch.cat(
|
91
|
+
[x.permute(0, 2, 3, 1).reshape(x.shape[0], -1, s, x.shape[1] // s).mean(dim=-1) for x in feat_maps], dim=1
|
92
|
+
) # mean reduce all vectors to same length
|
93
|
+
return [feats[idx] for feats, idx in zip(obj_feats, idxs)] # for each image in batch, indexed separately
|
70
94
|
|
71
95
|
def construct_results(self, preds, img, orig_imgs):
|
72
96
|
"""
|
@@ -538,7 +538,7 @@ class AutoBackend(nn.Module):
|
|
538
538
|
metadata = yaml_load(metadata)
|
539
539
|
if metadata and isinstance(metadata, dict):
|
540
540
|
for k, v in metadata.items():
|
541
|
-
if k in {"stride", "batch"}:
|
541
|
+
if k in {"stride", "batch", "channels"}:
|
542
542
|
metadata[k] = int(v)
|
543
543
|
elif k in {"imgsz", "names", "kpt_shape", "args"} and isinstance(v, str):
|
544
544
|
metadata[k] = eval(v)
|
@@ -3,6 +3,10 @@
|
|
3
3
|
from collections import deque
|
4
4
|
|
5
5
|
import numpy as np
|
6
|
+
import torch
|
7
|
+
|
8
|
+
from ultralytics.utils.ops import xywh2xyxy
|
9
|
+
from ultralytics.utils.plotting import save_one_box
|
6
10
|
|
7
11
|
from .basetrack import TrackState
|
8
12
|
from .byte_tracker import BYTETracker, STrack
|
@@ -186,14 +190,18 @@ class BOTSORT(BYTETracker):
|
|
186
190
|
>>> bot_sort = BOTSORT(args, frame_rate=30)
|
187
191
|
"""
|
188
192
|
super().__init__(args, frame_rate)
|
193
|
+
self.gmc = GMC(method=args.gmc_method)
|
194
|
+
|
189
195
|
# ReID module
|
190
196
|
self.proximity_thresh = args.proximity_thresh
|
191
197
|
self.appearance_thresh = args.appearance_thresh
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
198
|
+
self.encoder = (
|
199
|
+
(lambda feats, s: [f.cpu().numpy() for f in feats]) # native features do not require any model
|
200
|
+
if self.args.model == "auto"
|
201
|
+
else ReID(args.model)
|
202
|
+
if args.with_reid
|
203
|
+
else None
|
204
|
+
)
|
197
205
|
|
198
206
|
def get_kalmanfilter(self):
|
199
207
|
"""Return an instance of KalmanFilterXYWH for predicting and updating object states in the tracking process."""
|
@@ -204,7 +212,7 @@ class BOTSORT(BYTETracker):
|
|
204
212
|
if len(dets) == 0:
|
205
213
|
return []
|
206
214
|
if self.args.with_reid and self.encoder is not None:
|
207
|
-
features_keep = self.encoder
|
215
|
+
features_keep = self.encoder(img, dets)
|
208
216
|
return [BOTrack(xyxy, s, c, f) for (xyxy, s, c, f) in zip(dets, scores, cls, features_keep)] # detections
|
209
217
|
else:
|
210
218
|
return [BOTrack(xyxy, s, c) for (xyxy, s, c) in zip(dets, scores, cls)] # detections
|
@@ -212,14 +220,14 @@ class BOTSORT(BYTETracker):
|
|
212
220
|
def get_dists(self, tracks, detections):
|
213
221
|
"""Calculate distances between tracks and detections using IoU and optionally ReID embeddings."""
|
214
222
|
dists = matching.iou_distance(tracks, detections)
|
215
|
-
dists_mask = dists > self.proximity_thresh
|
223
|
+
dists_mask = dists > (1 - self.proximity_thresh)
|
216
224
|
|
217
225
|
if self.args.fuse_score:
|
218
226
|
dists = matching.fuse_score(dists, detections)
|
219
227
|
|
220
228
|
if self.args.with_reid and self.encoder is not None:
|
221
229
|
emb_dists = matching.embedding_distance(tracks, detections) / 2.0
|
222
|
-
emb_dists[emb_dists > self.appearance_thresh] = 1.0
|
230
|
+
emb_dists[emb_dists > (1 - self.appearance_thresh)] = 1.0
|
223
231
|
emb_dists[dists_mask] = 1.0
|
224
232
|
dists = np.minimum(dists, emb_dists)
|
225
233
|
return dists
|
@@ -232,3 +240,19 @@ class BOTSORT(BYTETracker):
|
|
232
240
|
"""Reset the BOTSORT tracker to its initial state, clearing all tracked objects and internal states."""
|
233
241
|
super().reset()
|
234
242
|
self.gmc.reset_params()
|
243
|
+
|
244
|
+
|
245
|
+
class ReID:
|
246
|
+
"""YOLO model as encoder for re-identification."""
|
247
|
+
|
248
|
+
def __init__(self, model):
|
249
|
+
"""Initialize encoder for re-identification."""
|
250
|
+
from ultralytics import YOLO
|
251
|
+
|
252
|
+
self.model = YOLO(model)
|
253
|
+
self.model(embed=[len(self.model.model.model) - 2 if ".pt" in model else -1], verbose=False) # initialize
|
254
|
+
|
255
|
+
def __call__(self, img, dets):
|
256
|
+
"""Extract embeddings for detected objects."""
|
257
|
+
feats = self.model([save_one_box(det, img, save=False) for det in xywh2xyxy(torch.from_numpy(dets[:, :4]))])
|
258
|
+
return [f.cpu().numpy() for f in feats]
|
@@ -290,7 +290,7 @@ class BYTETracker:
|
|
290
290
|
self.kalman_filter = self.get_kalmanfilter()
|
291
291
|
self.reset_id()
|
292
292
|
|
293
|
-
def update(self, results, img=None):
|
293
|
+
def update(self, results, img=None, feats=None):
|
294
294
|
"""Updates the tracker with new detections and returns the current list of tracked objects."""
|
295
295
|
self.frame_id += 1
|
296
296
|
activated_stracks = []
|
@@ -316,7 +316,7 @@ class BYTETracker:
|
|
316
316
|
cls_keep = cls[remain_inds]
|
317
317
|
cls_second = cls[inds_second]
|
318
318
|
|
319
|
-
detections = self.init_track(dets, scores_keep, cls_keep, img)
|
319
|
+
detections = self.init_track(dets, scores_keep, cls_keep, img if feats is None else feats)
|
320
320
|
# Add newly detected tracklets to tracked_stracks
|
321
321
|
unconfirmed = []
|
322
322
|
tracked_stracks = [] # type: list[STrack]
|
@@ -347,7 +347,7 @@ class BYTETracker:
|
|
347
347
|
track.re_activate(det, self.frame_id, new_id=False)
|
348
348
|
refind_stracks.append(track)
|
349
349
|
# Step 3: Second association, with low score detection boxes association the untrack to the low score detections
|
350
|
-
detections_second = self.init_track(dets_second, scores_second, cls_second, img)
|
350
|
+
detections_second = self.init_track(dets_second, scores_second, cls_second, img if feats is None else feats)
|
351
351
|
r_tracked_stracks = [strack_pool[i] for i in u_track if strack_pool[i].state == TrackState.Tracked]
|
352
352
|
# TODO
|
353
353
|
dists = matching.iou_distance(r_tracked_stracks, detections_second)
|
@@ -44,6 +44,25 @@ def on_predict_start(predictor: object, persist: bool = False) -> None:
|
|
44
44
|
if cfg.tracker_type not in {"bytetrack", "botsort"}:
|
45
45
|
raise AssertionError(f"Only 'bytetrack' and 'botsort' are supported for now, but got '{cfg.tracker_type}'")
|
46
46
|
|
47
|
+
if cfg.tracker_type == "botsort" and cfg.with_reid and cfg.model == "auto":
|
48
|
+
from ultralytics.nn.modules.head import Detect
|
49
|
+
|
50
|
+
if not (
|
51
|
+
isinstance(predictor.model.model, torch.nn.Module)
|
52
|
+
and isinstance(predictor.model.model.model[-1], Detect)
|
53
|
+
and not predictor.model.model.model[-1].end2end
|
54
|
+
):
|
55
|
+
cfg.model = "yolo11n-cls.pt"
|
56
|
+
else:
|
57
|
+
predictor.save_feats = True
|
58
|
+
predictor._feats = None
|
59
|
+
|
60
|
+
# Register hook to extract input of Detect layer
|
61
|
+
def capture_io(module, input, output):
|
62
|
+
predictor._feats = input[0]
|
63
|
+
|
64
|
+
predictor.model.model.model[-1].register_forward_hook(capture_io)
|
65
|
+
|
47
66
|
trackers = []
|
48
67
|
for _ in range(predictor.dataset.bs):
|
49
68
|
tracker = TRACKER_MAP[cfg.tracker_type](args=cfg, frame_rate=30)
|
@@ -79,7 +98,7 @@ def on_predict_postprocess_end(predictor: object, persist: bool = False) -> None
|
|
79
98
|
det = (result.obb if is_obb else result.boxes).cpu().numpy()
|
80
99
|
if len(det) == 0:
|
81
100
|
continue
|
82
|
-
tracks = tracker.update(det, result.orig_img)
|
101
|
+
tracks = tracker.update(det, result.orig_img, getattr(result, "feats", None))
|
83
102
|
if len(tracks) == 0:
|
84
103
|
continue
|
85
104
|
idx = tracks[:, -1].astype(int)
|
@@ -1261,7 +1261,7 @@ class SettingsManager(JSONDict):
|
|
1261
1261
|
"For help see https://docs.ultralytics.com/quickstart/#ultralytics-settings."
|
1262
1262
|
)
|
1263
1263
|
|
1264
|
-
with torch_distributed_zero_first(
|
1264
|
+
with torch_distributed_zero_first(LOCAL_RANK):
|
1265
1265
|
super().__init__(self.file)
|
1266
1266
|
|
1267
1267
|
if not self.file.exists() or not self: # Check if file doesn't exist or is empty
|
@@ -194,6 +194,7 @@ def non_max_suppression(
|
|
194
194
|
in_place=True,
|
195
195
|
rotated=False,
|
196
196
|
end2end=False,
|
197
|
+
return_idxs=False,
|
197
198
|
):
|
198
199
|
"""
|
199
200
|
Perform non-maximum suppression (NMS) on a set of boxes, with support for masks and multiple labels per box.
|
@@ -221,6 +222,7 @@ def non_max_suppression(
|
|
221
222
|
in_place (bool): If True, the input prediction tensor will be modified in place.
|
222
223
|
rotated (bool): If Oriented Bounding Boxes (OBB) are being passed for NMS.
|
223
224
|
end2end (bool): If the model doesn't require NMS.
|
225
|
+
return_idxs (bool): Return the indices of the detections that were kept.
|
224
226
|
|
225
227
|
Returns:
|
226
228
|
(List[torch.Tensor]): A list of length batch_size, where each element is a tensor of
|
@@ -248,6 +250,7 @@ def non_max_suppression(
|
|
248
250
|
nm = prediction.shape[1] - nc - 4 # number of masks
|
249
251
|
mi = 4 + nc # mask start index
|
250
252
|
xc = prediction[:, 4:mi].amax(1) > conf_thres # candidates
|
253
|
+
xinds = torch.stack([torch.arange(len(i), device=prediction.device) for i in xc])[..., None] # to track idxs
|
251
254
|
|
252
255
|
# Settings
|
253
256
|
# min_wh = 2 # (pixels) minimum box width and height
|
@@ -263,10 +266,12 @@ def non_max_suppression(
|
|
263
266
|
|
264
267
|
t = time.time()
|
265
268
|
output = [torch.zeros((0, 6 + nm), device=prediction.device)] * bs
|
266
|
-
|
269
|
+
keepi = [torch.zeros((0, 1), device=prediction.device)] * bs # to store the kept idxs
|
270
|
+
for xi, (x, xk) in enumerate(zip(prediction, xinds)): # image index, (preds, preds indices)
|
267
271
|
# Apply constraints
|
268
272
|
# x[((x[:, 2:4] < min_wh) | (x[:, 2:4] > max_wh)).any(1), 4] = 0 # width-height
|
269
|
-
|
273
|
+
filt = xc[xi] # confidence
|
274
|
+
x, xk = x[filt], xk[filt]
|
270
275
|
|
271
276
|
# Cat apriori labels if autolabelling
|
272
277
|
if labels and len(labels[xi]) and not rotated:
|
@@ -286,20 +291,25 @@ def non_max_suppression(
|
|
286
291
|
if multi_label:
|
287
292
|
i, j = torch.where(cls > conf_thres)
|
288
293
|
x = torch.cat((box[i], x[i, 4 + j, None], j[:, None].float(), mask[i]), 1)
|
294
|
+
xk = xk[i]
|
289
295
|
else: # best class only
|
290
296
|
conf, j = cls.max(1, keepdim=True)
|
291
|
-
|
297
|
+
filt = conf.view(-1) > conf_thres
|
298
|
+
x = torch.cat((box, conf, j.float(), mask), 1)[filt]
|
299
|
+
xk = xk[filt]
|
292
300
|
|
293
301
|
# Filter by class
|
294
302
|
if classes is not None:
|
295
303
|
x = x[(x[:, 5:6] == classes).any(1)]
|
304
|
+
x, xk = x[filt], xk[filt]
|
296
305
|
|
297
306
|
# Check shape
|
298
307
|
n = x.shape[0] # number of boxes
|
299
308
|
if not n: # no boxes
|
300
309
|
continue
|
301
310
|
if n > max_nms: # excess boxes
|
302
|
-
|
311
|
+
filt = x[:, 4].argsort(descending=True)[:max_nms] # sort by confidence and remove excess boxes
|
312
|
+
x, xk = x[filt], xk[filt]
|
303
313
|
|
304
314
|
# Batched NMS
|
305
315
|
c = x[:, 5:6] * (0 if agnostic else max_wh) # classes
|
@@ -324,12 +334,12 @@ def non_max_suppression(
|
|
324
334
|
# if redundant:
|
325
335
|
# i = i[iou.sum(1) > 1] # require redundancy
|
326
336
|
|
327
|
-
output[xi] = x[i]
|
337
|
+
output[xi], keepi[xi] = x[i], xk[i].reshape(-1)
|
328
338
|
if (time.time() - t) > time_limit:
|
329
339
|
LOGGER.warning(f"NMS time limit {time_limit:.3f}s exceeded")
|
330
340
|
break # time limit exceeded
|
331
341
|
|
332
|
-
return output
|
342
|
+
return (output, keepi) if return_idxs else output
|
333
343
|
|
334
344
|
|
335
345
|
def clip_boxes(boxes, shape):
|
@@ -31,7 +31,8 @@ def imread(filename: str, flags: int = cv2.IMREAD_COLOR):
|
|
31
31
|
if filename.endswith((".tiff", ".tif")):
|
32
32
|
success, frames = cv2.imdecodemulti(file_bytes, cv2.IMREAD_UNCHANGED)
|
33
33
|
if success:
|
34
|
-
|
34
|
+
# handle RGB images in tif/tiff format
|
35
|
+
return frames[0] if len(frames) == 1 and frames[0].ndim == 3 else np.stack(frames, axis=2)
|
35
36
|
return None
|
36
37
|
else:
|
37
38
|
return cv2.imdecode(file_bytes, flags)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: ultralytics
|
3
|
-
Version: 8.3.
|
3
|
+
Version: 8.3.115
|
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>
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/coco8-multispectral.yaml
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/11/yolo11-cls-resnet18.yaml
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml
RENAMED
File without changes
|
{ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml
RENAMED
File without changes
|
{ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|