ultralytics 8.3.87__tar.gz → 8.3.89__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.87/ultralytics.egg-info → ultralytics-8.3.89}/PKG-INFO +2 -2
- {ultralytics-8.3.87 → ultralytics-8.3.89}/pyproject.toml +1 -1
- {ultralytics-8.3.87 → ultralytics-8.3.89}/tests/test_solutions.py +34 -45
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/__init__.py +1 -1
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/__init__.py +46 -39
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/data/augment.py +2 -2
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/data/base.py +7 -9
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/data/converter.py +30 -29
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/data/utils.py +20 -28
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/engine/model.py +2 -2
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/engine/tuner.py +11 -21
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/hub/__init__.py +13 -17
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/fastsam/model.py +4 -7
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/nas/model.py +8 -14
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/nas/predict.py +7 -9
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/nas/val.py +7 -9
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/rtdetr/predict.py +6 -9
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/rtdetr/train.py +5 -8
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/rtdetr/val.py +5 -8
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/yolo/classify/predict.py +6 -9
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/yolo/classify/train.py +5 -8
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/yolo/classify/val.py +5 -8
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/yolo/detect/predict.py +6 -9
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/yolo/detect/train.py +5 -8
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/yolo/detect/val.py +5 -8
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/yolo/obb/predict.py +6 -9
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/yolo/obb/train.py +5 -8
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/yolo/obb/val.py +10 -15
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/yolo/pose/predict.py +6 -9
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/yolo/pose/train.py +5 -8
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/yolo/pose/val.py +12 -17
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/yolo/segment/predict.py +6 -9
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/yolo/segment/train.py +5 -8
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/yolo/segment/val.py +10 -15
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/yolo/world/train.py +5 -8
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/yolo/world/train_world.py +21 -25
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/nn/modules/__init__.py +9 -12
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/nn/tasks.py +7 -12
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/solutions/__init__.py +14 -6
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/solutions/ai_gym.py +39 -28
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/solutions/analytics.py +22 -18
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/solutions/distance_calculation.py +25 -25
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/solutions/heatmap.py +40 -38
- ultralytics-8.3.89/ultralytics/solutions/instance_segmentation.py +69 -0
- ultralytics-8.3.89/ultralytics/solutions/object_blurrer.py +89 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/solutions/object_counter.py +35 -33
- ultralytics-8.3.89/ultralytics/solutions/object_cropper.py +84 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/solutions/parking_management.py +21 -9
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/solutions/queue_management.py +20 -39
- ultralytics-8.3.89/ultralytics/solutions/region_counter.py +119 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/solutions/security_alarm.py +40 -30
- ultralytics-8.3.89/ultralytics/solutions/solutions.py +756 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/solutions/speed_estimation.py +34 -31
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/solutions/streamlit_inference.py +34 -28
- ultralytics-8.3.89/ultralytics/solutions/trackzone.py +79 -0
- ultralytics-8.3.89/ultralytics/solutions/vision_eye.py +69 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/trackers/utils/kalman_filter.py +23 -23
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/utils/__init__.py +5 -8
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/utils/checks.py +25 -35
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/utils/downloads.py +25 -48
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/utils/instance.py +9 -11
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/utils/ops.py +5 -9
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/utils/plotting.py +8 -428
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/utils/torch_utils.py +23 -33
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/utils/tuner.py +5 -9
- {ultralytics-8.3.87 → ultralytics-8.3.89/ultralytics.egg-info}/PKG-INFO +2 -2
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics.egg-info/SOURCES.txt +4 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics.egg-info/requires.txt +1 -1
- ultralytics-8.3.87/ultralytics/solutions/region_counter.py +0 -116
- ultralytics-8.3.87/ultralytics/solutions/solutions.py +0 -178
- ultralytics-8.3.87/ultralytics/solutions/trackzone.py +0 -68
- {ultralytics-8.3.87 → ultralytics-8.3.89}/LICENSE +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/README.md +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/setup.cfg +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/tests/__init__.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/tests/conftest.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/tests/test_cli.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/tests/test_cuda.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/tests/test_engine.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/tests/test_exports.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/tests/test_integrations.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/tests/test_python.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/assets/bus.jpg +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/assets/zidane.jpg +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/datasets/VOC.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/datasets/coco.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/datasets/coco128.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/datasets/coco8.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/datasets/dog-pose.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/datasets/dota8.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/datasets/hand-keypoints.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/datasets/lvis.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/datasets/medical-pills.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/datasets/signature.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/datasets/xView.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/default.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/11/yolo11-cls-resnet18.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/11/yolo11-cls.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/11/yolo11-obb.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/11/yolo11-pose.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/11/yolo11-seg.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/11/yolo11.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/12/yolo12-cls.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/12/yolo12-obb.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/12/yolo12-pose.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/12/yolo12-seg.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/12/yolo12.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/v10/yolov10b.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/v10/yolov10l.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/v10/yolov10m.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/v10/yolov10n.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/v10/yolov10s.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/v10/yolov10x.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/v9/yolov9m.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/v9/yolov9s.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/models/v9/yolov9t.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/solutions/default.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/trackers/botsort.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/data/__init__.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/data/annotator.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/data/build.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/data/dataset.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/data/loaders.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/data/split_dota.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/engine/__init__.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/engine/exporter.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/engine/predictor.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/engine/results.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/engine/trainer.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/engine/validator.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/hub/auth.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/hub/google/__init__.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/hub/session.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/hub/utils.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/__init__.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/fastsam/__init__.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/fastsam/predict.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/fastsam/utils.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/fastsam/val.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/nas/__init__.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/rtdetr/__init__.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/rtdetr/model.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/sam/__init__.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/sam/amg.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/sam/build.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/sam/model.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/sam/modules/__init__.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/sam/modules/blocks.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/sam/modules/decoders.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/sam/modules/encoders.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/sam/modules/memory_attention.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/sam/modules/sam.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/sam/modules/transformer.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/sam/modules/utils.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/sam/predict.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/utils/__init__.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/utils/loss.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/utils/ops.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/yolo/__init__.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/yolo/classify/__init__.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/yolo/detect/__init__.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/yolo/model.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/yolo/obb/__init__.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/yolo/pose/__init__.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/yolo/segment/__init__.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/models/yolo/world/__init__.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/nn/__init__.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/nn/autobackend.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/nn/modules/activation.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/nn/modules/block.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/nn/modules/conv.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/nn/modules/head.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/nn/modules/transformer.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/nn/modules/utils.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/trackers/__init__.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/trackers/basetrack.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/trackers/bot_sort.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/trackers/byte_tracker.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/trackers/track.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/trackers/utils/__init__.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/trackers/utils/gmc.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/trackers/utils/matching.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/utils/autobatch.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/utils/benchmarks.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/utils/callbacks/__init__.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/utils/callbacks/base.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/utils/callbacks/clearml.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/utils/callbacks/comet.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/utils/callbacks/dvc.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/utils/callbacks/hub.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/utils/callbacks/mlflow.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/utils/callbacks/neptune.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/utils/callbacks/raytune.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/utils/callbacks/tensorboard.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/utils/callbacks/wb.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/utils/dist.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/utils/errors.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/utils/files.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/utils/loss.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/utils/metrics.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/utils/patches.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/utils/tal.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics/utils/triton.py +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics.egg-info/dependency_links.txt +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics.egg-info/entry_points.txt +0 -0
- {ultralytics-8.3.87 → ultralytics-8.3.89}/ultralytics.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.2
|
2
2
|
Name: ultralytics
|
3
|
-
Version: 8.3.
|
3
|
+
Version: 8.3.89
|
4
4
|
Summary: Ultralytics YOLO 🚀 for SOTA object detection, multi-object tracking, instance segmentation, pose estimation and image classification.
|
5
5
|
Author-email: Glenn Jocher <glenn.jocher@ultralytics.com>, Jing Qiu <jing.qiu@ultralytics.com>
|
6
6
|
Maintainer-email: Ultralytics <hello@ultralytics.com>
|
@@ -65,7 +65,7 @@ Requires-Dist: coremltools>=7.0; (platform_system != "Windows" and python_versio
|
|
65
65
|
Requires-Dist: scikit-learn>=1.3.2; (platform_system != "Windows" and python_version <= "3.11") and extra == "export"
|
66
66
|
Requires-Dist: openvino!=2025.0.0,>=2024.0.0; extra == "export"
|
67
67
|
Requires-Dist: tensorflow>=2.0.0; extra == "export"
|
68
|
-
Requires-Dist: tensorflowjs>=
|
68
|
+
Requires-Dist: tensorflowjs>=4.0.0; extra == "export"
|
69
69
|
Requires-Dist: tensorstore>=0.1.63; (platform_machine == "aarch64" and python_version >= "3.9") and extra == "export"
|
70
70
|
Requires-Dist: keras; extra == "export"
|
71
71
|
Requires-Dist: flatbuffers<100,>=23.5.26; platform_machine == "aarch64" and extra == "export"
|
@@ -99,7 +99,7 @@ export = [
|
|
99
99
|
"scikit-learn>=1.3.2; platform_system != 'Windows' and python_version <= '3.11'", # CoreML k-means quantization
|
100
100
|
"openvino>=2024.0.0,!=2025.0.0", # OpenVINO export
|
101
101
|
"tensorflow>=2.0.0", # TF bug https://github.com/ultralytics/ultralytics/issues/5161
|
102
|
-
"tensorflowjs>=
|
102
|
+
"tensorflowjs>=4.0.0", # TF.js export, automatically installs tensorflow
|
103
103
|
"tensorstore>=0.1.63; platform_machine == 'aarch64' and python_version >= '3.9'", # for TF Raspberry Pi exports
|
104
104
|
"keras", # not installed automatically by tensorflow>=2.16
|
105
105
|
"flatbuffers>=23.5.26,<100; platform_machine == 'aarch64'", # update old 'flatbuffers' included inside tensorflow package
|
@@ -1,11 +1,13 @@
|
|
1
1
|
# Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
|
2
|
+
# This is file for Ultralytics Solutions tests: https://docs.ultralytics.com/solutions/,
|
3
|
+
# It includes every solution excluding DistanceCalculation and Security Alarm System.
|
2
4
|
|
3
5
|
import cv2
|
4
6
|
import pytest
|
5
7
|
|
6
8
|
from tests import TMP
|
7
|
-
from ultralytics import
|
8
|
-
from ultralytics.utils import ASSETS_URL
|
9
|
+
from ultralytics import solutions
|
10
|
+
from ultralytics.utils import ASSETS_URL
|
9
11
|
from ultralytics.utils.downloads import safe_download
|
10
12
|
|
11
13
|
DEMO_VIDEO = "solutions_ci_demo.mp4" # for all the solutions, except workout and parking
|
@@ -24,16 +26,23 @@ def test_major_solutions():
|
|
24
26
|
region_points = [(20, 400), (1080, 400), (1080, 360), (20, 360)]
|
25
27
|
counter = solutions.ObjectCounter(region=region_points, model="yolo11n.pt", show=False) # Test object counter
|
26
28
|
heatmap = solutions.Heatmap(colormap=cv2.COLORMAP_PARULA, model="yolo11n.pt", show=False) # Test heatmaps
|
27
|
-
|
29
|
+
heatmapcounter = solutions.Heatmap(
|
28
30
|
colormap=cv2.COLORMAP_PARULA, model="yolo11n.pt", show=False, region=region_points
|
29
31
|
) # Test heatmaps with object counting
|
30
32
|
speed = solutions.SpeedEstimator(region=region_points, model="yolo11n.pt", show=False) # Test queue manager
|
31
33
|
queue = solutions.QueueManager(region=region_points, model="yolo11n.pt", show=False) # Test speed estimation
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
trackzone = solutions.TrackZone(region=region_points, model="yolo11n.pt", show=False) #
|
34
|
+
lineanalytics = solutions.Analytics(analytics_type="line", model="yolo11n.pt", show=False) # line analytics
|
35
|
+
pieanalytics = solutions.Analytics(analytics_type="pie", model="yolo11n.pt", show=False) # line analytics
|
36
|
+
baranalytics = solutions.Analytics(analytics_type="bar", model="yolo11n.pt", show=False) # line analytics
|
37
|
+
areaanalytics = solutions.Analytics(analytics_type="area", model="yolo11n.pt", show=False) # line analytics
|
38
|
+
trackzone = solutions.TrackZone(region=region_points, model="yolo11n.pt", show=False) # trackzone
|
39
|
+
objectcropper = solutions.ObjectCropper(
|
40
|
+
model="yolo11n.pt", show=False, crop_dir=str(TMP / "cropped-detections")
|
41
|
+
) # object cropping
|
42
|
+
objectblurrer = solutions.ObjectBlurrer(blur_ratio=0.5, model="yolo11n.pt", show=False) # Object blurring
|
43
|
+
isegment = solutions.InstanceSegmentation(model="yolo11n-seg.pt", show=False) # Instance segmentation
|
44
|
+
visioneye = solutions.VisionEye(model="yolo11n.pt", show=False) # Visioneye
|
45
|
+
regioncounter = solutions.RegionCounter(region=region_points, model="yolo11n.pt", show=False) # Region counter
|
37
46
|
frame_count = 0 # Required for analytics
|
38
47
|
while cap.isOpened():
|
39
48
|
success, im0 = cap.read()
|
@@ -41,16 +50,21 @@ def test_major_solutions():
|
|
41
50
|
break
|
42
51
|
frame_count += 1
|
43
52
|
original_im0 = im0.copy()
|
44
|
-
_ = counter
|
45
|
-
_ = heatmap
|
46
|
-
_ =
|
47
|
-
_ = speed
|
48
|
-
_ = queue
|
49
|
-
_ =
|
50
|
-
_ =
|
51
|
-
_ =
|
52
|
-
_ =
|
53
|
-
_ = trackzone
|
53
|
+
_ = counter(original_im0.copy())
|
54
|
+
_ = heatmap(original_im0.copy())
|
55
|
+
_ = heatmapcounter(original_im0.copy())
|
56
|
+
_ = speed(original_im0.copy())
|
57
|
+
_ = queue(original_im0.copy())
|
58
|
+
_ = lineanalytics(original_im0.copy(), frame_count)
|
59
|
+
_ = pieanalytics(original_im0.copy(), frame_count)
|
60
|
+
_ = baranalytics(original_im0.copy(), frame_count)
|
61
|
+
_ = areaanalytics(original_im0.copy(), frame_count)
|
62
|
+
_ = trackzone(original_im0.copy())
|
63
|
+
_ = objectcropper(original_im0.copy())
|
64
|
+
_ = isegment(original_im0.copy())
|
65
|
+
_ = objectblurrer(original_im0.copy())
|
66
|
+
_ = visioneye(original_im0.copy())
|
67
|
+
_ = regioncounter(original_im0.copy())
|
54
68
|
cap.release()
|
55
69
|
|
56
70
|
# Test workouts monitoring
|
@@ -62,7 +76,7 @@ def test_major_solutions():
|
|
62
76
|
success, im0 = cap.read()
|
63
77
|
if not success:
|
64
78
|
break
|
65
|
-
_ = gym
|
79
|
+
_ = gym(im0)
|
66
80
|
cap.release()
|
67
81
|
|
68
82
|
# Test parking management
|
@@ -78,35 +92,10 @@ def test_major_solutions():
|
|
78
92
|
success, im0 = cap.read()
|
79
93
|
if not success:
|
80
94
|
break
|
81
|
-
_ = parkingmanager
|
95
|
+
_ = parkingmanager(im0)
|
82
96
|
cap.release()
|
83
97
|
|
84
98
|
|
85
|
-
@pytest.mark.slow
|
86
|
-
def test_instance_segmentation():
|
87
|
-
"""Test the instance segmentation solution."""
|
88
|
-
from ultralytics.utils.plotting import Annotator, colors
|
89
|
-
|
90
|
-
model = YOLO(WEIGHTS_DIR / "yolo11n-seg.pt")
|
91
|
-
names = model.names
|
92
|
-
cap = cv2.VideoCapture(TMP / DEMO_VIDEO)
|
93
|
-
assert cap.isOpened(), "Error reading video file"
|
94
|
-
while cap.isOpened():
|
95
|
-
success, im0 = cap.read()
|
96
|
-
if not success:
|
97
|
-
break
|
98
|
-
results = model.predict(im0)
|
99
|
-
annotator = Annotator(im0, line_width=2)
|
100
|
-
if results[0].masks is not None:
|
101
|
-
clss = results[0].boxes.cls.cpu().tolist()
|
102
|
-
masks = results[0].masks.xy
|
103
|
-
for mask, cls in zip(masks, clss):
|
104
|
-
color = colors(int(cls), True)
|
105
|
-
annotator.seg_bbox(mask=mask, mask_color=color, label=names[int(cls)])
|
106
|
-
cap.release()
|
107
|
-
cv2.destroyAllWindows()
|
108
|
-
|
109
|
-
|
110
99
|
@pytest.mark.slow
|
111
100
|
def test_streamlit_predict():
|
112
101
|
"""Test streamlit predict live inference solution."""
|
@@ -5,7 +5,7 @@ import subprocess
|
|
5
5
|
import sys
|
6
6
|
from pathlib import Path
|
7
7
|
from types import SimpleNamespace
|
8
|
-
from typing import Dict, List, Union
|
8
|
+
from typing import Any, Dict, List, Union
|
9
9
|
|
10
10
|
import cv2
|
11
11
|
|
@@ -35,14 +35,18 @@ from ultralytics.utils import (
|
|
35
35
|
|
36
36
|
# Define valid solutions
|
37
37
|
SOLUTION_MAP = {
|
38
|
-
"count":
|
39
|
-
"
|
40
|
-
"
|
41
|
-
"
|
42
|
-
"
|
43
|
-
"
|
44
|
-
"
|
45
|
-
"
|
38
|
+
"count": "ObjectCounter",
|
39
|
+
"crop": "ObjectCropper",
|
40
|
+
"blur": "ObjectBlurrer",
|
41
|
+
"workout": "AIGym",
|
42
|
+
"heatmap": "Heatmap",
|
43
|
+
"isegment": "InstanceSegmentation",
|
44
|
+
"visioneye": "VisionEye",
|
45
|
+
"speed": "SpeedEstimator",
|
46
|
+
"queue": "QueueManager",
|
47
|
+
"analytics": "Analytics",
|
48
|
+
"inference": "Inference",
|
49
|
+
"trackzone": "TrackZone",
|
46
50
|
"help": None,
|
47
51
|
}
|
48
52
|
|
@@ -238,7 +242,7 @@ CFG_BOOL_KEYS = frozenset(
|
|
238
242
|
)
|
239
243
|
|
240
244
|
|
241
|
-
def cfg2dict(cfg):
|
245
|
+
def cfg2dict(cfg: Union[str, Path, Dict, SimpleNamespace]) -> Dict:
|
242
246
|
"""
|
243
247
|
Converts a configuration object to a dictionary.
|
244
248
|
|
@@ -273,7 +277,7 @@ def cfg2dict(cfg):
|
|
273
277
|
return cfg
|
274
278
|
|
275
279
|
|
276
|
-
def get_cfg(cfg: Union[str, Path, Dict, SimpleNamespace] = DEFAULT_CFG_DICT, overrides: Dict = None):
|
280
|
+
def get_cfg(cfg: Union[str, Path, Dict, SimpleNamespace] = DEFAULT_CFG_DICT, overrides: Dict = None) -> SimpleNamespace:
|
277
281
|
"""
|
278
282
|
Load and merge configuration data from a file or dictionary, with optional overrides.
|
279
283
|
|
@@ -321,7 +325,7 @@ def get_cfg(cfg: Union[str, Path, Dict, SimpleNamespace] = DEFAULT_CFG_DICT, ove
|
|
321
325
|
return IterableSimpleNamespace(**cfg)
|
322
326
|
|
323
327
|
|
324
|
-
def check_cfg(cfg, hard=True):
|
328
|
+
def check_cfg(cfg: Dict, hard: bool = True) -> None:
|
325
329
|
"""
|
326
330
|
Checks configuration argument types and values for the Ultralytics library.
|
327
331
|
|
@@ -383,7 +387,7 @@ def check_cfg(cfg, hard=True):
|
|
383
387
|
cfg[k] = bool(v)
|
384
388
|
|
385
389
|
|
386
|
-
def get_save_dir(args, name=None):
|
390
|
+
def get_save_dir(args: SimpleNamespace, name: str = None) -> Path:
|
387
391
|
"""
|
388
392
|
Returns the directory path for saving outputs, derived from arguments or default settings.
|
389
393
|
|
@@ -415,7 +419,7 @@ def get_save_dir(args, name=None):
|
|
415
419
|
return Path(save_dir)
|
416
420
|
|
417
421
|
|
418
|
-
def _handle_deprecation(custom):
|
422
|
+
def _handle_deprecation(custom: Dict) -> Dict:
|
419
423
|
"""
|
420
424
|
Handles deprecated configuration keys by mapping them to current equivalents with deprecation warnings.
|
421
425
|
|
@@ -453,7 +457,7 @@ def _handle_deprecation(custom):
|
|
453
457
|
return custom
|
454
458
|
|
455
459
|
|
456
|
-
def check_dict_alignment(base: Dict, custom: Dict, e=None):
|
460
|
+
def check_dict_alignment(base: Dict, custom: Dict, e: Exception = None) -> None:
|
457
461
|
"""
|
458
462
|
Checks alignment between custom and base configuration dictionaries, handling deprecated keys and providing error
|
459
463
|
messages for mismatched keys.
|
@@ -507,7 +511,7 @@ def merge_equals_args(args: List[str]) -> List[str]:
|
|
507
511
|
args (List[str]): A list of strings where each element represents an argument or fragment.
|
508
512
|
|
509
513
|
Returns:
|
510
|
-
List[str]: A list of strings where the arguments around isolated '=' are merged and fragments with brackets are joined.
|
514
|
+
(List[str]): A list of strings where the arguments around isolated '=' are merged and fragments with brackets are joined.
|
511
515
|
|
512
516
|
Examples:
|
513
517
|
>>> args = ["arg1", "=", "value", "arg2=", "value2", "arg3", "=value3", "imgsz=[3,", "640,", "640]"]
|
@@ -634,9 +638,6 @@ def handle_yolo_solutions(args: List[str]) -> None:
|
|
634
638
|
solutions: https://docs.ultralytics.com/solutions/, It can include solution name, source,
|
635
639
|
and other configuration parameters.
|
636
640
|
|
637
|
-
Returns:
|
638
|
-
None: The function processes video frames and saves the output but doesn't return any value.
|
639
|
-
|
640
641
|
Examples:
|
641
642
|
Run people counting solution with default settings:
|
642
643
|
>>> handle_yolo_solutions(["count"])
|
@@ -660,7 +661,13 @@ def handle_yolo_solutions(args: List[str]) -> None:
|
|
660
661
|
- The inference solution will be launched using the 'streamlit run' command.
|
661
662
|
- The Streamlit app file is located in the Ultralytics package directory.
|
662
663
|
"""
|
663
|
-
full_args_dict = {
|
664
|
+
full_args_dict = {
|
665
|
+
**DEFAULT_SOL_DICT,
|
666
|
+
**DEFAULT_CFG_DICT,
|
667
|
+
"blur_ratio": 0.5,
|
668
|
+
"vision_point": (20, 20),
|
669
|
+
"crop_dir": "cropped-detections",
|
670
|
+
} # arguments dictionary
|
664
671
|
overrides = {}
|
665
672
|
|
666
673
|
# check dictionary alignment
|
@@ -705,21 +712,19 @@ def handle_yolo_solutions(args: List[str]) -> None:
|
|
705
712
|
else:
|
706
713
|
from ultralytics import solutions
|
707
714
|
|
708
|
-
|
709
|
-
solution = getattr(solutions, cls)(IS_CLI=True, **overrides) # get solution class i.e ObjectCounter
|
710
|
-
process = getattr(
|
711
|
-
solution, method
|
712
|
-
) # get specific function of class for processing i.e, count from ObjectCounter
|
715
|
+
solution = getattr(solutions, SOLUTION_MAP[solution_name])(is_cli=True, **overrides) # class i.e ObjectCounter
|
713
716
|
|
714
717
|
cap = cv2.VideoCapture(solution.CFG["source"]) # read the video file
|
715
|
-
|
716
|
-
|
717
|
-
|
718
|
-
|
719
|
-
|
720
|
-
|
721
|
-
|
722
|
-
|
718
|
+
if solution_name != "crop":
|
719
|
+
# extract width, height and fps of the video file, create save directory and initialize video writer
|
720
|
+
w, h, fps = (
|
721
|
+
int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS)
|
722
|
+
)
|
723
|
+
if solution_name == "analytics": # analytical graphs follow fixed shape for output i.e w=1920, h=1080
|
724
|
+
w, h = 1280, 720
|
725
|
+
save_dir = get_save_dir(SimpleNamespace(project="runs/solutions", name="exp", exist_ok=False))
|
726
|
+
save_dir.mkdir(parents=True) # create the output directory i.e. runs/solutions/exp
|
727
|
+
vw = cv2.VideoWriter(str(save_dir / f"{solution_name}.avi"), cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))
|
723
728
|
|
724
729
|
try: # Process video frames
|
725
730
|
f_n = 0 # frame number, required for analytical graphs
|
@@ -727,15 +732,17 @@ def handle_yolo_solutions(args: List[str]) -> None:
|
|
727
732
|
success, frame = cap.read()
|
728
733
|
if not success:
|
729
734
|
break
|
730
|
-
|
731
|
-
|
735
|
+
results = solution(frame, f_n := f_n + 1) if solution_name == "analytics" else solution(frame)
|
736
|
+
LOGGER.info(f"🚀 Results: {results}")
|
737
|
+
if solution_name != "crop":
|
738
|
+
vw.write(results.plot_im)
|
732
739
|
if cv2.waitKey(1) & 0xFF == ord("q"):
|
733
740
|
break
|
734
741
|
finally:
|
735
742
|
cap.release()
|
736
743
|
|
737
744
|
|
738
|
-
def parse_key_value_pair(pair: str = "key=value"):
|
745
|
+
def parse_key_value_pair(pair: str = "key=value") -> tuple:
|
739
746
|
"""
|
740
747
|
Parses a key-value pair string into separate key and value components.
|
741
748
|
|
@@ -769,7 +776,7 @@ def parse_key_value_pair(pair: str = "key=value"):
|
|
769
776
|
return k, smart_value(v)
|
770
777
|
|
771
778
|
|
772
|
-
def smart_value(v):
|
779
|
+
def smart_value(v: str) -> Any:
|
773
780
|
"""
|
774
781
|
Converts a string representation of a value to its appropriate Python type.
|
775
782
|
|
@@ -814,7 +821,7 @@ def smart_value(v):
|
|
814
821
|
return v
|
815
822
|
|
816
823
|
|
817
|
-
def entrypoint(debug=""):
|
824
|
+
def entrypoint(debug: str = "") -> None:
|
818
825
|
"""
|
819
826
|
Ultralytics entrypoint function for parsing and executing command-line arguments.
|
820
827
|
|
@@ -986,7 +993,7 @@ def entrypoint(debug=""):
|
|
986
993
|
|
987
994
|
|
988
995
|
# Special modes --------------------------------------------------------------------------------------------------------
|
989
|
-
def copy_default_cfg():
|
996
|
+
def copy_default_cfg() -> None:
|
990
997
|
"""
|
991
998
|
Copies the default configuration file and creates a new one with '_copy' appended to its name.
|
992
999
|
|
@@ -1193,8 +1193,8 @@ class RandomPerspective:
|
|
1193
1193
|
Args:
|
1194
1194
|
labels (Dict): A dictionary containing image data and annotations.
|
1195
1195
|
Must include:
|
1196
|
-
'img' (ndarray): The input image.
|
1197
|
-
'cls' (ndarray): Class labels.
|
1196
|
+
'img' (np.ndarray): The input image.
|
1197
|
+
'cls' (np.ndarray): Class labels.
|
1198
1198
|
'instances' (Instances): Object instances with bounding boxes, segments, and keypoints.
|
1199
1199
|
May include:
|
1200
1200
|
'mosaic_border' (Tuple[int, int]): Border size for mosaic augmentation.
|
@@ -312,15 +312,13 @@ class BaseDataset(Dataset):
|
|
312
312
|
"""
|
313
313
|
Users can customize augmentations here.
|
314
314
|
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
return Compose([])
|
323
|
-
```
|
315
|
+
Examples:
|
316
|
+
>>> if self.augment:
|
317
|
+
... # Training transforms
|
318
|
+
... return Compose([])
|
319
|
+
>>> else:
|
320
|
+
... # Val transforms
|
321
|
+
... return Compose([])
|
324
322
|
"""
|
325
323
|
raise NotImplementedError
|
326
324
|
|
@@ -124,15 +124,16 @@ def coco80_to_coco91_class():
|
|
124
124
|
Converts 80-index (val2014) to 91-index (paper).
|
125
125
|
For details see https://tech.amikelive.com/node-718/what-object-categories-labels-are-in-coco-dataset/.
|
126
126
|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
x1 = [list(a[i] == b).index(True) + 1 for i in range(80)]
|
134
|
-
|
135
|
-
|
127
|
+
Examples:
|
128
|
+
>>> import numpy as np
|
129
|
+
>>> a = np.loadtxt("data/coco.names", dtype="str", delimiter="\n")
|
130
|
+
>>> b = np.loadtxt("data/coco_paper.names", dtype="str", delimiter="\n")
|
131
|
+
|
132
|
+
Convert the darknet to COCO format
|
133
|
+
>>> x1 = [list(a[i] == b).index(True) + 1 for i in range(80)]
|
134
|
+
|
135
|
+
Convert the COCO to darknet format
|
136
|
+
>>> x2 = [list(b[i] == a).index(True) if any(b[i] == a) else None for i in range(91)]
|
136
137
|
"""
|
137
138
|
return [
|
138
139
|
1,
|
@@ -237,15 +238,20 @@ def convert_coco(
|
|
237
238
|
cls91to80 (bool, optional): Whether to map 91 COCO class IDs to the corresponding 80 COCO class IDs.
|
238
239
|
lvis (bool, optional): Whether to convert data in lvis dataset way.
|
239
240
|
|
240
|
-
|
241
|
-
|
242
|
-
|
241
|
+
Examples:
|
242
|
+
>>> from ultralytics.data.converter import convert_coco
|
243
|
+
|
244
|
+
Convert COCO annotations to YOLO format
|
245
|
+
>>> convert_coco("../datasets/coco/annotations/", use_segments=True, use_keypoints=False, cls91to80=False)
|
243
246
|
|
244
|
-
|
245
|
-
convert_coco(
|
246
|
-
|
247
|
-
|
248
|
-
|
247
|
+
Convert LVIS annotations to YOLO format
|
248
|
+
>>> convert_coco(
|
249
|
+
>>> "../datasets/lvis/annotations/",
|
250
|
+
... use_segments=True,
|
251
|
+
... use_keypoints=False,
|
252
|
+
... cls91to80=False,
|
253
|
+
... lvis=True
|
254
|
+
... )
|
249
255
|
|
250
256
|
Output:
|
251
257
|
Generates output files in the specified output directory.
|
@@ -353,13 +359,11 @@ def convert_segment_masks_to_yolo_seg(masks_dir, output_dir, classes):
|
|
353
359
|
output_dir (str): The path to the directory where the converted YOLO segmentation masks will be stored.
|
354
360
|
classes (int): Total classes in the dataset i.e. for COCO classes=80
|
355
361
|
|
356
|
-
|
357
|
-
|
358
|
-
from ultralytics.data.converter import convert_segment_masks_to_yolo_seg
|
362
|
+
Examples:
|
363
|
+
>>> from ultralytics.data.converter import convert_segment_masks_to_yolo_seg
|
359
364
|
|
360
|
-
|
361
|
-
convert_segment_masks_to_yolo_seg("path/to/masks_directory", "path/to/output/directory", classes=80)
|
362
|
-
```
|
365
|
+
The classes here is the total classes in the dataset, for COCO dataset we have 80 classes
|
366
|
+
>>> convert_segment_masks_to_yolo_seg("path/to/masks_directory", "path/to/output/directory", classes=80)
|
363
367
|
|
364
368
|
Notes:
|
365
369
|
The expected directory structure for the masks is:
|
@@ -429,12 +433,9 @@ def convert_dota_to_yolo_obb(dota_root_path: str):
|
|
429
433
|
Args:
|
430
434
|
dota_root_path (str): The root directory path of the DOTA dataset.
|
431
435
|
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
convert_dota_to_yolo_obb("path/to/DOTA")
|
437
|
-
```
|
436
|
+
Examples:
|
437
|
+
>>> from ultralytics.data.converter import convert_dota_to_yolo_obb
|
438
|
+
>>> convert_dota_to_yolo_obb("path/to/DOTA")
|
438
439
|
|
439
440
|
Notes:
|
440
441
|
The directory structure assumed for the DOTA dataset:
|
@@ -478,21 +478,19 @@ class HUBDatasetStats:
|
|
478
478
|
task (str): Dataset task. Options are 'detect', 'segment', 'pose', 'classify'. Default is 'detect'.
|
479
479
|
autodownload (bool): Attempt to download dataset if not found locally. Default is False.
|
480
480
|
|
481
|
-
|
481
|
+
Note:
|
482
482
|
Download *.zip files from https://github.com/ultralytics/hub/tree/main/example_datasets
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
stats = HUBDatasetStats("path/to/coco8.zip", task="detect") # detect dataset
|
488
|
-
stats = HUBDatasetStats("path/to/coco8-seg.zip", task="segment") # segment dataset
|
489
|
-
stats = HUBDatasetStats("path/to/coco8-pose.zip", task="pose") # pose dataset
|
490
|
-
stats = HUBDatasetStats("path/to/dota8.zip", task="obb") # OBB dataset
|
491
|
-
stats = HUBDatasetStats("path/to/imagenet10.zip", task="classify") # classification dataset
|
492
|
-
|
493
|
-
stats.
|
494
|
-
stats.process_images()
|
495
|
-
```
|
483
|
+
i.e. https://github.com/ultralytics/hub/raw/main/example_datasets/coco8.zip for coco8.zip.
|
484
|
+
|
485
|
+
Examples:
|
486
|
+
>>> from ultralytics.data.utils import HUBDatasetStats
|
487
|
+
>>> stats = HUBDatasetStats("path/to/coco8.zip", task="detect") # detect dataset
|
488
|
+
>>> stats = HUBDatasetStats("path/to/coco8-seg.zip", task="segment") # segment dataset
|
489
|
+
>>> stats = HUBDatasetStats("path/to/coco8-pose.zip", task="pose") # pose dataset
|
490
|
+
>>> stats = HUBDatasetStats("path/to/dota8.zip", task="obb") # OBB dataset
|
491
|
+
>>> stats = HUBDatasetStats("path/to/imagenet10.zip", task="classify") # classification dataset
|
492
|
+
>>> stats.get_json(save=True)
|
493
|
+
>>> stats.process_images()
|
496
494
|
"""
|
497
495
|
|
498
496
|
def __init__(self, path="coco8.yaml", task="detect", autodownload=False):
|
@@ -639,14 +637,11 @@ def compress_one_image(f, f_new=None, max_dim=1920, quality=50):
|
|
639
637
|
max_dim (int, optional): The maximum dimension (width or height) of the output image. Default is 1920 pixels.
|
640
638
|
quality (int, optional): The image compression quality as a percentage. Default is 50%.
|
641
639
|
|
642
|
-
|
643
|
-
|
644
|
-
from
|
645
|
-
|
646
|
-
|
647
|
-
for f in Path("path/to/dataset").rglob("*.jpg"):
|
648
|
-
compress_one_image(f)
|
649
|
-
```
|
640
|
+
Examples:
|
641
|
+
>>> from pathlib import Path
|
642
|
+
>>> from ultralytics.data.utils import compress_one_image
|
643
|
+
>>> for f in Path("path/to/dataset").rglob("*.jpg"):
|
644
|
+
>>> compress_one_image(f)
|
650
645
|
"""
|
651
646
|
try: # use PIL
|
652
647
|
im = Image.open(f)
|
@@ -673,12 +668,9 @@ def autosplit(path=DATASETS_DIR / "coco8/images", weights=(0.9, 0.1, 0.0), annot
|
|
673
668
|
weights (list | tuple, optional): Train, validation, and test split fractions. Defaults to (0.9, 0.1, 0.0).
|
674
669
|
annotated_only (bool, optional): If True, only images with an associated txt file are used. Defaults to False.
|
675
670
|
|
676
|
-
|
677
|
-
|
678
|
-
|
679
|
-
|
680
|
-
autosplit()
|
681
|
-
```
|
671
|
+
Examples:
|
672
|
+
>>> from ultralytics.data.utils import autosplit
|
673
|
+
>>> autosplit()
|
682
674
|
"""
|
683
675
|
path = Path(path) # images dir
|
684
676
|
files = sorted(x for x in path.rglob("*.*") if x.suffix[1:].lower() in IMG_FORMATS) # image files only
|
@@ -1146,8 +1146,8 @@ class Model(torch.nn.Module):
|
|
1146
1146
|
(Model): The model instance with evaluation mode set.
|
1147
1147
|
|
1148
1148
|
Examples:
|
1149
|
-
|
1150
|
-
|
1149
|
+
>>> model = YOLO("yolo11n.pt")
|
1150
|
+
>>> model.eval()
|
1151
1151
|
"""
|
1152
1152
|
self.model.eval()
|
1153
1153
|
return self
|
@@ -7,14 +7,11 @@ Hyperparameter tuning is the process of systematically searching for the optimal
|
|
7
7
|
that yield the best model performance. This is particularly crucial in deep learning models like YOLO,
|
8
8
|
where small changes in hyperparameters can lead to significant differences in model accuracy and efficiency.
|
9
9
|
|
10
|
-
|
10
|
+
Examples:
|
11
11
|
Tune hyperparameters for YOLO11n on COCO8 at imgsz=640 and epochs=30 for 300 tuning iterations.
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
model = YOLO("yolo11n.pt")
|
16
|
-
model.tune(data="coco8.yaml", epochs=10, iterations=300, optimizer="AdamW", plots=False, save=False, val=False)
|
17
|
-
```
|
12
|
+
>>> from ultralytics import YOLO
|
13
|
+
>>> model = YOLO("yolo11n.pt")
|
14
|
+
>>> model.tune(data="coco8.yaml", epochs=10, iterations=300, optimizer="AdamW", plots=False, save=False, val=False)
|
18
15
|
"""
|
19
16
|
|
20
17
|
import random
|
@@ -49,22 +46,15 @@ class Tuner:
|
|
49
46
|
__call__():
|
50
47
|
Executes the hyperparameter evolution across multiple iterations.
|
51
48
|
|
52
|
-
|
49
|
+
Examples:
|
53
50
|
Tune hyperparameters for YOLO11n on COCO8 at imgsz=640 and epochs=30 for 300 tuning iterations.
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
```
|
60
|
-
|
51
|
+
>>> from ultralytics import YOLO
|
52
|
+
>>> model = YOLO("yolo11n.pt")
|
53
|
+
>>> model.tune(
|
54
|
+
... data="coco8.yaml", epochs=10, iterations=300, optimizer="AdamW", plots=False, save=False, val=False
|
55
|
+
... )
|
61
56
|
Tune with custom search space.
|
62
|
-
|
63
|
-
from ultralytics import YOLO
|
64
|
-
|
65
|
-
model = YOLO("yolo11n.pt")
|
66
|
-
model.tune(space={key1: val1, key2: val2}) # custom search space dictionary
|
67
|
-
```
|
57
|
+
>>> model.tune(space={key1: val1, key2: val2}) # custom search space dictionary
|
68
58
|
"""
|
69
59
|
|
70
60
|
def __init__(self, args=DEFAULT_CFG, _callbacks=None):
|