ultralytics 8.3.7__tar.gz → 8.3.9__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.
Potentially problematic release.
This version of ultralytics might be problematic. Click here for more details.
- {ultralytics-8.3.7/ultralytics.egg-info → ultralytics-8.3.9}/PKG-INFO +1 -1
- {ultralytics-8.3.7 → ultralytics-8.3.9}/tests/test_solutions.py +4 -7
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/__init__.py +4 -3
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/__init__.py +3 -2
- ultralytics-8.3.9/ultralytics/cfg/solutions/default.yaml +16 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/data/converter.py +11 -8
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/data/dataset.py +23 -23
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/data/utils.py +3 -2
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/engine/model.py +1 -3
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/engine/trainer.py +7 -8
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/detect/val.py +1 -1
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/nn/autobackend.py +11 -6
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/nn/tasks.py +18 -12
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/solutions/object_counter.py +1 -1
- ultralytics-8.3.9/ultralytics/solutions/queue_management.py +64 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/solutions/solutions.py +5 -3
- ultralytics-8.3.9/ultralytics/solutions/speed_estimation.py +76 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/__init__.py +22 -16
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/autobatch.py +3 -2
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/callbacks/clearml.py +2 -2
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/callbacks/comet.py +4 -4
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/callbacks/mlflow.py +1 -1
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/callbacks/neptune.py +5 -1
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/callbacks/tensorboard.py +16 -16
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/callbacks/wb.py +1 -1
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/checks.py +14 -8
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/downloads.py +3 -3
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/plotting.py +7 -10
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/torch_utils.py +3 -2
- {ultralytics-8.3.7 → ultralytics-8.3.9/ultralytics.egg-info}/PKG-INFO +1 -1
- ultralytics-8.3.7/ultralytics/cfg/solutions/default.yaml +0 -16
- ultralytics-8.3.7/ultralytics/solutions/queue_management.py +0 -127
- ultralytics-8.3.7/ultralytics/solutions/speed_estimation.py +0 -116
- {ultralytics-8.3.7 → ultralytics-8.3.9}/LICENSE +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/README.md +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/pyproject.toml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/setup.cfg +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/tests/__init__.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/tests/conftest.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/tests/test_cli.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/tests/test_cuda.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/tests/test_engine.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/tests/test_explorer.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/tests/test_exports.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/tests/test_integrations.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/tests/test_python.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/assets/bus.jpg +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/assets/zidane.jpg +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/VOC.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/coco.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/coco128.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/coco8.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/dota8.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/hand-keypoints.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/lvis.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/signature.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/xView.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/default.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/11/yolo11-cls.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/11/yolo11-obb.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/11/yolo11-pose.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/11/yolo11-seg.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/11/yolo11.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v10/yolov10b.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v10/yolov10l.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v10/yolov10m.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v10/yolov10n.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v10/yolov10s.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v10/yolov10x.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v9/yolov9m.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v9/yolov9s.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v9/yolov9t.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/trackers/botsort.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/data/__init__.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/data/annotator.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/data/augment.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/data/base.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/data/build.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/data/explorer/__init__.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/data/explorer/explorer.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/data/explorer/gui/__init__.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/data/explorer/gui/dash.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/data/explorer/utils.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/data/loaders.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/data/split_dota.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/engine/__init__.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/engine/exporter.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/engine/predictor.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/engine/results.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/engine/tuner.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/engine/validator.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/hub/__init__.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/hub/auth.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/hub/google/__init__.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/hub/session.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/hub/utils.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/__init__.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/fastsam/__init__.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/fastsam/model.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/fastsam/predict.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/fastsam/utils.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/fastsam/val.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/nas/__init__.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/nas/model.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/nas/predict.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/nas/val.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/rtdetr/__init__.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/rtdetr/model.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/rtdetr/predict.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/rtdetr/train.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/rtdetr/val.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/sam/__init__.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/sam/amg.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/sam/build.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/sam/model.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/sam/modules/__init__.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/sam/modules/blocks.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/sam/modules/decoders.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/sam/modules/encoders.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/sam/modules/memory_attention.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/sam/modules/sam.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/sam/modules/transformer.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/sam/modules/utils.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/sam/predict.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/utils/__init__.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/utils/loss.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/utils/ops.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/__init__.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/classify/__init__.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/classify/predict.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/classify/train.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/classify/val.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/detect/__init__.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/detect/predict.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/detect/train.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/model.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/obb/__init__.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/obb/predict.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/obb/train.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/obb/val.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/pose/__init__.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/pose/predict.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/pose/train.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/pose/val.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/segment/__init__.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/segment/predict.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/segment/train.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/segment/val.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/world/__init__.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/world/train.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/world/train_world.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/nn/__init__.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/nn/modules/__init__.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/nn/modules/activation.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/nn/modules/block.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/nn/modules/conv.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/nn/modules/head.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/nn/modules/transformer.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/nn/modules/utils.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/solutions/__init__.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/solutions/ai_gym.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/solutions/analytics.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/solutions/distance_calculation.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/solutions/heatmap.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/solutions/parking_management.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/solutions/streamlit_inference.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/trackers/__init__.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/trackers/basetrack.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/trackers/bot_sort.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/trackers/byte_tracker.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/trackers/track.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/trackers/utils/__init__.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/trackers/utils/gmc.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/trackers/utils/kalman_filter.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/trackers/utils/matching.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/benchmarks.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/callbacks/__init__.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/callbacks/base.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/callbacks/dvc.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/callbacks/hub.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/callbacks/raytune.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/dist.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/errors.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/files.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/instance.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/loss.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/metrics.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/ops.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/patches.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/tal.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/triton.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/tuner.py +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics.egg-info/SOURCES.txt +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics.egg-info/dependency_links.txt +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics.egg-info/entry_points.txt +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics.egg-info/requires.txt +0 -0
- {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: ultralytics
|
|
3
|
-
Version: 8.3.
|
|
3
|
+
Version: 8.3.9
|
|
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>
|
|
@@ -14,25 +14,22 @@ WORKOUTS_SOLUTION_DEMO = "https://github.com/ultralytics/assets/releases/downloa
|
|
|
14
14
|
def test_major_solutions():
|
|
15
15
|
"""Test the object counting, heatmap, speed estimation and queue management solution."""
|
|
16
16
|
safe_download(url=MAJOR_SOLUTIONS_DEMO)
|
|
17
|
-
model = YOLO("yolo11n.pt")
|
|
18
|
-
names = model.names
|
|
19
17
|
cap = cv2.VideoCapture("solutions_ci_demo.mp4")
|
|
20
18
|
assert cap.isOpened(), "Error reading video file"
|
|
21
19
|
region_points = [(20, 400), (1080, 404), (1080, 360), (20, 360)]
|
|
22
20
|
counter = solutions.ObjectCounter(region=region_points, model="yolo11n.pt", show=False)
|
|
23
21
|
heatmap = solutions.Heatmap(colormap=cv2.COLORMAP_PARULA, model="yolo11n.pt", show=False)
|
|
24
|
-
speed = solutions.SpeedEstimator(
|
|
25
|
-
queue = solutions.QueueManager(
|
|
22
|
+
speed = solutions.SpeedEstimator(region=region_points, model="yolo11n.pt", show=False)
|
|
23
|
+
queue = solutions.QueueManager(region=region_points, model="yolo11n.pt", show=False)
|
|
26
24
|
while cap.isOpened():
|
|
27
25
|
success, im0 = cap.read()
|
|
28
26
|
if not success:
|
|
29
27
|
break
|
|
30
28
|
original_im0 = im0.copy()
|
|
31
|
-
tracks = model.track(im0, persist=True, show=False)
|
|
32
29
|
_ = counter.count(original_im0.copy())
|
|
33
30
|
_ = heatmap.generate_heatmap(original_im0.copy())
|
|
34
|
-
_ = speed.estimate_speed(original_im0.copy()
|
|
35
|
-
_ = queue.process_queue(original_im0.copy()
|
|
31
|
+
_ = speed.estimate_speed(original_im0.copy())
|
|
32
|
+
_ = queue.process_queue(original_im0.copy())
|
|
36
33
|
cap.release()
|
|
37
34
|
cv2.destroyAllWindows()
|
|
38
35
|
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
# Ultralytics YOLO 🚀, AGPL-3.0 license
|
|
2
2
|
|
|
3
|
-
__version__ = "8.3.
|
|
3
|
+
__version__ = "8.3.9"
|
|
4
4
|
|
|
5
5
|
import os
|
|
6
6
|
|
|
7
|
-
# Set ENV
|
|
8
|
-
os.environ
|
|
7
|
+
# Set ENV variables (place before imports)
|
|
8
|
+
if not os.environ.get("OMP_NUM_THREADS"):
|
|
9
|
+
os.environ["OMP_NUM_THREADS"] = "1" # default for reduced CPU utilization during training
|
|
9
10
|
|
|
10
11
|
from ultralytics.data.explorer.explorer import Explorer
|
|
11
12
|
from ultralytics.models import NAS, RTDETR, SAM, YOLO, FastSAM, YOLOWorld
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Ultralytics YOLO 🚀, AGPL-3.0 license
|
|
2
|
+
|
|
3
|
+
# Configuration for Ultralytics Solutions
|
|
4
|
+
|
|
5
|
+
model: "yolo11n.pt" # The Ultralytics YOLO11 model to be used (e.g., yolo11n.pt for YOLO11 nano version and yolov8n.pt for YOLOv8 nano version)
|
|
6
|
+
|
|
7
|
+
region: # Object counting, queue or speed estimation region points. Default region points are [(20, 400), (1080, 404), (1080, 360), (20, 360)]
|
|
8
|
+
line_width: 2 # Width of the annotator used to draw regions on the image/video frames + bounding boxes and tracks drawing. Default value is 2.
|
|
9
|
+
show: True # Flag to control whether to display output image or not, you can set this as False i.e. when deploying it on some embedded devices.
|
|
10
|
+
show_in: True # Flag to display objects moving *into* the defined region
|
|
11
|
+
show_out: True # Flag to display objects moving *out of* the defined region
|
|
12
|
+
classes: # To count specific classes. i.e, if you want to detect, track and count the person with COCO model, you can use classes=0, Default its None
|
|
13
|
+
up_angle: 145.0 # Workouts up_angle for counts, 145.0 is default value. You can adjust it for different workouts, based on position of keypoints.
|
|
14
|
+
down_angle: 90 # Workouts down_angle for counts, 90 is default value. You can change it for different workouts, based on position of keypoints.
|
|
15
|
+
kpts: [6, 8, 10] # Keypoints for workouts monitoring, i.e. If you want to consider keypoints for pushups that have mostly values of [6, 8, 10].
|
|
16
|
+
colormap: # Colormap for heatmap, Only OPENCV supported colormaps can be used. By default COLORMAP_PARULA will be used for visualization.
|
|
@@ -642,19 +642,21 @@ def yolo_bbox2segment(im_dir, save_dir=None, sam_model="sam_b.pt"):
|
|
|
642
642
|
|
|
643
643
|
def create_synthetic_coco_dataset():
|
|
644
644
|
"""
|
|
645
|
-
Creates a synthetic COCO dataset with random images
|
|
645
|
+
Creates a synthetic COCO dataset with random images based on filenames from label lists.
|
|
646
646
|
|
|
647
|
-
This function downloads COCO labels,
|
|
647
|
+
This function downloads COCO labels, reads image filenames from label list files,
|
|
648
|
+
creates synthetic images for train2017 and val2017 subsets, and organizes
|
|
648
649
|
them in the COCO dataset structure. It uses multithreading to generate images efficiently.
|
|
649
650
|
|
|
650
651
|
Examples:
|
|
652
|
+
>>> from ultralytics.data.converter import create_synthetic_coco_dataset
|
|
651
653
|
>>> create_synthetic_coco_dataset()
|
|
652
654
|
|
|
653
655
|
Notes:
|
|
654
656
|
- Requires internet connection to download label files.
|
|
655
657
|
- Generates random RGB images of varying sizes (480x480 to 640x640 pixels).
|
|
656
658
|
- Existing test2017 directory is removed as it's not needed.
|
|
657
|
-
-
|
|
659
|
+
- Reads image filenames from train2017.txt and val2017.txt files.
|
|
658
660
|
"""
|
|
659
661
|
|
|
660
662
|
def create_synthetic_image(image_file):
|
|
@@ -680,16 +682,17 @@ def create_synthetic_coco_dataset():
|
|
|
680
682
|
subset_dir = dir / "images" / subset
|
|
681
683
|
subset_dir.mkdir(parents=True, exist_ok=True)
|
|
682
684
|
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
685
|
+
# Read image filenames from label list file
|
|
686
|
+
label_list_file = dir / f"{subset}.txt"
|
|
687
|
+
if label_list_file.exists():
|
|
688
|
+
with open(label_list_file) as f:
|
|
689
|
+
image_files = [dir / line.strip() for line in f]
|
|
687
690
|
|
|
688
691
|
# Submit all tasks
|
|
689
692
|
futures = [executor.submit(create_synthetic_image, image_file) for image_file in image_files]
|
|
690
693
|
for _ in TQDM(as_completed(futures), total=len(futures), desc=f"Generating images for {subset}"):
|
|
691
694
|
pass # The actual work is done in the background
|
|
692
695
|
else:
|
|
693
|
-
print(f"Warning:
|
|
696
|
+
print(f"Warning: Labels file {label_list_file} does not exist. Skipping image creation for {subset}.")
|
|
694
697
|
|
|
695
698
|
print("Synthetic COCO dataset created successfully.")
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
# Ultralytics YOLO 🚀, AGPL-3.0 license
|
|
2
2
|
|
|
3
|
-
import contextlib
|
|
4
3
|
import json
|
|
5
4
|
from collections import defaultdict
|
|
6
5
|
from itertools import repeat
|
|
@@ -483,7 +482,7 @@ class ClassificationDataset:
|
|
|
483
482
|
desc = f"{self.prefix}Scanning {self.root}..."
|
|
484
483
|
path = Path(self.root).with_suffix(".cache") # *.cache file path
|
|
485
484
|
|
|
486
|
-
|
|
485
|
+
try:
|
|
487
486
|
cache = load_dataset_cache_file(path) # attempt to load a *.cache file
|
|
488
487
|
assert cache["version"] == DATASET_CACHE_VERSION # matches current version
|
|
489
488
|
assert cache["hash"] == get_hash([x[0] for x in self.samples]) # identical hash
|
|
@@ -495,24 +494,25 @@ class ClassificationDataset:
|
|
|
495
494
|
LOGGER.info("\n".join(cache["msgs"])) # display warnings
|
|
496
495
|
return samples
|
|
497
496
|
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
497
|
+
except (FileNotFoundError, AssertionError, AttributeError):
|
|
498
|
+
# Run scan if *.cache retrieval failed
|
|
499
|
+
nf, nc, msgs, samples, x = 0, 0, [], [], {}
|
|
500
|
+
with ThreadPool(NUM_THREADS) as pool:
|
|
501
|
+
results = pool.imap(func=verify_image, iterable=zip(self.samples, repeat(self.prefix)))
|
|
502
|
+
pbar = TQDM(results, desc=desc, total=len(self.samples))
|
|
503
|
+
for sample, nf_f, nc_f, msg in pbar:
|
|
504
|
+
if nf_f:
|
|
505
|
+
samples.append(sample)
|
|
506
|
+
if msg:
|
|
507
|
+
msgs.append(msg)
|
|
508
|
+
nf += nf_f
|
|
509
|
+
nc += nc_f
|
|
510
|
+
pbar.desc = f"{desc} {nf} images, {nc} corrupt"
|
|
511
|
+
pbar.close()
|
|
512
|
+
if msgs:
|
|
513
|
+
LOGGER.info("\n".join(msgs))
|
|
514
|
+
x["hash"] = get_hash([x[0] for x in self.samples])
|
|
515
|
+
x["results"] = nf, nc, len(samples), samples
|
|
516
|
+
x["msgs"] = msgs # warnings
|
|
517
|
+
save_dataset_cache_file(self.prefix, path, x, DATASET_CACHE_VERSION)
|
|
518
|
+
return samples
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
# Ultralytics YOLO 🚀, AGPL-3.0 license
|
|
2
2
|
|
|
3
|
-
import contextlib
|
|
4
3
|
import hashlib
|
|
5
4
|
import json
|
|
6
5
|
import os
|
|
@@ -60,12 +59,14 @@ def exif_size(img: Image.Image):
|
|
|
60
59
|
"""Returns exif-corrected PIL size."""
|
|
61
60
|
s = img.size # (width, height)
|
|
62
61
|
if img.format == "JPEG": # only support JPEG images
|
|
63
|
-
|
|
62
|
+
try:
|
|
64
63
|
exif = img.getexif()
|
|
65
64
|
if exif:
|
|
66
65
|
rotation = exif.get(274, None) # the EXIF key for the orientation tag is 274
|
|
67
66
|
if rotation in {6, 8}: # rotation 270 or 90
|
|
68
67
|
s = s[1], s[0]
|
|
68
|
+
except: # noqa E722
|
|
69
|
+
pass
|
|
69
70
|
return s
|
|
70
71
|
|
|
71
72
|
|
|
@@ -543,9 +543,7 @@ class Model(nn.Module):
|
|
|
543
543
|
prompts = args.pop("prompts", None) # for SAM-type models
|
|
544
544
|
|
|
545
545
|
if not self.predictor:
|
|
546
|
-
self.predictor = predictor or self._smart_load("predictor")(overrides=args, _callbacks=self.callbacks)
|
|
547
|
-
if predictor:
|
|
548
|
-
self.predictor.args = get_cfg(self.predictor.args, args)
|
|
546
|
+
self.predictor = (predictor or self._smart_load("predictor"))(overrides=args, _callbacks=self.callbacks)
|
|
549
547
|
self.predictor.setup_model(model=self.model, verbose=is_cli)
|
|
550
548
|
else: # only update args if predictor is already setup
|
|
551
549
|
self.predictor.args = get_cfg(self.predictor.args, args)
|
|
@@ -469,11 +469,9 @@ class BaseTrainer:
|
|
|
469
469
|
|
|
470
470
|
if RANK in {-1, 0}:
|
|
471
471
|
# Do final val with best.pt
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
LOGGER.info(f"\n{epochs} epochs completed in {seconds / 3600:.3f} hours.")
|
|
472
|
+
seconds = time.time() - self.train_time_start
|
|
473
|
+
LOGGER.info(f"\n{epoch - self.start_epoch + 1} epochs completed in {seconds / 3600:.3f} hours.")
|
|
475
474
|
self.final_eval()
|
|
476
|
-
self.validator.metrics.training = {"epochs": epochs, "seconds": seconds} # add training speed
|
|
477
475
|
if self.args.plots:
|
|
478
476
|
self.plot_metrics()
|
|
479
477
|
self.run_callbacks("on_train_end")
|
|
@@ -504,7 +502,7 @@ class BaseTrainer:
|
|
|
504
502
|
"""Read results.csv into a dict using pandas."""
|
|
505
503
|
import pandas as pd # scope for faster 'import ultralytics'
|
|
506
504
|
|
|
507
|
-
return
|
|
505
|
+
return pd.read_csv(self.csv).to_dict(orient="list")
|
|
508
506
|
|
|
509
507
|
def save_model(self):
|
|
510
508
|
"""Save model training checkpoints with additional metadata."""
|
|
@@ -654,10 +652,11 @@ class BaseTrainer:
|
|
|
654
652
|
def save_metrics(self, metrics):
|
|
655
653
|
"""Saves training metrics to a CSV file."""
|
|
656
654
|
keys, vals = list(metrics.keys()), list(metrics.values())
|
|
657
|
-
n = len(metrics) +
|
|
658
|
-
s = "" if self.csv.exists() else (("%
|
|
655
|
+
n = len(metrics) + 2 # number of cols
|
|
656
|
+
s = "" if self.csv.exists() else (("%s," * n % tuple(["epoch", "time"] + keys)).rstrip(",") + "\n") # header
|
|
657
|
+
t = time.time() - self.train_time_start
|
|
659
658
|
with open(self.csv, "a") as f:
|
|
660
|
-
f.write(s + ("
|
|
659
|
+
f.write(s + ("%.6g," * n % tuple([self.epoch + 1, t] + vals)).rstrip(",") + "\n")
|
|
661
660
|
|
|
662
661
|
def plot_metrics(self):
|
|
663
662
|
"""Plot and display metrics visually."""
|
|
@@ -75,7 +75,7 @@ class DetectionValidator(BaseValidator):
|
|
|
75
75
|
) # is COCO
|
|
76
76
|
self.is_lvis = isinstance(val, str) and "lvis" in val and not self.is_coco # is LVIS
|
|
77
77
|
self.class_map = converter.coco80_to_coco91_class() if self.is_coco else list(range(len(model.names)))
|
|
78
|
-
self.args.save_json |= (self.is_coco or self.is_lvis) and not self.training # run
|
|
78
|
+
self.args.save_json |= self.args.val and (self.is_coco or self.is_lvis) and not self.training # run final val
|
|
79
79
|
self.names = model.names
|
|
80
80
|
self.nc = len(model.names)
|
|
81
81
|
self.metrics.names = self.names
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
# Ultralytics YOLO 🚀, AGPL-3.0 license
|
|
2
2
|
|
|
3
3
|
import ast
|
|
4
|
-
import contextlib
|
|
5
4
|
import json
|
|
6
5
|
import platform
|
|
7
6
|
import zipfile
|
|
@@ -45,8 +44,10 @@ def check_class_names(names):
|
|
|
45
44
|
def default_class_names(data=None):
|
|
46
45
|
"""Applies default class names to an input YAML file or returns numerical class names."""
|
|
47
46
|
if data:
|
|
48
|
-
|
|
47
|
+
try:
|
|
49
48
|
return yaml_load(check_yaml(data))["names"]
|
|
49
|
+
except: # noqa E722
|
|
50
|
+
pass
|
|
50
51
|
return {i: f"class{i}" for i in range(999)} # return default if above errors
|
|
51
52
|
|
|
52
53
|
|
|
@@ -264,8 +265,8 @@ class AutoBackend(nn.Module):
|
|
|
264
265
|
if -1 in tuple(model.get_tensor_shape(name)):
|
|
265
266
|
dynamic = True
|
|
266
267
|
context.set_input_shape(name, tuple(model.get_tensor_profile_shape(name, 0)[1]))
|
|
267
|
-
|
|
268
|
-
|
|
268
|
+
if dtype == np.float16:
|
|
269
|
+
fp16 = True
|
|
269
270
|
else:
|
|
270
271
|
output_names.append(name)
|
|
271
272
|
shape = tuple(context.get_tensor_shape(name))
|
|
@@ -321,8 +322,10 @@ class AutoBackend(nn.Module):
|
|
|
321
322
|
with open(w, "rb") as f:
|
|
322
323
|
gd.ParseFromString(f.read())
|
|
323
324
|
frozen_func = wrap_frozen_graph(gd, inputs="x:0", outputs=gd_outputs(gd))
|
|
324
|
-
|
|
325
|
+
try: # find metadata in SavedModel alongside GraphDef
|
|
325
326
|
metadata = next(Path(w).resolve().parent.rglob(f"{Path(w).stem}_saved_model*/metadata.yaml"))
|
|
327
|
+
except StopIteration:
|
|
328
|
+
pass
|
|
326
329
|
|
|
327
330
|
# TFLite or TFLite Edge TPU
|
|
328
331
|
elif tflite or edgetpu: # https://www.tensorflow.org/lite/guide/python#install_tensorflow_lite_for_python
|
|
@@ -345,10 +348,12 @@ class AutoBackend(nn.Module):
|
|
|
345
348
|
input_details = interpreter.get_input_details() # inputs
|
|
346
349
|
output_details = interpreter.get_output_details() # outputs
|
|
347
350
|
# Load metadata
|
|
348
|
-
|
|
351
|
+
try:
|
|
349
352
|
with zipfile.ZipFile(w, "r") as model:
|
|
350
353
|
meta_file = model.namelist()[0]
|
|
351
354
|
metadata = ast.literal_eval(model.read(meta_file).decode("utf-8"))
|
|
355
|
+
except zipfile.BadZipFile:
|
|
356
|
+
pass
|
|
352
357
|
|
|
353
358
|
# TF.js
|
|
354
359
|
elif tfjs:
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import contextlib
|
|
4
4
|
import pickle
|
|
5
|
+
import re
|
|
5
6
|
import types
|
|
6
7
|
from copy import deepcopy
|
|
7
8
|
from pathlib import Path
|
|
@@ -958,8 +959,10 @@ def parse_model(d, ch, verbose=True): # model_dict, input_channels(3)
|
|
|
958
959
|
m = getattr(torch.nn, m[3:]) if "nn." in m else globals()[m] # get module
|
|
959
960
|
for j, a in enumerate(args):
|
|
960
961
|
if isinstance(a, str):
|
|
961
|
-
|
|
962
|
+
try:
|
|
962
963
|
args[j] = locals()[a] if a in locals() else ast.literal_eval(a)
|
|
964
|
+
except ValueError:
|
|
965
|
+
pass
|
|
963
966
|
|
|
964
967
|
n = n_ = max(round(n * depth), 1) if n > 1 else n # depth gain
|
|
965
968
|
if m in {
|
|
@@ -1058,10 +1061,10 @@ def parse_model(d, ch, verbose=True): # model_dict, input_channels(3)
|
|
|
1058
1061
|
|
|
1059
1062
|
m_ = nn.Sequential(*(m(*args) for _ in range(n))) if n > 1 else m(*args) # module
|
|
1060
1063
|
t = str(m)[8:-2].replace("__main__.", "") # module type
|
|
1061
|
-
|
|
1064
|
+
m_.np = sum(x.numel() for x in m_.parameters()) # number params
|
|
1062
1065
|
m_.i, m_.f, m_.type = i, f, t # attach index, 'from' index, type
|
|
1063
1066
|
if verbose:
|
|
1064
|
-
LOGGER.info(f"{i:>3}{str(f):>20}{n_:>3}{
|
|
1067
|
+
LOGGER.info(f"{i:>3}{str(f):>20}{n_:>3}{m_.np:10.0f} {t:<45}{str(args):<30}") # print
|
|
1065
1068
|
save.extend(x % i for x in ([f] if isinstance(f, int) else f) if x != -1) # append to savelist
|
|
1066
1069
|
layers.append(m_)
|
|
1067
1070
|
if i == 0:
|
|
@@ -1072,8 +1075,6 @@ def parse_model(d, ch, verbose=True): # model_dict, input_channels(3)
|
|
|
1072
1075
|
|
|
1073
1076
|
def yaml_model_load(path):
|
|
1074
1077
|
"""Load a YOLOv8 model from a YAML file."""
|
|
1075
|
-
import re
|
|
1076
|
-
|
|
1077
1078
|
path = Path(path)
|
|
1078
1079
|
if path.stem in (f"yolov{d}{x}6" for x in "nsmlx" for d in (5, 8)):
|
|
1079
1080
|
new_stem = re.sub(r"(\d+)([nslmx])6(.+)?$", r"\1\2-p6\3", path.stem)
|
|
@@ -1100,11 +1101,10 @@ def guess_model_scale(model_path):
|
|
|
1100
1101
|
Returns:
|
|
1101
1102
|
(str): The size character of the model's scale, which can be n, s, m, l, or x.
|
|
1102
1103
|
"""
|
|
1103
|
-
|
|
1104
|
-
import re
|
|
1105
|
-
|
|
1104
|
+
try:
|
|
1106
1105
|
return re.search(r"yolo[v]?\d+([nslmx])", Path(model_path).stem).group(1) # n, s, m, l, or x
|
|
1107
|
-
|
|
1106
|
+
except AttributeError:
|
|
1107
|
+
return ""
|
|
1108
1108
|
|
|
1109
1109
|
|
|
1110
1110
|
def guess_model_task(model):
|
|
@@ -1137,17 +1137,23 @@ def guess_model_task(model):
|
|
|
1137
1137
|
|
|
1138
1138
|
# Guess from model cfg
|
|
1139
1139
|
if isinstance(model, dict):
|
|
1140
|
-
|
|
1140
|
+
try:
|
|
1141
1141
|
return cfg2task(model)
|
|
1142
|
+
except: # noqa E722
|
|
1143
|
+
pass
|
|
1142
1144
|
|
|
1143
1145
|
# Guess from PyTorch model
|
|
1144
1146
|
if isinstance(model, nn.Module): # PyTorch model
|
|
1145
1147
|
for x in "model.args", "model.model.args", "model.model.model.args":
|
|
1146
|
-
|
|
1148
|
+
try:
|
|
1147
1149
|
return eval(x)["task"]
|
|
1150
|
+
except: # noqa E722
|
|
1151
|
+
pass
|
|
1148
1152
|
for x in "model.yaml", "model.model.yaml", "model.model.model.yaml":
|
|
1149
|
-
|
|
1153
|
+
try:
|
|
1150
1154
|
return cfg2task(eval(x))
|
|
1155
|
+
except: # noqa E722
|
|
1156
|
+
pass
|
|
1151
1157
|
|
|
1152
1158
|
for m in model.modules():
|
|
1153
1159
|
if isinstance(m, Segment):
|
|
@@ -116,7 +116,7 @@ class ObjectCounter(BaseSolution):
|
|
|
116
116
|
self.store_tracking_history(track_id, box) # Store track history
|
|
117
117
|
self.store_classwise_counts(cls) # store classwise counts in dict
|
|
118
118
|
|
|
119
|
-
# Draw
|
|
119
|
+
# Draw tracks of objects
|
|
120
120
|
self.annotator.draw_centroid_and_tracks(
|
|
121
121
|
self.track_line, color=colors(int(track_id), True), track_thickness=self.line_width
|
|
122
122
|
)
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Ultralytics YOLO 🚀, AGPL-3.0 license
|
|
2
|
+
|
|
3
|
+
from shapely.geometry import Point
|
|
4
|
+
|
|
5
|
+
from ultralytics.solutions.solutions import BaseSolution # Import a parent class
|
|
6
|
+
from ultralytics.utils.plotting import Annotator, colors
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class QueueManager(BaseSolution):
|
|
10
|
+
"""A class to manage the queue in a real-time video stream based on object tracks."""
|
|
11
|
+
|
|
12
|
+
def __init__(self, **kwargs):
|
|
13
|
+
"""Initializes the QueueManager with specified parameters for tracking and counting objects."""
|
|
14
|
+
super().__init__(**kwargs)
|
|
15
|
+
self.initialize_region()
|
|
16
|
+
self.counts = 0 # Queue counts Information
|
|
17
|
+
self.rect_color = (255, 255, 255) # Rectangle color
|
|
18
|
+
self.region_length = len(self.region) # Store region length for further usage
|
|
19
|
+
|
|
20
|
+
def process_queue(self, im0):
|
|
21
|
+
"""
|
|
22
|
+
Main function to start the queue management process.
|
|
23
|
+
|
|
24
|
+
Args:
|
|
25
|
+
im0 (ndarray): The input image that will be used for processing
|
|
26
|
+
Returns
|
|
27
|
+
im0 (ndarray): The processed image for more usage
|
|
28
|
+
"""
|
|
29
|
+
self.counts = 0 # Reset counts every frame
|
|
30
|
+
self.annotator = Annotator(im0, line_width=self.line_width) # Initialize annotator
|
|
31
|
+
self.extract_tracks(im0) # Extract tracks
|
|
32
|
+
|
|
33
|
+
self.annotator.draw_region(
|
|
34
|
+
reg_pts=self.region, color=self.rect_color, thickness=self.line_width * 2
|
|
35
|
+
) # Draw region
|
|
36
|
+
|
|
37
|
+
for box, track_id, cls in zip(self.boxes, self.track_ids, self.clss):
|
|
38
|
+
# Draw bounding box and counting region
|
|
39
|
+
self.annotator.box_label(box, label=self.names[cls], color=colors(track_id, True))
|
|
40
|
+
self.store_tracking_history(track_id, box) # Store track history
|
|
41
|
+
|
|
42
|
+
# Draw tracks of objects
|
|
43
|
+
self.annotator.draw_centroid_and_tracks(
|
|
44
|
+
self.track_line, color=colors(int(track_id), True), track_thickness=self.line_width
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
# Cache frequently accessed attributes
|
|
48
|
+
track_history = self.track_history.get(track_id, [])
|
|
49
|
+
|
|
50
|
+
# store previous position of track and check if the object is inside the counting region
|
|
51
|
+
prev_position = track_history[-2] if len(track_history) > 1 else None
|
|
52
|
+
if self.region_length >= 3 and prev_position and self.r_s.contains(Point(self.track_line[-1])):
|
|
53
|
+
self.counts += 1
|
|
54
|
+
|
|
55
|
+
# Display queue counts
|
|
56
|
+
self.annotator.queue_counts_display(
|
|
57
|
+
f"Queue Counts : {str(self.counts)}",
|
|
58
|
+
points=self.region,
|
|
59
|
+
region_color=self.rect_color,
|
|
60
|
+
txt_color=(104, 31, 17),
|
|
61
|
+
)
|
|
62
|
+
self.display_output(im0) # display output with base class function
|
|
63
|
+
|
|
64
|
+
return im0 # return output image for more usage
|
|
@@ -76,9 +76,11 @@ class BaseSolution:
|
|
|
76
76
|
|
|
77
77
|
def initialize_region(self):
|
|
78
78
|
"""Initialize the counting region and line segment based on config."""
|
|
79
|
-
self.region = [(20, 400), (
|
|
80
|
-
self.r_s = Polygon(self.region) if len(self.region) >= 3 else LineString(self.region)
|
|
81
|
-
self.l_s = LineString(
|
|
79
|
+
self.region = [(20, 400), (1080, 404), (1080, 360), (20, 360)] if self.region is None else self.region
|
|
80
|
+
self.r_s = Polygon(self.region) if len(self.region) >= 3 else LineString(self.region) # region segment
|
|
81
|
+
self.l_s = LineString(
|
|
82
|
+
[(self.region[0][0], self.region[0][1]), (self.region[1][0], self.region[1][1])]
|
|
83
|
+
) # line segment
|
|
82
84
|
|
|
83
85
|
def display_output(self, im0):
|
|
84
86
|
"""
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# Ultralytics YOLO 🚀, AGPL-3.0 license
|
|
2
|
+
|
|
3
|
+
from time import time
|
|
4
|
+
|
|
5
|
+
import numpy as np
|
|
6
|
+
|
|
7
|
+
from ultralytics.solutions.solutions import BaseSolution, LineString
|
|
8
|
+
from ultralytics.utils.plotting import Annotator, colors
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class SpeedEstimator(BaseSolution):
|
|
12
|
+
"""A class to estimate the speed of objects in a real-time video stream based on their tracks."""
|
|
13
|
+
|
|
14
|
+
def __init__(self, **kwargs):
|
|
15
|
+
"""Initializes the SpeedEstimator with the given parameters."""
|
|
16
|
+
super().__init__(**kwargs)
|
|
17
|
+
|
|
18
|
+
self.initialize_region() # Initialize speed region
|
|
19
|
+
|
|
20
|
+
self.spd = {} # set for speed data
|
|
21
|
+
self.trkd_ids = [] # list for already speed_estimated and tracked ID's
|
|
22
|
+
self.trk_pt = {} # set for tracks previous time
|
|
23
|
+
self.trk_pp = {} # set for tracks previous point
|
|
24
|
+
|
|
25
|
+
def estimate_speed(self, im0):
|
|
26
|
+
"""
|
|
27
|
+
Estimates the speed of objects based on tracking data.
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
im0 (ndarray): The input image that will be used for processing
|
|
31
|
+
Returns
|
|
32
|
+
im0 (ndarray): The processed image for more usage
|
|
33
|
+
"""
|
|
34
|
+
self.annotator = Annotator(im0, line_width=self.line_width) # Initialize annotator
|
|
35
|
+
self.extract_tracks(im0) # Extract tracks
|
|
36
|
+
|
|
37
|
+
self.annotator.draw_region(
|
|
38
|
+
reg_pts=self.region, color=(104, 0, 123), thickness=self.line_width * 2
|
|
39
|
+
) # Draw region
|
|
40
|
+
|
|
41
|
+
for box, track_id, cls in zip(self.boxes, self.track_ids, self.clss):
|
|
42
|
+
self.store_tracking_history(track_id, box) # Store track history
|
|
43
|
+
|
|
44
|
+
# Check if track_id is already in self.trk_pp or trk_pt initialize if not
|
|
45
|
+
if track_id not in self.trk_pt:
|
|
46
|
+
self.trk_pt[track_id] = 0
|
|
47
|
+
if track_id not in self.trk_pp:
|
|
48
|
+
self.trk_pp[track_id] = self.track_line[-1]
|
|
49
|
+
|
|
50
|
+
speed_label = f"{int(self.spd[track_id])} km/h" if track_id in self.spd else self.names[int(cls)]
|
|
51
|
+
self.annotator.box_label(box, label=speed_label, color=colors(track_id, True)) # Draw bounding box
|
|
52
|
+
|
|
53
|
+
# Draw tracks of objects
|
|
54
|
+
self.annotator.draw_centroid_and_tracks(
|
|
55
|
+
self.track_line, color=colors(int(track_id), True), track_thickness=self.line_width
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
# Calculate object speed and direction based on region intersection
|
|
59
|
+
if LineString([self.trk_pp[track_id], self.track_line[-1]]).intersects(self.l_s):
|
|
60
|
+
direction = "known"
|
|
61
|
+
else:
|
|
62
|
+
direction = "unknown"
|
|
63
|
+
|
|
64
|
+
# Perform speed calculation and tracking updates if direction is valid
|
|
65
|
+
if direction == "known" and track_id not in self.trkd_ids:
|
|
66
|
+
self.trkd_ids.append(track_id)
|
|
67
|
+
time_difference = time() - self.trk_pt[track_id]
|
|
68
|
+
if time_difference > 0:
|
|
69
|
+
self.spd[track_id] = np.abs(self.track_line[-1][1] - self.trk_pp[track_id][1]) / time_difference
|
|
70
|
+
|
|
71
|
+
self.trk_pt[track_id] = time()
|
|
72
|
+
self.trk_pp[track_id] = self.track_line[-1]
|
|
73
|
+
|
|
74
|
+
self.display_output(im0) # display output with base class function
|
|
75
|
+
|
|
76
|
+
return im0 # return output image for more usage
|