ultralytics 8.2.18__tar.gz → 8.2.20__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.18 → ultralytics-8.2.20}/PKG-INFO +1 -1
- {ultralytics-8.2.18 → ultralytics-8.2.20}/tests/test_cli.py +1 -1
- {ultralytics-8.2.18 → ultralytics-8.2.20}/tests/test_cuda.py +1 -1
- {ultralytics-8.2.18 → ultralytics-8.2.20}/tests/test_engine.py +1 -1
- {ultralytics-8.2.18 → ultralytics-8.2.20}/tests/test_exports.py +1 -2
- {ultralytics-8.2.18 → ultralytics-8.2.20}/tests/test_integrations.py +1 -1
- {ultralytics-8.2.18 → ultralytics-8.2.20}/tests/test_python.py +4 -4
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/__init__.py +1 -1
- ultralytics-8.2.20/ultralytics/cfg/datasets/signature.yaml +20 -0
- ultralytics-8.2.20/ultralytics/cfg/models/v9/yolov9c-seg.yaml +38 -0
- ultralytics-8.2.20/ultralytics/cfg/models/v9/yolov9c.yaml +38 -0
- ultralytics-8.2.20/ultralytics/cfg/models/v9/yolov9e-seg.yaml +61 -0
- ultralytics-8.2.20/ultralytics/cfg/models/v9/yolov9e.yaml +61 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/data/build.py +1 -1
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/engine/exporter.py +24 -16
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/engine/results.py +1 -1
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/solutions/__init__.py +2 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/solutions/ai_gym.py +3 -3
- ultralytics-8.2.20/ultralytics/solutions/analytics.py +197 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics.egg-info/PKG-INFO +1 -1
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics.egg-info/SOURCES.txt +2 -0
- ultralytics-8.2.18/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -38
- ultralytics-8.2.18/ultralytics/cfg/models/v9/yolov9c.yaml +0 -38
- ultralytics-8.2.18/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -61
- ultralytics-8.2.18/ultralytics/cfg/models/v9/yolov9e.yaml +0 -61
- {ultralytics-8.2.18 → ultralytics-8.2.20}/LICENSE +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/README.md +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/pyproject.toml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/setup.cfg +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/tests/test_explorer.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/assets/bus.jpg +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/assets/zidane.jpg +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/__init__.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/VOC.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/coco.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/coco128.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/coco8.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/dota8.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/lvis.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/xView.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/default.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/trackers/botsort.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/data/__init__.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/data/annotator.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/data/augment.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/data/base.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/data/converter.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/data/dataset.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/data/explorer/__init__.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/data/explorer/explorer.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/data/explorer/gui/__init__.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/data/explorer/gui/dash.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/data/explorer/utils.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/data/loaders.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/data/split_dota.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/data/utils.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/engine/__init__.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/engine/model.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/engine/predictor.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/engine/trainer.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/engine/tuner.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/engine/validator.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/hub/__init__.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/hub/auth.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/hub/session.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/hub/utils.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/__init__.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/fastsam/__init__.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/fastsam/model.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/fastsam/predict.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/fastsam/prompt.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/fastsam/utils.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/fastsam/val.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/nas/__init__.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/nas/model.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/nas/predict.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/nas/val.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/rtdetr/__init__.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/rtdetr/model.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/rtdetr/predict.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/rtdetr/train.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/rtdetr/val.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/sam/__init__.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/sam/amg.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/sam/build.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/sam/model.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/sam/modules/__init__.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/sam/modules/decoders.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/sam/modules/encoders.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/sam/modules/sam.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/sam/modules/transformer.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/sam/predict.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/utils/__init__.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/utils/loss.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/utils/ops.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/__init__.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/classify/__init__.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/classify/predict.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/classify/train.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/classify/val.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/detect/__init__.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/detect/predict.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/detect/train.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/detect/val.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/model.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/obb/__init__.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/obb/predict.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/obb/train.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/obb/val.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/pose/__init__.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/pose/predict.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/pose/train.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/pose/val.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/segment/__init__.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/segment/predict.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/segment/train.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/segment/val.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/world/__init__.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/world/train.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/world/train_world.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/nn/__init__.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/nn/autobackend.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/nn/modules/__init__.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/nn/modules/block.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/nn/modules/conv.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/nn/modules/head.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/nn/modules/transformer.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/nn/modules/utils.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/nn/tasks.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/solutions/distance_calculation.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/solutions/heatmap.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/solutions/object_counter.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/solutions/parking_management.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/solutions/queue_management.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/solutions/speed_estimation.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/trackers/__init__.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/trackers/basetrack.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/trackers/bot_sort.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/trackers/byte_tracker.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/trackers/track.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/trackers/utils/__init__.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/trackers/utils/gmc.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/trackers/utils/kalman_filter.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/trackers/utils/matching.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/__init__.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/autobatch.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/benchmarks.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/callbacks/__init__.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/callbacks/base.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/callbacks/clearml.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/callbacks/comet.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/callbacks/dvc.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/callbacks/hub.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/callbacks/mlflow.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/callbacks/neptune.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/callbacks/raytune.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/callbacks/tensorboard.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/callbacks/wb.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/checks.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/dist.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/downloads.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/errors.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/files.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/instance.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/loss.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/metrics.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/ops.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/patches.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/plotting.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/tal.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/torch_utils.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/triton.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/tuner.py +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics.egg-info/dependency_links.txt +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics.egg-info/entry_points.txt +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics.egg-info/requires.txt +0 -0
- {ultralytics-8.2.18 → ultralytics-8.2.20}/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.20
|
|
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
|
|
@@ -7,7 +7,7 @@ import pytest
|
|
|
7
7
|
from ultralytics.cfg import TASK2DATA, TASK2MODEL, TASKS
|
|
8
8
|
from ultralytics.utils import ASSETS, WEIGHTS_DIR, checks
|
|
9
9
|
|
|
10
|
-
from
|
|
10
|
+
from tests import CUDA_DEVICE_COUNT, CUDA_IS_AVAILABLE
|
|
11
11
|
|
|
12
12
|
# Constants
|
|
13
13
|
TASK_MODEL_DATA = [(task, WEIGHTS_DIR / TASK2MODEL[task], TASK2DATA[task]) for task in TASKS]
|
|
@@ -10,7 +10,7 @@ from ultralytics import YOLO
|
|
|
10
10
|
from ultralytics.utils import ASSETS, WEIGHTS_DIR
|
|
11
11
|
from ultralytics.cfg import TASK2DATA, TASK2MODEL, TASKS
|
|
12
12
|
|
|
13
|
-
from
|
|
13
|
+
from tests import CUDA_DEVICE_COUNT, CUDA_IS_AVAILABLE, MODEL, SOURCE
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
def test_checks():
|
|
@@ -9,7 +9,7 @@ from ultralytics.engine.exporter import Exporter
|
|
|
9
9
|
from ultralytics.models.yolo import classify, detect, segment
|
|
10
10
|
from ultralytics.utils import ASSETS, DEFAULT_CFG, WEIGHTS_DIR
|
|
11
11
|
|
|
12
|
-
from
|
|
12
|
+
from tests import MODEL
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
def test_func(*args): # noqa
|
|
@@ -12,7 +12,7 @@ from ultralytics import YOLO, download
|
|
|
12
12
|
from ultralytics.utils import DATASETS_DIR, SETTINGS
|
|
13
13
|
from ultralytics.utils.checks import check_requirements
|
|
14
14
|
|
|
15
|
-
from
|
|
15
|
+
from tests import MODEL, SOURCE, TMP
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
@pytest.mark.skipif(not check_requirements("ray", install=False), reason="ray[tune] not installed")
|
|
@@ -25,10 +25,9 @@ from ultralytics.utils import (
|
|
|
25
25
|
Retry,
|
|
26
26
|
checks,
|
|
27
27
|
)
|
|
28
|
-
from ultralytics.utils.downloads import download
|
|
28
|
+
from ultralytics.utils.downloads import download, is_url
|
|
29
29
|
from ultralytics.utils.torch_utils import TORCH_1_9
|
|
30
|
-
|
|
31
|
-
from . import CFG, IS_TMP_WRITEABLE, MODEL, SOURCE, TMP
|
|
30
|
+
from tests import CFG, IS_TMP_WRITEABLE, MODEL, SOURCE, TMP
|
|
32
31
|
|
|
33
32
|
|
|
34
33
|
def test_model_forward():
|
|
@@ -102,7 +101,7 @@ def test_predict_img(model_name):
|
|
|
102
101
|
def test_predict_visualize(model):
|
|
103
102
|
"""Test model predict methods with 'visualize=True' arguments."""
|
|
104
103
|
YOLO(WEIGHTS_DIR / model)(SOURCE, imgsz=32, visualize=True)
|
|
105
|
-
|
|
104
|
+
|
|
106
105
|
|
|
107
106
|
def test_predict_grey_and_4ch():
|
|
108
107
|
"""Test YOLO prediction on SOURCE converted to greyscale and 4-channel images."""
|
|
@@ -131,6 +130,7 @@ def test_predict_grey_and_4ch():
|
|
|
131
130
|
|
|
132
131
|
@pytest.mark.slow
|
|
133
132
|
@pytest.mark.skipif(not ONLINE, reason="environment is offline")
|
|
133
|
+
@pytest.mark.skipif(not is_url("https://youtu.be/G17sBkb38XQ"), reason="YouTube URL issue")
|
|
134
134
|
@Retry(times=3, delay=10)
|
|
135
135
|
def test_youtube():
|
|
136
136
|
"""
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Ultralytics YOLO 🚀, AGPL-3.0 license
|
|
2
|
+
# Signature dataset by Ultralytics
|
|
3
|
+
# Documentation: https://docs.ultralytics.com/datasets/detect/signature/
|
|
4
|
+
# Example usage: yolo train data=signature.yaml
|
|
5
|
+
# parent
|
|
6
|
+
# ├── ultralytics
|
|
7
|
+
# └── datasets
|
|
8
|
+
# └── signature ← downloads here (11.2 MB)
|
|
9
|
+
|
|
10
|
+
# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
|
|
11
|
+
path: ../datasets/signature # dataset root dir
|
|
12
|
+
train: train/images # train images (relative to 'path') 143 images
|
|
13
|
+
val: valid/images # val images (relative to 'path') 35 images
|
|
14
|
+
|
|
15
|
+
# Classes
|
|
16
|
+
names:
|
|
17
|
+
0: signature
|
|
18
|
+
|
|
19
|
+
# Download script/URL (optional)
|
|
20
|
+
download: https://ultralytics.com/assets/signature.zip
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Ultralytics YOLO 🚀, AGPL-3.0 license
|
|
2
|
+
# YOLOv9c-seg
|
|
3
|
+
# 654 layers, 27897120 parameters, 159.4 GFLOPs
|
|
4
|
+
|
|
5
|
+
# parameters
|
|
6
|
+
nc: 80 # number of classes
|
|
7
|
+
|
|
8
|
+
# gelan backbone
|
|
9
|
+
backbone:
|
|
10
|
+
- [-1, 1, Conv, [64, 3, 2]] # 0-P1/2
|
|
11
|
+
- [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
|
|
12
|
+
- [-1, 1, RepNCSPELAN4, [256, 128, 64, 1]] # 2
|
|
13
|
+
- [-1, 1, ADown, [256]] # 3-P3/8
|
|
14
|
+
- [-1, 1, RepNCSPELAN4, [512, 256, 128, 1]] # 4
|
|
15
|
+
- [-1, 1, ADown, [512]] # 5-P4/16
|
|
16
|
+
- [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]] # 6
|
|
17
|
+
- [-1, 1, ADown, [512]] # 7-P5/32
|
|
18
|
+
- [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]] # 8
|
|
19
|
+
- [-1, 1, SPPELAN, [512, 256]] # 9
|
|
20
|
+
|
|
21
|
+
head:
|
|
22
|
+
- [-1, 1, nn.Upsample, [None, 2, "nearest"]]
|
|
23
|
+
- [[-1, 6], 1, Concat, [1]] # cat backbone P4
|
|
24
|
+
- [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]] # 12
|
|
25
|
+
|
|
26
|
+
- [-1, 1, nn.Upsample, [None, 2, "nearest"]]
|
|
27
|
+
- [[-1, 4], 1, Concat, [1]] # cat backbone P3
|
|
28
|
+
- [-1, 1, RepNCSPELAN4, [256, 256, 128, 1]] # 15 (P3/8-small)
|
|
29
|
+
|
|
30
|
+
- [-1, 1, ADown, [256]]
|
|
31
|
+
- [[-1, 12], 1, Concat, [1]] # cat head P4
|
|
32
|
+
- [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]] # 18 (P4/16-medium)
|
|
33
|
+
|
|
34
|
+
- [-1, 1, ADown, [512]]
|
|
35
|
+
- [[-1, 9], 1, Concat, [1]] # cat head P5
|
|
36
|
+
- [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]] # 21 (P5/32-large)
|
|
37
|
+
|
|
38
|
+
- [[15, 18, 21], 1, Segment, [nc, 32, 256]] # Segment(P3, P4, P5)
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Ultralytics YOLO 🚀, AGPL-3.0 license
|
|
2
|
+
# YOLOv9c
|
|
3
|
+
# 618 layers, 25590912 parameters, 104.0 GFLOPs
|
|
4
|
+
|
|
5
|
+
# parameters
|
|
6
|
+
nc: 80 # number of classes
|
|
7
|
+
|
|
8
|
+
# gelan backbone
|
|
9
|
+
backbone:
|
|
10
|
+
- [-1, 1, Conv, [64, 3, 2]] # 0-P1/2
|
|
11
|
+
- [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
|
|
12
|
+
- [-1, 1, RepNCSPELAN4, [256, 128, 64, 1]] # 2
|
|
13
|
+
- [-1, 1, ADown, [256]] # 3-P3/8
|
|
14
|
+
- [-1, 1, RepNCSPELAN4, [512, 256, 128, 1]] # 4
|
|
15
|
+
- [-1, 1, ADown, [512]] # 5-P4/16
|
|
16
|
+
- [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]] # 6
|
|
17
|
+
- [-1, 1, ADown, [512]] # 7-P5/32
|
|
18
|
+
- [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]] # 8
|
|
19
|
+
- [-1, 1, SPPELAN, [512, 256]] # 9
|
|
20
|
+
|
|
21
|
+
head:
|
|
22
|
+
- [-1, 1, nn.Upsample, [None, 2, "nearest"]]
|
|
23
|
+
- [[-1, 6], 1, Concat, [1]] # cat backbone P4
|
|
24
|
+
- [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]] # 12
|
|
25
|
+
|
|
26
|
+
- [-1, 1, nn.Upsample, [None, 2, "nearest"]]
|
|
27
|
+
- [[-1, 4], 1, Concat, [1]] # cat backbone P3
|
|
28
|
+
- [-1, 1, RepNCSPELAN4, [256, 256, 128, 1]] # 15 (P3/8-small)
|
|
29
|
+
|
|
30
|
+
- [-1, 1, ADown, [256]]
|
|
31
|
+
- [[-1, 12], 1, Concat, [1]] # cat head P4
|
|
32
|
+
- [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]] # 18 (P4/16-medium)
|
|
33
|
+
|
|
34
|
+
- [-1, 1, ADown, [512]]
|
|
35
|
+
- [[-1, 9], 1, Concat, [1]] # cat head P5
|
|
36
|
+
- [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]] # 21 (P5/32-large)
|
|
37
|
+
|
|
38
|
+
- [[15, 18, 21], 1, Detect, [nc]] # Detect(P3, P4, P5)
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Ultralytics YOLO 🚀, AGPL-3.0 license
|
|
2
|
+
# YOLOv9c-seg
|
|
3
|
+
# 1261 layers, 60512800 parameters, 248.4 GFLOPs
|
|
4
|
+
|
|
5
|
+
# parameters
|
|
6
|
+
nc: 80 # number of classes
|
|
7
|
+
|
|
8
|
+
# gelan backbone
|
|
9
|
+
backbone:
|
|
10
|
+
- [-1, 1, Silence, []]
|
|
11
|
+
- [-1, 1, Conv, [64, 3, 2]] # 1-P1/2
|
|
12
|
+
- [-1, 1, Conv, [128, 3, 2]] # 2-P2/4
|
|
13
|
+
- [-1, 1, RepNCSPELAN4, [256, 128, 64, 2]] # 3
|
|
14
|
+
- [-1, 1, ADown, [256]] # 4-P3/8
|
|
15
|
+
- [-1, 1, RepNCSPELAN4, [512, 256, 128, 2]] # 5
|
|
16
|
+
- [-1, 1, ADown, [512]] # 6-P4/16
|
|
17
|
+
- [-1, 1, RepNCSPELAN4, [1024, 512, 256, 2]] # 7
|
|
18
|
+
- [-1, 1, ADown, [1024]] # 8-P5/32
|
|
19
|
+
- [-1, 1, RepNCSPELAN4, [1024, 512, 256, 2]] # 9
|
|
20
|
+
|
|
21
|
+
- [1, 1, CBLinear, [[64]]] # 10
|
|
22
|
+
- [3, 1, CBLinear, [[64, 128]]] # 11
|
|
23
|
+
- [5, 1, CBLinear, [[64, 128, 256]]] # 12
|
|
24
|
+
- [7, 1, CBLinear, [[64, 128, 256, 512]]] # 13
|
|
25
|
+
- [9, 1, CBLinear, [[64, 128, 256, 512, 1024]]] # 14
|
|
26
|
+
|
|
27
|
+
- [0, 1, Conv, [64, 3, 2]] # 15-P1/2
|
|
28
|
+
- [[10, 11, 12, 13, 14, -1], 1, CBFuse, [[0, 0, 0, 0, 0]]] # 16
|
|
29
|
+
- [-1, 1, Conv, [128, 3, 2]] # 17-P2/4
|
|
30
|
+
- [[11, 12, 13, 14, -1], 1, CBFuse, [[1, 1, 1, 1]]] # 18
|
|
31
|
+
- [-1, 1, RepNCSPELAN4, [256, 128, 64, 2]] # 19
|
|
32
|
+
- [-1, 1, ADown, [256]] # 20-P3/8
|
|
33
|
+
- [[12, 13, 14, -1], 1, CBFuse, [[2, 2, 2]]] # 21
|
|
34
|
+
- [-1, 1, RepNCSPELAN4, [512, 256, 128, 2]] # 22
|
|
35
|
+
- [-1, 1, ADown, [512]] # 23-P4/16
|
|
36
|
+
- [[13, 14, -1], 1, CBFuse, [[3, 3]]] # 24
|
|
37
|
+
- [-1, 1, RepNCSPELAN4, [1024, 512, 256, 2]] # 25
|
|
38
|
+
- [-1, 1, ADown, [1024]] # 26-P5/32
|
|
39
|
+
- [[14, -1], 1, CBFuse, [[4]]] # 27
|
|
40
|
+
- [-1, 1, RepNCSPELAN4, [1024, 512, 256, 2]] # 28
|
|
41
|
+
- [-1, 1, SPPELAN, [512, 256]] # 29
|
|
42
|
+
|
|
43
|
+
# gelan head
|
|
44
|
+
head:
|
|
45
|
+
- [-1, 1, nn.Upsample, [None, 2, "nearest"]]
|
|
46
|
+
- [[-1, 25], 1, Concat, [1]] # cat backbone P4
|
|
47
|
+
- [-1, 1, RepNCSPELAN4, [512, 512, 256, 2]] # 32
|
|
48
|
+
|
|
49
|
+
- [-1, 1, nn.Upsample, [None, 2, "nearest"]]
|
|
50
|
+
- [[-1, 22], 1, Concat, [1]] # cat backbone P3
|
|
51
|
+
- [-1, 1, RepNCSPELAN4, [256, 256, 128, 2]] # 35 (P3/8-small)
|
|
52
|
+
|
|
53
|
+
- [-1, 1, ADown, [256]]
|
|
54
|
+
- [[-1, 32], 1, Concat, [1]] # cat head P4
|
|
55
|
+
- [-1, 1, RepNCSPELAN4, [512, 512, 256, 2]] # 38 (P4/16-medium)
|
|
56
|
+
|
|
57
|
+
- [-1, 1, ADown, [512]]
|
|
58
|
+
- [[-1, 29], 1, Concat, [1]] # cat head P5
|
|
59
|
+
- [-1, 1, RepNCSPELAN4, [512, 1024, 512, 2]] # 41 (P5/32-large)
|
|
60
|
+
|
|
61
|
+
- [[35, 38, 41], 1, Segment, [nc, 32, 256]] # Segment (P3, P4, P5)
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Ultralytics YOLO 🚀, AGPL-3.0 license
|
|
2
|
+
# YOLOv9e
|
|
3
|
+
# 1225 layers, 58206592 parameters, 193.0 GFLOPs
|
|
4
|
+
|
|
5
|
+
# parameters
|
|
6
|
+
nc: 80 # number of classes
|
|
7
|
+
|
|
8
|
+
# gelan backbone
|
|
9
|
+
backbone:
|
|
10
|
+
- [-1, 1, Silence, []]
|
|
11
|
+
- [-1, 1, Conv, [64, 3, 2]] # 1-P1/2
|
|
12
|
+
- [-1, 1, Conv, [128, 3, 2]] # 2-P2/4
|
|
13
|
+
- [-1, 1, RepNCSPELAN4, [256, 128, 64, 2]] # 3
|
|
14
|
+
- [-1, 1, ADown, [256]] # 4-P3/8
|
|
15
|
+
- [-1, 1, RepNCSPELAN4, [512, 256, 128, 2]] # 5
|
|
16
|
+
- [-1, 1, ADown, [512]] # 6-P4/16
|
|
17
|
+
- [-1, 1, RepNCSPELAN4, [1024, 512, 256, 2]] # 7
|
|
18
|
+
- [-1, 1, ADown, [1024]] # 8-P5/32
|
|
19
|
+
- [-1, 1, RepNCSPELAN4, [1024, 512, 256, 2]] # 9
|
|
20
|
+
|
|
21
|
+
- [1, 1, CBLinear, [[64]]] # 10
|
|
22
|
+
- [3, 1, CBLinear, [[64, 128]]] # 11
|
|
23
|
+
- [5, 1, CBLinear, [[64, 128, 256]]] # 12
|
|
24
|
+
- [7, 1, CBLinear, [[64, 128, 256, 512]]] # 13
|
|
25
|
+
- [9, 1, CBLinear, [[64, 128, 256, 512, 1024]]] # 14
|
|
26
|
+
|
|
27
|
+
- [0, 1, Conv, [64, 3, 2]] # 15-P1/2
|
|
28
|
+
- [[10, 11, 12, 13, 14, -1], 1, CBFuse, [[0, 0, 0, 0, 0]]] # 16
|
|
29
|
+
- [-1, 1, Conv, [128, 3, 2]] # 17-P2/4
|
|
30
|
+
- [[11, 12, 13, 14, -1], 1, CBFuse, [[1, 1, 1, 1]]] # 18
|
|
31
|
+
- [-1, 1, RepNCSPELAN4, [256, 128, 64, 2]] # 19
|
|
32
|
+
- [-1, 1, ADown, [256]] # 20-P3/8
|
|
33
|
+
- [[12, 13, 14, -1], 1, CBFuse, [[2, 2, 2]]] # 21
|
|
34
|
+
- [-1, 1, RepNCSPELAN4, [512, 256, 128, 2]] # 22
|
|
35
|
+
- [-1, 1, ADown, [512]] # 23-P4/16
|
|
36
|
+
- [[13, 14, -1], 1, CBFuse, [[3, 3]]] # 24
|
|
37
|
+
- [-1, 1, RepNCSPELAN4, [1024, 512, 256, 2]] # 25
|
|
38
|
+
- [-1, 1, ADown, [1024]] # 26-P5/32
|
|
39
|
+
- [[14, -1], 1, CBFuse, [[4]]] # 27
|
|
40
|
+
- [-1, 1, RepNCSPELAN4, [1024, 512, 256, 2]] # 28
|
|
41
|
+
- [-1, 1, SPPELAN, [512, 256]] # 29
|
|
42
|
+
|
|
43
|
+
# gelan head
|
|
44
|
+
head:
|
|
45
|
+
- [-1, 1, nn.Upsample, [None, 2, "nearest"]]
|
|
46
|
+
- [[-1, 25], 1, Concat, [1]] # cat backbone P4
|
|
47
|
+
- [-1, 1, RepNCSPELAN4, [512, 512, 256, 2]] # 32
|
|
48
|
+
|
|
49
|
+
- [-1, 1, nn.Upsample, [None, 2, "nearest"]]
|
|
50
|
+
- [[-1, 22], 1, Concat, [1]] # cat backbone P3
|
|
51
|
+
- [-1, 1, RepNCSPELAN4, [256, 256, 128, 2]] # 35 (P3/8-small)
|
|
52
|
+
|
|
53
|
+
- [-1, 1, ADown, [256]]
|
|
54
|
+
- [[-1, 32], 1, Concat, [1]] # cat head P4
|
|
55
|
+
- [-1, 1, RepNCSPELAN4, [512, 512, 256, 2]] # 38 (P4/16-medium)
|
|
56
|
+
|
|
57
|
+
- [-1, 1, ADown, [512]]
|
|
58
|
+
- [[-1, 29], 1, Concat, [1]] # cat head P5
|
|
59
|
+
- [-1, 1, RepNCSPELAN4, [512, 1024, 512, 2]] # 41 (P5/32-large)
|
|
60
|
+
|
|
61
|
+
- [[35, 38, 41], 1, Detect, [nc]] # Detect(P3, P4, P5)
|
|
@@ -128,7 +128,7 @@ def build_dataloader(dataset, batch, workers, shuffle=True, rank=-1):
|
|
|
128
128
|
"""Return an InfiniteDataLoader or DataLoader for training or validation set."""
|
|
129
129
|
batch = min(batch, len(dataset))
|
|
130
130
|
nd = torch.cuda.device_count() # number of CUDA devices
|
|
131
|
-
nw = min(
|
|
131
|
+
nw = min(os.cpu_count() // max(nd, 1), workers) # number of workers
|
|
132
132
|
sampler = None if rank == -1 else distributed.DistributedSampler(dataset, shuffle=shuffle)
|
|
133
133
|
generator = torch.Generator()
|
|
134
134
|
generator.manual_seed(6148914691236517205 + RANK)
|
|
@@ -195,6 +195,9 @@ class Exporter:
|
|
|
195
195
|
if not hasattr(model, "names"):
|
|
196
196
|
model.names = default_class_names()
|
|
197
197
|
model.names = check_class_names(model.names)
|
|
198
|
+
if self.args.half and self.args.int8:
|
|
199
|
+
LOGGER.warning("WARNING ⚠️ half=True and int8=True are mutually exclusive, setting half=False.")
|
|
200
|
+
self.args.half = False
|
|
198
201
|
if self.args.half and onnx and self.device.type == "cpu":
|
|
199
202
|
LOGGER.warning("WARNING ⚠️ half=True only compatible with GPU export, i.e. use device=0")
|
|
200
203
|
self.args.half = False
|
|
@@ -1012,12 +1015,17 @@ class Exporter:
|
|
|
1012
1015
|
|
|
1013
1016
|
def _add_tflite_metadata(self, file):
|
|
1014
1017
|
"""Add metadata to *.tflite models per https://www.tensorflow.org/lite/models/convert/metadata."""
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
+
import flatbuffers
|
|
1019
|
+
|
|
1020
|
+
if MACOS: # TFLite Support bug https://github.com/tensorflow/tflite-support/issues/954#issuecomment-2108570845
|
|
1021
|
+
from tflite_support import metadata # noqa
|
|
1022
|
+
from tflite_support import metadata_schema_py_generated as schema # noqa
|
|
1023
|
+
else:
|
|
1024
|
+
from tensorflow_lite_support.metadata import metadata_schema_py_generated as schema # noqa
|
|
1025
|
+
from tensorflow_lite_support.metadata.python import metadata # noqa
|
|
1018
1026
|
|
|
1019
1027
|
# Create model info
|
|
1020
|
-
model_meta =
|
|
1028
|
+
model_meta = schema.ModelMetadataT()
|
|
1021
1029
|
model_meta.name = self.metadata["description"]
|
|
1022
1030
|
model_meta.version = self.metadata["version"]
|
|
1023
1031
|
model_meta.author = self.metadata["author"]
|
|
@@ -1028,41 +1036,41 @@ class Exporter:
|
|
|
1028
1036
|
with open(tmp_file, "w") as f:
|
|
1029
1037
|
f.write(str(self.metadata))
|
|
1030
1038
|
|
|
1031
|
-
label_file =
|
|
1039
|
+
label_file = schema.AssociatedFileT()
|
|
1032
1040
|
label_file.name = tmp_file.name
|
|
1033
|
-
label_file.type =
|
|
1041
|
+
label_file.type = schema.AssociatedFileType.TENSOR_AXIS_LABELS
|
|
1034
1042
|
|
|
1035
1043
|
# Create input info
|
|
1036
|
-
input_meta =
|
|
1044
|
+
input_meta = schema.TensorMetadataT()
|
|
1037
1045
|
input_meta.name = "image"
|
|
1038
1046
|
input_meta.description = "Input image to be detected."
|
|
1039
|
-
input_meta.content =
|
|
1040
|
-
input_meta.content.contentProperties =
|
|
1041
|
-
input_meta.content.contentProperties.colorSpace =
|
|
1042
|
-
input_meta.content.contentPropertiesType =
|
|
1047
|
+
input_meta.content = schema.ContentT()
|
|
1048
|
+
input_meta.content.contentProperties = schema.ImagePropertiesT()
|
|
1049
|
+
input_meta.content.contentProperties.colorSpace = schema.ColorSpaceType.RGB
|
|
1050
|
+
input_meta.content.contentPropertiesType = schema.ContentProperties.ImageProperties
|
|
1043
1051
|
|
|
1044
1052
|
# Create output info
|
|
1045
|
-
output1 =
|
|
1053
|
+
output1 = schema.TensorMetadataT()
|
|
1046
1054
|
output1.name = "output"
|
|
1047
1055
|
output1.description = "Coordinates of detected objects, class labels, and confidence score"
|
|
1048
1056
|
output1.associatedFiles = [label_file]
|
|
1049
1057
|
if self.model.task == "segment":
|
|
1050
|
-
output2 =
|
|
1058
|
+
output2 = schema.TensorMetadataT()
|
|
1051
1059
|
output2.name = "output"
|
|
1052
1060
|
output2.description = "Mask protos"
|
|
1053
1061
|
output2.associatedFiles = [label_file]
|
|
1054
1062
|
|
|
1055
1063
|
# Create subgraph info
|
|
1056
|
-
subgraph =
|
|
1064
|
+
subgraph = schema.SubGraphMetadataT()
|
|
1057
1065
|
subgraph.inputTensorMetadata = [input_meta]
|
|
1058
1066
|
subgraph.outputTensorMetadata = [output1, output2] if self.model.task == "segment" else [output1]
|
|
1059
1067
|
model_meta.subgraphMetadata = [subgraph]
|
|
1060
1068
|
|
|
1061
1069
|
b = flatbuffers.Builder(0)
|
|
1062
|
-
b.Finish(model_meta.Pack(b),
|
|
1070
|
+
b.Finish(model_meta.Pack(b), metadata.MetadataPopulator.METADATA_FILE_IDENTIFIER)
|
|
1063
1071
|
metadata_buf = b.Output()
|
|
1064
1072
|
|
|
1065
|
-
populator =
|
|
1073
|
+
populator = metadata.MetadataPopulator.with_model_file(str(file))
|
|
1066
1074
|
populator.load_metadata_buffer(metadata_buf)
|
|
1067
1075
|
populator.load_associated_files([str(tmp_file)])
|
|
1068
1076
|
populator.populate()
|
|
@@ -402,8 +402,8 @@ class Results(SimpleClass):
|
|
|
402
402
|
)
|
|
403
403
|
return results
|
|
404
404
|
|
|
405
|
-
data = self.boxes or self.obb
|
|
406
405
|
is_obb = self.obb is not None
|
|
406
|
+
data = self.obb if is_obb else self.boxes
|
|
407
407
|
h, w = self.orig_shape if normalize else (1, 1)
|
|
408
408
|
for i, row in enumerate(data): # xyxy, track_id if tracking, conf, class_id
|
|
409
409
|
class_id, conf = int(row.cls), round(row.conf.item(), decimals)
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# Ultralytics YOLO 🚀, AGPL-3.0 license
|
|
2
2
|
|
|
3
3
|
from .ai_gym import AIGym
|
|
4
|
+
from .analytics import Analytics
|
|
4
5
|
from .distance_calculation import DistanceCalculation
|
|
5
6
|
from .heatmap import Heatmap
|
|
6
7
|
from .object_counter import ObjectCounter
|
|
@@ -16,4 +17,5 @@ __all__ = (
|
|
|
16
17
|
"ParkingManagement",
|
|
17
18
|
"QueueManager",
|
|
18
19
|
"SpeedEstimator",
|
|
20
|
+
"Analytics",
|
|
19
21
|
)
|
|
@@ -73,11 +73,11 @@ class AIGym:
|
|
|
73
73
|
self.stage = ["-" for _ in results[0]]
|
|
74
74
|
|
|
75
75
|
self.keypoints = results[0].keypoints.data
|
|
76
|
-
self.annotator = Annotator(im0, line_width=
|
|
76
|
+
self.annotator = Annotator(im0, line_width=self.tf)
|
|
77
77
|
|
|
78
78
|
for ind, k in enumerate(reversed(self.keypoints)):
|
|
79
79
|
# Estimate angle and draw specific points based on pose type
|
|
80
|
-
if self.pose_type in {"pushup", "pullup", "abworkout"}:
|
|
80
|
+
if self.pose_type in {"pushup", "pullup", "abworkout", "squat"}:
|
|
81
81
|
self.angle[ind] = self.annotator.estimate_pose_angle(
|
|
82
82
|
k[int(self.kpts_to_check[0])].cpu(),
|
|
83
83
|
k[int(self.kpts_to_check[1])].cpu(),
|
|
@@ -93,7 +93,7 @@ class AIGym:
|
|
|
93
93
|
self.stage[ind] = "up"
|
|
94
94
|
self.count[ind] += 1
|
|
95
95
|
|
|
96
|
-
elif self.pose_type == "pushup":
|
|
96
|
+
elif self.pose_type == "pushup" or self.pose_type == "squat":
|
|
97
97
|
if self.angle[ind] > self.poseup_angle:
|
|
98
98
|
self.stage[ind] = "up"
|
|
99
99
|
if self.angle[ind] < self.posedown_angle and self.stage[ind] == "up":
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
from itertools import cycle
|
|
2
|
+
|
|
3
|
+
import cv2
|
|
4
|
+
import matplotlib.pyplot as plt
|
|
5
|
+
import numpy as np
|
|
6
|
+
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
|
|
7
|
+
from matplotlib.figure import Figure
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class Analytics:
|
|
11
|
+
"""A class to create and update various types of charts (line, bar, pie) for visual analytics."""
|
|
12
|
+
|
|
13
|
+
def __init__(
|
|
14
|
+
self,
|
|
15
|
+
type,
|
|
16
|
+
writer,
|
|
17
|
+
im0_shape,
|
|
18
|
+
title="ultralytics",
|
|
19
|
+
x_label="x",
|
|
20
|
+
y_label="y",
|
|
21
|
+
bg_color="white",
|
|
22
|
+
fg_color="black",
|
|
23
|
+
line_color="yellow",
|
|
24
|
+
line_width=2,
|
|
25
|
+
fontsize=13,
|
|
26
|
+
view_img=False,
|
|
27
|
+
save_img=True,
|
|
28
|
+
):
|
|
29
|
+
"""
|
|
30
|
+
Initialize the Analytics class with various chart types.
|
|
31
|
+
|
|
32
|
+
Args:
|
|
33
|
+
type (str): Type of chart to initialize ('line', 'bar', or 'pie').
|
|
34
|
+
writer: Video writer object to save the frames.
|
|
35
|
+
im0_shape (tuple): Shape of the input image (width, height).
|
|
36
|
+
title (str): Title of the chart.
|
|
37
|
+
x_label (str): Label for the x-axis.
|
|
38
|
+
y_label (str): Label for the y-axis.
|
|
39
|
+
bg_color (str): Background color of the chart.
|
|
40
|
+
fg_color (str): Foreground (text) color of the chart.
|
|
41
|
+
line_color (str): Line color for line charts.
|
|
42
|
+
line_width (int): Width of the lines in line charts.
|
|
43
|
+
fontsize (int): Font size for chart text.
|
|
44
|
+
view_img (bool): Whether to display the image.
|
|
45
|
+
save_img (bool): Whether to save the image.
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
self.bg_color = bg_color
|
|
49
|
+
self.fg_color = fg_color
|
|
50
|
+
self.view_img = view_img
|
|
51
|
+
self.save_img = save_img
|
|
52
|
+
self.title = title
|
|
53
|
+
self.writer = writer
|
|
54
|
+
|
|
55
|
+
# Set figure size based on image shape
|
|
56
|
+
figsize = (im0_shape[0] / 100, im0_shape[1] / 100)
|
|
57
|
+
|
|
58
|
+
if type == "line":
|
|
59
|
+
# Initialize line plot
|
|
60
|
+
fig = Figure(facecolor=self.bg_color, figsize=figsize)
|
|
61
|
+
self.canvas = FigureCanvas(fig)
|
|
62
|
+
self.ax = fig.add_subplot(111, facecolor=self.bg_color)
|
|
63
|
+
(self.line,) = self.ax.plot([], [], color=line_color, linewidth=line_width)
|
|
64
|
+
|
|
65
|
+
elif type == "bar" or type == "pie":
|
|
66
|
+
# Initialize bar or pie plot
|
|
67
|
+
self.fig, self.ax = plt.subplots(figsize=figsize, facecolor=self.bg_color)
|
|
68
|
+
self.ax.set_facecolor(self.bg_color)
|
|
69
|
+
color_palette = [
|
|
70
|
+
(31, 119, 180),
|
|
71
|
+
(255, 127, 14),
|
|
72
|
+
(44, 160, 44),
|
|
73
|
+
(214, 39, 40),
|
|
74
|
+
(148, 103, 189),
|
|
75
|
+
(140, 86, 75),
|
|
76
|
+
(227, 119, 194),
|
|
77
|
+
(127, 127, 127),
|
|
78
|
+
(188, 189, 34),
|
|
79
|
+
(23, 190, 207),
|
|
80
|
+
]
|
|
81
|
+
self.color_palette = [(r / 255, g / 255, b / 255, 1) for r, g, b in color_palette]
|
|
82
|
+
self.color_cycle = cycle(self.color_palette)
|
|
83
|
+
self.color_mapping = {}
|
|
84
|
+
|
|
85
|
+
# Ensure pie chart is circular
|
|
86
|
+
self.ax.axis("equal") if type == "pie" else None
|
|
87
|
+
|
|
88
|
+
# Set common axis properties
|
|
89
|
+
self.ax.set_title(self.title, color=self.fg_color, fontsize=fontsize)
|
|
90
|
+
self.ax.set_xlabel(x_label, color=self.fg_color, fontsize=fontsize - 3)
|
|
91
|
+
self.ax.set_ylabel(y_label, color=self.fg_color, fontsize=fontsize - 3)
|
|
92
|
+
self.ax.tick_params(axis="both", colors=self.fg_color)
|
|
93
|
+
|
|
94
|
+
def update_line(self, frame_number, total_counts):
|
|
95
|
+
"""
|
|
96
|
+
Update the line graph with new data.
|
|
97
|
+
|
|
98
|
+
Args:
|
|
99
|
+
frame_number (int): The current frame number.
|
|
100
|
+
total_counts (int): The total counts to plot.
|
|
101
|
+
"""
|
|
102
|
+
|
|
103
|
+
# Update line graph data
|
|
104
|
+
x_data = self.line.get_xdata()
|
|
105
|
+
y_data = self.line.get_ydata()
|
|
106
|
+
x_data = np.append(x_data, float(frame_number))
|
|
107
|
+
y_data = np.append(y_data, float(total_counts))
|
|
108
|
+
self.line.set_data(x_data, y_data)
|
|
109
|
+
self.ax.relim()
|
|
110
|
+
self.ax.autoscale_view()
|
|
111
|
+
self.canvas.draw()
|
|
112
|
+
im0 = np.array(self.canvas.renderer.buffer_rgba())
|
|
113
|
+
im0 = cv2.cvtColor(im0[:, :, :3], cv2.COLOR_RGBA2BGR)
|
|
114
|
+
|
|
115
|
+
# Display and save the updated graph
|
|
116
|
+
cv2.imshow(self.title, im0) if self.view_img else None
|
|
117
|
+
self.writer.write(im0) if self.save_img else None
|
|
118
|
+
|
|
119
|
+
def update_bar(self, count_dict):
|
|
120
|
+
"""
|
|
121
|
+
Update the bar graph with new data.
|
|
122
|
+
|
|
123
|
+
Args:
|
|
124
|
+
count_dict (dict): Dictionary containing the count data to plot.
|
|
125
|
+
"""
|
|
126
|
+
|
|
127
|
+
# Update bar graph data
|
|
128
|
+
self.ax.clear()
|
|
129
|
+
self.ax.set_facecolor(self.bg_color)
|
|
130
|
+
labels = list(count_dict.keys())
|
|
131
|
+
counts = list(count_dict.values())
|
|
132
|
+
|
|
133
|
+
# Map labels to colors
|
|
134
|
+
for label in labels:
|
|
135
|
+
if label not in self.color_mapping:
|
|
136
|
+
self.color_mapping[label] = next(self.color_cycle)
|
|
137
|
+
|
|
138
|
+
colors = [self.color_mapping[label] for label in labels]
|
|
139
|
+
|
|
140
|
+
bars = self.ax.bar(labels, counts, color=colors)
|
|
141
|
+
for bar, count in zip(bars, counts):
|
|
142
|
+
self.ax.text(
|
|
143
|
+
bar.get_x() + bar.get_width() / 2,
|
|
144
|
+
bar.get_height(),
|
|
145
|
+
str(count),
|
|
146
|
+
ha="center",
|
|
147
|
+
va="bottom",
|
|
148
|
+
color=self.fg_color,
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
# Display and save the updated graph
|
|
152
|
+
canvas = FigureCanvas(self.fig)
|
|
153
|
+
canvas.draw()
|
|
154
|
+
buf = canvas.buffer_rgba()
|
|
155
|
+
im0 = np.asarray(buf)
|
|
156
|
+
im0 = cv2.cvtColor(im0, cv2.COLOR_RGBA2BGR)
|
|
157
|
+
|
|
158
|
+
self.writer.write(im0) if self.save_img else None
|
|
159
|
+
cv2.imshow(self.title, im0) if self.view_img else None
|
|
160
|
+
|
|
161
|
+
def update_pie(self, classes_dict):
|
|
162
|
+
"""
|
|
163
|
+
Update the pie chart with new data.
|
|
164
|
+
|
|
165
|
+
Args:
|
|
166
|
+
classes_dict (dict): Dictionary containing the class data to plot.
|
|
167
|
+
"""
|
|
168
|
+
|
|
169
|
+
# Update pie chart data
|
|
170
|
+
labels = list(classes_dict.keys())
|
|
171
|
+
sizes = list(classes_dict.values())
|
|
172
|
+
total = sum(sizes)
|
|
173
|
+
percentages = [size / total * 100 for size in sizes]
|
|
174
|
+
start_angle = 90
|
|
175
|
+
self.ax.clear()
|
|
176
|
+
|
|
177
|
+
# Create pie chart without labels inside the slices
|
|
178
|
+
wedges, autotexts = self.ax.pie(sizes, autopct=None, startangle=start_angle, textprops={"color": self.fg_color})
|
|
179
|
+
|
|
180
|
+
# Construct legend labels with percentages
|
|
181
|
+
legend_labels = [f"{label} ({percentage:.1f}%)" for label, percentage in zip(labels, percentages)]
|
|
182
|
+
self.ax.legend(wedges, legend_labels, title="Classes", loc="center left", bbox_to_anchor=(1, 0, 0.5, 1))
|
|
183
|
+
|
|
184
|
+
# Adjust layout to fit the legend
|
|
185
|
+
self.fig.tight_layout()
|
|
186
|
+
self.fig.subplots_adjust(left=0.1, right=0.75)
|
|
187
|
+
|
|
188
|
+
# Display and save the updated chart
|
|
189
|
+
im0 = self.fig.canvas.draw()
|
|
190
|
+
im0 = np.array(self.fig.canvas.renderer.buffer_rgba())
|
|
191
|
+
im0 = cv2.cvtColor(im0[:, :, :3], cv2.COLOR_RGBA2BGR)
|
|
192
|
+
self.writer.write(im0) if self.save_img else None
|
|
193
|
+
cv2.imshow(self.title, im0) if self.view_img else None
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
if __name__ == "__main__":
|
|
197
|
+
Analytics("line", writer=None, im0_shape=None)
|