ultralytics 8.3.216__tar.gz → 8.3.218__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of ultralytics might be problematic. Click here for more details.
- {ultralytics-8.3.216 → ultralytics-8.3.218}/PKG-INFO +1 -1
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/__init__.py +1 -1
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/data/build.py +117 -3
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/engine/results.py +1 -1
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/engine/trainer.py +37 -31
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/engine/validator.py +27 -9
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/yolo/classify/train.py +2 -15
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/yolo/classify/val.py +15 -1
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/yolo/detect/val.py +24 -2
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/yolo/segment/val.py +1 -1
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/nn/autobackend.py +5 -1
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/utils/ops.py +4 -4
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics.egg-info/PKG-INFO +1 -1
- {ultralytics-8.3.216 → ultralytics-8.3.218}/LICENSE +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/README.md +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/pyproject.toml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/setup.cfg +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/tests/__init__.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/tests/conftest.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/tests/test_cli.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/tests/test_cuda.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/tests/test_engine.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/tests/test_exports.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/tests/test_integrations.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/tests/test_python.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/tests/test_solutions.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/assets/bus.jpg +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/assets/zidane.jpg +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/__init__.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/datasets/HomeObjects-3K.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/datasets/VOC.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/datasets/coco.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/datasets/coco128.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/datasets/coco8-grayscale.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/datasets/coco8-multispectral.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/datasets/coco8.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/datasets/construction-ppe.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/datasets/dog-pose.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/datasets/dota8-multispectral.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/datasets/dota8.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/datasets/hand-keypoints.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/datasets/lvis.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/datasets/medical-pills.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/datasets/signature.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/datasets/xView.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/default.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/11/yolo11-cls-resnet18.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/11/yolo11-cls.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/11/yolo11-obb.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/11/yolo11-pose.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/11/yolo11-seg.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/11/yolo11.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/11/yoloe-11-seg.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/11/yoloe-11.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/12/yolo12-cls.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/12/yolo12-obb.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/12/yolo12-pose.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/12/yolo12-seg.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/12/yolo12.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/v10/yolov10b.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/v10/yolov10l.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/v10/yolov10m.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/v10/yolov10n.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/v10/yolov10s.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/v10/yolov10x.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/v8/yoloe-v8-seg.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/v8/yoloe-v8.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/v9/yolov9m.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/v9/yolov9s.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/models/v9/yolov9t.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/trackers/botsort.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/data/__init__.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/data/annotator.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/data/augment.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/data/base.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/data/converter.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/data/dataset.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/data/loaders.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/data/scripts/download_weights.sh +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/data/scripts/get_coco.sh +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/data/scripts/get_coco128.sh +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/data/scripts/get_imagenet.sh +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/data/split.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/data/split_dota.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/data/utils.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/engine/__init__.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/engine/exporter.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/engine/model.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/engine/predictor.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/engine/tuner.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/hub/__init__.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/hub/auth.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/hub/google/__init__.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/hub/session.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/hub/utils.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/__init__.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/fastsam/__init__.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/fastsam/model.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/fastsam/predict.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/fastsam/utils.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/fastsam/val.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/nas/__init__.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/nas/model.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/nas/predict.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/nas/val.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/rtdetr/__init__.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/rtdetr/model.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/rtdetr/predict.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/rtdetr/train.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/rtdetr/val.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/sam/__init__.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/sam/amg.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/sam/build.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/sam/model.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/sam/modules/__init__.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/sam/modules/blocks.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/sam/modules/decoders.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/sam/modules/encoders.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/sam/modules/memory_attention.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/sam/modules/sam.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/sam/modules/transformer.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/sam/modules/utils.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/sam/predict.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/utils/__init__.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/utils/loss.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/utils/ops.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/yolo/__init__.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/yolo/classify/__init__.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/yolo/classify/predict.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/yolo/detect/__init__.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/yolo/detect/predict.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/yolo/detect/train.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/yolo/model.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/yolo/obb/__init__.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/yolo/obb/predict.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/yolo/obb/train.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/yolo/obb/val.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/yolo/pose/__init__.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/yolo/pose/predict.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/yolo/pose/train.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/yolo/pose/val.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/yolo/segment/__init__.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/yolo/segment/predict.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/yolo/segment/train.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/yolo/world/__init__.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/yolo/world/train.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/yolo/world/train_world.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/yolo/yoloe/__init__.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/yolo/yoloe/predict.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/yolo/yoloe/train.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/yolo/yoloe/train_seg.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/models/yolo/yoloe/val.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/nn/__init__.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/nn/modules/__init__.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/nn/modules/activation.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/nn/modules/block.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/nn/modules/conv.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/nn/modules/head.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/nn/modules/transformer.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/nn/modules/utils.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/nn/tasks.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/nn/text_model.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/py.typed +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/solutions/__init__.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/solutions/ai_gym.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/solutions/analytics.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/solutions/config.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/solutions/distance_calculation.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/solutions/heatmap.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/solutions/instance_segmentation.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/solutions/object_blurrer.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/solutions/object_counter.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/solutions/object_cropper.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/solutions/parking_management.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/solutions/queue_management.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/solutions/region_counter.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/solutions/security_alarm.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/solutions/similarity_search.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/solutions/solutions.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/solutions/speed_estimation.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/solutions/streamlit_inference.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/solutions/templates/similarity-search.html +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/solutions/trackzone.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/solutions/vision_eye.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/trackers/__init__.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/trackers/basetrack.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/trackers/bot_sort.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/trackers/byte_tracker.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/trackers/track.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/trackers/utils/__init__.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/trackers/utils/gmc.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/trackers/utils/kalman_filter.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/trackers/utils/matching.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/utils/__init__.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/utils/autobatch.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/utils/autodevice.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/utils/benchmarks.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/utils/callbacks/__init__.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/utils/callbacks/base.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/utils/callbacks/clearml.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/utils/callbacks/comet.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/utils/callbacks/dvc.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/utils/callbacks/hub.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/utils/callbacks/mlflow.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/utils/callbacks/neptune.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/utils/callbacks/platform.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/utils/callbacks/raytune.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/utils/callbacks/tensorboard.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/utils/callbacks/wb.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/utils/checks.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/utils/cpu.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/utils/dist.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/utils/downloads.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/utils/errors.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/utils/events.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/utils/export/__init__.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/utils/export/imx.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/utils/files.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/utils/git.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/utils/instance.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/utils/logger.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/utils/loss.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/utils/metrics.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/utils/nms.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/utils/patches.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/utils/plotting.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/utils/tal.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/utils/torch_utils.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/utils/tqdm.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/utils/triton.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics/utils/tuner.py +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics.egg-info/SOURCES.txt +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics.egg-info/dependency_links.txt +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics.egg-info/entry_points.txt +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/ultralytics.egg-info/requires.txt +0 -0
- {ultralytics-8.3.216 → ultralytics-8.3.218}/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.218
|
|
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>
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
import math
|
|
5
6
|
import os
|
|
6
7
|
import random
|
|
7
8
|
from collections.abc import Iterator
|
|
@@ -11,6 +12,7 @@ from urllib.parse import urlsplit
|
|
|
11
12
|
|
|
12
13
|
import numpy as np
|
|
13
14
|
import torch
|
|
15
|
+
import torch.distributed as dist
|
|
14
16
|
from PIL import Image
|
|
15
17
|
from torch.utils.data import dataloader, distributed
|
|
16
18
|
|
|
@@ -112,6 +114,103 @@ class _RepeatSampler:
|
|
|
112
114
|
yield from iter(self.sampler)
|
|
113
115
|
|
|
114
116
|
|
|
117
|
+
class ContiguousDistributedSampler(torch.utils.data.Sampler):
|
|
118
|
+
"""
|
|
119
|
+
Distributed sampler that assigns contiguous batch-aligned chunks of the dataset to each GPU.
|
|
120
|
+
|
|
121
|
+
Unlike PyTorch's DistributedSampler which distributes samples in a round-robin fashion (GPU 0 gets indices
|
|
122
|
+
[0,2,4,...], GPU 1 gets [1,3,5,...]), this sampler gives each GPU contiguous batches of the dataset
|
|
123
|
+
(GPU 0 gets batches [0,1,2,...], GPU 1 gets batches [k,k+1,...], etc.). This preserves any ordering or
|
|
124
|
+
grouping in the original dataset, which is critical when samples are organized by similarity (e.g., images
|
|
125
|
+
sorted by size to enable efficient batching without padding when using rect=True).
|
|
126
|
+
|
|
127
|
+
The sampler handles uneven batch counts by distributing remainder batches to the first few ranks, ensuring
|
|
128
|
+
all samples are covered exactly once across all GPUs.
|
|
129
|
+
|
|
130
|
+
Args:
|
|
131
|
+
dataset (torch.utils.data.Dataset): Dataset to sample from. Must implement __len__.
|
|
132
|
+
num_replicas (int, optional): Number of distributed processes. Defaults to world size.
|
|
133
|
+
batch_size (int, optional): Batch size used by dataloader. Defaults to dataset batch size.
|
|
134
|
+
rank (int, optional): Rank of current process. Defaults to current rank.
|
|
135
|
+
shuffle (bool, optional): Whether to shuffle indices within each rank's chunk. Defaults to False.
|
|
136
|
+
When True, shuffling is deterministic and controlled by set_epoch() for reproducibility.
|
|
137
|
+
|
|
138
|
+
Example:
|
|
139
|
+
>>> # For validation with size-grouped images
|
|
140
|
+
>>> sampler = ContiguousDistributedSampler(val_dataset, batch_size=32, shuffle=False)
|
|
141
|
+
>>> loader = DataLoader(val_dataset, batch_size=32, sampler=sampler)
|
|
142
|
+
>>> # For training with shuffling
|
|
143
|
+
>>> sampler = ContiguousDistributedSampler(train_dataset, batch_size=32, shuffle=True)
|
|
144
|
+
>>> for epoch in range(num_epochs):
|
|
145
|
+
... sampler.set_epoch(epoch)
|
|
146
|
+
... for batch in loader:
|
|
147
|
+
... ...
|
|
148
|
+
"""
|
|
149
|
+
|
|
150
|
+
def __init__(self, dataset, num_replicas=None, batch_size=None, rank=None, shuffle=False):
|
|
151
|
+
"""Initialize the sampler with dataset and distributed training parameters."""
|
|
152
|
+
if num_replicas is None:
|
|
153
|
+
num_replicas = dist.get_world_size() if dist.is_initialized() else 1
|
|
154
|
+
if rank is None:
|
|
155
|
+
rank = dist.get_rank() if dist.is_initialized() else 0
|
|
156
|
+
if batch_size is None:
|
|
157
|
+
batch_size = getattr(dataset, "batch_size", 1)
|
|
158
|
+
|
|
159
|
+
self.dataset = dataset
|
|
160
|
+
self.num_replicas = num_replicas
|
|
161
|
+
self.batch_size = batch_size
|
|
162
|
+
self.rank = rank
|
|
163
|
+
self.epoch = 0
|
|
164
|
+
self.shuffle = shuffle
|
|
165
|
+
self.total_size = len(dataset)
|
|
166
|
+
self.num_batches = math.ceil(self.total_size / self.batch_size)
|
|
167
|
+
|
|
168
|
+
def _get_rank_indices(self):
|
|
169
|
+
"""Calculate the start and end sample indices for this rank."""
|
|
170
|
+
# Calculate which batches this rank handles
|
|
171
|
+
batches_per_rank_base = self.num_batches // self.num_replicas
|
|
172
|
+
remainder = self.num_batches % self.num_replicas
|
|
173
|
+
|
|
174
|
+
# This rank gets an extra batch if rank < remainder
|
|
175
|
+
batches_for_this_rank = batches_per_rank_base + (1 if self.rank < remainder else 0)
|
|
176
|
+
|
|
177
|
+
# Calculate starting batch: base position + number of extra batches given to earlier ranks
|
|
178
|
+
start_batch = self.rank * batches_per_rank_base + min(self.rank, remainder)
|
|
179
|
+
end_batch = start_batch + batches_for_this_rank
|
|
180
|
+
|
|
181
|
+
# Convert batch indices to sample indices
|
|
182
|
+
start_idx = start_batch * self.batch_size
|
|
183
|
+
end_idx = min(end_batch * self.batch_size, self.total_size)
|
|
184
|
+
|
|
185
|
+
return start_idx, end_idx
|
|
186
|
+
|
|
187
|
+
def __iter__(self):
|
|
188
|
+
"""Generate indices for this rank's contiguous chunk of the dataset."""
|
|
189
|
+
start_idx, end_idx = self._get_rank_indices()
|
|
190
|
+
indices = list(range(start_idx, end_idx))
|
|
191
|
+
|
|
192
|
+
if self.shuffle:
|
|
193
|
+
g = torch.Generator()
|
|
194
|
+
g.manual_seed(self.epoch)
|
|
195
|
+
indices = [indices[i] for i in torch.randperm(len(indices), generator=g).tolist()]
|
|
196
|
+
|
|
197
|
+
return iter(indices)
|
|
198
|
+
|
|
199
|
+
def __len__(self):
|
|
200
|
+
"""Return the number of samples in this rank's chunk."""
|
|
201
|
+
start_idx, end_idx = self._get_rank_indices()
|
|
202
|
+
return end_idx - start_idx
|
|
203
|
+
|
|
204
|
+
def set_epoch(self, epoch):
|
|
205
|
+
"""
|
|
206
|
+
Set the epoch for this sampler to ensure different shuffling patterns across epochs.
|
|
207
|
+
|
|
208
|
+
Args:
|
|
209
|
+
epoch (int): Epoch number to use as the random seed for shuffling.
|
|
210
|
+
"""
|
|
211
|
+
self.epoch = epoch
|
|
212
|
+
|
|
213
|
+
|
|
115
214
|
def seed_worker(worker_id: int): # noqa
|
|
116
215
|
"""Set dataloader worker seed for reproducibility across worker processes."""
|
|
117
216
|
worker_seed = torch.initial_seed() % 2**32
|
|
@@ -181,7 +280,15 @@ def build_grounding(
|
|
|
181
280
|
)
|
|
182
281
|
|
|
183
282
|
|
|
184
|
-
def build_dataloader(
|
|
283
|
+
def build_dataloader(
|
|
284
|
+
dataset,
|
|
285
|
+
batch: int,
|
|
286
|
+
workers: int,
|
|
287
|
+
shuffle: bool = True,
|
|
288
|
+
rank: int = -1,
|
|
289
|
+
drop_last: bool = False,
|
|
290
|
+
pin_memory: bool = True,
|
|
291
|
+
):
|
|
185
292
|
"""
|
|
186
293
|
Create and return an InfiniteDataLoader or DataLoader for training or validation.
|
|
187
294
|
|
|
@@ -192,6 +299,7 @@ def build_dataloader(dataset, batch: int, workers: int, shuffle: bool = True, ra
|
|
|
192
299
|
shuffle (bool, optional): Whether to shuffle the dataset.
|
|
193
300
|
rank (int, optional): Process rank in distributed training. -1 for single-GPU training.
|
|
194
301
|
drop_last (bool, optional): Whether to drop the last incomplete batch.
|
|
302
|
+
pin_memory (bool, optional): Whether to use pinned memory for dataloader.
|
|
195
303
|
|
|
196
304
|
Returns:
|
|
197
305
|
(InfiniteDataLoader): A dataloader that can be used for training or validation.
|
|
@@ -204,7 +312,13 @@ def build_dataloader(dataset, batch: int, workers: int, shuffle: bool = True, ra
|
|
|
204
312
|
batch = min(batch, len(dataset))
|
|
205
313
|
nd = torch.cuda.device_count() # number of CUDA devices
|
|
206
314
|
nw = min(os.cpu_count() // max(nd, 1), workers) # number of workers
|
|
207
|
-
sampler =
|
|
315
|
+
sampler = (
|
|
316
|
+
None
|
|
317
|
+
if rank == -1
|
|
318
|
+
else distributed.DistributedSampler(dataset, shuffle=shuffle)
|
|
319
|
+
if shuffle
|
|
320
|
+
else ContiguousDistributedSampler(dataset)
|
|
321
|
+
)
|
|
208
322
|
generator = torch.Generator()
|
|
209
323
|
generator.manual_seed(6148914691236517205 + RANK)
|
|
210
324
|
return InfiniteDataLoader(
|
|
@@ -214,7 +328,7 @@ def build_dataloader(dataset, batch: int, workers: int, shuffle: bool = True, ra
|
|
|
214
328
|
num_workers=nw,
|
|
215
329
|
sampler=sampler,
|
|
216
330
|
prefetch_factor=4 if nw > 0 else None, # increase over default 2
|
|
217
|
-
pin_memory=nd > 0,
|
|
331
|
+
pin_memory=nd > 0 and pin_memory,
|
|
218
332
|
collate_fn=getattr(dataset, "collate_fn", None),
|
|
219
333
|
worker_init_fn=seed_worker,
|
|
220
334
|
generator=generator,
|
|
@@ -527,7 +527,7 @@ class Results(SimpleClass, DataExportMixin):
|
|
|
527
527
|
"""
|
|
528
528
|
assert color_mode in {"instance", "class"}, f"Expected color_mode='instance' or 'class', not {color_mode}."
|
|
529
529
|
if img is None and isinstance(self.orig_img, torch.Tensor):
|
|
530
|
-
img = (self.orig_img[0].detach().permute(1, 2, 0).contiguous() * 255).
|
|
530
|
+
img = (self.orig_img[0].detach().permute(1, 2, 0).contiguous() * 255).byte().cpu().numpy()
|
|
531
531
|
|
|
532
532
|
names = self.names
|
|
533
533
|
is_obb = self.obb is not None
|
|
@@ -318,18 +318,18 @@ class BaseTrainer:
|
|
|
318
318
|
self.train_loader = self.get_dataloader(
|
|
319
319
|
self.data["train"], batch_size=batch_size, rank=LOCAL_RANK, mode="train"
|
|
320
320
|
)
|
|
321
|
+
# Note: When training DOTA dataset, double batch size could get OOM on images with >2000 objects.
|
|
322
|
+
self.test_loader = self.get_dataloader(
|
|
323
|
+
self.data.get("val") or self.data.get("test"),
|
|
324
|
+
batch_size=batch_size if self.args.task == "obb" else batch_size * 2,
|
|
325
|
+
rank=LOCAL_RANK,
|
|
326
|
+
mode="val",
|
|
327
|
+
)
|
|
328
|
+
self.validator = self.get_validator()
|
|
329
|
+
self.ema = ModelEMA(self.model)
|
|
321
330
|
if RANK in {-1, 0}:
|
|
322
|
-
# Note: When training DOTA dataset, double batch size could get OOM on images with >2000 objects.
|
|
323
|
-
self.test_loader = self.get_dataloader(
|
|
324
|
-
self.data.get("val") or self.data.get("test"),
|
|
325
|
-
batch_size=batch_size if self.args.task == "obb" else batch_size * 2,
|
|
326
|
-
rank=-1,
|
|
327
|
-
mode="val",
|
|
328
|
-
)
|
|
329
|
-
self.validator = self.get_validator()
|
|
330
331
|
metric_keys = self.validator.metrics.keys + self.label_loss_items(prefix="val")
|
|
331
332
|
self.metrics = dict(zip(metric_keys, [0] * len(metric_keys)))
|
|
332
|
-
self.ema = ModelEMA(self.model)
|
|
333
333
|
if self.args.plots:
|
|
334
334
|
self.plot_training_labels()
|
|
335
335
|
|
|
@@ -467,10 +467,10 @@ class BaseTrainer:
|
|
|
467
467
|
final_epoch = epoch + 1 >= self.epochs
|
|
468
468
|
self.ema.update_attr(self.model, include=["yaml", "nc", "args", "names", "stride", "class_weights"])
|
|
469
469
|
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
470
|
+
# Validation
|
|
471
|
+
if self.args.val or final_epoch or self.stopper.possible_stop or self.stop:
|
|
472
|
+
self._clear_memory(threshold=0.5) # prevent VRAM spike
|
|
473
|
+
self.metrics, self.fitness = self.validate()
|
|
474
474
|
|
|
475
475
|
# NaN recovery
|
|
476
476
|
if self._handle_nan_recovery(epoch):
|
|
@@ -510,11 +510,11 @@ class BaseTrainer:
|
|
|
510
510
|
break # must break all DDP ranks
|
|
511
511
|
epoch += 1
|
|
512
512
|
|
|
513
|
+
seconds = time.time() - self.train_time_start
|
|
514
|
+
LOGGER.info(f"\n{epoch - self.start_epoch + 1} epochs completed in {seconds / 3600:.3f} hours.")
|
|
515
|
+
# Do final val with best.pt
|
|
516
|
+
self.final_eval()
|
|
513
517
|
if RANK in {-1, 0}:
|
|
514
|
-
# Do final val with best.pt
|
|
515
|
-
seconds = time.time() - self.train_time_start
|
|
516
|
-
LOGGER.info(f"\n{epoch - self.start_epoch + 1} epochs completed in {seconds / 3600:.3f} hours.")
|
|
517
|
-
self.final_eval()
|
|
518
518
|
if self.args.plots:
|
|
519
519
|
self.plot_metrics()
|
|
520
520
|
self.run_callbacks("on_train_end")
|
|
@@ -695,7 +695,13 @@ class BaseTrainer:
|
|
|
695
695
|
metrics (dict): Dictionary of validation metrics.
|
|
696
696
|
fitness (float): Fitness score for the validation.
|
|
697
697
|
"""
|
|
698
|
+
if self.ema and self.world_size > 1:
|
|
699
|
+
# Sync EMA buffers from rank 0 to all ranks
|
|
700
|
+
for buffer in self.ema.ema.buffers():
|
|
701
|
+
dist.broadcast(buffer, src=0)
|
|
698
702
|
metrics = self.validator(self)
|
|
703
|
+
if metrics is None:
|
|
704
|
+
return None, None
|
|
699
705
|
fitness = metrics.pop("fitness", -self.loss.detach().cpu().numpy()) # use loss as fitness measure if not found
|
|
700
706
|
if not self.best_fitness or self.best_fitness < fitness:
|
|
701
707
|
self.best_fitness = fitness
|
|
@@ -768,20 +774,20 @@ class BaseTrainer:
|
|
|
768
774
|
|
|
769
775
|
def final_eval(self):
|
|
770
776
|
"""Perform final evaluation and validation for object detection YOLO model."""
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
if
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
777
|
+
model = self.best if self.best.exists() else None
|
|
778
|
+
with torch_distributed_zero_first(LOCAL_RANK): # strip only on GPU 0; other GPUs should wait
|
|
779
|
+
if RANK in {-1, 0}:
|
|
780
|
+
ckpt = strip_optimizer(self.last) if self.last.exists() else {}
|
|
781
|
+
if model:
|
|
782
|
+
# update best.pt train_metrics from last.pt
|
|
783
|
+
strip_optimizer(self.best, updates={"train_results": ckpt.get("train_results")})
|
|
784
|
+
if model:
|
|
785
|
+
LOGGER.info(f"\nValidating {model}...")
|
|
786
|
+
self.validator.args.plots = self.args.plots
|
|
787
|
+
self.validator.args.compile = False # disable final val compile as too slow
|
|
788
|
+
self.metrics = self.validator(model=model)
|
|
789
|
+
self.metrics.pop("fitness", None)
|
|
790
|
+
self.run_callbacks("on_fit_epoch_end")
|
|
785
791
|
|
|
786
792
|
def check_resume(self, overrides):
|
|
787
793
|
"""Check if resume checkpoint exists and update arguments accordingly."""
|
|
@@ -29,11 +29,12 @@ from pathlib import Path
|
|
|
29
29
|
|
|
30
30
|
import numpy as np
|
|
31
31
|
import torch
|
|
32
|
+
import torch.distributed as dist
|
|
32
33
|
|
|
33
34
|
from ultralytics.cfg import get_cfg, get_save_dir
|
|
34
35
|
from ultralytics.data.utils import check_cls_dataset, check_det_dataset
|
|
35
36
|
from ultralytics.nn.autobackend import AutoBackend
|
|
36
|
-
from ultralytics.utils import LOGGER, TQDM, callbacks, colorstr, emojis
|
|
37
|
+
from ultralytics.utils import LOGGER, RANK, TQDM, callbacks, colorstr, emojis
|
|
37
38
|
from ultralytics.utils.checks import check_imgsz
|
|
38
39
|
from ultralytics.utils.ops import Profile
|
|
39
40
|
from ultralytics.utils.torch_utils import attempt_compile, select_device, smart_inference_mode, unwrap_model
|
|
@@ -160,7 +161,7 @@ class BaseValidator:
|
|
|
160
161
|
callbacks.add_integration_callbacks(self)
|
|
161
162
|
model = AutoBackend(
|
|
162
163
|
model=model or self.args.model,
|
|
163
|
-
device=select_device(self.args.device),
|
|
164
|
+
device=select_device(self.args.device) if RANK == -1 else torch.device("cuda", RANK),
|
|
164
165
|
dnn=self.args.dnn,
|
|
165
166
|
data=self.args.data,
|
|
166
167
|
fp16=self.args.half,
|
|
@@ -223,21 +224,34 @@ class BaseValidator:
|
|
|
223
224
|
preds = self.postprocess(preds)
|
|
224
225
|
|
|
225
226
|
self.update_metrics(preds, batch)
|
|
226
|
-
if self.args.plots and batch_i < 3:
|
|
227
|
+
if self.args.plots and batch_i < 3 and RANK in {-1, 0}:
|
|
227
228
|
self.plot_val_samples(batch, batch_i)
|
|
228
229
|
self.plot_predictions(batch, preds, batch_i)
|
|
229
230
|
|
|
230
231
|
self.run_callbacks("on_val_batch_end")
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
self.
|
|
234
|
-
|
|
235
|
-
|
|
232
|
+
|
|
233
|
+
stats = {}
|
|
234
|
+
self.gather_stats()
|
|
235
|
+
if RANK in {-1, 0}:
|
|
236
|
+
stats = self.get_stats()
|
|
237
|
+
self.speed = dict(zip(self.speed.keys(), (x.t / len(self.dataloader.dataset) * 1e3 for x in dt)))
|
|
238
|
+
self.finalize_metrics()
|
|
239
|
+
self.print_results()
|
|
240
|
+
self.run_callbacks("on_val_end")
|
|
241
|
+
|
|
236
242
|
if self.training:
|
|
237
243
|
model.float()
|
|
238
|
-
|
|
244
|
+
# Reduce loss across all GPUs
|
|
245
|
+
loss = self.loss.clone().detach()
|
|
246
|
+
if trainer.world_size > 1:
|
|
247
|
+
dist.reduce(loss, dst=0, op=dist.ReduceOp.AVG)
|
|
248
|
+
if RANK > 0:
|
|
249
|
+
return
|
|
250
|
+
results = {**stats, **trainer.label_loss_items(loss.cpu() / len(self.dataloader), prefix="val")}
|
|
239
251
|
return {k: round(float(v), 5) for k, v in results.items()} # return results as 5 decimal place floats
|
|
240
252
|
else:
|
|
253
|
+
if RANK > 0:
|
|
254
|
+
return stats
|
|
241
255
|
LOGGER.info(
|
|
242
256
|
"Speed: {:.1f}ms preprocess, {:.1f}ms inference, {:.1f}ms loss, {:.1f}ms postprocess per image".format(
|
|
243
257
|
*tuple(self.speed.values())
|
|
@@ -336,6 +350,10 @@ class BaseValidator:
|
|
|
336
350
|
"""Return statistics about the model's performance."""
|
|
337
351
|
return {}
|
|
338
352
|
|
|
353
|
+
def gather_stats(self):
|
|
354
|
+
"""Gather statistics from all the GPUs during DDP training to GPU 0."""
|
|
355
|
+
pass
|
|
356
|
+
|
|
339
357
|
def print_results(self):
|
|
340
358
|
"""Print the results of the model's predictions."""
|
|
341
359
|
pass
|
|
@@ -11,9 +11,9 @@ from ultralytics.data import ClassificationDataset, build_dataloader
|
|
|
11
11
|
from ultralytics.engine.trainer import BaseTrainer
|
|
12
12
|
from ultralytics.models import yolo
|
|
13
13
|
from ultralytics.nn.tasks import ClassificationModel
|
|
14
|
-
from ultralytics.utils import DEFAULT_CFG,
|
|
14
|
+
from ultralytics.utils import DEFAULT_CFG, RANK
|
|
15
15
|
from ultralytics.utils.plotting import plot_images
|
|
16
|
-
from ultralytics.utils.torch_utils import is_parallel,
|
|
16
|
+
from ultralytics.utils.torch_utils import is_parallel, torch_distributed_zero_first
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
class ClassificationTrainer(BaseTrainer):
|
|
@@ -194,19 +194,6 @@ class ClassificationTrainer(BaseTrainer):
|
|
|
194
194
|
loss_items = [round(float(loss_items), 5)]
|
|
195
195
|
return dict(zip(keys, loss_items))
|
|
196
196
|
|
|
197
|
-
def final_eval(self):
|
|
198
|
-
"""Evaluate trained model and save validation results."""
|
|
199
|
-
for f in self.last, self.best:
|
|
200
|
-
if f.exists():
|
|
201
|
-
strip_optimizer(f) # strip optimizers
|
|
202
|
-
if f is self.best:
|
|
203
|
-
LOGGER.info(f"\nValidating {f}...")
|
|
204
|
-
self.validator.args.data = self.args.data
|
|
205
|
-
self.validator.args.plots = self.args.plots
|
|
206
|
-
self.metrics = self.validator(model=f)
|
|
207
|
-
self.metrics.pop("fitness", None)
|
|
208
|
-
self.run_callbacks("on_fit_epoch_end")
|
|
209
|
-
|
|
210
197
|
def plot_training_samples(self, batch: dict[str, torch.Tensor], ni: int):
|
|
211
198
|
"""
|
|
212
199
|
Plot training samples with their annotations.
|
|
@@ -6,10 +6,11 @@ from pathlib import Path
|
|
|
6
6
|
from typing import Any
|
|
7
7
|
|
|
8
8
|
import torch
|
|
9
|
+
import torch.distributed as dist
|
|
9
10
|
|
|
10
11
|
from ultralytics.data import ClassificationDataset, build_dataloader
|
|
11
12
|
from ultralytics.engine.validator import BaseValidator
|
|
12
|
-
from ultralytics.utils import LOGGER
|
|
13
|
+
from ultralytics.utils import LOGGER, RANK
|
|
13
14
|
from ultralytics.utils.metrics import ClassifyMetrics, ConfusionMatrix
|
|
14
15
|
from ultralytics.utils.plotting import plot_images
|
|
15
16
|
|
|
@@ -142,6 +143,19 @@ class ClassificationValidator(BaseValidator):
|
|
|
142
143
|
self.metrics.process(self.targets, self.pred)
|
|
143
144
|
return self.metrics.results_dict
|
|
144
145
|
|
|
146
|
+
def gather_stats(self) -> None:
|
|
147
|
+
"""Gather stats from all GPUs."""
|
|
148
|
+
if RANK == 0:
|
|
149
|
+
gathered_preds = [None] * dist.get_world_size()
|
|
150
|
+
gathered_targets = [None] * dist.get_world_size()
|
|
151
|
+
dist.gather_object(self.pred, gathered_preds, dst=0)
|
|
152
|
+
dist.gather_object(self.targets, gathered_targets, dst=0)
|
|
153
|
+
self.pred = [pred for rank in gathered_preds for pred in rank]
|
|
154
|
+
self.targets = [targets for rank in gathered_targets for targets in rank]
|
|
155
|
+
elif RANK > 0:
|
|
156
|
+
dist.gather_object(self.pred, None, dst=0)
|
|
157
|
+
dist.gather_object(self.targets, None, dst=0)
|
|
158
|
+
|
|
145
159
|
def build_dataset(self, img_path: str) -> ClassificationDataset:
|
|
146
160
|
"""Create a ClassificationDataset instance for validation."""
|
|
147
161
|
return ClassificationDataset(root=img_path, args=self.args, augment=False, prefix=self.args.split)
|
|
@@ -8,10 +8,11 @@ from typing import Any
|
|
|
8
8
|
|
|
9
9
|
import numpy as np
|
|
10
10
|
import torch
|
|
11
|
+
import torch.distributed as dist
|
|
11
12
|
|
|
12
13
|
from ultralytics.data import build_dataloader, build_yolo_dataset, converter
|
|
13
14
|
from ultralytics.engine.validator import BaseValidator
|
|
14
|
-
from ultralytics.utils import LOGGER, nms, ops
|
|
15
|
+
from ultralytics.utils import LOGGER, RANK, nms, ops
|
|
15
16
|
from ultralytics.utils.checks import check_requirements
|
|
16
17
|
from ultralytics.utils.metrics import ConfusionMatrix, DetMetrics, box_iou
|
|
17
18
|
from ultralytics.utils.plotting import plot_images
|
|
@@ -226,6 +227,21 @@ class DetectionValidator(BaseValidator):
|
|
|
226
227
|
self.metrics.confusion_matrix = self.confusion_matrix
|
|
227
228
|
self.metrics.save_dir = self.save_dir
|
|
228
229
|
|
|
230
|
+
def gather_stats(self) -> None:
|
|
231
|
+
"""Gather stats from all GPUs."""
|
|
232
|
+
if RANK == 0:
|
|
233
|
+
gathered_stats = [None] * dist.get_world_size()
|
|
234
|
+
dist.gather_object(self.metrics.stats, gathered_stats, dst=0)
|
|
235
|
+
merged_stats = {key: [] for key in self.metrics.stats.keys()}
|
|
236
|
+
for stats_dict in gathered_stats:
|
|
237
|
+
for key in merged_stats.keys():
|
|
238
|
+
merged_stats[key].extend(stats_dict[key])
|
|
239
|
+
self.metrics.stats = merged_stats
|
|
240
|
+
self.seen = len(self.dataloader.dataset) # total image count from dataset
|
|
241
|
+
elif RANK > 0:
|
|
242
|
+
dist.gather_object(self.metrics.stats, None, dst=0)
|
|
243
|
+
self.metrics.clear_stats()
|
|
244
|
+
|
|
229
245
|
def get_stats(self) -> dict[str, Any]:
|
|
230
246
|
"""
|
|
231
247
|
Calculate and return metrics statistics.
|
|
@@ -300,7 +316,13 @@ class DetectionValidator(BaseValidator):
|
|
|
300
316
|
"""
|
|
301
317
|
dataset = self.build_dataset(dataset_path, batch=batch_size, mode="val")
|
|
302
318
|
return build_dataloader(
|
|
303
|
-
dataset,
|
|
319
|
+
dataset,
|
|
320
|
+
batch_size,
|
|
321
|
+
self.args.workers,
|
|
322
|
+
shuffle=False,
|
|
323
|
+
rank=-1,
|
|
324
|
+
drop_last=self.args.compile,
|
|
325
|
+
pin_memory=self.training,
|
|
304
326
|
)
|
|
305
327
|
|
|
306
328
|
def plot_val_samples(self, batch: dict[str, Any], ni: int) -> None:
|
|
@@ -173,7 +173,7 @@ class SegmentationValidator(DetectionValidator):
|
|
|
173
173
|
if gt_cls.shape[0] == 0 or preds["cls"].shape[0] == 0:
|
|
174
174
|
tp_m = np.zeros((preds["cls"].shape[0], self.niou), dtype=bool)
|
|
175
175
|
else:
|
|
176
|
-
iou = mask_iou(batch["masks"].flatten(1), preds["masks"].flatten(1))
|
|
176
|
+
iou = mask_iou(batch["masks"].flatten(1), preds["masks"].flatten(1).float()) # float, uint8
|
|
177
177
|
tp_m = self.match_predictions(preds["cls"], gt_cls, iou).cpu().numpy()
|
|
178
178
|
tp.update({"tp_m": tp_m}) # update tp with mask IoU
|
|
179
179
|
return tp
|
|
@@ -19,6 +19,7 @@ from PIL import Image
|
|
|
19
19
|
from ultralytics.utils import ARM64, IS_JETSON, LINUX, LOGGER, PYTHON_VERSION, ROOT, YAML, is_jetson
|
|
20
20
|
from ultralytics.utils.checks import check_requirements, check_suffix, check_version, check_yaml, is_rockchip
|
|
21
21
|
from ultralytics.utils.downloads import attempt_download_asset, is_url
|
|
22
|
+
from ultralytics.utils.nms import non_max_suppression
|
|
22
23
|
|
|
23
24
|
|
|
24
25
|
def check_class_names(names: list | dict) -> dict[int, str]:
|
|
@@ -854,7 +855,10 @@ class AutoBackend(nn.Module):
|
|
|
854
855
|
if any(warmup_types) and (self.device.type != "cpu" or self.triton):
|
|
855
856
|
im = torch.empty(*imgsz, dtype=torch.half if self.fp16 else torch.float, device=self.device) # input
|
|
856
857
|
for _ in range(2 if self.jit else 1):
|
|
857
|
-
self.forward(im) # warmup
|
|
858
|
+
self.forward(im) # warmup model
|
|
859
|
+
warmup_boxes = torch.rand(1, 84, 16, device=self.device) # 16 boxes works best empirically
|
|
860
|
+
warmup_boxes[:, :4] *= imgsz[-1]
|
|
861
|
+
non_max_suppression(warmup_boxes) # warmup NMS
|
|
858
862
|
|
|
859
863
|
@staticmethod
|
|
860
864
|
def _model_type(p: str = "path/to/model.pt") -> list[bool]:
|
|
@@ -557,7 +557,7 @@ def process_mask(protos, masks_in, bboxes, shape, upsample: bool = False):
|
|
|
557
557
|
masks = crop_mask(masks, boxes=bboxes * ratios) # CHW
|
|
558
558
|
if upsample:
|
|
559
559
|
masks = F.interpolate(masks[None], shape, mode="bilinear")[0] # CHW
|
|
560
|
-
return masks.gt_(0.0)
|
|
560
|
+
return masks.gt_(0.0).byte()
|
|
561
561
|
|
|
562
562
|
|
|
563
563
|
def process_mask_native(protos, masks_in, bboxes, shape):
|
|
@@ -577,7 +577,7 @@ def process_mask_native(protos, masks_in, bboxes, shape):
|
|
|
577
577
|
masks = (masks_in @ protos.float().view(c, -1)).view(-1, mh, mw)
|
|
578
578
|
masks = scale_masks(masks[None], shape)[0] # CHW
|
|
579
579
|
masks = crop_mask(masks, bboxes) # CHW
|
|
580
|
-
return masks.gt_(0.0)
|
|
580
|
+
return masks.gt_(0.0).byte()
|
|
581
581
|
|
|
582
582
|
|
|
583
583
|
def scale_masks(masks, shape, padding: bool = True):
|
|
@@ -674,7 +674,7 @@ def masks2segments(masks, strategy: str = "all"):
|
|
|
674
674
|
from ultralytics.data.converter import merge_multi_segment
|
|
675
675
|
|
|
676
676
|
segments = []
|
|
677
|
-
for x in masks.
|
|
677
|
+
for x in masks.byte().cpu().numpy():
|
|
678
678
|
c = cv2.findContours(x, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
|
|
679
679
|
if c:
|
|
680
680
|
if strategy == "all": # merge and concatenate all segments
|
|
@@ -701,7 +701,7 @@ def convert_torch2numpy_batch(batch: torch.Tensor) -> np.ndarray:
|
|
|
701
701
|
Returns:
|
|
702
702
|
(np.ndarray): Output NumPy array batch with shape (Batch, Height, Width, Channels) and dtype uint8.
|
|
703
703
|
"""
|
|
704
|
-
return (batch.permute(0, 2, 3, 1).contiguous() * 255).clamp(0, 255).
|
|
704
|
+
return (batch.permute(0, 2, 3, 1).contiguous() * 255).clamp(0, 255).byte().cpu().numpy()
|
|
705
705
|
|
|
706
706
|
|
|
707
707
|
def clean_str(s):
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ultralytics
|
|
3
|
-
Version: 8.3.
|
|
3
|
+
Version: 8.3.218
|
|
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>
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|