ultralytics 8.2.17__tar.gz → 8.2.18__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.2.17 → ultralytics-8.2.18}/PKG-INFO +1 -1
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/__init__.py +1 -1
- ultralytics-8.2.18/ultralytics/solutions/__init__.py +19 -0
- ultralytics-8.2.18/ultralytics/solutions/ai_gym.py +124 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/solutions/distance_calculation.py +66 -71
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/solutions/heatmap.py +95 -133
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/solutions/object_counter.py +62 -82
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/solutions/parking_management.py +22 -9
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/solutions/queue_management.py +63 -82
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/solutions/speed_estimation.py +50 -68
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/utils/plotting.py +40 -42
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics.egg-info/PKG-INFO +1 -1
- ultralytics-8.2.17/ultralytics/solutions/ai_gym.py +0 -150
- ultralytics-8.2.17/ultralytics/trackers/utils/__init__.py +0 -1
- {ultralytics-8.2.17 → ultralytics-8.2.18}/LICENSE +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/README.md +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/pyproject.toml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/setup.cfg +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/tests/test_cli.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/tests/test_cuda.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/tests/test_engine.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/tests/test_explorer.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/tests/test_exports.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/tests/test_integrations.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/tests/test_python.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/assets/bus.jpg +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/assets/zidane.jpg +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/__init__.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/datasets/VOC.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/datasets/coco.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/datasets/coco128.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/datasets/coco8.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/datasets/dota8.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/datasets/lvis.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/datasets/xView.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/default.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/trackers/botsort.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/data/__init__.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/data/annotator.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/data/augment.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/data/base.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/data/build.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/data/converter.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/data/dataset.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/data/explorer/__init__.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/data/explorer/explorer.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/data/explorer/gui/__init__.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/data/explorer/gui/dash.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/data/explorer/utils.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/data/loaders.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/data/split_dota.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/data/utils.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/engine/__init__.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/engine/exporter.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/engine/model.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/engine/predictor.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/engine/results.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/engine/trainer.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/engine/tuner.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/engine/validator.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/hub/__init__.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/hub/auth.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/hub/session.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/hub/utils.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/__init__.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/fastsam/__init__.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/fastsam/model.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/fastsam/predict.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/fastsam/prompt.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/fastsam/utils.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/fastsam/val.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/nas/__init__.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/nas/model.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/nas/predict.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/nas/val.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/rtdetr/__init__.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/rtdetr/model.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/rtdetr/predict.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/rtdetr/train.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/rtdetr/val.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/sam/__init__.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/sam/amg.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/sam/build.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/sam/model.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/sam/modules/__init__.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/sam/modules/decoders.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/sam/modules/encoders.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/sam/modules/sam.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/sam/modules/transformer.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/sam/predict.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/utils/__init__.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/utils/loss.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/utils/ops.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/yolo/__init__.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/yolo/classify/__init__.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/yolo/classify/predict.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/yolo/classify/train.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/yolo/classify/val.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/yolo/detect/__init__.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/yolo/detect/predict.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/yolo/detect/train.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/yolo/detect/val.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/yolo/model.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/yolo/obb/__init__.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/yolo/obb/predict.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/yolo/obb/train.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/yolo/obb/val.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/yolo/pose/__init__.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/yolo/pose/predict.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/yolo/pose/train.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/yolo/pose/val.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/yolo/segment/__init__.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/yolo/segment/predict.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/yolo/segment/train.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/yolo/segment/val.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/yolo/world/__init__.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/yolo/world/train.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/models/yolo/world/train_world.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/nn/__init__.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/nn/autobackend.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/nn/modules/__init__.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/nn/modules/block.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/nn/modules/conv.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/nn/modules/head.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/nn/modules/transformer.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/nn/modules/utils.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/nn/tasks.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/trackers/__init__.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/trackers/basetrack.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/trackers/bot_sort.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/trackers/byte_tracker.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/trackers/track.py +0 -0
- {ultralytics-8.2.17/ultralytics/solutions → ultralytics-8.2.18/ultralytics/trackers/utils}/__init__.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/trackers/utils/gmc.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/trackers/utils/kalman_filter.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/trackers/utils/matching.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/utils/__init__.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/utils/autobatch.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/utils/benchmarks.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/utils/callbacks/__init__.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/utils/callbacks/base.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/utils/callbacks/clearml.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/utils/callbacks/comet.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/utils/callbacks/dvc.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/utils/callbacks/hub.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/utils/callbacks/mlflow.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/utils/callbacks/neptune.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/utils/callbacks/raytune.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/utils/callbacks/tensorboard.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/utils/callbacks/wb.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/utils/checks.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/utils/dist.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/utils/downloads.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/utils/errors.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/utils/files.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/utils/instance.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/utils/loss.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/utils/metrics.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/utils/ops.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/utils/patches.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/utils/tal.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/utils/torch_utils.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/utils/triton.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics/utils/tuner.py +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics.egg-info/SOURCES.txt +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics.egg-info/dependency_links.txt +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics.egg-info/entry_points.txt +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/ultralytics.egg-info/requires.txt +0 -0
- {ultralytics-8.2.17 → ultralytics-8.2.18}/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.2.
|
|
3
|
+
Version: 8.2.18
|
|
4
4
|
Summary: Ultralytics YOLOv8 for SOTA object detection, multi-object tracking, instance segmentation, pose estimation and image classification.
|
|
5
5
|
Author: Glenn Jocher, Ayush Chaurasia, Jing Qiu
|
|
6
6
|
Maintainer: Glenn Jocher, Ayush Chaurasia, Jing Qiu
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Ultralytics YOLO 🚀, AGPL-3.0 license
|
|
2
|
+
|
|
3
|
+
from .ai_gym import AIGym
|
|
4
|
+
from .distance_calculation import DistanceCalculation
|
|
5
|
+
from .heatmap import Heatmap
|
|
6
|
+
from .object_counter import ObjectCounter
|
|
7
|
+
from .parking_management import ParkingManagement
|
|
8
|
+
from .queue_management import QueueManager
|
|
9
|
+
from .speed_estimation import SpeedEstimator
|
|
10
|
+
|
|
11
|
+
__all__ = (
|
|
12
|
+
"AIGym",
|
|
13
|
+
"DistanceCalculation",
|
|
14
|
+
"Heatmap",
|
|
15
|
+
"ObjectCounter",
|
|
16
|
+
"ParkingManagement",
|
|
17
|
+
"QueueManager",
|
|
18
|
+
"SpeedEstimator",
|
|
19
|
+
)
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# Ultralytics YOLO 🚀, AGPL-3.0 license
|
|
2
|
+
|
|
3
|
+
import cv2
|
|
4
|
+
|
|
5
|
+
from ultralytics.utils.checks import check_imshow
|
|
6
|
+
from ultralytics.utils.plotting import Annotator
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class AIGym:
|
|
10
|
+
"""A class to manage the gym steps of people in a real-time video stream based on their poses."""
|
|
11
|
+
|
|
12
|
+
def __init__(
|
|
13
|
+
self,
|
|
14
|
+
kpts_to_check,
|
|
15
|
+
line_thickness=2,
|
|
16
|
+
view_img=False,
|
|
17
|
+
pose_up_angle=145.0,
|
|
18
|
+
pose_down_angle=90.0,
|
|
19
|
+
pose_type="pullup",
|
|
20
|
+
):
|
|
21
|
+
"""
|
|
22
|
+
Initializes the AIGym class with the specified parameters.
|
|
23
|
+
|
|
24
|
+
Args:
|
|
25
|
+
kpts_to_check (list): Indices of keypoints to check.
|
|
26
|
+
line_thickness (int, optional): Thickness of the lines drawn. Defaults to 2.
|
|
27
|
+
view_img (bool, optional): Flag to display the image. Defaults to False.
|
|
28
|
+
pose_up_angle (float, optional): Angle threshold for the 'up' pose. Defaults to 145.0.
|
|
29
|
+
pose_down_angle (float, optional): Angle threshold for the 'down' pose. Defaults to 90.0.
|
|
30
|
+
pose_type (str, optional): Type of pose to detect ('pullup', 'pushup', 'abworkout'). Defaults to "pullup".
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
# Image and line thickness
|
|
34
|
+
self.im0 = None
|
|
35
|
+
self.tf = line_thickness
|
|
36
|
+
|
|
37
|
+
# Keypoints and count information
|
|
38
|
+
self.keypoints = None
|
|
39
|
+
self.poseup_angle = pose_up_angle
|
|
40
|
+
self.posedown_angle = pose_down_angle
|
|
41
|
+
self.threshold = 0.001
|
|
42
|
+
|
|
43
|
+
# Store stage, count and angle information
|
|
44
|
+
self.angle = None
|
|
45
|
+
self.count = None
|
|
46
|
+
self.stage = None
|
|
47
|
+
self.pose_type = pose_type
|
|
48
|
+
self.kpts_to_check = kpts_to_check
|
|
49
|
+
|
|
50
|
+
# Visual Information
|
|
51
|
+
self.view_img = view_img
|
|
52
|
+
self.annotator = None
|
|
53
|
+
|
|
54
|
+
# Check if environment supports imshow
|
|
55
|
+
self.env_check = check_imshow(warn=True)
|
|
56
|
+
|
|
57
|
+
def start_counting(self, im0, results, frame_count):
|
|
58
|
+
"""
|
|
59
|
+
Function used to count the gym steps.
|
|
60
|
+
|
|
61
|
+
Args:
|
|
62
|
+
im0 (ndarray): Current frame from the video stream.
|
|
63
|
+
results (list): Pose estimation data.
|
|
64
|
+
frame_count (int): Current frame count.
|
|
65
|
+
"""
|
|
66
|
+
|
|
67
|
+
self.im0 = im0
|
|
68
|
+
|
|
69
|
+
# Initialize count, angle, and stage lists on the first frame
|
|
70
|
+
if frame_count == 1:
|
|
71
|
+
self.count = [0] * len(results[0])
|
|
72
|
+
self.angle = [0] * len(results[0])
|
|
73
|
+
self.stage = ["-" for _ in results[0]]
|
|
74
|
+
|
|
75
|
+
self.keypoints = results[0].keypoints.data
|
|
76
|
+
self.annotator = Annotator(im0, line_width=2)
|
|
77
|
+
|
|
78
|
+
for ind, k in enumerate(reversed(self.keypoints)):
|
|
79
|
+
# Estimate angle and draw specific points based on pose type
|
|
80
|
+
if self.pose_type in {"pushup", "pullup", "abworkout"}:
|
|
81
|
+
self.angle[ind] = self.annotator.estimate_pose_angle(
|
|
82
|
+
k[int(self.kpts_to_check[0])].cpu(),
|
|
83
|
+
k[int(self.kpts_to_check[1])].cpu(),
|
|
84
|
+
k[int(self.kpts_to_check[2])].cpu(),
|
|
85
|
+
)
|
|
86
|
+
self.im0 = self.annotator.draw_specific_points(k, self.kpts_to_check, shape=(640, 640), radius=10)
|
|
87
|
+
|
|
88
|
+
# Check and update pose stages and counts based on angle
|
|
89
|
+
if self.pose_type in {"abworkout", "pullup"}:
|
|
90
|
+
if self.angle[ind] > self.poseup_angle:
|
|
91
|
+
self.stage[ind] = "down"
|
|
92
|
+
if self.angle[ind] < self.posedown_angle and self.stage[ind] == "down":
|
|
93
|
+
self.stage[ind] = "up"
|
|
94
|
+
self.count[ind] += 1
|
|
95
|
+
|
|
96
|
+
elif self.pose_type == "pushup":
|
|
97
|
+
if self.angle[ind] > self.poseup_angle:
|
|
98
|
+
self.stage[ind] = "up"
|
|
99
|
+
if self.angle[ind] < self.posedown_angle and self.stage[ind] == "up":
|
|
100
|
+
self.stage[ind] = "down"
|
|
101
|
+
self.count[ind] += 1
|
|
102
|
+
|
|
103
|
+
self.annotator.plot_angle_and_count_and_stage(
|
|
104
|
+
angle_text=self.angle[ind],
|
|
105
|
+
count_text=self.count[ind],
|
|
106
|
+
stage_text=self.stage[ind],
|
|
107
|
+
center_kpt=k[int(self.kpts_to_check[1])],
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
# Draw keypoints
|
|
111
|
+
self.annotator.kpts(k, shape=(640, 640), radius=1, kpt_line=True)
|
|
112
|
+
|
|
113
|
+
# Display the image if environment supports it and view_img is True
|
|
114
|
+
if self.env_check and self.view_img:
|
|
115
|
+
cv2.imshow("Ultralytics YOLOv8 AI GYM", self.im0)
|
|
116
|
+
if cv2.waitKey(1) & 0xFF == ord("q"):
|
|
117
|
+
return
|
|
118
|
+
|
|
119
|
+
return self.im0
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
if __name__ == "__main__":
|
|
123
|
+
kpts_to_check = [0, 1, 2] # example keypoints
|
|
124
|
+
aigym = AIGym(kpts_to_check)
|
|
@@ -9,94 +9,78 @@ from ultralytics.utils.plotting import Annotator, colors
|
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
class DistanceCalculation:
|
|
12
|
-
"""A class to calculate distance between two objects in real-time video stream based on their tracks."""
|
|
12
|
+
"""A class to calculate distance between two objects in a real-time video stream based on their tracks."""
|
|
13
13
|
|
|
14
|
-
def __init__(
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
def __init__(
|
|
15
|
+
self,
|
|
16
|
+
names,
|
|
17
|
+
pixels_per_meter=10,
|
|
18
|
+
view_img=False,
|
|
19
|
+
line_thickness=2,
|
|
20
|
+
line_color=(255, 255, 0),
|
|
21
|
+
centroid_color=(255, 0, 255),
|
|
22
|
+
):
|
|
17
23
|
"""
|
|
24
|
+
Initializes the DistanceCalculation class with the given parameters.
|
|
18
25
|
|
|
19
|
-
|
|
26
|
+
Args:
|
|
27
|
+
names (dict): Dictionary mapping class indices to class names.
|
|
28
|
+
pixels_per_meter (int, optional): Conversion factor from pixels to meters. Defaults to 10.
|
|
29
|
+
view_img (bool, optional): Flag to indicate if the video stream should be displayed. Defaults to False.
|
|
30
|
+
line_thickness (int, optional): Thickness of the lines drawn on the image. Defaults to 2.
|
|
31
|
+
line_color (tuple, optional): Color of the lines drawn on the image (BGR format). Defaults to (255, 255, 0).
|
|
32
|
+
centroid_color (tuple, optional): Color of the centroids drawn (BGR format). Defaults to (255, 0, 255).
|
|
33
|
+
"""
|
|
34
|
+
# Visual & image information
|
|
20
35
|
self.im0 = None
|
|
21
36
|
self.annotator = None
|
|
22
|
-
self.view_img =
|
|
23
|
-
self.line_color =
|
|
24
|
-
self.centroid_color =
|
|
37
|
+
self.view_img = view_img
|
|
38
|
+
self.line_color = line_color
|
|
39
|
+
self.centroid_color = centroid_color
|
|
25
40
|
|
|
26
|
-
#
|
|
41
|
+
# Prediction & tracking information
|
|
27
42
|
self.clss = None
|
|
28
|
-
self.names =
|
|
43
|
+
self.names = names
|
|
29
44
|
self.boxes = None
|
|
30
|
-
self.line_thickness =
|
|
45
|
+
self.line_thickness = line_thickness
|
|
31
46
|
self.trk_ids = None
|
|
32
47
|
|
|
33
48
|
# Distance calculation information
|
|
34
49
|
self.centroids = []
|
|
35
|
-
self.pixel_per_meter =
|
|
50
|
+
self.pixel_per_meter = pixels_per_meter
|
|
36
51
|
|
|
37
|
-
# Mouse event
|
|
52
|
+
# Mouse event information
|
|
38
53
|
self.left_mouse_count = 0
|
|
39
54
|
self.selected_boxes = {}
|
|
40
55
|
|
|
41
|
-
# Check if environment
|
|
56
|
+
# Check if environment supports imshow
|
|
42
57
|
self.env_check = check_imshow(warn=True)
|
|
43
58
|
|
|
44
|
-
def set_args(
|
|
45
|
-
self,
|
|
46
|
-
names,
|
|
47
|
-
pixels_per_meter=10,
|
|
48
|
-
view_img=False,
|
|
49
|
-
line_thickness=2,
|
|
50
|
-
line_color=(255, 255, 0),
|
|
51
|
-
centroid_color=(255, 0, 255),
|
|
52
|
-
):
|
|
53
|
-
"""
|
|
54
|
-
Configures the distance calculation and display parameters.
|
|
55
|
-
|
|
56
|
-
Args:
|
|
57
|
-
names (dict): object detection classes names
|
|
58
|
-
pixels_per_meter (int): Number of pixels in meter
|
|
59
|
-
view_img (bool): Flag indicating frame display
|
|
60
|
-
line_thickness (int): Line thickness for bounding boxes.
|
|
61
|
-
line_color (RGB): color of centroids line
|
|
62
|
-
centroid_color (RGB): colors of bbox centroids
|
|
63
|
-
"""
|
|
64
|
-
self.names = names
|
|
65
|
-
self.pixel_per_meter = pixels_per_meter
|
|
66
|
-
self.view_img = view_img
|
|
67
|
-
self.line_thickness = line_thickness
|
|
68
|
-
self.line_color = line_color
|
|
69
|
-
self.centroid_color = centroid_color
|
|
70
|
-
|
|
71
59
|
def mouse_event_for_distance(self, event, x, y, flags, param):
|
|
72
60
|
"""
|
|
73
|
-
|
|
61
|
+
Handles mouse events to select regions in a real-time video stream.
|
|
74
62
|
|
|
75
63
|
Args:
|
|
76
|
-
event (int):
|
|
77
|
-
x (int):
|
|
78
|
-
y (int):
|
|
79
|
-
flags (int):
|
|
80
|
-
|
|
81
|
-
param (dict): Additional parameters you may want to pass to the function.
|
|
64
|
+
event (int): Type of mouse event (e.g., cv2.EVENT_MOUSEMOVE, cv2.EVENT_LBUTTONDOWN, etc.).
|
|
65
|
+
x (int): X-coordinate of the mouse pointer.
|
|
66
|
+
y (int): Y-coordinate of the mouse pointer.
|
|
67
|
+
flags (int): Flags associated with the event (e.g., cv2.EVENT_FLAG_CTRLKEY, cv2.EVENT_FLAG_SHIFTKEY, etc.).
|
|
68
|
+
param (dict): Additional parameters passed to the function.
|
|
82
69
|
"""
|
|
83
|
-
global selected_boxes
|
|
84
|
-
global left_mouse_count
|
|
85
70
|
if event == cv2.EVENT_LBUTTONDOWN:
|
|
86
71
|
self.left_mouse_count += 1
|
|
87
72
|
if self.left_mouse_count <= 2:
|
|
88
73
|
for box, track_id in zip(self.boxes, self.trk_ids):
|
|
89
74
|
if box[0] < x < box[2] and box[1] < y < box[3] and track_id not in self.selected_boxes:
|
|
90
|
-
self.selected_boxes[track_id] = []
|
|
91
75
|
self.selected_boxes[track_id] = box
|
|
92
76
|
|
|
93
|
-
|
|
77
|
+
elif event == cv2.EVENT_RBUTTONDOWN:
|
|
94
78
|
self.selected_boxes = {}
|
|
95
79
|
self.left_mouse_count = 0
|
|
96
80
|
|
|
97
81
|
def extract_tracks(self, tracks):
|
|
98
82
|
"""
|
|
99
|
-
Extracts results from the provided data.
|
|
83
|
+
Extracts tracking results from the provided data.
|
|
100
84
|
|
|
101
85
|
Args:
|
|
102
86
|
tracks (list): List of tracks obtained from the object tracking process.
|
|
@@ -105,55 +89,65 @@ class DistanceCalculation:
|
|
|
105
89
|
self.clss = tracks[0].boxes.cls.cpu().tolist()
|
|
106
90
|
self.trk_ids = tracks[0].boxes.id.int().cpu().tolist()
|
|
107
91
|
|
|
108
|
-
|
|
92
|
+
@staticmethod
|
|
93
|
+
def calculate_centroid(box):
|
|
109
94
|
"""
|
|
110
|
-
|
|
95
|
+
Calculates the centroid of a bounding box.
|
|
111
96
|
|
|
112
97
|
Args:
|
|
113
|
-
box (list): Bounding box
|
|
98
|
+
box (list): Bounding box coordinates [x1, y1, x2, y2].
|
|
99
|
+
|
|
100
|
+
Returns:
|
|
101
|
+
(tuple): Centroid coordinates (x, y).
|
|
114
102
|
"""
|
|
115
103
|
return int((box[0] + box[2]) // 2), int((box[1] + box[3]) // 2)
|
|
116
104
|
|
|
117
105
|
def calculate_distance(self, centroid1, centroid2):
|
|
118
106
|
"""
|
|
119
|
-
|
|
107
|
+
Calculates the distance between two centroids.
|
|
120
108
|
|
|
121
109
|
Args:
|
|
122
|
-
centroid1 (
|
|
123
|
-
centroid2 (
|
|
110
|
+
centroid1 (tuple): Coordinates of the first centroid (x, y).
|
|
111
|
+
centroid2 (tuple): Coordinates of the second centroid (x, y).
|
|
112
|
+
|
|
113
|
+
Returns:
|
|
114
|
+
(tuple): Distance in meters and millimeters.
|
|
124
115
|
"""
|
|
125
116
|
pixel_distance = math.sqrt((centroid1[0] - centroid2[0]) ** 2 + (centroid1[1] - centroid2[1]) ** 2)
|
|
126
|
-
|
|
117
|
+
distance_m = pixel_distance / self.pixel_per_meter
|
|
118
|
+
distance_mm = distance_m * 1000
|
|
119
|
+
return distance_m, distance_mm
|
|
127
120
|
|
|
128
121
|
def start_process(self, im0, tracks):
|
|
129
122
|
"""
|
|
130
|
-
|
|
123
|
+
Processes the video frame and calculates the distance between two bounding boxes.
|
|
131
124
|
|
|
132
125
|
Args:
|
|
133
|
-
im0 (
|
|
126
|
+
im0 (ndarray): The image frame.
|
|
134
127
|
tracks (list): List of tracks obtained from the object tracking process.
|
|
128
|
+
|
|
129
|
+
Returns:
|
|
130
|
+
(ndarray): The processed image frame.
|
|
135
131
|
"""
|
|
136
132
|
self.im0 = im0
|
|
137
133
|
if tracks[0].boxes.id is None:
|
|
138
134
|
if self.view_img:
|
|
139
135
|
self.display_frames()
|
|
140
|
-
return
|
|
141
|
-
self.extract_tracks(tracks)
|
|
136
|
+
return im0
|
|
142
137
|
|
|
143
|
-
self.
|
|
138
|
+
self.extract_tracks(tracks)
|
|
139
|
+
self.annotator = Annotator(self.im0, line_width=self.line_thickness)
|
|
144
140
|
|
|
145
141
|
for box, cls, track_id in zip(self.boxes, self.clss, self.trk_ids):
|
|
146
142
|
self.annotator.box_label(box, color=colors(int(cls), True), label=self.names[int(cls)])
|
|
147
143
|
|
|
148
144
|
if len(self.selected_boxes) == 2:
|
|
149
|
-
for trk_id
|
|
145
|
+
for trk_id in self.selected_boxes.keys():
|
|
150
146
|
if trk_id == track_id:
|
|
151
147
|
self.selected_boxes[track_id] = box
|
|
152
148
|
|
|
153
149
|
if len(self.selected_boxes) == 2:
|
|
154
|
-
for trk_id
|
|
155
|
-
centroid = self.calculate_centroid(self.selected_boxes[trk_id])
|
|
156
|
-
self.centroids.append(centroid)
|
|
150
|
+
self.centroids = [self.calculate_centroid(self.selected_boxes[trk_id]) for trk_id in self.selected_boxes]
|
|
157
151
|
|
|
158
152
|
distance_m, distance_mm = self.calculate_distance(self.centroids[0], self.centroids[1])
|
|
159
153
|
self.annotator.plot_distance_and_line(
|
|
@@ -168,7 +162,7 @@ class DistanceCalculation:
|
|
|
168
162
|
return im0
|
|
169
163
|
|
|
170
164
|
def display_frames(self):
|
|
171
|
-
"""
|
|
165
|
+
"""Displays the current frame with annotations."""
|
|
172
166
|
cv2.namedWindow("Ultralytics Distance Estimation")
|
|
173
167
|
cv2.setMouseCallback("Ultralytics Distance Estimation", self.mouse_event_for_distance)
|
|
174
168
|
cv2.imshow("Ultralytics Distance Estimation", self.im0)
|
|
@@ -178,4 +172,5 @@ class DistanceCalculation:
|
|
|
178
172
|
|
|
179
173
|
|
|
180
174
|
if __name__ == "__main__":
|
|
181
|
-
|
|
175
|
+
names = {0: "person", 1: "car"} # example class names
|
|
176
|
+
distance_calculation = DistanceCalculation(names)
|