dgenerate-ultralytics-headless 8.3.179__tar.gz → 8.3.181__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.
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/PKG-INFO +1 -1
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/dgenerate_ultralytics_headless.egg-info/PKG-INFO +1 -1
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/__init__.py +1 -1
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/VOC.yaml +1 -1
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/VisDrone.yaml +1 -1
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/data/loaders.py +4 -3
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/data/utils.py +1 -3
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/sam/modules/blocks.py +7 -4
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/sam/modules/decoders.py +1 -1
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/sam/modules/encoders.py +8 -8
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/sam/modules/sam.py +5 -8
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/sam/modules/utils.py +1 -1
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/sam/predict.py +156 -95
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/detect/val.py +17 -9
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/model.py +5 -3
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/obb/val.py +9 -3
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/pose/val.py +13 -6
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/segment/val.py +12 -7
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/yoloe/predict.py +3 -3
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/nn/modules/block.py +1 -3
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/solutions/streamlit_inference.py +10 -3
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/downloads.py +5 -3
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/LICENSE +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/README.md +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/dgenerate_ultralytics_headless.egg-info/SOURCES.txt +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/dgenerate_ultralytics_headless.egg-info/dependency_links.txt +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/dgenerate_ultralytics_headless.egg-info/entry_points.txt +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/dgenerate_ultralytics_headless.egg-info/requires.txt +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/dgenerate_ultralytics_headless.egg-info/top_level.txt +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/pyproject.toml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/setup.cfg +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/tests/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/tests/conftest.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/tests/test_cli.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/tests/test_cuda.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/tests/test_engine.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/tests/test_exports.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/tests/test_integrations.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/tests/test_python.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/tests/test_solutions.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/assets/bus.jpg +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/assets/zidane.jpg +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/HomeObjects-3K.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/coco.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/coco128.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/coco8-grayscale.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/coco8-multispectral.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/coco8.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/dog-pose.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/dota8-multispectral.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/dota8.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/hand-keypoints.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/lvis.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/medical-pills.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/signature.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/xView.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/default.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/11/yolo11-cls-resnet18.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/11/yolo11-cls.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/11/yolo11-obb.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/11/yolo11-pose.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/11/yolo11-seg.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/11/yolo11.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/11/yoloe-11-seg.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/11/yoloe-11.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/12/yolo12-cls.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/12/yolo12-obb.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/12/yolo12-pose.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/12/yolo12-seg.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/12/yolo12.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v10/yolov10b.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v10/yolov10l.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v10/yolov10m.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v10/yolov10n.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v10/yolov10s.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v10/yolov10x.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v8/yoloe-v8-seg.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v8/yoloe-v8.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v9/yolov9m.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v9/yolov9s.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v9/yolov9t.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/trackers/botsort.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/data/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/data/annotator.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/data/augment.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/data/base.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/data/build.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/data/converter.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/data/dataset.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/data/scripts/download_weights.sh +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/data/scripts/get_coco.sh +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/data/scripts/get_coco128.sh +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/data/scripts/get_imagenet.sh +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/data/split.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/data/split_dota.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/engine/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/engine/exporter.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/engine/model.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/engine/predictor.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/engine/results.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/engine/trainer.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/engine/tuner.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/engine/validator.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/hub/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/hub/auth.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/hub/google/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/hub/session.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/hub/utils.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/fastsam/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/fastsam/model.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/fastsam/predict.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/fastsam/utils.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/fastsam/val.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/nas/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/nas/model.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/nas/predict.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/nas/val.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/rtdetr/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/rtdetr/model.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/rtdetr/predict.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/rtdetr/train.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/rtdetr/val.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/sam/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/sam/amg.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/sam/build.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/sam/model.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/sam/modules/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/sam/modules/memory_attention.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/sam/modules/transformer.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/utils/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/utils/loss.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/utils/ops.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/classify/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/classify/predict.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/classify/train.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/classify/val.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/detect/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/detect/predict.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/detect/train.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/obb/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/obb/predict.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/obb/train.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/pose/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/pose/predict.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/pose/train.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/segment/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/segment/predict.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/segment/train.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/world/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/world/train.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/world/train_world.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/yoloe/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/yoloe/train.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/yoloe/train_seg.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/yoloe/val.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/nn/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/nn/autobackend.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/nn/modules/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/nn/modules/activation.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/nn/modules/conv.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/nn/modules/head.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/nn/modules/transformer.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/nn/modules/utils.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/nn/tasks.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/nn/text_model.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/solutions/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/solutions/ai_gym.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/solutions/analytics.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/solutions/config.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/solutions/distance_calculation.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/solutions/heatmap.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/solutions/instance_segmentation.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/solutions/object_blurrer.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/solutions/object_counter.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/solutions/object_cropper.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/solutions/parking_management.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/solutions/queue_management.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/solutions/region_counter.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/solutions/security_alarm.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/solutions/similarity_search.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/solutions/solutions.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/solutions/speed_estimation.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/solutions/templates/similarity-search.html +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/solutions/trackzone.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/solutions/vision_eye.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/trackers/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/trackers/basetrack.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/trackers/bot_sort.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/trackers/byte_tracker.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/trackers/track.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/trackers/utils/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/trackers/utils/gmc.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/trackers/utils/kalman_filter.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/trackers/utils/matching.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/autobatch.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/autodevice.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/benchmarks.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/callbacks/__init__.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/callbacks/base.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/callbacks/clearml.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/callbacks/comet.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/callbacks/dvc.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/callbacks/hub.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/callbacks/mlflow.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/callbacks/neptune.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/callbacks/raytune.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/callbacks/tensorboard.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/callbacks/wb.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/checks.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/dist.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/errors.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/export.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/files.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/instance.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/loss.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/metrics.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/ops.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/patches.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/plotting.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/tal.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/torch_utils.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/triton.py +0 -0
- {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/tuner.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: dgenerate-ultralytics-headless
|
3
|
-
Version: 8.3.
|
3
|
+
Version: 8.3.181
|
4
4
|
Summary: Automatically built Ultralytics package with python-opencv-headless dependency instead of python-opencv
|
5
5
|
Author-email: Glenn Jocher <glenn.jocher@ultralytics.com>, Jing Qiu <jing.qiu@ultralytics.com>
|
6
6
|
Maintainer-email: Ultralytics <hello@ultralytics.com>
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: dgenerate-ultralytics-headless
|
3
|
-
Version: 8.3.
|
3
|
+
Version: 8.3.181
|
4
4
|
Summary: Automatically built Ultralytics package with python-opencv-headless dependency instead of python-opencv
|
5
5
|
Author-email: Glenn Jocher <glenn.jocher@ultralytics.com>, Jing Qiu <jing.qiu@ultralytics.com>
|
6
6
|
Maintainer-email: Ultralytics <hello@ultralytics.com>
|
@@ -87,7 +87,7 @@ download: |
|
|
87
87
|
f"{url}VOCtest_06-Nov-2007.zip", # 438MB, 4953 images
|
88
88
|
f"{url}VOCtrainval_11-May-2012.zip", # 1.95GB, 17126 images
|
89
89
|
]
|
90
|
-
download(urls, dir=dir / "images",
|
90
|
+
download(urls, dir=dir / "images", threads=3, exist_ok=True) # download and unzip over existing (required)
|
91
91
|
|
92
92
|
# Convert
|
93
93
|
path = dir / "images/VOCdevkit"
|
@@ -78,7 +78,7 @@ download: |
|
|
78
78
|
"https://github.com/ultralytics/assets/releases/download/v0.0.0/VisDrone2019-DET-test-dev.zip",
|
79
79
|
# "https://github.com/ultralytics/assets/releases/download/v0.0.0/VisDrone2019-DET-test-challenge.zip",
|
80
80
|
]
|
81
|
-
download(urls, dir=dir,
|
81
|
+
download(urls, dir=dir, threads=4)
|
82
82
|
|
83
83
|
# Convert
|
84
84
|
splits = {"VisDrone2019-DET-train": "train", "VisDrone2019-DET-val": "val", "VisDrone2019-DET-test-dev": "test"}
|
@@ -355,9 +355,10 @@ class LoadImagesAndVideos:
|
|
355
355
|
channels (int): Number of image channels (1 for grayscale, 3 for RGB).
|
356
356
|
"""
|
357
357
|
parent = None
|
358
|
-
if isinstance(path, str) and Path(path).suffix
|
359
|
-
parent = Path(path).parent
|
360
|
-
path = Path(path).
|
358
|
+
if isinstance(path, str) and Path(path).suffix in {".txt", ".csv"}: # txt/csv file with source paths
|
359
|
+
parent, content = Path(path).parent, Path(path).read_text()
|
360
|
+
path = content.splitlines() if Path(path).suffix == ".txt" else content.split(",") # list of sources
|
361
|
+
path = [p.strip() for p in path]
|
361
362
|
files = []
|
362
363
|
for p in sorted(path) if isinstance(path, (list, tuple)) else [path]:
|
363
364
|
a = str(Path(p).absolute()) # do not use .resolve() https://github.com/ultralytics/ultralytics/issues/2912
|
@@ -219,9 +219,7 @@ def verify_image_label(args: Tuple) -> List:
|
|
219
219
|
assert lb.min() >= -0.01, f"negative class labels {lb[lb < -0.01]}"
|
220
220
|
|
221
221
|
# All labels
|
222
|
-
if single_cls
|
223
|
-
lb[:, 0] = 0
|
224
|
-
max_cls = lb[:, 0].max() # max label count
|
222
|
+
max_cls = 0 if single_cls else lb[:, 0].max() # max label count
|
225
223
|
assert max_cls < num_cls, (
|
226
224
|
f"Label class {int(max_cls)} exceeds dataset class count {num_cls}. "
|
227
225
|
f"Possible class labels are 0-{num_cls - 1}"
|
@@ -3,7 +3,7 @@
|
|
3
3
|
import copy
|
4
4
|
import math
|
5
5
|
from functools import partial
|
6
|
-
from typing import
|
6
|
+
from typing import Optional, Tuple, Type, Union
|
7
7
|
|
8
8
|
import numpy as np
|
9
9
|
import torch
|
@@ -856,8 +856,11 @@ class PositionEmbeddingRandom(nn.Module):
|
|
856
856
|
def forward(self, size: Tuple[int, int]) -> torch.Tensor:
|
857
857
|
"""Generate positional encoding for a grid using random spatial frequencies."""
|
858
858
|
h, w = size
|
859
|
-
|
860
|
-
|
859
|
+
grid = torch.ones(
|
860
|
+
(h, w),
|
861
|
+
device=self.positional_encoding_gaussian_matrix.device,
|
862
|
+
dtype=self.positional_encoding_gaussian_matrix.dtype,
|
863
|
+
)
|
861
864
|
y_embed = grid.cumsum(dim=0) - 0.5
|
862
865
|
x_embed = grid.cumsum(dim=1) - 0.5
|
863
866
|
y_embed = y_embed / h
|
@@ -871,7 +874,7 @@ class PositionEmbeddingRandom(nn.Module):
|
|
871
874
|
coords = coords_input.clone()
|
872
875
|
coords[:, :, 0] = coords[:, :, 0] / image_size[1]
|
873
876
|
coords[:, :, 1] = coords[:, :, 1] / image_size[0]
|
874
|
-
return self._pe_encoding(coords
|
877
|
+
return self._pe_encoding(coords) # B x N x C
|
875
878
|
|
876
879
|
|
877
880
|
class Block(nn.Module):
|
@@ -423,7 +423,7 @@ class SAM2MaskDecoder(nn.Module):
|
|
423
423
|
|
424
424
|
# Upscale mask embeddings and predict masks using the mask tokens
|
425
425
|
src = src.transpose(1, 2).view(b, c, h, w)
|
426
|
-
if not self.use_high_res_features:
|
426
|
+
if not self.use_high_res_features or high_res_features is None:
|
427
427
|
upscaled_embedding = self.output_upscaling(src)
|
428
428
|
else:
|
429
429
|
dc1, ln1, act1, dc2, act2 = self.output_upscaling
|
@@ -258,8 +258,8 @@ class PromptEncoder(nn.Module):
|
|
258
258
|
"""Embed point prompts by applying positional encoding and label-specific embeddings."""
|
259
259
|
points = points + 0.5 # Shift to center of pixel
|
260
260
|
if pad:
|
261
|
-
padding_point = torch.zeros((points.shape[0], 1, 2), device=points.device)
|
262
|
-
padding_label = -torch.ones((labels.shape[0], 1), device=labels.device)
|
261
|
+
padding_point = torch.zeros((points.shape[0], 1, 2), dtype=points.dtype, device=points.device)
|
262
|
+
padding_label = -torch.ones((labels.shape[0], 1), dtype=labels.dtype, device=labels.device)
|
263
263
|
points = torch.cat([points, padding_point], dim=1)
|
264
264
|
labels = torch.cat([labels, padding_label], dim=1)
|
265
265
|
point_embedding = self.pe_layer.forward_with_coords(points, self.input_image_size)
|
@@ -300,10 +300,6 @@ class PromptEncoder(nn.Module):
|
|
300
300
|
else:
|
301
301
|
return 1
|
302
302
|
|
303
|
-
def _get_device(self) -> torch.device:
|
304
|
-
"""Return the device of the first point embedding's weight tensor."""
|
305
|
-
return self.point_embeddings[0].weight.device
|
306
|
-
|
307
303
|
def forward(
|
308
304
|
self,
|
309
305
|
points: Optional[Tuple[torch.Tensor, torch.Tensor]],
|
@@ -334,7 +330,11 @@ class PromptEncoder(nn.Module):
|
|
334
330
|
torch.Size([1, 7, 256]) torch.Size([1, 256, 64, 64])
|
335
331
|
"""
|
336
332
|
bs = self._get_batch_size(points, boxes, masks)
|
337
|
-
sparse_embeddings = torch.empty(
|
333
|
+
sparse_embeddings = torch.empty(
|
334
|
+
(bs, 0, self.embed_dim),
|
335
|
+
dtype=self.point_embeddings[0].weight.dtype,
|
336
|
+
device=self.point_embeddings[0].weight.device,
|
337
|
+
)
|
338
338
|
if points is not None:
|
339
339
|
coords, labels = points
|
340
340
|
point_embeddings = self._embed_points(coords, labels, pad=(boxes is None))
|
@@ -637,7 +637,7 @@ class FpnNeck(nn.Module):
|
|
637
637
|
lateral_features = self.convs[n - i](x)
|
638
638
|
if i in self.fpn_top_down_levels and prev_features is not None:
|
639
639
|
top_down_features = F.interpolate(
|
640
|
-
prev_features.to(dtype=
|
640
|
+
prev_features.to(dtype=x.dtype),
|
641
641
|
scale_factor=2.0,
|
642
642
|
mode=self.fpn_interp_model,
|
643
643
|
align_corners=(None if self.fpn_interp_model == "nearest" else False),
|
@@ -488,7 +488,7 @@ class SAM2Model(torch.nn.Module):
|
|
488
488
|
assert sam_point_coords.size(0) == B and sam_point_labels.size(0) == B
|
489
489
|
else:
|
490
490
|
# If no points are provide, pad with an empty point (with label -1)
|
491
|
-
sam_point_coords = torch.zeros(B, 1, 2, device=device)
|
491
|
+
sam_point_coords = torch.zeros(B, 1, 2, device=device, dtype=backbone_features.dtype)
|
492
492
|
sam_point_labels = -torch.ones(B, 1, dtype=torch.int32, device=device)
|
493
493
|
|
494
494
|
# b) Handle mask prompts
|
@@ -533,7 +533,6 @@ class SAM2Model(torch.nn.Module):
|
|
533
533
|
|
534
534
|
# convert masks from possibly bfloat16 (or float16) to float32
|
535
535
|
# (older PyTorch versions before 2.1 don't support `interpolate` on bf16)
|
536
|
-
low_res_multimasks = low_res_multimasks.float()
|
537
536
|
high_res_multimasks = F.interpolate(
|
538
537
|
low_res_multimasks,
|
539
538
|
size=(self.image_size, self.image_size),
|
@@ -560,12 +559,11 @@ class SAM2Model(torch.nn.Module):
|
|
560
559
|
if self.soft_no_obj_ptr:
|
561
560
|
lambda_is_obj_appearing = object_score_logits.sigmoid()
|
562
561
|
else:
|
563
|
-
lambda_is_obj_appearing = is_obj_appearing.
|
562
|
+
lambda_is_obj_appearing = is_obj_appearing.to(obj_ptr.dtype)
|
564
563
|
|
565
564
|
if self.fixed_no_obj_ptr:
|
566
565
|
obj_ptr = lambda_is_obj_appearing * obj_ptr
|
567
566
|
obj_ptr = obj_ptr + (1 - lambda_is_obj_appearing) * self.no_obj_ptr
|
568
|
-
|
569
567
|
return (
|
570
568
|
low_res_multimasks,
|
571
569
|
high_res_multimasks,
|
@@ -769,7 +767,7 @@ class SAM2Model(torch.nn.Module):
|
|
769
767
|
if self.add_tpos_enc_to_obj_ptrs:
|
770
768
|
t_diff_max = max_obj_ptrs_in_encoder - 1
|
771
769
|
tpos_dim = C if self.proj_tpos_enc_in_obj_ptrs else self.mem_dim
|
772
|
-
obj_pos = torch.tensor(pos_list, device=device)
|
770
|
+
obj_pos = torch.tensor(pos_list, device=device, dtype=current_vision_feats[-1].dtype)
|
773
771
|
obj_pos = get_1d_sine_pe(obj_pos / t_diff_max, dim=tpos_dim)
|
774
772
|
obj_pos = self.obj_ptr_tpos_proj(obj_pos)
|
775
773
|
obj_pos = obj_pos.unsqueeze(1).expand(-1, B, self.mem_dim)
|
@@ -834,7 +832,7 @@ class SAM2Model(torch.nn.Module):
|
|
834
832
|
# scale the raw mask logits with a temperature before applying sigmoid
|
835
833
|
binarize = self.binarize_mask_from_pts_for_mem_enc and is_mask_from_pts
|
836
834
|
if binarize and not self.training:
|
837
|
-
mask_for_mem = (pred_masks_high_res > 0).
|
835
|
+
mask_for_mem = (pred_masks_high_res > 0).to(pix_feat.dtype)
|
838
836
|
else:
|
839
837
|
# apply sigmoid on the raw mask logits to turn them into range (0, 1)
|
840
838
|
mask_for_mem = torch.sigmoid(pred_masks_high_res)
|
@@ -927,11 +925,10 @@ class SAM2Model(torch.nn.Module):
|
|
927
925
|
):
|
928
926
|
"""Run memory encoder on predicted mask to encode it into a new memory feature for future frames."""
|
929
927
|
if run_mem_encoder and self.num_maskmem > 0:
|
930
|
-
high_res_masks_for_mem_enc = high_res_masks
|
931
928
|
maskmem_features, maskmem_pos_enc = self._encode_new_memory(
|
932
929
|
current_vision_feats=current_vision_feats,
|
933
930
|
feat_sizes=feat_sizes,
|
934
|
-
pred_masks_high_res=
|
931
|
+
pred_masks_high_res=high_res_masks,
|
935
932
|
object_score_logits=object_score_logits,
|
936
933
|
is_mask_from_pts=(point_inputs is not None),
|
937
934
|
)
|
@@ -78,7 +78,7 @@ def get_1d_sine_pe(pos_inds: torch.Tensor, dim: int, temperature: float = 10000)
|
|
78
78
|
torch.Size([4, 128])
|
79
79
|
"""
|
80
80
|
pe_dim = dim // 2
|
81
|
-
dim_t = torch.arange(pe_dim, dtype=
|
81
|
+
dim_t = torch.arange(pe_dim, dtype=pos_inds.dtype, device=pos_inds.device)
|
82
82
|
dim_t = temperature ** (2 * (dim_t // 2) / pe_dim)
|
83
83
|
|
84
84
|
pos_embed = pos_inds.unsqueeze(-1) / dim_t
|
@@ -132,9 +132,9 @@ class Predictor(BasePredictor):
|
|
132
132
|
im = torch.from_numpy(im)
|
133
133
|
|
134
134
|
im = im.to(self.device)
|
135
|
-
im = im.half() if self.model.fp16 else im.float()
|
136
135
|
if not_tensor:
|
137
136
|
im = (im - self.mean) / self.std
|
137
|
+
im = im.half() if self.model.fp16 else im.float()
|
138
138
|
return im
|
139
139
|
|
140
140
|
def pre_transform(self, im):
|
@@ -182,9 +182,8 @@ class Predictor(BasePredictor):
|
|
182
182
|
**kwargs (Any): Additional keyword arguments.
|
183
183
|
|
184
184
|
Returns:
|
185
|
-
pred_masks (
|
186
|
-
pred_scores (
|
187
|
-
pred_logits (np.ndarray): Low-resolution logits of shape (C, H, W) for subsequent inference, where H=W=256.
|
185
|
+
pred_masks (torch.Tensor): The output masks in shape (C, H, W), where C is the number of generated masks.
|
186
|
+
pred_scores (torch.Tensor): An array of length C containing quality scores predicted by the model for each mask.
|
188
187
|
|
189
188
|
Examples:
|
190
189
|
>>> predictor = Predictor()
|
@@ -219,8 +218,8 @@ class Predictor(BasePredictor):
|
|
219
218
|
multimask_output (bool): Flag to return multiple masks for ambiguous prompts.
|
220
219
|
|
221
220
|
Returns:
|
222
|
-
pred_masks (
|
223
|
-
pred_scores (
|
221
|
+
pred_masks (torch.Tensor): Output masks with shape (C, H, W), where C is the number of generated masks.
|
222
|
+
pred_scores (torch.Tensor): Quality scores predicted by the model for each mask, with length C.
|
224
223
|
|
225
224
|
Examples:
|
226
225
|
>>> predictor = Predictor()
|
@@ -230,7 +229,33 @@ class Predictor(BasePredictor):
|
|
230
229
|
"""
|
231
230
|
features = self.get_im_features(im) if self.features is None else self.features
|
232
231
|
|
233
|
-
|
232
|
+
prompts = self._prepare_prompts(im.shape[2:], self.batch[1][0].shape[:2], bboxes, points, labels, masks)
|
233
|
+
return self._inference_features(features, *prompts, multimask_output)
|
234
|
+
|
235
|
+
def _inference_features(
|
236
|
+
self,
|
237
|
+
features,
|
238
|
+
bboxes=None,
|
239
|
+
points=None,
|
240
|
+
labels=None,
|
241
|
+
masks=None,
|
242
|
+
multimask_output=False,
|
243
|
+
):
|
244
|
+
"""
|
245
|
+
Perform inference on image features using the SAM model.
|
246
|
+
|
247
|
+
Args:
|
248
|
+
features (torch.Tensor): Extracted image features with shape (B, C, H, W) from the SAM model image encoder.
|
249
|
+
bboxes (np.ndarray | List[List[float]] | None): Bounding boxes in XYXY format with shape (N, 4).
|
250
|
+
points (np.ndarray | List[List[float]] | None): Object location points with shape (N, 2), in pixels.
|
251
|
+
labels (np.ndarray | List[int] | None): Point prompt labels with shape (N,). 1 = foreground, 0 = background.
|
252
|
+
masks (List[np.ndarray] | np.ndarray | None): Masks for the objects, where each mask is a 2D array.
|
253
|
+
multimask_output (bool): Flag to return multiple masks for ambiguous prompts.
|
254
|
+
|
255
|
+
Returns:
|
256
|
+
pred_masks (torch.Tensor): Output masks with shape (C, H, W), where C is the number of generated masks.
|
257
|
+
pred_scores (torch.Tensor): Quality scores for each mask, with length C.
|
258
|
+
"""
|
234
259
|
points = (points, labels) if points is not None else None
|
235
260
|
# Embed prompts
|
236
261
|
sparse_embeddings, dense_embeddings = self.model.prompt_encoder(points=points, boxes=bboxes, masks=masks)
|
@@ -248,12 +273,13 @@ class Predictor(BasePredictor):
|
|
248
273
|
# `d` could be 1 or 3 depends on `multimask_output`.
|
249
274
|
return pred_masks.flatten(0, 1), pred_scores.flatten(0, 1)
|
250
275
|
|
251
|
-
def _prepare_prompts(self, dst_shape, bboxes=None, points=None, labels=None, masks=None):
|
276
|
+
def _prepare_prompts(self, dst_shape, src_shape, bboxes=None, points=None, labels=None, masks=None):
|
252
277
|
"""
|
253
278
|
Prepare and transform the input prompts for processing based on the destination shape.
|
254
279
|
|
255
280
|
Args:
|
256
|
-
dst_shape (
|
281
|
+
dst_shape (Tuple[int, int]): The target shape (height, width) for the prompts.
|
282
|
+
src_shape (Tuple[int, int]): The source shape (height, width) of the input image.
|
257
283
|
bboxes (np.ndarray | List | None): Bounding boxes in XYXY format with shape (N, 4).
|
258
284
|
points (np.ndarray | List | None): Points indicating object locations with shape (N, 2) or (N, num_points, 2), in pixels.
|
259
285
|
labels (np.ndarray | List | None): Point prompt labels with shape (N) or (N, num_points). 1 for foreground, 0 for background.
|
@@ -268,11 +294,10 @@ class Predictor(BasePredictor):
|
|
268
294
|
Raises:
|
269
295
|
AssertionError: If the number of points don't match the number of labels, in case labels were passed.
|
270
296
|
"""
|
271
|
-
src_shape = self.batch[1][0].shape[:2]
|
272
297
|
r = 1.0 if self.segment_all else min(dst_shape[0] / src_shape[0], dst_shape[1] / src_shape[1])
|
273
298
|
# Transform input prompts
|
274
299
|
if points is not None:
|
275
|
-
points = torch.as_tensor(points, dtype=
|
300
|
+
points = torch.as_tensor(points, dtype=self.torch_dtype, device=self.device)
|
276
301
|
points = points[None] if points.ndim == 1 else points
|
277
302
|
# Assuming labels are all positive if users don't pass labels.
|
278
303
|
if labels is None:
|
@@ -286,11 +311,11 @@ class Predictor(BasePredictor):
|
|
286
311
|
# (N, 2) --> (N, 1, 2), (N, ) --> (N, 1)
|
287
312
|
points, labels = points[:, None, :], labels[:, None]
|
288
313
|
if bboxes is not None:
|
289
|
-
bboxes = torch.as_tensor(bboxes, dtype=
|
314
|
+
bboxes = torch.as_tensor(bboxes, dtype=self.torch_dtype, device=self.device)
|
290
315
|
bboxes = bboxes[None] if bboxes.ndim == 1 else bboxes
|
291
316
|
bboxes *= r
|
292
317
|
if masks is not None:
|
293
|
-
masks = torch.as_tensor(masks, dtype=
|
318
|
+
masks = torch.as_tensor(masks, dtype=self.torch_dtype, device=self.device).unsqueeze(1)
|
294
319
|
return bboxes, points, labels, masks
|
295
320
|
|
296
321
|
def generate(
|
@@ -424,7 +449,8 @@ class Predictor(BasePredictor):
|
|
424
449
|
if model is None:
|
425
450
|
model = self.get_model()
|
426
451
|
model.eval()
|
427
|
-
|
452
|
+
model = model.to(device)
|
453
|
+
self.model = model.half() if self.args.half else model.float()
|
428
454
|
self.device = device
|
429
455
|
self.mean = torch.tensor([123.675, 116.28, 103.53]).view(-1, 1, 1).to(device)
|
430
456
|
self.std = torch.tensor([58.395, 57.12, 57.375]).view(-1, 1, 1).to(device)
|
@@ -433,8 +459,9 @@ class Predictor(BasePredictor):
|
|
433
459
|
self.model.pt = False
|
434
460
|
self.model.triton = False
|
435
461
|
self.model.stride = 32
|
436
|
-
self.model.fp16 =
|
462
|
+
self.model.fp16 = self.args.half
|
437
463
|
self.done_warmup = True
|
464
|
+
self.torch_dtype = torch.float16 if self.model.fp16 else torch.float32
|
438
465
|
|
439
466
|
def get_model(self):
|
440
467
|
"""Retrieve or build the Segment Anything Model (SAM) for image segmentation tasks."""
|
@@ -543,7 +570,7 @@ class Predictor(BasePredictor):
|
|
543
570
|
- The extracted features are stored in the `self.features` attribute for later use.
|
544
571
|
"""
|
545
572
|
if self.model is None:
|
546
|
-
self.setup_model(
|
573
|
+
self.setup_model()
|
547
574
|
self.setup_source(image)
|
548
575
|
assert len(self.dataset) == 1, "`set_image` only supports setting one image!"
|
549
576
|
for batch in self.dataset:
|
@@ -620,6 +647,53 @@ class Predictor(BasePredictor):
|
|
620
647
|
|
621
648
|
return new_masks[keep].to(device=masks.device, dtype=masks.dtype), keep
|
622
649
|
|
650
|
+
@smart_inference_mode()
|
651
|
+
def inference_features(
|
652
|
+
self,
|
653
|
+
features,
|
654
|
+
src_shape,
|
655
|
+
dst_shape=None,
|
656
|
+
bboxes=None,
|
657
|
+
points=None,
|
658
|
+
labels=None,
|
659
|
+
masks=None,
|
660
|
+
multimask_output=False,
|
661
|
+
):
|
662
|
+
"""
|
663
|
+
Perform prompts preprocessing and inference on provided image features using the SAM model.
|
664
|
+
|
665
|
+
Args:
|
666
|
+
features (torch.Tensor | Dict[str, Any]): Extracted image features from the SAM/SAM2 model image encoder.
|
667
|
+
src_shape (Tuple[int, int]): The source shape (height, width) of the input image.
|
668
|
+
dst_shape (Tuple[int, int] | None): The target shape (height, width) for the prompts. If None, defaults to (imgsz, imgsz).
|
669
|
+
bboxes (np.ndarray | List[List[float]] | None): Bounding boxes in xyxy format with shape (N, 4).
|
670
|
+
points (np.ndarray | List[List[float]] | None): Points indicating object locations with shape (N, 2), in pixels.
|
671
|
+
labels (np.ndarray | List[int] | None): Point prompt labels with shape (N, ).
|
672
|
+
masks (List[np.ndarray] | np.ndarray | None): Masks for the objects, where each mask is a 2D array.
|
673
|
+
multimask_output (bool): Flag to return multiple masks for ambiguous prompts.
|
674
|
+
|
675
|
+
Returns:
|
676
|
+
pred_masks (torch.Tensor): The output masks in shape (C, H, W), where C is the number of generated masks.
|
677
|
+
pred_bboxes (torch.Tensor): Bounding boxes for each mask with shape (N, 6), where N is the number of boxes.
|
678
|
+
Each box is in xyxy format with additional columns for score and class.
|
679
|
+
|
680
|
+
Notes:
|
681
|
+
- The input features is a torch.Tensor of shape (B, C, H, W) if performing on SAM, or a Dict[str, Any] if performing on SAM2.
|
682
|
+
"""
|
683
|
+
dst_shape = dst_shape or (self.args.imgsz, self.args.imgsz)
|
684
|
+
prompts = self._prepare_prompts(dst_shape, src_shape, bboxes, points, labels, masks)
|
685
|
+
pred_masks, pred_scores = self._inference_features(features, *prompts, multimask_output)
|
686
|
+
if len(pred_masks) == 0:
|
687
|
+
pred_masks, pred_bboxes = None, torch.zeros((0, 6), device=pred_masks.device)
|
688
|
+
else:
|
689
|
+
pred_masks = ops.scale_masks(pred_masks[None].float(), src_shape, padding=False)[0]
|
690
|
+
pred_masks = pred_masks > self.model.mask_threshold # to bool
|
691
|
+
pred_bboxes = batched_mask_to_box(pred_masks)
|
692
|
+
# NOTE: SAM models do not return cls info. This `cls` here is just a placeholder for consistency.
|
693
|
+
cls = torch.arange(len(pred_masks), dtype=torch.int32, device=pred_masks.device)
|
694
|
+
pred_bboxes = torch.cat([pred_bboxes, pred_scores[:, None], cls[:, None]], dim=-1)
|
695
|
+
return pred_masks, pred_bboxes
|
696
|
+
|
623
697
|
|
624
698
|
class SAM2Predictor(Predictor):
|
625
699
|
"""
|
@@ -663,80 +737,13 @@ class SAM2Predictor(Predictor):
|
|
663
737
|
|
664
738
|
return build_sam(self.args.model)
|
665
739
|
|
666
|
-
def
|
667
|
-
self,
|
668
|
-
im,
|
669
|
-
bboxes=None,
|
670
|
-
points=None,
|
671
|
-
labels=None,
|
672
|
-
masks=None,
|
673
|
-
multimask_output=False,
|
674
|
-
img_idx=-1,
|
675
|
-
):
|
676
|
-
"""
|
677
|
-
Perform image segmentation inference based on various prompts using SAM2 architecture.
|
678
|
-
|
679
|
-
This method leverages the Segment Anything Model 2 (SAM2) to generate segmentation masks for input images
|
680
|
-
based on provided prompts such as bounding boxes, points, or existing masks. It supports both single and
|
681
|
-
multi-object prediction scenarios.
|
682
|
-
|
683
|
-
Args:
|
684
|
-
im (torch.Tensor): Preprocessed input image tensor with shape (N, C, H, W).
|
685
|
-
bboxes (np.ndarray | List[List[float]] | None): Bounding boxes in XYXY format with shape (N, 4).
|
686
|
-
points (np.ndarray | List[List[float]] | None): Object location points with shape (N, 2), in pixels.
|
687
|
-
labels (np.ndarray | List[int] | None): Point prompt labels with shape (N,). 1 = foreground, 0 = background.
|
688
|
-
masks (np.ndarray | None): Low-resolution masks from previous predictions with shape (N, H, W).
|
689
|
-
multimask_output (bool): Flag to return multiple masks for ambiguous prompts.
|
690
|
-
img_idx (int): Index of the image in the batch to process.
|
691
|
-
|
692
|
-
Returns:
|
693
|
-
pred_masks (np.ndarray): Output masks with shape (C, H, W), where C is the number of generated masks.
|
694
|
-
pred_scores (np.ndarray): Quality scores for each mask, with length C.
|
695
|
-
|
696
|
-
Examples:
|
697
|
-
>>> predictor = SAM2Predictor(cfg)
|
698
|
-
>>> image = torch.rand(1, 3, 640, 640)
|
699
|
-
>>> bboxes = [[100, 100, 200, 200]]
|
700
|
-
>>> result = predictor(image, bboxes=bboxes)[0]
|
701
|
-
>>> print(f"Generated {result.masks.shape[0]} masks with average score {result.boxes.conf.mean():.2f}")
|
702
|
-
|
703
|
-
Notes:
|
704
|
-
- The method supports batched inference for multiple objects when points or bboxes are provided.
|
705
|
-
- Input prompts (bboxes, points) are automatically scaled to match the input image dimensions.
|
706
|
-
- When both bboxes and points are provided, they are merged into a single 'points' input for the model.
|
707
|
-
"""
|
708
|
-
features = self.get_im_features(im) if self.features is None else self.features
|
709
|
-
|
710
|
-
points, labels, masks = self._prepare_prompts(im.shape[2:], bboxes, points, labels, masks)
|
711
|
-
points = (points, labels) if points is not None else None
|
712
|
-
|
713
|
-
sparse_embeddings, dense_embeddings = self.model.sam_prompt_encoder(
|
714
|
-
points=points,
|
715
|
-
boxes=None,
|
716
|
-
masks=masks,
|
717
|
-
)
|
718
|
-
# Predict masks
|
719
|
-
batched_mode = points is not None and points[0].shape[0] > 1 # multi object prediction
|
720
|
-
high_res_features = [feat_level[img_idx].unsqueeze(0) for feat_level in features["high_res_feats"]]
|
721
|
-
pred_masks, pred_scores, _, _ = self.model.sam_mask_decoder(
|
722
|
-
image_embeddings=features["image_embed"][img_idx].unsqueeze(0),
|
723
|
-
image_pe=self.model.sam_prompt_encoder.get_dense_pe(),
|
724
|
-
sparse_prompt_embeddings=sparse_embeddings,
|
725
|
-
dense_prompt_embeddings=dense_embeddings,
|
726
|
-
multimask_output=multimask_output,
|
727
|
-
repeat_image=batched_mode,
|
728
|
-
high_res_features=high_res_features,
|
729
|
-
)
|
730
|
-
# (N, d, H, W) --> (N*d, H, W), (N, d) --> (N*d, )
|
731
|
-
# `d` could be 1 or 3 depends on `multimask_output`.
|
732
|
-
return pred_masks.flatten(0, 1), pred_scores.flatten(0, 1)
|
733
|
-
|
734
|
-
def _prepare_prompts(self, dst_shape, bboxes=None, points=None, labels=None, masks=None):
|
740
|
+
def _prepare_prompts(self, dst_shape, src_shape, bboxes=None, points=None, labels=None, masks=None):
|
735
741
|
"""
|
736
742
|
Prepare and transform the input prompts for processing based on the destination shape.
|
737
743
|
|
738
744
|
Args:
|
739
|
-
dst_shape (
|
745
|
+
dst_shape (Tuple[int, int]): The target shape (height, width) for the prompts.
|
746
|
+
src_shape (Tuple[int, int]): The source shape (height, width) of the input image.
|
740
747
|
bboxes (np.ndarray | List | None): Bounding boxes in XYXY format with shape (N, 4).
|
741
748
|
points (np.ndarray | List | None): Points indicating object locations with shape (N, 2) or (N, num_points, 2), in pixels.
|
742
749
|
labels (np.ndarray | List | None): Point prompt labels with shape (N,) or (N, num_points). 1 for foreground, 0 for background.
|
@@ -750,7 +757,7 @@ class SAM2Predictor(Predictor):
|
|
750
757
|
Raises:
|
751
758
|
AssertionError: If the number of points don't match the number of labels, in case labels were passed.
|
752
759
|
"""
|
753
|
-
bboxes, points, labels, masks = super()._prepare_prompts(dst_shape, bboxes, points, labels, masks)
|
760
|
+
bboxes, points, labels, masks = super()._prepare_prompts(dst_shape, src_shape, bboxes, points, labels, masks)
|
754
761
|
if bboxes is not None:
|
755
762
|
bboxes = bboxes.view(-1, 2, 2)
|
756
763
|
bbox_labels = torch.tensor([[2, 3]], dtype=torch.int32, device=bboxes.device).expand(len(bboxes), -1)
|
@@ -813,6 +820,58 @@ class SAM2Predictor(Predictor):
|
|
813
820
|
][::-1]
|
814
821
|
return {"image_embed": feats[-1], "high_res_feats": feats[:-1]}
|
815
822
|
|
823
|
+
def _inference_features(
|
824
|
+
self,
|
825
|
+
features,
|
826
|
+
points=None,
|
827
|
+
labels=None,
|
828
|
+
masks=None,
|
829
|
+
multimask_output=False,
|
830
|
+
img_idx=-1,
|
831
|
+
):
|
832
|
+
"""
|
833
|
+
Perform inference on image features using the SAM2 model.
|
834
|
+
|
835
|
+
Args:
|
836
|
+
features (torch.Tensor | Dict[str, Any]): Extracted image features with shape (B, C, H, W) from the SAM2 model image encoder, it
|
837
|
+
could also be a dictionary including:
|
838
|
+
- image_embed (torch.Tensor): Image embedding with shape (B, C, H, W).
|
839
|
+
- high_res_feats (List[torch.Tensor]): List of high-resolution feature maps from the backbone, each with shape (B, C, H, W).
|
840
|
+
points (np.ndarray | List[List[float]] | None): Object location points with shape (N, 2), in pixels.
|
841
|
+
labels (np.ndarray | List[int] | None): Point prompt labels with shape (N,). 1 = foreground, 0 = background.
|
842
|
+
masks (List[np.ndarray] | np.ndarray | None): Masks for the objects, where each mask is a 2D array.
|
843
|
+
multimask_output (bool): Flag to return multiple masks for ambiguous prompts.
|
844
|
+
img_idx (int): Index of the image in the batch to process.
|
845
|
+
|
846
|
+
Returns:
|
847
|
+
pred_masks (torch.Tensor): Output masks with shape (C, H, W), where C is the number of generated masks.
|
848
|
+
pred_scores (torch.Tensor): Quality scores for each mask, with length C.
|
849
|
+
"""
|
850
|
+
points = (points, labels) if points is not None else None
|
851
|
+
sparse_embeddings, dense_embeddings = self.model.sam_prompt_encoder(
|
852
|
+
points=points,
|
853
|
+
boxes=None,
|
854
|
+
masks=masks,
|
855
|
+
)
|
856
|
+
# Predict masks
|
857
|
+
batched_mode = points is not None and points[0].shape[0] > 1 # multi object prediction
|
858
|
+
high_res_features = None
|
859
|
+
if isinstance(features, dict):
|
860
|
+
high_res_features = [feat_level[img_idx].unsqueeze(0) for feat_level in features["high_res_feats"]]
|
861
|
+
features = features["image_embed"][[img_idx]]
|
862
|
+
pred_masks, pred_scores, _, _ = self.model.sam_mask_decoder(
|
863
|
+
image_embeddings=features,
|
864
|
+
image_pe=self.model.sam_prompt_encoder.get_dense_pe(),
|
865
|
+
sparse_prompt_embeddings=sparse_embeddings,
|
866
|
+
dense_prompt_embeddings=dense_embeddings,
|
867
|
+
multimask_output=multimask_output,
|
868
|
+
repeat_image=batched_mode,
|
869
|
+
high_res_features=high_res_features,
|
870
|
+
)
|
871
|
+
# (N, d, H, W) --> (N*d, H, W), (N, d) --> (N*d, )
|
872
|
+
# `d` could be 1 or 3 depends on `multimask_output`.
|
873
|
+
return pred_masks.flatten(0, 1), pred_scores.flatten(0, 1)
|
874
|
+
|
816
875
|
|
817
876
|
class SAM2VideoPredictor(SAM2Predictor):
|
818
877
|
"""
|
@@ -900,8 +959,8 @@ class SAM2VideoPredictor(SAM2Predictor):
|
|
900
959
|
masks (np.ndarray, optional): Low-resolution masks from previous predictions shape (N,H,W). For SAM H=W=256.
|
901
960
|
|
902
961
|
Returns:
|
903
|
-
pred_masks (
|
904
|
-
pred_scores (
|
962
|
+
pred_masks (torch.Tensor): The output masks in shape CxHxW, where C is the number of generated masks.
|
963
|
+
pred_scores (torch.Tensor): An array of length C containing quality scores predicted by the model for each mask.
|
905
964
|
"""
|
906
965
|
# Override prompts if any stored in self.prompts
|
907
966
|
bboxes = self.prompts.pop("bboxes", bboxes)
|
@@ -912,7 +971,9 @@ class SAM2VideoPredictor(SAM2Predictor):
|
|
912
971
|
self.inference_state["im"] = im
|
913
972
|
output_dict = self.inference_state["output_dict"]
|
914
973
|
if len(output_dict["cond_frame_outputs"]) == 0: # initialize prompts
|
915
|
-
points, labels, masks = self._prepare_prompts(
|
974
|
+
points, labels, masks = self._prepare_prompts(
|
975
|
+
im.shape[2:], self.batch[1][0].shape[:2], bboxes, points, labels, masks
|
976
|
+
)
|
916
977
|
if points is not None:
|
917
978
|
for i in range(len(points)):
|
918
979
|
self.add_new_prompts(obj_id=i, points=points[[i]], labels=labels[[i]], frame_idx=frame)
|
@@ -966,7 +1027,7 @@ class SAM2VideoPredictor(SAM2Predictor):
|
|
966
1027
|
the masks do not overlap, which can be useful for certain applications.
|
967
1028
|
|
968
1029
|
Args:
|
969
|
-
preds (
|
1030
|
+
preds (Tuple[torch.Tensor, torch.Tensor]): The predicted masks and scores from the model.
|
970
1031
|
img (torch.Tensor): The processed image tensor.
|
971
1032
|
orig_imgs (List[np.ndarray]): The original images before processing.
|
972
1033
|
|
@@ -1441,13 +1502,13 @@ class SAM2VideoPredictor(SAM2Predictor):
|
|
1441
1502
|
"pred_masks": torch.full(
|
1442
1503
|
size=(batch_size, 1, self.imgsz[0] // 4, self.imgsz[1] // 4),
|
1443
1504
|
fill_value=-1024.0,
|
1444
|
-
dtype=
|
1505
|
+
dtype=self.torch_dtype,
|
1445
1506
|
device=self.device,
|
1446
1507
|
),
|
1447
1508
|
"obj_ptr": torch.full(
|
1448
1509
|
size=(batch_size, self.model.hidden_dim),
|
1449
1510
|
fill_value=-1024.0,
|
1450
|
-
dtype=
|
1511
|
+
dtype=self.torch_dtype,
|
1451
1512
|
device=self.device,
|
1452
1513
|
),
|
1453
1514
|
"object_score_logits": torch.full(
|
@@ -1455,7 +1516,7 @@ class SAM2VideoPredictor(SAM2Predictor):
|
|
1455
1516
|
# default to 10.0 for object_score_logits, i.e. assuming the object is
|
1456
1517
|
# present as sigmoid(10)=1, same as in `predict_masks` of `MaskDecoder`
|
1457
1518
|
fill_value=10.0,
|
1458
|
-
dtype=
|
1519
|
+
dtype=self.torch_dtype,
|
1459
1520
|
device=self.device,
|
1460
1521
|
),
|
1461
1522
|
}
|
@@ -1527,7 +1588,7 @@ class SAM2VideoPredictor(SAM2Predictor):
|
|
1527
1588
|
feat_sizes=feat_sizes,
|
1528
1589
|
point_inputs=None,
|
1529
1590
|
# A dummy (empty) mask with a single object
|
1530
|
-
mask_inputs=torch.zeros((1, 1, *self.imgsz), dtype=
|
1591
|
+
mask_inputs=torch.zeros((1, 1, *self.imgsz), dtype=self.torch_dtype, device=self.device),
|
1531
1592
|
output_dict={},
|
1532
1593
|
num_frames=self.inference_state["num_frames"],
|
1533
1594
|
track_in_reverse=False,
|