ultralytics 8.3.15__tar.gz → 8.3.17__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.15/ultralytics.egg-info → ultralytics-8.3.17}/PKG-INFO +11 -11
- {ultralytics-8.3.15 → ultralytics-8.3.17}/README.md +9 -9
- {ultralytics-8.3.15 → ultralytics-8.3.17}/pyproject.toml +1 -1
- {ultralytics-8.3.15 → ultralytics-8.3.17}/tests/test_solutions.py +20 -16
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/__init__.py +1 -1
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/__init__.py +40 -14
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/solutions/default.yaml +1 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/data/split_dota.py +3 -3
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/nn/modules/head.py +11 -6
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/nn/tasks.py +7 -2
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/solutions/ai_gym.py +43 -9
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/solutions/analytics.py +65 -12
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/solutions/distance_calculation.py +50 -10
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/solutions/heatmap.py +50 -14
- ultralytics-8.3.17/ultralytics/solutions/object_counter.py +187 -0
- ultralytics-8.3.17/ultralytics/solutions/parking_management.py +236 -0
- ultralytics-8.3.17/ultralytics/solutions/queue_management.py +109 -0
- ultralytics-8.3.17/ultralytics/solutions/solutions.py +150 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/solutions/speed_estimation.py +41 -7
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/solutions/streamlit_inference.py +2 -3
- {ultralytics-8.3.15 → ultralytics-8.3.17/ultralytics.egg-info}/PKG-INFO +11 -11
- ultralytics-8.3.15/ultralytics/solutions/object_counter.py +0 -131
- ultralytics-8.3.15/ultralytics/solutions/parking_management.py +0 -241
- ultralytics-8.3.15/ultralytics/solutions/queue_management.py +0 -64
- ultralytics-8.3.15/ultralytics/solutions/solutions.py +0 -95
- {ultralytics-8.3.15 → ultralytics-8.3.17}/LICENSE +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/setup.cfg +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/tests/__init__.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/tests/conftest.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/tests/test_cli.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/tests/test_cuda.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/tests/test_engine.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/tests/test_exports.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/tests/test_integrations.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/tests/test_python.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/assets/bus.jpg +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/assets/zidane.jpg +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/datasets/VOC.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/datasets/coco.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/datasets/coco128.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/datasets/coco8.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/datasets/dota8.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/datasets/hand-keypoints.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/datasets/lvis.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/datasets/signature.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/datasets/xView.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/default.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/models/11/yolo11-cls.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/models/11/yolo11-obb.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/models/11/yolo11-pose.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/models/11/yolo11-seg.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/models/11/yolo11.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/models/v10/yolov10b.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/models/v10/yolov10l.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/models/v10/yolov10m.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/models/v10/yolov10n.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/models/v10/yolov10s.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/models/v10/yolov10x.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/models/v9/yolov9m.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/models/v9/yolov9s.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/models/v9/yolov9t.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/trackers/botsort.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/data/__init__.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/data/annotator.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/data/augment.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/data/base.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/data/build.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/data/converter.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/data/dataset.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/data/loaders.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/data/utils.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/engine/__init__.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/engine/exporter.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/engine/model.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/engine/predictor.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/engine/results.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/engine/trainer.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/engine/tuner.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/engine/validator.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/hub/__init__.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/hub/auth.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/hub/google/__init__.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/hub/session.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/hub/utils.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/__init__.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/fastsam/__init__.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/fastsam/model.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/fastsam/predict.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/fastsam/utils.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/fastsam/val.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/nas/__init__.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/nas/model.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/nas/predict.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/nas/val.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/rtdetr/__init__.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/rtdetr/model.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/rtdetr/predict.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/rtdetr/train.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/rtdetr/val.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/sam/__init__.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/sam/amg.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/sam/build.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/sam/model.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/sam/modules/__init__.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/sam/modules/blocks.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/sam/modules/decoders.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/sam/modules/encoders.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/sam/modules/memory_attention.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/sam/modules/sam.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/sam/modules/transformer.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/sam/modules/utils.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/sam/predict.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/utils/__init__.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/utils/loss.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/utils/ops.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/yolo/__init__.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/yolo/classify/__init__.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/yolo/classify/predict.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/yolo/classify/train.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/yolo/classify/val.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/yolo/detect/__init__.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/yolo/detect/predict.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/yolo/detect/train.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/yolo/detect/val.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/yolo/model.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/yolo/obb/__init__.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/yolo/obb/predict.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/yolo/obb/train.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/yolo/obb/val.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/yolo/pose/__init__.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/yolo/pose/predict.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/yolo/pose/train.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/yolo/pose/val.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/yolo/segment/__init__.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/yolo/segment/predict.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/yolo/segment/train.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/yolo/segment/val.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/yolo/world/__init__.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/yolo/world/train.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/models/yolo/world/train_world.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/nn/__init__.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/nn/autobackend.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/nn/modules/__init__.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/nn/modules/activation.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/nn/modules/block.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/nn/modules/conv.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/nn/modules/transformer.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/nn/modules/utils.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/solutions/__init__.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/trackers/__init__.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/trackers/basetrack.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/trackers/bot_sort.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/trackers/byte_tracker.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/trackers/track.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/trackers/utils/__init__.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/trackers/utils/gmc.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/trackers/utils/kalman_filter.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/trackers/utils/matching.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/utils/__init__.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/utils/autobatch.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/utils/benchmarks.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/utils/callbacks/__init__.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/utils/callbacks/base.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/utils/callbacks/clearml.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/utils/callbacks/comet.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/utils/callbacks/dvc.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/utils/callbacks/hub.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/utils/callbacks/mlflow.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/utils/callbacks/neptune.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/utils/callbacks/raytune.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/utils/callbacks/tensorboard.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/utils/callbacks/wb.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/utils/checks.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/utils/dist.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/utils/downloads.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/utils/errors.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/utils/files.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/utils/instance.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/utils/loss.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/utils/metrics.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/utils/ops.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/utils/patches.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/utils/plotting.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/utils/tal.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/utils/torch_utils.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/utils/triton.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics/utils/tuner.py +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics.egg-info/SOURCES.txt +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics.egg-info/dependency_links.txt +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics.egg-info/entry_points.txt +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics.egg-info/requires.txt +0 -0
- {ultralytics-8.3.15 → ultralytics-8.3.17}/ultralytics.egg-info/top_level.txt +0 -0
@@ -1,7 +1,7 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: ultralytics
|
3
|
-
Version: 8.3.
|
4
|
-
Summary: Ultralytics YOLO for SOTA object detection, multi-object tracking, instance segmentation, pose estimation and image classification.
|
3
|
+
Version: 8.3.17
|
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>
|
7
7
|
License: AGPL-3.0
|
@@ -203,7 +203,7 @@ See YOLO [Python Docs](https://docs.ultralytics.com/usage/python/) for more exam
|
|
203
203
|
|
204
204
|
YOLO11 [Detect](https://docs.ultralytics.com/tasks/detect/), [Segment](https://docs.ultralytics.com/tasks/segment/) and [Pose](https://docs.ultralytics.com/tasks/pose/) models pretrained on the [COCO](https://docs.ultralytics.com/datasets/detect/coco/) dataset are available here, as well as YOLO11 [Classify](https://docs.ultralytics.com/tasks/classify/) models pretrained on the [ImageNet](https://docs.ultralytics.com/datasets/classify/imagenet/) dataset. [Track](https://docs.ultralytics.com/modes/track/) mode is available for all Detect, Segment and Pose models.
|
205
205
|
|
206
|
-
<img width="
|
206
|
+
<img width="100%" src="https://raw.githubusercontent.com/ultralytics/assets/main/im/banner-tasks.png" alt="Ultralytics YOLO supported tasks">
|
207
207
|
|
208
208
|
All [Models](https://github.com/ultralytics/ultralytics/tree/main/ultralytics/cfg/models) download automatically from the latest Ultralytics [release](https://github.com/ultralytics/assets/releases) on first use.
|
209
209
|
|
@@ -294,7 +294,7 @@ See [OBB Docs](https://docs.ultralytics.com/tasks/obb/) for usage examples with
|
|
294
294
|
|
295
295
|
## <div align="center">Integrations</div>
|
296
296
|
|
297
|
-
Our key integrations with leading AI platforms extend the functionality of Ultralytics' offerings, enhancing tasks like dataset labeling, training, visualization, and model management. Discover how Ultralytics, in collaboration with [
|
297
|
+
Our key integrations with leading AI platforms extend the functionality of Ultralytics' offerings, enhancing tasks like dataset labeling, training, visualization, and model management. Discover how Ultralytics, in collaboration with [W&B](https://docs.wandb.ai/guides/integrations/ultralytics/), [Comet](https://bit.ly/yolov8-readme-comet), [Roboflow](https://roboflow.com/?ref=ultralytics) and [OpenVINO](https://docs.ultralytics.com/integrations/openvino/), can optimize your AI workflow.
|
298
298
|
|
299
299
|
<br>
|
300
300
|
<a href="https://www.ultralytics.com/hub" target="_blank">
|
@@ -303,11 +303,11 @@ Our key integrations with leading AI platforms extend the functionality of Ultra
|
|
303
303
|
<br>
|
304
304
|
|
305
305
|
<div align="center">
|
306
|
-
<a href="https://
|
307
|
-
<img src="https://github.com/ultralytics/assets/raw/main/partners/logo-
|
306
|
+
<a href="https://www.ultralytics.com/hub">
|
307
|
+
<img src="https://github.com/ultralytics/assets/raw/main/partners/logo-ultralytics-hub.png" width="10%" alt="Ultralytics HUB logo"></a>
|
308
308
|
<img src="https://github.com/ultralytics/assets/raw/main/social/logo-transparent.png" width="15%" height="0" alt="space">
|
309
|
-
<a href="https://
|
310
|
-
<img src="https://github.com/ultralytics/assets/raw/main/partners/logo-
|
309
|
+
<a href="https://docs.wandb.ai/guides/integrations/ultralytics/">
|
310
|
+
<img src="https://github.com/ultralytics/assets/raw/main/partners/logo-wb.png" width="10%" alt="ClearML logo"></a>
|
311
311
|
<img src="https://github.com/ultralytics/assets/raw/main/social/logo-transparent.png" width="15%" height="0" alt="space">
|
312
312
|
<a href="https://bit.ly/yolov8-readme-comet">
|
313
313
|
<img src="https://github.com/ultralytics/assets/raw/main/partners/logo-comet.png" width="10%" alt="Comet ML logo"></a>
|
@@ -316,9 +316,9 @@ Our key integrations with leading AI platforms extend the functionality of Ultra
|
|
316
316
|
<img src="https://github.com/ultralytics/assets/raw/main/partners/logo-neuralmagic.png" width="10%" alt="NeuralMagic logo"></a>
|
317
317
|
</div>
|
318
318
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
319
|
+
| Ultralytics HUB 🚀 | W&B | Comet ⭐ NEW | Neural Magic |
|
320
|
+
| :----------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------: |
|
321
|
+
| Streamline YOLO workflows: Label, train, and deploy effortlessly with [Ultralytics HUB](https://ultralytics.com/hub). Try now! | Track experiments, hyperparameters, and results with [Weights & Biases](https://docs.wandb.ai/guides/integrations/ultralytics/) | Free forever, [Comet](https://bit.ly/yolov5-readme-comet) lets you save YOLO11 models, resume training, and interactively visualize and debug predictions | Run YOLO11 inference up to 6x faster with [Neural Magic DeepSparse](https://bit.ly/yolov5-neuralmagic) |
|
322
322
|
|
323
323
|
## <div align="center">Ultralytics HUB</div>
|
324
324
|
|
@@ -116,7 +116,7 @@ See YOLO [Python Docs](https://docs.ultralytics.com/usage/python/) for more exam
|
|
116
116
|
|
117
117
|
YOLO11 [Detect](https://docs.ultralytics.com/tasks/detect/), [Segment](https://docs.ultralytics.com/tasks/segment/) and [Pose](https://docs.ultralytics.com/tasks/pose/) models pretrained on the [COCO](https://docs.ultralytics.com/datasets/detect/coco/) dataset are available here, as well as YOLO11 [Classify](https://docs.ultralytics.com/tasks/classify/) models pretrained on the [ImageNet](https://docs.ultralytics.com/datasets/classify/imagenet/) dataset. [Track](https://docs.ultralytics.com/modes/track/) mode is available for all Detect, Segment and Pose models.
|
118
118
|
|
119
|
-
<img width="
|
119
|
+
<img width="100%" src="https://raw.githubusercontent.com/ultralytics/assets/main/im/banner-tasks.png" alt="Ultralytics YOLO supported tasks">
|
120
120
|
|
121
121
|
All [Models](https://github.com/ultralytics/ultralytics/tree/main/ultralytics/cfg/models) download automatically from the latest Ultralytics [release](https://github.com/ultralytics/assets/releases) on first use.
|
122
122
|
|
@@ -207,7 +207,7 @@ See [OBB Docs](https://docs.ultralytics.com/tasks/obb/) for usage examples with
|
|
207
207
|
|
208
208
|
## <div align="center">Integrations</div>
|
209
209
|
|
210
|
-
Our key integrations with leading AI platforms extend the functionality of Ultralytics' offerings, enhancing tasks like dataset labeling, training, visualization, and model management. Discover how Ultralytics, in collaboration with [
|
210
|
+
Our key integrations with leading AI platforms extend the functionality of Ultralytics' offerings, enhancing tasks like dataset labeling, training, visualization, and model management. Discover how Ultralytics, in collaboration with [W&B](https://docs.wandb.ai/guides/integrations/ultralytics/), [Comet](https://bit.ly/yolov8-readme-comet), [Roboflow](https://roboflow.com/?ref=ultralytics) and [OpenVINO](https://docs.ultralytics.com/integrations/openvino/), can optimize your AI workflow.
|
211
211
|
|
212
212
|
<br>
|
213
213
|
<a href="https://www.ultralytics.com/hub" target="_blank">
|
@@ -216,11 +216,11 @@ Our key integrations with leading AI platforms extend the functionality of Ultra
|
|
216
216
|
<br>
|
217
217
|
|
218
218
|
<div align="center">
|
219
|
-
<a href="https://
|
220
|
-
<img src="https://github.com/ultralytics/assets/raw/main/partners/logo-
|
219
|
+
<a href="https://www.ultralytics.com/hub">
|
220
|
+
<img src="https://github.com/ultralytics/assets/raw/main/partners/logo-ultralytics-hub.png" width="10%" alt="Ultralytics HUB logo"></a>
|
221
221
|
<img src="https://github.com/ultralytics/assets/raw/main/social/logo-transparent.png" width="15%" height="0" alt="space">
|
222
|
-
<a href="https://
|
223
|
-
<img src="https://github.com/ultralytics/assets/raw/main/partners/logo-
|
222
|
+
<a href="https://docs.wandb.ai/guides/integrations/ultralytics/">
|
223
|
+
<img src="https://github.com/ultralytics/assets/raw/main/partners/logo-wb.png" width="10%" alt="ClearML logo"></a>
|
224
224
|
<img src="https://github.com/ultralytics/assets/raw/main/social/logo-transparent.png" width="15%" height="0" alt="space">
|
225
225
|
<a href="https://bit.ly/yolov8-readme-comet">
|
226
226
|
<img src="https://github.com/ultralytics/assets/raw/main/partners/logo-comet.png" width="10%" alt="Comet ML logo"></a>
|
@@ -229,9 +229,9 @@ Our key integrations with leading AI platforms extend the functionality of Ultra
|
|
229
229
|
<img src="https://github.com/ultralytics/assets/raw/main/partners/logo-neuralmagic.png" width="10%" alt="NeuralMagic logo"></a>
|
230
230
|
</div>
|
231
231
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
232
|
+
| Ultralytics HUB 🚀 | W&B | Comet ⭐ NEW | Neural Magic |
|
233
|
+
| :----------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------: |
|
234
|
+
| Streamline YOLO workflows: Label, train, and deploy effortlessly with [Ultralytics HUB](https://ultralytics.com/hub). Try now! | Track experiments, hyperparameters, and results with [Weights & Biases](https://docs.wandb.ai/guides/integrations/ultralytics/) | Free forever, [Comet](https://bit.ly/yolov5-readme-comet) lets you save YOLO11 models, resume training, and interactively visualize and debug predictions | Run YOLO11 inference up to 6x faster with [Neural Magic DeepSparse](https://bit.ly/yolov5-neuralmagic) |
|
235
235
|
|
236
236
|
## <div align="center">Ultralytics HUB</div>
|
237
237
|
|
@@ -26,7 +26,7 @@ build-backend = "setuptools.build_meta"
|
|
26
26
|
[project]
|
27
27
|
name = "ultralytics"
|
28
28
|
dynamic = ["version"]
|
29
|
-
description = "Ultralytics YOLO for SOTA object detection, multi-object tracking, instance segmentation, pose estimation and image classification."
|
29
|
+
description = "Ultralytics YOLO 🚀 for SOTA object detection, multi-object tracking, instance segmentation, pose estimation and image classification."
|
30
30
|
readme = "README.md"
|
31
31
|
requires-python = ">=3.8"
|
32
32
|
license = { "text" = "AGPL-3.0" }
|
@@ -17,10 +17,15 @@ def test_major_solutions():
|
|
17
17
|
cap = cv2.VideoCapture("solutions_ci_demo.mp4")
|
18
18
|
assert cap.isOpened(), "Error reading video file"
|
19
19
|
region_points = [(20, 400), (1080, 404), (1080, 360), (20, 360)]
|
20
|
-
counter = solutions.ObjectCounter(region=region_points, model="yolo11n.pt", show=False)
|
21
|
-
heatmap = solutions.Heatmap(colormap=cv2.COLORMAP_PARULA, model="yolo11n.pt", show=False)
|
22
|
-
speed = solutions.SpeedEstimator(region=region_points, model="yolo11n.pt", show=False)
|
23
|
-
queue = solutions.QueueManager(region=region_points, model="yolo11n.pt", show=False)
|
20
|
+
counter = solutions.ObjectCounter(region=region_points, model="yolo11n.pt", show=False) # Test object counter
|
21
|
+
heatmap = solutions.Heatmap(colormap=cv2.COLORMAP_PARULA, model="yolo11n.pt", show=False) # Test heatmaps
|
22
|
+
speed = solutions.SpeedEstimator(region=region_points, model="yolo11n.pt", show=False) # Test queue manager
|
23
|
+
queue = solutions.QueueManager(region=region_points, model="yolo11n.pt", show=False) # Test speed estimation
|
24
|
+
line_analytics = solutions.Analytics(analytics_type="line", model="yolo11n.pt", show=False) # line analytics
|
25
|
+
pie_analytics = solutions.Analytics(analytics_type="pie", model="yolo11n.pt", show=False) # line analytics
|
26
|
+
bar_analytics = solutions.Analytics(analytics_type="bar", model="yolo11n.pt", show=False) # line analytics
|
27
|
+
area_analytics = solutions.Analytics(analytics_type="area", model="yolo11n.pt", show=False) # line analytics
|
28
|
+
frame_count = 0 # Required for analytics
|
24
29
|
while cap.isOpened():
|
25
30
|
success, im0 = cap.read()
|
26
31
|
if not success:
|
@@ -30,24 +35,23 @@ def test_major_solutions():
|
|
30
35
|
_ = heatmap.generate_heatmap(original_im0.copy())
|
31
36
|
_ = speed.estimate_speed(original_im0.copy())
|
32
37
|
_ = queue.process_queue(original_im0.copy())
|
38
|
+
_ = line_analytics.process_data(original_im0.copy(), frame_count)
|
39
|
+
_ = pie_analytics.process_data(original_im0.copy(), frame_count)
|
40
|
+
_ = bar_analytics.process_data(original_im0.copy(), frame_count)
|
41
|
+
_ = area_analytics.process_data(original_im0.copy(), frame_count)
|
33
42
|
cap.release()
|
34
|
-
cv2.destroyAllWindows()
|
35
|
-
|
36
43
|
|
37
|
-
|
38
|
-
def test_aigym():
|
39
|
-
"""Test the workouts monitoring solution."""
|
44
|
+
# Test workouts monitoring
|
40
45
|
safe_download(url=WORKOUTS_SOLUTION_DEMO)
|
41
|
-
|
42
|
-
assert
|
43
|
-
gym = solutions.AIGym(line_width=2, kpts=[5, 11, 13])
|
44
|
-
while
|
45
|
-
success, im0 =
|
46
|
+
cap1 = cv2.VideoCapture("solution_ci_pose_demo.mp4")
|
47
|
+
assert cap1.isOpened(), "Error reading video file"
|
48
|
+
gym = solutions.AIGym(line_width=2, kpts=[5, 11, 13], show=False)
|
49
|
+
while cap1.isOpened():
|
50
|
+
success, im0 = cap1.read()
|
46
51
|
if not success:
|
47
52
|
break
|
48
53
|
_ = gym.monitor(im0)
|
49
|
-
|
50
|
-
cv2.destroyAllWindows()
|
54
|
+
cap1.release()
|
51
55
|
|
52
56
|
|
53
57
|
@pytest.mark.slow
|
@@ -438,34 +438,60 @@ def check_dict_alignment(base: Dict, custom: Dict, e=None):
|
|
438
438
|
|
439
439
|
def merge_equals_args(args: List[str]) -> List[str]:
|
440
440
|
"""
|
441
|
-
Merges arguments around isolated '=' in a list of strings
|
442
|
-
|
443
|
-
|
444
|
-
|
441
|
+
Merges arguments around isolated '=' in a list of strings and joins fragments with brackets.
|
442
|
+
|
443
|
+
This function handles the following cases:
|
444
|
+
1. ['arg', '=', 'val'] becomes ['arg=val']
|
445
|
+
2. ['arg=', 'val'] becomes ['arg=val']
|
446
|
+
3. ['arg', '=val'] becomes ['arg=val']
|
447
|
+
4. Joins fragments with brackets, e.g., ['imgsz=[3,', '640,', '640]'] becomes ['imgsz=[3,640,640]']
|
445
448
|
|
446
449
|
Args:
|
447
|
-
args (List[str]): A list of strings where each element represents an argument.
|
450
|
+
args (List[str]): A list of strings where each element represents an argument or fragment.
|
448
451
|
|
449
452
|
Returns:
|
450
|
-
|
453
|
+
List[str]: A list of strings where the arguments around isolated '=' are merged and fragments with brackets are joined.
|
451
454
|
|
452
455
|
Examples:
|
453
|
-
>>> args = ["arg1", "=", "value", "arg2=", "value2", "arg3", "=value3"]
|
454
|
-
>>>
|
455
|
-
['arg1=value', 'arg2=value2', 'arg3=value3']
|
456
|
+
>>> args = ["arg1", "=", "value", "arg2=", "value2", "arg3", "=value3", "imgsz=[3,", "640,", "640]"]
|
457
|
+
>>> merge_and_join_args(args)
|
458
|
+
['arg1=value', 'arg2=value2', 'arg3=value3', 'imgsz=[3,640,640]']
|
456
459
|
"""
|
457
460
|
new_args = []
|
458
|
-
|
461
|
+
current = ""
|
462
|
+
depth = 0
|
463
|
+
|
464
|
+
i = 0
|
465
|
+
while i < len(args):
|
466
|
+
arg = args[i]
|
467
|
+
|
468
|
+
# Handle equals sign merging
|
459
469
|
if arg == "=" and 0 < i < len(args) - 1: # merge ['arg', '=', 'val']
|
460
470
|
new_args[-1] += f"={args[i + 1]}"
|
461
|
-
|
471
|
+
i += 2
|
472
|
+
continue
|
462
473
|
elif arg.endswith("=") and i < len(args) - 1 and "=" not in args[i + 1]: # merge ['arg=', 'val']
|
463
474
|
new_args.append(f"{arg}{args[i + 1]}")
|
464
|
-
|
475
|
+
i += 2
|
476
|
+
continue
|
465
477
|
elif arg.startswith("=") and i > 0: # merge ['arg', '=val']
|
466
478
|
new_args[-1] += arg
|
467
|
-
|
468
|
-
|
479
|
+
i += 1
|
480
|
+
continue
|
481
|
+
|
482
|
+
# Handle bracket joining
|
483
|
+
depth += arg.count("[") - arg.count("]")
|
484
|
+
current += arg
|
485
|
+
if depth == 0:
|
486
|
+
new_args.append(current)
|
487
|
+
current = ""
|
488
|
+
|
489
|
+
i += 1
|
490
|
+
|
491
|
+
# Append any remaining current string
|
492
|
+
if current:
|
493
|
+
new_args.append(current)
|
494
|
+
|
469
495
|
return new_args
|
470
496
|
|
471
497
|
|
@@ -15,3 +15,4 @@ down_angle: 90 # Workouts down_angle for counts, 90 is default value. You can ch
|
|
15
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
16
|
colormap: # Colormap for heatmap, Only OPENCV supported colormaps can be used. By default COLORMAP_PARULA will be used for visualization.
|
17
17
|
analytics_type: "line" # Analytics type i.e "line", "pie", "bar" or "area" charts. By default, "line" analytics will be used for processing.
|
18
|
+
json_file: # parking system regions file path.
|
@@ -13,9 +13,6 @@ from tqdm import tqdm
|
|
13
13
|
from ultralytics.data.utils import exif_size, img2label_paths
|
14
14
|
from ultralytics.utils.checks import check_requirements
|
15
15
|
|
16
|
-
check_requirements("shapely")
|
17
|
-
from shapely.geometry import Polygon
|
18
|
-
|
19
16
|
|
20
17
|
def bbox_iof(polygon1, bbox2, eps=1e-6):
|
21
18
|
"""
|
@@ -33,6 +30,9 @@ def bbox_iof(polygon1, bbox2, eps=1e-6):
|
|
33
30
|
Polygon format: [x1, y1, x2, y2, x3, y3, x4, y4].
|
34
31
|
Bounding box format: [x_min, y_min, x_max, y_max].
|
35
32
|
"""
|
33
|
+
check_requirements("shapely")
|
34
|
+
from shapely.geometry import Polygon
|
35
|
+
|
36
36
|
polygon1 = polygon1.reshape(-1, 4, 2)
|
37
37
|
lt_point = np.min(polygon1, axis=-2) # left-top
|
38
38
|
rb_point = np.max(polygon1, axis=-2) # right-bottom
|
@@ -28,6 +28,7 @@ class Detect(nn.Module):
|
|
28
28
|
shape = None
|
29
29
|
anchors = torch.empty(0) # init
|
30
30
|
strides = torch.empty(0) # init
|
31
|
+
legacy = False # backward compatibility for v3/v5/v8/v9 models
|
31
32
|
|
32
33
|
def __init__(self, nc=80, ch=()):
|
33
34
|
"""Initializes the YOLO detection layer with specified number of classes and channels."""
|
@@ -41,13 +42,17 @@ class Detect(nn.Module):
|
|
41
42
|
self.cv2 = nn.ModuleList(
|
42
43
|
nn.Sequential(Conv(x, c2, 3), Conv(c2, c2, 3), nn.Conv2d(c2, 4 * self.reg_max, 1)) for x in ch
|
43
44
|
)
|
44
|
-
self.cv3 =
|
45
|
-
nn.Sequential(
|
46
|
-
|
47
|
-
|
48
|
-
nn.
|
45
|
+
self.cv3 = (
|
46
|
+
nn.ModuleList(nn.Sequential(Conv(x, c3, 3), Conv(c3, c3, 3), nn.Conv2d(c3, self.nc, 1)) for x in ch)
|
47
|
+
if self.legacy
|
48
|
+
else nn.ModuleList(
|
49
|
+
nn.Sequential(
|
50
|
+
nn.Sequential(DWConv(x, x, 3), Conv(x, c3, 1)),
|
51
|
+
nn.Sequential(DWConv(c3, c3, 3), Conv(c3, c3, 1)),
|
52
|
+
nn.Conv2d(c3, self.nc, 1),
|
53
|
+
)
|
54
|
+
for x in ch
|
49
55
|
)
|
50
|
-
for x in ch
|
51
56
|
)
|
52
57
|
self.dfl = DFL(self.reg_max) if self.reg_max > 1 else nn.Identity()
|
53
58
|
|
@@ -936,6 +936,7 @@ def parse_model(d, ch, verbose=True): # model_dict, input_channels(3)
|
|
936
936
|
import ast
|
937
937
|
|
938
938
|
# Args
|
939
|
+
legacy = True # backward compatibility for v3/v5/v8/v9 models
|
939
940
|
max_channels = float("inf")
|
940
941
|
nc, act, scales = (d.get(x) for x in ("nc", "activation", "scales"))
|
941
942
|
depth, width, kpt_shape = (d.get(x, 1.0) for x in ("depth_multiple", "width_multiple", "kpt_shape"))
|
@@ -1027,8 +1028,10 @@ def parse_model(d, ch, verbose=True): # model_dict, input_channels(3)
|
|
1027
1028
|
}:
|
1028
1029
|
args.insert(2, n) # number of repeats
|
1029
1030
|
n = 1
|
1030
|
-
if m is C3k2
|
1031
|
-
|
1031
|
+
if m is C3k2: # for M/L/X sizes
|
1032
|
+
legacy = False
|
1033
|
+
if scale in "mlx":
|
1034
|
+
args[3] = True
|
1032
1035
|
elif m is AIFI:
|
1033
1036
|
args = [ch[f], *args]
|
1034
1037
|
elif m in {HGStem, HGBlock}:
|
@@ -1047,6 +1050,8 @@ def parse_model(d, ch, verbose=True): # model_dict, input_channels(3)
|
|
1047
1050
|
args.append([ch[x] for x in f])
|
1048
1051
|
if m is Segment:
|
1049
1052
|
args[2] = make_divisible(min(args[2], max_channels) * width, 8)
|
1053
|
+
if m in {Detect, Segment, Pose, OBB}:
|
1054
|
+
m.legacy = legacy
|
1050
1055
|
elif m is RTDETRDecoder: # special case, channels arg must be passed in index 1
|
1051
1056
|
args.insert(1, [ch[x] for x in f])
|
1052
1057
|
elif m is CBLinear:
|
@@ -1,16 +1,40 @@
|
|
1
1
|
# Ultralytics YOLO 🚀, AGPL-3.0 license
|
2
2
|
|
3
|
-
from ultralytics.solutions.solutions import BaseSolution
|
3
|
+
from ultralytics.solutions.solutions import BaseSolution
|
4
4
|
from ultralytics.utils.plotting import Annotator
|
5
5
|
|
6
6
|
|
7
7
|
class AIGym(BaseSolution):
|
8
|
-
"""
|
8
|
+
"""
|
9
|
+
A class to manage gym steps of people in a real-time video stream based on their poses.
|
10
|
+
|
11
|
+
This class extends BaseSolution to monitor workouts using YOLO pose estimation models. It tracks and counts
|
12
|
+
repetitions of exercises based on predefined angle thresholds for up and down positions.
|
13
|
+
|
14
|
+
Attributes:
|
15
|
+
count (List[int]): Repetition counts for each detected person.
|
16
|
+
angle (List[float]): Current angle of the tracked body part for each person.
|
17
|
+
stage (List[str]): Current exercise stage ('up', 'down', or '-') for each person.
|
18
|
+
initial_stage (str | None): Initial stage of the exercise.
|
19
|
+
up_angle (float): Angle threshold for considering the 'up' position of an exercise.
|
20
|
+
down_angle (float): Angle threshold for considering the 'down' position of an exercise.
|
21
|
+
kpts (List[int]): Indices of keypoints used for angle calculation.
|
22
|
+
lw (int): Line width for drawing annotations.
|
23
|
+
annotator (Annotator): Object for drawing annotations on the image.
|
24
|
+
|
25
|
+
Methods:
|
26
|
+
monitor: Processes a frame to detect poses, calculate angles, and count repetitions.
|
27
|
+
|
28
|
+
Examples:
|
29
|
+
>>> gym = AIGym(model="yolov8n-pose.pt")
|
30
|
+
>>> image = cv2.imread("gym_scene.jpg")
|
31
|
+
>>> processed_image = gym.monitor(image)
|
32
|
+
>>> cv2.imshow("Processed Image", processed_image)
|
33
|
+
>>> cv2.waitKey(0)
|
34
|
+
"""
|
9
35
|
|
10
36
|
def __init__(self, **kwargs):
|
11
|
-
"""
|
12
|
-
monitoring.
|
13
|
-
"""
|
37
|
+
"""Initializes AIGym for workout monitoring using pose estimation and predefined angles."""
|
14
38
|
# Check if the model name ends with '-pose'
|
15
39
|
if "model" in kwargs and "-pose" not in kwargs["model"]:
|
16
40
|
kwargs["model"] = "yolo11n-pose.pt"
|
@@ -31,12 +55,22 @@ class AIGym(BaseSolution):
|
|
31
55
|
|
32
56
|
def monitor(self, im0):
|
33
57
|
"""
|
34
|
-
|
58
|
+
Monitors workouts using Ultralytics YOLO Pose Model.
|
59
|
+
|
60
|
+
This function processes an input image to track and analyze human poses for workout monitoring. It uses
|
61
|
+
the YOLO Pose model to detect keypoints, estimate angles, and count repetitions based on predefined
|
62
|
+
angle thresholds.
|
35
63
|
|
36
64
|
Args:
|
37
|
-
im0 (ndarray):
|
38
|
-
|
39
|
-
|
65
|
+
im0 (ndarray): Input image for processing.
|
66
|
+
|
67
|
+
Returns:
|
68
|
+
(ndarray): Processed image with annotations for workout monitoring.
|
69
|
+
|
70
|
+
Examples:
|
71
|
+
>>> gym = AIGym()
|
72
|
+
>>> image = cv2.imread("workout.jpg")
|
73
|
+
>>> processed_image = gym.monitor(image)
|
40
74
|
"""
|
41
75
|
# Extract tracks
|
42
76
|
tracks = self.model.track(source=im0, persist=True, classes=self.CFG["classes"])[0]
|
@@ -12,10 +12,41 @@ from ultralytics.solutions.solutions import BaseSolution # Import a parent clas
|
|
12
12
|
|
13
13
|
|
14
14
|
class Analytics(BaseSolution):
|
15
|
-
"""
|
15
|
+
"""
|
16
|
+
A class for creating and updating various types of charts for visual analytics.
|
17
|
+
|
18
|
+
This class extends BaseSolution to provide functionality for generating line, bar, pie, and area charts
|
19
|
+
based on object detection and tracking data.
|
20
|
+
|
21
|
+
Attributes:
|
22
|
+
type (str): The type of analytics chart to generate ('line', 'bar', 'pie', or 'area').
|
23
|
+
x_label (str): Label for the x-axis.
|
24
|
+
y_label (str): Label for the y-axis.
|
25
|
+
bg_color (str): Background color of the chart frame.
|
26
|
+
fg_color (str): Foreground color of the chart frame.
|
27
|
+
title (str): Title of the chart window.
|
28
|
+
max_points (int): Maximum number of data points to display on the chart.
|
29
|
+
fontsize (int): Font size for text display.
|
30
|
+
color_cycle (cycle): Cyclic iterator for chart colors.
|
31
|
+
total_counts (int): Total count of detected objects (used for line charts).
|
32
|
+
clswise_count (Dict[str, int]): Dictionary for class-wise object counts.
|
33
|
+
fig (Figure): Matplotlib figure object for the chart.
|
34
|
+
ax (Axes): Matplotlib axes object for the chart.
|
35
|
+
canvas (FigureCanvas): Canvas for rendering the chart.
|
36
|
+
|
37
|
+
Methods:
|
38
|
+
process_data: Processes image data and updates the chart.
|
39
|
+
update_graph: Updates the chart with new data points.
|
40
|
+
|
41
|
+
Examples:
|
42
|
+
>>> analytics = Analytics(analytics_type="line")
|
43
|
+
>>> frame = cv2.imread("image.jpg")
|
44
|
+
>>> processed_frame = analytics.process_data(frame, frame_number=1)
|
45
|
+
>>> cv2.imshow("Analytics", processed_frame)
|
46
|
+
"""
|
16
47
|
|
17
48
|
def __init__(self, **kwargs):
|
18
|
-
"""Initialize
|
49
|
+
"""Initialize Analytics class with various chart types for visual data representation."""
|
19
50
|
super().__init__(**kwargs)
|
20
51
|
|
21
52
|
self.type = self.CFG["analytics_type"] # extract type of analytics
|
@@ -31,8 +62,8 @@ class Analytics(BaseSolution):
|
|
31
62
|
figsize = (19.2, 10.8) # Set output image size 1920 * 1080
|
32
63
|
self.color_cycle = cycle(["#DD00BA", "#042AFF", "#FF4447", "#7D24FF", "#BD00FF"])
|
33
64
|
|
34
|
-
self.total_counts = 0 # count variable for storing total counts i.e for line
|
35
|
-
self.clswise_count = {} # dictionary for
|
65
|
+
self.total_counts = 0 # count variable for storing total counts i.e. for line
|
66
|
+
self.clswise_count = {} # dictionary for class-wise counts
|
36
67
|
|
37
68
|
# Ensure line and area chart
|
38
69
|
if self.type in {"line", "area"}:
|
@@ -48,15 +79,28 @@ class Analytics(BaseSolution):
|
|
48
79
|
self.canvas = FigureCanvas(self.fig) # Set common axis properties
|
49
80
|
self.ax.set_facecolor(self.bg_color)
|
50
81
|
self.color_mapping = {}
|
51
|
-
|
82
|
+
|
83
|
+
if self.type == "pie": # Ensure pie chart is circular
|
84
|
+
self.ax.axis("equal")
|
52
85
|
|
53
86
|
def process_data(self, im0, frame_number):
|
54
87
|
"""
|
55
|
-
|
88
|
+
Processes image data and runs object tracking to update analytics charts.
|
56
89
|
|
57
90
|
Args:
|
58
|
-
im0 (ndarray): Input image for processing.
|
59
|
-
frame_number (int): Video frame
|
91
|
+
im0 (np.ndarray): Input image for processing.
|
92
|
+
frame_number (int): Video frame number for plotting the data.
|
93
|
+
|
94
|
+
Returns:
|
95
|
+
(np.ndarray): Processed image with updated analytics chart.
|
96
|
+
|
97
|
+
Raises:
|
98
|
+
ModuleNotFoundError: If an unsupported chart type is specified.
|
99
|
+
|
100
|
+
Examples:
|
101
|
+
>>> analytics = Analytics(analytics_type="line")
|
102
|
+
>>> frame = np.zeros((480, 640, 3), dtype=np.uint8)
|
103
|
+
>>> processed_frame = analytics.process_data(frame, frame_number=1)
|
60
104
|
"""
|
61
105
|
self.extract_tracks(im0) # Extract tracks
|
62
106
|
|
@@ -79,13 +123,22 @@ class Analytics(BaseSolution):
|
|
79
123
|
|
80
124
|
def update_graph(self, frame_number, count_dict=None, plot="line"):
|
81
125
|
"""
|
82
|
-
|
126
|
+
Updates the graph with new data for single or multiple classes.
|
83
127
|
|
84
128
|
Args:
|
85
129
|
frame_number (int): The current frame number.
|
86
|
-
count_dict (
|
87
|
-
|
88
|
-
plot (str): Type of the plot
|
130
|
+
count_dict (Dict[str, int] | None): Dictionary with class names as keys and counts as values for multiple
|
131
|
+
classes. If None, updates a single line graph.
|
132
|
+
plot (str): Type of the plot. Options are 'line', 'bar', 'pie', or 'area'.
|
133
|
+
|
134
|
+
Returns:
|
135
|
+
(np.ndarray): Updated image containing the graph.
|
136
|
+
|
137
|
+
Examples:
|
138
|
+
>>> analytics = Analytics()
|
139
|
+
>>> frame_number = 10
|
140
|
+
>>> count_dict = {"person": 5, "car": 3}
|
141
|
+
>>> updated_image = analytics.update_graph(frame_number, count_dict, plot="bar")
|
89
142
|
"""
|
90
143
|
if count_dict is None:
|
91
144
|
# Single line update
|