ultralytics 8.2.8__tar.gz → 8.2.10__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.8/ultralytics.egg-info → ultralytics-8.2.10}/PKG-INFO +2 -2
- {ultralytics-8.2.8 → ultralytics-8.2.10}/pyproject.toml +1 -1
- {ultralytics-8.2.8 → ultralytics-8.2.10}/tests/test_cli.py +18 -28
- {ultralytics-8.2.8 → ultralytics-8.2.10}/tests/test_cuda.py +10 -15
- {ultralytics-8.2.8 → ultralytics-8.2.10}/tests/test_engine.py +19 -20
- ultralytics-8.2.10/tests/test_exports.py +187 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/tests/test_integrations.py +5 -10
- {ultralytics-8.2.8 → ultralytics-8.2.10}/tests/test_python.py +27 -130
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/__init__.py +1 -1
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/__init__.py +1 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/data/augment.py +1 -2
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/data/base.py +1 -2
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/data/build.py +2 -4
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/engine/exporter.py +38 -29
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/engine/model.py +2 -2
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/engine/results.py +22 -16
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/solutions/parking_management.py +35 -22
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/utils/benchmarks.py +4 -3
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/utils/tuner.py +1 -1
- {ultralytics-8.2.8 → ultralytics-8.2.10/ultralytics.egg-info}/PKG-INFO +2 -2
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics.egg-info/SOURCES.txt +1 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics.egg-info/requires.txt +1 -1
- {ultralytics-8.2.8 → ultralytics-8.2.10}/LICENSE +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/README.md +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/setup.cfg +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/tests/test_explorer.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/assets/bus.jpg +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/assets/zidane.jpg +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/datasets/VOC.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/datasets/coco.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/datasets/coco128.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/datasets/coco8.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/datasets/dota8.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/datasets/lvis.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/datasets/xView.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/default.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/trackers/botsort.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/data/__init__.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/data/annotator.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/data/converter.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/data/dataset.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/data/explorer/__init__.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/data/explorer/explorer.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/data/explorer/gui/__init__.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/data/explorer/gui/dash.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/data/explorer/utils.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/data/loaders.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/data/split_dota.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/data/utils.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/engine/__init__.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/engine/predictor.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/engine/trainer.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/engine/tuner.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/engine/validator.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/hub/__init__.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/hub/auth.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/hub/session.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/hub/utils.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/__init__.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/fastsam/__init__.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/fastsam/model.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/fastsam/predict.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/fastsam/prompt.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/fastsam/utils.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/fastsam/val.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/nas/__init__.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/nas/model.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/nas/predict.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/nas/val.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/rtdetr/__init__.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/rtdetr/model.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/rtdetr/predict.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/rtdetr/train.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/rtdetr/val.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/sam/__init__.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/sam/amg.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/sam/build.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/sam/model.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/sam/modules/__init__.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/sam/modules/decoders.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/sam/modules/encoders.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/sam/modules/sam.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/sam/modules/transformer.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/sam/predict.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/utils/__init__.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/utils/loss.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/utils/ops.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/yolo/__init__.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/yolo/classify/__init__.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/yolo/classify/predict.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/yolo/classify/train.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/yolo/classify/val.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/yolo/detect/__init__.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/yolo/detect/predict.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/yolo/detect/train.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/yolo/detect/val.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/yolo/model.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/yolo/obb/__init__.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/yolo/obb/predict.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/yolo/obb/train.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/yolo/obb/val.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/yolo/pose/__init__.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/yolo/pose/predict.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/yolo/pose/train.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/yolo/pose/val.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/yolo/segment/__init__.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/yolo/segment/predict.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/yolo/segment/train.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/yolo/segment/val.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/yolo/world/__init__.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/yolo/world/train.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/models/yolo/world/train_world.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/nn/__init__.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/nn/autobackend.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/nn/modules/__init__.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/nn/modules/block.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/nn/modules/conv.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/nn/modules/head.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/nn/modules/transformer.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/nn/modules/utils.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/nn/tasks.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/solutions/__init__.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/solutions/ai_gym.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/solutions/distance_calculation.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/solutions/heatmap.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/solutions/object_counter.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/solutions/queue_management.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/solutions/speed_estimation.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/trackers/__init__.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/trackers/basetrack.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/trackers/bot_sort.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/trackers/byte_tracker.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/trackers/track.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/trackers/utils/__init__.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/trackers/utils/gmc.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/trackers/utils/kalman_filter.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/trackers/utils/matching.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/utils/__init__.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/utils/autobatch.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/utils/callbacks/__init__.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/utils/callbacks/base.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/utils/callbacks/clearml.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/utils/callbacks/comet.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/utils/callbacks/dvc.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/utils/callbacks/hub.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/utils/callbacks/mlflow.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/utils/callbacks/neptune.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/utils/callbacks/raytune.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/utils/callbacks/tensorboard.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/utils/callbacks/wb.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/utils/checks.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/utils/dist.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/utils/downloads.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/utils/errors.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/utils/files.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/utils/instance.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/utils/loss.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/utils/metrics.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/utils/ops.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/utils/patches.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/utils/plotting.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/utils/tal.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/utils/torch_utils.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics/utils/triton.py +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics.egg-info/dependency_links.txt +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/ultralytics.egg-info/entry_points.txt +0 -0
- {ultralytics-8.2.8 → ultralytics-8.2.10}/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.10
|
|
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.6; 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.
|
|
126
|
+
"albumentations>=1.4.6", # 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():
|
|
@@ -25,14 +20,14 @@ def test_checks():
|
|
|
25
20
|
def test_export_engine():
|
|
26
21
|
"""Test exporting the YOLO model to NVIDIA TensorRT format."""
|
|
27
22
|
f = YOLO(MODEL).export(format="engine", device=0)
|
|
28
|
-
YOLO(f)(
|
|
23
|
+
YOLO(f)(SOURCE, device=0)
|
|
29
24
|
|
|
30
25
|
|
|
31
26
|
@pytest.mark.skipif(not CUDA_IS_AVAILABLE, reason="CUDA is not available")
|
|
32
27
|
def test_train():
|
|
33
28
|
"""Test model training on a minimal dataset."""
|
|
34
29
|
device = 0 if CUDA_DEVICE_COUNT == 1 else [0, 1]
|
|
35
|
-
YOLO(MODEL).train(data=
|
|
30
|
+
YOLO(MODEL).train(data="coco8.yaml", imgsz=64, epochs=1, device=device) # requires imgsz>=64
|
|
36
31
|
|
|
37
32
|
|
|
38
33
|
@pytest.mark.slow
|
|
@@ -42,22 +37,22 @@ def test_predict_multiple_devices():
|
|
|
42
37
|
model = YOLO("yolov8n.pt")
|
|
43
38
|
model = model.cpu()
|
|
44
39
|
assert str(model.device) == "cpu"
|
|
45
|
-
_ = model(
|
|
40
|
+
_ = model(SOURCE) # CPU inference
|
|
46
41
|
assert str(model.device) == "cpu"
|
|
47
42
|
|
|
48
43
|
model = model.to("cuda:0")
|
|
49
44
|
assert str(model.device) == "cuda:0"
|
|
50
|
-
_ = model(
|
|
45
|
+
_ = model(SOURCE) # CUDA inference
|
|
51
46
|
assert str(model.device) == "cuda:0"
|
|
52
47
|
|
|
53
48
|
model = model.cpu()
|
|
54
49
|
assert str(model.device) == "cpu"
|
|
55
|
-
_ = model(
|
|
50
|
+
_ = model(SOURCE) # CPU inference
|
|
56
51
|
assert str(model.device) == "cpu"
|
|
57
52
|
|
|
58
53
|
model = model.cuda()
|
|
59
54
|
assert str(model.device) == "cuda:0"
|
|
60
|
-
_ = model(
|
|
55
|
+
_ = model(SOURCE) # CUDA inference
|
|
61
56
|
assert str(model.device) == "cuda:0"
|
|
62
57
|
|
|
63
58
|
|
|
@@ -93,10 +88,10 @@ def test_predict_sam():
|
|
|
93
88
|
model.info()
|
|
94
89
|
|
|
95
90
|
# Run inference
|
|
96
|
-
model(
|
|
91
|
+
model(SOURCE, device=0)
|
|
97
92
|
|
|
98
93
|
# Run inference with bboxes prompt
|
|
99
|
-
model(
|
|
94
|
+
model(SOURCE, bboxes=[439, 437, 524, 709], device=0)
|
|
100
95
|
|
|
101
96
|
# Run inference with points prompt
|
|
102
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,187 @@
|
|
|
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
|
+
|
|
22
|
+
from . import MODEL, SOURCE
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def test_export_torchscript():
|
|
26
|
+
"""Test YOLO exports to TorchScript format."""
|
|
27
|
+
f = YOLO(MODEL).export(format="torchscript", optimize=False, imgsz=32)
|
|
28
|
+
YOLO(f)(SOURCE, imgsz=32) # exported model inference
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def test_export_onnx():
|
|
32
|
+
"""Test YOLO exports to ONNX format."""
|
|
33
|
+
f = YOLO(MODEL).export(format="onnx", dynamic=True, imgsz=32)
|
|
34
|
+
YOLO(f)(SOURCE, imgsz=32) # exported model inference
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@pytest.mark.skipif(checks.IS_PYTHON_3_12, reason="OpenVINO not supported in Python 3.12")
|
|
38
|
+
@pytest.mark.skipif(not TORCH_1_13, reason="OpenVINO requires torch>=1.13")
|
|
39
|
+
def test_export_openvino():
|
|
40
|
+
"""Test YOLO exports to OpenVINO format."""
|
|
41
|
+
f = YOLO(MODEL).export(format="openvino", imgsz=32)
|
|
42
|
+
YOLO(f)(SOURCE, imgsz=32) # exported model inference
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
@pytest.mark.slow
|
|
46
|
+
@pytest.mark.skipif(checks.IS_PYTHON_3_12, reason="OpenVINO not supported in Python 3.12")
|
|
47
|
+
@pytest.mark.skipif(not TORCH_1_13, reason="OpenVINO requires torch>=1.13")
|
|
48
|
+
@pytest.mark.parametrize(
|
|
49
|
+
"task, dynamic, int8, half, batch",
|
|
50
|
+
[ # generate all combinations but exclude those where both int8 and half are True
|
|
51
|
+
(task, dynamic, int8, half, batch)
|
|
52
|
+
for task, dynamic, int8, half, batch in product(TASKS, [True, False], [True, False], [True, False], [1, 2])
|
|
53
|
+
if not (int8 and half) # exclude cases where both int8 and half are True
|
|
54
|
+
],
|
|
55
|
+
)
|
|
56
|
+
def test_export_openvino_matrix(task, dynamic, int8, half, batch):
|
|
57
|
+
"""Test YOLO exports to OpenVINO format."""
|
|
58
|
+
file = YOLO(TASK2MODEL[task]).export(
|
|
59
|
+
format="openvino",
|
|
60
|
+
imgsz=32,
|
|
61
|
+
dynamic=dynamic,
|
|
62
|
+
int8=int8,
|
|
63
|
+
half=half,
|
|
64
|
+
batch=batch,
|
|
65
|
+
data=TASK2DATA[task],
|
|
66
|
+
)
|
|
67
|
+
if WINDOWS:
|
|
68
|
+
# Use unique filenames due to Windows file permissions bug possibly due to latent threaded use
|
|
69
|
+
# See https://github.com/ultralytics/ultralytics/actions/runs/8957949304/job/24601616830?pr=10423
|
|
70
|
+
file = Path(file)
|
|
71
|
+
file = file.rename(file.with_stem(f"{file.stem}-{uuid.uuid4()}"))
|
|
72
|
+
YOLO(file)([SOURCE] * batch, imgsz=64 if dynamic else 32) # exported model inference
|
|
73
|
+
with Retry(times=3, delay=1): # retry in case of potential lingering multi-threaded file usage errors
|
|
74
|
+
shutil.rmtree(file)
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
@pytest.mark.slow
|
|
78
|
+
@pytest.mark.parametrize("task, dynamic, int8, half, batch", product(TASKS, [True, False], [False], [False], [1, 2]))
|
|
79
|
+
def test_export_onnx_matrix(task, dynamic, int8, half, batch):
|
|
80
|
+
"""Test YOLO exports to ONNX format."""
|
|
81
|
+
file = YOLO(TASK2MODEL[task]).export(
|
|
82
|
+
format="onnx",
|
|
83
|
+
imgsz=32,
|
|
84
|
+
dynamic=dynamic,
|
|
85
|
+
int8=int8,
|
|
86
|
+
half=half,
|
|
87
|
+
batch=batch,
|
|
88
|
+
)
|
|
89
|
+
YOLO(file)([SOURCE] * batch, imgsz=64 if dynamic else 32) # exported model inference
|
|
90
|
+
Path(file).unlink() # cleanup
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
@pytest.mark.slow
|
|
94
|
+
@pytest.mark.parametrize("task, dynamic, int8, half, batch", product(TASKS, [False], [False], [False], [1, 2]))
|
|
95
|
+
def test_export_torchscript_matrix(task, dynamic, int8, half, batch):
|
|
96
|
+
"""Test YOLO exports to TorchScript format."""
|
|
97
|
+
file = YOLO(TASK2MODEL[task]).export(
|
|
98
|
+
format="torchscript",
|
|
99
|
+
imgsz=32,
|
|
100
|
+
dynamic=dynamic,
|
|
101
|
+
int8=int8,
|
|
102
|
+
half=half,
|
|
103
|
+
batch=batch,
|
|
104
|
+
)
|
|
105
|
+
YOLO(file)([SOURCE] * 3, imgsz=64 if dynamic else 32) # exported model inference at batch=3
|
|
106
|
+
Path(file).unlink() # cleanup
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
@pytest.mark.slow
|
|
110
|
+
@pytest.mark.skipif(not MACOS, reason="CoreML inference only supported on macOS")
|
|
111
|
+
@pytest.mark.skipif(not TORCH_1_9, reason="CoreML>=7.2 not supported with PyTorch<=1.8")
|
|
112
|
+
@pytest.mark.skipif(checks.IS_PYTHON_3_12, reason="CoreML not supported in Python 3.12")
|
|
113
|
+
@pytest.mark.parametrize(
|
|
114
|
+
"task, dynamic, int8, half, batch",
|
|
115
|
+
[ # generate all combinations but exclude those where both int8 and half are True
|
|
116
|
+
(task, dynamic, int8, half, batch)
|
|
117
|
+
for task, dynamic, int8, half, batch in product(TASKS, [False], [True, False], [True, False], [1])
|
|
118
|
+
if not (int8 and half) # exclude cases where both int8 and half are True
|
|
119
|
+
],
|
|
120
|
+
)
|
|
121
|
+
def test_export_coreml_matrix(task, dynamic, int8, half, batch):
|
|
122
|
+
"""Test YOLO exports to TorchScript format."""
|
|
123
|
+
file = YOLO(TASK2MODEL[task]).export(
|
|
124
|
+
format="coreml",
|
|
125
|
+
imgsz=32,
|
|
126
|
+
dynamic=dynamic,
|
|
127
|
+
int8=int8,
|
|
128
|
+
half=half,
|
|
129
|
+
batch=batch,
|
|
130
|
+
)
|
|
131
|
+
YOLO(file)([SOURCE] * batch, imgsz=32) # exported model inference at batch=3
|
|
132
|
+
shutil.rmtree(file) # cleanup
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
@pytest.mark.skipif(not TORCH_1_9, reason="CoreML>=7.2 not supported with PyTorch<=1.8")
|
|
136
|
+
@pytest.mark.skipif(WINDOWS, reason="CoreML not supported on Windows") # RuntimeError: BlobWriter not loaded
|
|
137
|
+
@pytest.mark.skipif(IS_RASPBERRYPI, reason="CoreML not supported on Raspberry Pi")
|
|
138
|
+
@pytest.mark.skipif(checks.IS_PYTHON_3_12, reason="CoreML not supported in Python 3.12")
|
|
139
|
+
def test_export_coreml():
|
|
140
|
+
"""Test YOLO exports to CoreML format."""
|
|
141
|
+
if MACOS:
|
|
142
|
+
f = YOLO(MODEL).export(format="coreml", imgsz=32)
|
|
143
|
+
YOLO(f)(SOURCE, imgsz=32) # model prediction only supported on macOS for nms=False models
|
|
144
|
+
else:
|
|
145
|
+
YOLO(MODEL).export(format="coreml", nms=True, imgsz=32)
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
@pytest.mark.skipif(not LINUX, reason="Test disabled as TF suffers from install conflicts on Windows and macOS")
|
|
149
|
+
def test_export_tflite():
|
|
150
|
+
"""
|
|
151
|
+
Test YOLO exports to TFLite format.
|
|
152
|
+
|
|
153
|
+
Note TF suffers from install conflicts on Windows and macOS.
|
|
154
|
+
"""
|
|
155
|
+
model = YOLO(MODEL)
|
|
156
|
+
f = model.export(format="tflite", imgsz=32)
|
|
157
|
+
YOLO(f)(SOURCE, imgsz=32)
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
@pytest.mark.skipif(True, reason="Test disabled")
|
|
161
|
+
@pytest.mark.skipif(not LINUX, reason="TF suffers from install conflicts on Windows and macOS")
|
|
162
|
+
def test_export_pb():
|
|
163
|
+
"""
|
|
164
|
+
Test YOLO exports to *.pb format.
|
|
165
|
+
|
|
166
|
+
Note TF suffers from install conflicts on Windows and macOS.
|
|
167
|
+
"""
|
|
168
|
+
model = YOLO(MODEL)
|
|
169
|
+
f = model.export(format="pb", imgsz=32)
|
|
170
|
+
YOLO(f)(SOURCE, imgsz=32)
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
@pytest.mark.skipif(True, reason="Test disabled as Paddle protobuf and ONNX protobuf requirementsk conflict.")
|
|
174
|
+
def test_export_paddle():
|
|
175
|
+
"""
|
|
176
|
+
Test YOLO exports to Paddle format.
|
|
177
|
+
|
|
178
|
+
Note Paddle protobuf requirements conflicting with onnx protobuf requirements.
|
|
179
|
+
"""
|
|
180
|
+
YOLO(MODEL).export(format="paddle", imgsz=32)
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
@pytest.mark.slow
|
|
184
|
+
def test_export_ncnn():
|
|
185
|
+
"""Test YOLO exports to NCNN format."""
|
|
186
|
+
f = YOLO(MODEL).export(format="ncnn", imgsz=32)
|
|
187
|
+
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
|