ultralytics 8.3.217__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.217 → ultralytics-8.3.218}/PKG-INFO +1 -1
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/__init__.py +1 -1
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/data/build.py +106 -1
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/engine/trainer.py +37 -31
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/engine/validator.py +27 -9
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/yolo/classify/train.py +2 -15
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/yolo/classify/val.py +15 -1
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/yolo/detect/val.py +17 -1
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics.egg-info/PKG-INFO +1 -1
- {ultralytics-8.3.217 → ultralytics-8.3.218}/LICENSE +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/README.md +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/pyproject.toml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/setup.cfg +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/tests/__init__.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/tests/conftest.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/tests/test_cli.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/tests/test_cuda.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/tests/test_engine.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/tests/test_exports.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/tests/test_integrations.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/tests/test_python.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/tests/test_solutions.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/assets/bus.jpg +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/assets/zidane.jpg +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/__init__.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/datasets/HomeObjects-3K.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/datasets/VOC.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/datasets/coco.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/datasets/coco128.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/datasets/coco8-grayscale.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/datasets/coco8-multispectral.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/datasets/coco8.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/datasets/construction-ppe.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/datasets/dog-pose.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/datasets/dota8-multispectral.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/datasets/dota8.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/datasets/hand-keypoints.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/datasets/lvis.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/datasets/medical-pills.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/datasets/signature.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/datasets/xView.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/default.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/11/yolo11-cls-resnet18.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/11/yolo11-cls.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/11/yolo11-obb.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/11/yolo11-pose.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/11/yolo11-seg.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/11/yolo11.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/11/yoloe-11-seg.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/11/yoloe-11.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/12/yolo12-cls.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/12/yolo12-obb.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/12/yolo12-pose.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/12/yolo12-seg.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/12/yolo12.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/v10/yolov10b.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/v10/yolov10l.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/v10/yolov10m.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/v10/yolov10n.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/v10/yolov10s.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/v10/yolov10x.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/v8/yoloe-v8-seg.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/v8/yoloe-v8.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/v9/yolov9m.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/v9/yolov9s.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/v9/yolov9t.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/trackers/botsort.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/data/__init__.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/data/annotator.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/data/augment.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/data/base.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/data/converter.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/data/dataset.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/data/loaders.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/data/scripts/download_weights.sh +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/data/scripts/get_coco.sh +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/data/scripts/get_coco128.sh +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/data/scripts/get_imagenet.sh +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/data/split.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/data/split_dota.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/data/utils.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/engine/__init__.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/engine/exporter.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/engine/model.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/engine/predictor.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/engine/results.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/engine/tuner.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/hub/__init__.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/hub/auth.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/hub/google/__init__.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/hub/session.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/hub/utils.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/__init__.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/fastsam/__init__.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/fastsam/model.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/fastsam/predict.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/fastsam/utils.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/fastsam/val.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/nas/__init__.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/nas/model.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/nas/predict.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/nas/val.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/rtdetr/__init__.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/rtdetr/model.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/rtdetr/predict.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/rtdetr/train.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/rtdetr/val.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/sam/__init__.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/sam/amg.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/sam/build.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/sam/model.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/sam/modules/__init__.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/sam/modules/blocks.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/sam/modules/decoders.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/sam/modules/encoders.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/sam/modules/memory_attention.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/sam/modules/sam.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/sam/modules/transformer.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/sam/modules/utils.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/sam/predict.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/utils/__init__.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/utils/loss.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/utils/ops.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/yolo/__init__.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/yolo/classify/__init__.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/yolo/classify/predict.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/yolo/detect/__init__.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/yolo/detect/predict.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/yolo/detect/train.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/yolo/model.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/yolo/obb/__init__.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/yolo/obb/predict.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/yolo/obb/train.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/yolo/obb/val.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/yolo/pose/__init__.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/yolo/pose/predict.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/yolo/pose/train.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/yolo/pose/val.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/yolo/segment/__init__.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/yolo/segment/predict.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/yolo/segment/train.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/yolo/segment/val.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/yolo/world/__init__.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/yolo/world/train.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/yolo/world/train_world.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/yolo/yoloe/__init__.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/yolo/yoloe/predict.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/yolo/yoloe/train.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/yolo/yoloe/train_seg.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/models/yolo/yoloe/val.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/nn/__init__.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/nn/autobackend.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/nn/modules/__init__.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/nn/modules/activation.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/nn/modules/block.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/nn/modules/conv.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/nn/modules/head.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/nn/modules/transformer.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/nn/modules/utils.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/nn/tasks.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/nn/text_model.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/py.typed +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/solutions/__init__.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/solutions/ai_gym.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/solutions/analytics.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/solutions/config.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/solutions/distance_calculation.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/solutions/heatmap.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/solutions/instance_segmentation.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/solutions/object_blurrer.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/solutions/object_counter.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/solutions/object_cropper.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/solutions/parking_management.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/solutions/queue_management.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/solutions/region_counter.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/solutions/security_alarm.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/solutions/similarity_search.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/solutions/solutions.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/solutions/speed_estimation.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/solutions/streamlit_inference.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/solutions/templates/similarity-search.html +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/solutions/trackzone.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/solutions/vision_eye.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/trackers/__init__.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/trackers/basetrack.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/trackers/bot_sort.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/trackers/byte_tracker.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/trackers/track.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/trackers/utils/__init__.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/trackers/utils/gmc.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/trackers/utils/kalman_filter.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/trackers/utils/matching.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/utils/__init__.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/utils/autobatch.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/utils/autodevice.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/utils/benchmarks.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/utils/callbacks/__init__.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/utils/callbacks/base.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/utils/callbacks/clearml.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/utils/callbacks/comet.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/utils/callbacks/dvc.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/utils/callbacks/hub.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/utils/callbacks/mlflow.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/utils/callbacks/neptune.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/utils/callbacks/platform.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/utils/callbacks/raytune.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/utils/callbacks/tensorboard.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/utils/callbacks/wb.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/utils/checks.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/utils/cpu.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/utils/dist.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/utils/downloads.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/utils/errors.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/utils/events.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/utils/export/__init__.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/utils/export/imx.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/utils/files.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/utils/git.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/utils/instance.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/utils/logger.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/utils/loss.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/utils/metrics.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/utils/nms.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/utils/ops.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/utils/patches.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/utils/plotting.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/utils/tal.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/utils/torch_utils.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/utils/tqdm.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/utils/triton.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/utils/tuner.py +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics.egg-info/SOURCES.txt +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics.egg-info/dependency_links.txt +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics.egg-info/entry_points.txt +0 -0
- {ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics.egg-info/requires.txt +0 -0
- {ultralytics-8.3.217 → 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
|
|
@@ -213,7 +312,13 @@ def build_dataloader(
|
|
|
213
312
|
batch = min(batch, len(dataset))
|
|
214
313
|
nd = torch.cuda.device_count() # number of CUDA devices
|
|
215
314
|
nw = min(os.cpu_count() // max(nd, 1), workers) # number of workers
|
|
216
|
-
sampler =
|
|
315
|
+
sampler = (
|
|
316
|
+
None
|
|
317
|
+
if rank == -1
|
|
318
|
+
else distributed.DistributedSampler(dataset, shuffle=shuffle)
|
|
319
|
+
if shuffle
|
|
320
|
+
else ContiguousDistributedSampler(dataset)
|
|
321
|
+
)
|
|
217
322
|
generator = torch.Generator()
|
|
218
323
|
generator.manual_seed(6148914691236517205 + RANK)
|
|
219
324
|
return InfiniteDataLoader(
|
|
@@ -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.
|
|
@@ -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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/datasets/coco8-multispectral.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/datasets/dota8-multispectral.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/11/yolo11-cls-resnet18.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml
RENAMED
|
File without changes
|
{ultralytics-8.3.217 → ultralytics-8.3.218}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|