ultralytics 8.1.5__tar.gz → 8.1.7__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.1.5/ultralytics.egg-info → ultralytics-8.1.7}/PKG-INFO +2 -2
- {ultralytics-8.1.5 → ultralytics-8.1.7}/pyproject.toml +1 -1
- {ultralytics-8.1.5 → ultralytics-8.1.7}/tests/test_cli.py +42 -40
- {ultralytics-8.1.5 → ultralytics-8.1.7}/tests/test_cuda.py +23 -23
- ultralytics-8.1.7/tests/test_engine.py +128 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/tests/test_explorer.py +7 -7
- ultralytics-8.1.7/tests/test_integrations.py +117 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/tests/test_python.py +129 -101
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/__init__.py +1 -1
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/__init__.py +3 -2
- ultralytics-8.1.7/ultralytics/cfg/datasets/carparts-seg.yaml +43 -0
- ultralytics-8.1.7/ultralytics/cfg/datasets/crack-seg.yaml +21 -0
- ultralytics-8.1.7/ultralytics/cfg/datasets/package-seg.yaml +21 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/data/build.py +5 -6
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/data/converter.py +2 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/data/dataset.py +9 -4
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/data/explorer/explorer.py +5 -2
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/data/explorer/gui/dash.py +23 -3
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/data/loaders.py +4 -12
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/engine/model.py +2 -2
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/engine/predictor.py +1 -1
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/engine/results.py +5 -2
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/engine/trainer.py +6 -2
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/hub/__init__.py +6 -3
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/hub/auth.py +2 -2
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/hub/session.py +2 -2
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/sam/amg.py +4 -2
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/yolo/segment/val.py +6 -2
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/nn/autobackend.py +6 -6
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/solutions/distance_calculation.py +5 -17
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/solutions/object_counter.py +0 -1
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/utils/__init__.py +78 -7
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/utils/benchmarks.py +7 -4
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/utils/checks.py +2 -2
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/utils/loss.py +7 -2
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/utils/metrics.py +1 -1
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/utils/ops.py +4 -5
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/utils/plotting.py +46 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/utils/triton.py +1 -1
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/utils/tuner.py +1 -1
- {ultralytics-8.1.5 → ultralytics-8.1.7/ultralytics.egg-info}/PKG-INFO +2 -2
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics.egg-info/SOURCES.txt +3 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics.egg-info/requires.txt +1 -1
- ultralytics-8.1.5/tests/test_engine.py +0 -128
- ultralytics-8.1.5/tests/test_integrations.py +0 -117
- {ultralytics-8.1.5 → ultralytics-8.1.7}/LICENSE +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/README.md +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/setup.cfg +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/assets/bus.jpg +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/assets/zidane.jpg +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/datasets/VOC.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/datasets/coco.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/datasets/coco128.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/datasets/coco8.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/datasets/dota8.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/datasets/xView.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/default.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/trackers/botsort.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/data/__init__.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/data/annotator.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/data/augment.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/data/base.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/data/explorer/__init__.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/data/explorer/gui/__init__.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/data/explorer/utils.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/data/split_dota.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/data/utils.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/engine/__init__.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/engine/exporter.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/engine/tuner.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/engine/validator.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/hub/utils.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/__init__.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/fastsam/__init__.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/fastsam/model.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/fastsam/predict.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/fastsam/prompt.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/fastsam/utils.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/fastsam/val.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/nas/__init__.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/nas/model.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/nas/predict.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/nas/val.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/rtdetr/__init__.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/rtdetr/model.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/rtdetr/predict.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/rtdetr/train.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/rtdetr/val.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/sam/__init__.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/sam/build.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/sam/model.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/sam/modules/__init__.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/sam/modules/decoders.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/sam/modules/encoders.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/sam/modules/sam.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/sam/modules/transformer.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/sam/predict.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/utils/__init__.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/utils/loss.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/utils/ops.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/yolo/__init__.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/yolo/classify/__init__.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/yolo/classify/predict.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/yolo/classify/train.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/yolo/classify/val.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/yolo/detect/__init__.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/yolo/detect/predict.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/yolo/detect/train.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/yolo/detect/val.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/yolo/model.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/yolo/obb/__init__.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/yolo/obb/predict.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/yolo/obb/train.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/yolo/obb/val.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/yolo/pose/__init__.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/yolo/pose/predict.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/yolo/pose/train.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/yolo/pose/val.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/yolo/segment/__init__.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/yolo/segment/predict.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/models/yolo/segment/train.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/nn/__init__.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/nn/modules/__init__.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/nn/modules/block.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/nn/modules/conv.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/nn/modules/head.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/nn/modules/transformer.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/nn/modules/utils.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/nn/tasks.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/solutions/__init__.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/solutions/ai_gym.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/solutions/heatmap.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/solutions/speed_estimation.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/trackers/__init__.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/trackers/basetrack.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/trackers/bot_sort.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/trackers/byte_tracker.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/trackers/track.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/trackers/utils/__init__.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/trackers/utils/gmc.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/trackers/utils/kalman_filter.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/trackers/utils/matching.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/utils/autobatch.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/utils/callbacks/__init__.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/utils/callbacks/base.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/utils/callbacks/clearml.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/utils/callbacks/comet.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/utils/callbacks/dvc.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/utils/callbacks/hub.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/utils/callbacks/mlflow.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/utils/callbacks/neptune.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/utils/callbacks/raytune.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/utils/callbacks/tensorboard.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/utils/callbacks/wb.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/utils/dist.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/utils/downloads.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/utils/errors.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/utils/files.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/utils/instance.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/utils/patches.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/utils/tal.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics/utils/torch_utils.py +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics.egg-info/dependency_links.txt +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/ultralytics.egg-info/entry_points.txt +0 -0
- {ultralytics-8.1.5 → ultralytics-8.1.7}/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.1.
|
|
3
|
+
Version: 8.1.7
|
|
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
|
|
@@ -55,7 +55,7 @@ Requires-Dist: mkdocs-material; extra == "dev"
|
|
|
55
55
|
Requires-Dist: mkdocstrings[python]; extra == "dev"
|
|
56
56
|
Requires-Dist: mkdocs-jupyter; extra == "dev"
|
|
57
57
|
Requires-Dist: mkdocs-redirects; extra == "dev"
|
|
58
|
-
Requires-Dist: mkdocs-ultralytics-plugin>=0.0.
|
|
58
|
+
Requires-Dist: mkdocs-ultralytics-plugin>=0.0.42; extra == "dev"
|
|
59
59
|
Provides-Extra: export
|
|
60
60
|
Requires-Dist: onnx>=1.12.0; extra == "export"
|
|
61
61
|
Requires-Dist: coremltools>=7.0; platform_system != "Windows" and extra == "export"
|
|
@@ -93,7 +93,7 @@ dev = [
|
|
|
93
93
|
"mkdocstrings[python]",
|
|
94
94
|
"mkdocs-jupyter", # for notebooks
|
|
95
95
|
"mkdocs-redirects", # for 301 redirects
|
|
96
|
-
"mkdocs-ultralytics-plugin>=0.0.
|
|
96
|
+
"mkdocs-ultralytics-plugin>=0.0.42", # for meta descriptions and images, dates and authors
|
|
97
97
|
]
|
|
98
98
|
export = [
|
|
99
99
|
"onnx>=1.12.0", # ONNX export
|
|
@@ -10,17 +10,19 @@ from ultralytics.utils.checks import cuda_device_count, cuda_is_available
|
|
|
10
10
|
CUDA_IS_AVAILABLE = cuda_is_available()
|
|
11
11
|
CUDA_DEVICE_COUNT = cuda_device_count()
|
|
12
12
|
TASK_ARGS = [
|
|
13
|
-
(
|
|
14
|
-
(
|
|
15
|
-
(
|
|
16
|
-
(
|
|
17
|
-
(
|
|
13
|
+
("detect", "yolov8n", "coco8.yaml"),
|
|
14
|
+
("segment", "yolov8n-seg", "coco8-seg.yaml"),
|
|
15
|
+
("classify", "yolov8n-cls", "imagenet10"),
|
|
16
|
+
("pose", "yolov8n-pose", "coco8-pose.yaml"),
|
|
17
|
+
("obb", "yolov8n-obb", "dota8.yaml"),
|
|
18
|
+
] # (task, model, data)
|
|
18
19
|
EXPORT_ARGS = [
|
|
19
|
-
(
|
|
20
|
-
(
|
|
21
|
-
(
|
|
22
|
-
(
|
|
23
|
-
(
|
|
20
|
+
("yolov8n", "torchscript"),
|
|
21
|
+
("yolov8n-seg", "torchscript"),
|
|
22
|
+
("yolov8n-cls", "torchscript"),
|
|
23
|
+
("yolov8n-pose", "torchscript"),
|
|
24
|
+
("yolov8n-obb", "torchscript"),
|
|
25
|
+
] # (model, format)
|
|
24
26
|
|
|
25
27
|
|
|
26
28
|
def run(cmd):
|
|
@@ -30,50 +32,50 @@ def run(cmd):
|
|
|
30
32
|
|
|
31
33
|
def test_special_modes():
|
|
32
34
|
"""Test various special command modes of YOLO."""
|
|
33
|
-
run(
|
|
34
|
-
run(
|
|
35
|
-
run(
|
|
36
|
-
run(
|
|
37
|
-
run(
|
|
35
|
+
run("yolo help")
|
|
36
|
+
run("yolo checks")
|
|
37
|
+
run("yolo version")
|
|
38
|
+
run("yolo settings reset")
|
|
39
|
+
run("yolo cfg")
|
|
38
40
|
|
|
39
41
|
|
|
40
|
-
@pytest.mark.parametrize(
|
|
42
|
+
@pytest.mark.parametrize("task,model,data", TASK_ARGS)
|
|
41
43
|
def test_train(task, model, data):
|
|
42
44
|
"""Test YOLO training for a given task, model, and data."""
|
|
43
|
-
run(f
|
|
45
|
+
run(f"yolo train {task} model={model}.yaml data={data} imgsz=32 epochs=1 cache=disk")
|
|
44
46
|
|
|
45
47
|
|
|
46
|
-
@pytest.mark.parametrize(
|
|
48
|
+
@pytest.mark.parametrize("task,model,data", TASK_ARGS)
|
|
47
49
|
def test_val(task, model, data):
|
|
48
50
|
"""Test YOLO validation for a given task, model, and data."""
|
|
49
|
-
run(f
|
|
51
|
+
run(f"yolo val {task} model={WEIGHTS_DIR / model}.pt data={data} imgsz=32 save_txt save_json")
|
|
50
52
|
|
|
51
53
|
|
|
52
|
-
@pytest.mark.parametrize(
|
|
54
|
+
@pytest.mark.parametrize("task,model,data", TASK_ARGS)
|
|
53
55
|
def test_predict(task, model, data):
|
|
54
56
|
"""Test YOLO prediction on sample assets for a given task and model."""
|
|
55
|
-
run(f
|
|
57
|
+
run(f"yolo predict model={WEIGHTS_DIR / model}.pt source={ASSETS} imgsz=32 save save_crop save_txt")
|
|
56
58
|
|
|
57
59
|
|
|
58
|
-
@pytest.mark.parametrize(
|
|
60
|
+
@pytest.mark.parametrize("model,format", EXPORT_ARGS)
|
|
59
61
|
def test_export(model, format):
|
|
60
62
|
"""Test exporting a YOLO model to different formats."""
|
|
61
|
-
run(f
|
|
63
|
+
run(f"yolo export model={WEIGHTS_DIR / model}.pt format={format} imgsz=32")
|
|
62
64
|
|
|
63
65
|
|
|
64
|
-
def test_rtdetr(task=
|
|
66
|
+
def test_rtdetr(task="detect", model="yolov8n-rtdetr.yaml", data="coco8.yaml"):
|
|
65
67
|
"""Test the RTDETR functionality with the Ultralytics framework."""
|
|
66
68
|
# Warning: MUST use imgsz=640
|
|
67
|
-
run(f
|
|
69
|
+
run(f"yolo train {task} model={model} data={data} --imgsz= 640 epochs =1, cache = disk") # add coma, spaces to args
|
|
68
70
|
run(f"yolo predict {task} model={model} source={ASSETS / 'bus.jpg'} imgsz=640 save save_crop save_txt")
|
|
69
71
|
|
|
70
72
|
|
|
71
|
-
def test_fastsam(task=
|
|
73
|
+
def test_fastsam(task="segment", model=WEIGHTS_DIR / "FastSAM-s.pt", data="coco8-seg.yaml"):
|
|
72
74
|
"""Test FastSAM segmentation functionality within Ultralytics."""
|
|
73
|
-
source = ASSETS /
|
|
75
|
+
source = ASSETS / "bus.jpg"
|
|
74
76
|
|
|
75
|
-
run(f
|
|
76
|
-
run(f
|
|
77
|
+
run(f"yolo segment val {task} model={model} data={data} imgsz=32")
|
|
78
|
+
run(f"yolo segment predict model={model} source={source} imgsz=32 save save_crop save_txt")
|
|
77
79
|
|
|
78
80
|
from ultralytics import FastSAM
|
|
79
81
|
from ultralytics.models.fastsam import FastSAMPrompt
|
|
@@ -83,26 +85,26 @@ def test_fastsam(task='segment', model=WEIGHTS_DIR / 'FastSAM-s.pt', data='coco8
|
|
|
83
85
|
sam_model = FastSAM(model) # or FastSAM-x.pt
|
|
84
86
|
|
|
85
87
|
# Run inference on an image
|
|
86
|
-
everything_results = sam_model(source, device=
|
|
88
|
+
everything_results = sam_model(source, device="cpu", retina_masks=True, imgsz=1024, conf=0.4, iou=0.9)
|
|
87
89
|
|
|
88
90
|
# Remove small regions
|
|
89
91
|
new_masks, _ = Predictor.remove_small_regions(everything_results[0].masks.data, min_area=20)
|
|
90
92
|
|
|
91
93
|
# Everything prompt
|
|
92
|
-
prompt_process = FastSAMPrompt(source, everything_results, device=
|
|
94
|
+
prompt_process = FastSAMPrompt(source, everything_results, device="cpu")
|
|
93
95
|
ann = prompt_process.everything_prompt()
|
|
94
96
|
|
|
95
97
|
# Bbox default shape [0,0,0,0] -> [x1,y1,x2,y2]
|
|
96
98
|
ann = prompt_process.box_prompt(bbox=[200, 200, 300, 300])
|
|
97
99
|
|
|
98
100
|
# Text prompt
|
|
99
|
-
ann = prompt_process.text_prompt(text=
|
|
101
|
+
ann = prompt_process.text_prompt(text="a photo of a dog")
|
|
100
102
|
|
|
101
103
|
# Point prompt
|
|
102
104
|
# Points default [[0,0]] [[x1,y1],[x2,y2]]
|
|
103
105
|
# Point_label default [0] [1,0] 0:background, 1:foreground
|
|
104
106
|
ann = prompt_process.point_prompt(points=[[200, 200]], pointlabel=[1])
|
|
105
|
-
prompt_process.plot(annotations=ann, output=
|
|
107
|
+
prompt_process.plot(annotations=ann, output="./")
|
|
106
108
|
|
|
107
109
|
|
|
108
110
|
def test_mobilesam():
|
|
@@ -110,10 +112,10 @@ def test_mobilesam():
|
|
|
110
112
|
from ultralytics import SAM
|
|
111
113
|
|
|
112
114
|
# Load the model
|
|
113
|
-
model = SAM(WEIGHTS_DIR /
|
|
115
|
+
model = SAM(WEIGHTS_DIR / "mobile_sam.pt")
|
|
114
116
|
|
|
115
117
|
# Source
|
|
116
|
-
source = ASSETS /
|
|
118
|
+
source = ASSETS / "zidane.jpg"
|
|
117
119
|
|
|
118
120
|
# Predict a segment based on a point prompt
|
|
119
121
|
model.predict(source, points=[900, 370], labels=[1])
|
|
@@ -127,10 +129,10 @@ def test_mobilesam():
|
|
|
127
129
|
|
|
128
130
|
# Slow Tests -----------------------------------------------------------------------------------------------------------
|
|
129
131
|
@pytest.mark.slow
|
|
130
|
-
@pytest.mark.parametrize(
|
|
131
|
-
@pytest.mark.skipif(not CUDA_IS_AVAILABLE, reason=
|
|
132
|
-
@pytest.mark.skipif(CUDA_DEVICE_COUNT < 2, reason=
|
|
132
|
+
@pytest.mark.parametrize("task,model,data", TASK_ARGS)
|
|
133
|
+
@pytest.mark.skipif(not CUDA_IS_AVAILABLE, reason="CUDA is not available")
|
|
134
|
+
@pytest.mark.skipif(CUDA_DEVICE_COUNT < 2, reason="DDP is not available")
|
|
133
135
|
def test_train_gpu(task, model, data):
|
|
134
136
|
"""Test YOLO training on GPU(s) for various tasks and models."""
|
|
135
|
-
run(f
|
|
136
|
-
run(f
|
|
137
|
+
run(f"yolo train {task} model={model}.yaml data={data} imgsz=32 epochs=1 device=0") # single GPU
|
|
138
|
+
run(f"yolo train {task} model={model}.pt data={data} imgsz=32 epochs=1 device=0,1") # multi GPU
|
|
@@ -9,9 +9,9 @@ from ultralytics.utils import ASSETS, WEIGHTS_DIR, checks
|
|
|
9
9
|
CUDA_IS_AVAILABLE = checks.cuda_is_available()
|
|
10
10
|
CUDA_DEVICE_COUNT = checks.cuda_device_count()
|
|
11
11
|
|
|
12
|
-
MODEL = WEIGHTS_DIR /
|
|
13
|
-
DATA =
|
|
14
|
-
BUS = ASSETS /
|
|
12
|
+
MODEL = WEIGHTS_DIR / "path with spaces" / "yolov8n.pt" # test spaces in path
|
|
13
|
+
DATA = "coco8.yaml"
|
|
14
|
+
BUS = ASSETS / "bus.jpg"
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
def test_checks():
|
|
@@ -20,7 +20,7 @@ def test_checks():
|
|
|
20
20
|
assert torch.cuda.device_count() == CUDA_DEVICE_COUNT
|
|
21
21
|
|
|
22
22
|
|
|
23
|
-
@pytest.mark.skipif(not CUDA_IS_AVAILABLE, reason=
|
|
23
|
+
@pytest.mark.skipif(not CUDA_IS_AVAILABLE, reason="CUDA is not available")
|
|
24
24
|
def test_train():
|
|
25
25
|
"""Test model training on a minimal dataset."""
|
|
26
26
|
device = 0 if CUDA_DEVICE_COUNT == 1 else [0, 1]
|
|
@@ -28,32 +28,32 @@ def test_train():
|
|
|
28
28
|
|
|
29
29
|
|
|
30
30
|
@pytest.mark.slow
|
|
31
|
-
@pytest.mark.skipif(not CUDA_IS_AVAILABLE, reason=
|
|
31
|
+
@pytest.mark.skipif(not CUDA_IS_AVAILABLE, reason="CUDA is not available")
|
|
32
32
|
def test_predict_multiple_devices():
|
|
33
33
|
"""Validate model prediction on multiple devices."""
|
|
34
|
-
model = YOLO(
|
|
34
|
+
model = YOLO("yolov8n.pt")
|
|
35
35
|
model = model.cpu()
|
|
36
|
-
assert str(model.device) ==
|
|
36
|
+
assert str(model.device) == "cpu"
|
|
37
37
|
_ = model(BUS) # CPU inference
|
|
38
|
-
assert str(model.device) ==
|
|
38
|
+
assert str(model.device) == "cpu"
|
|
39
39
|
|
|
40
|
-
model = model.to(
|
|
41
|
-
assert str(model.device) ==
|
|
40
|
+
model = model.to("cuda:0")
|
|
41
|
+
assert str(model.device) == "cuda:0"
|
|
42
42
|
_ = model(BUS) # CUDA inference
|
|
43
|
-
assert str(model.device) ==
|
|
43
|
+
assert str(model.device) == "cuda:0"
|
|
44
44
|
|
|
45
45
|
model = model.cpu()
|
|
46
|
-
assert str(model.device) ==
|
|
46
|
+
assert str(model.device) == "cpu"
|
|
47
47
|
_ = model(BUS) # CPU inference
|
|
48
|
-
assert str(model.device) ==
|
|
48
|
+
assert str(model.device) == "cpu"
|
|
49
49
|
|
|
50
50
|
model = model.cuda()
|
|
51
|
-
assert str(model.device) ==
|
|
51
|
+
assert str(model.device) == "cuda:0"
|
|
52
52
|
_ = model(BUS) # CUDA inference
|
|
53
|
-
assert str(model.device) ==
|
|
53
|
+
assert str(model.device) == "cuda:0"
|
|
54
54
|
|
|
55
55
|
|
|
56
|
-
@pytest.mark.skipif(not CUDA_IS_AVAILABLE, reason=
|
|
56
|
+
@pytest.mark.skipif(not CUDA_IS_AVAILABLE, reason="CUDA is not available")
|
|
57
57
|
def test_autobatch():
|
|
58
58
|
"""Check batch size for YOLO model using autobatch."""
|
|
59
59
|
from ultralytics.utils.autobatch import check_train_batch_size
|
|
@@ -62,24 +62,24 @@ def test_autobatch():
|
|
|
62
62
|
|
|
63
63
|
|
|
64
64
|
@pytest.mark.slow
|
|
65
|
-
@pytest.mark.skipif(not CUDA_IS_AVAILABLE, reason=
|
|
65
|
+
@pytest.mark.skipif(not CUDA_IS_AVAILABLE, reason="CUDA is not available")
|
|
66
66
|
def test_utils_benchmarks():
|
|
67
67
|
"""Profile YOLO models for performance benchmarks."""
|
|
68
68
|
from ultralytics.utils.benchmarks import ProfileModels
|
|
69
69
|
|
|
70
70
|
# Pre-export a dynamic engine model to use dynamic inference
|
|
71
|
-
YOLO(MODEL).export(format=
|
|
71
|
+
YOLO(MODEL).export(format="engine", imgsz=32, dynamic=True, batch=1)
|
|
72
72
|
ProfileModels([MODEL], imgsz=32, half=False, min_time=1, num_timed_runs=3, num_warmup_runs=1).profile()
|
|
73
73
|
|
|
74
74
|
|
|
75
|
-
@pytest.mark.skipif(not CUDA_IS_AVAILABLE, reason=
|
|
75
|
+
@pytest.mark.skipif(not CUDA_IS_AVAILABLE, reason="CUDA is not available")
|
|
76
76
|
def test_predict_sam():
|
|
77
77
|
"""Test SAM model prediction with various prompts."""
|
|
78
78
|
from ultralytics import SAM
|
|
79
79
|
from ultralytics.models.sam import Predictor as SAMPredictor
|
|
80
80
|
|
|
81
81
|
# Load a model
|
|
82
|
-
model = SAM(WEIGHTS_DIR /
|
|
82
|
+
model = SAM(WEIGHTS_DIR / "sam_b.pt")
|
|
83
83
|
|
|
84
84
|
# Display model information (optional)
|
|
85
85
|
model.info()
|
|
@@ -91,14 +91,14 @@ def test_predict_sam():
|
|
|
91
91
|
model(BUS, bboxes=[439, 437, 524, 709], device=0)
|
|
92
92
|
|
|
93
93
|
# Run inference with points prompt
|
|
94
|
-
model(ASSETS /
|
|
94
|
+
model(ASSETS / "zidane.jpg", points=[900, 370], labels=[1], device=0)
|
|
95
95
|
|
|
96
96
|
# Create SAMPredictor
|
|
97
|
-
overrides = dict(conf=0.25, task=
|
|
97
|
+
overrides = dict(conf=0.25, task="segment", mode="predict", imgsz=1024, model=WEIGHTS_DIR / "mobile_sam.pt")
|
|
98
98
|
predictor = SAMPredictor(overrides=overrides)
|
|
99
99
|
|
|
100
100
|
# Set image
|
|
101
|
-
predictor.set_image(ASSETS /
|
|
101
|
+
predictor.set_image(ASSETS / "zidane.jpg") # set with image file
|
|
102
102
|
# predictor(bboxes=[439, 437, 524, 709])
|
|
103
103
|
# predictor(points=[900, 370], labels=[1])
|
|
104
104
|
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# Ultralytics YOLO 🚀, AGPL-3.0 license
|
|
2
|
+
|
|
3
|
+
from ultralytics import YOLO
|
|
4
|
+
from ultralytics.cfg import get_cfg
|
|
5
|
+
from ultralytics.engine.exporter import Exporter
|
|
6
|
+
from ultralytics.models.yolo import classify, detect, segment
|
|
7
|
+
from ultralytics.utils import ASSETS, DEFAULT_CFG, WEIGHTS_DIR
|
|
8
|
+
|
|
9
|
+
CFG_DET = "yolov8n.yaml"
|
|
10
|
+
CFG_SEG = "yolov8n-seg.yaml"
|
|
11
|
+
CFG_CLS = "yolov8n-cls.yaml" # or 'squeezenet1_0'
|
|
12
|
+
CFG = get_cfg(DEFAULT_CFG)
|
|
13
|
+
MODEL = WEIGHTS_DIR / "yolov8n"
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def test_func(*args): # noqa
|
|
17
|
+
"""Test function callback."""
|
|
18
|
+
print("callback test passed")
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def test_export():
|
|
22
|
+
"""Test model exporting functionality."""
|
|
23
|
+
exporter = Exporter()
|
|
24
|
+
exporter.add_callback("on_export_start", test_func)
|
|
25
|
+
assert test_func in exporter.callbacks["on_export_start"], "callback test failed"
|
|
26
|
+
f = exporter(model=YOLO(CFG_DET).model)
|
|
27
|
+
YOLO(f)(ASSETS) # exported model inference
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def test_detect():
|
|
31
|
+
"""Test object detection functionality."""
|
|
32
|
+
overrides = {"data": "coco8.yaml", "model": CFG_DET, "imgsz": 32, "epochs": 1, "save": False}
|
|
33
|
+
CFG.data = "coco8.yaml"
|
|
34
|
+
CFG.imgsz = 32
|
|
35
|
+
|
|
36
|
+
# Trainer
|
|
37
|
+
trainer = detect.DetectionTrainer(overrides=overrides)
|
|
38
|
+
trainer.add_callback("on_train_start", test_func)
|
|
39
|
+
assert test_func in trainer.callbacks["on_train_start"], "callback test failed"
|
|
40
|
+
trainer.train()
|
|
41
|
+
|
|
42
|
+
# Validator
|
|
43
|
+
val = detect.DetectionValidator(args=CFG)
|
|
44
|
+
val.add_callback("on_val_start", test_func)
|
|
45
|
+
assert test_func in val.callbacks["on_val_start"], "callback test failed"
|
|
46
|
+
val(model=trainer.best) # validate best.pt
|
|
47
|
+
|
|
48
|
+
# Predictor
|
|
49
|
+
pred = detect.DetectionPredictor(overrides={"imgsz": [64, 64]})
|
|
50
|
+
pred.add_callback("on_predict_start", test_func)
|
|
51
|
+
assert test_func in pred.callbacks["on_predict_start"], "callback test failed"
|
|
52
|
+
result = pred(source=ASSETS, model=f"{MODEL}.pt")
|
|
53
|
+
assert len(result), "predictor test failed"
|
|
54
|
+
|
|
55
|
+
overrides["resume"] = trainer.last
|
|
56
|
+
trainer = detect.DetectionTrainer(overrides=overrides)
|
|
57
|
+
try:
|
|
58
|
+
trainer.train()
|
|
59
|
+
except Exception as e:
|
|
60
|
+
print(f"Expected exception caught: {e}")
|
|
61
|
+
return
|
|
62
|
+
|
|
63
|
+
Exception("Resume test failed!")
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def test_segment():
|
|
67
|
+
"""Test image segmentation functionality."""
|
|
68
|
+
overrides = {"data": "coco8-seg.yaml", "model": CFG_SEG, "imgsz": 32, "epochs": 1, "save": False}
|
|
69
|
+
CFG.data = "coco8-seg.yaml"
|
|
70
|
+
CFG.imgsz = 32
|
|
71
|
+
# YOLO(CFG_SEG).train(**overrides) # works
|
|
72
|
+
|
|
73
|
+
# Trainer
|
|
74
|
+
trainer = segment.SegmentationTrainer(overrides=overrides)
|
|
75
|
+
trainer.add_callback("on_train_start", test_func)
|
|
76
|
+
assert test_func in trainer.callbacks["on_train_start"], "callback test failed"
|
|
77
|
+
trainer.train()
|
|
78
|
+
|
|
79
|
+
# Validator
|
|
80
|
+
val = segment.SegmentationValidator(args=CFG)
|
|
81
|
+
val.add_callback("on_val_start", test_func)
|
|
82
|
+
assert test_func in val.callbacks["on_val_start"], "callback test failed"
|
|
83
|
+
val(model=trainer.best) # validate best.pt
|
|
84
|
+
|
|
85
|
+
# Predictor
|
|
86
|
+
pred = segment.SegmentationPredictor(overrides={"imgsz": [64, 64]})
|
|
87
|
+
pred.add_callback("on_predict_start", test_func)
|
|
88
|
+
assert test_func in pred.callbacks["on_predict_start"], "callback test failed"
|
|
89
|
+
result = pred(source=ASSETS, model=f"{MODEL}-seg.pt")
|
|
90
|
+
assert len(result), "predictor test failed"
|
|
91
|
+
|
|
92
|
+
# Test resume
|
|
93
|
+
overrides["resume"] = trainer.last
|
|
94
|
+
trainer = segment.SegmentationTrainer(overrides=overrides)
|
|
95
|
+
try:
|
|
96
|
+
trainer.train()
|
|
97
|
+
except Exception as e:
|
|
98
|
+
print(f"Expected exception caught: {e}")
|
|
99
|
+
return
|
|
100
|
+
|
|
101
|
+
Exception("Resume test failed!")
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def test_classify():
|
|
105
|
+
"""Test image classification functionality."""
|
|
106
|
+
overrides = {"data": "imagenet10", "model": CFG_CLS, "imgsz": 32, "epochs": 1, "save": False}
|
|
107
|
+
CFG.data = "imagenet10"
|
|
108
|
+
CFG.imgsz = 32
|
|
109
|
+
# YOLO(CFG_SEG).train(**overrides) # works
|
|
110
|
+
|
|
111
|
+
# Trainer
|
|
112
|
+
trainer = classify.ClassificationTrainer(overrides=overrides)
|
|
113
|
+
trainer.add_callback("on_train_start", test_func)
|
|
114
|
+
assert test_func in trainer.callbacks["on_train_start"], "callback test failed"
|
|
115
|
+
trainer.train()
|
|
116
|
+
|
|
117
|
+
# Validator
|
|
118
|
+
val = classify.ClassificationValidator(args=CFG)
|
|
119
|
+
val.add_callback("on_val_start", test_func)
|
|
120
|
+
assert test_func in val.callbacks["on_val_start"], "callback test failed"
|
|
121
|
+
val(model=trainer.best)
|
|
122
|
+
|
|
123
|
+
# Predictor
|
|
124
|
+
pred = classify.ClassificationPredictor(overrides={"imgsz": [64, 64]})
|
|
125
|
+
pred.add_callback("on_predict_start", test_func)
|
|
126
|
+
assert test_func in pred.callbacks["on_predict_start"], "callback test failed"
|
|
127
|
+
result = pred(source=ASSETS, model=trainer.best)
|
|
128
|
+
assert len(result), "predictor test failed"
|
|
@@ -12,7 +12,7 @@ def test_similarity():
|
|
|
12
12
|
exp.create_embeddings_table()
|
|
13
13
|
similar = exp.get_similar(idx=1)
|
|
14
14
|
assert len(similar) == 25
|
|
15
|
-
similar = exp.get_similar(img=ASSETS /
|
|
15
|
+
similar = exp.get_similar(img=ASSETS / "zidane.jpg")
|
|
16
16
|
assert len(similar) == 25
|
|
17
17
|
similar = exp.get_similar(idx=[1, 2], limit=10)
|
|
18
18
|
assert len(similar) == 10
|
|
@@ -24,9 +24,9 @@ def test_similarity():
|
|
|
24
24
|
|
|
25
25
|
def test_det():
|
|
26
26
|
"""Test detection functionalities and ensure the embedding table has bounding boxes."""
|
|
27
|
-
exp = Explorer(data=
|
|
27
|
+
exp = Explorer(data="coco8.yaml", model="yolov8n.pt")
|
|
28
28
|
exp.create_embeddings_table(force=True)
|
|
29
|
-
assert len(exp.table.head()[
|
|
29
|
+
assert len(exp.table.head()["bboxes"]) > 0
|
|
30
30
|
similar = exp.get_similar(idx=[1, 2], limit=10)
|
|
31
31
|
assert len(similar) > 0
|
|
32
32
|
# This is a loose test, just checks errors not correctness
|
|
@@ -36,9 +36,9 @@ def test_det():
|
|
|
36
36
|
|
|
37
37
|
def test_seg():
|
|
38
38
|
"""Test segmentation functionalities and verify the embedding table includes masks."""
|
|
39
|
-
exp = Explorer(data=
|
|
39
|
+
exp = Explorer(data="coco8-seg.yaml", model="yolov8n-seg.pt")
|
|
40
40
|
exp.create_embeddings_table(force=True)
|
|
41
|
-
assert len(exp.table.head()[
|
|
41
|
+
assert len(exp.table.head()["masks"]) > 0
|
|
42
42
|
similar = exp.get_similar(idx=[1, 2], limit=10)
|
|
43
43
|
assert len(similar) > 0
|
|
44
44
|
similar = exp.plot_similar(idx=[1, 2], limit=10)
|
|
@@ -47,9 +47,9 @@ def test_seg():
|
|
|
47
47
|
|
|
48
48
|
def test_pose():
|
|
49
49
|
"""Test pose estimation functionalities and check the embedding table for keypoints."""
|
|
50
|
-
exp = Explorer(data=
|
|
50
|
+
exp = Explorer(data="coco8-pose.yaml", model="yolov8n-pose.pt")
|
|
51
51
|
exp.create_embeddings_table(force=True)
|
|
52
|
-
assert len(exp.table.head()[
|
|
52
|
+
assert len(exp.table.head()["keypoints"]) > 0
|
|
53
53
|
similar = exp.get_similar(idx=[1, 2], limit=10)
|
|
54
54
|
assert len(similar) > 0
|
|
55
55
|
similar = exp.plot_similar(idx=[1, 2], limit=10)
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# Ultralytics YOLO 🚀, AGPL-3.0 license
|
|
2
|
+
|
|
3
|
+
import contextlib
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
|
|
6
|
+
import pytest
|
|
7
|
+
|
|
8
|
+
from ultralytics import YOLO, download
|
|
9
|
+
from ultralytics.utils import ASSETS, DATASETS_DIR, ROOT, SETTINGS, WEIGHTS_DIR
|
|
10
|
+
from ultralytics.utils.checks import check_requirements
|
|
11
|
+
|
|
12
|
+
MODEL = WEIGHTS_DIR / "path with spaces" / "yolov8n.pt" # test spaces in path
|
|
13
|
+
CFG = "yolov8n.yaml"
|
|
14
|
+
SOURCE = ASSETS / "bus.jpg"
|
|
15
|
+
TMP = (ROOT / "../tests/tmp").resolve() # temp directory for test files
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@pytest.mark.skipif(not check_requirements("ray", install=False), reason="ray[tune] not installed")
|
|
19
|
+
def test_model_ray_tune():
|
|
20
|
+
"""Tune YOLO model with Ray optimization library."""
|
|
21
|
+
YOLO("yolov8n-cls.yaml").tune(
|
|
22
|
+
use_ray=True, data="imagenet10", grace_period=1, iterations=1, imgsz=32, epochs=1, plots=False, device="cpu"
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@pytest.mark.skipif(not check_requirements("mlflow", install=False), reason="mlflow not installed")
|
|
27
|
+
def test_mlflow():
|
|
28
|
+
"""Test training with MLflow tracking enabled."""
|
|
29
|
+
SETTINGS["mlflow"] = True
|
|
30
|
+
YOLO("yolov8n-cls.yaml").train(data="imagenet10", imgsz=32, epochs=3, plots=False, device="cpu")
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@pytest.mark.skipif(not check_requirements("tritonclient", install=False), reason="tritonclient[all] not installed")
|
|
34
|
+
def test_triton():
|
|
35
|
+
"""Test NVIDIA Triton Server functionalities."""
|
|
36
|
+
check_requirements("tritonclient[all]")
|
|
37
|
+
import subprocess
|
|
38
|
+
import time
|
|
39
|
+
|
|
40
|
+
from tritonclient.http import InferenceServerClient # noqa
|
|
41
|
+
|
|
42
|
+
# Create variables
|
|
43
|
+
model_name = "yolo"
|
|
44
|
+
triton_repo_path = TMP / "triton_repo"
|
|
45
|
+
triton_model_path = triton_repo_path / model_name
|
|
46
|
+
|
|
47
|
+
# Export model to ONNX
|
|
48
|
+
f = YOLO(MODEL).export(format="onnx", dynamic=True)
|
|
49
|
+
|
|
50
|
+
# Prepare Triton repo
|
|
51
|
+
(triton_model_path / "1").mkdir(parents=True, exist_ok=True)
|
|
52
|
+
Path(f).rename(triton_model_path / "1" / "model.onnx")
|
|
53
|
+
(triton_model_path / "config.pbtxt").touch()
|
|
54
|
+
|
|
55
|
+
# Define image https://catalog.ngc.nvidia.com/orgs/nvidia/containers/tritonserver
|
|
56
|
+
tag = "nvcr.io/nvidia/tritonserver:23.09-py3" # 6.4 GB
|
|
57
|
+
|
|
58
|
+
# Pull the image
|
|
59
|
+
subprocess.call(f"docker pull {tag}", shell=True)
|
|
60
|
+
|
|
61
|
+
# Run the Triton server and capture the container ID
|
|
62
|
+
container_id = (
|
|
63
|
+
subprocess.check_output(
|
|
64
|
+
f"docker run -d --rm -v {triton_repo_path}:/models -p 8000:8000 {tag} tritonserver --model-repository=/models",
|
|
65
|
+
shell=True,
|
|
66
|
+
)
|
|
67
|
+
.decode("utf-8")
|
|
68
|
+
.strip()
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
# Wait for the Triton server to start
|
|
72
|
+
triton_client = InferenceServerClient(url="localhost:8000", verbose=False, ssl=False)
|
|
73
|
+
|
|
74
|
+
# Wait until model is ready
|
|
75
|
+
for _ in range(10):
|
|
76
|
+
with contextlib.suppress(Exception):
|
|
77
|
+
assert triton_client.is_model_ready(model_name)
|
|
78
|
+
break
|
|
79
|
+
time.sleep(1)
|
|
80
|
+
|
|
81
|
+
# Check Triton inference
|
|
82
|
+
YOLO(f"http://localhost:8000/{model_name}", "detect")(SOURCE) # exported model inference
|
|
83
|
+
|
|
84
|
+
# Kill and remove the container at the end of the test
|
|
85
|
+
subprocess.call(f"docker kill {container_id}", shell=True)
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
@pytest.mark.skipif(not check_requirements("pycocotools", install=False), reason="pycocotools not installed")
|
|
89
|
+
def test_pycocotools():
|
|
90
|
+
"""Validate model predictions using pycocotools."""
|
|
91
|
+
from ultralytics.models.yolo.detect import DetectionValidator
|
|
92
|
+
from ultralytics.models.yolo.pose import PoseValidator
|
|
93
|
+
from ultralytics.models.yolo.segment import SegmentationValidator
|
|
94
|
+
|
|
95
|
+
# Download annotations after each dataset downloads first
|
|
96
|
+
url = "https://github.com/ultralytics/assets/releases/download/v8.1.0/"
|
|
97
|
+
|
|
98
|
+
args = {"model": "yolov8n.pt", "data": "coco8.yaml", "save_json": True, "imgsz": 64}
|
|
99
|
+
validator = DetectionValidator(args=args)
|
|
100
|
+
validator()
|
|
101
|
+
validator.is_coco = True
|
|
102
|
+
download(f"{url}instances_val2017.json", dir=DATASETS_DIR / "coco8/annotations")
|
|
103
|
+
_ = validator.eval_json(validator.stats)
|
|
104
|
+
|
|
105
|
+
args = {"model": "yolov8n-seg.pt", "data": "coco8-seg.yaml", "save_json": True, "imgsz": 64}
|
|
106
|
+
validator = SegmentationValidator(args=args)
|
|
107
|
+
validator()
|
|
108
|
+
validator.is_coco = True
|
|
109
|
+
download(f"{url}instances_val2017.json", dir=DATASETS_DIR / "coco8-seg/annotations")
|
|
110
|
+
_ = validator.eval_json(validator.stats)
|
|
111
|
+
|
|
112
|
+
args = {"model": "yolov8n-pose.pt", "data": "coco8-pose.yaml", "save_json": True, "imgsz": 64}
|
|
113
|
+
validator = PoseValidator(args=args)
|
|
114
|
+
validator()
|
|
115
|
+
validator.is_coco = True
|
|
116
|
+
download(f"{url}person_keypoints_val2017.json", dir=DATASETS_DIR / "coco8-pose/annotations")
|
|
117
|
+
_ = validator.eval_json(validator.stats)
|