ultralytics 8.2.98__tar.gz → 8.2.99__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.98/ultralytics.egg-info → ultralytics-8.2.99}/PKG-INFO +8 -5
- {ultralytics-8.2.98 → ultralytics-8.2.99}/pyproject.toml +8 -8
- {ultralytics-8.2.98 → ultralytics-8.2.99}/tests/test_exports.py +0 -1
- {ultralytics-8.2.98 → ultralytics-8.2.99}/tests/test_integrations.py +2 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/__init__.py +1 -1
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/__init__.py +4 -4
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/data/utils.py +2 -2
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/hub/__init__.py +0 -1
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/utils/__init__.py +139 -104
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/utils/benchmarks.py +16 -5
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/utils/torch_utils.py +0 -2
- {ultralytics-8.2.98 → ultralytics-8.2.99/ultralytics.egg-info}/PKG-INFO +8 -5
- {ultralytics-8.2.98 → ultralytics-8.2.99}/LICENSE +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/README.md +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/setup.cfg +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/tests/__init__.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/tests/conftest.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/tests/test_cli.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/tests/test_cuda.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/tests/test_engine.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/tests/test_explorer.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/tests/test_python.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/tests/test_solutions.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/assets/bus.jpg +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/assets/zidane.jpg +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/datasets/VOC.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/datasets/coco.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/datasets/coco128.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/datasets/coco8.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/datasets/dota8.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/datasets/lvis.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/datasets/signature.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/datasets/xView.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/default.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/models/v10/yolov10b.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/models/v10/yolov10l.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/models/v10/yolov10m.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/models/v10/yolov10n.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/models/v10/yolov10s.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/models/v10/yolov10x.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/models/v9/yolov9m.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/models/v9/yolov9s.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/models/v9/yolov9t.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/trackers/botsort.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/data/__init__.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/data/annotator.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/data/augment.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/data/base.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/data/build.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/data/converter.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/data/dataset.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/data/explorer/__init__.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/data/explorer/explorer.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/data/explorer/gui/__init__.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/data/explorer/gui/dash.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/data/explorer/utils.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/data/loaders.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/data/split_dota.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/engine/__init__.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/engine/exporter.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/engine/model.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/engine/predictor.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/engine/results.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/engine/trainer.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/engine/tuner.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/engine/validator.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/hub/auth.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/hub/google/__init__.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/hub/session.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/hub/utils.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/__init__.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/fastsam/__init__.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/fastsam/model.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/fastsam/predict.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/fastsam/utils.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/fastsam/val.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/nas/__init__.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/nas/model.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/nas/predict.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/nas/val.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/rtdetr/__init__.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/rtdetr/model.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/rtdetr/predict.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/rtdetr/train.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/rtdetr/val.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/sam/__init__.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/sam/amg.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/sam/build.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/sam/model.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/sam/modules/__init__.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/sam/modules/blocks.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/sam/modules/decoders.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/sam/modules/encoders.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/sam/modules/memory_attention.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/sam/modules/sam.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/sam/modules/transformer.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/sam/modules/utils.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/sam/predict.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/utils/__init__.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/utils/loss.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/utils/ops.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/yolo/__init__.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/yolo/classify/__init__.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/yolo/classify/predict.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/yolo/classify/train.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/yolo/classify/val.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/yolo/detect/__init__.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/yolo/detect/predict.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/yolo/detect/train.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/yolo/detect/val.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/yolo/model.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/yolo/obb/__init__.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/yolo/obb/predict.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/yolo/obb/train.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/yolo/obb/val.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/yolo/pose/__init__.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/yolo/pose/predict.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/yolo/pose/train.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/yolo/pose/val.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/yolo/segment/__init__.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/yolo/segment/predict.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/yolo/segment/train.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/yolo/segment/val.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/yolo/world/__init__.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/yolo/world/train.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/models/yolo/world/train_world.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/nn/__init__.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/nn/autobackend.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/nn/modules/__init__.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/nn/modules/activation.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/nn/modules/block.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/nn/modules/conv.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/nn/modules/head.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/nn/modules/transformer.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/nn/modules/utils.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/nn/tasks.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/solutions/__init__.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/solutions/ai_gym.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/solutions/analytics.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/solutions/distance_calculation.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/solutions/heatmap.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/solutions/object_counter.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/solutions/parking_management.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/solutions/queue_management.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/solutions/speed_estimation.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/solutions/streamlit_inference.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/trackers/__init__.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/trackers/basetrack.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/trackers/bot_sort.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/trackers/byte_tracker.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/trackers/track.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/trackers/utils/__init__.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/trackers/utils/gmc.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/trackers/utils/kalman_filter.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/trackers/utils/matching.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/utils/autobatch.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/utils/callbacks/__init__.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/utils/callbacks/base.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/utils/callbacks/clearml.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/utils/callbacks/comet.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/utils/callbacks/dvc.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/utils/callbacks/hub.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/utils/callbacks/mlflow.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/utils/callbacks/neptune.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/utils/callbacks/raytune.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/utils/callbacks/tensorboard.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/utils/callbacks/wb.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/utils/checks.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/utils/dist.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/utils/downloads.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/utils/errors.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/utils/files.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/utils/instance.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/utils/loss.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/utils/metrics.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/utils/ops.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/utils/patches.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/utils/plotting.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/utils/tal.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/utils/triton.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics/utils/tuner.py +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics.egg-info/SOURCES.txt +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics.egg-info/dependency_links.txt +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics.egg-info/entry_points.txt +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics.egg-info/requires.txt +0 -0
- {ultralytics-8.2.98 → ultralytics-8.2.99}/ultralytics.egg-info/top_level.txt +0 -0
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: ultralytics
|
|
3
|
-
Version: 8.2.
|
|
3
|
+
Version: 8.2.99
|
|
4
4
|
Summary: Ultralytics YOLO for SOTA object detection, multi-object tracking, instance segmentation, pose estimation and image classification.
|
|
5
|
-
Author:
|
|
6
|
-
|
|
5
|
+
Author: Ayush Chaurasia
|
|
6
|
+
Author-email: Glenn Jocher <glenn.jocher@ultralytics.com>, Jing Qiu <jing.qiu@ultralytics.com>
|
|
7
|
+
Maintainer-email: Ultralytics <hello@ultralytics.com>
|
|
7
8
|
License: AGPL-3.0
|
|
9
|
+
Project-URL: Homepage, https://ultralytics.com
|
|
10
|
+
Project-URL: Source, https://github.com/ultralytics/ultralytics
|
|
11
|
+
Project-URL: Documentation, https://docs.ultralytics.com
|
|
8
12
|
Project-URL: Bug Reports, https://github.com/ultralytics/ultralytics/issues
|
|
9
|
-
Project-URL:
|
|
10
|
-
Project-URL: Source, https://github.com/ultralytics/ultralytics/
|
|
13
|
+
Project-URL: Changelog, https://github.com/ultralytics/ultralytics/releases
|
|
11
14
|
Keywords: machine-learning,deep-learning,computer-vision,ML,DL,AI,YOLO,YOLOv3,YOLOv5,YOLOv8,YOLOv9,YOLOv10,HUB,Ultralytics
|
|
12
15
|
Classifier: Development Status :: 4 - Beta
|
|
13
16
|
Classifier: Intended Audience :: Developers
|
|
@@ -32,14 +32,12 @@ requires-python = ">=3.8"
|
|
|
32
32
|
license = { "text" = "AGPL-3.0" }
|
|
33
33
|
keywords = ["machine-learning", "deep-learning", "computer-vision", "ML", "DL", "AI", "YOLO", "YOLOv3", "YOLOv5", "YOLOv8", "YOLOv9", "YOLOv10", "HUB", "Ultralytics"]
|
|
34
34
|
authors = [
|
|
35
|
-
{ name = "Glenn Jocher" },
|
|
36
|
-
{ name = "
|
|
37
|
-
{ name = "
|
|
35
|
+
{ name = "Glenn Jocher", email = "glenn.jocher@ultralytics.com"},
|
|
36
|
+
{ name = "Jing Qiu", email = "jing.qiu@ultralytics.com"},
|
|
37
|
+
{ name = "Ayush Chaurasia" }
|
|
38
38
|
]
|
|
39
39
|
maintainers = [
|
|
40
|
-
{ name = "
|
|
41
|
-
{ name = "Ayush Chaurasia" },
|
|
42
|
-
{ name = "Jing Qiu" }
|
|
40
|
+
{ name = "Ultralytics", email = "hello@ultralytics.com" }
|
|
43
41
|
]
|
|
44
42
|
classifiers = [
|
|
45
43
|
"Development Status :: 4 - Beta",
|
|
@@ -127,9 +125,11 @@ extra = [
|
|
|
127
125
|
]
|
|
128
126
|
|
|
129
127
|
[project.urls]
|
|
128
|
+
"Homepage" = "https://ultralytics.com"
|
|
129
|
+
"Source" = "https://github.com/ultralytics/ultralytics"
|
|
130
|
+
"Documentation" = "https://docs.ultralytics.com"
|
|
130
131
|
"Bug Reports" = "https://github.com/ultralytics/ultralytics/issues"
|
|
131
|
-
"
|
|
132
|
-
"Source" = "https://github.com/ultralytics/ultralytics/"
|
|
132
|
+
"Changelog" = "https://github.com/ultralytics/ultralytics/releases"
|
|
133
133
|
|
|
134
134
|
[project.scripts]
|
|
135
135
|
yolo = "ultralytics.cfg:entrypoint"
|
|
@@ -32,7 +32,6 @@ def test_export_onnx():
|
|
|
32
32
|
YOLO(file)(SOURCE, imgsz=32) # exported model inference
|
|
33
33
|
|
|
34
34
|
|
|
35
|
-
@pytest.mark.skipif(checks.IS_PYTHON_3_12, reason="OpenVINO not supported in Python 3.12")
|
|
36
35
|
@pytest.mark.skipif(not TORCH_1_13, reason="OpenVINO requires torch>=1.13")
|
|
37
36
|
def test_export_openvino():
|
|
38
37
|
"""Test YOLO exports to OpenVINO format for model inference compatibility."""
|
|
@@ -27,6 +27,7 @@ def test_mlflow():
|
|
|
27
27
|
"""Test training with MLflow tracking enabled (see https://mlflow.org/ for details)."""
|
|
28
28
|
SETTINGS["mlflow"] = True
|
|
29
29
|
YOLO("yolov8n-cls.yaml").train(data="imagenet10", imgsz=32, epochs=3, plots=False, device="cpu")
|
|
30
|
+
SETTINGS["mlflow"] = False
|
|
30
31
|
|
|
31
32
|
|
|
32
33
|
@pytest.mark.skipif(True, reason="Test failing in scheduled CI https://github.com/ultralytics/ultralytics/pull/8868")
|
|
@@ -58,6 +59,7 @@ def test_mlflow_keep_run_active():
|
|
|
58
59
|
YOLO("yolov8n-cls.yaml").train(data="imagenet10", imgsz=32, epochs=1, plots=False, device="cpu")
|
|
59
60
|
status = mlflow.get_run(run_id=run_id).info.status
|
|
60
61
|
assert status == "FINISHED", "MLflow run should be ended by default when MLFLOW_KEEP_RUN_ACTIVE is not set"
|
|
62
|
+
SETTINGS["mlflow"] = False
|
|
61
63
|
|
|
62
64
|
|
|
63
65
|
@pytest.mark.skipif(not check_requirements("tritonclient", install=False), reason="tritonclient[all] not installed")
|
|
@@ -19,7 +19,7 @@ from ultralytics.utils import (
|
|
|
19
19
|
ROOT,
|
|
20
20
|
RUNS_DIR,
|
|
21
21
|
SETTINGS,
|
|
22
|
-
|
|
22
|
+
SETTINGS_FILE,
|
|
23
23
|
TESTS_RUNNING,
|
|
24
24
|
IterableSimpleNamespace,
|
|
25
25
|
__version__,
|
|
@@ -532,7 +532,7 @@ def handle_yolo_settings(args: List[str]) -> None:
|
|
|
532
532
|
try:
|
|
533
533
|
if any(args):
|
|
534
534
|
if args[0] == "reset":
|
|
535
|
-
|
|
535
|
+
SETTINGS_FILE.unlink() # delete the settings file
|
|
536
536
|
SETTINGS.reset() # create new settings
|
|
537
537
|
LOGGER.info("Settings reset successfully") # inform the user that settings have been reset
|
|
538
538
|
else: # save a new setting
|
|
@@ -540,8 +540,8 @@ def handle_yolo_settings(args: List[str]) -> None:
|
|
|
540
540
|
check_dict_alignment(SETTINGS, new)
|
|
541
541
|
SETTINGS.update(new)
|
|
542
542
|
|
|
543
|
-
|
|
544
|
-
|
|
543
|
+
print(SETTINGS) # print the current settings
|
|
544
|
+
LOGGER.info(f"💡 Learn more about Ultralytics Settings at {url}")
|
|
545
545
|
except Exception as e:
|
|
546
546
|
LOGGER.warning(f"WARNING ⚠️ settings error: '{e}'. Please see {url} for help.")
|
|
547
547
|
|
|
@@ -22,7 +22,7 @@ from ultralytics.utils import (
|
|
|
22
22
|
LOGGER,
|
|
23
23
|
NUM_THREADS,
|
|
24
24
|
ROOT,
|
|
25
|
-
|
|
25
|
+
SETTINGS_FILE,
|
|
26
26
|
TQDM,
|
|
27
27
|
clean_url,
|
|
28
28
|
colorstr,
|
|
@@ -324,7 +324,7 @@ def check_det_dataset(dataset, autodownload=True):
|
|
|
324
324
|
if s and autodownload:
|
|
325
325
|
LOGGER.warning(m)
|
|
326
326
|
else:
|
|
327
|
-
m += f"\nNote dataset download directory is '{DATASETS_DIR}'. You can update this in '{
|
|
327
|
+
m += f"\nNote dataset download directory is '{DATASETS_DIR}'. You can update this in '{SETTINGS_FILE}'"
|
|
328
328
|
raise FileNotFoundError(m)
|
|
329
329
|
t = time.time()
|
|
330
330
|
r = None # success
|
|
@@ -802,7 +802,7 @@ IS_RASPBERRYPI = is_raspberrypi()
|
|
|
802
802
|
GIT_DIR = get_git_dir()
|
|
803
803
|
IS_GIT_DIR = is_git_dir()
|
|
804
804
|
USER_CONFIG_DIR = Path(os.getenv("YOLO_CONFIG_DIR") or get_user_config_dir()) # Ultralytics settings dir
|
|
805
|
-
|
|
805
|
+
SETTINGS_FILE = USER_CONFIG_DIR / "settings.json"
|
|
806
806
|
|
|
807
807
|
|
|
808
808
|
def colorstr(*input):
|
|
@@ -1040,21 +1040,121 @@ def set_sentry():
|
|
|
1040
1040
|
sentry_sdk.set_user({"id": SETTINGS["uuid"]}) # SHA-256 anonymized UUID hash
|
|
1041
1041
|
|
|
1042
1042
|
|
|
1043
|
-
class
|
|
1043
|
+
class JSONDict(dict):
|
|
1044
1044
|
"""
|
|
1045
|
-
|
|
1045
|
+
A dictionary-like class that provides JSON persistence for its contents.
|
|
1046
1046
|
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1047
|
+
This class extends the built-in dictionary to automatically save its contents to a JSON file whenever they are
|
|
1048
|
+
modified. It ensures thread-safe operations using a lock.
|
|
1049
|
+
|
|
1050
|
+
Attributes:
|
|
1051
|
+
file_path (Path): The path to the JSON file used for persistence.
|
|
1052
|
+
lock (threading.Lock): A lock object to ensure thread-safe operations.
|
|
1053
|
+
|
|
1054
|
+
Methods:
|
|
1055
|
+
_load: Loads the data from the JSON file into the dictionary.
|
|
1056
|
+
_save: Saves the current state of the dictionary to the JSON file.
|
|
1057
|
+
__setitem__: Stores a key-value pair and persists it to disk.
|
|
1058
|
+
__delitem__: Removes an item and updates the persistent storage.
|
|
1059
|
+
update: Updates the dictionary and persists changes.
|
|
1060
|
+
clear: Clears all entries and updates the persistent storage.
|
|
1061
|
+
|
|
1062
|
+
Examples:
|
|
1063
|
+
>>> json_dict = JSONDict("data.json")
|
|
1064
|
+
>>> json_dict["key"] = "value"
|
|
1065
|
+
>>> print(json_dict["key"])
|
|
1066
|
+
value
|
|
1067
|
+
>>> del json_dict["key"]
|
|
1068
|
+
>>> json_dict.update({"new_key": "new_value"})
|
|
1069
|
+
>>> json_dict.clear()
|
|
1050
1070
|
"""
|
|
1051
1071
|
|
|
1052
|
-
def __init__(self,
|
|
1072
|
+
def __init__(self, file_path: Union[str, Path] = "data.json"):
|
|
1073
|
+
"""Initialize a JSONDict object with a specified file path for JSON persistence."""
|
|
1074
|
+
super().__init__()
|
|
1075
|
+
self.file_path = Path(file_path)
|
|
1076
|
+
self.lock = Lock()
|
|
1077
|
+
self._load()
|
|
1078
|
+
|
|
1079
|
+
def _load(self):
|
|
1080
|
+
"""Load the data from the JSON file into the dictionary."""
|
|
1081
|
+
try:
|
|
1082
|
+
if self.file_path.exists():
|
|
1083
|
+
with open(self.file_path) as f:
|
|
1084
|
+
self.update(json.load(f))
|
|
1085
|
+
except json.JSONDecodeError:
|
|
1086
|
+
print(f"Error decoding JSON from {self.file_path}. Starting with an empty dictionary.")
|
|
1087
|
+
except Exception as e:
|
|
1088
|
+
print(f"Error reading from {self.file_path}: {e}")
|
|
1089
|
+
|
|
1090
|
+
def _save(self):
|
|
1091
|
+
"""Save the current state of the dictionary to the JSON file."""
|
|
1092
|
+
try:
|
|
1093
|
+
self.file_path.parent.mkdir(parents=True, exist_ok=True)
|
|
1094
|
+
with open(self.file_path, "w") as f:
|
|
1095
|
+
json.dump(dict(self), f, indent=2)
|
|
1096
|
+
except Exception as e:
|
|
1097
|
+
print(f"Error writing to {self.file_path}: {e}")
|
|
1098
|
+
|
|
1099
|
+
def __setitem__(self, key, value):
|
|
1100
|
+
"""Store a key-value pair and persist to disk."""
|
|
1101
|
+
with self.lock:
|
|
1102
|
+
super().__setitem__(key, value)
|
|
1103
|
+
self._save()
|
|
1104
|
+
|
|
1105
|
+
def __delitem__(self, key):
|
|
1106
|
+
"""Remove an item and update the persistent storage."""
|
|
1107
|
+
with self.lock:
|
|
1108
|
+
super().__delitem__(key)
|
|
1109
|
+
self._save()
|
|
1110
|
+
|
|
1111
|
+
def __str__(self):
|
|
1112
|
+
"""Return a pretty-printed JSON string representation of the dictionary."""
|
|
1113
|
+
return f'JSONDict("{self.file_path}"):\n{json.dumps(dict(self), indent=2, ensure_ascii=False)}'
|
|
1114
|
+
|
|
1115
|
+
def update(self, *args, **kwargs):
|
|
1116
|
+
"""Update the dictionary and persist changes."""
|
|
1117
|
+
with self.lock:
|
|
1118
|
+
super().update(*args, **kwargs)
|
|
1119
|
+
self._save()
|
|
1120
|
+
|
|
1121
|
+
def clear(self):
|
|
1122
|
+
"""Clear all entries and update the persistent storage."""
|
|
1123
|
+
with self.lock:
|
|
1124
|
+
super().clear()
|
|
1125
|
+
self._save()
|
|
1126
|
+
|
|
1127
|
+
|
|
1128
|
+
class SettingsManager(JSONDict):
|
|
1129
|
+
"""
|
|
1130
|
+
SettingsManager class for managing and persisting Ultralytics settings.
|
|
1131
|
+
|
|
1132
|
+
This class extends JSONDict to provide JSON persistence for settings, ensuring thread-safe operations and default
|
|
1133
|
+
values. It validates settings on initialization and provides methods to update or reset settings.
|
|
1134
|
+
|
|
1135
|
+
Attributes:
|
|
1136
|
+
file (Path): The path to the JSON file used for persistence.
|
|
1137
|
+
version (str): The version of the settings schema.
|
|
1138
|
+
defaults (Dict): A dictionary containing default settings.
|
|
1139
|
+
help_msg (str): A help message for users on how to view and update settings.
|
|
1140
|
+
|
|
1141
|
+
Methods:
|
|
1142
|
+
_validate_settings: Validates the current settings and resets if necessary.
|
|
1143
|
+
update: Updates settings, validating keys and types.
|
|
1144
|
+
reset: Resets the settings to default and saves them.
|
|
1145
|
+
|
|
1146
|
+
Examples:
|
|
1147
|
+
Initialize and update settings:
|
|
1148
|
+
>>> settings = SettingsManager()
|
|
1149
|
+
>>> settings.update(runs_dir="/new/runs/dir")
|
|
1150
|
+
>>> print(settings["runs_dir"])
|
|
1151
|
+
/new/runs/dir
|
|
1152
|
+
"""
|
|
1153
|
+
|
|
1154
|
+
def __init__(self, file=SETTINGS_FILE, version="0.0.6"):
|
|
1053
1155
|
"""Initializes the SettingsManager with default settings and loads user settings."""
|
|
1054
|
-
import copy
|
|
1055
1156
|
import hashlib
|
|
1056
1157
|
|
|
1057
|
-
from ultralytics.utils.checks import check_version
|
|
1058
1158
|
from ultralytics.utils.torch_utils import torch_distributed_zero_first
|
|
1059
1159
|
|
|
1060
1160
|
root = GIT_DIR or Path()
|
|
@@ -1083,45 +1183,42 @@ class SettingsManager(dict):
|
|
|
1083
1183
|
"vscode_msg": True,
|
|
1084
1184
|
}
|
|
1085
1185
|
self.help_msg = (
|
|
1086
|
-
f"\nView
|
|
1087
|
-
"\nUpdate
|
|
1186
|
+
f"\nView Ultralytics Settings with 'yolo settings' or at '{self.file}'"
|
|
1187
|
+
"\nUpdate Settings with 'yolo settings key=value', i.e. 'yolo settings runs_dir=path/to/dir'. "
|
|
1088
1188
|
"For help see https://docs.ultralytics.com/quickstart/#ultralytics-settings."
|
|
1089
1189
|
)
|
|
1090
1190
|
|
|
1091
|
-
super().__init__(copy.deepcopy(self.defaults))
|
|
1092
|
-
|
|
1093
1191
|
with torch_distributed_zero_first(RANK):
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
correct_keys = self.keys() == self.defaults.keys()
|
|
1099
|
-
correct_types = all(type(a) is type(b) for a, b in zip(self.values(), self.defaults.values()))
|
|
1100
|
-
correct_version = check_version(self["settings_version"], self.version)
|
|
1101
|
-
if not (correct_keys and correct_types and correct_version):
|
|
1102
|
-
LOGGER.warning(
|
|
1103
|
-
"WARNING ⚠️ Ultralytics settings reset to default values. This may be due to a possible problem "
|
|
1104
|
-
f"with your settings or a recent ultralytics package update. {self.help_msg}"
|
|
1105
|
-
)
|
|
1192
|
+
super().__init__(self.file)
|
|
1193
|
+
|
|
1194
|
+
if not self.file.exists() or not self: # Check if file doesn't exist or is empty
|
|
1195
|
+
LOGGER.info(f"Creating new Ultralytics Settings v{version} file ✅ {self.help_msg}")
|
|
1106
1196
|
self.reset()
|
|
1107
1197
|
|
|
1108
|
-
|
|
1109
|
-
LOGGER.warning(
|
|
1110
|
-
f"WARNING ⚠️ Ultralytics setting 'datasets_dir: {self.get('datasets_dir')}' "
|
|
1111
|
-
f"must be different than 'runs_dir: {self.get('runs_dir')}'. "
|
|
1112
|
-
f"Please change one to avoid possible issues during training. {self.help_msg}"
|
|
1113
|
-
)
|
|
1198
|
+
self._validate_settings()
|
|
1114
1199
|
|
|
1115
|
-
def
|
|
1116
|
-
"""
|
|
1117
|
-
|
|
1200
|
+
def _validate_settings(self):
|
|
1201
|
+
"""Validate the current settings and reset if necessary."""
|
|
1202
|
+
correct_keys = set(self.keys()) == set(self.defaults.keys())
|
|
1203
|
+
correct_types = all(isinstance(self.get(k), type(v)) for k, v in self.defaults.items())
|
|
1204
|
+
correct_version = self.get("settings_version", "") == self.version
|
|
1118
1205
|
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1206
|
+
if not (correct_keys and correct_types and correct_version):
|
|
1207
|
+
LOGGER.warning(
|
|
1208
|
+
"WARNING ⚠️ Ultralytics settings reset to default values. This may be due to a possible problem "
|
|
1209
|
+
f"with your settings or a recent ultralytics package update. {self.help_msg}"
|
|
1210
|
+
)
|
|
1211
|
+
self.reset()
|
|
1212
|
+
|
|
1213
|
+
if self.get("datasets_dir") == self.get("runs_dir"):
|
|
1214
|
+
LOGGER.warning(
|
|
1215
|
+
f"WARNING ⚠️ Ultralytics setting 'datasets_dir: {self.get('datasets_dir')}' "
|
|
1216
|
+
f"must be different than 'runs_dir: {self.get('runs_dir')}'. "
|
|
1217
|
+
f"Please change one to avoid possible issues during training. {self.help_msg}"
|
|
1218
|
+
)
|
|
1122
1219
|
|
|
1123
1220
|
def update(self, *args, **kwargs):
|
|
1124
|
-
"""Updates
|
|
1221
|
+
"""Updates settings, validating keys and types."""
|
|
1125
1222
|
for k, v in kwargs.items():
|
|
1126
1223
|
if k not in self.defaults:
|
|
1127
1224
|
raise KeyError(f"No Ultralytics setting '{k}'. {self.help_msg}")
|
|
@@ -1129,75 +1226,16 @@ class SettingsManager(dict):
|
|
|
1129
1226
|
if not isinstance(v, t):
|
|
1130
1227
|
raise TypeError(f"Ultralytics setting '{k}' must be of type '{t}', not '{type(v)}'. {self.help_msg}")
|
|
1131
1228
|
super().update(*args, **kwargs)
|
|
1132
|
-
self.save()
|
|
1133
1229
|
|
|
1134
1230
|
def reset(self):
|
|
1135
1231
|
"""Resets the settings to default and saves them."""
|
|
1136
1232
|
self.clear()
|
|
1137
1233
|
self.update(self.defaults)
|
|
1138
|
-
self.save()
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
class PersistentCacheDict(dict):
|
|
1142
|
-
"""A thread-safe dictionary that persists data to a JSON file for caching purposes."""
|
|
1143
|
-
|
|
1144
|
-
def __init__(self, file_path=USER_CONFIG_DIR / "persistent_cache.json"):
|
|
1145
|
-
"""Initializes a thread-safe persistent cache dictionary with a specified file path for storage."""
|
|
1146
|
-
super().__init__()
|
|
1147
|
-
self.file_path = Path(file_path)
|
|
1148
|
-
self.lock = Lock()
|
|
1149
|
-
self._load()
|
|
1150
|
-
|
|
1151
|
-
def _load(self):
|
|
1152
|
-
"""Load the persistent cache from a JSON file into the dictionary, handling errors gracefully."""
|
|
1153
|
-
try:
|
|
1154
|
-
if self.file_path.exists():
|
|
1155
|
-
with open(self.file_path) as f:
|
|
1156
|
-
self.update(json.load(f))
|
|
1157
|
-
except json.JSONDecodeError:
|
|
1158
|
-
print(f"Error decoding JSON from {self.file_path}. Starting with an empty cache.")
|
|
1159
|
-
except Exception as e:
|
|
1160
|
-
print(f"Error reading from {self.file_path}: {e}")
|
|
1161
|
-
|
|
1162
|
-
def _save(self):
|
|
1163
|
-
"""Save the current state of the cache dictionary to a JSON file, ensuring thread safety."""
|
|
1164
|
-
try:
|
|
1165
|
-
self.file_path.parent.mkdir(parents=True, exist_ok=True)
|
|
1166
|
-
with open(self.file_path, "w") as f:
|
|
1167
|
-
json.dump(dict(self), f, indent=2)
|
|
1168
|
-
except Exception as e:
|
|
1169
|
-
print(f"Error writing to {self.file_path}: {e}")
|
|
1170
|
-
|
|
1171
|
-
def __setitem__(self, key, value):
|
|
1172
|
-
"""Store a key-value pair in the cache and persist the updated cache to disk."""
|
|
1173
|
-
with self.lock:
|
|
1174
|
-
super().__setitem__(key, value)
|
|
1175
|
-
self._save()
|
|
1176
|
-
|
|
1177
|
-
def __delitem__(self, key):
|
|
1178
|
-
"""Remove an item from the PersistentCacheDict and update the persistent storage."""
|
|
1179
|
-
with self.lock:
|
|
1180
|
-
super().__delitem__(key)
|
|
1181
|
-
self._save()
|
|
1182
|
-
|
|
1183
|
-
def update(self, *args, **kwargs):
|
|
1184
|
-
"""Update the dictionary with key-value pairs from other mappings or iterables, ensuring thread safety."""
|
|
1185
|
-
with self.lock:
|
|
1186
|
-
super().update(*args, **kwargs)
|
|
1187
|
-
self._save()
|
|
1188
|
-
|
|
1189
|
-
def clear(self):
|
|
1190
|
-
"""Clears all entries from the persistent cache dictionary, ensuring thread safety."""
|
|
1191
|
-
with self.lock:
|
|
1192
|
-
super().clear()
|
|
1193
|
-
self._save()
|
|
1194
1234
|
|
|
1195
1235
|
|
|
1196
1236
|
def deprecation_warn(arg, new_arg):
|
|
1197
1237
|
"""Issue a deprecation warning when a deprecated argument is used, suggesting an updated argument."""
|
|
1198
|
-
LOGGER.warning(
|
|
1199
|
-
f"WARNING ⚠️ '{arg}' is deprecated and will be removed in in the future. " f"Please use '{new_arg}' instead."
|
|
1200
|
-
)
|
|
1238
|
+
LOGGER.warning(f"WARNING ⚠️ '{arg}' is deprecated and will be removed in in the future. Use '{new_arg}' instead.")
|
|
1201
1239
|
|
|
1202
1240
|
|
|
1203
1241
|
def clean_url(url):
|
|
@@ -1216,11 +1254,8 @@ def vscode_msg(ext="ultralytics.ultralytics-snippets") -> str:
|
|
|
1216
1254
|
path = (USER_CONFIG_DIR.parents[2] if WINDOWS else USER_CONFIG_DIR.parents[1]) / ".vscode/extensions"
|
|
1217
1255
|
obs_file = path / ".obsolete" # file tracks uninstalled extensions, while source directory remains
|
|
1218
1256
|
installed = any(path.glob(f"{ext}*")) and ext not in (obs_file.read_text("utf-8") if obs_file.exists() else "")
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
if installed
|
|
1222
|
-
else f"{colorstr('VS Code:')} view Ultralytics VS Code Extension ⚡ at https://docs.ultralytics.com/integrations/vscode"
|
|
1223
|
-
)
|
|
1257
|
+
url = "https://docs.ultralytics.com/integrations/vscode"
|
|
1258
|
+
return "" if installed else f"{colorstr('VS Code:')} view Ultralytics VS Code Extension ⚡ at {url}"
|
|
1224
1259
|
|
|
1225
1260
|
|
|
1226
1261
|
# Run below code on utils init ------------------------------------------------------------------------------------
|
|
@@ -1228,7 +1263,7 @@ def vscode_msg(ext="ultralytics.ultralytics-snippets") -> str:
|
|
|
1228
1263
|
# Check first-install steps
|
|
1229
1264
|
PREFIX = colorstr("Ultralytics: ")
|
|
1230
1265
|
SETTINGS = SettingsManager() # initialize settings
|
|
1231
|
-
PERSISTENT_CACHE =
|
|
1266
|
+
PERSISTENT_CACHE = JSONDict(USER_CONFIG_DIR / "persistent_cache.json") # initialize persistent cache
|
|
1232
1267
|
DATASETS_DIR = Path(SETTINGS["datasets_dir"]) # global datasets directory
|
|
1233
1268
|
WEIGHTS_DIR = Path(SETTINGS["weights_dir"]) # global weights directory
|
|
1234
1269
|
RUNS_DIR = Path(SETTINGS["runs_dir"]) # global runs directory
|
|
@@ -97,8 +97,8 @@ def benchmark(
|
|
|
97
97
|
assert MACOS or LINUX, "CoreML and TF.js export only supported on macOS and Linux"
|
|
98
98
|
assert not IS_RASPBERRYPI, "CoreML and TF.js export not supported on Raspberry Pi"
|
|
99
99
|
assert not IS_JETSON, "CoreML and TF.js export not supported on NVIDIA Jetson"
|
|
100
|
-
if i in {
|
|
101
|
-
assert not IS_PYTHON_3_12, "CoreML
|
|
100
|
+
if i in {5}: # CoreML
|
|
101
|
+
assert not IS_PYTHON_3_12, "CoreML not supported on Python 3.12"
|
|
102
102
|
if i in {6, 7, 8}: # TF SavedModel, TF GraphDef, and TFLite
|
|
103
103
|
assert not isinstance(model, YOLOWorld), "YOLOWorldv2 TensorFlow exports not supported by onnx2tf yet"
|
|
104
104
|
if i in {9, 10}: # TF EdgeTPU and TF.js
|
|
@@ -322,9 +322,12 @@ class ProfileModels:
|
|
|
322
322
|
num_warmup_runs (int, optional): Number of warmup runs before the actual profiling starts. Default is 10.
|
|
323
323
|
min_time (float, optional): Minimum time in seconds for profiling a model. Default is 60.
|
|
324
324
|
imgsz (int, optional): Size of the image used during profiling. Default is 640.
|
|
325
|
-
half (bool, optional): Flag to indicate whether to use half-precision
|
|
325
|
+
half (bool, optional): Flag to indicate whether to use FP16 half-precision for TensorRT profiling.
|
|
326
326
|
trt (bool, optional): Flag to indicate whether to profile using TensorRT. Default is True.
|
|
327
327
|
device (torch.device, optional): Device used for profiling. If None, it is determined automatically.
|
|
328
|
+
|
|
329
|
+
Notes:
|
|
330
|
+
FP16 'half' argument option removed for ONNX as slower on CPU than FP32
|
|
328
331
|
"""
|
|
329
332
|
self.paths = paths
|
|
330
333
|
self.num_timed_runs = num_timed_runs
|
|
@@ -353,10 +356,18 @@ class ProfileModels:
|
|
|
353
356
|
model_info = model.info()
|
|
354
357
|
if self.trt and self.device.type != "cpu" and not engine_file.is_file():
|
|
355
358
|
engine_file = model.export(
|
|
356
|
-
format="engine",
|
|
359
|
+
format="engine",
|
|
360
|
+
half=self.half,
|
|
361
|
+
imgsz=self.imgsz,
|
|
362
|
+
device=self.device,
|
|
363
|
+
verbose=False,
|
|
357
364
|
)
|
|
358
365
|
onnx_file = model.export(
|
|
359
|
-
format="onnx",
|
|
366
|
+
format="onnx",
|
|
367
|
+
imgsz=self.imgsz,
|
|
368
|
+
simplify=True,
|
|
369
|
+
device=self.device,
|
|
370
|
+
verbose=False,
|
|
360
371
|
)
|
|
361
372
|
elif file.suffix == ".onnx":
|
|
362
373
|
model_info = self.get_onnx_model_info(file)
|
|
@@ -122,8 +122,6 @@ def get_cpu_info():
|
|
|
122
122
|
PERSISTENT_CACHE["cpu_info"] = string.replace("(R)", "").replace("CPU ", "").replace("@ ", "")
|
|
123
123
|
return PERSISTENT_CACHE.get("cpu_info", "unknown")
|
|
124
124
|
|
|
125
|
-
return "unknown"
|
|
126
|
-
|
|
127
125
|
|
|
128
126
|
def select_device(device="", batch=0, newline=False, verbose=True):
|
|
129
127
|
"""
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: ultralytics
|
|
3
|
-
Version: 8.2.
|
|
3
|
+
Version: 8.2.99
|
|
4
4
|
Summary: Ultralytics YOLO for SOTA object detection, multi-object tracking, instance segmentation, pose estimation and image classification.
|
|
5
|
-
Author:
|
|
6
|
-
|
|
5
|
+
Author: Ayush Chaurasia
|
|
6
|
+
Author-email: Glenn Jocher <glenn.jocher@ultralytics.com>, Jing Qiu <jing.qiu@ultralytics.com>
|
|
7
|
+
Maintainer-email: Ultralytics <hello@ultralytics.com>
|
|
7
8
|
License: AGPL-3.0
|
|
9
|
+
Project-URL: Homepage, https://ultralytics.com
|
|
10
|
+
Project-URL: Source, https://github.com/ultralytics/ultralytics
|
|
11
|
+
Project-URL: Documentation, https://docs.ultralytics.com
|
|
8
12
|
Project-URL: Bug Reports, https://github.com/ultralytics/ultralytics/issues
|
|
9
|
-
Project-URL:
|
|
10
|
-
Project-URL: Source, https://github.com/ultralytics/ultralytics/
|
|
13
|
+
Project-URL: Changelog, https://github.com/ultralytics/ultralytics/releases
|
|
11
14
|
Keywords: machine-learning,deep-learning,computer-vision,ML,DL,AI,YOLO,YOLOv3,YOLOv5,YOLOv8,YOLOv9,YOLOv10,HUB,Ultralytics
|
|
12
15
|
Classifier: Development Status :: 4 - Beta
|
|
13
16
|
Classifier: Intended Audience :: Developers
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|