ultralytics 8.3.121__tar.gz → 8.3.123__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.121/ultralytics.egg-info → ultralytics-8.3.123}/PKG-INFO +3 -3
- {ultralytics-8.3.121 → ultralytics-8.3.123}/pyproject.toml +2 -2
- {ultralytics-8.3.121 → ultralytics-8.3.123}/tests/test_cuda.py +1 -1
- {ultralytics-8.3.121 → ultralytics-8.3.123}/tests/test_python.py +3 -3
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/__init__.py +1 -1
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/__init__.py +1 -1
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/trackers/botsort.yaml +1 -1
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/data/split_dota.py +1 -1
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/engine/exporter.py +9 -5
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/engine/results.py +4 -7
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/yolo/detect/predict.py +1 -1
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/nn/autobackend.py +1 -1
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/solutions/solutions.py +1 -1
- ultralytics-8.3.123/ultralytics/solutions/speed_estimation.py +110 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/trackers/bot_sort.py +2 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/trackers/track.py +3 -3
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/utils/autobatch.py +2 -2
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/utils/benchmarks.py +5 -5
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/utils/torch_utils.py +4 -4
- {ultralytics-8.3.121 → ultralytics-8.3.123/ultralytics.egg-info}/PKG-INFO +3 -3
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics.egg-info/requires.txt +2 -2
- ultralytics-8.3.121/ultralytics/solutions/speed_estimation.py +0 -114
- {ultralytics-8.3.121 → ultralytics-8.3.123}/LICENSE +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/README.md +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/setup.cfg +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/tests/__init__.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/tests/conftest.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/tests/test_cli.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/tests/test_engine.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/tests/test_exports.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/tests/test_integrations.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/tests/test_solutions.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/assets/bus.jpg +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/assets/zidane.jpg +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/datasets/VOC.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/datasets/coco.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/datasets/coco128.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/datasets/coco8-multispectral.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/datasets/coco8.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/datasets/dog-pose.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/datasets/dota8-multispectral.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/datasets/dota8.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/datasets/hand-keypoints.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/datasets/lvis.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/datasets/medical-pills.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/datasets/signature.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/datasets/xView.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/default.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/11/yolo11-cls-resnet18.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/11/yolo11-cls.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/11/yolo11-obb.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/11/yolo11-pose.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/11/yolo11-seg.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/11/yolo11.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/11/yoloe-11-seg.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/11/yoloe-11.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/12/yolo12-cls.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/12/yolo12-obb.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/12/yolo12-pose.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/12/yolo12-seg.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/12/yolo12.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/v10/yolov10b.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/v10/yolov10l.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/v10/yolov10m.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/v10/yolov10n.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/v10/yolov10s.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/v10/yolov10x.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/v8/yoloe-v8-seg.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/v8/yoloe-v8.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/v9/yolov9m.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/v9/yolov9s.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/models/v9/yolov9t.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/solutions/default.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/data/__init__.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/data/annotator.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/data/augment.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/data/base.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/data/build.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/data/converter.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/data/dataset.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/data/loaders.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/data/scripts/download_weights.sh +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/data/scripts/get_coco.sh +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/data/scripts/get_coco128.sh +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/data/scripts/get_imagenet.sh +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/data/split.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/data/utils.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/engine/__init__.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/engine/model.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/engine/predictor.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/engine/trainer.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/engine/tuner.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/engine/validator.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/hub/__init__.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/hub/auth.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/hub/google/__init__.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/hub/session.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/hub/utils.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/__init__.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/fastsam/__init__.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/fastsam/model.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/fastsam/predict.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/fastsam/utils.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/fastsam/val.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/nas/__init__.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/nas/model.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/nas/predict.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/nas/val.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/rtdetr/__init__.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/rtdetr/model.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/rtdetr/predict.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/rtdetr/train.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/rtdetr/val.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/sam/__init__.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/sam/amg.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/sam/build.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/sam/model.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/sam/modules/__init__.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/sam/modules/blocks.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/sam/modules/decoders.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/sam/modules/encoders.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/sam/modules/memory_attention.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/sam/modules/sam.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/sam/modules/transformer.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/sam/modules/utils.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/sam/predict.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/utils/__init__.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/utils/loss.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/utils/ops.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/yolo/__init__.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/yolo/classify/__init__.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/yolo/classify/predict.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/yolo/classify/train.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/yolo/classify/val.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/yolo/detect/__init__.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/yolo/detect/train.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/yolo/detect/val.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/yolo/model.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/yolo/obb/__init__.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/yolo/obb/predict.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/yolo/obb/train.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/yolo/obb/val.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/yolo/pose/__init__.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/yolo/pose/predict.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/yolo/pose/train.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/yolo/pose/val.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/yolo/segment/__init__.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/yolo/segment/predict.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/yolo/segment/train.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/yolo/segment/val.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/yolo/world/__init__.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/yolo/world/train.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/yolo/world/train_world.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/yolo/yoloe/__init__.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/yolo/yoloe/predict.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/yolo/yoloe/train.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/yolo/yoloe/train_seg.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/models/yolo/yoloe/val.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/nn/__init__.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/nn/modules/__init__.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/nn/modules/activation.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/nn/modules/block.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/nn/modules/conv.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/nn/modules/head.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/nn/modules/transformer.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/nn/modules/utils.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/nn/tasks.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/nn/text_model.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/solutions/__init__.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/solutions/ai_gym.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/solutions/analytics.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/solutions/distance_calculation.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/solutions/heatmap.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/solutions/instance_segmentation.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/solutions/object_blurrer.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/solutions/object_counter.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/solutions/object_cropper.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/solutions/parking_management.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/solutions/queue_management.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/solutions/region_counter.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/solutions/security_alarm.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/solutions/streamlit_inference.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/solutions/trackzone.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/solutions/vision_eye.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/trackers/__init__.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/trackers/basetrack.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/trackers/byte_tracker.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/trackers/utils/__init__.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/trackers/utils/gmc.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/trackers/utils/kalman_filter.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/trackers/utils/matching.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/utils/__init__.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/utils/callbacks/__init__.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/utils/callbacks/base.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/utils/callbacks/clearml.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/utils/callbacks/comet.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/utils/callbacks/dvc.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/utils/callbacks/hub.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/utils/callbacks/mlflow.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/utils/callbacks/neptune.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/utils/callbacks/raytune.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/utils/callbacks/tensorboard.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/utils/callbacks/wb.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/utils/checks.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/utils/dist.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/utils/downloads.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/utils/errors.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/utils/export.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/utils/files.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/utils/instance.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/utils/loss.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/utils/metrics.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/utils/ops.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/utils/patches.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/utils/plotting.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/utils/tal.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/utils/triton.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics/utils/tuner.py +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics.egg-info/SOURCES.txt +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics.egg-info/dependency_links.txt +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/ultralytics.egg-info/entry_points.txt +0 -0
- {ultralytics-8.3.121 → ultralytics-8.3.123}/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.123
|
4
4
|
Summary: Ultralytics YOLO 🚀 for SOTA object detection, multi-object tracking, instance segmentation, pose estimation and image classification.
|
5
5
|
Author-email: Glenn Jocher <glenn.jocher@ultralytics.com>, Jing Qiu <jing.qiu@ultralytics.com>
|
6
6
|
Maintainer-email: Ultralytics <hello@ultralytics.com>
|
@@ -68,8 +68,8 @@ Requires-Dist: tensorflowjs>=2.0.0; extra == "export"
|
|
68
68
|
Requires-Dist: tensorstore>=0.1.63; (platform_machine == "aarch64" and python_version >= "3.9") and extra == "export"
|
69
69
|
Requires-Dist: h5py!=3.11.0; platform_machine == "aarch64" and extra == "export"
|
70
70
|
Provides-Extra: solutions
|
71
|
-
Requires-Dist: shapely
|
72
|
-
Requires-Dist: streamlit
|
71
|
+
Requires-Dist: shapely>=2.0.0; extra == "solutions"
|
72
|
+
Requires-Dist: streamlit>=1.29.0; extra == "solutions"
|
73
73
|
Provides-Extra: logging
|
74
74
|
Requires-Dist: wandb; extra == "logging"
|
75
75
|
Requires-Dist: tensorboard; extra == "logging"
|
@@ -103,8 +103,8 @@ export = [
|
|
103
103
|
"h5py!=3.11.0; platform_machine == 'aarch64'", # fix h5py build issues due to missing aarch64 wheels in 3.11 release
|
104
104
|
]
|
105
105
|
solutions = [
|
106
|
-
"shapely>=2.0.0
|
107
|
-
"streamlit>=1.29.0
|
106
|
+
"shapely>=2.0.0", # shapely for point and polygon data matching
|
107
|
+
"streamlit>=1.29.0", # for live inference on web browser, i.e `yolo streamlit-predict`
|
108
108
|
]
|
109
109
|
logging = [
|
110
110
|
"wandb", # https://docs.ultralytics.com/integrations/weights-biases/
|
@@ -115,7 +115,7 @@ def test_utils_benchmarks():
|
|
115
115
|
|
116
116
|
# Pre-export a dynamic engine model to use dynamic inference
|
117
117
|
YOLO(MODEL).export(format="engine", imgsz=32, dynamic=True, batch=1)
|
118
|
-
ProfileModels([MODEL], imgsz=32, half=False, min_time=1, num_timed_runs=3, num_warmup_runs=1).
|
118
|
+
ProfileModels([MODEL], imgsz=32, half=False, min_time=1, num_timed_runs=3, num_warmup_runs=1).run()
|
119
119
|
|
120
120
|
|
121
121
|
@pytest.mark.skipif(not CUDA_IS_AVAILABLE, reason="CUDA is not available")
|
@@ -399,18 +399,18 @@ def test_utils_benchmarks():
|
|
399
399
|
"""Benchmark model performance using 'ProfileModels' from 'ultralytics.utils.benchmarks'."""
|
400
400
|
from ultralytics.utils.benchmarks import ProfileModels
|
401
401
|
|
402
|
-
ProfileModels(["yolo11n.yaml"], imgsz=32, min_time=1, num_timed_runs=3, num_warmup_runs=1).
|
402
|
+
ProfileModels(["yolo11n.yaml"], imgsz=32, min_time=1, num_timed_runs=3, num_warmup_runs=1).run()
|
403
403
|
|
404
404
|
|
405
405
|
def test_utils_torchutils():
|
406
406
|
"""Test Torch utility functions including profiling and FLOP calculations."""
|
407
407
|
from ultralytics.nn.modules.conv import Conv
|
408
|
-
from ultralytics.utils.torch_utils import get_flops_with_torch_profiler,
|
408
|
+
from ultralytics.utils.torch_utils import get_flops_with_torch_profiler, profile_ops, time_sync
|
409
409
|
|
410
410
|
x = torch.randn(1, 64, 20, 20)
|
411
411
|
m = Conv(64, 64, k=1, s=2)
|
412
412
|
|
413
|
-
|
413
|
+
profile_ops(x, [m], n=3)
|
414
414
|
get_flops_with_torch_profiler(m)
|
415
415
|
time_sync()
|
416
416
|
|
@@ -701,7 +701,7 @@ def handle_yolo_solutions(args: List[str]) -> None:
|
|
701
701
|
solution_name = "count" # Default for invalid solution
|
702
702
|
|
703
703
|
if solution_name == "inference":
|
704
|
-
checks.check_requirements("streamlit>=1.29.0
|
704
|
+
checks.check_requirements("streamlit>=1.29.0")
|
705
705
|
LOGGER.info("💡 Loading Ultralytics live inference app...")
|
706
706
|
subprocess.run(
|
707
707
|
[ # Run subprocess with Streamlit custom argument
|
@@ -17,6 +17,6 @@ fuse_score: True # Whether to fuse confidence scores with the iou distances befo
|
|
17
17
|
gmc_method: sparseOptFlow # method of global motion compensation
|
18
18
|
# ReID model related thresh
|
19
19
|
proximity_thresh: 0.5 # minimum IoU for valid match with ReID
|
20
|
-
appearance_thresh: 0.
|
20
|
+
appearance_thresh: 0.8 # minimum appearance similarity for ReID
|
21
21
|
with_reid: False
|
22
22
|
model: auto # uses native features if detector is YOLO else yolo11n-cls.pt
|
@@ -30,7 +30,7 @@ def bbox_iof(polygon1, bbox2, eps=1e-6):
|
|
30
30
|
Polygon format: [x1, y1, x2, y2, x3, y3, x4, y4].
|
31
31
|
Bounding box format: [x_min, y_min, x_max, y_max].
|
32
32
|
"""
|
33
|
-
check_requirements("shapely")
|
33
|
+
check_requirements("shapely>=2.0.0")
|
34
34
|
from shapely.geometry import Polygon
|
35
35
|
|
36
36
|
polygon1 = polygon1.reshape(-1, 4, 2)
|
@@ -140,7 +140,7 @@ def export_formats():
|
|
140
140
|
["MNN", "mnn", ".mnn", True, True, ["batch", "half", "int8"]],
|
141
141
|
["NCNN", "ncnn", "_ncnn_model", True, True, ["batch", "half"]],
|
142
142
|
["IMX", "imx", "_imx_model", True, True, ["int8", "fraction"]],
|
143
|
-
["RKNN", "rknn", "_rknn_model", False, False, ["batch", "name"]],
|
143
|
+
["RKNN", "rknn", "_rknn_model", False, False, ["batch", "name", "int8"]],
|
144
144
|
]
|
145
145
|
return dict(zip(["Format", "Argument", "Suffix", "CPU", "GPU", "Arguments"], zip(*x)))
|
146
146
|
|
@@ -851,6 +851,9 @@ class Exporter:
|
|
851
851
|
ct_model.license = m.pop("license")
|
852
852
|
ct_model.version = m.pop("version")
|
853
853
|
ct_model.user_defined_metadata.update({k: str(v) for k, v in m.items()})
|
854
|
+
if self.model.task == "classify":
|
855
|
+
ct_model.user_defined_metadata.update({"com.apple.coreml.model.preview.type": "imageClassifier"})
|
856
|
+
|
854
857
|
try:
|
855
858
|
ct_model.save(str(f)) # save *.mlpackage
|
856
859
|
except Exception as e:
|
@@ -967,8 +970,9 @@ class Exporter:
|
|
967
970
|
output_integer_quantized_tflite=self.args.int8,
|
968
971
|
quant_type="per-tensor", # "per-tensor" (faster) or "per-channel" (slower but more accurate)
|
969
972
|
custom_input_op_name_np_data_path=np_data,
|
970
|
-
|
971
|
-
|
973
|
+
enable_batchmatmul_unfold=True, # fix lower no. of detected objects on GPU delegate
|
974
|
+
output_signaturedefs=True, # fix error with Attention block group convolution
|
975
|
+
optimization_for_gpu_delegate=True,
|
972
976
|
)
|
973
977
|
yaml_save(f / "metadata.yaml", self.metadata) # add metadata.yaml
|
974
978
|
|
@@ -1107,8 +1111,8 @@ class Exporter:
|
|
1107
1111
|
rknn = RKNN(verbose=False)
|
1108
1112
|
rknn.config(mean_values=[[0, 0, 0]], std_values=[[255, 255, 255]], target_platform=self.args.name)
|
1109
1113
|
rknn.load_onnx(model=f)
|
1110
|
-
rknn.build(do_quantization=
|
1111
|
-
f = f.replace(".onnx", f"-{self.args.name}.rknn")
|
1114
|
+
rknn.build(do_quantization=self.args.int8)
|
1115
|
+
f = f.replace(".onnx", f"-{self.args.name}-int8.rknn" if self.args.int8 else f"-{self.args.name}-fp16.rknn")
|
1112
1116
|
rknn.export_rknn(f"{export_path / f}")
|
1113
1117
|
yaml_save(export_path / "metadata.yaml", self.metadata)
|
1114
1118
|
return export_path, None
|
@@ -662,17 +662,14 @@ class Results(SimpleClass):
|
|
662
662
|
- For classification tasks, it returns the top 5 class probabilities and their corresponding class names.
|
663
663
|
- The returned string is comma-separated and ends with a comma and a space.
|
664
664
|
"""
|
665
|
-
log_string = ""
|
666
665
|
probs = self.probs
|
667
666
|
if len(self) == 0:
|
668
|
-
return
|
667
|
+
return "" if probs is not None else "(no detections), "
|
669
668
|
if probs is not None:
|
670
|
-
|
669
|
+
return f"{', '.join(f'{self.names[j]} {probs.data[j]:.2f}' for j in probs.top5)}, "
|
671
670
|
if boxes := self.boxes:
|
672
|
-
|
673
|
-
|
674
|
-
log_string += f"{n} {self.names[int(c)]}{'s' * (n > 1)}, "
|
675
|
-
return log_string
|
671
|
+
counts = boxes.cls.int().bincount()
|
672
|
+
return "".join(f"{n} {self.names[i]}{'s' * (n > 1)}, " for i, n in enumerate(counts) if n > 0)
|
676
673
|
|
677
674
|
def save_txt(self, txt_file, save_conf=False):
|
678
675
|
"""
|
@@ -90,7 +90,7 @@ class DetectionPredictor(BasePredictor):
|
|
90
90
|
obj_feats = torch.cat(
|
91
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
92
|
) # mean reduce all vectors to same length
|
93
|
-
return [feats[idx] for feats, idx in zip(obj_feats, idxs)] # for each
|
93
|
+
return [feats[idx] if len(idx) else [] for feats, idx in zip(obj_feats, idxs)] # for each img in batch
|
94
94
|
|
95
95
|
def construct_results(self, preds, img, orig_imgs):
|
96
96
|
"""
|
@@ -725,7 +725,7 @@ class AutoBackend(nn.Module):
|
|
725
725
|
else:
|
726
726
|
im = im.cpu().numpy()
|
727
727
|
if self.saved_model: # SavedModel
|
728
|
-
y = self.model(im, training=False) if self.keras else self.model(im)
|
728
|
+
y = self.model(im, training=False) if self.keras else self.model.serving_default(im)
|
729
729
|
if not isinstance(y, list):
|
730
730
|
y = [y]
|
731
731
|
elif self.pb: # GraphDef
|
@@ -53,7 +53,7 @@ class BaseSolution:
|
|
53
53
|
is_cli (bool): Enables CLI mode if set to True.
|
54
54
|
**kwargs (Any): Additional configuration parameters that override defaults.
|
55
55
|
"""
|
56
|
-
check_requirements("shapely>=2.0.0
|
56
|
+
check_requirements("shapely>=2.0.0")
|
57
57
|
from shapely.geometry import LineString, Point, Polygon
|
58
58
|
from shapely.prepared import prep
|
59
59
|
|
@@ -0,0 +1,110 @@
|
|
1
|
+
# Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
|
2
|
+
|
3
|
+
from collections import deque
|
4
|
+
from math import sqrt
|
5
|
+
|
6
|
+
from ultralytics.solutions.solutions import BaseSolution, SolutionAnnotator, SolutionResults
|
7
|
+
from ultralytics.utils.plotting import colors
|
8
|
+
|
9
|
+
|
10
|
+
class SpeedEstimator(BaseSolution):
|
11
|
+
"""
|
12
|
+
A class to estimate the speed of objects in a real-time video stream based on their tracks.
|
13
|
+
|
14
|
+
This class extends the BaseSolution class and provides functionality for estimating object speeds using
|
15
|
+
tracking data in video streams.
|
16
|
+
|
17
|
+
Attributes:
|
18
|
+
spd (Dict[int, float]): Dictionary storing speed data for tracked objects.
|
19
|
+
trk_hist (Dict[int, float]): Dictionary storing the object tracking data.
|
20
|
+
max_hist (int): maximum track history before computing speed
|
21
|
+
meters_per_pixel (float): Real-world meters represented by one pixel (e.g., 0.04 for 4m over 100px).
|
22
|
+
max_speed (int): Maximum allowed object speed; values above this will be capped at 120 km/h.
|
23
|
+
|
24
|
+
Methods:
|
25
|
+
initialize_region: Initializes the speed estimation region.
|
26
|
+
process: Processes input frames to estimate object speeds.
|
27
|
+
store_tracking_history: Stores the tracking history for an object.
|
28
|
+
extract_tracks: Extracts tracks from the current frame.
|
29
|
+
display_output: Displays the output with annotations.
|
30
|
+
|
31
|
+
Examples:
|
32
|
+
>>> estimator = SpeedEstimator()
|
33
|
+
>>> frame = cv2.imread("frame.jpg")
|
34
|
+
>>> results = estimator.process(frame)
|
35
|
+
>>> cv2.imshow("Speed Estimation", results.plot_im)
|
36
|
+
"""
|
37
|
+
|
38
|
+
def __init__(self, **kwargs):
|
39
|
+
"""
|
40
|
+
Initialize the SpeedEstimator object with speed estimation parameters and data structures.
|
41
|
+
|
42
|
+
Args:
|
43
|
+
**kwargs (Any): Additional keyword arguments passed to the parent class.
|
44
|
+
"""
|
45
|
+
super().__init__(**kwargs)
|
46
|
+
|
47
|
+
self.fps = kwargs.get("fps", 30) # assumed video FPS
|
48
|
+
self.frame_count = 0 # global frame count
|
49
|
+
self.trk_frame_ids = {} # Track ID → first frame index
|
50
|
+
self.spd = {} # Final speed per object (km/h), once locked
|
51
|
+
self.trk_hist = {} # Track ID → deque of (time, position)
|
52
|
+
self.locked_ids = set() # Track IDs whose speed has been finalized
|
53
|
+
self.max_hist = kwargs.get("max_hist", 5) # Required frame history before computing speed
|
54
|
+
self.meter_per_pixel = kwargs.get("meter_per_pixel", 0.05) # Scene scale, depends on camera details
|
55
|
+
self.max_speed = kwargs.get("max_speed", 120) # max_speed adjustment
|
56
|
+
|
57
|
+
def process(self, im0):
|
58
|
+
"""
|
59
|
+
Process an input frame to estimate object speeds based on tracking data.
|
60
|
+
|
61
|
+
Args:
|
62
|
+
im0 (np.ndarray): Input image for processing with shape (H, W, C) for RGB images.
|
63
|
+
|
64
|
+
Returns:
|
65
|
+
(SolutionResults): Contains processed image `plot_im` and `total_tracks` (number of tracked objects).
|
66
|
+
|
67
|
+
Examples:
|
68
|
+
>>> estimator = SpeedEstimator()
|
69
|
+
>>> image = np.random.randint(0, 255, (480, 640, 3), dtype=np.uint8)
|
70
|
+
>>> results = estimator.process(image)
|
71
|
+
"""
|
72
|
+
self.frame_count += 1
|
73
|
+
self.extract_tracks(im0)
|
74
|
+
annotator = SolutionAnnotator(im0, line_width=self.line_width)
|
75
|
+
|
76
|
+
for box, track_id, _, _ in zip(self.boxes, self.track_ids, self.clss, self.confs):
|
77
|
+
self.store_tracking_history(track_id, box)
|
78
|
+
|
79
|
+
if track_id not in self.trk_hist: # Initialize history if new track found
|
80
|
+
self.trk_hist[track_id] = deque(maxlen=self.max_hist)
|
81
|
+
self.trk_frame_ids[track_id] = self.frame_count
|
82
|
+
|
83
|
+
if track_id not in self.locked_ids: # Update history until speed is locked
|
84
|
+
trk_hist = self.trk_hist[track_id]
|
85
|
+
trk_hist.append(self.track_line[-1])
|
86
|
+
|
87
|
+
# Compute and lock speed once enough history is collected
|
88
|
+
if len(trk_hist) == self.max_hist:
|
89
|
+
p0, p1 = trk_hist[0], trk_hist[-1] # First and last points of track
|
90
|
+
dt = (self.frame_count - self.trk_frame_ids[track_id]) / self.fps # Time in seconds
|
91
|
+
if dt > 0:
|
92
|
+
dx, dy = p1[0] - p0[0], p1[1] - p0[1] # pixel displacement
|
93
|
+
pixel_distance = sqrt(dx * dx + dy * dy) # get pixel distance
|
94
|
+
meters = pixel_distance * self.meter_per_pixel # convert to meters
|
95
|
+
self.spd[track_id] = int(
|
96
|
+
min((meters / dt) * 3.6, self.max_speed)
|
97
|
+
) # convert to km/h and store final speed
|
98
|
+
self.locked_ids.add(track_id) # prevent further updates
|
99
|
+
self.trk_hist.pop(track_id, None) # free memory
|
100
|
+
self.trk_frame_ids.pop(track_id, None) # optional: remove frame start too
|
101
|
+
|
102
|
+
if track_id in self.spd:
|
103
|
+
speed_label = f"{self.spd[track_id]} km/h"
|
104
|
+
annotator.box_label(box, label=speed_label, color=colors(track_id, True)) # Draw bounding box
|
105
|
+
|
106
|
+
plot_im = annotator.result()
|
107
|
+
self.display_output(plot_im) # Display output with base class function
|
108
|
+
|
109
|
+
# Return results with processed image and tracking summary
|
110
|
+
return SolutionResults(plot_im=plot_im, total_tracks=len(self.track_ids))
|
@@ -255,4 +255,6 @@ class ReID:
|
|
255
255
|
def __call__(self, img, dets):
|
256
256
|
"""Extract embeddings for detected objects."""
|
257
257
|
feats = self.model([save_one_box(det, img, save=False) for det in xywh2xyxy(torch.from_numpy(dets[:, :4]))])
|
258
|
+
if feats.shape[0] != dets.shape[0] and feats[0].shape[0] == dets.shape[0]:
|
259
|
+
feats = feats[0] # batched prediction with non-PyTorch backend
|
258
260
|
return [f.cpu().numpy() for f in feats]
|
@@ -58,10 +58,10 @@ def on_predict_start(predictor: object, persist: bool = False) -> None:
|
|
58
58
|
predictor._feats = None
|
59
59
|
|
60
60
|
# Register hook to extract input of Detect layer
|
61
|
-
def
|
62
|
-
predictor._feats = input[0]
|
61
|
+
def pre_hook(module, input):
|
62
|
+
predictor._feats = [t.clone() for t in input[0]]
|
63
63
|
|
64
|
-
predictor.model.model.model[-1].
|
64
|
+
predictor.model.model.model[-1].register_forward_pre_hook(pre_hook)
|
65
65
|
|
66
66
|
trackers = []
|
67
67
|
for _ in range(predictor.dataset.bs):
|
@@ -8,7 +8,7 @@ import numpy as np
|
|
8
8
|
import torch
|
9
9
|
|
10
10
|
from ultralytics.utils import DEFAULT_CFG, LOGGER, colorstr
|
11
|
-
from ultralytics.utils.torch_utils import autocast,
|
11
|
+
from ultralytics.utils.torch_utils import autocast, profile_ops
|
12
12
|
|
13
13
|
|
14
14
|
def check_train_batch_size(model, imgsz=640, amp=True, batch=-1, max_num_obj=1):
|
@@ -74,7 +74,7 @@ def autobatch(model, imgsz=640, fraction=0.60, batch_size=DEFAULT_CFG.batch, max
|
|
74
74
|
batch_sizes = [1, 2, 4, 8, 16] if t < 16 else [1, 2, 4, 8, 16, 32, 64]
|
75
75
|
try:
|
76
76
|
img = [torch.empty(b, 3, imgsz, imgsz) for b in batch_sizes]
|
77
|
-
results =
|
77
|
+
results = profile_ops(img, model, n=1, device=device, max_num_obj=max_num_obj)
|
78
78
|
|
79
79
|
# Fit a solution
|
80
80
|
xy = [
|
@@ -4,7 +4,7 @@ Benchmark a YOLO model formats for speed and accuracy.
|
|
4
4
|
|
5
5
|
Usage:
|
6
6
|
from ultralytics.utils.benchmarks import ProfileModels, benchmark
|
7
|
-
ProfileModels(['yolo11n.yaml', 'yolov8s.yaml']).
|
7
|
+
ProfileModels(['yolo11n.yaml', 'yolov8s.yaml']).run()
|
8
8
|
benchmark(model='yolo11n.pt', imgsz=160)
|
9
9
|
|
10
10
|
Format | `format=argument` | Model
|
@@ -378,7 +378,7 @@ class ProfileModels:
|
|
378
378
|
Profile models and print results
|
379
379
|
>>> from ultralytics.utils.benchmarks import ProfileModels
|
380
380
|
>>> profiler = ProfileModels(["yolo11n.yaml", "yolov8s.yaml"], imgsz=640)
|
381
|
-
>>> profiler.
|
381
|
+
>>> profiler.run()
|
382
382
|
"""
|
383
383
|
|
384
384
|
def __init__(
|
@@ -412,7 +412,7 @@ class ProfileModels:
|
|
412
412
|
Initialize and profile models
|
413
413
|
>>> from ultralytics.utils.benchmarks import ProfileModels
|
414
414
|
>>> profiler = ProfileModels(["yolo11n.yaml", "yolov8s.yaml"], imgsz=640)
|
415
|
-
>>> profiler.
|
415
|
+
>>> profiler.run()
|
416
416
|
"""
|
417
417
|
self.paths = paths
|
418
418
|
self.num_timed_runs = num_timed_runs
|
@@ -423,7 +423,7 @@ class ProfileModels:
|
|
423
423
|
self.trt = trt # run TensorRT profiling
|
424
424
|
self.device = device or torch.device(0 if torch.cuda.is_available() else "cpu")
|
425
425
|
|
426
|
-
def
|
426
|
+
def run(self):
|
427
427
|
"""
|
428
428
|
Profile YOLO models for speed and accuracy across various formats including ONNX and TensorRT.
|
429
429
|
|
@@ -434,7 +434,7 @@ class ProfileModels:
|
|
434
434
|
Profile models and print results
|
435
435
|
>>> from ultralytics.utils.benchmarks import ProfileModels
|
436
436
|
>>> profiler = ProfileModels(["yolo11n.yaml", "yolov8s.yaml"])
|
437
|
-
>>> results = profiler.
|
437
|
+
>>> results = profiler.run()
|
438
438
|
"""
|
439
439
|
files = self.get_files()
|
440
440
|
|
@@ -378,7 +378,7 @@ def model_info_for_loggers(trainer):
|
|
378
378
|
if trainer.args.profile: # profile ONNX and TensorRT times
|
379
379
|
from ultralytics.utils.benchmarks import ProfileModels
|
380
380
|
|
381
|
-
results = ProfileModels([trainer.last], device=trainer.device).
|
381
|
+
results = ProfileModels([trainer.last], device=trainer.device).run()[0]
|
382
382
|
results.pop("model/name")
|
383
383
|
else: # only return PyTorch times from most recent validation
|
384
384
|
results = {
|
@@ -790,7 +790,7 @@ def cuda_memory_usage(device=None):
|
|
790
790
|
yield cuda_info
|
791
791
|
|
792
792
|
|
793
|
-
def
|
793
|
+
def profile_ops(input, ops, n=10, device=None, max_num_obj=0):
|
794
794
|
"""
|
795
795
|
Ultralytics speed, memory and FLOPs profiler.
|
796
796
|
|
@@ -805,11 +805,11 @@ def profile(input, ops, n=10, device=None, max_num_obj=0):
|
|
805
805
|
(list): Profile results for each operation.
|
806
806
|
|
807
807
|
Examples:
|
808
|
-
>>> from ultralytics.utils.torch_utils import
|
808
|
+
>>> from ultralytics.utils.torch_utils import profile_ops
|
809
809
|
>>> input = torch.randn(16, 3, 640, 640)
|
810
810
|
>>> m1 = lambda x: x * torch.sigmoid(x)
|
811
811
|
>>> m2 = nn.SiLU()
|
812
|
-
>>>
|
812
|
+
>>> profile_ops(input, [m1, m2], n=100) # profile over 100 iterations
|
813
813
|
"""
|
814
814
|
results = []
|
815
815
|
if not isinstance(device, torch.device):
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: ultralytics
|
3
|
-
Version: 8.3.
|
3
|
+
Version: 8.3.123
|
4
4
|
Summary: Ultralytics YOLO 🚀 for SOTA object detection, multi-object tracking, instance segmentation, pose estimation and image classification.
|
5
5
|
Author-email: Glenn Jocher <glenn.jocher@ultralytics.com>, Jing Qiu <jing.qiu@ultralytics.com>
|
6
6
|
Maintainer-email: Ultralytics <hello@ultralytics.com>
|
@@ -68,8 +68,8 @@ Requires-Dist: tensorflowjs>=2.0.0; extra == "export"
|
|
68
68
|
Requires-Dist: tensorstore>=0.1.63; (platform_machine == "aarch64" and python_version >= "3.9") and extra == "export"
|
69
69
|
Requires-Dist: h5py!=3.11.0; platform_machine == "aarch64" and extra == "export"
|
70
70
|
Provides-Extra: solutions
|
71
|
-
Requires-Dist: shapely
|
72
|
-
Requires-Dist: streamlit
|
71
|
+
Requires-Dist: shapely>=2.0.0; extra == "solutions"
|
72
|
+
Requires-Dist: streamlit>=1.29.0; extra == "solutions"
|
73
73
|
Provides-Extra: logging
|
74
74
|
Requires-Dist: wandb; extra == "logging"
|
75
75
|
Requires-Dist: tensorboard; extra == "logging"
|
@@ -1,114 +0,0 @@
|
|
1
|
-
# Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
|
2
|
-
|
3
|
-
from time import time
|
4
|
-
|
5
|
-
from ultralytics.solutions.solutions import BaseSolution, SolutionAnnotator, SolutionResults
|
6
|
-
from ultralytics.utils.plotting import colors
|
7
|
-
|
8
|
-
|
9
|
-
class SpeedEstimator(BaseSolution):
|
10
|
-
"""
|
11
|
-
A class to estimate the speed of objects in a real-time video stream based on their tracks.
|
12
|
-
|
13
|
-
This class extends the BaseSolution class and provides functionality for estimating object speeds using
|
14
|
-
tracking data in video streams.
|
15
|
-
|
16
|
-
Attributes:
|
17
|
-
spd (Dict[int, float]): Dictionary storing speed data for tracked objects.
|
18
|
-
trkd_ids (List[int]): List of tracked object IDs that have already been speed-estimated.
|
19
|
-
trk_pt (Dict[int, float]): Dictionary storing previous timestamps for tracked objects.
|
20
|
-
trk_pp (Dict[int, Tuple[float, float]]): Dictionary storing previous positions for tracked objects.
|
21
|
-
region (List[Tuple[int, int]]): List of points defining the speed estimation region.
|
22
|
-
track_line (List[Tuple[float, float]]): List of points representing the object's track.
|
23
|
-
r_s (LineString): LineString object representing the speed estimation region.
|
24
|
-
|
25
|
-
Methods:
|
26
|
-
initialize_region: Initializes the speed estimation region.
|
27
|
-
process: Processes input frames to estimate object speeds.
|
28
|
-
store_tracking_history: Stores the tracking history for an object.
|
29
|
-
extract_tracks: Extracts tracks from the current frame.
|
30
|
-
display_output: Displays the output with annotations.
|
31
|
-
|
32
|
-
Examples:
|
33
|
-
>>> estimator = SpeedEstimator()
|
34
|
-
>>> frame = cv2.imread("frame.jpg")
|
35
|
-
>>> results = estimator.process(frame)
|
36
|
-
>>> cv2.imshow("Speed Estimation", results.plot_im)
|
37
|
-
"""
|
38
|
-
|
39
|
-
def __init__(self, **kwargs):
|
40
|
-
"""
|
41
|
-
Initialize the SpeedEstimator object with speed estimation parameters and data structures.
|
42
|
-
|
43
|
-
Args:
|
44
|
-
**kwargs (Any): Additional keyword arguments passed to the parent class.
|
45
|
-
"""
|
46
|
-
super().__init__(**kwargs)
|
47
|
-
|
48
|
-
self.initialize_region() # Initialize speed region
|
49
|
-
|
50
|
-
self.spd = {} # Dictionary for speed data
|
51
|
-
self.trkd_ids = [] # List for already speed-estimated and tracked IDs
|
52
|
-
self.trk_pt = {} # Dictionary for tracks' previous timestamps
|
53
|
-
self.trk_pp = {} # Dictionary for tracks' previous positions
|
54
|
-
|
55
|
-
def process(self, im0):
|
56
|
-
"""
|
57
|
-
Process an input frame to estimate object speeds based on tracking data.
|
58
|
-
|
59
|
-
Args:
|
60
|
-
im0 (np.ndarray): Input image for processing with shape (H, W, C) for RGB images.
|
61
|
-
|
62
|
-
Returns:
|
63
|
-
(SolutionResults): Contains processed image `plot_im` and `total_tracks` (number of tracked objects).
|
64
|
-
|
65
|
-
Examples:
|
66
|
-
>>> estimator = SpeedEstimator()
|
67
|
-
>>> image = np.random.randint(0, 255, (480, 640, 3), dtype=np.uint8)
|
68
|
-
>>> results = estimator.process(image)
|
69
|
-
"""
|
70
|
-
self.extract_tracks(im0) # Extract tracks
|
71
|
-
annotator = SolutionAnnotator(im0, line_width=self.line_width) # Initialize annotator
|
72
|
-
|
73
|
-
# Draw speed estimation region
|
74
|
-
annotator.draw_region(reg_pts=self.region, color=(104, 0, 123), thickness=self.line_width * 2)
|
75
|
-
|
76
|
-
for box, track_id, cls, conf in zip(self.boxes, self.track_ids, self.clss, self.confs):
|
77
|
-
self.store_tracking_history(track_id, box) # Store track history
|
78
|
-
|
79
|
-
# Initialize tracking data for new objects
|
80
|
-
if track_id not in self.trk_pt:
|
81
|
-
self.trk_pt[track_id] = 0
|
82
|
-
if track_id not in self.trk_pp:
|
83
|
-
self.trk_pp[track_id] = self.track_line[-1]
|
84
|
-
|
85
|
-
speed_label = (
|
86
|
-
f"{int(self.spd[track_id])} km/h"
|
87
|
-
if track_id in self.spd and self.show_labels
|
88
|
-
else self.adjust_box_label(cls, conf, track_id)
|
89
|
-
)
|
90
|
-
annotator.box_label(box, label=speed_label, color=colors(track_id, True)) # Draw bounding box
|
91
|
-
|
92
|
-
# Determine if object is crossing the speed estimation region
|
93
|
-
if self.LineString([self.trk_pp[track_id], self.track_line[-1]]).intersects(self.r_s):
|
94
|
-
direction = "known"
|
95
|
-
else:
|
96
|
-
direction = "unknown"
|
97
|
-
|
98
|
-
# Calculate speed for objects crossing the region for the first time
|
99
|
-
if direction == "known" and track_id not in self.trkd_ids:
|
100
|
-
self.trkd_ids.append(track_id)
|
101
|
-
time_difference = time() - self.trk_pt[track_id]
|
102
|
-
if time_difference > 0:
|
103
|
-
# Calculate speed based on vertical displacement and time
|
104
|
-
self.spd[track_id] = abs(self.track_line[-1][1] - self.trk_pp[track_id][1]) / time_difference
|
105
|
-
|
106
|
-
# Update tracking data for next frame
|
107
|
-
self.trk_pt[track_id] = time()
|
108
|
-
self.trk_pp[track_id] = self.track_line[-1]
|
109
|
-
|
110
|
-
plot_im = annotator.result()
|
111
|
-
self.display_output(plot_im) # Display output with base class function
|
112
|
-
|
113
|
-
# Return results with processed image and tracking summary
|
114
|
-
return SolutionResults(plot_im=plot_im, total_tracks=len(self.track_ids))
|
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
|