ultralytics 8.2.7__tar.gz → 8.2.9__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.7/ultralytics.egg-info → ultralytics-8.2.9}/PKG-INFO +2 -2
- {ultralytics-8.2.7 → ultralytics-8.2.9}/pyproject.toml +1 -1
- {ultralytics-8.2.7 → ultralytics-8.2.9}/tests/test_cli.py +18 -28
- {ultralytics-8.2.7 → ultralytics-8.2.9}/tests/test_cuda.py +11 -15
- {ultralytics-8.2.7 → ultralytics-8.2.9}/tests/test_engine.py +19 -20
- ultralytics-8.2.9/tests/test_exports.py +128 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/tests/test_integrations.py +5 -10
- {ultralytics-8.2.7 → ultralytics-8.2.9}/tests/test_python.py +11 -99
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/__init__.py +1 -1
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/data/augment.py +1 -3
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/data/base.py +1 -2
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/data/build.py +5 -6
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/engine/exporter.py +37 -29
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/engine/model.py +2 -2
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/engine/trainer.py +1 -1
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/solutions/parking_management.py +37 -23
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/utils/benchmarks.py +4 -3
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/utils/instance.py +6 -7
- {ultralytics-8.2.7 → ultralytics-8.2.9/ultralytics.egg-info}/PKG-INFO +2 -2
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics.egg-info/SOURCES.txt +1 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics.egg-info/requires.txt +1 -1
- {ultralytics-8.2.7 → ultralytics-8.2.9}/LICENSE +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/README.md +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/setup.cfg +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/tests/test_explorer.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/assets/bus.jpg +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/assets/zidane.jpg +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/__init__.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/datasets/VOC.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/datasets/coco.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/datasets/coco128.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/datasets/coco8.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/datasets/dota8.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/datasets/lvis.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/datasets/xView.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/default.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/trackers/botsort.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/data/__init__.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/data/annotator.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/data/converter.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/data/dataset.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/data/explorer/__init__.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/data/explorer/explorer.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/data/explorer/gui/__init__.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/data/explorer/gui/dash.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/data/explorer/utils.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/data/loaders.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/data/split_dota.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/data/utils.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/engine/__init__.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/engine/predictor.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/engine/results.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/engine/tuner.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/engine/validator.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/hub/__init__.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/hub/auth.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/hub/session.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/hub/utils.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/__init__.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/fastsam/__init__.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/fastsam/model.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/fastsam/predict.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/fastsam/prompt.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/fastsam/utils.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/fastsam/val.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/nas/__init__.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/nas/model.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/nas/predict.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/nas/val.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/rtdetr/__init__.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/rtdetr/model.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/rtdetr/predict.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/rtdetr/train.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/rtdetr/val.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/sam/__init__.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/sam/amg.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/sam/build.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/sam/model.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/sam/modules/__init__.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/sam/modules/decoders.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/sam/modules/encoders.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/sam/modules/sam.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/sam/modules/transformer.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/sam/predict.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/utils/__init__.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/utils/loss.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/utils/ops.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/yolo/__init__.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/yolo/classify/__init__.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/yolo/classify/predict.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/yolo/classify/train.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/yolo/classify/val.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/yolo/detect/__init__.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/yolo/detect/predict.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/yolo/detect/train.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/yolo/detect/val.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/yolo/model.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/yolo/obb/__init__.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/yolo/obb/predict.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/yolo/obb/train.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/yolo/obb/val.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/yolo/pose/__init__.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/yolo/pose/predict.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/yolo/pose/train.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/yolo/pose/val.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/yolo/segment/__init__.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/yolo/segment/predict.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/yolo/segment/train.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/yolo/segment/val.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/yolo/world/__init__.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/yolo/world/train.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/models/yolo/world/train_world.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/nn/__init__.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/nn/autobackend.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/nn/modules/__init__.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/nn/modules/block.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/nn/modules/conv.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/nn/modules/head.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/nn/modules/transformer.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/nn/modules/utils.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/nn/tasks.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/solutions/__init__.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/solutions/ai_gym.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/solutions/distance_calculation.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/solutions/heatmap.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/solutions/object_counter.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/solutions/queue_management.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/solutions/speed_estimation.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/trackers/__init__.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/trackers/basetrack.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/trackers/bot_sort.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/trackers/byte_tracker.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/trackers/track.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/trackers/utils/__init__.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/trackers/utils/gmc.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/trackers/utils/kalman_filter.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/trackers/utils/matching.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/utils/__init__.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/utils/autobatch.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/utils/callbacks/__init__.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/utils/callbacks/base.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/utils/callbacks/clearml.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/utils/callbacks/comet.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/utils/callbacks/dvc.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/utils/callbacks/hub.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/utils/callbacks/mlflow.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/utils/callbacks/neptune.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/utils/callbacks/raytune.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/utils/callbacks/tensorboard.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/utils/callbacks/wb.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/utils/checks.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/utils/dist.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/utils/downloads.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/utils/errors.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/utils/files.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/utils/loss.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/utils/metrics.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/utils/ops.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/utils/patches.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/utils/plotting.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/utils/tal.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/utils/torch_utils.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/utils/triton.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics/utils/tuner.py +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics.egg-info/dependency_links.txt +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/ultralytics.egg-info/entry_points.txt +0 -0
- {ultralytics-8.2.7 → ultralytics-8.2.9}/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.9
|
|
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
|
|
@@ -77,7 +77,7 @@ Requires-Dist: dvclive>=2.12.0; extra == "logging"
|
|
|
77
77
|
Provides-Extra: extra
|
|
78
78
|
Requires-Dist: hub-sdk>=0.0.5; extra == "extra"
|
|
79
79
|
Requires-Dist: ipython; extra == "extra"
|
|
80
|
-
Requires-Dist: albumentations
|
|
80
|
+
Requires-Dist: albumentations<=1.4.4,>=1.0.3; extra == "extra"
|
|
81
81
|
Requires-Dist: pycocotools>=2.0.7; extra == "extra"
|
|
82
82
|
|
|
83
83
|
<div align="center">
|
|
@@ -123,7 +123,7 @@ logging = [
|
|
|
123
123
|
extra = [
|
|
124
124
|
"hub-sdk>=0.0.5", # Ultralytics HUB
|
|
125
125
|
"ipython", # interactive notebook
|
|
126
|
-
"albumentations>=1.0.3", # training augmentations
|
|
126
|
+
"albumentations>=1.0.3,<=1.4.4", # training augmentations
|
|
127
127
|
"pycocotools>=2.0.7", # COCO mAP
|
|
128
128
|
]
|
|
129
129
|
|
|
@@ -4,24 +4,14 @@ import subprocess
|
|
|
4
4
|
|
|
5
5
|
import pytest
|
|
6
6
|
|
|
7
|
+
from ultralytics.cfg import TASK2DATA, TASK2MODEL, TASKS
|
|
7
8
|
from ultralytics.utils import ASSETS, WEIGHTS_DIR, checks
|
|
8
9
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
("classify", "yolov8n-cls", "imagenet10"),
|
|
15
|
-
("pose", "yolov8n-pose", "coco8-pose.yaml"),
|
|
16
|
-
("obb", "yolov8n-obb", "dota8.yaml"),
|
|
17
|
-
] # (task, model, data)
|
|
18
|
-
EXPORT_ARGS = [
|
|
19
|
-
("yolov8n", "torchscript"),
|
|
20
|
-
("yolov8n-seg", "torchscript"),
|
|
21
|
-
("yolov8n-cls", "torchscript"),
|
|
22
|
-
("yolov8n-pose", "torchscript"),
|
|
23
|
-
("yolov8n-obb", "torchscript"),
|
|
24
|
-
] # (model, format)
|
|
10
|
+
from . import CUDA_DEVICE_COUNT, CUDA_IS_AVAILABLE
|
|
11
|
+
|
|
12
|
+
# Constants
|
|
13
|
+
TASK_MODEL_DATA = [(task, WEIGHTS_DIR / TASK2MODEL[task], TASK2DATA[task]) for task in TASKS]
|
|
14
|
+
MODELS = [WEIGHTS_DIR / TASK2MODEL[task] for task in TASKS]
|
|
25
15
|
|
|
26
16
|
|
|
27
17
|
def run(cmd):
|
|
@@ -38,28 +28,28 @@ def test_special_modes():
|
|
|
38
28
|
run("yolo cfg")
|
|
39
29
|
|
|
40
30
|
|
|
41
|
-
@pytest.mark.parametrize("task,model,data",
|
|
31
|
+
@pytest.mark.parametrize("task,model,data", TASK_MODEL_DATA)
|
|
42
32
|
def test_train(task, model, data):
|
|
43
33
|
"""Test YOLO training for a given task, model, and data."""
|
|
44
|
-
run(f"yolo train {task} model={model}
|
|
34
|
+
run(f"yolo train {task} model={model} data={data} imgsz=32 epochs=1 cache=disk")
|
|
45
35
|
|
|
46
36
|
|
|
47
|
-
@pytest.mark.parametrize("task,model,data",
|
|
37
|
+
@pytest.mark.parametrize("task,model,data", TASK_MODEL_DATA)
|
|
48
38
|
def test_val(task, model, data):
|
|
49
39
|
"""Test YOLO validation for a given task, model, and data."""
|
|
50
|
-
run(f"yolo val {task} model={
|
|
40
|
+
run(f"yolo val {task} model={model} data={data} imgsz=32 save_txt save_json")
|
|
51
41
|
|
|
52
42
|
|
|
53
|
-
@pytest.mark.parametrize("task,model,data",
|
|
43
|
+
@pytest.mark.parametrize("task,model,data", TASK_MODEL_DATA)
|
|
54
44
|
def test_predict(task, model, data):
|
|
55
45
|
"""Test YOLO prediction on sample assets for a given task and model."""
|
|
56
|
-
run(f"yolo predict model={
|
|
46
|
+
run(f"yolo predict model={model} source={ASSETS} imgsz=32 save save_crop save_txt")
|
|
57
47
|
|
|
58
48
|
|
|
59
|
-
@pytest.mark.parametrize("model
|
|
60
|
-
def test_export(model
|
|
49
|
+
@pytest.mark.parametrize("model", MODELS)
|
|
50
|
+
def test_export(model):
|
|
61
51
|
"""Test exporting a YOLO model to different formats."""
|
|
62
|
-
run(f"yolo export model={
|
|
52
|
+
run(f"yolo export model={model} format=torchscript imgsz=32")
|
|
63
53
|
|
|
64
54
|
|
|
65
55
|
def test_rtdetr(task="detect", model="yolov8n-rtdetr.yaml", data="coco8.yaml"):
|
|
@@ -129,10 +119,10 @@ def test_mobilesam():
|
|
|
129
119
|
|
|
130
120
|
# Slow Tests -----------------------------------------------------------------------------------------------------------
|
|
131
121
|
@pytest.mark.slow
|
|
132
|
-
@pytest.mark.parametrize("task,model,data",
|
|
122
|
+
@pytest.mark.parametrize("task,model,data", TASK_MODEL_DATA)
|
|
133
123
|
@pytest.mark.skipif(not CUDA_IS_AVAILABLE, reason="CUDA is not available")
|
|
134
124
|
@pytest.mark.skipif(CUDA_DEVICE_COUNT < 2, reason="DDP is not available")
|
|
135
125
|
def test_train_gpu(task, model, data):
|
|
136
126
|
"""Test YOLO training on GPU(s) for various tasks and models."""
|
|
137
|
-
run(f"yolo train {task} model={model}
|
|
138
|
-
run(f"yolo train {task} model={model}
|
|
127
|
+
run(f"yolo train {task} model={model} data={data} imgsz=32 epochs=1 device=0") # single GPU
|
|
128
|
+
run(f"yolo train {task} model={model} data={data} imgsz=32 epochs=1 device=0,1") # multi GPU
|
|
@@ -4,14 +4,9 @@ import pytest
|
|
|
4
4
|
import torch
|
|
5
5
|
|
|
6
6
|
from ultralytics import YOLO
|
|
7
|
-
from ultralytics.utils import ASSETS, WEIGHTS_DIR
|
|
7
|
+
from ultralytics.utils import ASSETS, WEIGHTS_DIR
|
|
8
8
|
|
|
9
|
-
CUDA_IS_AVAILABLE
|
|
10
|
-
CUDA_DEVICE_COUNT = checks.cuda_device_count()
|
|
11
|
-
|
|
12
|
-
MODEL = WEIGHTS_DIR / "path with spaces" / "yolov8n.pt" # test spaces in path
|
|
13
|
-
DATA = "coco8.yaml"
|
|
14
|
-
BUS = ASSETS / "bus.jpg"
|
|
9
|
+
from . import CUDA_DEVICE_COUNT, CUDA_IS_AVAILABLE, MODEL, SOURCE
|
|
15
10
|
|
|
16
11
|
|
|
17
12
|
def test_checks():
|
|
@@ -19,19 +14,20 @@ def test_checks():
|
|
|
19
14
|
assert torch.cuda.is_available() == CUDA_IS_AVAILABLE
|
|
20
15
|
assert torch.cuda.device_count() == CUDA_DEVICE_COUNT
|
|
21
16
|
|
|
17
|
+
|
|
22
18
|
@pytest.mark.slow
|
|
23
19
|
@pytest.mark.skipif(not CUDA_IS_AVAILABLE, reason="CUDA is not available")
|
|
24
20
|
def test_export_engine():
|
|
25
21
|
"""Test exporting the YOLO model to NVIDIA TensorRT format."""
|
|
26
22
|
f = YOLO(MODEL).export(format="engine", device=0)
|
|
27
|
-
YOLO(f)(
|
|
23
|
+
YOLO(f)(SOURCE, device=0)
|
|
28
24
|
|
|
29
25
|
|
|
30
26
|
@pytest.mark.skipif(not CUDA_IS_AVAILABLE, reason="CUDA is not available")
|
|
31
27
|
def test_train():
|
|
32
28
|
"""Test model training on a minimal dataset."""
|
|
33
29
|
device = 0 if CUDA_DEVICE_COUNT == 1 else [0, 1]
|
|
34
|
-
YOLO(MODEL).train(data=
|
|
30
|
+
YOLO(MODEL).train(data="coco8.yaml", imgsz=64, epochs=1, device=device) # requires imgsz>=64
|
|
35
31
|
|
|
36
32
|
|
|
37
33
|
@pytest.mark.slow
|
|
@@ -41,22 +37,22 @@ def test_predict_multiple_devices():
|
|
|
41
37
|
model = YOLO("yolov8n.pt")
|
|
42
38
|
model = model.cpu()
|
|
43
39
|
assert str(model.device) == "cpu"
|
|
44
|
-
_ = model(
|
|
40
|
+
_ = model(SOURCE) # CPU inference
|
|
45
41
|
assert str(model.device) == "cpu"
|
|
46
42
|
|
|
47
43
|
model = model.to("cuda:0")
|
|
48
44
|
assert str(model.device) == "cuda:0"
|
|
49
|
-
_ = model(
|
|
45
|
+
_ = model(SOURCE) # CUDA inference
|
|
50
46
|
assert str(model.device) == "cuda:0"
|
|
51
47
|
|
|
52
48
|
model = model.cpu()
|
|
53
49
|
assert str(model.device) == "cpu"
|
|
54
|
-
_ = model(
|
|
50
|
+
_ = model(SOURCE) # CPU inference
|
|
55
51
|
assert str(model.device) == "cpu"
|
|
56
52
|
|
|
57
53
|
model = model.cuda()
|
|
58
54
|
assert str(model.device) == "cuda:0"
|
|
59
|
-
_ = model(
|
|
55
|
+
_ = model(SOURCE) # CUDA inference
|
|
60
56
|
assert str(model.device) == "cuda:0"
|
|
61
57
|
|
|
62
58
|
|
|
@@ -92,10 +88,10 @@ def test_predict_sam():
|
|
|
92
88
|
model.info()
|
|
93
89
|
|
|
94
90
|
# Run inference
|
|
95
|
-
model(
|
|
91
|
+
model(SOURCE, device=0)
|
|
96
92
|
|
|
97
93
|
# Run inference with bboxes prompt
|
|
98
|
-
model(
|
|
94
|
+
model(SOURCE, bboxes=[439, 437, 524, 709], device=0)
|
|
99
95
|
|
|
100
96
|
# Run inference with points prompt
|
|
101
97
|
model(ASSETS / "zidane.jpg", points=[900, 370], labels=[1], device=0)
|
|
@@ -9,11 +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
|
-
|
|
13
|
-
CFG_SEG = "yolov8n-seg.yaml"
|
|
14
|
-
CFG_CLS = "yolov8n-cls.yaml" # or 'squeezenet1_0'
|
|
15
|
-
CFG = get_cfg(DEFAULT_CFG)
|
|
16
|
-
MODEL = WEIGHTS_DIR / "yolov8n"
|
|
12
|
+
from . import MODEL
|
|
17
13
|
|
|
18
14
|
|
|
19
15
|
def test_func(*args): # noqa
|
|
@@ -26,15 +22,16 @@ def test_export():
|
|
|
26
22
|
exporter = Exporter()
|
|
27
23
|
exporter.add_callback("on_export_start", test_func)
|
|
28
24
|
assert test_func in exporter.callbacks["on_export_start"], "callback test failed"
|
|
29
|
-
f = exporter(model=YOLO(
|
|
25
|
+
f = exporter(model=YOLO("yolov8n.yaml").model)
|
|
30
26
|
YOLO(f)(ASSETS) # exported model inference
|
|
31
27
|
|
|
32
28
|
|
|
33
29
|
def test_detect():
|
|
34
30
|
"""Test object detection functionality."""
|
|
35
|
-
overrides = {"data": "coco8.yaml", "model":
|
|
36
|
-
|
|
37
|
-
|
|
31
|
+
overrides = {"data": "coco8.yaml", "model": "yolov8n.yaml", "imgsz": 32, "epochs": 1, "save": False}
|
|
32
|
+
cfg = get_cfg(DEFAULT_CFG)
|
|
33
|
+
cfg.data = "coco8.yaml"
|
|
34
|
+
cfg.imgsz = 32
|
|
38
35
|
|
|
39
36
|
# Trainer
|
|
40
37
|
trainer = detect.DetectionTrainer(overrides=overrides)
|
|
@@ -43,7 +40,7 @@ def test_detect():
|
|
|
43
40
|
trainer.train()
|
|
44
41
|
|
|
45
42
|
# Validator
|
|
46
|
-
val = detect.DetectionValidator(args=
|
|
43
|
+
val = detect.DetectionValidator(args=cfg)
|
|
47
44
|
val.add_callback("on_val_start", test_func)
|
|
48
45
|
assert test_func in val.callbacks["on_val_start"], "callback test failed"
|
|
49
46
|
val(model=trainer.best) # validate best.pt
|
|
@@ -54,7 +51,7 @@ def test_detect():
|
|
|
54
51
|
assert test_func in pred.callbacks["on_predict_start"], "callback test failed"
|
|
55
52
|
# Confirm there is no issue with sys.argv being empty.
|
|
56
53
|
with mock.patch.object(sys, "argv", []):
|
|
57
|
-
result = pred(source=ASSETS, model=
|
|
54
|
+
result = pred(source=ASSETS, model=MODEL)
|
|
58
55
|
assert len(result), "predictor test failed"
|
|
59
56
|
|
|
60
57
|
overrides["resume"] = trainer.last
|
|
@@ -70,9 +67,10 @@ def test_detect():
|
|
|
70
67
|
|
|
71
68
|
def test_segment():
|
|
72
69
|
"""Test image segmentation functionality."""
|
|
73
|
-
overrides = {"data": "coco8-seg.yaml", "model":
|
|
74
|
-
|
|
75
|
-
|
|
70
|
+
overrides = {"data": "coco8-seg.yaml", "model": "yolov8n-seg.yaml", "imgsz": 32, "epochs": 1, "save": False}
|
|
71
|
+
cfg = get_cfg(DEFAULT_CFG)
|
|
72
|
+
cfg.data = "coco8-seg.yaml"
|
|
73
|
+
cfg.imgsz = 32
|
|
76
74
|
# YOLO(CFG_SEG).train(**overrides) # works
|
|
77
75
|
|
|
78
76
|
# Trainer
|
|
@@ -82,7 +80,7 @@ def test_segment():
|
|
|
82
80
|
trainer.train()
|
|
83
81
|
|
|
84
82
|
# Validator
|
|
85
|
-
val = segment.SegmentationValidator(args=
|
|
83
|
+
val = segment.SegmentationValidator(args=cfg)
|
|
86
84
|
val.add_callback("on_val_start", test_func)
|
|
87
85
|
assert test_func in val.callbacks["on_val_start"], "callback test failed"
|
|
88
86
|
val(model=trainer.best) # validate best.pt
|
|
@@ -91,7 +89,7 @@ def test_segment():
|
|
|
91
89
|
pred = segment.SegmentationPredictor(overrides={"imgsz": [64, 64]})
|
|
92
90
|
pred.add_callback("on_predict_start", test_func)
|
|
93
91
|
assert test_func in pred.callbacks["on_predict_start"], "callback test failed"
|
|
94
|
-
result = pred(source=ASSETS, model=
|
|
92
|
+
result = pred(source=ASSETS, model=WEIGHTS_DIR / "yolov8n-seg.pt")
|
|
95
93
|
assert len(result), "predictor test failed"
|
|
96
94
|
|
|
97
95
|
# Test resume
|
|
@@ -108,9 +106,10 @@ def test_segment():
|
|
|
108
106
|
|
|
109
107
|
def test_classify():
|
|
110
108
|
"""Test image classification functionality."""
|
|
111
|
-
overrides = {"data": "imagenet10", "model":
|
|
112
|
-
|
|
113
|
-
|
|
109
|
+
overrides = {"data": "imagenet10", "model": "yolov8n-cls.yaml", "imgsz": 32, "epochs": 1, "save": False}
|
|
110
|
+
cfg = get_cfg(DEFAULT_CFG)
|
|
111
|
+
cfg.data = "imagenet10"
|
|
112
|
+
cfg.imgsz = 32
|
|
114
113
|
# YOLO(CFG_SEG).train(**overrides) # works
|
|
115
114
|
|
|
116
115
|
# Trainer
|
|
@@ -120,7 +119,7 @@ def test_classify():
|
|
|
120
119
|
trainer.train()
|
|
121
120
|
|
|
122
121
|
# Validator
|
|
123
|
-
val = classify.ClassificationValidator(args=
|
|
122
|
+
val = classify.ClassificationValidator(args=cfg)
|
|
124
123
|
val.add_callback("on_val_start", test_func)
|
|
125
124
|
assert test_func in val.callbacks["on_val_start"], "callback test failed"
|
|
126
125
|
val(model=trainer.best)
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# Ultralytics YOLO 🚀, AGPL-3.0 license
|
|
2
|
+
|
|
3
|
+
import shutil
|
|
4
|
+
import uuid
|
|
5
|
+
from itertools import product
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
|
|
8
|
+
import pytest
|
|
9
|
+
|
|
10
|
+
from ultralytics import YOLO
|
|
11
|
+
from ultralytics.cfg import TASK2DATA, TASK2MODEL, TASKS
|
|
12
|
+
from ultralytics.utils import (
|
|
13
|
+
IS_RASPBERRYPI,
|
|
14
|
+
LINUX,
|
|
15
|
+
MACOS,
|
|
16
|
+
WINDOWS,
|
|
17
|
+
Retry,
|
|
18
|
+
checks,
|
|
19
|
+
)
|
|
20
|
+
from ultralytics.utils.torch_utils import TORCH_1_9, TORCH_1_13
|
|
21
|
+
from . import MODEL, SOURCE
|
|
22
|
+
|
|
23
|
+
# Constants
|
|
24
|
+
EXPORT_PARAMETERS_LIST = [ # generate all combinations but exclude those where both int8 and half are True
|
|
25
|
+
(task, dynamic, int8, half, batch)
|
|
26
|
+
for task, dynamic, int8, half, batch in product(TASKS, [True, False], [True, False], [True, False], [1, 2])
|
|
27
|
+
if not (int8 and half) # exclude cases where both int8 and half are True
|
|
28
|
+
]
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def test_export_torchscript():
|
|
32
|
+
"""Test exporting the YOLO model to TorchScript format."""
|
|
33
|
+
f = YOLO(MODEL).export(format="torchscript", optimize=False, imgsz=32)
|
|
34
|
+
YOLO(f)(SOURCE, imgsz=32) # exported model inference
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def test_export_onnx():
|
|
38
|
+
"""Test exporting the YOLO model to ONNX format."""
|
|
39
|
+
f = YOLO(MODEL).export(format="onnx", dynamic=True, imgsz=32)
|
|
40
|
+
YOLO(f)(SOURCE, imgsz=32) # exported model inference
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@pytest.mark.skipif(checks.IS_PYTHON_3_12, reason="OpenVINO not supported in Python 3.12")
|
|
44
|
+
@pytest.mark.skipif(not TORCH_1_13, reason="OpenVINO requires torch>=1.13")
|
|
45
|
+
def test_export_openvino():
|
|
46
|
+
"""Test exporting the YOLO model to OpenVINO format."""
|
|
47
|
+
f = YOLO(MODEL).export(format="openvino", imgsz=32)
|
|
48
|
+
YOLO(f)(SOURCE, imgsz=32) # exported model inference
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
@pytest.mark.slow
|
|
52
|
+
@pytest.mark.skipif(checks.IS_PYTHON_3_12, reason="OpenVINO not supported in Python 3.12")
|
|
53
|
+
@pytest.mark.skipif(not TORCH_1_13, reason="OpenVINO requires torch>=1.13")
|
|
54
|
+
@pytest.mark.parametrize("task, dynamic, int8, half, batch", EXPORT_PARAMETERS_LIST)
|
|
55
|
+
def test_export_openvino_matrix(task, dynamic, int8, half, batch):
|
|
56
|
+
"""Test exporting the YOLO model to OpenVINO format."""
|
|
57
|
+
file = YOLO(TASK2MODEL[task]).export(
|
|
58
|
+
format="openvino",
|
|
59
|
+
imgsz=32,
|
|
60
|
+
dynamic=dynamic,
|
|
61
|
+
int8=int8,
|
|
62
|
+
half=half,
|
|
63
|
+
batch=batch,
|
|
64
|
+
data=TASK2DATA[task],
|
|
65
|
+
)
|
|
66
|
+
if WINDOWS:
|
|
67
|
+
# Use unique filenames due to Windows file permissions bug possibly due to latent threaded use
|
|
68
|
+
# See https://github.com/ultralytics/ultralytics/actions/runs/8957949304/job/24601616830?pr=10423
|
|
69
|
+
file = Path(file)
|
|
70
|
+
file = file.rename(file.with_stem(f"{file.stem}-{uuid.uuid4()}"))
|
|
71
|
+
YOLO(file)([SOURCE] * batch, imgsz=64 if dynamic else 32) # exported model inference
|
|
72
|
+
with Retry(times=3, delay=1): # retry in case of potential lingering multi-threaded file usage errors
|
|
73
|
+
shutil.rmtree(file)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
@pytest.mark.skipif(not TORCH_1_9, reason="CoreML>=7.2 not supported with PyTorch<=1.8")
|
|
77
|
+
@pytest.mark.skipif(WINDOWS, reason="CoreML not supported on Windows") # RuntimeError: BlobWriter not loaded
|
|
78
|
+
@pytest.mark.skipif(IS_RASPBERRYPI, reason="CoreML not supported on Raspberry Pi")
|
|
79
|
+
@pytest.mark.skipif(checks.IS_PYTHON_3_12, reason="CoreML not supported in Python 3.12")
|
|
80
|
+
def test_export_coreml():
|
|
81
|
+
"""Test exporting the YOLO model to CoreML format."""
|
|
82
|
+
if MACOS:
|
|
83
|
+
f = YOLO(MODEL).export(format="coreml", imgsz=32)
|
|
84
|
+
YOLO(f)(SOURCE, imgsz=32) # model prediction only supported on macOS for nms=False models
|
|
85
|
+
else:
|
|
86
|
+
YOLO(MODEL).export(format="coreml", nms=True, imgsz=32)
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
@pytest.mark.skipif(not LINUX, reason="Test disabled as TF suffers from install conflicts on Windows and macOS")
|
|
90
|
+
def test_export_tflite():
|
|
91
|
+
"""
|
|
92
|
+
Test exporting the YOLO model to TFLite format.
|
|
93
|
+
|
|
94
|
+
Note TF suffers from install conflicts on Windows and macOS.
|
|
95
|
+
"""
|
|
96
|
+
model = YOLO(MODEL)
|
|
97
|
+
f = model.export(format="tflite", imgsz=32)
|
|
98
|
+
YOLO(f)(SOURCE, imgsz=32)
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
@pytest.mark.skipif(True, reason="Test disabled")
|
|
102
|
+
@pytest.mark.skipif(not LINUX, reason="TF suffers from install conflicts on Windows and macOS")
|
|
103
|
+
def test_export_pb():
|
|
104
|
+
"""
|
|
105
|
+
Test exporting the YOLO model to *.pb format.
|
|
106
|
+
|
|
107
|
+
Note TF suffers from install conflicts on Windows and macOS.
|
|
108
|
+
"""
|
|
109
|
+
model = YOLO(MODEL)
|
|
110
|
+
f = model.export(format="pb", imgsz=32)
|
|
111
|
+
YOLO(f)(SOURCE, imgsz=32)
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
@pytest.mark.skipif(True, reason="Test disabled as Paddle protobuf and ONNX protobuf requirementsk conflict.")
|
|
115
|
+
def test_export_paddle():
|
|
116
|
+
"""
|
|
117
|
+
Test exporting the YOLO model to Paddle format.
|
|
118
|
+
|
|
119
|
+
Note Paddle protobuf requirements conflicting with onnx protobuf requirements.
|
|
120
|
+
"""
|
|
121
|
+
YOLO(MODEL).export(format="paddle", imgsz=32)
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
@pytest.mark.slow
|
|
125
|
+
def test_export_ncnn():
|
|
126
|
+
"""Test exporting the YOLO model to NCNN format."""
|
|
127
|
+
f = YOLO(MODEL).export(format="ncnn", imgsz=32)
|
|
128
|
+
YOLO(f)(SOURCE, imgsz=32) # exported model inference
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
# Ultralytics YOLO 🚀, AGPL-3.0 license
|
|
2
2
|
|
|
3
3
|
import contextlib
|
|
4
|
+
import os
|
|
5
|
+
import subprocess
|
|
6
|
+
import time
|
|
4
7
|
from pathlib import Path
|
|
5
8
|
|
|
6
9
|
import pytest
|
|
7
10
|
|
|
8
11
|
from ultralytics import YOLO, download
|
|
9
|
-
from ultralytics.utils import
|
|
12
|
+
from ultralytics.utils import DATASETS_DIR, SETTINGS
|
|
10
13
|
from ultralytics.utils.checks import check_requirements
|
|
11
14
|
|
|
12
|
-
|
|
13
|
-
CFG = "yolov8n.yaml"
|
|
14
|
-
SOURCE = ASSETS / "bus.jpg"
|
|
15
|
-
TMP = (ROOT / "../tests/tmp").resolve() # temp directory for test files
|
|
15
|
+
from . import MODEL, SOURCE, TMP
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
@pytest.mark.skipif(not check_requirements("ray", install=False), reason="ray[tune] not installed")
|
|
@@ -33,8 +33,6 @@ def test_mlflow():
|
|
|
33
33
|
@pytest.mark.skipif(True, reason="Test failing in scheduled CI https://github.com/ultralytics/ultralytics/pull/8868")
|
|
34
34
|
@pytest.mark.skipif(not check_requirements("mlflow", install=False), reason="mlflow not installed")
|
|
35
35
|
def test_mlflow_keep_run_active():
|
|
36
|
-
import os
|
|
37
|
-
|
|
38
36
|
import mlflow
|
|
39
37
|
|
|
40
38
|
"""Test training with MLflow tracking enabled."""
|
|
@@ -67,9 +65,6 @@ def test_mlflow_keep_run_active():
|
|
|
67
65
|
def test_triton():
|
|
68
66
|
"""Test NVIDIA Triton Server functionalities."""
|
|
69
67
|
check_requirements("tritonclient[all]")
|
|
70
|
-
import subprocess
|
|
71
|
-
import time
|
|
72
|
-
|
|
73
68
|
from tritonclient.http import InferenceServerClient # noqa
|
|
74
69
|
|
|
75
70
|
# Create variables
|
|
@@ -18,25 +18,17 @@ from ultralytics.utils import (
|
|
|
18
18
|
ASSETS,
|
|
19
19
|
DEFAULT_CFG,
|
|
20
20
|
DEFAULT_CFG_PATH,
|
|
21
|
-
LINUX,
|
|
22
|
-
MACOS,
|
|
23
21
|
ONLINE,
|
|
24
22
|
ROOT,
|
|
25
23
|
WEIGHTS_DIR,
|
|
26
24
|
WINDOWS,
|
|
27
25
|
Retry,
|
|
28
26
|
checks,
|
|
29
|
-
is_dir_writeable,
|
|
30
|
-
IS_RASPBERRYPI,
|
|
31
27
|
)
|
|
32
28
|
from ultralytics.utils.downloads import download
|
|
33
|
-
from ultralytics.utils.torch_utils import TORCH_1_9
|
|
29
|
+
from ultralytics.utils.torch_utils import TORCH_1_9
|
|
34
30
|
|
|
35
|
-
|
|
36
|
-
CFG = "yolov8n.yaml"
|
|
37
|
-
SOURCE = ASSETS / "bus.jpg"
|
|
38
|
-
TMP = (ROOT / "../tests/tmp").resolve() # temp directory for test files
|
|
39
|
-
IS_TMP_WRITEABLE = is_dir_writeable(TMP)
|
|
31
|
+
from . import CFG, IS_TMP_WRITEABLE, MODEL, SOURCE, TMP
|
|
40
32
|
|
|
41
33
|
|
|
42
34
|
def test_model_forward():
|
|
@@ -202,80 +194,6 @@ def test_train_pretrained():
|
|
|
202
194
|
model(SOURCE)
|
|
203
195
|
|
|
204
196
|
|
|
205
|
-
def test_export_torchscript():
|
|
206
|
-
"""Test exporting the YOLO model to TorchScript format."""
|
|
207
|
-
f = YOLO(MODEL).export(format="torchscript", optimize=False)
|
|
208
|
-
YOLO(f)(SOURCE) # exported model inference
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
def test_export_onnx():
|
|
212
|
-
"""Test exporting the YOLO model to ONNX format."""
|
|
213
|
-
f = YOLO(MODEL).export(format="onnx", dynamic=True)
|
|
214
|
-
YOLO(f)(SOURCE) # exported model inference
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
@pytest.mark.skipif(checks.IS_PYTHON_3_12, reason="OpenVINO not supported in Python 3.12")
|
|
218
|
-
@pytest.mark.skipif(not TORCH_1_13, reason="OpenVINO requires torch>=1.13")
|
|
219
|
-
def test_export_openvino():
|
|
220
|
-
"""Test exporting the YOLO model to OpenVINO format."""
|
|
221
|
-
f = YOLO(MODEL).export(format="openvino")
|
|
222
|
-
YOLO(f)(SOURCE) # exported model inference
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
@pytest.mark.skipif(not TORCH_1_9, reason="CoreML>=7.2 not supported with PyTorch<=1.8")
|
|
226
|
-
@pytest.mark.skipif(WINDOWS, reason="CoreML not supported on Windows") # RuntimeError: BlobWriter not loaded
|
|
227
|
-
@pytest.mark.skipif(IS_RASPBERRYPI, reason="CoreML not supported on Raspberry Pi")
|
|
228
|
-
@pytest.mark.skipif(checks.IS_PYTHON_3_12, reason="CoreML not supported in Python 3.12")
|
|
229
|
-
def test_export_coreml():
|
|
230
|
-
"""Test exporting the YOLO model to CoreML format."""
|
|
231
|
-
if MACOS:
|
|
232
|
-
f = YOLO(MODEL).export(format="coreml")
|
|
233
|
-
YOLO(f)(SOURCE) # model prediction only supported on macOS for nms=False models
|
|
234
|
-
else:
|
|
235
|
-
YOLO(MODEL).export(format="coreml", nms=True)
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
def test_export_tflite(enabled=False):
|
|
239
|
-
"""
|
|
240
|
-
Test exporting the YOLO model to TFLite format.
|
|
241
|
-
|
|
242
|
-
Note TF suffers from install conflicts on Windows and macOS.
|
|
243
|
-
"""
|
|
244
|
-
if enabled and LINUX:
|
|
245
|
-
model = YOLO(MODEL)
|
|
246
|
-
f = model.export(format="tflite")
|
|
247
|
-
YOLO(f)(SOURCE)
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
def test_export_pb(enabled=False):
|
|
251
|
-
"""
|
|
252
|
-
Test exporting the YOLO model to *.pb format.
|
|
253
|
-
|
|
254
|
-
Note TF suffers from install conflicts on Windows and macOS.
|
|
255
|
-
"""
|
|
256
|
-
if enabled and LINUX:
|
|
257
|
-
model = YOLO(MODEL)
|
|
258
|
-
f = model.export(format="pb")
|
|
259
|
-
YOLO(f)(SOURCE)
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
def test_export_paddle(enabled=False):
|
|
263
|
-
"""
|
|
264
|
-
Test exporting the YOLO model to Paddle format.
|
|
265
|
-
|
|
266
|
-
Note Paddle protobuf requirements conflicting with onnx protobuf requirements.
|
|
267
|
-
"""
|
|
268
|
-
if enabled:
|
|
269
|
-
YOLO(MODEL).export(format="paddle")
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
@pytest.mark.slow
|
|
273
|
-
def test_export_ncnn():
|
|
274
|
-
"""Test exporting the YOLO model to NCNN format."""
|
|
275
|
-
f = YOLO(MODEL).export(format="ncnn")
|
|
276
|
-
YOLO(f)(SOURCE) # exported model inference
|
|
277
|
-
|
|
278
|
-
|
|
279
197
|
def test_all_model_yamls():
|
|
280
198
|
"""Test YOLO model creation for all available YAML configurations."""
|
|
281
199
|
for m in (ROOT / "cfg" / "models").rglob("*.yaml"):
|
|
@@ -292,7 +210,7 @@ def test_workflow():
|
|
|
292
210
|
model.train(data="coco8.yaml", epochs=1, imgsz=32, optimizer="SGD")
|
|
293
211
|
model.val(imgsz=32)
|
|
294
212
|
model.predict(SOURCE, imgsz=32)
|
|
295
|
-
model.export(format="
|
|
213
|
+
model.export(format="torchscript")
|
|
296
214
|
|
|
297
215
|
|
|
298
216
|
def test_predict_callback_and_setup():
|
|
@@ -345,12 +263,12 @@ def test_labels_and_crops():
|
|
|
345
263
|
labels = save_path / f"labels/{im_name}.txt"
|
|
346
264
|
assert labels.exists()
|
|
347
265
|
# Check detections match label count
|
|
348
|
-
assert len(r.boxes.data) == len([
|
|
266
|
+
assert len(r.boxes.data) == len([line for line in labels.read_text().splitlines() if line])
|
|
349
267
|
# Check crops path and files
|
|
350
|
-
crop_dirs =
|
|
268
|
+
crop_dirs = list((save_path / "crops").iterdir())
|
|
351
269
|
crop_files = [f for p in crop_dirs for f in p.glob("*")]
|
|
352
270
|
# Crop directories match detections
|
|
353
|
-
assert all(
|
|
271
|
+
assert all(r.names.get(c) in {d.name for d in crop_dirs} for c in cls_idxs)
|
|
354
272
|
# Same number of crops as detections
|
|
355
273
|
assert len([f for f in crop_files if im_name in f.name]) == len(r.boxes.data)
|
|
356
274
|
|
|
@@ -436,12 +354,12 @@ def test_utils_checks():
|
|
|
436
354
|
checks.git_describe(ROOT)
|
|
437
355
|
checks.check_requirements() # check requirements.txt
|
|
438
356
|
checks.check_imgsz([600, 600], max_dim=1)
|
|
439
|
-
checks.check_imshow()
|
|
357
|
+
checks.check_imshow(warn=True)
|
|
440
358
|
checks.check_version("ultralytics", "8.0.0")
|
|
441
359
|
checks.print_args()
|
|
442
|
-
# checks.check_imshow(warn=True)
|
|
443
360
|
|
|
444
361
|
|
|
362
|
+
@pytest.mark.skipif(WINDOWS, reason="Windows profiling is extremely slow (cause unknown)")
|
|
445
363
|
def test_utils_benchmarks():
|
|
446
364
|
"""Test model benchmarking."""
|
|
447
365
|
from ultralytics.utils.benchmarks import ProfileModels
|
|
@@ -640,21 +558,17 @@ def test_yolo_world():
|
|
|
640
558
|
"""Tests YOLO world models with different configurations, including classes, detection, and training scenarios."""
|
|
641
559
|
model = YOLO("yolov8s-world.pt") # no YOLOv8n-world model yet
|
|
642
560
|
model.set_classes(["tree", "window"])
|
|
643
|
-
model(
|
|
561
|
+
model(SOURCE, conf=0.01)
|
|
644
562
|
|
|
645
563
|
model = YOLO("yolov8s-worldv2.pt") # no YOLOv8n-world model yet
|
|
646
|
-
# Training from
|
|
647
|
-
# Use dota8.yaml which has
|
|
564
|
+
# Training from a pretrained model. Eval is included at the final stage of training.
|
|
565
|
+
# Use dota8.yaml which has fewer categories to reduce the inference time of CLIP model
|
|
648
566
|
model.train(
|
|
649
567
|
data="dota8.yaml",
|
|
650
568
|
epochs=1,
|
|
651
569
|
imgsz=32,
|
|
652
570
|
cache="disk",
|
|
653
|
-
batch=4,
|
|
654
571
|
close_mosaic=1,
|
|
655
|
-
name="yolo-world",
|
|
656
|
-
save_txt=True,
|
|
657
|
-
save_json=True,
|
|
658
572
|
)
|
|
659
573
|
|
|
660
574
|
# test WorWorldTrainerFromScratch
|
|
@@ -666,8 +580,6 @@ def test_yolo_world():
|
|
|
666
580
|
epochs=1,
|
|
667
581
|
imgsz=32,
|
|
668
582
|
cache="disk",
|
|
669
|
-
batch=4,
|
|
670
583
|
close_mosaic=1,
|
|
671
|
-
name="yolo-world",
|
|
672
584
|
trainer=WorldTrainerFromScratch,
|
|
673
585
|
)
|