ultralytics 8.2.26__tar.gz → 8.2.28__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.26 → ultralytics-8.2.28}/PKG-INFO +3 -3
- {ultralytics-8.2.26 → ultralytics-8.2.28}/pyproject.toml +2 -2
- {ultralytics-8.2.26 → ultralytics-8.2.28}/tests/test_cli.py +17 -15
- {ultralytics-8.2.26 → ultralytics-8.2.28}/tests/test_cuda.py +1 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/tests/test_exports.py +5 -2
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/__init__.py +1 -1
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/default.yaml +1 -1
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/engine/exporter.py +13 -11
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/fastsam/prompt.py +2 -6
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/nn/autobackend.py +3 -1
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/nn/modules/__init__.py +1 -1
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/nn/tasks.py +1 -1
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/benchmarks.py +3 -1
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/ops.py +26 -29
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics.egg-info/PKG-INFO +3 -3
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics.egg-info/requires.txt +2 -2
- {ultralytics-8.2.26 → ultralytics-8.2.28}/LICENSE +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/README.md +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/setup.cfg +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/tests/__init__.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/tests/conftest.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/tests/test_engine.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/tests/test_explorer.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/tests/test_integrations.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/tests/test_python.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/assets/bus.jpg +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/assets/zidane.jpg +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/__init__.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/VOC.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/coco.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/coco128.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/coco8.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/dota8.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/lvis.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/signature.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/xView.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/trackers/botsort.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/data/__init__.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/data/annotator.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/data/augment.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/data/base.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/data/build.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/data/converter.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/data/dataset.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/data/explorer/__init__.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/data/explorer/explorer.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/data/explorer/gui/__init__.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/data/explorer/gui/dash.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/data/explorer/utils.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/data/loaders.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/data/split_dota.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/data/utils.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/engine/__init__.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/engine/model.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/engine/predictor.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/engine/results.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/engine/trainer.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/engine/tuner.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/engine/validator.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/hub/__init__.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/hub/auth.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/hub/session.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/hub/utils.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/__init__.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/fastsam/__init__.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/fastsam/model.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/fastsam/predict.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/fastsam/utils.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/fastsam/val.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/nas/__init__.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/nas/model.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/nas/predict.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/nas/val.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/rtdetr/__init__.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/rtdetr/model.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/rtdetr/predict.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/rtdetr/train.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/rtdetr/val.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/sam/__init__.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/sam/amg.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/sam/build.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/sam/model.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/sam/modules/__init__.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/sam/modules/decoders.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/sam/modules/encoders.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/sam/modules/sam.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/sam/modules/transformer.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/sam/predict.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/utils/__init__.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/utils/loss.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/utils/ops.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/__init__.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/classify/__init__.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/classify/predict.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/classify/train.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/classify/val.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/detect/__init__.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/detect/predict.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/detect/train.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/detect/val.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/model.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/obb/__init__.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/obb/predict.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/obb/train.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/obb/val.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/pose/__init__.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/pose/predict.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/pose/train.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/pose/val.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/segment/__init__.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/segment/predict.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/segment/train.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/segment/val.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/world/__init__.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/world/train.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/world/train_world.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/nn/__init__.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/nn/modules/block.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/nn/modules/conv.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/nn/modules/head.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/nn/modules/transformer.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/nn/modules/utils.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/solutions/__init__.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/solutions/ai_gym.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/solutions/analytics.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/solutions/distance_calculation.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/solutions/heatmap.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/solutions/object_counter.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/solutions/parking_management.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/solutions/queue_management.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/solutions/speed_estimation.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/trackers/__init__.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/trackers/basetrack.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/trackers/bot_sort.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/trackers/byte_tracker.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/trackers/track.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/trackers/utils/__init__.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/trackers/utils/gmc.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/trackers/utils/kalman_filter.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/trackers/utils/matching.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/__init__.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/autobatch.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/callbacks/__init__.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/callbacks/base.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/callbacks/clearml.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/callbacks/comet.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/callbacks/dvc.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/callbacks/hub.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/callbacks/mlflow.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/callbacks/neptune.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/callbacks/raytune.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/callbacks/tensorboard.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/callbacks/wb.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/checks.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/dist.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/downloads.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/errors.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/files.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/instance.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/loss.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/metrics.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/patches.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/plotting.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/tal.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/torch_utils.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/triton.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/tuner.py +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics.egg-info/SOURCES.txt +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics.egg-info/dependency_links.txt +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics.egg-info/entry_points.txt +0 -0
- {ultralytics-8.2.26 → ultralytics-8.2.28}/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.28
|
|
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
|
|
@@ -41,9 +41,9 @@ Requires-Dist: torchvision>=0.9.0
|
|
|
41
41
|
Requires-Dist: tqdm>=4.64.0
|
|
42
42
|
Requires-Dist: psutil
|
|
43
43
|
Requires-Dist: py-cpuinfo
|
|
44
|
-
Requires-Dist: thop>=0.1.1
|
|
45
44
|
Requires-Dist: pandas>=1.1.4
|
|
46
45
|
Requires-Dist: seaborn>=0.11.0
|
|
46
|
+
Requires-Dist: ultralytics-thop>=0.2.5
|
|
47
47
|
Provides-Extra: dev
|
|
48
48
|
Requires-Dist: ipython; extra == "dev"
|
|
49
49
|
Requires-Dist: check-manifest; extra == "dev"
|
|
@@ -56,7 +56,7 @@ Requires-Dist: mkdocs-material>=9.5.9; extra == "dev"
|
|
|
56
56
|
Requires-Dist: mkdocstrings[python]; extra == "dev"
|
|
57
57
|
Requires-Dist: mkdocs-jupyter; extra == "dev"
|
|
58
58
|
Requires-Dist: mkdocs-redirects; extra == "dev"
|
|
59
|
-
Requires-Dist: mkdocs-ultralytics-plugin>=0.0.
|
|
59
|
+
Requires-Dist: mkdocs-ultralytics-plugin>=0.0.45; extra == "dev"
|
|
60
60
|
Provides-Extra: export
|
|
61
61
|
Requires-Dist: onnx>=1.12.0; extra == "export"
|
|
62
62
|
Requires-Dist: coremltools>=7.0; (platform_system != "Windows" and python_version <= "3.11") and extra == "export"
|
|
@@ -75,9 +75,9 @@ dependencies = [
|
|
|
75
75
|
"tqdm>=4.64.0", # progress bars
|
|
76
76
|
"psutil", # system utilization
|
|
77
77
|
"py-cpuinfo", # display CPU info
|
|
78
|
-
"thop>=0.1.1", # FLOPs computation
|
|
79
78
|
"pandas>=1.1.4",
|
|
80
79
|
"seaborn>=0.11.0", # plotting
|
|
80
|
+
"ultralytics-thop>=0.2.5", # FLOPs computation https://github.com/ultralytics/thop
|
|
81
81
|
]
|
|
82
82
|
|
|
83
83
|
# Optional dependencies ------------------------------------------------------------------------------------------------
|
|
@@ -94,7 +94,7 @@ dev = [
|
|
|
94
94
|
"mkdocstrings[python]",
|
|
95
95
|
"mkdocs-jupyter", # for notebooks
|
|
96
96
|
"mkdocs-redirects", # for 301 redirects
|
|
97
|
-
"mkdocs-ultralytics-plugin>=0.0.
|
|
97
|
+
"mkdocs-ultralytics-plugin>=0.0.45", # for meta descriptions and images, dates and authors
|
|
98
98
|
]
|
|
99
99
|
export = [
|
|
100
100
|
"onnx>=1.12.0", # ONNX export
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
import subprocess
|
|
4
4
|
|
|
5
5
|
import pytest
|
|
6
|
+
from PIL import Image
|
|
6
7
|
|
|
7
8
|
from tests import CUDA_DEVICE_COUNT, CUDA_IS_AVAILABLE
|
|
8
9
|
from ultralytics.cfg import TASK2DATA, TASK2MODEL, TASKS
|
|
@@ -74,26 +75,27 @@ def test_fastsam(task="segment", model=WEIGHTS_DIR / "FastSAM-s.pt", data="coco8
|
|
|
74
75
|
sam_model = FastSAM(model) # or FastSAM-x.pt
|
|
75
76
|
|
|
76
77
|
# Run inference on an image
|
|
77
|
-
|
|
78
|
+
for s in (source, Image.open(source)):
|
|
79
|
+
everything_results = sam_model(s, device="cpu", retina_masks=True, imgsz=320, conf=0.4, iou=0.9)
|
|
78
80
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
+
# Remove small regions
|
|
82
|
+
new_masks, _ = Predictor.remove_small_regions(everything_results[0].masks.data, min_area=20)
|
|
81
83
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
84
|
+
# Everything prompt
|
|
85
|
+
prompt_process = FastSAMPrompt(s, everything_results, device="cpu")
|
|
86
|
+
ann = prompt_process.everything_prompt()
|
|
85
87
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
+
# Bbox default shape [0,0,0,0] -> [x1,y1,x2,y2]
|
|
89
|
+
ann = prompt_process.box_prompt(bbox=[200, 200, 300, 300])
|
|
88
90
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
+
# Text prompt
|
|
92
|
+
ann = prompt_process.text_prompt(text="a photo of a dog")
|
|
91
93
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
94
|
+
# Point prompt
|
|
95
|
+
# Points default [[0,0]] [[x1,y1],[x2,y2]]
|
|
96
|
+
# Point_label default [0] [1,0] 0:background, 1:foreground
|
|
97
|
+
ann = prompt_process.point_prompt(points=[[200, 200]], pointlabel=[1])
|
|
98
|
+
prompt_process.plot(annotations=ann, output="./")
|
|
97
99
|
|
|
98
100
|
|
|
99
101
|
def test_mobilesam():
|
|
@@ -41,6 +41,7 @@ def test_export_engine_matrix(task, dynamic, int8, half, batch):
|
|
|
41
41
|
batch=batch,
|
|
42
42
|
data=TASK2DATA[task],
|
|
43
43
|
workspace=1, # reduce workspace GB for less resource utilization during testing
|
|
44
|
+
simplify=True, # use 'onnxslim'
|
|
44
45
|
)
|
|
45
46
|
YOLO(file)([SOURCE] * batch, imgsz=64 if dynamic else 32) # exported model inference
|
|
46
47
|
Path(file).unlink() # cleanup
|
|
@@ -72,8 +72,10 @@ def test_export_openvino_matrix(task, dynamic, int8, half, batch):
|
|
|
72
72
|
|
|
73
73
|
|
|
74
74
|
@pytest.mark.slow
|
|
75
|
-
@pytest.mark.parametrize(
|
|
76
|
-
|
|
75
|
+
@pytest.mark.parametrize(
|
|
76
|
+
"task, dynamic, int8, half, batch, simplify", product(TASKS, [True, False], [False], [False], [1, 2], [True, False])
|
|
77
|
+
)
|
|
78
|
+
def test_export_onnx_matrix(task, dynamic, int8, half, batch, simplify):
|
|
77
79
|
"""Test YOLO exports to ONNX format."""
|
|
78
80
|
file = YOLO(TASK2MODEL[task]).export(
|
|
79
81
|
format="onnx",
|
|
@@ -82,6 +84,7 @@ def test_export_onnx_matrix(task, dynamic, int8, half, batch):
|
|
|
82
84
|
int8=int8,
|
|
83
85
|
half=half,
|
|
84
86
|
batch=batch,
|
|
87
|
+
simplify=simplify,
|
|
85
88
|
)
|
|
86
89
|
YOLO(file)([SOURCE] * batch, imgsz=64 if dynamic else 32) # exported model inference
|
|
87
90
|
Path(file).unlink() # cleanup
|
|
@@ -81,7 +81,7 @@ keras: False # (bool) use Kera=s
|
|
|
81
81
|
optimize: False # (bool) TorchScript: optimize for mobile
|
|
82
82
|
int8: False # (bool) CoreML/TF INT8 quantization
|
|
83
83
|
dynamic: False # (bool) ONNX/TF/TensorRT: dynamic axes
|
|
84
|
-
simplify: False # (bool) ONNX: simplify model
|
|
84
|
+
simplify: False # (bool) ONNX: simplify model using `onnxslim`
|
|
85
85
|
opset: # (int, optional) ONNX: opset version
|
|
86
86
|
workspace: 4 # (int) TensorRT: workspace size (GB)
|
|
87
87
|
nms: False # (bool) CoreML: add NMS
|
|
@@ -384,7 +384,7 @@ class Exporter:
|
|
|
384
384
|
"""YOLOv8 ONNX export."""
|
|
385
385
|
requirements = ["onnx>=1.12.0"]
|
|
386
386
|
if self.args.simplify:
|
|
387
|
-
requirements += ["
|
|
387
|
+
requirements += ["onnxslim==0.1.28", "onnxruntime" + ("-gpu" if torch.cuda.is_available() else "")]
|
|
388
388
|
check_requirements(requirements)
|
|
389
389
|
import onnx # noqa
|
|
390
390
|
|
|
@@ -421,14 +421,17 @@ class Exporter:
|
|
|
421
421
|
# Simplify
|
|
422
422
|
if self.args.simplify:
|
|
423
423
|
try:
|
|
424
|
-
import
|
|
424
|
+
import onnxslim
|
|
425
425
|
|
|
426
|
-
LOGGER.info(f"{prefix}
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
426
|
+
LOGGER.info(f"{prefix} slimming with onnxslim {onnxslim.__version__}...")
|
|
427
|
+
model_onnx = onnxslim.slim(model_onnx)
|
|
428
|
+
|
|
429
|
+
# ONNX Simplifier (deprecated as must be compiled with 'cmake' in aarch64 and Conda CI environments)
|
|
430
|
+
# import onnxsim
|
|
431
|
+
# model_onnx, check = onnxsim.simplify(model_onnx)
|
|
432
|
+
# assert check, "Simplified ONNX model could not be validated"
|
|
430
433
|
except Exception as e:
|
|
431
|
-
LOGGER.
|
|
434
|
+
LOGGER.warning(f"{prefix} simplifier failure: {e}")
|
|
432
435
|
|
|
433
436
|
# Metadata
|
|
434
437
|
for k, v in self.metadata.items():
|
|
@@ -672,8 +675,8 @@ class Exporter:
|
|
|
672
675
|
def export_engine(self, prefix=colorstr("TensorRT:")):
|
|
673
676
|
"""YOLOv8 TensorRT export https://developer.nvidia.com/tensorrt."""
|
|
674
677
|
assert self.im.device.type != "cpu", "export running on CPU but must be on GPU, i.e. use 'device=0'"
|
|
675
|
-
self.args.simplify = True
|
|
676
|
-
f_onnx, _ = self.export_onnx() # run before
|
|
678
|
+
# self.args.simplify = True
|
|
679
|
+
f_onnx, _ = self.export_onnx() # run before TRT import https://github.com/ultralytics/ultralytics/issues/7016
|
|
677
680
|
|
|
678
681
|
try:
|
|
679
682
|
import tensorrt as trt # noqa
|
|
@@ -815,13 +818,12 @@ class Exporter:
|
|
|
815
818
|
import tensorflow as tf # noqa
|
|
816
819
|
check_requirements(
|
|
817
820
|
(
|
|
818
|
-
"cmake", # 'cmake' is needed to build onnxsim on aarch64 and Conda runners
|
|
819
821
|
"keras", # required by onnx2tf package
|
|
820
822
|
"tf_keras", # required by onnx2tf package
|
|
821
823
|
"onnx>=1.12.0",
|
|
822
824
|
"onnx2tf>1.17.5,<=1.22.3",
|
|
823
825
|
"sng4onnx>=1.0.1",
|
|
824
|
-
"
|
|
826
|
+
"onnxslim==0.1.28",
|
|
825
827
|
"onnx_graphsurgeon>=0.3.26",
|
|
826
828
|
"tflite_support<=0.4.3" if IS_JETSON else "tflite_support", # fix ImportError 'GLIBCXX_3.4.29'
|
|
827
829
|
"flatbuffers>=23.5.26,<100", # update old 'flatbuffers' included inside tensorflow package
|
|
@@ -24,6 +24,8 @@ class FastSAMPrompt:
|
|
|
24
24
|
|
|
25
25
|
def __init__(self, source, results, device="cuda") -> None:
|
|
26
26
|
"""Initializes FastSAMPrompt with given source, results and device, and assigns clip for linear assignment."""
|
|
27
|
+
if isinstance(source, (str, Path)) and os.path.isdir(source):
|
|
28
|
+
raise ValueError(f"FastSAM only accepts image paths and PIL Image sources, not directories.")
|
|
27
29
|
self.device = device
|
|
28
30
|
self.results = results
|
|
29
31
|
self.source = source
|
|
@@ -261,8 +263,6 @@ class FastSAMPrompt:
|
|
|
261
263
|
|
|
262
264
|
def _crop_image(self, format_results):
|
|
263
265
|
"""Crops an image based on provided annotation format and returns cropped images and related data."""
|
|
264
|
-
if os.path.isdir(self.source):
|
|
265
|
-
raise ValueError(f"'{self.source}' is a directory, not a valid source for this function.")
|
|
266
266
|
image = Image.fromarray(cv2.cvtColor(self.results[0].orig_img, cv2.COLOR_BGR2RGB))
|
|
267
267
|
ori_w, ori_h = image.size
|
|
268
268
|
annotations = format_results
|
|
@@ -287,8 +287,6 @@ class FastSAMPrompt:
|
|
|
287
287
|
"""Modifies the bounding box properties and calculates IoU between masks and bounding box."""
|
|
288
288
|
if self.results[0].masks is not None:
|
|
289
289
|
assert bbox[2] != 0 and bbox[3] != 0
|
|
290
|
-
if os.path.isdir(self.source):
|
|
291
|
-
raise ValueError(f"'{self.source}' is a directory, not a valid source for this function.")
|
|
292
290
|
masks = self.results[0].masks.data
|
|
293
291
|
target_height, target_width = self.results[0].orig_shape
|
|
294
292
|
h = masks.shape[1]
|
|
@@ -321,8 +319,6 @@ class FastSAMPrompt:
|
|
|
321
319
|
def point_prompt(self, points, pointlabel): # numpy
|
|
322
320
|
"""Adjusts points on detected masks based on user input and returns the modified results."""
|
|
323
321
|
if self.results[0].masks is not None:
|
|
324
|
-
if os.path.isdir(self.source):
|
|
325
|
-
raise ValueError(f"'{self.source}' is a directory, not a valid source for this function.")
|
|
326
322
|
masks = self._format_results(self.results[0], 0)
|
|
327
323
|
target_height, target_width = self.results[0].orig_shape
|
|
328
324
|
h = masks[0]["segmentation"].shape[0]
|
|
@@ -184,7 +184,7 @@ class AutoBackend(nn.Module):
|
|
|
184
184
|
LOGGER.info(f"Loading {w} for ONNX Runtime inference...")
|
|
185
185
|
check_requirements(("onnx", "onnxruntime-gpu" if cuda else "onnxruntime"))
|
|
186
186
|
if IS_RASPBERRYPI or IS_JETSON:
|
|
187
|
-
# Fix
|
|
187
|
+
# Fix 'numpy.linalg._umath_linalg' has no attribute '_ilp64' for TF SavedModel on RPi and Jetson
|
|
188
188
|
check_requirements("numpy==1.23.5")
|
|
189
189
|
import onnxruntime
|
|
190
190
|
|
|
@@ -620,6 +620,8 @@ class AutoBackend(nn.Module):
|
|
|
620
620
|
Args:
|
|
621
621
|
imgsz (tuple): The shape of the dummy input tensor in the format (batch_size, channels, height, width)
|
|
622
622
|
"""
|
|
623
|
+
import torchvision # noqa (import here so torchvision import time not recorded in postprocess time)
|
|
624
|
+
|
|
623
625
|
warmup_types = self.pt, self.jit, self.onnx, self.engine, self.saved_model, self.pb, self.triton, self.nn_module
|
|
624
626
|
if any(warmup_types) and (self.device.type != "cpu" or self.triton):
|
|
625
627
|
im = torch.empty(*imgsz, dtype=torch.half if self.fp16 else torch.float, device=self.device) # input
|
|
@@ -157,7 +157,7 @@ class BaseModel(nn.Module):
|
|
|
157
157
|
None
|
|
158
158
|
"""
|
|
159
159
|
c = m == self.model[-1] and isinstance(x, list) # is final layer list, copy input as inplace fix
|
|
160
|
-
flops = thop.profile(m, inputs=[x.copy() if c else x], verbose=False)[0] / 1e9 * 2 if thop else 0 #
|
|
160
|
+
flops = thop.profile(m, inputs=[x.copy() if c else x], verbose=False)[0] / 1e9 * 2 if thop else 0 # GFLOPs
|
|
161
161
|
t = time_sync()
|
|
162
162
|
for _ in range(10):
|
|
163
163
|
m(x.copy() if c else x)
|
|
@@ -457,6 +457,8 @@ class ProfileModels:
|
|
|
457
457
|
|
|
458
458
|
input_tensor = sess.get_inputs()[0]
|
|
459
459
|
input_type = input_tensor.type
|
|
460
|
+
dynamic = not all(isinstance(dim, int) and dim >= 0 for dim in input_tensor.shape) # dynamic input shape
|
|
461
|
+
input_shape = (1, 3, self.imgsz, self.imgsz) if dynamic else input_tensor.shape
|
|
460
462
|
|
|
461
463
|
# Mapping ONNX datatype to numpy datatype
|
|
462
464
|
if "float16" in input_type:
|
|
@@ -472,7 +474,7 @@ class ProfileModels:
|
|
|
472
474
|
else:
|
|
473
475
|
raise ValueError(f"Unsupported ONNX datatype {input_type}")
|
|
474
476
|
|
|
475
|
-
input_data = np.random.rand(*
|
|
477
|
+
input_data = np.random.rand(*input_shape).astype(input_dtype)
|
|
476
478
|
input_name = input_tensor.name
|
|
477
479
|
output_name = sess.get_outputs()[0].name
|
|
478
480
|
|
|
@@ -402,7 +402,7 @@ def xyxy2xywh(x):
|
|
|
402
402
|
def xywh2xyxy(x):
|
|
403
403
|
"""
|
|
404
404
|
Convert bounding box coordinates from (x, y, width, height) format to (x1, y1, x2, y2) format where (x1, y1) is the
|
|
405
|
-
top-left corner and (x2, y2) is the bottom-right corner.
|
|
405
|
+
top-left corner and (x2, y2) is the bottom-right corner. Note: ops per 2 channels faster than per channel.
|
|
406
406
|
|
|
407
407
|
Args:
|
|
408
408
|
x (np.ndarray | torch.Tensor): The input bounding box coordinates in (x, y, width, height) format.
|
|
@@ -412,12 +412,10 @@ def xywh2xyxy(x):
|
|
|
412
412
|
"""
|
|
413
413
|
assert x.shape[-1] == 4, f"input shape last dimension expected 4 but input shape is {x.shape}"
|
|
414
414
|
y = torch.empty_like(x) if isinstance(x, torch.Tensor) else np.empty_like(x) # faster than clone/copy
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
y[...,
|
|
418
|
-
y[...,
|
|
419
|
-
y[..., 2] = x[..., 0] + dw # bottom right x
|
|
420
|
-
y[..., 3] = x[..., 1] + dh # bottom right y
|
|
415
|
+
xy = x[..., :2] # centers
|
|
416
|
+
wh = x[..., 2:] / 2 # half width-height
|
|
417
|
+
y[..., :2] = xy - wh # top left xy
|
|
418
|
+
y[..., 2:] = xy + wh # bottom right xy
|
|
421
419
|
return y
|
|
422
420
|
|
|
423
421
|
|
|
@@ -518,59 +516,58 @@ def ltwh2xywh(x):
|
|
|
518
516
|
return y
|
|
519
517
|
|
|
520
518
|
|
|
521
|
-
def xyxyxyxy2xywhr(
|
|
519
|
+
def xyxyxyxy2xywhr(x):
|
|
522
520
|
"""
|
|
523
521
|
Convert batched Oriented Bounding Boxes (OBB) from [xy1, xy2, xy3, xy4] to [xywh, rotation]. Rotation values are
|
|
524
522
|
expected in degrees from 0 to 90.
|
|
525
523
|
|
|
526
524
|
Args:
|
|
527
|
-
|
|
525
|
+
x (numpy.ndarray | torch.Tensor): Input box corners [xy1, xy2, xy3, xy4] of shape (n, 8).
|
|
528
526
|
|
|
529
527
|
Returns:
|
|
530
528
|
(numpy.ndarray | torch.Tensor): Converted data in [cx, cy, w, h, rotation] format of shape (n, 5).
|
|
531
529
|
"""
|
|
532
|
-
is_torch = isinstance(
|
|
533
|
-
points =
|
|
534
|
-
points = points.reshape(len(
|
|
530
|
+
is_torch = isinstance(x, torch.Tensor)
|
|
531
|
+
points = x.cpu().numpy() if is_torch else x
|
|
532
|
+
points = points.reshape(len(x), -1, 2)
|
|
535
533
|
rboxes = []
|
|
536
534
|
for pts in points:
|
|
537
535
|
# NOTE: Use cv2.minAreaRect to get accurate xywhr,
|
|
538
536
|
# especially some objects are cut off by augmentations in dataloader.
|
|
539
|
-
(
|
|
540
|
-
rboxes.append([
|
|
541
|
-
return (
|
|
542
|
-
torch.tensor(rboxes, device=corners.device, dtype=corners.dtype)
|
|
543
|
-
if is_torch
|
|
544
|
-
else np.asarray(rboxes, dtype=points.dtype)
|
|
545
|
-
) # rboxes
|
|
537
|
+
(cx, cy), (w, h), angle = cv2.minAreaRect(pts)
|
|
538
|
+
rboxes.append([cx, cy, w, h, angle / 180 * np.pi])
|
|
539
|
+
return torch.tensor(rboxes, device=x.device, dtype=x.dtype) if is_torch else np.asarray(rboxes)
|
|
546
540
|
|
|
547
541
|
|
|
548
|
-
def xywhr2xyxyxyxy(
|
|
542
|
+
def xywhr2xyxyxyxy(x):
|
|
549
543
|
"""
|
|
550
544
|
Convert batched Oriented Bounding Boxes (OBB) from [xywh, rotation] to [xy1, xy2, xy3, xy4]. Rotation values should
|
|
551
545
|
be in degrees from 0 to 90.
|
|
552
546
|
|
|
553
547
|
Args:
|
|
554
|
-
|
|
548
|
+
x (numpy.ndarray | torch.Tensor): Boxes in [cx, cy, w, h, rotation] format of shape (n, 5) or (b, n, 5).
|
|
555
549
|
|
|
556
550
|
Returns:
|
|
557
551
|
(numpy.ndarray | torch.Tensor): Converted corner points of shape (n, 4, 2) or (b, n, 4, 2).
|
|
558
552
|
"""
|
|
559
|
-
|
|
560
|
-
|
|
553
|
+
cos, sin, cat, stack = (
|
|
554
|
+
(torch.cos, torch.sin, torch.cat, torch.stack)
|
|
555
|
+
if isinstance(x, torch.Tensor)
|
|
556
|
+
else (np.cos, np.sin, np.concatenate, np.stack)
|
|
557
|
+
)
|
|
561
558
|
|
|
562
|
-
ctr =
|
|
563
|
-
w, h, angle = (
|
|
559
|
+
ctr = x[..., :2]
|
|
560
|
+
w, h, angle = (x[..., i : i + 1] for i in range(2, 5))
|
|
564
561
|
cos_value, sin_value = cos(angle), sin(angle)
|
|
565
562
|
vec1 = [w / 2 * cos_value, w / 2 * sin_value]
|
|
566
563
|
vec2 = [-h / 2 * sin_value, h / 2 * cos_value]
|
|
567
|
-
vec1 =
|
|
568
|
-
vec2 =
|
|
564
|
+
vec1 = cat(vec1, -1)
|
|
565
|
+
vec2 = cat(vec2, -1)
|
|
569
566
|
pt1 = ctr + vec1 + vec2
|
|
570
567
|
pt2 = ctr + vec1 - vec2
|
|
571
568
|
pt3 = ctr - vec1 - vec2
|
|
572
569
|
pt4 = ctr - vec1 + vec2
|
|
573
|
-
return
|
|
570
|
+
return stack([pt1, pt2, pt3, pt4], -2)
|
|
574
571
|
|
|
575
572
|
|
|
576
573
|
def ltwh2xyxy(x):
|
|
@@ -785,7 +782,7 @@ def regularize_rboxes(rboxes):
|
|
|
785
782
|
Regularize rotated boxes in range [0, pi/2].
|
|
786
783
|
|
|
787
784
|
Args:
|
|
788
|
-
rboxes (torch.Tensor): (N, 5)
|
|
785
|
+
rboxes (torch.Tensor): Input boxes of shape(N, 5) in xywhr format.
|
|
789
786
|
|
|
790
787
|
Returns:
|
|
791
788
|
(torch.Tensor): The regularized boxes.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: ultralytics
|
|
3
|
-
Version: 8.2.
|
|
3
|
+
Version: 8.2.28
|
|
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
|
|
@@ -41,9 +41,9 @@ Requires-Dist: torchvision>=0.9.0
|
|
|
41
41
|
Requires-Dist: tqdm>=4.64.0
|
|
42
42
|
Requires-Dist: psutil
|
|
43
43
|
Requires-Dist: py-cpuinfo
|
|
44
|
-
Requires-Dist: thop>=0.1.1
|
|
45
44
|
Requires-Dist: pandas>=1.1.4
|
|
46
45
|
Requires-Dist: seaborn>=0.11.0
|
|
46
|
+
Requires-Dist: ultralytics-thop>=0.2.5
|
|
47
47
|
Provides-Extra: dev
|
|
48
48
|
Requires-Dist: ipython; extra == "dev"
|
|
49
49
|
Requires-Dist: check-manifest; extra == "dev"
|
|
@@ -56,7 +56,7 @@ Requires-Dist: mkdocs-material>=9.5.9; extra == "dev"
|
|
|
56
56
|
Requires-Dist: mkdocstrings[python]; extra == "dev"
|
|
57
57
|
Requires-Dist: mkdocs-jupyter; extra == "dev"
|
|
58
58
|
Requires-Dist: mkdocs-redirects; extra == "dev"
|
|
59
|
-
Requires-Dist: mkdocs-ultralytics-plugin>=0.0.
|
|
59
|
+
Requires-Dist: mkdocs-ultralytics-plugin>=0.0.45; extra == "dev"
|
|
60
60
|
Provides-Extra: export
|
|
61
61
|
Requires-Dist: onnx>=1.12.0; extra == "export"
|
|
62
62
|
Requires-Dist: coremltools>=7.0; (platform_system != "Windows" and python_version <= "3.11") and extra == "export"
|
|
@@ -9,9 +9,9 @@ torchvision>=0.9.0
|
|
|
9
9
|
tqdm>=4.64.0
|
|
10
10
|
psutil
|
|
11
11
|
py-cpuinfo
|
|
12
|
-
thop>=0.1.1
|
|
13
12
|
pandas>=1.1.4
|
|
14
13
|
seaborn>=0.11.0
|
|
14
|
+
ultralytics-thop>=0.2.5
|
|
15
15
|
|
|
16
16
|
[dev]
|
|
17
17
|
ipython
|
|
@@ -25,7 +25,7 @@ mkdocs-material>=9.5.9
|
|
|
25
25
|
mkdocstrings[python]
|
|
26
26
|
mkdocs-jupyter
|
|
27
27
|
mkdocs-redirects
|
|
28
|
-
mkdocs-ultralytics-plugin>=0.0.
|
|
28
|
+
mkdocs-ultralytics-plugin>=0.0.45
|
|
29
29
|
|
|
30
30
|
[explorer]
|
|
31
31
|
lancedb
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml
RENAMED
|
File without changes
|
{ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml
RENAMED
|
File without changes
|
{ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|