ultralytics 8.1.25__tar.gz → 8.1.27__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.1.25/ultralytics.egg-info → ultralytics-8.1.27}/PKG-INFO +1 -1
- {ultralytics-8.1.25 → ultralytics-8.1.27}/tests/test_cli.py +2 -2
- {ultralytics-8.1.25 → ultralytics-8.1.27}/tests/test_integrations.py +28 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/tests/test_python.py +2 -3
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/__init__.py +1 -1
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/__init__.py +1 -1
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/data/base.py +3 -1
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/data/build.py +7 -6
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/data/loaders.py +75 -53
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/engine/model.py +2 -1
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/engine/predictor.py +96 -106
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/engine/validator.py +1 -1
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/rtdetr/model.py +0 -2
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/rtdetr/predict.py +4 -1
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/rtdetr/val.py +3 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/nn/autobackend.py +6 -2
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/trackers/track.py +11 -5
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/callbacks/mlflow.py +7 -1
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/checks.py +1 -1
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/files.py +41 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27/ultralytics.egg-info}/PKG-INFO +1 -1
- {ultralytics-8.1.25 → ultralytics-8.1.27}/LICENSE +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/README.md +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/pyproject.toml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/setup.cfg +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/tests/test_cuda.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/tests/test_engine.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/tests/test_explorer.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/assets/bus.jpg +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/assets/zidane.jpg +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/datasets/VOC.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/datasets/coco.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/datasets/coco128.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/datasets/coco8.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/datasets/dota8.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/datasets/xView.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/default.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/trackers/botsort.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/data/__init__.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/data/annotator.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/data/augment.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/data/converter.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/data/dataset.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/data/explorer/__init__.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/data/explorer/explorer.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/data/explorer/gui/__init__.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/data/explorer/gui/dash.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/data/explorer/utils.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/data/split_dota.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/data/utils.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/engine/__init__.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/engine/exporter.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/engine/results.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/engine/trainer.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/engine/tuner.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/hub/__init__.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/hub/auth.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/hub/session.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/hub/utils.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/__init__.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/fastsam/__init__.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/fastsam/model.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/fastsam/predict.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/fastsam/prompt.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/fastsam/utils.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/fastsam/val.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/nas/__init__.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/nas/model.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/nas/predict.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/nas/val.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/rtdetr/__init__.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/rtdetr/train.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/sam/__init__.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/sam/amg.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/sam/build.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/sam/model.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/sam/modules/__init__.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/sam/modules/decoders.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/sam/modules/encoders.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/sam/modules/sam.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/sam/modules/transformer.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/sam/predict.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/utils/__init__.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/utils/loss.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/utils/ops.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/yolo/__init__.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/yolo/classify/__init__.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/yolo/classify/predict.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/yolo/classify/train.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/yolo/classify/val.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/yolo/detect/__init__.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/yolo/detect/predict.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/yolo/detect/train.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/yolo/detect/val.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/yolo/model.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/yolo/obb/__init__.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/yolo/obb/predict.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/yolo/obb/train.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/yolo/obb/val.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/yolo/pose/__init__.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/yolo/pose/predict.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/yolo/pose/train.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/yolo/pose/val.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/yolo/segment/__init__.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/yolo/segment/predict.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/yolo/segment/train.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/yolo/segment/val.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/nn/__init__.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/nn/modules/__init__.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/nn/modules/block.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/nn/modules/conv.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/nn/modules/head.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/nn/modules/transformer.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/nn/modules/utils.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/nn/tasks.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/solutions/__init__.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/solutions/ai_gym.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/solutions/distance_calculation.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/solutions/heatmap.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/solutions/object_counter.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/solutions/speed_estimation.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/trackers/__init__.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/trackers/basetrack.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/trackers/bot_sort.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/trackers/byte_tracker.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/trackers/utils/__init__.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/trackers/utils/gmc.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/trackers/utils/kalman_filter.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/trackers/utils/matching.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/__init__.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/autobatch.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/benchmarks.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/callbacks/__init__.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/callbacks/base.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/callbacks/clearml.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/callbacks/comet.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/callbacks/dvc.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/callbacks/hub.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/callbacks/neptune.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/callbacks/raytune.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/callbacks/tensorboard.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/callbacks/wb.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/dist.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/downloads.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/errors.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/instance.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/loss.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/metrics.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/ops.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/patches.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/plotting.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/tal.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/torch_utils.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/triton.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/tuner.py +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics.egg-info/SOURCES.txt +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics.egg-info/dependency_links.txt +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics.egg-info/entry_points.txt +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics.egg-info/requires.txt +0 -0
- {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: ultralytics
|
|
3
|
-
Version: 8.1.
|
|
3
|
+
Version: 8.1.27
|
|
4
4
|
Summary: Ultralytics YOLOv8 for SOTA object detection, multi-object tracking, instance segmentation, pose estimation and image classification.
|
|
5
5
|
Author: Glenn Jocher, Ayush Chaurasia, Jing Qiu
|
|
6
6
|
Maintainer: Glenn Jocher, Ayush Chaurasia, Jing Qiu
|
|
@@ -65,8 +65,8 @@ def test_export(model, format):
|
|
|
65
65
|
def test_rtdetr(task="detect", model="yolov8n-rtdetr.yaml", data="coco8.yaml"):
|
|
66
66
|
"""Test the RTDETR functionality with the Ultralytics framework."""
|
|
67
67
|
# Warning: MUST use imgsz=640
|
|
68
|
-
run(f"yolo train {task} model={model} data={data} --imgsz=
|
|
69
|
-
run(f"yolo predict {task} model={model} source={ASSETS / 'bus.jpg'} imgsz=
|
|
68
|
+
run(f"yolo train {task} model={model} data={data} --imgsz= 160 epochs =1, cache = disk") # add coma, spaces to args
|
|
69
|
+
run(f"yolo predict {task} model={model} source={ASSETS / 'bus.jpg'} imgsz=160 save save_crop save_txt")
|
|
70
70
|
|
|
71
71
|
|
|
72
72
|
@pytest.mark.skipif(checks.IS_PYTHON_3_12, reason="MobileSAM Clip is not supported in Python 3.12")
|
|
@@ -29,6 +29,34 @@ def test_mlflow():
|
|
|
29
29
|
SETTINGS["mlflow"] = True
|
|
30
30
|
YOLO("yolov8n-cls.yaml").train(data="imagenet10", imgsz=32, epochs=3, plots=False, device="cpu")
|
|
31
31
|
|
|
32
|
+
@pytest.mark.skipif(not check_requirements('mlflow', install=False), reason='mlflow not installed')
|
|
33
|
+
def test_mlflow_keep_run_active():
|
|
34
|
+
import os
|
|
35
|
+
import mlflow
|
|
36
|
+
"""Test training with MLflow tracking enabled."""
|
|
37
|
+
SETTINGS['mlflow'] = True
|
|
38
|
+
run_name = 'Test Run'
|
|
39
|
+
os.environ['MLFLOW_RUN'] = run_name
|
|
40
|
+
|
|
41
|
+
# Test with MLFLOW_KEEP_RUN_ACTIVE=True
|
|
42
|
+
os.environ['MLFLOW_KEEP_RUN_ACTIVE'] = 'True'
|
|
43
|
+
YOLO('yolov8n-cls.yaml').train(data='imagenet10', imgsz=32, epochs=1, plots=False, device='cpu')
|
|
44
|
+
status = mlflow.active_run().info.status
|
|
45
|
+
assert status == 'RUNNING', "MLflow run should be active when MLFLOW_KEEP_RUN_ACTIVE=True"
|
|
46
|
+
|
|
47
|
+
run_id = mlflow.active_run().info.run_id
|
|
48
|
+
|
|
49
|
+
# Test with MLFLOW_KEEP_RUN_ACTIVE=False
|
|
50
|
+
os.environ['MLFLOW_KEEP_RUN_ACTIVE'] = 'False'
|
|
51
|
+
YOLO('yolov8n-cls.yaml').train(data='imagenet10', imgsz=32, epochs=1, plots=False, device='cpu')
|
|
52
|
+
status = mlflow.get_run(run_id=run_id).info.status
|
|
53
|
+
assert status == 'FINISHED', "MLflow run should be ended when MLFLOW_KEEP_RUN_ACTIVE=False"
|
|
54
|
+
|
|
55
|
+
# Test with MLFLOW_KEEP_RUN_ACTIVE not set
|
|
56
|
+
os.environ.pop('MLFLOW_KEEP_RUN_ACTIVE', None)
|
|
57
|
+
YOLO('yolov8n-cls.yaml').train(data='imagenet10', imgsz=32, epochs=1, plots=False, device='cpu')
|
|
58
|
+
status = mlflow.get_run(run_id=run_id).info.status
|
|
59
|
+
assert status == 'FINISHED', "MLflow run should be ended by default when MLFLOW_KEEP_RUN_ACTIVE is not set"
|
|
32
60
|
|
|
33
61
|
@pytest.mark.skipif(not check_requirements("tritonclient", install=False), reason="tritonclient[all] not installed")
|
|
34
62
|
def test_triton():
|
|
@@ -8,6 +8,7 @@ import cv2
|
|
|
8
8
|
import numpy as np
|
|
9
9
|
import pytest
|
|
10
10
|
import torch
|
|
11
|
+
import yaml
|
|
11
12
|
from PIL import Image
|
|
12
13
|
from torchvision.transforms import ToTensor
|
|
13
14
|
|
|
@@ -169,8 +170,6 @@ def test_track_stream():
|
|
|
169
170
|
|
|
170
171
|
Note imgsz=160 required for tracking for higher confidence and better matches
|
|
171
172
|
"""
|
|
172
|
-
import yaml
|
|
173
|
-
|
|
174
173
|
video_url = "https://ultralytics.com/assets/decelera_portrait_min.mov"
|
|
175
174
|
model = YOLO(MODEL)
|
|
176
175
|
model.track(video_url, imgsz=160, tracker="bytetrack.yaml")
|
|
@@ -302,7 +301,7 @@ def test_predict_callback_and_setup():
|
|
|
302
301
|
|
|
303
302
|
def on_predict_batch_end(predictor):
|
|
304
303
|
"""Callback function that handles operations at the end of a prediction batch."""
|
|
305
|
-
path, im0s, _
|
|
304
|
+
path, im0s, _ = predictor.batch
|
|
306
305
|
im0s = im0s if isinstance(im0s, list) else [im0s]
|
|
307
306
|
bs = [predictor.dataset.bs for _ in range(len(path))]
|
|
308
307
|
predictor.results = zip(predictor.results, im0s, bs) # results is List[batch_size]
|
|
@@ -396,7 +396,7 @@ def handle_yolo_settings(args: List[str]) -> None:
|
|
|
396
396
|
def handle_explorer():
|
|
397
397
|
"""Open the Ultralytics Explorer GUI."""
|
|
398
398
|
checks.check_requirements("streamlit")
|
|
399
|
-
LOGGER.info(
|
|
399
|
+
LOGGER.info("💡 Loading Explorer dashboard...")
|
|
400
400
|
subprocess.run(["streamlit", "run", ROOT / "data/explorer/gui/dash.py", "--server.maxMessageSize", "2048"])
|
|
401
401
|
|
|
402
402
|
|
|
@@ -120,7 +120,9 @@ class BaseDataset(Dataset):
|
|
|
120
120
|
except Exception as e:
|
|
121
121
|
raise FileNotFoundError(f"{self.prefix}Error loading data from {img_path}\n{HELP_URL}") from e
|
|
122
122
|
if self.fraction < 1:
|
|
123
|
-
im_files = im_files[: round(len(im_files) * self.fraction)]
|
|
123
|
+
# im_files = im_files[: round(len(im_files) * self.fraction)]
|
|
124
|
+
num_elements_to_select = round(len(im_files) * self.fraction)
|
|
125
|
+
im_files = random.sample(im_files, num_elements_to_select)
|
|
124
126
|
return im_files
|
|
125
127
|
|
|
126
128
|
def update_labels(self, include_class: Optional[list]):
|
|
@@ -11,7 +11,7 @@ from torch.utils.data import dataloader, distributed
|
|
|
11
11
|
|
|
12
12
|
from ultralytics.data.loaders import (
|
|
13
13
|
LOADERS,
|
|
14
|
-
|
|
14
|
+
LoadImagesAndVideos,
|
|
15
15
|
LoadPilAndNumpy,
|
|
16
16
|
LoadScreenshots,
|
|
17
17
|
LoadStreams,
|
|
@@ -150,34 +150,35 @@ def check_source(source):
|
|
|
150
150
|
return source, webcam, screenshot, from_img, in_memory, tensor
|
|
151
151
|
|
|
152
152
|
|
|
153
|
-
def load_inference_source(source=None, vid_stride=1, buffer=False):
|
|
153
|
+
def load_inference_source(source=None, batch=1, vid_stride=1, buffer=False):
|
|
154
154
|
"""
|
|
155
155
|
Loads an inference source for object detection and applies necessary transformations.
|
|
156
156
|
|
|
157
157
|
Args:
|
|
158
158
|
source (str, Path, Tensor, PIL.Image, np.ndarray): The input source for inference.
|
|
159
|
+
batch (int, optional): Batch size for dataloaders. Default is 1.
|
|
159
160
|
vid_stride (int, optional): The frame interval for video sources. Default is 1.
|
|
160
161
|
buffer (bool, optional): Determined whether stream frames will be buffered. Default is False.
|
|
161
162
|
|
|
162
163
|
Returns:
|
|
163
164
|
dataset (Dataset): A dataset object for the specified input source.
|
|
164
165
|
"""
|
|
165
|
-
source,
|
|
166
|
-
source_type = source.source_type if in_memory else SourceTypes(
|
|
166
|
+
source, stream, screenshot, from_img, in_memory, tensor = check_source(source)
|
|
167
|
+
source_type = source.source_type if in_memory else SourceTypes(stream, screenshot, from_img, tensor)
|
|
167
168
|
|
|
168
169
|
# Dataloader
|
|
169
170
|
if tensor:
|
|
170
171
|
dataset = LoadTensor(source)
|
|
171
172
|
elif in_memory:
|
|
172
173
|
dataset = source
|
|
173
|
-
elif
|
|
174
|
+
elif stream:
|
|
174
175
|
dataset = LoadStreams(source, vid_stride=vid_stride, buffer=buffer)
|
|
175
176
|
elif screenshot:
|
|
176
177
|
dataset = LoadScreenshots(source)
|
|
177
178
|
elif from_img:
|
|
178
179
|
dataset = LoadPilAndNumpy(source)
|
|
179
180
|
else:
|
|
180
|
-
dataset =
|
|
181
|
+
dataset = LoadImagesAndVideos(source, batch=batch, vid_stride=vid_stride)
|
|
181
182
|
|
|
182
183
|
# Attach source types to the dataset
|
|
183
184
|
setattr(dataset, "source_type", source_type)
|
|
@@ -24,7 +24,7 @@ from ultralytics.utils.checks import check_requirements
|
|
|
24
24
|
class SourceTypes:
|
|
25
25
|
"""Class to represent various types of input sources for predictions."""
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
stream: bool = False
|
|
28
28
|
screenshot: bool = False
|
|
29
29
|
from_img: bool = False
|
|
30
30
|
tensor: bool = False
|
|
@@ -32,9 +32,7 @@ class SourceTypes:
|
|
|
32
32
|
|
|
33
33
|
class LoadStreams:
|
|
34
34
|
"""
|
|
35
|
-
Stream Loader for various types of video streams.
|
|
36
|
-
|
|
37
|
-
Suitable for use with `yolo predict source='rtsp://example.com/media.mp4'`, supports RTSP, RTMP, HTTP, and TCP streams.
|
|
35
|
+
Stream Loader for various types of video streams, Supports RTSP, RTMP, HTTP, and TCP streams.
|
|
38
36
|
|
|
39
37
|
Attributes:
|
|
40
38
|
sources (str): The source input paths or URLs for the video streams.
|
|
@@ -57,6 +55,11 @@ class LoadStreams:
|
|
|
57
55
|
__iter__: Returns an iterator object for the class.
|
|
58
56
|
__next__: Returns source paths, transformed, and original images for processing.
|
|
59
57
|
__len__: Return the length of the sources object.
|
|
58
|
+
|
|
59
|
+
Example:
|
|
60
|
+
```bash
|
|
61
|
+
yolo predict source='rtsp://example.com/media.mp4'
|
|
62
|
+
```
|
|
60
63
|
"""
|
|
61
64
|
|
|
62
65
|
def __init__(self, sources="file.streams", vid_stride=1, buffer=False):
|
|
@@ -69,6 +72,7 @@ class LoadStreams:
|
|
|
69
72
|
|
|
70
73
|
sources = Path(sources).read_text().rsplit() if os.path.isfile(sources) else [sources]
|
|
71
74
|
n = len(sources)
|
|
75
|
+
self.bs = n
|
|
72
76
|
self.fps = [0] * n # frames per second
|
|
73
77
|
self.frames = [0] * n
|
|
74
78
|
self.threads = [None] * n
|
|
@@ -109,9 +113,6 @@ class LoadStreams:
|
|
|
109
113
|
self.threads[i].start()
|
|
110
114
|
LOGGER.info("") # newline
|
|
111
115
|
|
|
112
|
-
# Check for common shapes
|
|
113
|
-
self.bs = self.__len__()
|
|
114
|
-
|
|
115
116
|
def update(self, i, cap, stream):
|
|
116
117
|
"""Read stream `i` frames in daemon thread."""
|
|
117
118
|
n, f = 0, self.frames[i] # frame number, frame array
|
|
@@ -175,11 +176,11 @@ class LoadStreams:
|
|
|
175
176
|
images.append(x.pop(-1) if x else np.zeros(self.shape[i], dtype=np.uint8))
|
|
176
177
|
x.clear()
|
|
177
178
|
|
|
178
|
-
return self.sources, images,
|
|
179
|
+
return self.sources, images, [""] * self.bs
|
|
179
180
|
|
|
180
181
|
def __len__(self):
|
|
181
182
|
"""Return the length of the sources object."""
|
|
182
|
-
return
|
|
183
|
+
return self.bs # 1E12 frames = 32 streams at 30 FPS for 30 years
|
|
183
184
|
|
|
184
185
|
|
|
185
186
|
class LoadScreenshots:
|
|
@@ -224,6 +225,7 @@ class LoadScreenshots:
|
|
|
224
225
|
self.frame = 0
|
|
225
226
|
self.sct = mss.mss()
|
|
226
227
|
self.bs = 1
|
|
228
|
+
self.fps = 30
|
|
227
229
|
|
|
228
230
|
# Parse monitor shape
|
|
229
231
|
monitor = self.sct.monitors[self.screen]
|
|
@@ -243,10 +245,10 @@ class LoadScreenshots:
|
|
|
243
245
|
s = f"screen {self.screen} (LTWH): {self.left},{self.top},{self.width},{self.height}: "
|
|
244
246
|
|
|
245
247
|
self.frame += 1
|
|
246
|
-
return [str(self.screen)], [im0],
|
|
248
|
+
return [str(self.screen)], [im0], [s] # screen, img, string
|
|
247
249
|
|
|
248
250
|
|
|
249
|
-
class
|
|
251
|
+
class LoadImagesAndVideos:
|
|
250
252
|
"""
|
|
251
253
|
YOLOv8 image/video dataloader.
|
|
252
254
|
|
|
@@ -269,7 +271,7 @@ class LoadImages:
|
|
|
269
271
|
_new_video(path): Create a new cv2.VideoCapture object for a given video path.
|
|
270
272
|
"""
|
|
271
273
|
|
|
272
|
-
def __init__(self, path, vid_stride=1):
|
|
274
|
+
def __init__(self, path, batch=1, vid_stride=1):
|
|
273
275
|
"""Initialize the Dataloader and raise FileNotFoundError if file not found."""
|
|
274
276
|
parent = None
|
|
275
277
|
if isinstance(path, str) and Path(path).suffix == ".txt": # *.txt file with img/vid/dir on each line
|
|
@@ -295,10 +297,11 @@ class LoadImages:
|
|
|
295
297
|
|
|
296
298
|
self.files = images + videos
|
|
297
299
|
self.nf = ni + nv # number of files
|
|
300
|
+
self.ni = ni # number of images
|
|
298
301
|
self.video_flag = [False] * ni + [True] * nv
|
|
299
302
|
self.mode = "image"
|
|
300
303
|
self.vid_stride = vid_stride # video frame-rate stride
|
|
301
|
-
self.bs =
|
|
304
|
+
self.bs = batch
|
|
302
305
|
if any(videos):
|
|
303
306
|
self._new_video(videos[0]) # new video
|
|
304
307
|
else:
|
|
@@ -315,49 +318,69 @@ class LoadImages:
|
|
|
315
318
|
return self
|
|
316
319
|
|
|
317
320
|
def __next__(self):
|
|
318
|
-
"""
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
self.mode = "video"
|
|
326
|
-
for _ in range(self.vid_stride):
|
|
327
|
-
self.cap.grab()
|
|
328
|
-
success, im0 = self.cap.retrieve()
|
|
329
|
-
while not success:
|
|
330
|
-
self.count += 1
|
|
331
|
-
self.cap.release()
|
|
332
|
-
if self.count == self.nf: # last video
|
|
321
|
+
"""Returns the next batch of images or video frames along with their paths and metadata."""
|
|
322
|
+
paths, imgs, info = [], [], []
|
|
323
|
+
while len(imgs) < self.bs:
|
|
324
|
+
if self.count >= self.nf: # end of file list
|
|
325
|
+
if len(imgs) > 0:
|
|
326
|
+
return paths, imgs, info # return last partial batch
|
|
327
|
+
else:
|
|
333
328
|
raise StopIteration
|
|
334
|
-
path = self.files[self.count]
|
|
335
|
-
self._new_video(path)
|
|
336
|
-
success, im0 = self.cap.read()
|
|
337
|
-
|
|
338
|
-
self.frame += 1
|
|
339
|
-
# im0 = self._cv2_rotate(im0) # for use if cv2 autorotation is False
|
|
340
|
-
s = f"video {self.count + 1}/{self.nf} ({self.frame}/{self.frames}) {path}: "
|
|
341
329
|
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
raise FileNotFoundError(f"Image Not Found {path}")
|
|
348
|
-
s = f"image {self.count}/{self.nf} {path}: "
|
|
330
|
+
path = self.files[self.count]
|
|
331
|
+
if self.video_flag[self.count]:
|
|
332
|
+
self.mode = "video"
|
|
333
|
+
if not self.cap or not self.cap.isOpened():
|
|
334
|
+
self._new_video(path)
|
|
349
335
|
|
|
350
|
-
|
|
336
|
+
for _ in range(self.vid_stride):
|
|
337
|
+
success = self.cap.grab()
|
|
338
|
+
if not success:
|
|
339
|
+
break # end of video or failure
|
|
340
|
+
|
|
341
|
+
if success:
|
|
342
|
+
success, im0 = self.cap.retrieve()
|
|
343
|
+
if success:
|
|
344
|
+
self.frame += 1
|
|
345
|
+
paths.append(path)
|
|
346
|
+
imgs.append(im0)
|
|
347
|
+
info.append(f"video {self.count + 1}/{self.nf} (frame {self.frame}/{self.frames}) {path}: ")
|
|
348
|
+
if self.frame == self.frames: # end of video
|
|
349
|
+
self.count += 1
|
|
350
|
+
self.cap.release()
|
|
351
|
+
else:
|
|
352
|
+
# Move to the next file if the current video ended or failed to open
|
|
353
|
+
self.count += 1
|
|
354
|
+
if self.cap:
|
|
355
|
+
self.cap.release()
|
|
356
|
+
if self.count < self.nf:
|
|
357
|
+
self._new_video(self.files[self.count])
|
|
358
|
+
else:
|
|
359
|
+
self.mode = "image"
|
|
360
|
+
im0 = cv2.imread(path) # BGR
|
|
361
|
+
if im0 is None:
|
|
362
|
+
raise FileNotFoundError(f"Image Not Found {path}")
|
|
363
|
+
paths.append(path)
|
|
364
|
+
imgs.append(im0)
|
|
365
|
+
info.append(f"image {self.count + 1}/{self.nf} {path}: ")
|
|
366
|
+
self.count += 1 # move to the next file
|
|
367
|
+
if self.count >= self.ni: # end of image list
|
|
368
|
+
break
|
|
369
|
+
|
|
370
|
+
return paths, imgs, info
|
|
351
371
|
|
|
352
372
|
def _new_video(self, path):
|
|
353
|
-
"""
|
|
373
|
+
"""Creates a new video capture object for the given path."""
|
|
354
374
|
self.frame = 0
|
|
355
375
|
self.cap = cv2.VideoCapture(path)
|
|
376
|
+
self.fps = int(self.cap.get(cv2.CAP_PROP_FPS))
|
|
377
|
+
if not self.cap.isOpened():
|
|
378
|
+
raise FileNotFoundError(f"Failed to open video {path}")
|
|
356
379
|
self.frames = int(self.cap.get(cv2.CAP_PROP_FRAME_COUNT) / self.vid_stride)
|
|
357
380
|
|
|
358
381
|
def __len__(self):
|
|
359
|
-
"""Returns the number of
|
|
360
|
-
return self.nf # number of files
|
|
382
|
+
"""Returns the number of batches in the object."""
|
|
383
|
+
return math.ceil(self.nf / self.bs) # number of files
|
|
361
384
|
|
|
362
385
|
|
|
363
386
|
class LoadPilAndNumpy:
|
|
@@ -373,7 +396,6 @@ class LoadPilAndNumpy:
|
|
|
373
396
|
im0 (list): List of images stored as Numpy arrays.
|
|
374
397
|
mode (str): Type of data being processed, defaults to 'image'.
|
|
375
398
|
bs (int): Batch size, equivalent to the length of `im0`.
|
|
376
|
-
count (int): Counter for iteration, initialized at 0 during `__iter__()`.
|
|
377
399
|
|
|
378
400
|
Methods:
|
|
379
401
|
_single_check(im): Validate and format a single image to a Numpy array.
|
|
@@ -386,7 +408,6 @@ class LoadPilAndNumpy:
|
|
|
386
408
|
self.paths = [getattr(im, "filename", f"image{i}.jpg") for i, im in enumerate(im0)]
|
|
387
409
|
self.im0 = [self._single_check(im) for im in im0]
|
|
388
410
|
self.mode = "image"
|
|
389
|
-
# Generate fake paths
|
|
390
411
|
self.bs = len(self.im0)
|
|
391
412
|
|
|
392
413
|
@staticmethod
|
|
@@ -409,7 +430,7 @@ class LoadPilAndNumpy:
|
|
|
409
430
|
if self.count == 1: # loop only once as it's batch inference
|
|
410
431
|
raise StopIteration
|
|
411
432
|
self.count += 1
|
|
412
|
-
return self.paths, self.im0,
|
|
433
|
+
return self.paths, self.im0, [""] * self.bs
|
|
413
434
|
|
|
414
435
|
def __iter__(self):
|
|
415
436
|
"""Enables iteration for class LoadPilAndNumpy."""
|
|
@@ -474,7 +495,7 @@ class LoadTensor:
|
|
|
474
495
|
if self.count == 1:
|
|
475
496
|
raise StopIteration
|
|
476
497
|
self.count += 1
|
|
477
|
-
return self.paths, self.im0,
|
|
498
|
+
return self.paths, self.im0, [""] * self.bs
|
|
478
499
|
|
|
479
500
|
def __len__(self):
|
|
480
501
|
"""Returns the batch size."""
|
|
@@ -498,9 +519,6 @@ def autocast_list(source):
|
|
|
498
519
|
return files
|
|
499
520
|
|
|
500
521
|
|
|
501
|
-
LOADERS = LoadStreams, LoadPilAndNumpy, LoadImages, LoadScreenshots # tuple
|
|
502
|
-
|
|
503
|
-
|
|
504
522
|
def get_best_youtube_url(url, use_pafy=True):
|
|
505
523
|
"""
|
|
506
524
|
Retrieves the URL of the best quality MP4 video stream from a given YouTube video.
|
|
@@ -531,3 +549,7 @@ def get_best_youtube_url(url, use_pafy=True):
|
|
|
531
549
|
good_size = (f.get("width") or 0) >= 1920 or (f.get("height") or 0) >= 1080
|
|
532
550
|
if good_size and f["vcodec"] != "none" and f["acodec"] == "none" and f["ext"] == "mp4":
|
|
533
551
|
return f.get("url")
|
|
552
|
+
|
|
553
|
+
|
|
554
|
+
# Define constants
|
|
555
|
+
LOADERS = (LoadStreams, LoadPilAndNumpy, LoadImagesAndVideos, LoadScreenshots)
|
|
@@ -423,7 +423,7 @@ class Model(nn.Module):
|
|
|
423
423
|
x in sys.argv for x in ("predict", "track", "mode=predict", "mode=track")
|
|
424
424
|
)
|
|
425
425
|
|
|
426
|
-
custom = {"conf": 0.25, "save": is_cli, "mode": "predict"} # method defaults
|
|
426
|
+
custom = {"conf": 0.25, "batch": 1, "save": is_cli, "mode": "predict"} # method defaults
|
|
427
427
|
args = {**self.overrides, **custom, **kwargs} # highest priority args on the right
|
|
428
428
|
prompts = args.pop("prompts", None) # for SAM-type models
|
|
429
429
|
|
|
@@ -474,6 +474,7 @@ class Model(nn.Module):
|
|
|
474
474
|
|
|
475
475
|
register_tracker(self, persist)
|
|
476
476
|
kwargs["conf"] = kwargs.get("conf") or 0.1 # ByteTrack-based method needs low confidence predictions as input
|
|
477
|
+
kwargs["batch"] = kwargs.get("batch") or 1 # batch-size 1 for tracking in videos
|
|
477
478
|
kwargs["mode"] = "track"
|
|
478
479
|
return self.predict(source=source, stream=stream, **kwargs)
|
|
479
480
|
|