ultralytics 8.3.118__tar.gz → 8.3.120__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.118/ultralytics.egg-info → ultralytics-8.3.120}/PKG-INFO +6 -7
- {ultralytics-8.3.118 → ultralytics-8.3.120}/pyproject.toml +5 -6
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/__init__.py +1 -1
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/__init__.py +1 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/default.yaml +1 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/data/augment.py +125 -32
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/data/dataset.py +7 -5
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/engine/exporter.py +9 -87
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/engine/tuner.py +2 -1
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/rtdetr/val.py +1 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/yolo/world/train_world.py +17 -5
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/yolo/yoloe/__init__.py +2 -1
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/yolo/yoloe/train.py +12 -113
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/yolo/yoloe/train_seg.py +1 -17
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/trackers/bot_sort.py +5 -5
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/utils/loss.py +4 -3
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/utils/ops.py +1 -1
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/utils/tuner.py +2 -1
- {ultralytics-8.3.118 → ultralytics-8.3.120/ultralytics.egg-info}/PKG-INFO +6 -7
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics.egg-info/requires.txt +5 -8
- {ultralytics-8.3.118 → ultralytics-8.3.120}/LICENSE +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/README.md +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/setup.cfg +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/tests/__init__.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/tests/conftest.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/tests/test_cli.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/tests/test_cuda.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/tests/test_engine.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/tests/test_exports.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/tests/test_integrations.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/tests/test_python.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/tests/test_solutions.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/assets/bus.jpg +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/assets/zidane.jpg +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/datasets/VOC.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/datasets/coco.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/datasets/coco128.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/datasets/coco8-multispectral.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/datasets/coco8.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/datasets/dog-pose.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/datasets/dota8-multispectral.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/datasets/dota8.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/datasets/hand-keypoints.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/datasets/lvis.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/datasets/medical-pills.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/datasets/signature.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/datasets/xView.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/11/yolo11-cls-resnet18.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/11/yolo11-cls.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/11/yolo11-obb.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/11/yolo11-pose.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/11/yolo11-seg.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/11/yolo11.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/11/yoloe-11-seg.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/11/yoloe-11.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/12/yolo12-cls.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/12/yolo12-obb.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/12/yolo12-pose.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/12/yolo12-seg.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/12/yolo12.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/v10/yolov10b.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/v10/yolov10l.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/v10/yolov10m.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/v10/yolov10n.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/v10/yolov10s.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/v10/yolov10x.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/v8/yoloe-v8-seg.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/v8/yoloe-v8.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/v9/yolov9m.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/v9/yolov9s.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/models/v9/yolov9t.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/solutions/default.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/trackers/botsort.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/data/__init__.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/data/annotator.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/data/base.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/data/build.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/data/converter.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/data/loaders.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/data/scripts/download_weights.sh +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/data/scripts/get_coco.sh +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/data/scripts/get_coco128.sh +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/data/scripts/get_imagenet.sh +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/data/split.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/data/split_dota.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/data/utils.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/engine/__init__.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/engine/model.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/engine/predictor.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/engine/results.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/engine/trainer.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/engine/validator.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/hub/__init__.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/hub/auth.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/hub/google/__init__.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/hub/session.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/hub/utils.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/__init__.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/fastsam/__init__.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/fastsam/model.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/fastsam/predict.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/fastsam/utils.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/fastsam/val.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/nas/__init__.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/nas/model.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/nas/predict.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/nas/val.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/rtdetr/__init__.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/rtdetr/model.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/rtdetr/predict.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/rtdetr/train.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/sam/__init__.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/sam/amg.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/sam/build.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/sam/model.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/sam/modules/__init__.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/sam/modules/blocks.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/sam/modules/decoders.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/sam/modules/encoders.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/sam/modules/memory_attention.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/sam/modules/sam.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/sam/modules/transformer.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/sam/modules/utils.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/sam/predict.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/utils/__init__.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/utils/loss.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/utils/ops.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/yolo/__init__.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/yolo/classify/__init__.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/yolo/classify/predict.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/yolo/classify/train.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/yolo/classify/val.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/yolo/detect/__init__.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/yolo/detect/predict.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/yolo/detect/train.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/yolo/detect/val.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/yolo/model.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/yolo/obb/__init__.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/yolo/obb/predict.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/yolo/obb/train.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/yolo/obb/val.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/yolo/pose/__init__.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/yolo/pose/predict.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/yolo/pose/train.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/yolo/pose/val.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/yolo/segment/__init__.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/yolo/segment/predict.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/yolo/segment/train.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/yolo/segment/val.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/yolo/world/__init__.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/yolo/world/train.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/yolo/yoloe/predict.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/models/yolo/yoloe/val.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/nn/__init__.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/nn/autobackend.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/nn/modules/__init__.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/nn/modules/activation.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/nn/modules/block.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/nn/modules/conv.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/nn/modules/head.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/nn/modules/transformer.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/nn/modules/utils.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/nn/tasks.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/nn/text_model.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/solutions/__init__.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/solutions/ai_gym.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/solutions/analytics.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/solutions/distance_calculation.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/solutions/heatmap.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/solutions/instance_segmentation.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/solutions/object_blurrer.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/solutions/object_counter.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/solutions/object_cropper.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/solutions/parking_management.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/solutions/queue_management.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/solutions/region_counter.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/solutions/security_alarm.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/solutions/solutions.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/solutions/speed_estimation.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/solutions/streamlit_inference.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/solutions/trackzone.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/solutions/vision_eye.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/trackers/__init__.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/trackers/basetrack.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/trackers/byte_tracker.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/trackers/track.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/trackers/utils/__init__.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/trackers/utils/gmc.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/trackers/utils/kalman_filter.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/trackers/utils/matching.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/utils/__init__.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/utils/autobatch.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/utils/benchmarks.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/utils/callbacks/__init__.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/utils/callbacks/base.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/utils/callbacks/clearml.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/utils/callbacks/comet.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/utils/callbacks/dvc.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/utils/callbacks/hub.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/utils/callbacks/mlflow.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/utils/callbacks/neptune.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/utils/callbacks/raytune.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/utils/callbacks/tensorboard.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/utils/callbacks/wb.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/utils/checks.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/utils/dist.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/utils/downloads.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/utils/errors.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/utils/export.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/utils/files.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/utils/instance.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/utils/metrics.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/utils/patches.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/utils/plotting.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/utils/tal.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/utils/torch_utils.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics/utils/triton.py +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics.egg-info/SOURCES.txt +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics.egg-info/dependency_links.txt +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/ultralytics.egg-info/entry_points.txt +0 -0
- {ultralytics-8.3.118 → ultralytics-8.3.120}/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.120
|
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
|
@@ -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:
|
@@ -439,7 +439,7 @@ class BaseMixTransform:
|
|
439
439
|
>>> indexes = transform.get_indexes()
|
440
440
|
>>> print(indexes) # [3, 18, 7, 2]
|
441
441
|
"""
|
442
|
-
|
442
|
+
return random.randint(0, len(self.dataset) - 1)
|
443
443
|
|
444
444
|
@staticmethod
|
445
445
|
def _update_label_text(labels):
|
@@ -877,7 +877,6 @@ class MixUp(BaseMixTransform):
|
|
877
877
|
p (float): Probability of applying MixUp augmentation.
|
878
878
|
|
879
879
|
Methods:
|
880
|
-
get_indexes: Returns a random index from the dataset.
|
881
880
|
_mix_transform: Applies MixUp augmentation to the input labels.
|
882
881
|
|
883
882
|
Examples:
|
@@ -906,24 +905,6 @@ class MixUp(BaseMixTransform):
|
|
906
905
|
"""
|
907
906
|
super().__init__(dataset=dataset, pre_transform=pre_transform, p=p)
|
908
907
|
|
909
|
-
def get_indexes(self):
|
910
|
-
"""
|
911
|
-
Get a random index from the dataset.
|
912
|
-
|
913
|
-
This method returns a single random index from the dataset, which is used to select an image for MixUp
|
914
|
-
augmentation.
|
915
|
-
|
916
|
-
Returns:
|
917
|
-
(int): A random integer index within the range of the dataset length.
|
918
|
-
|
919
|
-
Examples:
|
920
|
-
>>> mixup = MixUp(dataset)
|
921
|
-
>>> index = mixup.get_indexes()
|
922
|
-
>>> print(index)
|
923
|
-
42
|
924
|
-
"""
|
925
|
-
return random.randint(0, len(self.dataset) - 1)
|
926
|
-
|
927
908
|
def _mix_transform(self, labels):
|
928
909
|
"""
|
929
910
|
Applies MixUp augmentation to the input labels.
|
@@ -949,6 +930,122 @@ class MixUp(BaseMixTransform):
|
|
949
930
|
return labels
|
950
931
|
|
951
932
|
|
933
|
+
class CutMix(BaseMixTransform):
|
934
|
+
"""
|
935
|
+
Applies CutMix augmentation to image datasets as described in the paper https://arxiv.org/abs/1905.04899.
|
936
|
+
|
937
|
+
CutMix combines two images by replacing a random rectangular region of one image with the corresponding region from another image,
|
938
|
+
and adjusts the labels proportionally to the area of the mixed region.
|
939
|
+
|
940
|
+
Attributes:
|
941
|
+
dataset (Any): The dataset to which CutMix augmentation will be applied.
|
942
|
+
pre_transform (Callable | None): Optional transform to apply before CutMix.
|
943
|
+
p (float): Probability of applying CutMix augmentation.
|
944
|
+
beta (float): Beta distribution parameter for sampling the mixing ratio (default=1.0).
|
945
|
+
num_areas (int): Number of areas to try to cut and mix (default=3).
|
946
|
+
|
947
|
+
Methods:
|
948
|
+
_mix_transform: Applies CutMix augmentation to the input labels.
|
949
|
+
_rand_bbox: Generates random bounding box coordinates for the cut region.
|
950
|
+
|
951
|
+
Examples:
|
952
|
+
>>> from ultralytics.data.augment import CutMix
|
953
|
+
>>> dataset = YourDataset(...) # Your image dataset
|
954
|
+
>>> cutmix = CutMix(dataset, p=0.5)
|
955
|
+
>>> augmented_labels = cutmix(original_labels)
|
956
|
+
"""
|
957
|
+
|
958
|
+
def __init__(self, dataset, pre_transform=None, p=0.0, beta=1.0, num_areas=3) -> None:
|
959
|
+
"""
|
960
|
+
Initializes the CutMix augmentation object.
|
961
|
+
|
962
|
+
Args:
|
963
|
+
dataset (Any): The dataset to which CutMix augmentation will be applied.
|
964
|
+
pre_transform (Callable | None): Optional transform to apply before CutMix.
|
965
|
+
p (float): Probability of applying CutMix augmentation.
|
966
|
+
beta (float): Beta distribution parameter for sampling the mixing ratio (default=1.0).
|
967
|
+
num_areas (int): Number of areas to try to cut and mix (default=3).
|
968
|
+
"""
|
969
|
+
super().__init__(dataset=dataset, pre_transform=pre_transform, p=p)
|
970
|
+
self.beta = beta
|
971
|
+
self.num_areas = num_areas
|
972
|
+
|
973
|
+
def _rand_bbox(self, width, height):
|
974
|
+
"""
|
975
|
+
Generates random bounding box coordinates for the cut region.
|
976
|
+
|
977
|
+
Args:
|
978
|
+
width (int): Width of the image.
|
979
|
+
height (int): Height of the image.
|
980
|
+
|
981
|
+
Returns:
|
982
|
+
(tuple): (x1, y1, x2, y2) coordinates of the bounding box.
|
983
|
+
"""
|
984
|
+
# Sample mixing ratio from Beta distribution
|
985
|
+
lam = np.random.beta(self.beta, self.beta)
|
986
|
+
|
987
|
+
cut_ratio = np.sqrt(1.0 - lam)
|
988
|
+
cut_w = int(width * cut_ratio)
|
989
|
+
cut_h = int(height * cut_ratio)
|
990
|
+
|
991
|
+
# Random center
|
992
|
+
cx = np.random.randint(width)
|
993
|
+
cy = np.random.randint(height)
|
994
|
+
|
995
|
+
# Bounding box coordinates
|
996
|
+
x1 = np.clip(cx - cut_w // 2, 0, width)
|
997
|
+
y1 = np.clip(cy - cut_h // 2, 0, height)
|
998
|
+
x2 = np.clip(cx + cut_w // 2, 0, width)
|
999
|
+
y2 = np.clip(cy + cut_h // 2, 0, height)
|
1000
|
+
|
1001
|
+
return x1, y1, x2, y2
|
1002
|
+
|
1003
|
+
def _mix_transform(self, labels):
|
1004
|
+
"""
|
1005
|
+
Applies CutMix augmentation to the input labels.
|
1006
|
+
|
1007
|
+
Args:
|
1008
|
+
labels (dict): A dictionary containing the original image and label information.
|
1009
|
+
|
1010
|
+
Returns:
|
1011
|
+
(dict): A dictionary containing the mixed image and adjusted labels.
|
1012
|
+
|
1013
|
+
Examples:
|
1014
|
+
>>> cutter = CutMix(dataset)
|
1015
|
+
>>> mixed_labels = cutter._mix_transform(labels)
|
1016
|
+
"""
|
1017
|
+
# Get a random second image
|
1018
|
+
h, w = labels["img"].shape[:2]
|
1019
|
+
|
1020
|
+
cut_areas = np.asarray([self._rand_bbox(w, h) for _ in range(self.num_areas)], dtype=np.float32)
|
1021
|
+
ioa1 = bbox_ioa(cut_areas, labels["instances"].bboxes) # (self.num_areas, num_boxes)
|
1022
|
+
idx = np.nonzero(ioa1.sum(axis=1) <= 0)[0]
|
1023
|
+
if len(idx) == 0:
|
1024
|
+
return labels
|
1025
|
+
|
1026
|
+
labels2 = labels.pop("mix_labels")[0]
|
1027
|
+
area = cut_areas[np.random.choice(idx)] # randomle select one
|
1028
|
+
ioa2 = bbox_ioa(area[None], labels2["instances"].bboxes).squeeze(0)
|
1029
|
+
indexes2 = np.nonzero(ioa2 >= 0.01 if len(labels["instances"].segments) else 0.1)[0]
|
1030
|
+
|
1031
|
+
instances2 = labels2["instances"][indexes2]
|
1032
|
+
instances2.convert_bbox("xyxy")
|
1033
|
+
instances2.denormalize(w, h)
|
1034
|
+
|
1035
|
+
# Apply CutMix
|
1036
|
+
x1, y1, x2, y2 = area.astype(np.int32)
|
1037
|
+
labels["img"][y1:y2, x1:x2] = labels2["img"][y1:y2, x1:x2]
|
1038
|
+
|
1039
|
+
# Restrain instances2 to the random bounding border
|
1040
|
+
instances2.add_padding(-x1, -y1)
|
1041
|
+
instances2.clip(x2 - x1, y2 - y1)
|
1042
|
+
instances2.add_padding(x1, y1)
|
1043
|
+
|
1044
|
+
labels["cls"] = np.concatenate([labels["cls"], labels2["cls"][indexes2]], axis=0)
|
1045
|
+
labels["instances"] = Instances.concatenate([labels["instances"], instances2], axis=0)
|
1046
|
+
return labels
|
1047
|
+
|
1048
|
+
|
952
1049
|
class RandomPerspective:
|
953
1050
|
"""
|
954
1051
|
Implements random perspective and affine transformations on images and corresponding annotations.
|
@@ -1655,7 +1752,6 @@ class CopyPaste(BaseMixTransform):
|
|
1655
1752
|
p (float): Probability of applying Copy-Paste augmentation.
|
1656
1753
|
|
1657
1754
|
Methods:
|
1658
|
-
get_indexes: Returns a random index from the dataset.
|
1659
1755
|
_mix_transform: Applies Copy-Paste augmentation to the input labels.
|
1660
1756
|
__call__: Applies the Copy-Paste transformation to images and annotations.
|
1661
1757
|
|
@@ -1672,10 +1768,6 @@ class CopyPaste(BaseMixTransform):
|
|
1672
1768
|
assert mode in {"flip", "mixup"}, f"Expected `mode` to be `flip` or `mixup`, but got {mode}."
|
1673
1769
|
self.mode = mode
|
1674
1770
|
|
1675
|
-
def get_indexes(self):
|
1676
|
-
"""Returns a list of random indexes from the dataset for CopyPaste augmentation."""
|
1677
|
-
return random.randint(0, len(self.dataset) - 1)
|
1678
|
-
|
1679
1771
|
def _mix_transform(self, labels):
|
1680
1772
|
"""Applies Copy-Paste augmentation to combine objects from another image into the current image."""
|
1681
1773
|
labels2 = labels["mix_labels"][0]
|
@@ -2445,6 +2537,7 @@ def v8_transforms(dataset, imgsz, hyp, stretch=False):
|
|
2445
2537
|
[
|
2446
2538
|
pre_transform,
|
2447
2539
|
MixUp(dataset, pre_transform=pre_transform, p=hyp.mixup),
|
2540
|
+
CutMix(dataset, pre_transform=pre_transform, p=hyp.cutmix),
|
2448
2541
|
Albumentations(p=1.0),
|
2449
2542
|
RandomHSV(hgain=hyp.hsv_h, sgain=hyp.hsv_s, vgain=hyp.hsv_v),
|
2450
2543
|
RandomFlip(direction="vertical", p=hyp.flipud),
|
@@ -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):
|
@@ -441,7 +443,7 @@ class GroundingDataset(YOLODataset):
|
|
441
443
|
"""
|
442
444
|
assert task in {"detect", "segment"}, "GroundingDataset currently only supports `detect` and `segment` tasks"
|
443
445
|
self.json_file = json_file
|
444
|
-
super().__init__(*args, task=task, data={}, **kwargs)
|
446
|
+
super().__init__(*args, task=task, data={"channels": 3}, **kwargs)
|
445
447
|
|
446
448
|
def get_img_files(self, img_path):
|
447
449
|
"""
|
@@ -95,7 +95,6 @@ from ultralytics.utils import (
|
|
95
95
|
yaml_save,
|
96
96
|
)
|
97
97
|
from ultralytics.utils.checks import (
|
98
|
-
IS_PYTHON_MINIMUM_3_12,
|
99
98
|
check_imgsz,
|
100
99
|
check_is_path_safe,
|
101
100
|
check_requirements,
|
@@ -549,7 +548,7 @@ class Exporter:
|
|
549
548
|
"""YOLO ONNX export."""
|
550
549
|
requirements = ["onnx>=1.12.0"]
|
551
550
|
if self.args.simplify:
|
552
|
-
requirements += ["onnxslim", "onnxruntime" + ("-gpu" if torch.cuda.is_available() else "")]
|
551
|
+
requirements += ["onnxslim>=0.1.46", "onnxruntime" + ("-gpu" if torch.cuda.is_available() else "")]
|
553
552
|
check_requirements(requirements)
|
554
553
|
import onnx # noqa
|
555
554
|
|
@@ -569,12 +568,6 @@ class Exporter:
|
|
569
568
|
dynamic["output0"].pop(2)
|
570
569
|
if self.args.nms and self.model.task == "obb":
|
571
570
|
self.args.opset = opset_version # for NMSModel
|
572
|
-
# OBB error https://github.com/pytorch/pytorch/issues/110859#issuecomment-1757841865
|
573
|
-
try:
|
574
|
-
torch.onnx.register_custom_op_symbolic("aten::lift_fresh", lambda g, x: x, opset_version)
|
575
|
-
except RuntimeError: # it will fail if it's already registered
|
576
|
-
pass
|
577
|
-
check_requirements("onnxslim>=0.1.46") # Older versions has bug with OBB
|
578
571
|
|
579
572
|
with arange_patch(self.args):
|
580
573
|
export_onnx(
|
@@ -650,7 +643,7 @@ class Exporter:
|
|
650
643
|
"""Quantization transform function."""
|
651
644
|
data_item: torch.Tensor = data_item["img"] if isinstance(data_item, dict) else data_item
|
652
645
|
assert data_item.dtype == torch.uint8, "Input image must be uint8 for the quantization preprocessing"
|
653
|
-
im = data_item.numpy().astype(np.float32) / 255.0 # uint8 to fp16/32 and 0
|
646
|
+
im = data_item.numpy().astype(np.float32) / 255.0 # uint8 to fp16/32 and 0-255 to 0.0-1.0
|
654
647
|
return np.expand_dims(im, 0) if im.ndim == 3 else im
|
655
648
|
|
656
649
|
# Generate calibration data for integer quantization
|
@@ -914,14 +907,13 @@ class Exporter:
|
|
914
907
|
import tensorflow as tf # noqa
|
915
908
|
check_requirements(
|
916
909
|
(
|
917
|
-
"keras", # required by 'onnx2tf' package
|
918
910
|
"tf_keras", # required by 'onnx2tf' package
|
919
911
|
"sng4onnx>=1.0.1", # required by 'onnx2tf' package
|
920
912
|
"onnx_graphsurgeon>=0.3.26", # required by 'onnx2tf' package
|
921
913
|
"ai-edge-litert>=1.2.0", # required by 'onnx2tf' package
|
922
914
|
"onnx>=1.12.0",
|
923
915
|
"onnx2tf>=1.26.3",
|
924
|
-
"onnxslim>=0.1.
|
916
|
+
"onnxslim>=0.1.46",
|
925
917
|
"onnxruntime-gpu" if cuda else "onnxruntime",
|
926
918
|
"protobuf>=5",
|
927
919
|
),
|
@@ -1027,8 +1019,6 @@ class Exporter:
|
|
1027
1019
|
@try_export
|
1028
1020
|
def export_edgetpu(self, tflite_model="", prefix=colorstr("Edge TPU:")):
|
1029
1021
|
"""YOLO Edge TPU export https://coral.ai/docs/edgetpu/models-intro/."""
|
1030
|
-
LOGGER.warning(f"{prefix} Edge TPU known bug https://github.com/ultralytics/ultralytics/issues/1185")
|
1031
|
-
|
1032
1022
|
cmd = "edgetpu_compiler --version"
|
1033
1023
|
help_url = "https://coral.ai/docs/edgetpu/compiler/"
|
1034
1024
|
assert LINUX, f"export only supported on Linux. See {help_url}"
|
@@ -1126,7 +1116,8 @@ class Exporter:
|
|
1126
1116
|
"""YOLO IMX export."""
|
1127
1117
|
gptq = False
|
1128
1118
|
assert LINUX, (
|
1129
|
-
"export only supported on Linux.
|
1119
|
+
"export only supported on Linux. "
|
1120
|
+
"See https://developer.aitrios.sony-semicon.com/en/raspberrypi-ai-camera/documentation/imx500-converter"
|
1130
1121
|
)
|
1131
1122
|
if getattr(self.model, "end2end", False):
|
1132
1123
|
raise ValueError("IMX export is not supported for end2end models.")
|
@@ -1274,81 +1265,12 @@ class Exporter:
|
|
1274
1265
|
|
1275
1266
|
return f, None
|
1276
1267
|
|
1277
|
-
def _add_tflite_metadata(self, file
|
1268
|
+
def _add_tflite_metadata(self, file):
|
1278
1269
|
"""Add metadata to *.tflite models per https://ai.google.dev/edge/litert/models/metadata."""
|
1279
|
-
|
1280
|
-
import zipfile
|
1281
|
-
|
1282
|
-
with zipfile.ZipFile(file, "a", zipfile.ZIP_DEFLATED) as zf:
|
1283
|
-
zf.writestr("metadata.json", json.dumps(self.metadata, indent=2))
|
1284
|
-
return
|
1270
|
+
import zipfile
|
1285
1271
|
|
1286
|
-
|
1287
|
-
|
1288
|
-
|
1289
|
-
# Update old 'flatbuffers' included inside tensorflow package
|
1290
|
-
check_requirements(("tflite_support", "flatbuffers>=23.5.26,<100; platform_machine == 'aarch64'"))
|
1291
|
-
import flatbuffers
|
1292
|
-
|
1293
|
-
try:
|
1294
|
-
# TFLite Support bug https://github.com/tensorflow/tflite-support/issues/954#issuecomment-2108570845
|
1295
|
-
from tensorflow_lite_support.metadata import metadata_schema_py_generated as schema # noqa
|
1296
|
-
from tensorflow_lite_support.metadata.python import metadata # noqa
|
1297
|
-
except ImportError: # ARM64 systems may not have the 'tensorflow_lite_support' package available
|
1298
|
-
from tflite_support import metadata # noqa
|
1299
|
-
from tflite_support import metadata_schema_py_generated as schema # noqa
|
1300
|
-
|
1301
|
-
# Create model info
|
1302
|
-
model_meta = schema.ModelMetadataT()
|
1303
|
-
model_meta.name = self.metadata["description"]
|
1304
|
-
model_meta.version = self.metadata["version"]
|
1305
|
-
model_meta.author = self.metadata["author"]
|
1306
|
-
model_meta.license = self.metadata["license"]
|
1307
|
-
|
1308
|
-
# Label file
|
1309
|
-
tmp_file = Path(file).parent / "temp_meta.txt"
|
1310
|
-
with open(tmp_file, "w", encoding="utf-8") as f:
|
1311
|
-
f.write(str(self.metadata))
|
1312
|
-
|
1313
|
-
label_file = schema.AssociatedFileT()
|
1314
|
-
label_file.name = tmp_file.name
|
1315
|
-
label_file.type = schema.AssociatedFileType.TENSOR_AXIS_LABELS
|
1316
|
-
|
1317
|
-
# Create input info
|
1318
|
-
input_meta = schema.TensorMetadataT()
|
1319
|
-
input_meta.name = "image"
|
1320
|
-
input_meta.description = "Input image to be detected."
|
1321
|
-
input_meta.content = schema.ContentT()
|
1322
|
-
input_meta.content.contentProperties = schema.ImagePropertiesT()
|
1323
|
-
input_meta.content.contentProperties.colorSpace = schema.ColorSpaceType.RGB
|
1324
|
-
input_meta.content.contentPropertiesType = schema.ContentProperties.ImageProperties
|
1325
|
-
|
1326
|
-
# Create output info
|
1327
|
-
output1 = schema.TensorMetadataT()
|
1328
|
-
output1.name = "output"
|
1329
|
-
output1.description = "Coordinates of detected objects, class labels, and confidence score"
|
1330
|
-
output1.associatedFiles = [label_file]
|
1331
|
-
if self.model.task == "segment":
|
1332
|
-
output2 = schema.TensorMetadataT()
|
1333
|
-
output2.name = "output"
|
1334
|
-
output2.description = "Mask protos"
|
1335
|
-
output2.associatedFiles = [label_file]
|
1336
|
-
|
1337
|
-
# Create subgraph info
|
1338
|
-
subgraph = schema.SubGraphMetadataT()
|
1339
|
-
subgraph.inputTensorMetadata = [input_meta]
|
1340
|
-
subgraph.outputTensorMetadata = [output1, output2] if self.model.task == "segment" else [output1]
|
1341
|
-
model_meta.subgraphMetadata = [subgraph]
|
1342
|
-
|
1343
|
-
b = flatbuffers.Builder(0)
|
1344
|
-
b.Finish(model_meta.Pack(b), metadata.MetadataPopulator.METADATA_FILE_IDENTIFIER)
|
1345
|
-
metadata_buf = b.Output()
|
1346
|
-
|
1347
|
-
populator = metadata.MetadataPopulator.with_model_file(str(file))
|
1348
|
-
populator.load_metadata_buffer(metadata_buf)
|
1349
|
-
populator.load_associated_files([str(tmp_file)])
|
1350
|
-
populator.populate()
|
1351
|
-
tmp_file.unlink()
|
1272
|
+
with zipfile.ZipFile(file, "a", zipfile.ZIP_DEFLATED) as zf:
|
1273
|
+
zf.writestr("metadata.json", json.dumps(self.metadata, indent=2))
|
1352
1274
|
|
1353
1275
|
def _pipeline_coreml(self, model, weights_dir=None, prefix=colorstr("CoreML Pipeline:")):
|
1354
1276
|
"""YOLO CoreML pipeline."""
|
@@ -88,8 +88,9 @@ class Tuner:
|
|
88
88
|
"flipud": (0.0, 1.0), # image flip up-down (probability)
|
89
89
|
"fliplr": (0.0, 1.0), # image flip left-right (probability)
|
90
90
|
"bgr": (0.0, 1.0), # image channel bgr (probability)
|
91
|
-
"mosaic": (0.0, 1.0), # image
|
91
|
+
"mosaic": (0.0, 1.0), # image mosaic (probability)
|
92
92
|
"mixup": (0.0, 1.0), # image mixup (probability)
|
93
|
+
"cutmix": (0.0, 1.0), # image cutmix (probability)
|
93
94
|
"copy_paste": (0.0, 1.0), # segment copy-paste (probability)
|
94
95
|
}
|
95
96
|
self.args = get_cfg(overrides=args)
|
@@ -63,6 +63,7 @@ class RTDETRDataset(YOLODataset):
|
|
63
63
|
if self.augment:
|
64
64
|
hyp.mosaic = hyp.mosaic if self.augment and not self.rect else 0.0
|
65
65
|
hyp.mixup = hyp.mixup if self.augment and not self.rect else 0.0
|
66
|
+
hyp.cutmix = hyp.cutmix if self.augment and not self.rect else 0.0
|
66
67
|
transforms = v8_transforms(self, self.imgsz, hyp, stretch=True)
|
67
68
|
else:
|
68
69
|
# transforms = Compose([LetterBox(new_shape=(self.imgsz, self.imgsz), auto=False, scale_fill=True)])
|
@@ -3,7 +3,7 @@
|
|
3
3
|
from ultralytics.data import YOLOConcatDataset, build_grounding, build_yolo_dataset
|
4
4
|
from ultralytics.data.utils import check_det_dataset
|
5
5
|
from ultralytics.models.yolo.world import WorldTrainer
|
6
|
-
from ultralytics.utils import DEFAULT_CFG
|
6
|
+
from ultralytics.utils import DEFAULT_CFG, LOGGER
|
7
7
|
from ultralytics.utils.torch_utils import de_parallel
|
8
8
|
|
9
9
|
|
@@ -93,14 +93,14 @@ class WorldTrainerFromScratch(WorldTrainer):
|
|
93
93
|
"""
|
94
94
|
gs = max(int(de_parallel(self.model).stride.max() if self.model else 0), 32)
|
95
95
|
if mode != "train":
|
96
|
-
return build_yolo_dataset(self.args, img_path, batch, self.data, mode=mode, rect=
|
97
|
-
|
98
|
-
build_yolo_dataset(self.args, im_path, batch, self.
|
96
|
+
return build_yolo_dataset(self.args, img_path, batch, self.data, mode=mode, rect=False, stride=gs)
|
97
|
+
datasets = [
|
98
|
+
build_yolo_dataset(self.args, im_path, batch, self.training_data[im_path], stride=gs, multi_modal=True)
|
99
99
|
if isinstance(im_path, str)
|
100
100
|
else build_grounding(self.args, im_path["img_path"], im_path["json_file"], batch, stride=gs)
|
101
101
|
for im_path in img_path
|
102
102
|
]
|
103
|
-
return YOLOConcatDataset(
|
103
|
+
return YOLOConcatDataset(datasets) if len(datasets) > 1 else datasets[0]
|
104
104
|
|
105
105
|
def get_dataset(self):
|
106
106
|
"""
|
@@ -140,8 +140,20 @@ class WorldTrainerFromScratch(WorldTrainer):
|
|
140
140
|
# NOTE: to make training work properly, set `nc` and `names`
|
141
141
|
final_data["nc"] = data["val"][0]["nc"]
|
142
142
|
final_data["names"] = data["val"][0]["names"]
|
143
|
+
# NOTE: add path with lvis path
|
144
|
+
final_data["path"] = data["val"][0]["path"]
|
143
145
|
final_data["channels"] = data["val"][0]["channels"]
|
144
146
|
self.data = final_data
|
147
|
+
if self.args.single_cls: # consistent with base trainer
|
148
|
+
LOGGER.info("Overriding class names with single class.")
|
149
|
+
self.data["names"] = {0: "object"}
|
150
|
+
self.data["nc"] = 1
|
151
|
+
self.training_data = {}
|
152
|
+
for d in data["train"]:
|
153
|
+
if self.args.single_cls:
|
154
|
+
d["names"] = {0: "object"}
|
155
|
+
d["nc"] = 1
|
156
|
+
self.training_data[d["train"]] = d
|
145
157
|
return final_data["train"], final_data["val"][0]
|
146
158
|
|
147
159
|
def plot_training_labels(self):
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
|
2
2
|
|
3
3
|
from .predict import YOLOEVPDetectPredictor, YOLOEVPSegPredictor
|
4
|
-
from .train import YOLOEPEFreeTrainer, YOLOEPETrainer, YOLOETrainer, YOLOEVPTrainer
|
4
|
+
from .train import YOLOEPEFreeTrainer, YOLOEPETrainer, YOLOETrainer, YOLOETrainerFromScratch, YOLOEVPTrainer
|
5
5
|
from .train_seg import YOLOEPESegTrainer, YOLOESegTrainer, YOLOESegTrainerFromScratch, YOLOESegVPTrainer
|
6
6
|
from .val import YOLOEDetectValidator, YOLOESegValidator
|
7
7
|
|
@@ -18,4 +18,5 @@ __all__ = [
|
|
18
18
|
"YOLOEPEFreeTrainer",
|
19
19
|
"YOLOEVPDetectPredictor",
|
20
20
|
"YOLOEVPSegPredictor",
|
21
|
+
"YOLOETrainerFromScratch",
|
21
22
|
]
|