ultralytics 8.2.95__tar.gz → 8.2.96__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.95/ultralytics.egg-info → ultralytics-8.2.96}/PKG-INFO +1 -1
- {ultralytics-8.2.95 → ultralytics-8.2.96}/tests/test_python.py +4 -1
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/__init__.py +1 -1
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/engine/results.py +85 -1
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/engine/validator.py +2 -1
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/solutions/parking_management.py +81 -111
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/utils/checks.py +3 -2
- {ultralytics-8.2.95 → ultralytics-8.2.96/ultralytics.egg-info}/PKG-INFO +1 -1
- {ultralytics-8.2.95 → ultralytics-8.2.96}/LICENSE +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/README.md +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/pyproject.toml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/setup.cfg +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/tests/__init__.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/tests/conftest.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/tests/test_cli.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/tests/test_cuda.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/tests/test_engine.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/tests/test_explorer.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/tests/test_exports.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/tests/test_integrations.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/tests/test_solutions.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/assets/bus.jpg +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/assets/zidane.jpg +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/__init__.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/datasets/VOC.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/datasets/coco.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/datasets/coco128.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/datasets/coco8.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/datasets/dota8.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/datasets/lvis.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/datasets/signature.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/datasets/xView.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/default.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/models/v10/yolov10b.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/models/v10/yolov10l.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/models/v10/yolov10m.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/models/v10/yolov10n.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/models/v10/yolov10s.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/models/v10/yolov10x.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/models/v9/yolov9m.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/models/v9/yolov9s.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/models/v9/yolov9t.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/trackers/botsort.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/data/__init__.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/data/annotator.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/data/augment.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/data/base.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/data/build.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/data/converter.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/data/dataset.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/data/explorer/__init__.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/data/explorer/explorer.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/data/explorer/gui/__init__.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/data/explorer/gui/dash.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/data/explorer/utils.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/data/loaders.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/data/split_dota.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/data/utils.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/engine/__init__.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/engine/exporter.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/engine/model.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/engine/predictor.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/engine/trainer.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/engine/tuner.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/hub/__init__.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/hub/auth.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/hub/google/__init__.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/hub/session.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/hub/utils.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/__init__.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/fastsam/__init__.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/fastsam/model.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/fastsam/predict.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/fastsam/utils.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/fastsam/val.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/nas/__init__.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/nas/model.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/nas/predict.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/nas/val.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/rtdetr/__init__.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/rtdetr/model.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/rtdetr/predict.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/rtdetr/train.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/rtdetr/val.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/sam/__init__.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/sam/amg.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/sam/build.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/sam/model.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/sam/modules/__init__.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/sam/modules/blocks.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/sam/modules/decoders.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/sam/modules/encoders.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/sam/modules/memory_attention.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/sam/modules/sam.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/sam/modules/transformer.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/sam/modules/utils.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/sam/predict.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/utils/__init__.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/utils/loss.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/utils/ops.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/yolo/__init__.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/yolo/classify/__init__.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/yolo/classify/predict.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/yolo/classify/train.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/yolo/classify/val.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/yolo/detect/__init__.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/yolo/detect/predict.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/yolo/detect/train.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/yolo/detect/val.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/yolo/model.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/yolo/obb/__init__.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/yolo/obb/predict.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/yolo/obb/train.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/yolo/obb/val.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/yolo/pose/__init__.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/yolo/pose/predict.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/yolo/pose/train.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/yolo/pose/val.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/yolo/segment/__init__.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/yolo/segment/predict.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/yolo/segment/train.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/yolo/segment/val.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/yolo/world/__init__.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/yolo/world/train.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/models/yolo/world/train_world.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/nn/__init__.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/nn/autobackend.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/nn/modules/__init__.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/nn/modules/activation.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/nn/modules/block.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/nn/modules/conv.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/nn/modules/head.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/nn/modules/transformer.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/nn/modules/utils.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/nn/tasks.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/solutions/__init__.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/solutions/ai_gym.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/solutions/analytics.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/solutions/distance_calculation.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/solutions/heatmap.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/solutions/object_counter.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/solutions/queue_management.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/solutions/speed_estimation.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/solutions/streamlit_inference.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/trackers/__init__.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/trackers/basetrack.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/trackers/bot_sort.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/trackers/byte_tracker.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/trackers/track.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/trackers/utils/__init__.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/trackers/utils/gmc.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/trackers/utils/kalman_filter.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/trackers/utils/matching.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/utils/__init__.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/utils/autobatch.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/utils/benchmarks.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/utils/callbacks/__init__.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/utils/callbacks/base.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/utils/callbacks/clearml.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/utils/callbacks/comet.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/utils/callbacks/dvc.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/utils/callbacks/hub.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/utils/callbacks/mlflow.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/utils/callbacks/neptune.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/utils/callbacks/raytune.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/utils/callbacks/tensorboard.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/utils/callbacks/wb.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/utils/dist.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/utils/downloads.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/utils/errors.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/utils/files.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/utils/instance.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/utils/loss.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/utils/metrics.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/utils/ops.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/utils/patches.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/utils/plotting.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/utils/tal.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/utils/torch_utils.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/utils/triton.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/utils/tuner.py +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics.egg-info/SOURCES.txt +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics.egg-info/dependency_links.txt +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics.egg-info/entry_points.txt +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics.egg-info/requires.txt +0 -0
- {ultralytics-8.2.95 → ultralytics-8.2.96}/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.96
|
|
4
4
|
Summary: Ultralytics YOLO 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
|
|
@@ -269,7 +269,10 @@ def test_results(model):
|
|
|
269
269
|
r = r.to(device="cpu", dtype=torch.float32)
|
|
270
270
|
r.save_txt(txt_file=TMP / "runs/tests/label.txt", save_conf=True)
|
|
271
271
|
r.save_crop(save_dir=TMP / "runs/tests/crops/")
|
|
272
|
-
r.
|
|
272
|
+
r.to_json(normalize=True)
|
|
273
|
+
r.to_df(decimals=3)
|
|
274
|
+
r.to_csv()
|
|
275
|
+
r.to_xml()
|
|
273
276
|
r.plot(pil=True)
|
|
274
277
|
r.plot(conf=True, boxes=True)
|
|
275
278
|
print(r, len(r), r.path) # print after methods
|
|
@@ -14,6 +14,7 @@ import torch
|
|
|
14
14
|
|
|
15
15
|
from ultralytics.data.augment import LetterBox
|
|
16
16
|
from ultralytics.utils import LOGGER, SimpleClass, ops
|
|
17
|
+
from ultralytics.utils.checks import check_requirements
|
|
17
18
|
from ultralytics.utils.plotting import Annotator, colors, save_one_box
|
|
18
19
|
from ultralytics.utils.torch_utils import smart_inference_mode
|
|
19
20
|
|
|
@@ -818,7 +819,90 @@ class Results(SimpleClass):
|
|
|
818
819
|
|
|
819
820
|
return results
|
|
820
821
|
|
|
822
|
+
def to_df(self, normalize=False, decimals=5):
|
|
823
|
+
"""
|
|
824
|
+
Converts detection results to a Pandas Dataframe.
|
|
825
|
+
|
|
826
|
+
This method converts the detection results into Pandas Dataframe format. It includes information
|
|
827
|
+
about detected objects such as bounding boxes, class names, confidence scores, and optionally
|
|
828
|
+
segmentation masks and keypoints.
|
|
829
|
+
|
|
830
|
+
Args:
|
|
831
|
+
normalize (bool): Whether to normalize the bounding box coordinates by the image dimensions.
|
|
832
|
+
If True, coordinates will be returned as float values between 0 and 1. Defaults to False.
|
|
833
|
+
decimals (int): Number of decimal places to round the output values to. Defaults to 5.
|
|
834
|
+
|
|
835
|
+
Returns:
|
|
836
|
+
(DataFrame): A Pandas Dataframe containing all the information in results in an organized way.
|
|
837
|
+
|
|
838
|
+
Examples:
|
|
839
|
+
>>> results = model("path/to/image.jpg")
|
|
840
|
+
>>> df_result = results[0].to_df()
|
|
841
|
+
>>> print(df_result)
|
|
842
|
+
"""
|
|
843
|
+
import pandas as pd
|
|
844
|
+
|
|
845
|
+
return pd.DataFrame(self.summary(normalize=normalize, decimals=decimals))
|
|
846
|
+
|
|
847
|
+
def to_csv(self, normalize=False, decimals=5, *args, **kwargs):
|
|
848
|
+
"""
|
|
849
|
+
Converts detection results to a CSV format.
|
|
850
|
+
|
|
851
|
+
This method serializes the detection results into a CSV format. It includes information
|
|
852
|
+
about detected objects such as bounding boxes, class names, confidence scores, and optionally
|
|
853
|
+
segmentation masks and keypoints.
|
|
854
|
+
|
|
855
|
+
Args:
|
|
856
|
+
normalize (bool): Whether to normalize the bounding box coordinates by the image dimensions.
|
|
857
|
+
If True, coordinates will be returned as float values between 0 and 1. Defaults to False.
|
|
858
|
+
decimals (int): Number of decimal places to round the output values to. Defaults to 5.
|
|
859
|
+
*args (Any): Variable length argument list to be passed to pandas.DataFrame.to_csv().
|
|
860
|
+
**kwargs (Any): Arbitrary keyword arguments to be passed to pandas.DataFrame.to_csv().
|
|
861
|
+
|
|
862
|
+
|
|
863
|
+
Returns:
|
|
864
|
+
(str): CSV containing all the information in results in an organized way.
|
|
865
|
+
|
|
866
|
+
Examples:
|
|
867
|
+
>>> results = model("path/to/image.jpg")
|
|
868
|
+
>>> csv_result = results[0].to_csv()
|
|
869
|
+
>>> print(csv_result)
|
|
870
|
+
"""
|
|
871
|
+
return self.to_df(normalize=normalize, decimals=decimals).to_csv(*args, **kwargs)
|
|
872
|
+
|
|
873
|
+
def to_xml(self, normalize=False, decimals=5, *args, **kwargs):
|
|
874
|
+
"""
|
|
875
|
+
Converts detection results to XML format.
|
|
876
|
+
|
|
877
|
+
This method serializes the detection results into an XML format. It includes information
|
|
878
|
+
about detected objects such as bounding boxes, class names, confidence scores, and optionally
|
|
879
|
+
segmentation masks and keypoints.
|
|
880
|
+
|
|
881
|
+
Args:
|
|
882
|
+
normalize (bool): Whether to normalize the bounding box coordinates by the image dimensions.
|
|
883
|
+
If True, coordinates will be returned as float values between 0 and 1. Defaults to False.
|
|
884
|
+
decimals (int): Number of decimal places to round the output values to. Defaults to 5.
|
|
885
|
+
*args (Any): Variable length argument list to be passed to pandas.DataFrame.to_xml().
|
|
886
|
+
**kwargs (Any): Arbitrary keyword arguments to be passed to pandas.DataFrame.to_xml().
|
|
887
|
+
|
|
888
|
+
Returns:
|
|
889
|
+
(str): An XML string containing all the information in results in an organized way.
|
|
890
|
+
|
|
891
|
+
Examples:
|
|
892
|
+
>>> results = model("path/to/image.jpg")
|
|
893
|
+
>>> xml_result = results[0].to_xml()
|
|
894
|
+
>>> print(xml_result)
|
|
895
|
+
"""
|
|
896
|
+
check_requirements("lxml")
|
|
897
|
+
df = self.to_df(normalize=normalize, decimals=decimals)
|
|
898
|
+
return '<?xml version="1.0" encoding="utf-8"?>\n<root></root>' if df.empty else df.to_xml(*args, **kwargs)
|
|
899
|
+
|
|
821
900
|
def tojson(self, normalize=False, decimals=5):
|
|
901
|
+
"""Deprecated version of to_json()."""
|
|
902
|
+
LOGGER.warning("WARNING ⚠️ 'result.tojson()' is deprecated, replace with 'result.to_json()'.")
|
|
903
|
+
return self.to_json(normalize, decimals)
|
|
904
|
+
|
|
905
|
+
def to_json(self, normalize=False, decimals=5):
|
|
822
906
|
"""
|
|
823
907
|
Converts detection results to JSON format.
|
|
824
908
|
|
|
@@ -836,7 +920,7 @@ class Results(SimpleClass):
|
|
|
836
920
|
|
|
837
921
|
Examples:
|
|
838
922
|
>>> results = model("path/to/image.jpg")
|
|
839
|
-
>>> json_result = results[0].
|
|
923
|
+
>>> json_result = results[0].to_json()
|
|
840
924
|
>>> print(json_result)
|
|
841
925
|
|
|
842
926
|
Notes:
|
|
@@ -110,7 +110,8 @@ class BaseValidator:
|
|
|
110
110
|
if self.training:
|
|
111
111
|
self.device = trainer.device
|
|
112
112
|
self.data = trainer.data
|
|
113
|
-
|
|
113
|
+
# force FP16 val during training
|
|
114
|
+
self.args.half = self.device.type != "cpu" and trainer.amp
|
|
114
115
|
model = trainer.ema.ema or trainer.model
|
|
115
116
|
model = model.half() if self.args.half else model.float()
|
|
116
117
|
# self.model = model
|
|
@@ -42,10 +42,10 @@ class ParkingPtsSelection:
|
|
|
42
42
|
self.image_path = None
|
|
43
43
|
self.image = None
|
|
44
44
|
self.canvas_image = None
|
|
45
|
-
self.
|
|
45
|
+
self.rg_data = [] # region coordinates
|
|
46
46
|
self.current_box = []
|
|
47
|
-
self.
|
|
48
|
-
self.
|
|
47
|
+
self.imgw = 0 # image width
|
|
48
|
+
self.imgh = 0 # image height
|
|
49
49
|
|
|
50
50
|
# Constants
|
|
51
51
|
self.canvas_max_width = 1280
|
|
@@ -64,17 +64,17 @@ class ParkingPtsSelection:
|
|
|
64
64
|
return
|
|
65
65
|
|
|
66
66
|
self.image = Image.open(self.image_path)
|
|
67
|
-
self.
|
|
67
|
+
self.imgw, self.imgh = self.image.size
|
|
68
68
|
|
|
69
69
|
# Calculate the aspect ratio and resize image
|
|
70
|
-
aspect_ratio = self.
|
|
70
|
+
aspect_ratio = self.imgw / self.imgh
|
|
71
71
|
if aspect_ratio > 1:
|
|
72
72
|
# Landscape orientation
|
|
73
|
-
canvas_width = min(self.canvas_max_width, self.
|
|
73
|
+
canvas_width = min(self.canvas_max_width, self.imgw)
|
|
74
74
|
canvas_height = int(canvas_width / aspect_ratio)
|
|
75
75
|
else:
|
|
76
76
|
# Portrait orientation
|
|
77
|
-
canvas_height = min(self.canvas_max_height, self.
|
|
77
|
+
canvas_height = min(self.canvas_max_height, self.imgh)
|
|
78
78
|
canvas_width = int(canvas_height * aspect_ratio)
|
|
79
79
|
|
|
80
80
|
# Check if canvas is already initialized
|
|
@@ -90,46 +90,34 @@ class ParkingPtsSelection:
|
|
|
90
90
|
self.canvas.bind("<Button-1>", self.on_canvas_click)
|
|
91
91
|
|
|
92
92
|
# Reset bounding boxes and current box
|
|
93
|
-
self.
|
|
93
|
+
self.rg_data = []
|
|
94
94
|
self.current_box = []
|
|
95
95
|
|
|
96
96
|
def on_canvas_click(self, event):
|
|
97
97
|
"""Handle mouse clicks on canvas to create points for bounding boxes."""
|
|
98
98
|
self.current_box.append((event.x, event.y))
|
|
99
|
-
|
|
100
|
-
x1, y1 = event.x + 3, event.y + 3
|
|
101
|
-
self.canvas.create_oval(x0, y0, x1, y1, fill="red")
|
|
99
|
+
self.canvas.create_oval(event.x - 3, event.y - 3, event.x + 3, event.y + 3, fill="red")
|
|
102
100
|
|
|
103
101
|
if len(self.current_box) == 4:
|
|
104
|
-
self.
|
|
105
|
-
|
|
102
|
+
self.rg_data.append(self.current_box)
|
|
103
|
+
[
|
|
104
|
+
self.canvas.create_line(self.current_box[i], self.current_box[(i + 1) % 4], fill="blue", width=2)
|
|
105
|
+
for i in range(4)
|
|
106
|
+
]
|
|
106
107
|
self.current_box = []
|
|
107
108
|
|
|
108
|
-
def draw_bounding_box(self, box):
|
|
109
|
-
"""
|
|
110
|
-
Draw bounding box on canvas.
|
|
111
|
-
|
|
112
|
-
Args:
|
|
113
|
-
box (list): Bounding box data
|
|
114
|
-
"""
|
|
115
|
-
for i in range(4):
|
|
116
|
-
x1, y1 = box[i]
|
|
117
|
-
x2, y2 = box[(i + 1) % 4]
|
|
118
|
-
self.canvas.create_line(x1, y1, x2, y2, fill="blue", width=2)
|
|
119
|
-
|
|
120
109
|
def remove_last_bounding_box(self):
|
|
121
110
|
"""Remove the last drawn bounding box from canvas."""
|
|
122
111
|
from tkinter import messagebox # scope for multi-environment compatibility
|
|
123
112
|
|
|
124
|
-
if self.
|
|
125
|
-
self.
|
|
113
|
+
if self.rg_data:
|
|
114
|
+
self.rg_data.pop() # Remove the last bounding box
|
|
126
115
|
self.canvas.delete("all") # Clear the canvas
|
|
127
116
|
self.canvas.create_image(0, 0, anchor=self.tk.NW, image=self.canvas_image) # Redraw the image
|
|
128
117
|
|
|
129
118
|
# Redraw all bounding boxes
|
|
130
|
-
for box in self.
|
|
131
|
-
self.
|
|
132
|
-
|
|
119
|
+
for box in self.rg_data:
|
|
120
|
+
[self.canvas.create_line(box[i], box[(i + 1) % 4], fill="blue", width=2) for i in range(4)]
|
|
133
121
|
messagebox.showinfo("Success", "Last bounding box removed.")
|
|
134
122
|
else:
|
|
135
123
|
messagebox.showwarning("Warning", "No bounding boxes to remove.")
|
|
@@ -138,19 +126,19 @@ class ParkingPtsSelection:
|
|
|
138
126
|
"""Saves rescaled bounding boxes to 'bounding_boxes.json' based on image-to-canvas size ratio."""
|
|
139
127
|
from tkinter import messagebox # scope for multi-environment compatibility
|
|
140
128
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
bounding_boxes_data = []
|
|
145
|
-
for box in self.bounding_boxes:
|
|
146
|
-
rescaled_box = []
|
|
129
|
+
rg_data = [] # regions data
|
|
130
|
+
for box in self.rg_data:
|
|
131
|
+
rs_box = [] # rescaled box list
|
|
147
132
|
for x, y in box:
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
133
|
+
rs_box.append(
|
|
134
|
+
(
|
|
135
|
+
int(x * self.imgw / self.canvas.winfo_width()), # width scaling
|
|
136
|
+
int(y * self.imgh / self.canvas.winfo_height()),
|
|
137
|
+
)
|
|
138
|
+
) # height scaling
|
|
139
|
+
rg_data.append({"points": rs_box})
|
|
152
140
|
with open("bounding_boxes.json", "w") as f:
|
|
153
|
-
json.dump(
|
|
141
|
+
json.dump(rg_data, f, indent=4)
|
|
154
142
|
|
|
155
143
|
messagebox.showinfo("Success", "Bounding boxes saved to bounding_boxes.json")
|
|
156
144
|
|
|
@@ -160,102 +148,85 @@ class ParkingManagement:
|
|
|
160
148
|
|
|
161
149
|
def __init__(
|
|
162
150
|
self,
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
available_region_color=(0, 0, 255),
|
|
168
|
-
margin=10,
|
|
151
|
+
model, # Ultralytics YOLO model file path
|
|
152
|
+
json_file, # Parking management annotation file created from Parking Annotator
|
|
153
|
+
occupied_region_color=(0, 0, 255), # occupied region color
|
|
154
|
+
available_region_color=(0, 255, 0), # available region color
|
|
169
155
|
):
|
|
170
156
|
"""
|
|
171
157
|
Initializes the parking management system with a YOLOv8 model and visualization settings.
|
|
172
158
|
|
|
173
159
|
Args:
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
bg_color (tuple): RGB color tuple for background.
|
|
160
|
+
model (str): Path to the YOLOv8 model.
|
|
161
|
+
json_file (str): file that have all parking slot points data
|
|
177
162
|
occupied_region_color (tuple): RGB color tuple for occupied regions.
|
|
178
163
|
available_region_color (tuple): RGB color tuple for available regions.
|
|
179
|
-
margin (int): Margin for text display.
|
|
180
164
|
"""
|
|
181
|
-
# Model
|
|
182
|
-
self.model_path = model_path
|
|
183
|
-
self.model = self.load_model()
|
|
184
|
-
|
|
185
|
-
# Labels dictionary
|
|
186
|
-
self.labels_dict = {"Occupancy": 0, "Available": 0}
|
|
187
|
-
|
|
188
|
-
# Visualization details
|
|
189
|
-
self.margin = margin
|
|
190
|
-
self.bg_color = bg_color
|
|
191
|
-
self.txt_color = txt_color
|
|
192
|
-
self.occupied_region_color = occupied_region_color
|
|
193
|
-
self.available_region_color = available_region_color
|
|
194
|
-
|
|
195
|
-
self.window_name = "Ultralytics YOLOv8 Parking Management System"
|
|
196
|
-
# Check if environment supports imshow
|
|
197
|
-
self.env_check = check_imshow(warn=True)
|
|
198
|
-
|
|
199
|
-
def load_model(self):
|
|
200
|
-
"""Load the Ultralytics YOLO model for inference and analytics."""
|
|
165
|
+
# Model initialization
|
|
201
166
|
from ultralytics import YOLO
|
|
202
167
|
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
@staticmethod
|
|
206
|
-
def parking_regions_extraction(json_file):
|
|
207
|
-
"""
|
|
208
|
-
Extract parking regions from json file.
|
|
168
|
+
self.model = YOLO(model)
|
|
209
169
|
|
|
210
|
-
|
|
211
|
-
json_file (str): file that have all parking slot points
|
|
212
|
-
"""
|
|
170
|
+
# Load JSON data
|
|
213
171
|
with open(json_file) as f:
|
|
214
|
-
|
|
172
|
+
self.json_data = json.load(f)
|
|
215
173
|
|
|
216
|
-
|
|
174
|
+
self.pr_info = {"Occupancy": 0, "Available": 0} # dictionary for parking information
|
|
175
|
+
|
|
176
|
+
self.occ = occupied_region_color
|
|
177
|
+
self.arc = available_region_color
|
|
178
|
+
|
|
179
|
+
self.env_check = check_imshow(warn=True) # check if environment supports imshow
|
|
180
|
+
|
|
181
|
+
def process_data(self, im0):
|
|
217
182
|
"""
|
|
218
183
|
Process the model data for parking lot management.
|
|
219
184
|
|
|
220
185
|
Args:
|
|
221
|
-
json_data (str): json data for parking lot management
|
|
222
186
|
im0 (ndarray): inference image
|
|
223
|
-
boxes (list): bounding boxes data
|
|
224
|
-
clss (list): bounding boxes classes list
|
|
225
|
-
|
|
226
|
-
Returns:
|
|
227
|
-
filled_slots (int): total slots that are filled in parking lot
|
|
228
|
-
empty_slots (int): total slots that are available in parking lot
|
|
229
187
|
"""
|
|
230
|
-
|
|
231
|
-
empty_slots, filled_slots = len(json_data), 0
|
|
232
|
-
for region in json_data:
|
|
233
|
-
points_array = np.array(region["points"], dtype=np.int32).reshape((-1, 1, 2))
|
|
234
|
-
region_occupied = False
|
|
188
|
+
results = self.model.track(im0, persist=True, show=False) # object tracking
|
|
235
189
|
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
y_center = int((box[1] + box[3]) / 2)
|
|
239
|
-
text = f"{self.model.names[int(cls)]}"
|
|
190
|
+
es, fs = len(self.json_data), 0 # empty slots, filled slots
|
|
191
|
+
annotator = Annotator(im0) # init annotator
|
|
240
192
|
|
|
193
|
+
# extract tracks data
|
|
194
|
+
if results[0].boxes.id is None:
|
|
195
|
+
self.display_frames(im0)
|
|
196
|
+
return im0
|
|
197
|
+
|
|
198
|
+
boxes = results[0].boxes.xyxy.cpu().tolist()
|
|
199
|
+
clss = results[0].boxes.cls.cpu().tolist()
|
|
200
|
+
|
|
201
|
+
for region in self.json_data:
|
|
202
|
+
# Convert points to a NumPy array with the correct dtype and reshape properly
|
|
203
|
+
pts_array = np.array(region["points"], dtype=np.int32).reshape((-1, 1, 2))
|
|
204
|
+
rg_occupied = False # occupied region initialization
|
|
205
|
+
for box, cls in zip(boxes, clss):
|
|
206
|
+
xc = int((box[0] + box[2]) / 2)
|
|
207
|
+
yc = int((box[1] + box[3]) / 2)
|
|
241
208
|
annotator.display_objects_labels(
|
|
242
|
-
im0,
|
|
209
|
+
im0, self.model.names[int(cls)], (104, 31, 17), (255, 255, 255), xc, yc, 10
|
|
243
210
|
)
|
|
244
|
-
dist = cv2.pointPolygonTest(
|
|
211
|
+
dist = cv2.pointPolygonTest(pts_array, (xc, yc), False)
|
|
245
212
|
if dist >= 0:
|
|
246
|
-
|
|
213
|
+
rg_occupied = True
|
|
247
214
|
break
|
|
215
|
+
if rg_occupied:
|
|
216
|
+
fs += 1
|
|
217
|
+
es -= 1
|
|
218
|
+
|
|
219
|
+
# Plotting regions
|
|
220
|
+
color = self.occ if rg_occupied else self.arc
|
|
221
|
+
cv2.polylines(im0, [pts_array], isClosed=True, color=color, thickness=2)
|
|
248
222
|
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
if region_occupied:
|
|
252
|
-
filled_slots += 1
|
|
253
|
-
empty_slots -= 1
|
|
223
|
+
self.pr_info["Occupancy"] = fs
|
|
224
|
+
self.pr_info["Available"] = es
|
|
254
225
|
|
|
255
|
-
self.
|
|
256
|
-
self.labels_dict["Available"] = empty_slots
|
|
226
|
+
annotator.display_analytics(im0, self.pr_info, (104, 31, 17), (255, 255, 255), 10)
|
|
257
227
|
|
|
258
|
-
|
|
228
|
+
self.display_frames(im0)
|
|
229
|
+
return im0
|
|
259
230
|
|
|
260
231
|
def display_frames(self, im0):
|
|
261
232
|
"""
|
|
@@ -265,8 +236,7 @@ class ParkingManagement:
|
|
|
265
236
|
im0 (ndarray): inference image
|
|
266
237
|
"""
|
|
267
238
|
if self.env_check:
|
|
268
|
-
cv2.
|
|
269
|
-
cv2.imshow(self.window_name, im0)
|
|
239
|
+
cv2.imshow("Ultralytics Parking Manager", im0)
|
|
270
240
|
# Break Window
|
|
271
241
|
if cv2.waitKey(1) & 0xFF == ord("q"):
|
|
272
242
|
return
|
|
@@ -656,9 +656,10 @@ def check_amp(model):
|
|
|
656
656
|
|
|
657
657
|
def amp_allclose(m, im):
|
|
658
658
|
"""All close FP32 vs AMP results."""
|
|
659
|
-
|
|
659
|
+
batch = [im] * 8
|
|
660
|
+
a = m(batch, imgsz=128, device=device, verbose=False)[0].boxes.data # FP32 inference
|
|
660
661
|
with autocast(enabled=True):
|
|
661
|
-
b = m(
|
|
662
|
+
b = m(batch, imgsz=128, device=device, verbose=False)[0].boxes.data # AMP inference
|
|
662
663
|
del m
|
|
663
664
|
return a.shape == b.shape and torch.allclose(a, b.float(), atol=0.5) # close to 0.5 absolute tolerance
|
|
664
665
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: ultralytics
|
|
3
|
-
Version: 8.2.
|
|
3
|
+
Version: 8.2.96
|
|
4
4
|
Summary: Ultralytics YOLO 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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml
RENAMED
|
File without changes
|
{ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml
RENAMED
|
File without changes
|
{ultralytics-8.2.95 → ultralytics-8.2.96}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|