ultralytics 8.3.117__tar.gz → 8.3.119__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.
- {ultralytics-8.3.117/ultralytics.egg-info → ultralytics-8.3.119}/PKG-INFO +6 -7
- {ultralytics-8.3.117 → ultralytics-8.3.119}/pyproject.toml +7 -7
- ultralytics-8.3.119/tests/__init__.py +22 -0
- ultralytics-8.3.119/tests/conftest.py +83 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/__init__.py +1 -1
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/__init__.py +1 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/default.yaml +1 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/data/augment.py +122 -7
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/data/base.py +9 -2
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/data/dataset.py +7 -5
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/engine/exporter.py +10 -91
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/engine/tuner.py +2 -1
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/rtdetr/val.py +1 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/detect/predict.py +1 -1
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/model.py +2 -3
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/obb/train.py +1 -1
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/pose/predict.py +1 -1
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/pose/train.py +1 -1
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/pose/val.py +1 -1
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/segment/train.py +3 -3
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/nn/autobackend.py +2 -5
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/nn/text_model.py +97 -13
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/benchmarks.py +1 -1
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/downloads.py +1 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/ops.py +1 -1
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/tuner.py +2 -1
- {ultralytics-8.3.117 → ultralytics-8.3.119/ultralytics.egg-info}/PKG-INFO +6 -7
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics.egg-info/SOURCES.txt +9 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics.egg-info/requires.txt +5 -8
- {ultralytics-8.3.117 → ultralytics-8.3.119}/LICENSE +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/README.md +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/setup.cfg +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/tests/test_cli.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/tests/test_cuda.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/tests/test_engine.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/tests/test_exports.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/tests/test_integrations.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/tests/test_python.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/tests/test_solutions.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/assets/bus.jpg +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/assets/zidane.jpg +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/VOC.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/coco.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/coco128.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/coco8-multispectral.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/coco8.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/dog-pose.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/dota8-multispectral.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/dota8.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/hand-keypoints.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/lvis.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/medical-pills.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/signature.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/xView.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/11/yolo11-cls-resnet18.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/11/yolo11-cls.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/11/yolo11-obb.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/11/yolo11-pose.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/11/yolo11-seg.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/11/yolo11.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/11/yoloe-11-seg.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/11/yoloe-11.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/12/yolo12-cls.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/12/yolo12-obb.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/12/yolo12-pose.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/12/yolo12-seg.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/12/yolo12.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v10/yolov10b.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v10/yolov10l.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v10/yolov10m.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v10/yolov10n.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v10/yolov10s.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v10/yolov10x.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v8/yoloe-v8-seg.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v8/yoloe-v8.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v9/yolov9m.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v9/yolov9s.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v9/yolov9t.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/solutions/default.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/trackers/botsort.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/data/__init__.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/data/annotator.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/data/build.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/data/converter.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/data/loaders.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/data/scripts/download_weights.sh +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/data/scripts/get_coco.sh +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/data/scripts/get_coco128.sh +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/data/scripts/get_imagenet.sh +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/data/split.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/data/split_dota.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/data/utils.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/engine/__init__.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/engine/model.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/engine/predictor.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/engine/results.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/engine/trainer.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/engine/validator.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/hub/__init__.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/hub/auth.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/hub/google/__init__.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/hub/session.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/hub/utils.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/__init__.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/fastsam/__init__.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/fastsam/model.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/fastsam/predict.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/fastsam/utils.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/fastsam/val.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/nas/__init__.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/nas/model.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/nas/predict.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/nas/val.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/rtdetr/__init__.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/rtdetr/model.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/rtdetr/predict.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/rtdetr/train.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/sam/__init__.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/sam/amg.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/sam/build.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/sam/model.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/sam/modules/__init__.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/sam/modules/blocks.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/sam/modules/decoders.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/sam/modules/encoders.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/sam/modules/memory_attention.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/sam/modules/sam.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/sam/modules/transformer.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/sam/modules/utils.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/sam/predict.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/utils/__init__.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/utils/loss.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/utils/ops.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/__init__.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/classify/__init__.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/classify/predict.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/classify/train.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/classify/val.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/detect/__init__.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/detect/train.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/detect/val.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/obb/__init__.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/obb/predict.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/obb/val.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/pose/__init__.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/segment/__init__.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/segment/predict.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/segment/val.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/world/__init__.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/world/train.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/world/train_world.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/yoloe/__init__.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/yoloe/predict.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/yoloe/train.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/yoloe/train_seg.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/yoloe/val.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/nn/__init__.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/nn/modules/__init__.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/nn/modules/activation.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/nn/modules/block.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/nn/modules/conv.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/nn/modules/head.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/nn/modules/transformer.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/nn/modules/utils.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/nn/tasks.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/solutions/__init__.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/solutions/ai_gym.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/solutions/analytics.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/solutions/distance_calculation.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/solutions/heatmap.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/solutions/instance_segmentation.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/solutions/object_blurrer.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/solutions/object_counter.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/solutions/object_cropper.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/solutions/parking_management.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/solutions/queue_management.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/solutions/region_counter.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/solutions/security_alarm.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/solutions/solutions.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/solutions/speed_estimation.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/solutions/streamlit_inference.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/solutions/trackzone.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/solutions/vision_eye.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/trackers/__init__.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/trackers/basetrack.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/trackers/bot_sort.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/trackers/byte_tracker.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/trackers/track.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/trackers/utils/__init__.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/trackers/utils/gmc.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/trackers/utils/kalman_filter.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/trackers/utils/matching.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/__init__.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/autobatch.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/callbacks/__init__.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/callbacks/base.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/callbacks/clearml.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/callbacks/comet.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/callbacks/dvc.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/callbacks/hub.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/callbacks/mlflow.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/callbacks/neptune.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/callbacks/raytune.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/callbacks/tensorboard.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/callbacks/wb.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/checks.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/dist.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/errors.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/export.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/files.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/instance.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/loss.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/metrics.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/patches.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/plotting.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/tal.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/torch_utils.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/triton.py +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics.egg-info/dependency_links.txt +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics.egg-info/entry_points.txt +0 -0
- {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: ultralytics
|
3
|
-
Version: 8.3.
|
3
|
+
Version: 8.3.119
|
4
4
|
Summary: Ultralytics YOLO 🚀 for SOTA object detection, multi-object tracking, instance segmentation, pose estimation and image classification.
|
5
5
|
Author-email: Glenn Jocher <glenn.jocher@ultralytics.com>, Jing Qiu <jing.qiu@ultralytics.com>
|
6
6
|
Maintainer-email: Ultralytics <hello@ultralytics.com>
|
@@ -32,7 +32,7 @@ Classifier: Operating System :: Microsoft :: Windows
|
|
32
32
|
Requires-Python: >=3.8
|
33
33
|
Description-Content-Type: text/markdown
|
34
34
|
License-File: LICENSE
|
35
|
-
Requires-Dist: numpy
|
35
|
+
Requires-Dist: numpy>=1.23.0
|
36
36
|
Requires-Dist: matplotlib>=3.3.0
|
37
37
|
Requires-Dist: opencv-python>=4.6.0
|
38
38
|
Requires-Dist: pillow>=7.1.2
|
@@ -61,20 +61,19 @@ Requires-Dist: mkdocs-macros-plugin>=1.0.5; extra == "dev"
|
|
61
61
|
Provides-Extra: export
|
62
62
|
Requires-Dist: onnx>=1.12.0; extra == "export"
|
63
63
|
Requires-Dist: coremltools>=8.0; (platform_system != "Windows" and python_version <= "3.13") and extra == "export"
|
64
|
-
Requires-Dist: scikit-learn>=1.3.2; (platform_system != "Windows" and python_version <= "3.
|
64
|
+
Requires-Dist: scikit-learn>=1.3.2; (platform_system != "Windows" and python_version <= "3.13") and extra == "export"
|
65
65
|
Requires-Dist: openvino>=2024.0.0; extra == "export"
|
66
66
|
Requires-Dist: tensorflow>=2.0.0; extra == "export"
|
67
67
|
Requires-Dist: tensorflowjs>=2.0.0; extra == "export"
|
68
68
|
Requires-Dist: tensorstore>=0.1.63; (platform_machine == "aarch64" and python_version >= "3.9") and extra == "export"
|
69
|
-
Requires-Dist: keras; extra == "export"
|
70
69
|
Requires-Dist: h5py!=3.11.0; platform_machine == "aarch64" and extra == "export"
|
71
70
|
Provides-Extra: solutions
|
72
71
|
Requires-Dist: shapely<2.1.0,>=2.0.0; extra == "solutions"
|
73
72
|
Requires-Dist: streamlit<1.44.0,>=1.29.0; extra == "solutions"
|
74
73
|
Provides-Extra: logging
|
75
|
-
Requires-Dist:
|
76
|
-
Requires-Dist: tensorboard
|
77
|
-
Requires-Dist:
|
74
|
+
Requires-Dist: wandb; extra == "logging"
|
75
|
+
Requires-Dist: tensorboard; extra == "logging"
|
76
|
+
Requires-Dist: mlflow; extra == "logging"
|
78
77
|
Provides-Extra: extra
|
79
78
|
Requires-Dist: hub-sdk>=0.0.12; extra == "extra"
|
80
79
|
Requires-Dist: ipython; extra == "extra"
|
@@ -61,7 +61,7 @@ classifiers = [
|
|
61
61
|
|
62
62
|
# Required dependencies ------------------------------------------------------------------------------------------------
|
63
63
|
dependencies = [
|
64
|
-
"numpy>=1.23.0
|
64
|
+
"numpy>=1.23.0",
|
65
65
|
"matplotlib>=3.3.0",
|
66
66
|
"opencv-python>=4.6.0",
|
67
67
|
"pillow>=7.1.2",
|
@@ -95,12 +95,11 @@ dev = [
|
|
95
95
|
export = [
|
96
96
|
"onnx>=1.12.0", # ONNX export
|
97
97
|
"coremltools>=8.0; platform_system != 'Windows' and python_version <= '3.13'", # CoreML supported on macOS and Linux
|
98
|
-
"scikit-learn>=1.3.2; platform_system != 'Windows' and python_version <= '3.
|
98
|
+
"scikit-learn>=1.3.2; platform_system != 'Windows' and python_version <= '3.13'", # CoreML k-means quantization
|
99
99
|
"openvino>=2024.0.0", # OpenVINO export
|
100
100
|
"tensorflow>=2.0.0", # TF bug https://github.com/ultralytics/ultralytics/issues/5161
|
101
101
|
"tensorflowjs>=2.0.0", # TF.js export, automatically installs tensorflow
|
102
102
|
"tensorstore>=0.1.63; platform_machine == 'aarch64' and python_version >= '3.9'", # for TF Raspberry Pi exports
|
103
|
-
"keras", # not installed automatically by tensorflow>=2.16
|
104
103
|
"h5py!=3.11.0; platform_machine == 'aarch64'", # fix h5py build issues due to missing aarch64 wheels in 3.11 release
|
105
104
|
]
|
106
105
|
solutions = [
|
@@ -108,9 +107,9 @@ solutions = [
|
|
108
107
|
"streamlit>=1.29.0,<1.44.0", # for live inference on web browser, i.e `yolo streamlit-predict`
|
109
108
|
]
|
110
109
|
logging = [
|
111
|
-
"
|
112
|
-
"tensorboard
|
113
|
-
"
|
110
|
+
"wandb", # https://docs.ultralytics.com/integrations/weights-biases/
|
111
|
+
"tensorboard", # https://docs.ultralytics.com/integrations/tensorboard/
|
112
|
+
"mlflow", # https://docs.ultralytics.com/integrations/mlflow/
|
114
113
|
]
|
115
114
|
extra = [
|
116
115
|
"hub-sdk>=0.0.12", # Ultralytics HUB
|
@@ -133,7 +132,8 @@ ultralytics = "ultralytics.cfg:entrypoint"
|
|
133
132
|
# Tools settings -------------------------------------------------------------------------------------------------------
|
134
133
|
[tool.setuptools] # configuration specific to the `setuptools` build backend.
|
135
134
|
packages = { find = { where = ["."], include = ["ultralytics", "ultralytics.*"] } }
|
136
|
-
|
135
|
+
# Tests included below for checking Conda builds in https://github.com/conda-forge/ultralytics-feedstock
|
136
|
+
package-data = { "ultralytics" = ["**/*.yaml", "**/*.sh", "../tests/*.py"], "ultralytics.assets" = ["*.jpg"] }
|
137
137
|
|
138
138
|
[tool.setuptools.dynamic]
|
139
139
|
version = { attr = "ultralytics.__version__" }
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
|
2
|
+
|
3
|
+
from ultralytics.utils import ASSETS, ROOT, WEIGHTS_DIR, checks
|
4
|
+
|
5
|
+
# Constants used in tests
|
6
|
+
MODEL = WEIGHTS_DIR / "path with spaces" / "yolo11n.pt" # test spaces in path
|
7
|
+
CFG = "yolo11n.yaml"
|
8
|
+
SOURCE = ASSETS / "bus.jpg"
|
9
|
+
SOURCES_LIST = [ASSETS / "bus.jpg", ASSETS, ASSETS / "*", ASSETS / "**/*.jpg"]
|
10
|
+
TMP = (ROOT / "../tests/tmp").resolve() # temp directory for test files
|
11
|
+
CUDA_IS_AVAILABLE = checks.cuda_is_available()
|
12
|
+
CUDA_DEVICE_COUNT = checks.cuda_device_count()
|
13
|
+
|
14
|
+
__all__ = (
|
15
|
+
"MODEL",
|
16
|
+
"CFG",
|
17
|
+
"SOURCE",
|
18
|
+
"SOURCES_LIST",
|
19
|
+
"TMP",
|
20
|
+
"CUDA_IS_AVAILABLE",
|
21
|
+
"CUDA_DEVICE_COUNT",
|
22
|
+
)
|
@@ -0,0 +1,83 @@
|
|
1
|
+
# Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
|
2
|
+
|
3
|
+
import shutil
|
4
|
+
from pathlib import Path
|
5
|
+
|
6
|
+
from tests import TMP
|
7
|
+
|
8
|
+
|
9
|
+
def pytest_addoption(parser):
|
10
|
+
"""
|
11
|
+
Add custom command-line options to pytest.
|
12
|
+
|
13
|
+
Args:
|
14
|
+
parser (pytest.config.Parser): The pytest parser object for adding custom command-line options.
|
15
|
+
|
16
|
+
Returns:
|
17
|
+
(None)
|
18
|
+
"""
|
19
|
+
parser.addoption("--slow", action="store_true", default=False, help="Run slow tests")
|
20
|
+
|
21
|
+
|
22
|
+
def pytest_collection_modifyitems(config, items):
|
23
|
+
"""
|
24
|
+
Modify the list of test items to exclude tests marked as slow if the --slow option is not specified.
|
25
|
+
|
26
|
+
Args:
|
27
|
+
config (pytest.config.Config): The pytest configuration object that provides access to command-line options.
|
28
|
+
items (list): The list of collected pytest item objects to be modified based on the presence of --slow option.
|
29
|
+
|
30
|
+
Returns:
|
31
|
+
(None): The function modifies the 'items' list in place.
|
32
|
+
"""
|
33
|
+
if not config.getoption("--slow"):
|
34
|
+
# Remove the item entirely from the list of test items if it's marked as 'slow'
|
35
|
+
items[:] = [item for item in items if "slow" not in item.keywords]
|
36
|
+
|
37
|
+
|
38
|
+
def pytest_sessionstart(session):
|
39
|
+
"""
|
40
|
+
Initialize session configurations for pytest.
|
41
|
+
|
42
|
+
This function is automatically called by pytest after the 'Session' object has been created but before performing
|
43
|
+
test collection. It sets the initial seeds and prepares the temporary directory for the test session.
|
44
|
+
|
45
|
+
Args:
|
46
|
+
session (pytest.Session): The pytest session object.
|
47
|
+
|
48
|
+
Returns:
|
49
|
+
(None)
|
50
|
+
"""
|
51
|
+
from ultralytics.utils.torch_utils import init_seeds
|
52
|
+
|
53
|
+
init_seeds()
|
54
|
+
shutil.rmtree(TMP, ignore_errors=True) # delete any existing tests/tmp directory
|
55
|
+
TMP.mkdir(parents=True, exist_ok=True) # create a new empty directory
|
56
|
+
|
57
|
+
|
58
|
+
def pytest_terminal_summary(terminalreporter, exitstatus, config):
|
59
|
+
"""
|
60
|
+
Cleanup operations after pytest session.
|
61
|
+
|
62
|
+
This function is automatically called by pytest at the end of the entire test session. It removes certain files
|
63
|
+
and directories used during testing.
|
64
|
+
|
65
|
+
Args:
|
66
|
+
terminalreporter (pytest.terminal.TerminalReporter): The terminal reporter object used for terminal output.
|
67
|
+
exitstatus (int): The exit status of the test run.
|
68
|
+
config (pytest.config.Config): The pytest config object.
|
69
|
+
|
70
|
+
Returns:
|
71
|
+
(None)
|
72
|
+
"""
|
73
|
+
from ultralytics.utils import WEIGHTS_DIR
|
74
|
+
|
75
|
+
# Remove files
|
76
|
+
models = [path for x in ["*.onnx", "*.torchscript"] for path in WEIGHTS_DIR.rglob(x)]
|
77
|
+
for file in ["decelera_portrait_min.mov", "bus.jpg", "yolo11n.onnx", "yolo11n.torchscript"] + models:
|
78
|
+
Path(file).unlink(missing_ok=True)
|
79
|
+
|
80
|
+
# Remove directories
|
81
|
+
models = [path for x in ["*.mlpackage", "*_openvino_model"] for path in WEIGHTS_DIR.rglob(x)]
|
82
|
+
for directory in [WEIGHTS_DIR / "path with spaces", TMP.parents[1] / ".pytest_cache", TMP] + models:
|
83
|
+
shutil.rmtree(directory, ignore_errors=True)
|
@@ -114,6 +114,7 @@ fliplr: 0.5 # (float) image flip left-right (probability)
|
|
114
114
|
bgr: 0.0 # (float) image channel BGR (probability)
|
115
115
|
mosaic: 1.0 # (float) image mosaic (probability)
|
116
116
|
mixup: 0.0 # (float) image mixup (probability)
|
117
|
+
cutmix: 0.0 # (float) image cutmix (probability)
|
117
118
|
copy_paste: 0.0 # (float) segment copy-paste (probability)
|
118
119
|
copy_paste_mode: "flip" # (str) the method to do copy_paste augmentation (flip, mixup)
|
119
120
|
auto_augment: randaugment # (str) auto augmentation policy for classification (randaugment, autoaugment, augmix)
|
@@ -317,7 +317,7 @@ class Compose:
|
|
317
317
|
|
318
318
|
class BaseMixTransform:
|
319
319
|
"""
|
320
|
-
Base class for mix transformations like MixUp and Mosaic.
|
320
|
+
Base class for mix transformations like Cutmix, MixUp and Mosaic.
|
321
321
|
|
322
322
|
This class provides a foundation for implementing mix transformations on datasets. It handles the
|
323
323
|
probability-based application of transforms and manages the mixing of multiple images and labels.
|
@@ -348,7 +348,7 @@ class BaseMixTransform:
|
|
348
348
|
|
349
349
|
def __init__(self, dataset, pre_transform=None, p=0.0) -> None:
|
350
350
|
"""
|
351
|
-
Initializes the BaseMixTransform object for mix transformations like MixUp and Mosaic.
|
351
|
+
Initializes the BaseMixTransform object for mix transformations like CutMix, MixUp and Mosaic.
|
352
352
|
|
353
353
|
This class serves as a base for implementing mix transformations in image processing pipelines.
|
354
354
|
|
@@ -368,7 +368,7 @@ class BaseMixTransform:
|
|
368
368
|
|
369
369
|
def __call__(self, labels):
|
370
370
|
"""
|
371
|
-
Applies pre-processing transforms and mixup/mosaic transforms to labels data.
|
371
|
+
Applies pre-processing transforms and cutmix/mixup/mosaic transforms to labels data.
|
372
372
|
|
373
373
|
This method determines whether to apply the mix transform based on a probability factor. If applied, it
|
374
374
|
selects additional images, applies pre-transforms if specified, and then performs the mix transform.
|
@@ -391,7 +391,7 @@ class BaseMixTransform:
|
|
391
391
|
if isinstance(indexes, int):
|
392
392
|
indexes = [indexes]
|
393
393
|
|
394
|
-
# Get images information will be used for Mosaic or MixUp
|
394
|
+
# Get images information will be used for Mosaic, CutMix or MixUp
|
395
395
|
mix_labels = [self.dataset.get_image_and_label(i) for i in indexes]
|
396
396
|
|
397
397
|
if self.pre_transform is not None:
|
@@ -401,16 +401,16 @@ class BaseMixTransform:
|
|
401
401
|
|
402
402
|
# Update cls and texts
|
403
403
|
labels = self._update_label_text(labels)
|
404
|
-
# Mosaic or MixUp
|
404
|
+
# Mosaic, CutMix or MixUp
|
405
405
|
labels = self._mix_transform(labels)
|
406
406
|
labels.pop("mix_labels", None)
|
407
407
|
return labels
|
408
408
|
|
409
409
|
def _mix_transform(self, labels):
|
410
410
|
"""
|
411
|
-
Applies MixUp or Mosaic augmentation to the label dictionary.
|
411
|
+
Applies CutMix, MixUp or Mosaic augmentation to the label dictionary.
|
412
412
|
|
413
|
-
This method should be implemented by subclasses to perform specific mix transformations like MixUp or
|
413
|
+
This method should be implemented by subclasses to perform specific mix transformations like CutMix, MixUp or
|
414
414
|
Mosaic. It modifies the input label dictionary in-place with the augmented data.
|
415
415
|
|
416
416
|
Args:
|
@@ -949,6 +949,117 @@ class MixUp(BaseMixTransform):
|
|
949
949
|
return labels
|
950
950
|
|
951
951
|
|
952
|
+
class CutMix(BaseMixTransform):
|
953
|
+
"""
|
954
|
+
Applies CutMix augmentation to image datasets as described in the paper https://arxiv.org/abs/1905.04899.
|
955
|
+
|
956
|
+
CutMix combines two images by replacing a random rectangular region of one image with the corresponding region from another image,
|
957
|
+
and adjusts the labels proportionally to the area of the mixed region.
|
958
|
+
|
959
|
+
Attributes:
|
960
|
+
dataset (Any): The dataset to which CutMix augmentation will be applied.
|
961
|
+
pre_transform (Callable | None): Optional transform to apply before CutMix.
|
962
|
+
p (float): Probability of applying CutMix augmentation.
|
963
|
+
beta (float): Beta distribution parameter for sampling the mixing ratio (default=1.0).
|
964
|
+
|
965
|
+
Methods:
|
966
|
+
get_indexes: Returns a random index from the dataset.
|
967
|
+
_mix_transform: Applies CutMix augmentation to the input labels.
|
968
|
+
_rand_bbox: Generates random bounding box coordinates for the cut region.
|
969
|
+
|
970
|
+
Examples:
|
971
|
+
>>> from ultralytics.data.augment import CutMix
|
972
|
+
>>> dataset = YourDataset(...) # Your image dataset
|
973
|
+
>>> cutmix = CutMix(dataset, p=0.5)
|
974
|
+
>>> augmented_labels = cutmix(original_labels)
|
975
|
+
"""
|
976
|
+
|
977
|
+
def __init__(self, dataset, pre_transform=None, p=0.0, beta=1.0) -> None:
|
978
|
+
"""
|
979
|
+
Initializes the CutMix augmentation object.
|
980
|
+
|
981
|
+
Args:
|
982
|
+
dataset (Any): The dataset to which CutMix augmentation will be applied.
|
983
|
+
pre_transform (Callable | None): Optional transform to apply before CutMix.
|
984
|
+
p (float): Probability of applying CutMix augmentation.
|
985
|
+
beta (float): Beta distribution parameter for sampling the mixing ratio (default=1.0).
|
986
|
+
"""
|
987
|
+
super().__init__(dataset=dataset, pre_transform=pre_transform, p=p)
|
988
|
+
self.beta = beta
|
989
|
+
|
990
|
+
def get_indexes(self):
|
991
|
+
"""
|
992
|
+
Get a random index from the dataset.
|
993
|
+
|
994
|
+
Returns:
|
995
|
+
(int): A random integer index within the range of the dataset length.
|
996
|
+
"""
|
997
|
+
return random.randint(0, len(self.dataset) - 1)
|
998
|
+
|
999
|
+
def _rand_bbox(self, width, height, lam):
|
1000
|
+
"""
|
1001
|
+
Generates random bounding box coordinates for the cut region.
|
1002
|
+
|
1003
|
+
Args:
|
1004
|
+
width (int): Width of the image.
|
1005
|
+
height (int): Height of the image.
|
1006
|
+
lam (float): Mixing ratio from the Beta distribution.
|
1007
|
+
|
1008
|
+
Returns:
|
1009
|
+
(tuple): (x1, y1, x2, y2) coordinates of the bounding box.
|
1010
|
+
"""
|
1011
|
+
cut_ratio = np.sqrt(1.0 - lam)
|
1012
|
+
cut_w = int(width * cut_ratio)
|
1013
|
+
cut_h = int(height * cut_ratio)
|
1014
|
+
|
1015
|
+
# Random center
|
1016
|
+
cx = np.random.randint(width)
|
1017
|
+
cy = np.random.randint(height)
|
1018
|
+
|
1019
|
+
# Bounding box coordinates
|
1020
|
+
x1 = np.clip(cx - cut_w // 2, 0, width)
|
1021
|
+
y1 = np.clip(cy - cut_h // 2, 0, height)
|
1022
|
+
x2 = np.clip(cx + cut_w // 2, 0, width)
|
1023
|
+
y2 = np.clip(cy + cut_h // 2, 0, height)
|
1024
|
+
|
1025
|
+
return x1, y1, x2, y2
|
1026
|
+
|
1027
|
+
def _mix_transform(self, labels):
|
1028
|
+
"""
|
1029
|
+
Applies CutMix augmentation to the input labels.
|
1030
|
+
|
1031
|
+
Args:
|
1032
|
+
labels (dict): A dictionary containing the original image and label information.
|
1033
|
+
|
1034
|
+
Returns:
|
1035
|
+
(dict): A dictionary containing the mixed image and adjusted labels.
|
1036
|
+
|
1037
|
+
Examples:
|
1038
|
+
>>> cutter = CutMix(dataset)
|
1039
|
+
>>> mixed_labels = cutter._mix_transform(labels)
|
1040
|
+
"""
|
1041
|
+
# Sample mixing ratio from Beta distribution
|
1042
|
+
lam = np.random.beta(self.beta, self.beta)
|
1043
|
+
|
1044
|
+
# Get a random second image
|
1045
|
+
labels2 = labels["mix_labels"][0]
|
1046
|
+
img2 = labels2["img"]
|
1047
|
+
h, w = labels["img"].shape[:2]
|
1048
|
+
|
1049
|
+
# Generate random bounding box
|
1050
|
+
x1, y1, x2, y2 = self._rand_bbox(w, h, lam)
|
1051
|
+
|
1052
|
+
# Apply CutMix
|
1053
|
+
labels["img"][y1:y2, x1:x2] = img2[y1:y2, x1:x2]
|
1054
|
+
|
1055
|
+
# Adjust lambda to match the actual area ratio
|
1056
|
+
lam = 1 - ((x2 - x1) * (y2 - y1) / (w * h))
|
1057
|
+
|
1058
|
+
labels["cls"] = np.concatenate([labels["cls"], labels2["cls"]], axis=0)
|
1059
|
+
labels["instances"] = Instances.concatenate([labels["instances"], labels2["instances"]], axis=0)
|
1060
|
+
return labels
|
1061
|
+
|
1062
|
+
|
952
1063
|
class RandomPerspective:
|
953
1064
|
"""
|
954
1065
|
Implements random perspective and affine transformations on images and corresponding annotations.
|
@@ -1586,6 +1697,9 @@ class LetterBox:
|
|
1586
1697
|
|
1587
1698
|
if shape[::-1] != new_unpad: # resize
|
1588
1699
|
img = cv2.resize(img, new_unpad, interpolation=cv2.INTER_LINEAR)
|
1700
|
+
if img.ndim == 2:
|
1701
|
+
img = img[..., None]
|
1702
|
+
|
1589
1703
|
top, bottom = int(round(dh - 0.1)) if self.center else 0, int(round(dh + 0.1))
|
1590
1704
|
left, right = int(round(dw - 0.1)) if self.center else 0, int(round(dw + 0.1))
|
1591
1705
|
h, w, c = img.shape
|
@@ -2442,6 +2556,7 @@ def v8_transforms(dataset, imgsz, hyp, stretch=False):
|
|
2442
2556
|
[
|
2443
2557
|
pre_transform,
|
2444
2558
|
MixUp(dataset, pre_transform=pre_transform, p=hyp.mixup),
|
2559
|
+
CutMix(dataset, pre_transform=pre_transform, p=hyp.cutmix),
|
2445
2560
|
Albumentations(p=1.0),
|
2446
2561
|
RandomHSV(hgain=hyp.hsv_h, sgain=hyp.hsv_s, vgain=hyp.hsv_v),
|
2447
2562
|
RandomFlip(direction="vertical", p=hyp.flipud),
|
@@ -33,6 +33,7 @@ class BaseDataset(Dataset):
|
|
33
33
|
single_cls (bool): Whether to treat all objects as a single class.
|
34
34
|
prefix (str): Prefix to print in log messages.
|
35
35
|
fraction (float): Fraction of dataset to utilize.
|
36
|
+
cv2_flag (int): OpenCV flag for reading images.
|
36
37
|
im_files (List[str]): List of image file paths.
|
37
38
|
labels (List[Dict]): List of label data dictionaries.
|
38
39
|
ni (int): Number of images in the dataset.
|
@@ -79,6 +80,7 @@ class BaseDataset(Dataset):
|
|
79
80
|
single_cls=False,
|
80
81
|
classes=None,
|
81
82
|
fraction=1.0,
|
83
|
+
channels=3,
|
82
84
|
):
|
83
85
|
"""
|
84
86
|
Initialize BaseDataset with given configuration and options.
|
@@ -97,6 +99,7 @@ class BaseDataset(Dataset):
|
|
97
99
|
single_cls (bool, optional): If True, single class training is used.
|
98
100
|
classes (list, optional): List of included classes.
|
99
101
|
fraction (float, optional): Fraction of dataset to utilize.
|
102
|
+
channels (int, optional): Number of channels in the images (1 for grayscale, 3 for RGB).
|
100
103
|
"""
|
101
104
|
super().__init__()
|
102
105
|
self.img_path = img_path
|
@@ -105,6 +108,8 @@ class BaseDataset(Dataset):
|
|
105
108
|
self.single_cls = single_cls
|
106
109
|
self.prefix = prefix
|
107
110
|
self.fraction = fraction
|
111
|
+
self.channels = channels
|
112
|
+
self.cv2_flag = cv2.IMREAD_GRAYSCALE if channels == 1 else cv2.IMREAD_COLOR
|
108
113
|
self.im_files = self.get_img_files(self.img_path)
|
109
114
|
self.labels = self.get_labels()
|
110
115
|
self.update_labels(include_class=classes) # single_cls and include_class
|
@@ -224,9 +229,9 @@ class BaseDataset(Dataset):
|
|
224
229
|
except Exception as e:
|
225
230
|
LOGGER.warning(f"{self.prefix}Removing corrupt *.npy image file {fn} due to: {e}")
|
226
231
|
Path(fn).unlink(missing_ok=True)
|
227
|
-
im = imread(f) # BGR
|
232
|
+
im = imread(f, flags=self.cv2_flag) # BGR
|
228
233
|
else: # read image
|
229
|
-
im = imread(f) # BGR
|
234
|
+
im = imread(f, flags=self.cv2_flag) # BGR
|
230
235
|
if im is None:
|
231
236
|
raise FileNotFoundError(f"Image Not Found {f}")
|
232
237
|
|
@@ -238,6 +243,8 @@ class BaseDataset(Dataset):
|
|
238
243
|
im = cv2.resize(im, (w, h), interpolation=cv2.INTER_LINEAR)
|
239
244
|
elif not (h0 == w0 == self.imgsz): # resize by stretching image to square imgsz
|
240
245
|
im = cv2.resize(im, (self.imgsz, self.imgsz), interpolation=cv2.INTER_LINEAR)
|
246
|
+
if im.ndim == 2:
|
247
|
+
im = im[..., None]
|
241
248
|
|
242
249
|
# Add to buffer if training with augmentations
|
243
250
|
if self.augment:
|
@@ -84,7 +84,7 @@ class YOLODataset(BaseDataset):
|
|
84
84
|
self.use_obb = task == "obb"
|
85
85
|
self.data = data
|
86
86
|
assert not (self.use_segments and self.use_keypoints), "Can not use both segments and keypoints."
|
87
|
-
super().__init__(*args, **kwargs)
|
87
|
+
super().__init__(*args, channels=self.data["channels"], **kwargs)
|
88
88
|
|
89
89
|
def cache_labels(self, path=Path("./labels.cache")):
|
90
90
|
"""
|
@@ -215,6 +215,7 @@ class YOLODataset(BaseDataset):
|
|
215
215
|
if self.augment:
|
216
216
|
hyp.mosaic = hyp.mosaic if self.augment and not self.rect else 0.0
|
217
217
|
hyp.mixup = hyp.mixup if self.augment and not self.rect else 0.0
|
218
|
+
hyp.cutmix = hyp.cutmix if self.augment and not self.rect else 0.0
|
218
219
|
transforms = v8_transforms(self, self.imgsz, hyp)
|
219
220
|
else:
|
220
221
|
transforms = Compose([LetterBox(new_shape=(self.imgsz, self.imgsz), scaleup=False)])
|
@@ -235,14 +236,15 @@ class YOLODataset(BaseDataset):
|
|
235
236
|
|
236
237
|
def close_mosaic(self, hyp):
|
237
238
|
"""
|
238
|
-
|
239
|
+
Disable mosaic, copy_paste, mixup and cutmix augmentations by setting their probabilities to 0.0.
|
239
240
|
|
240
241
|
Args:
|
241
242
|
hyp (dict): Hyperparameters for transforms.
|
242
243
|
"""
|
243
|
-
hyp.mosaic = 0.0
|
244
|
-
hyp.copy_paste = 0.0
|
245
|
-
hyp.mixup = 0.0
|
244
|
+
hyp.mosaic = 0.0
|
245
|
+
hyp.copy_paste = 0.0
|
246
|
+
hyp.mixup = 0.0
|
247
|
+
hyp.cutmix = 0.0
|
246
248
|
self.transforms = self.build_transforms(hyp)
|
247
249
|
|
248
250
|
def update_labels_info(self, label):
|