ultralytics 8.1.14__tar.gz → 8.1.16__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.14/ultralytics.egg-info → ultralytics-8.1.16}/PKG-INFO +7 -7
- {ultralytics-8.1.14 → ultralytics-8.1.16}/pyproject.toml +6 -6
- {ultralytics-8.1.14 → ultralytics-8.1.16}/tests/test_cli.py +4 -4
- {ultralytics-8.1.14 → ultralytics-8.1.16}/tests/test_integrations.py +6 -6
- {ultralytics-8.1.14 → ultralytics-8.1.16}/tests/test_python.py +2 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/__init__.py +1 -1
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/default.yaml +1 -1
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/data/converter.py +2 -2
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/engine/exporter.py +3 -5
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/engine/model.py +83 -33
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/engine/results.py +2 -2
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/engine/trainer.py +1 -1
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/yolo/detect/val.py +2 -4
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/yolo/obb/val.py +5 -4
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/nn/tasks.py +4 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/trackers/utils/gmc.py +10 -10
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/utils/benchmarks.py +6 -5
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/utils/callbacks/wb.py +5 -4
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/utils/checks.py +8 -3
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/utils/downloads.py +1 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/utils/metrics.py +14 -8
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/utils/ops.py +1 -1
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/utils/plotting.py +3 -5
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/utils/torch_utils.py +2 -3
- {ultralytics-8.1.14 → ultralytics-8.1.16/ultralytics.egg-info}/PKG-INFO +7 -7
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics.egg-info/requires.txt +6 -5
- {ultralytics-8.1.14 → ultralytics-8.1.16}/LICENSE +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/README.md +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/setup.cfg +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/tests/test_cuda.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/tests/test_engine.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/tests/test_explorer.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/assets/bus.jpg +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/assets/zidane.jpg +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/__init__.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/datasets/VOC.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/datasets/coco.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/datasets/coco128.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/datasets/coco8.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/datasets/dota8.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/datasets/xView.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/models/v8/yolov8-world-t2i.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/trackers/botsort.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/data/__init__.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/data/annotator.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/data/augment.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/data/base.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/data/build.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/data/dataset.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/data/explorer/__init__.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/data/explorer/explorer.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/data/explorer/gui/__init__.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/data/explorer/gui/dash.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/data/explorer/utils.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/data/loaders.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/data/split_dota.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/data/utils.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/engine/__init__.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/engine/predictor.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/engine/tuner.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/engine/validator.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/hub/__init__.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/hub/auth.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/hub/session.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/hub/utils.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/__init__.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/fastsam/__init__.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/fastsam/model.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/fastsam/predict.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/fastsam/prompt.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/fastsam/utils.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/fastsam/val.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/nas/__init__.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/nas/model.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/nas/predict.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/nas/val.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/rtdetr/__init__.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/rtdetr/model.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/rtdetr/predict.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/rtdetr/train.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/rtdetr/val.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/sam/__init__.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/sam/amg.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/sam/build.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/sam/model.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/sam/modules/__init__.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/sam/modules/decoders.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/sam/modules/encoders.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/sam/modules/sam.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/sam/modules/transformer.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/sam/predict.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/utils/__init__.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/utils/loss.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/utils/ops.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/yolo/__init__.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/yolo/classify/__init__.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/yolo/classify/predict.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/yolo/classify/train.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/yolo/classify/val.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/yolo/detect/__init__.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/yolo/detect/predict.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/yolo/detect/train.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/yolo/model.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/yolo/obb/__init__.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/yolo/obb/predict.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/yolo/obb/train.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/yolo/pose/__init__.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/yolo/pose/predict.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/yolo/pose/train.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/yolo/pose/val.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/yolo/segment/__init__.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/yolo/segment/predict.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/yolo/segment/train.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/models/yolo/segment/val.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/nn/__init__.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/nn/autobackend.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/nn/modules/__init__.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/nn/modules/block.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/nn/modules/conv.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/nn/modules/head.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/nn/modules/transformer.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/nn/modules/utils.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/solutions/__init__.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/solutions/ai_gym.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/solutions/distance_calculation.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/solutions/heatmap.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/solutions/object_counter.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/solutions/speed_estimation.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/trackers/__init__.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/trackers/basetrack.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/trackers/bot_sort.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/trackers/byte_tracker.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/trackers/track.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/trackers/utils/__init__.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/trackers/utils/kalman_filter.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/trackers/utils/matching.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/utils/__init__.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/utils/autobatch.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/utils/callbacks/__init__.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/utils/callbacks/base.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/utils/callbacks/clearml.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/utils/callbacks/comet.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/utils/callbacks/dvc.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/utils/callbacks/hub.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/utils/callbacks/mlflow.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/utils/callbacks/neptune.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/utils/callbacks/raytune.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/utils/callbacks/tensorboard.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/utils/dist.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/utils/errors.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/utils/files.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/utils/instance.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/utils/loss.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/utils/patches.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/utils/tal.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/utils/triton.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics/utils/tuner.py +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics.egg-info/SOURCES.txt +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics.egg-info/dependency_links.txt +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/ultralytics.egg-info/entry_points.txt +0 -0
- {ultralytics-8.1.14 → ultralytics-8.1.16}/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.16
|
|
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
|
|
@@ -19,6 +19,7 @@ Classifier: Programming Language :: Python :: 3.8
|
|
|
19
19
|
Classifier: Programming Language :: Python :: 3.9
|
|
20
20
|
Classifier: Programming Language :: Python :: 3.10
|
|
21
21
|
Classifier: Programming Language :: Python :: 3.11
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
22
23
|
Classifier: Topic :: Software Development
|
|
23
24
|
Classifier: Topic :: Scientific/Engineering
|
|
24
25
|
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
@@ -30,7 +31,6 @@ Requires-Python: >=3.8
|
|
|
30
31
|
Description-Content-Type: text/markdown
|
|
31
32
|
License-File: LICENSE
|
|
32
33
|
Requires-Dist: matplotlib>=3.3.0
|
|
33
|
-
Requires-Dist: numpy>=1.22.2
|
|
34
34
|
Requires-Dist: opencv-python>=4.6.0
|
|
35
35
|
Requires-Dist: pillow>=7.1.2
|
|
36
36
|
Requires-Dist: pyyaml>=5.3.1
|
|
@@ -58,10 +58,10 @@ Requires-Dist: mkdocs-redirects; extra == "dev"
|
|
|
58
58
|
Requires-Dist: mkdocs-ultralytics-plugin>=0.0.43; extra == "dev"
|
|
59
59
|
Provides-Extra: export
|
|
60
60
|
Requires-Dist: onnx>=1.12.0; extra == "export"
|
|
61
|
-
Requires-Dist: coremltools>=7.0; platform_system != "Windows" and extra == "export"
|
|
62
|
-
Requires-Dist: openvino-dev>=2023.0; extra == "export"
|
|
63
|
-
Requires-Dist: tensorflow<=2.13.1; extra == "export"
|
|
64
|
-
Requires-Dist: tensorflowjs>=3.9.0; extra == "export"
|
|
61
|
+
Requires-Dist: coremltools>=7.0; (platform_system != "Windows" and python_version <= "3.11") and extra == "export"
|
|
62
|
+
Requires-Dist: openvino-dev>=2023.0; python_version <= "3.11" and extra == "export"
|
|
63
|
+
Requires-Dist: tensorflow<=2.13.1; python_version <= "3.11" and extra == "export"
|
|
64
|
+
Requires-Dist: tensorflowjs>=3.9.0; python_version <= "3.11" and extra == "export"
|
|
65
65
|
Provides-Extra: explorer
|
|
66
66
|
Requires-Dist: lancedb; extra == "explorer"
|
|
67
67
|
Requires-Dist: duckdb<=0.9.2; extra == "explorer"
|
|
@@ -74,7 +74,7 @@ Provides-Extra: extra
|
|
|
74
74
|
Requires-Dist: hub-sdk>=0.0.2; extra == "extra"
|
|
75
75
|
Requires-Dist: ipython; extra == "extra"
|
|
76
76
|
Requires-Dist: albumentations>=1.0.3; extra == "extra"
|
|
77
|
-
Requires-Dist: pycocotools>=2.0.
|
|
77
|
+
Requires-Dist: pycocotools>=2.0.7; extra == "extra"
|
|
78
78
|
|
|
79
79
|
<div align="center">
|
|
80
80
|
<p>
|
|
@@ -52,6 +52,7 @@ classifiers = [
|
|
|
52
52
|
"Programming Language :: Python :: 3.9",
|
|
53
53
|
"Programming Language :: Python :: 3.10",
|
|
54
54
|
"Programming Language :: Python :: 3.11",
|
|
55
|
+
"Programming Language :: Python :: 3.12",
|
|
55
56
|
"Topic :: Software Development",
|
|
56
57
|
"Topic :: Scientific/Engineering",
|
|
57
58
|
"Topic :: Scientific/Engineering :: Artificial Intelligence",
|
|
@@ -64,7 +65,6 @@ classifiers = [
|
|
|
64
65
|
# Required dependencies ------------------------------------------------------------------------------------------------
|
|
65
66
|
dependencies = [
|
|
66
67
|
"matplotlib>=3.3.0",
|
|
67
|
-
"numpy>=1.22.2",
|
|
68
68
|
"opencv-python>=4.6.0",
|
|
69
69
|
"pillow>=7.1.2",
|
|
70
70
|
"pyyaml>=5.3.1",
|
|
@@ -97,10 +97,10 @@ dev = [
|
|
|
97
97
|
]
|
|
98
98
|
export = [
|
|
99
99
|
"onnx>=1.12.0", # ONNX export
|
|
100
|
-
"coremltools>=7.0; platform_system != 'Windows'", # CoreML
|
|
101
|
-
"openvino-dev>=2023.0", # OpenVINO export
|
|
102
|
-
"tensorflow<=2.13.1", # TF bug https://github.com/ultralytics/ultralytics/issues/5161
|
|
103
|
-
"tensorflowjs>=3.9.0", # TF.js export, automatically installs tensorflow
|
|
100
|
+
"coremltools>=7.0; platform_system != 'Windows' and python_version <= '3.11'", # CoreML supported on macOS and Linux
|
|
101
|
+
"openvino-dev>=2023.0; python_version <= '3.11'", # OpenVINO export
|
|
102
|
+
"tensorflow<=2.13.1; python_version <= '3.11'", # TF bug https://github.com/ultralytics/ultralytics/issues/5161
|
|
103
|
+
"tensorflowjs>=3.9.0; python_version <= '3.11'", # TF.js export, automatically installs tensorflow
|
|
104
104
|
]
|
|
105
105
|
explorer = [
|
|
106
106
|
"lancedb", # vector search
|
|
@@ -120,7 +120,7 @@ extra = [
|
|
|
120
120
|
"hub-sdk>=0.0.2", # Ultralytics HUB
|
|
121
121
|
"ipython", # interactive notebook
|
|
122
122
|
"albumentations>=1.0.3", # training augmentations
|
|
123
|
-
"pycocotools>=2.0.
|
|
123
|
+
"pycocotools>=2.0.7", # COCO mAP
|
|
124
124
|
]
|
|
125
125
|
|
|
126
126
|
[project.urls]
|
|
@@ -4,11 +4,10 @@ import subprocess
|
|
|
4
4
|
|
|
5
5
|
import pytest
|
|
6
6
|
|
|
7
|
-
from ultralytics.utils import ASSETS, WEIGHTS_DIR
|
|
8
|
-
from ultralytics.utils.checks import cuda_device_count, cuda_is_available
|
|
7
|
+
from ultralytics.utils import ASSETS, WEIGHTS_DIR, checks
|
|
9
8
|
|
|
10
|
-
CUDA_IS_AVAILABLE = cuda_is_available()
|
|
11
|
-
CUDA_DEVICE_COUNT = cuda_device_count()
|
|
9
|
+
CUDA_IS_AVAILABLE = checks.cuda_is_available()
|
|
10
|
+
CUDA_DEVICE_COUNT = checks.cuda_device_count()
|
|
12
11
|
TASK_ARGS = [
|
|
13
12
|
("detect", "yolov8n", "coco8.yaml"),
|
|
14
13
|
("segment", "yolov8n-seg", "coco8-seg.yaml"),
|
|
@@ -70,6 +69,7 @@ def test_rtdetr(task="detect", model="yolov8n-rtdetr.yaml", data="coco8.yaml"):
|
|
|
70
69
|
run(f"yolo predict {task} model={model} source={ASSETS / 'bus.jpg'} imgsz=640 save save_crop save_txt")
|
|
71
70
|
|
|
72
71
|
|
|
72
|
+
@pytest.mark.skipif(checks.IS_PYTHON_3_12, reason="MobileSAM Clip is not supported in Python 3.12")
|
|
73
73
|
def test_fastsam(task="segment", model=WEIGHTS_DIR / "FastSAM-s.pt", data="coco8-seg.yaml"):
|
|
74
74
|
"""Test FastSAM segmentation functionality within Ultralytics."""
|
|
75
75
|
source = ASSETS / "bus.jpg"
|
|
@@ -41,16 +41,16 @@ def test_triton():
|
|
|
41
41
|
|
|
42
42
|
# Create variables
|
|
43
43
|
model_name = "yolo"
|
|
44
|
-
|
|
45
|
-
|
|
44
|
+
triton_repo = TMP / "triton_repo" # Triton repo path
|
|
45
|
+
triton_model = triton_repo / model_name # Triton model path
|
|
46
46
|
|
|
47
47
|
# Export model to ONNX
|
|
48
48
|
f = YOLO(MODEL).export(format="onnx", dynamic=True)
|
|
49
49
|
|
|
50
50
|
# Prepare Triton repo
|
|
51
|
-
(
|
|
52
|
-
Path(f).rename(
|
|
53
|
-
(
|
|
51
|
+
(triton_model / "1").mkdir(parents=True, exist_ok=True)
|
|
52
|
+
Path(f).rename(triton_model / "1" / "model.onnx")
|
|
53
|
+
(triton_model / "config.pbtxt").touch()
|
|
54
54
|
|
|
55
55
|
# Define image https://catalog.ngc.nvidia.com/orgs/nvidia/containers/tritonserver
|
|
56
56
|
tag = "nvcr.io/nvidia/tritonserver:23.09-py3" # 6.4 GB
|
|
@@ -61,7 +61,7 @@ def test_triton():
|
|
|
61
61
|
# Run the Triton server and capture the container ID
|
|
62
62
|
container_id = (
|
|
63
63
|
subprocess.check_output(
|
|
64
|
-
f"docker run -d --rm -v {
|
|
64
|
+
f"docker run -d --rm -v {triton_repo}:/models -p 8000:8000 {tag} tritonserver --model-repository=/models",
|
|
65
65
|
shell=True,
|
|
66
66
|
)
|
|
67
67
|
.decode("utf-8")
|
|
@@ -218,12 +218,14 @@ def test_export_onnx():
|
|
|
218
218
|
YOLO(f)(SOURCE) # exported model inference
|
|
219
219
|
|
|
220
220
|
|
|
221
|
+
@pytest.mark.skipif(checks.IS_PYTHON_3_12, reason="OpenVINO not supported in Python 3.12")
|
|
221
222
|
def test_export_openvino():
|
|
222
223
|
"""Test exporting the YOLO model to OpenVINO format."""
|
|
223
224
|
f = YOLO(MODEL).export(format="openvino")
|
|
224
225
|
YOLO(f)(SOURCE) # exported model inference
|
|
225
226
|
|
|
226
227
|
|
|
228
|
+
@pytest.mark.skipif(checks.IS_PYTHON_3_12, reason="CoreML not supported in Python 3.12")
|
|
227
229
|
def test_export_coreml():
|
|
228
230
|
"""Test exporting the YOLO model to CoreML format."""
|
|
229
231
|
if not WINDOWS: # RuntimeError: BlobWriter not loaded with coremltools 7.0 on windows
|
|
@@ -9,7 +9,7 @@ model: # (str, optional) path to model file, i.e. yolov8n.pt, yolov8n.yaml
|
|
|
9
9
|
data: # (str, optional) path to data file, i.e. coco128.yaml
|
|
10
10
|
epochs: 100 # (int) number of epochs to train for
|
|
11
11
|
time: # (float, optional) number of hours to train for, overrides epochs if supplied
|
|
12
|
-
patience:
|
|
12
|
+
patience: 100 # (int) epochs to wait for no observable improvement for early stopping of training
|
|
13
13
|
batch: 16 # (int) number of images per batch (-1 for AutoBatch)
|
|
14
14
|
imgsz: 640 # (int | list) input images size as int for train and val modes, or list[w,h] for predict and export modes
|
|
15
15
|
save: True # (bool) save train checkpoints and predict results
|
|
@@ -418,8 +418,8 @@ def min_index(arr1, arr2):
|
|
|
418
418
|
Find a pair of indexes with the shortest distance between two arrays of 2D points.
|
|
419
419
|
|
|
420
420
|
Args:
|
|
421
|
-
arr1 (np.
|
|
422
|
-
arr2 (np.
|
|
421
|
+
arr1 (np.ndarray): A NumPy array of shape (N, 2) representing N 2D points.
|
|
422
|
+
arr2 (np.ndarray): A NumPy array of shape (M, 2) representing M 2D points.
|
|
423
423
|
|
|
424
424
|
Returns:
|
|
425
425
|
(tuple): A tuple containing the indexes of the points with the shortest distance in arr1 and arr2 respectively.
|
|
@@ -81,7 +81,7 @@ from ultralytics.utils import (
|
|
|
81
81
|
get_default_args,
|
|
82
82
|
yaml_save,
|
|
83
83
|
)
|
|
84
|
-
from ultralytics.utils.checks import check_imgsz, check_is_path_safe, check_requirements, check_version
|
|
84
|
+
from ultralytics.utils.checks import PYTHON_VERSION, check_imgsz, check_is_path_safe, check_requirements, check_version
|
|
85
85
|
from ultralytics.utils.downloads import attempt_download_asset, get_github_assets
|
|
86
86
|
from ultralytics.utils.files import file_size, spaces_in_path
|
|
87
87
|
from ultralytics.utils.ops import Profile
|
|
@@ -455,7 +455,7 @@ class Exporter:
|
|
|
455
455
|
LOGGER.warning(f"{prefix} WARNING ⚠️ >300 images recommended for INT8 calibration, found {n} images.")
|
|
456
456
|
quantization_dataset = nncf.Dataset(dataset, transform_fn)
|
|
457
457
|
ignored_scope = None
|
|
458
|
-
if isinstance(self.model.model[-1],
|
|
458
|
+
if isinstance(self.model.model[-1], Detect):
|
|
459
459
|
# Includes all Detect subclasses like Segment, Pose, OBB, WorldDetect
|
|
460
460
|
head_module_name = ".".join(list(self.model.named_modules())[-1][0].split(".")[:2])
|
|
461
461
|
|
|
@@ -609,10 +609,8 @@ class Exporter:
|
|
|
609
609
|
ct_model = cto.palettize_weights(ct_model, config=config)
|
|
610
610
|
if self.args.nms and self.model.task == "detect":
|
|
611
611
|
if mlmodel:
|
|
612
|
-
import platform
|
|
613
|
-
|
|
614
612
|
# coremltools<=6.2 NMS export requires Python<3.11
|
|
615
|
-
check_version(
|
|
613
|
+
check_version(PYTHON_VERSION, "<3.11", name="Python ", hard=True)
|
|
616
614
|
weights_dir = None
|
|
617
615
|
else:
|
|
618
616
|
ct_model.save(str(f)) # save otherwise weights_dir does not exist
|
|
@@ -5,6 +5,10 @@ import sys
|
|
|
5
5
|
from pathlib import Path
|
|
6
6
|
from typing import Union
|
|
7
7
|
|
|
8
|
+
import PIL
|
|
9
|
+
import numpy as np
|
|
10
|
+
import torch
|
|
11
|
+
|
|
8
12
|
from ultralytics.cfg import TASK2DATA, get_cfg, get_save_dir
|
|
9
13
|
from ultralytics.hub.utils import HUB_WEB_ROOT
|
|
10
14
|
from ultralytics.nn.tasks import attempt_load_one_weight, guess_model_task, nn, yaml_model_load
|
|
@@ -78,7 +82,12 @@ class Model(nn.Module):
|
|
|
78
82
|
NotImplementedError: If a specific model task or mode is not supported.
|
|
79
83
|
"""
|
|
80
84
|
|
|
81
|
-
def __init__(
|
|
85
|
+
def __init__(
|
|
86
|
+
self,
|
|
87
|
+
model: Union[str, Path] = "yolov8n.pt",
|
|
88
|
+
task: str = None,
|
|
89
|
+
verbose: bool = False,
|
|
90
|
+
) -> None:
|
|
82
91
|
"""
|
|
83
92
|
Initializes a new instance of the YOLO model class.
|
|
84
93
|
|
|
@@ -135,7 +144,12 @@ class Model(nn.Module):
|
|
|
135
144
|
|
|
136
145
|
self.model_name = model
|
|
137
146
|
|
|
138
|
-
def __call__(
|
|
147
|
+
def __call__(
|
|
148
|
+
self,
|
|
149
|
+
source: Union[str, Path, int, list, tuple, PIL.Image.Image, np.ndarray, torch.Tensor] = None,
|
|
150
|
+
stream: bool = False,
|
|
151
|
+
**kwargs,
|
|
152
|
+
) -> list:
|
|
139
153
|
"""
|
|
140
154
|
An alias for the predict method, enabling the model instance to be callable.
|
|
141
155
|
|
|
@@ -143,8 +157,9 @@ class Model(nn.Module):
|
|
|
143
157
|
with the required arguments for prediction.
|
|
144
158
|
|
|
145
159
|
Args:
|
|
146
|
-
source (str | int | PIL.Image | np.ndarray, optional): The source of the image for making
|
|
147
|
-
Accepts various types, including file paths, URLs, PIL images, and numpy arrays.
|
|
160
|
+
source (str | Path | int | PIL.Image | np.ndarray, optional): The source of the image for making
|
|
161
|
+
predictions. Accepts various types, including file paths, URLs, PIL images, and numpy arrays.
|
|
162
|
+
Defaults to None.
|
|
148
163
|
stream (bool, optional): If True, treats the input source as a continuous stream for predictions.
|
|
149
164
|
Defaults to False.
|
|
150
165
|
**kwargs (dict): Additional keyword arguments for configuring the prediction process.
|
|
@@ -163,7 +178,7 @@ class Model(nn.Module):
|
|
|
163
178
|
return session if session.client.authenticated else None
|
|
164
179
|
|
|
165
180
|
@staticmethod
|
|
166
|
-
def is_triton_model(model):
|
|
181
|
+
def is_triton_model(model: str) -> bool:
|
|
167
182
|
"""Is model a Triton Server URL string, i.e. <scheme>://<netloc>/<endpoint>/<task_name>"""
|
|
168
183
|
from urllib.parse import urlsplit
|
|
169
184
|
|
|
@@ -171,7 +186,7 @@ class Model(nn.Module):
|
|
|
171
186
|
return url.netloc and url.path and url.scheme in {"http", "grpc"}
|
|
172
187
|
|
|
173
188
|
@staticmethod
|
|
174
|
-
def is_hub_model(model):
|
|
189
|
+
def is_hub_model(model: str) -> bool:
|
|
175
190
|
"""Check if the provided model is a HUB model."""
|
|
176
191
|
return any(
|
|
177
192
|
(
|
|
@@ -181,7 +196,7 @@ class Model(nn.Module):
|
|
|
181
196
|
)
|
|
182
197
|
)
|
|
183
198
|
|
|
184
|
-
def _new(self, cfg: str, task=None, model=None, verbose=False):
|
|
199
|
+
def _new(self, cfg: str, task=None, model=None, verbose=False) -> None:
|
|
185
200
|
"""
|
|
186
201
|
Initializes a new model and infers the task type from the model definitions.
|
|
187
202
|
|
|
@@ -202,7 +217,7 @@ class Model(nn.Module):
|
|
|
202
217
|
self.model.args = {**DEFAULT_CFG_DICT, **self.overrides} # combine default and model args (prefer model args)
|
|
203
218
|
self.model.task = self.task
|
|
204
219
|
|
|
205
|
-
def _load(self, weights: str, task=None):
|
|
220
|
+
def _load(self, weights: str, task=None) -> None:
|
|
206
221
|
"""
|
|
207
222
|
Initializes a new model and infers the task type from the model head.
|
|
208
223
|
|
|
@@ -224,7 +239,7 @@ class Model(nn.Module):
|
|
|
224
239
|
self.overrides["model"] = weights
|
|
225
240
|
self.overrides["task"] = self.task
|
|
226
241
|
|
|
227
|
-
def _check_is_pytorch_model(self):
|
|
242
|
+
def _check_is_pytorch_model(self) -> None:
|
|
228
243
|
"""Raises TypeError is model is not a PyTorch model."""
|
|
229
244
|
pt_str = isinstance(self.model, (str, Path)) and Path(self.model).suffix == ".pt"
|
|
230
245
|
pt_module = isinstance(self.model, nn.Module)
|
|
@@ -237,7 +252,7 @@ class Model(nn.Module):
|
|
|
237
252
|
f"argument directly in your inference command, i.e. 'model.predict(source=..., device=0)'"
|
|
238
253
|
)
|
|
239
254
|
|
|
240
|
-
def reset_weights(self):
|
|
255
|
+
def reset_weights(self) -> "Model":
|
|
241
256
|
"""
|
|
242
257
|
Resets the model parameters to randomly initialized values, effectively discarding all training information.
|
|
243
258
|
|
|
@@ -259,7 +274,7 @@ class Model(nn.Module):
|
|
|
259
274
|
p.requires_grad = True
|
|
260
275
|
return self
|
|
261
276
|
|
|
262
|
-
def load(self, weights="yolov8n.pt"):
|
|
277
|
+
def load(self, weights: Union[str, Path] = "yolov8n.pt") -> "Model":
|
|
263
278
|
"""
|
|
264
279
|
Loads parameters from the specified weights file into the model.
|
|
265
280
|
|
|
@@ -281,24 +296,22 @@ class Model(nn.Module):
|
|
|
281
296
|
self.model.load(weights)
|
|
282
297
|
return self
|
|
283
298
|
|
|
284
|
-
def save(self, filename="
|
|
299
|
+
def save(self, filename: Union[str, Path] = "saved_model.pt") -> None:
|
|
285
300
|
"""
|
|
286
301
|
Saves the current model state to a file.
|
|
287
302
|
|
|
288
303
|
This method exports the model's checkpoint (ckpt) to the specified filename.
|
|
289
304
|
|
|
290
305
|
Args:
|
|
291
|
-
filename (str): The name of the file to save the model to. Defaults to '
|
|
306
|
+
filename (str | Path): The name of the file to save the model to. Defaults to 'saved_model.pt'.
|
|
292
307
|
|
|
293
308
|
Raises:
|
|
294
309
|
AssertionError: If the model is not a PyTorch model.
|
|
295
310
|
"""
|
|
296
311
|
self._check_is_pytorch_model()
|
|
297
|
-
import torch
|
|
298
|
-
|
|
299
312
|
torch.save(self.ckpt, filename)
|
|
300
313
|
|
|
301
|
-
def info(self, detailed=False, verbose=True):
|
|
314
|
+
def info(self, detailed: bool = False, verbose: bool = True):
|
|
302
315
|
"""
|
|
303
316
|
Logs or returns model information.
|
|
304
317
|
|
|
@@ -330,7 +343,12 @@ class Model(nn.Module):
|
|
|
330
343
|
self._check_is_pytorch_model()
|
|
331
344
|
self.model.fuse()
|
|
332
345
|
|
|
333
|
-
def embed(
|
|
346
|
+
def embed(
|
|
347
|
+
self,
|
|
348
|
+
source: Union[str, Path, int, list, tuple, PIL.Image.Image, np.ndarray, torch.Tensor] = None,
|
|
349
|
+
stream: bool = False,
|
|
350
|
+
**kwargs,
|
|
351
|
+
) -> list:
|
|
334
352
|
"""
|
|
335
353
|
Generates image embeddings based on the provided source.
|
|
336
354
|
|
|
@@ -353,7 +371,13 @@ class Model(nn.Module):
|
|
|
353
371
|
kwargs["embed"] = [len(self.model.model) - 2] # embed second-to-last layer if no indices passed
|
|
354
372
|
return self.predict(source, stream, **kwargs)
|
|
355
373
|
|
|
356
|
-
def predict(
|
|
374
|
+
def predict(
|
|
375
|
+
self,
|
|
376
|
+
source: Union[str, Path, int, list, tuple, PIL.Image.Image, np.ndarray, torch.Tensor] = None,
|
|
377
|
+
stream: bool = False,
|
|
378
|
+
predictor=None,
|
|
379
|
+
**kwargs,
|
|
380
|
+
) -> list:
|
|
357
381
|
"""
|
|
358
382
|
Performs predictions on the given image source using the YOLO model.
|
|
359
383
|
|
|
@@ -405,7 +429,13 @@ class Model(nn.Module):
|
|
|
405
429
|
self.predictor.set_prompts(prompts)
|
|
406
430
|
return self.predictor.predict_cli(source=source) if is_cli else self.predictor(source=source, stream=stream)
|
|
407
431
|
|
|
408
|
-
def track(
|
|
432
|
+
def track(
|
|
433
|
+
self,
|
|
434
|
+
source: Union[str, Path, int, list, tuple, PIL.Image.Image, np.ndarray, torch.Tensor] = None,
|
|
435
|
+
stream: bool = False,
|
|
436
|
+
persist: bool = False,
|
|
437
|
+
**kwargs,
|
|
438
|
+
) -> list:
|
|
409
439
|
"""
|
|
410
440
|
Conducts object tracking on the specified input source using the registered trackers.
|
|
411
441
|
|
|
@@ -438,7 +468,11 @@ class Model(nn.Module):
|
|
|
438
468
|
kwargs["mode"] = "track"
|
|
439
469
|
return self.predict(source=source, stream=stream, **kwargs)
|
|
440
470
|
|
|
441
|
-
def val(
|
|
471
|
+
def val(
|
|
472
|
+
self,
|
|
473
|
+
validator=None,
|
|
474
|
+
**kwargs,
|
|
475
|
+
):
|
|
442
476
|
"""
|
|
443
477
|
Validates the model using a specified dataset and validation configuration.
|
|
444
478
|
|
|
@@ -471,7 +505,10 @@ class Model(nn.Module):
|
|
|
471
505
|
self.metrics = validator.metrics
|
|
472
506
|
return validator.metrics
|
|
473
507
|
|
|
474
|
-
def benchmark(
|
|
508
|
+
def benchmark(
|
|
509
|
+
self,
|
|
510
|
+
**kwargs,
|
|
511
|
+
):
|
|
475
512
|
"""
|
|
476
513
|
Benchmarks the model across various export formats to evaluate performance.
|
|
477
514
|
|
|
@@ -509,7 +546,10 @@ class Model(nn.Module):
|
|
|
509
546
|
verbose=kwargs.get("verbose"),
|
|
510
547
|
)
|
|
511
548
|
|
|
512
|
-
def export(
|
|
549
|
+
def export(
|
|
550
|
+
self,
|
|
551
|
+
**kwargs,
|
|
552
|
+
):
|
|
513
553
|
"""
|
|
514
554
|
Exports the model to a different format suitable for deployment.
|
|
515
555
|
|
|
@@ -537,7 +577,11 @@ class Model(nn.Module):
|
|
|
537
577
|
args = {**self.overrides, **custom, **kwargs, "mode": "export"} # highest priority args on the right
|
|
538
578
|
return Exporter(overrides=args, _callbacks=self.callbacks)(model=self.model)
|
|
539
579
|
|
|
540
|
-
def train(
|
|
580
|
+
def train(
|
|
581
|
+
self,
|
|
582
|
+
trainer=None,
|
|
583
|
+
**kwargs,
|
|
584
|
+
):
|
|
541
585
|
"""
|
|
542
586
|
Trains the model using the specified dataset and training configuration.
|
|
543
587
|
|
|
@@ -607,7 +651,13 @@ class Model(nn.Module):
|
|
|
607
651
|
self.metrics = getattr(self.trainer.validator, "metrics", None) # TODO: no metrics returned by DDP
|
|
608
652
|
return self.metrics
|
|
609
653
|
|
|
610
|
-
def tune(
|
|
654
|
+
def tune(
|
|
655
|
+
self,
|
|
656
|
+
use_ray=False,
|
|
657
|
+
iterations=10,
|
|
658
|
+
*args,
|
|
659
|
+
**kwargs,
|
|
660
|
+
):
|
|
611
661
|
"""
|
|
612
662
|
Conducts hyperparameter tuning for the model, with an option to use Ray Tune.
|
|
613
663
|
|
|
@@ -640,7 +690,7 @@ class Model(nn.Module):
|
|
|
640
690
|
args = {**self.overrides, **custom, **kwargs, "mode": "train"} # highest priority args on the right
|
|
641
691
|
return Tuner(args=args, _callbacks=self.callbacks)(model=self, iterations=iterations)
|
|
642
692
|
|
|
643
|
-
def _apply(self, fn):
|
|
693
|
+
def _apply(self, fn) -> "Model":
|
|
644
694
|
"""Apply to(), cpu(), cuda(), half(), float() to model tensors that are not parameters or registered buffers."""
|
|
645
695
|
self._check_is_pytorch_model()
|
|
646
696
|
self = super()._apply(fn) # noqa
|
|
@@ -649,7 +699,7 @@ class Model(nn.Module):
|
|
|
649
699
|
return self
|
|
650
700
|
|
|
651
701
|
@property
|
|
652
|
-
def names(self):
|
|
702
|
+
def names(self) -> list:
|
|
653
703
|
"""
|
|
654
704
|
Retrieves the class names associated with the loaded model.
|
|
655
705
|
|
|
@@ -664,7 +714,7 @@ class Model(nn.Module):
|
|
|
664
714
|
return check_class_names(self.model.names) if hasattr(self.model, "names") else None
|
|
665
715
|
|
|
666
716
|
@property
|
|
667
|
-
def device(self):
|
|
717
|
+
def device(self) -> torch.device:
|
|
668
718
|
"""
|
|
669
719
|
Retrieves the device on which the model's parameters are allocated.
|
|
670
720
|
|
|
@@ -688,7 +738,7 @@ class Model(nn.Module):
|
|
|
688
738
|
"""
|
|
689
739
|
return self.model.transforms if hasattr(self.model, "transforms") else None
|
|
690
740
|
|
|
691
|
-
def add_callback(self, event: str, func):
|
|
741
|
+
def add_callback(self, event: str, func) -> None:
|
|
692
742
|
"""
|
|
693
743
|
Adds a callback function for a specified event.
|
|
694
744
|
|
|
@@ -704,7 +754,7 @@ class Model(nn.Module):
|
|
|
704
754
|
"""
|
|
705
755
|
self.callbacks[event].append(func)
|
|
706
756
|
|
|
707
|
-
def clear_callback(self, event: str):
|
|
757
|
+
def clear_callback(self, event: str) -> None:
|
|
708
758
|
"""
|
|
709
759
|
Clears all callback functions registered for a specified event.
|
|
710
760
|
|
|
@@ -718,7 +768,7 @@ class Model(nn.Module):
|
|
|
718
768
|
"""
|
|
719
769
|
self.callbacks[event] = []
|
|
720
770
|
|
|
721
|
-
def reset_callbacks(self):
|
|
771
|
+
def reset_callbacks(self) -> None:
|
|
722
772
|
"""
|
|
723
773
|
Resets all callbacks to their default functions.
|
|
724
774
|
|
|
@@ -729,7 +779,7 @@ class Model(nn.Module):
|
|
|
729
779
|
self.callbacks[event] = [callbacks.default_callbacks[event][0]]
|
|
730
780
|
|
|
731
781
|
@staticmethod
|
|
732
|
-
def _reset_ckpt_args(args):
|
|
782
|
+
def _reset_ckpt_args(args: dict) -> dict:
|
|
733
783
|
"""Reset arguments when loading a PyTorch model."""
|
|
734
784
|
include = {"imgsz", "data", "task", "single_cls"} # only remember these arguments when loading a PyTorch model
|
|
735
785
|
return {k: v for k, v in args.items() if k in include}
|
|
@@ -739,7 +789,7 @@ class Model(nn.Module):
|
|
|
739
789
|
# name = self.__class__.__name__
|
|
740
790
|
# raise AttributeError(f"'{name}' object has no attribute '{attr}'. See valid attributes below.\n{self.__doc__}")
|
|
741
791
|
|
|
742
|
-
def _smart_load(self, key):
|
|
792
|
+
def _smart_load(self, key: str):
|
|
743
793
|
"""Load model/trainer/validator/predictor."""
|
|
744
794
|
try:
|
|
745
795
|
return self.task_map[self.task][key]
|
|
@@ -751,7 +801,7 @@ class Model(nn.Module):
|
|
|
751
801
|
) from e
|
|
752
802
|
|
|
753
803
|
@property
|
|
754
|
-
def task_map(self):
|
|
804
|
+
def task_map(self) -> dict:
|
|
755
805
|
"""
|
|
756
806
|
Map head to model, trainer, validator, and predictor classes.
|
|
757
807
|
|
|
@@ -710,8 +710,8 @@ class OBB(BaseTensor):
|
|
|
710
710
|
def xyxyxyxyn(self):
|
|
711
711
|
"""Return the boxes in xyxyxyxy format, (N, 4, 2)."""
|
|
712
712
|
xyxyxyxyn = self.xyxyxyxy.clone() if isinstance(self.xyxyxyxy, torch.Tensor) else np.copy(self.xyxyxyxy)
|
|
713
|
-
xyxyxyxyn[..., 0] /= self.orig_shape[
|
|
714
|
-
xyxyxyxyn[..., 1] /= self.orig_shape[
|
|
713
|
+
xyxyxyxyn[..., 0] /= self.orig_shape[1]
|
|
714
|
+
xyxyxyxyn[..., 1] /= self.orig_shape[0]
|
|
715
715
|
return xyxyxyxyn
|
|
716
716
|
|
|
717
717
|
@property
|
|
@@ -285,7 +285,7 @@ class BaseTrainer:
|
|
|
285
285
|
batch_size = self.batch_size // max(world_size, 1)
|
|
286
286
|
self.train_loader = self.get_dataloader(self.trainset, batch_size=batch_size, rank=RANK, mode="train")
|
|
287
287
|
if RANK in (-1, 0):
|
|
288
|
-
#
|
|
288
|
+
# Note: When training DOTA dataset, double batch size could get OOM on images with >2000 objects.
|
|
289
289
|
self.test_loader = self.get_dataloader(
|
|
290
290
|
self.testset, batch_size=batch_size if self.args.task == "obb" else batch_size * 2, rank=-1, mode="val"
|
|
291
291
|
)
|
|
@@ -132,8 +132,7 @@ class DetectionValidator(BaseValidator):
|
|
|
132
132
|
if nl:
|
|
133
133
|
for k in self.stats.keys():
|
|
134
134
|
self.stats[k].append(stat[k])
|
|
135
|
-
|
|
136
|
-
if self.args.plots and self.args.task != "obb":
|
|
135
|
+
if self.args.plots:
|
|
137
136
|
self.confusion_matrix.process_batch(detections=None, gt_bboxes=bbox, gt_cls=cls)
|
|
138
137
|
continue
|
|
139
138
|
|
|
@@ -147,8 +146,7 @@ class DetectionValidator(BaseValidator):
|
|
|
147
146
|
# Evaluate
|
|
148
147
|
if nl:
|
|
149
148
|
stat["tp"] = self._process_batch(predn, bbox, cls)
|
|
150
|
-
|
|
151
|
-
if self.args.plots and self.args.task != "obb":
|
|
149
|
+
if self.args.plots:
|
|
152
150
|
self.confusion_matrix.process_batch(predn, bbox, cls)
|
|
153
151
|
for k in self.stats.keys():
|
|
154
152
|
self.stats[k].append(stat[k])
|
|
@@ -55,10 +55,11 @@ class OBBValidator(DetectionValidator):
|
|
|
55
55
|
Return correct prediction matrix.
|
|
56
56
|
|
|
57
57
|
Args:
|
|
58
|
-
detections (torch.Tensor): Tensor of shape [N,
|
|
59
|
-
Each detection is of the format: x1, y1, x2, y2, conf, class.
|
|
60
|
-
|
|
61
|
-
Each
|
|
58
|
+
detections (torch.Tensor): Tensor of shape [N, 7] representing detections.
|
|
59
|
+
Each detection is of the format: x1, y1, x2, y2, conf, class, angle.
|
|
60
|
+
gt_bboxes (torch.Tensor): Tensor of shape [M, 5] representing rotated boxes.
|
|
61
|
+
Each box is of the format: x1, y1, x2, y2, angle.
|
|
62
|
+
labels (torch.Tensor): Tensor of shape [M] representing labels.
|
|
62
63
|
|
|
63
64
|
Returns:
|
|
64
65
|
(torch.Tensor): Correct prediction matrix of shape [N, 10] for 10 IoU levels.
|
|
@@ -761,6 +761,8 @@ def attempt_load_weights(weights, device=None, inplace=True, fuse=False):
|
|
|
761
761
|
for m in ensemble.modules():
|
|
762
762
|
if hasattr(m, "inplace"):
|
|
763
763
|
m.inplace = inplace
|
|
764
|
+
elif isinstance(m, nn.Upsample) and not hasattr(m, "recompute_scale_factor"):
|
|
765
|
+
m.recompute_scale_factor = None # torch 1.11.0 compatibility
|
|
764
766
|
|
|
765
767
|
# Return model
|
|
766
768
|
if len(ensemble) == 1:
|
|
@@ -794,6 +796,8 @@ def attempt_load_one_weight(weight, device=None, inplace=True, fuse=False):
|
|
|
794
796
|
for m in model.modules():
|
|
795
797
|
if hasattr(m, "inplace"):
|
|
796
798
|
m.inplace = inplace
|
|
799
|
+
elif isinstance(m, nn.Upsample) and not hasattr(m, "recompute_scale_factor"):
|
|
800
|
+
m.recompute_scale_factor = None # torch 1.11.0 compatibility
|
|
797
801
|
|
|
798
802
|
# Return model and ckpt
|
|
799
803
|
return model, ckpt
|