ultralytics 8.3.215__tar.gz → 8.3.226__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {ultralytics-8.3.215 → ultralytics-8.3.226}/PKG-INFO +4 -4
- {ultralytics-8.3.215 → ultralytics-8.3.226}/README.md +2 -2
- {ultralytics-8.3.215 → ultralytics-8.3.226}/pyproject.toml +3 -3
- {ultralytics-8.3.215 → ultralytics-8.3.226}/tests/__init__.py +5 -7
- {ultralytics-8.3.215 → ultralytics-8.3.226}/tests/conftest.py +8 -15
- {ultralytics-8.3.215 → ultralytics-8.3.226}/tests/test_cli.py +1 -1
- {ultralytics-8.3.215 → ultralytics-8.3.226}/tests/test_cuda.py +1 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/tests/test_engine.py +1 -1
- {ultralytics-8.3.215 → ultralytics-8.3.226}/tests/test_exports.py +37 -9
- {ultralytics-8.3.215 → ultralytics-8.3.226}/tests/test_integrations.py +4 -4
- {ultralytics-8.3.215 → ultralytics-8.3.226}/tests/test_python.py +82 -51
- {ultralytics-8.3.215 → ultralytics-8.3.226}/tests/test_solutions.py +154 -145
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/__init__.py +1 -1
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/__init__.py +51 -57
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/datasets/ImageNet.yaml +1 -1
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/datasets/coco-pose.yaml +21 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/datasets/coco8-pose.yaml +21 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/datasets/dog-pose.yaml +28 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/datasets/hand-keypoints.yaml +25 -0
- ultralytics-8.3.226/ultralytics/cfg/datasets/kitti.yaml +27 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/datasets/lvis.yaml +5 -5
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/datasets/open-images-v7.yaml +1 -1
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/datasets/tiger-pose.yaml +16 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/default.yaml +1 -1
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/data/annotator.py +3 -4
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/data/augment.py +282 -345
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/data/base.py +14 -24
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/data/build.py +143 -22
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/data/converter.py +35 -45
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/data/dataset.py +46 -74
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/data/loaders.py +25 -37
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/data/split.py +5 -6
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/data/split_dota.py +8 -15
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/data/utils.py +30 -39
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/engine/exporter.py +145 -197
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/engine/model.py +147 -182
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/engine/predictor.py +21 -32
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/engine/results.py +166 -232
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/engine/trainer.py +73 -57
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/engine/tuner.py +18 -29
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/engine/validator.py +33 -19
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/hub/__init__.py +16 -19
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/hub/auth.py +6 -12
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/hub/google/__init__.py +7 -10
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/hub/session.py +15 -25
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/hub/utils.py +5 -8
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/__init__.py +1 -1
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/fastsam/__init__.py +1 -1
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/fastsam/model.py +7 -9
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/fastsam/predict.py +15 -26
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/fastsam/utils.py +1 -2
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/fastsam/val.py +2 -4
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/nas/__init__.py +1 -1
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/nas/model.py +5 -8
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/nas/predict.py +7 -9
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/nas/val.py +1 -2
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/rtdetr/__init__.py +1 -1
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/rtdetr/model.py +5 -8
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/rtdetr/predict.py +15 -18
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/rtdetr/train.py +10 -13
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/rtdetr/val.py +13 -20
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/sam/amg.py +14 -20
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/sam/build.py +6 -8
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/sam/model.py +16 -23
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/sam/modules/blocks.py +63 -85
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/sam/modules/decoders.py +17 -24
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/sam/modules/encoders.py +40 -56
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/sam/modules/memory_attention.py +10 -16
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/sam/modules/sam.py +41 -47
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/sam/modules/tiny_encoder.py +64 -83
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/sam/modules/transformer.py +18 -28
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/sam/modules/utils.py +31 -42
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/sam/predict.py +173 -210
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/utils/loss.py +14 -26
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/utils/ops.py +13 -17
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/yolo/__init__.py +1 -1
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/yolo/classify/predict.py +8 -11
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/yolo/classify/train.py +11 -32
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/yolo/classify/val.py +28 -21
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/yolo/detect/predict.py +4 -8
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/yolo/detect/train.py +11 -20
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/yolo/detect/val.py +62 -50
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/yolo/model.py +35 -47
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/yolo/obb/predict.py +5 -8
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/yolo/obb/train.py +11 -14
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/yolo/obb/val.py +20 -28
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/yolo/pose/__init__.py +1 -1
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/yolo/pose/predict.py +5 -8
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/yolo/pose/train.py +9 -8
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/yolo/pose/val.py +31 -39
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/yolo/segment/predict.py +9 -14
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/yolo/segment/train.py +3 -6
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/yolo/segment/val.py +18 -28
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/yolo/world/train.py +8 -14
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/yolo/world/train_world.py +11 -16
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/yolo/yoloe/predict.py +16 -23
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/yolo/yoloe/train.py +30 -43
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/yolo/yoloe/train_seg.py +5 -10
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/yolo/yoloe/val.py +15 -20
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/nn/autobackend.py +49 -25
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/nn/modules/activation.py +4 -6
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/nn/modules/block.py +125 -211
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/nn/modules/conv.py +52 -97
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/nn/modules/head.py +45 -99
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/nn/modules/transformer.py +51 -83
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/nn/modules/utils.py +15 -20
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/nn/tasks.py +89 -149
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/nn/text_model.py +25 -40
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/solutions/ai_gym.py +10 -16
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/solutions/analytics.py +9 -10
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/solutions/config.py +4 -5
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/solutions/distance_calculation.py +9 -12
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/solutions/heatmap.py +7 -13
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/solutions/instance_segmentation.py +5 -8
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/solutions/object_blurrer.py +7 -10
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/solutions/object_counter.py +11 -18
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/solutions/object_cropper.py +5 -8
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/solutions/parking_management.py +12 -14
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/solutions/queue_management.py +5 -7
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/solutions/region_counter.py +7 -10
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/solutions/security_alarm.py +14 -19
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/solutions/similarity_search.py +10 -15
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/solutions/solutions.py +31 -53
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/solutions/speed_estimation.py +6 -9
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/solutions/streamlit_inference.py +2 -4
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/solutions/trackzone.py +7 -10
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/solutions/vision_eye.py +5 -8
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/trackers/__init__.py +1 -1
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/trackers/basetrack.py +2 -4
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/trackers/bot_sort.py +6 -11
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/trackers/byte_tracker.py +12 -17
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/trackers/track.py +3 -6
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/trackers/utils/gmc.py +6 -12
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/trackers/utils/kalman_filter.py +35 -43
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/trackers/utils/matching.py +7 -11
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/utils/__init__.py +74 -113
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/utils/autobatch.py +2 -4
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/utils/autodevice.py +11 -13
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/utils/benchmarks.py +34 -42
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/utils/callbacks/base.py +8 -10
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/utils/callbacks/clearml.py +2 -4
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/utils/callbacks/comet.py +32 -46
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/utils/callbacks/dvc.py +13 -18
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/utils/callbacks/mlflow.py +4 -5
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/utils/callbacks/neptune.py +4 -6
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/utils/callbacks/raytune.py +3 -4
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/utils/callbacks/tensorboard.py +4 -6
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/utils/callbacks/wb.py +10 -13
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/utils/checks.py +39 -63
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/utils/cpu.py +3 -8
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/utils/dist.py +8 -12
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/utils/downloads.py +19 -29
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/utils/errors.py +6 -8
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/utils/events.py +2 -4
- ultralytics-8.3.226/ultralytics/utils/export/__init__.py +7 -0
- ultralytics-8.3.215/ultralytics/utils/export/__init__.py → ultralytics-8.3.226/ultralytics/utils/export/engine.py +6 -11
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/utils/export/imx.py +50 -45
- ultralytics-8.3.226/ultralytics/utils/export/tensorflow.py +217 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/utils/files.py +11 -16
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/utils/git.py +7 -10
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/utils/instance.py +30 -51
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/utils/logger.py +12 -16
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/utils/loss.py +8 -14
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/utils/metrics.py +113 -149
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/utils/nms.py +13 -16
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/utils/ops.py +63 -95
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/utils/patches.py +11 -18
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/utils/plotting.py +46 -51
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/utils/tal.py +25 -39
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/utils/torch_utils.py +50 -77
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/utils/tqdm.py +9 -13
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/utils/triton.py +13 -15
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/utils/tuner.py +5 -4
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics.egg-info/PKG-INFO +4 -4
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics.egg-info/SOURCES.txt +4 -1
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics.egg-info/requires.txt +1 -1
- {ultralytics-8.3.215 → ultralytics-8.3.226}/LICENSE +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/setup.cfg +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/assets/bus.jpg +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/assets/zidane.jpg +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/datasets/HomeObjects-3K.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/datasets/VOC.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/datasets/coco.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/datasets/coco128.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/datasets/coco8-grayscale.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/datasets/coco8-multispectral.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/datasets/coco8.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/datasets/construction-ppe.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/datasets/dota8-multispectral.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/datasets/dota8.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/datasets/medical-pills.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/datasets/signature.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/datasets/xView.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/11/yolo11-cls-resnet18.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/11/yolo11-cls.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/11/yolo11-obb.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/11/yolo11-pose.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/11/yolo11-seg.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/11/yolo11.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/11/yoloe-11-seg.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/11/yoloe-11.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/12/yolo12-cls.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/12/yolo12-obb.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/12/yolo12-pose.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/12/yolo12-seg.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/12/yolo12.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/v10/yolov10b.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/v10/yolov10l.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/v10/yolov10m.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/v10/yolov10n.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/v10/yolov10s.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/v10/yolov10x.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/v8/yoloe-v8-seg.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/v8/yoloe-v8.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/v9/yolov9m.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/v9/yolov9s.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/models/v9/yolov9t.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/trackers/botsort.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/data/__init__.py +4 -4
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/data/scripts/download_weights.sh +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/data/scripts/get_coco.sh +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/data/scripts/get_coco128.sh +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/data/scripts/get_imagenet.sh +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/engine/__init__.py +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/sam/__init__.py +1 -1
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/sam/modules/__init__.py +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/utils/__init__.py +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/yolo/classify/__init__.py +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/yolo/detect/__init__.py +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/yolo/obb/__init__.py +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/yolo/segment/__init__.py +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/yolo/world/__init__.py +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/models/yolo/yoloe/__init__.py +7 -7
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/nn/__init__.py +7 -7
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/nn/modules/__init__.py +60 -60
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/py.typed +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/solutions/__init__.py +12 -12
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/solutions/templates/similarity-search.html +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/trackers/utils/__init__.py +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/utils/callbacks/__init__.py +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/utils/callbacks/hub.py +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics/utils/callbacks/platform.py +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics.egg-info/dependency_links.txt +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/ultralytics.egg-info/entry_points.txt +0 -0
- {ultralytics-8.3.215 → ultralytics-8.3.226}/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.226
|
|
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>
|
|
@@ -44,7 +44,7 @@ Requires-Dist: torch!=2.4.0,>=1.8.0; sys_platform == "win32"
|
|
|
44
44
|
Requires-Dist: torchvision>=0.9.0
|
|
45
45
|
Requires-Dist: psutil
|
|
46
46
|
Requires-Dist: polars
|
|
47
|
-
Requires-Dist: ultralytics-thop>=2.0.
|
|
47
|
+
Requires-Dist: ultralytics-thop>=2.0.18
|
|
48
48
|
Provides-Extra: dev
|
|
49
49
|
Requires-Dist: ipython; extra == "dev"
|
|
50
50
|
Requires-Dist: pytest; extra == "dev"
|
|
@@ -129,7 +129,7 @@ Request an Enterprise License for commercial use at [Ultralytics Licensing](http
|
|
|
129
129
|
<img src="https://github.com/ultralytics/assets/raw/main/social/logo-transparent.png" width="2%" alt="space">
|
|
130
130
|
<a href="https://twitter.com/ultralytics"><img src="https://github.com/ultralytics/assets/raw/main/social/logo-social-twitter.png" width="2%" alt="Ultralytics Twitter"></a>
|
|
131
131
|
<img src="https://github.com/ultralytics/assets/raw/main/social/logo-transparent.png" width="2%" alt="space">
|
|
132
|
-
<a href="https://youtube.com/ultralytics?sub_confirmation=1"><img src="https://github.com/ultralytics/assets/raw/main/social/logo-social-youtube.png" width="2%" alt="Ultralytics YouTube"></a>
|
|
132
|
+
<a href="https://www.youtube.com/ultralytics?sub_confirmation=1"><img src="https://github.com/ultralytics/assets/raw/main/social/logo-social-youtube.png" width="2%" alt="Ultralytics YouTube"></a>
|
|
133
133
|
<img src="https://github.com/ultralytics/assets/raw/main/social/logo-transparent.png" width="2%" alt="space">
|
|
134
134
|
<a href="https://www.tiktok.com/@ultralytics"><img src="https://github.com/ultralytics/assets/raw/main/social/logo-social-tiktok.png" width="2%" alt="Ultralytics TikTok"></a>
|
|
135
135
|
<img src="https://github.com/ultralytics/assets/raw/main/social/logo-transparent.png" width="2%" alt="space">
|
|
@@ -365,7 +365,7 @@ For bug reports and feature requests related to Ultralytics software, please vis
|
|
|
365
365
|
<img src="https://github.com/ultralytics/assets/raw/main/social/logo-transparent.png" width="3%" alt="space">
|
|
366
366
|
<a href="https://twitter.com/ultralytics"><img src="https://github.com/ultralytics/assets/raw/main/social/logo-social-twitter.png" width="3%" alt="Ultralytics Twitter"></a>
|
|
367
367
|
<img src="https://github.com/ultralytics/assets/raw/main/social/logo-transparent.png" width="3%" alt="space">
|
|
368
|
-
<a href="https://youtube.com/ultralytics?sub_confirmation=1"><img src="https://github.com/ultralytics/assets/raw/main/social/logo-social-youtube.png" width="3%" alt="Ultralytics YouTube"></a>
|
|
368
|
+
<a href="https://www.youtube.com/ultralytics?sub_confirmation=1"><img src="https://github.com/ultralytics/assets/raw/main/social/logo-social-youtube.png" width="3%" alt="Ultralytics YouTube"></a>
|
|
369
369
|
<img src="https://github.com/ultralytics/assets/raw/main/social/logo-transparent.png" width="3%" alt="space">
|
|
370
370
|
<a href="https://www.tiktok.com/@ultralytics"><img src="https://github.com/ultralytics/assets/raw/main/social/logo-social-tiktok.png" width="3%" alt="Ultralytics TikTok"></a>
|
|
371
371
|
<img src="https://github.com/ultralytics/assets/raw/main/social/logo-transparent.png" width="3%" alt="space">
|
|
@@ -39,7 +39,7 @@ Request an Enterprise License for commercial use at [Ultralytics Licensing](http
|
|
|
39
39
|
<img src="https://github.com/ultralytics/assets/raw/main/social/logo-transparent.png" width="2%" alt="space">
|
|
40
40
|
<a href="https://twitter.com/ultralytics"><img src="https://github.com/ultralytics/assets/raw/main/social/logo-social-twitter.png" width="2%" alt="Ultralytics Twitter"></a>
|
|
41
41
|
<img src="https://github.com/ultralytics/assets/raw/main/social/logo-transparent.png" width="2%" alt="space">
|
|
42
|
-
<a href="https://youtube.com/ultralytics?sub_confirmation=1"><img src="https://github.com/ultralytics/assets/raw/main/social/logo-social-youtube.png" width="2%" alt="Ultralytics YouTube"></a>
|
|
42
|
+
<a href="https://www.youtube.com/ultralytics?sub_confirmation=1"><img src="https://github.com/ultralytics/assets/raw/main/social/logo-social-youtube.png" width="2%" alt="Ultralytics YouTube"></a>
|
|
43
43
|
<img src="https://github.com/ultralytics/assets/raw/main/social/logo-transparent.png" width="2%" alt="space">
|
|
44
44
|
<a href="https://www.tiktok.com/@ultralytics"><img src="https://github.com/ultralytics/assets/raw/main/social/logo-social-tiktok.png" width="2%" alt="Ultralytics TikTok"></a>
|
|
45
45
|
<img src="https://github.com/ultralytics/assets/raw/main/social/logo-transparent.png" width="2%" alt="space">
|
|
@@ -275,7 +275,7 @@ For bug reports and feature requests related to Ultralytics software, please vis
|
|
|
275
275
|
<img src="https://github.com/ultralytics/assets/raw/main/social/logo-transparent.png" width="3%" alt="space">
|
|
276
276
|
<a href="https://twitter.com/ultralytics"><img src="https://github.com/ultralytics/assets/raw/main/social/logo-social-twitter.png" width="3%" alt="Ultralytics Twitter"></a>
|
|
277
277
|
<img src="https://github.com/ultralytics/assets/raw/main/social/logo-transparent.png" width="3%" alt="space">
|
|
278
|
-
<a href="https://youtube.com/ultralytics?sub_confirmation=1"><img src="https://github.com/ultralytics/assets/raw/main/social/logo-social-youtube.png" width="3%" alt="Ultralytics YouTube"></a>
|
|
278
|
+
<a href="https://www.youtube.com/ultralytics?sub_confirmation=1"><img src="https://github.com/ultralytics/assets/raw/main/social/logo-social-youtube.png" width="3%" alt="Ultralytics YouTube"></a>
|
|
279
279
|
<img src="https://github.com/ultralytics/assets/raw/main/social/logo-transparent.png" width="3%" alt="space">
|
|
280
280
|
<a href="https://www.tiktok.com/@ultralytics"><img src="https://github.com/ultralytics/assets/raw/main/social/logo-social-tiktok.png" width="3%" alt="Ultralytics TikTok"></a>
|
|
281
281
|
<img src="https://github.com/ultralytics/assets/raw/main/social/logo-transparent.png" width="3%" alt="space">
|
|
@@ -73,7 +73,7 @@ dependencies = [
|
|
|
73
73
|
"torchvision>=0.9.0",
|
|
74
74
|
"psutil", # system utilization
|
|
75
75
|
"polars",
|
|
76
|
-
"ultralytics-thop>=2.0.
|
|
76
|
+
"ultralytics-thop>=2.0.18", # FLOPs computation https://github.com/ultralytics/thop
|
|
77
77
|
]
|
|
78
78
|
|
|
79
79
|
# Optional dependencies ------------------------------------------------------------------------------------------------
|
|
@@ -189,5 +189,5 @@ close-quotes-on-newline = true
|
|
|
189
189
|
in-place = true
|
|
190
190
|
|
|
191
191
|
[tool.codespell]
|
|
192
|
-
ignore-words-list = "crate,nd,ned,strack,dota,ane,segway,fo,gool,winn,commend,bloc,nam,afterall"
|
|
193
|
-
skip =
|
|
192
|
+
ignore-words-list = "grey,writeable,finalY,RepResNet,Idenfy,WIT,Smoot,EHR,ROUGE,ALS,iTerm,Carmel,FPR,Hach,Calle,ore,COO,MOT,crate,nd,ned,strack,dota,ane,segway,fo,gool,winn,commend,bloc,nam,afterall,skelton,goin"
|
|
193
|
+
skip = "*.pt,*.pth,*.torchscript,*.onnx,*.tflite,*.pb,*.bin,*.param,*.mlmodel,*.engine,*.npy,*.data*,*.csv,*pnnx*,*venv*,*translat*,*lock*,__pycache__*,*.ico,*.jpg,*.png,*.webp,*.avif,*.mp4,*.mov,/runs,/.git,./docs/??/*.md,./docs/mkdocs_??.yml"
|
|
@@ -1,25 +1,23 @@
|
|
|
1
1
|
# Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
|
|
2
2
|
|
|
3
3
|
from ultralytics.cfg import TASK2DATA, TASK2MODEL, TASKS
|
|
4
|
-
from ultralytics.utils import ASSETS,
|
|
4
|
+
from ultralytics.utils import ASSETS, WEIGHTS_DIR, checks
|
|
5
5
|
|
|
6
6
|
# Constants used in tests
|
|
7
7
|
MODEL = WEIGHTS_DIR / "path with spaces" / "yolo11n.pt" # test spaces in path
|
|
8
8
|
CFG = "yolo11n.yaml"
|
|
9
9
|
SOURCE = ASSETS / "bus.jpg"
|
|
10
10
|
SOURCES_LIST = [ASSETS / "bus.jpg", ASSETS, ASSETS / "*", ASSETS / "**/*.jpg"]
|
|
11
|
-
TMP = (ROOT / "../tests/tmp").resolve() # temp directory for test files
|
|
12
11
|
CUDA_IS_AVAILABLE = checks.cuda_is_available()
|
|
13
12
|
CUDA_DEVICE_COUNT = checks.cuda_device_count()
|
|
14
13
|
TASK_MODEL_DATA = [(task, WEIGHTS_DIR / TASK2MODEL[task], TASK2DATA[task]) for task in TASKS]
|
|
15
|
-
MODELS = frozenset(list(TASK2MODEL.values())
|
|
14
|
+
MODELS = frozenset([*list(TASK2MODEL.values()), "yolo11n-grayscale.pt"])
|
|
16
15
|
|
|
17
16
|
__all__ = (
|
|
18
|
-
"MODEL",
|
|
19
17
|
"CFG",
|
|
18
|
+
"CUDA_DEVICE_COUNT",
|
|
19
|
+
"CUDA_IS_AVAILABLE",
|
|
20
|
+
"MODEL",
|
|
20
21
|
"SOURCE",
|
|
21
22
|
"SOURCES_LIST",
|
|
22
|
-
"TMP",
|
|
23
|
-
"CUDA_IS_AVAILABLE",
|
|
24
|
-
"CUDA_DEVICE_COUNT",
|
|
25
23
|
)
|
|
@@ -3,8 +3,6 @@
|
|
|
3
3
|
import shutil
|
|
4
4
|
from pathlib import Path
|
|
5
5
|
|
|
6
|
-
from tests import TMP
|
|
7
|
-
|
|
8
6
|
|
|
9
7
|
def pytest_addoption(parser):
|
|
10
8
|
"""Add custom command-line options to pytest."""
|
|
@@ -12,8 +10,7 @@ def pytest_addoption(parser):
|
|
|
12
10
|
|
|
13
11
|
|
|
14
12
|
def pytest_collection_modifyitems(config, items):
|
|
15
|
-
"""
|
|
16
|
-
Modify the list of test items to exclude tests marked as slow if the --slow option is not specified.
|
|
13
|
+
"""Modify the list of test items to exclude tests marked as slow if the --slow option is not specified.
|
|
17
14
|
|
|
18
15
|
Args:
|
|
19
16
|
config: The pytest configuration object that provides access to command-line options.
|
|
@@ -25,11 +22,10 @@ def pytest_collection_modifyitems(config, items):
|
|
|
25
22
|
|
|
26
23
|
|
|
27
24
|
def pytest_sessionstart(session):
|
|
28
|
-
"""
|
|
29
|
-
Initialize session configurations for pytest.
|
|
25
|
+
"""Initialize session configurations for pytest.
|
|
30
26
|
|
|
31
27
|
This function is automatically called by pytest after the 'Session' object has been created but before performing
|
|
32
|
-
test collection. It sets the initial seeds
|
|
28
|
+
test collection. It sets the initial seeds for the test session.
|
|
33
29
|
|
|
34
30
|
Args:
|
|
35
31
|
session: The pytest session object.
|
|
@@ -37,16 +33,13 @@ def pytest_sessionstart(session):
|
|
|
37
33
|
from ultralytics.utils.torch_utils import init_seeds
|
|
38
34
|
|
|
39
35
|
init_seeds()
|
|
40
|
-
shutil.rmtree(TMP, ignore_errors=True) # Delete any existing tests/tmp directory
|
|
41
|
-
TMP.mkdir(parents=True, exist_ok=True) # Create a new empty directory
|
|
42
36
|
|
|
43
37
|
|
|
44
38
|
def pytest_terminal_summary(terminalreporter, exitstatus, config):
|
|
45
|
-
"""
|
|
46
|
-
Cleanup operations after pytest session.
|
|
39
|
+
"""Cleanup operations after pytest session.
|
|
47
40
|
|
|
48
|
-
This function is automatically called by pytest at the end of the entire test session. It removes certain files
|
|
49
|
-
|
|
41
|
+
This function is automatically called by pytest at the end of the entire test session. It removes certain files and
|
|
42
|
+
directories used during testing.
|
|
50
43
|
|
|
51
44
|
Args:
|
|
52
45
|
terminalreporter: The terminal reporter object used for terminal output.
|
|
@@ -57,10 +50,10 @@ def pytest_terminal_summary(terminalreporter, exitstatus, config):
|
|
|
57
50
|
|
|
58
51
|
# Remove files
|
|
59
52
|
models = [path for x in {"*.onnx", "*.torchscript"} for path in WEIGHTS_DIR.rglob(x)]
|
|
60
|
-
for file in ["decelera_portrait_min.mov", "bus.jpg", "yolo11n.onnx", "yolo11n.torchscript"
|
|
53
|
+
for file in ["decelera_portrait_min.mov", "bus.jpg", "yolo11n.onnx", "yolo11n.torchscript", *models]:
|
|
61
54
|
Path(file).unlink(missing_ok=True)
|
|
62
55
|
|
|
63
56
|
# Remove directories
|
|
64
57
|
models = [path for x in {"*.mlpackage", "*_openvino_model"} for path in WEIGHTS_DIR.rglob(x)]
|
|
65
|
-
for directory in [WEIGHTS_DIR / "path with spaces",
|
|
58
|
+
for directory in [WEIGHTS_DIR / "path with spaces", *models]:
|
|
66
59
|
shutil.rmtree(directory, ignore_errors=True)
|
|
@@ -82,7 +82,7 @@ def test_fastsam(
|
|
|
82
82
|
everything_results = sam_model(s, device="cpu", retina_masks=True, imgsz=320, conf=0.4, iou=0.9)
|
|
83
83
|
|
|
84
84
|
# Remove small regions
|
|
85
|
-
|
|
85
|
+
_new_masks, _ = Predictor.remove_small_regions(everything_results[0].masks.data, min_area=20)
|
|
86
86
|
|
|
87
87
|
# Run inference with bboxes and points and texts prompt at the same time
|
|
88
88
|
sam_model(source, bboxes=[439, 437, 524, 709], points=[[200, 200]], labels=[1], texts="a photo of a dog")
|
|
@@ -118,6 +118,7 @@ def test_train():
|
|
|
118
118
|
results = YOLO(MODEL).train(
|
|
119
119
|
data="coco8.yaml", imgsz=64, epochs=1, device=device, batch=15
|
|
120
120
|
) # requires imgsz>=64
|
|
121
|
+
results = YOLO(MODEL).train(data="coco8.yaml", imgsz=64, epochs=1, device=device, batch=15, val=False)
|
|
121
122
|
visible = eval(os.environ["CUDA_VISIBLE_DEVICES"])
|
|
122
123
|
assert visible == device, f"Passed GPUs '{device}', but used GPUs '{visible}'"
|
|
123
124
|
assert (
|
|
@@ -13,7 +13,7 @@ from ultralytics.models.yolo import classify, detect, segment
|
|
|
13
13
|
from ultralytics.utils import ASSETS, DEFAULT_CFG, WEIGHTS_DIR
|
|
14
14
|
|
|
15
15
|
|
|
16
|
-
def test_func(*args):
|
|
16
|
+
def test_func(*args):
|
|
17
17
|
"""Test function callback for evaluating YOLO model performance metrics."""
|
|
18
18
|
print("callback test passed")
|
|
19
19
|
|
|
@@ -12,15 +12,8 @@ import pytest
|
|
|
12
12
|
from tests import MODEL, SOURCE
|
|
13
13
|
from ultralytics import YOLO
|
|
14
14
|
from ultralytics.cfg import TASK2DATA, TASK2MODEL, TASKS
|
|
15
|
-
from ultralytics.utils import
|
|
16
|
-
|
|
17
|
-
IS_RASPBERRYPI,
|
|
18
|
-
LINUX,
|
|
19
|
-
MACOS,
|
|
20
|
-
WINDOWS,
|
|
21
|
-
checks,
|
|
22
|
-
)
|
|
23
|
-
from ultralytics.utils.torch_utils import TORCH_1_11, TORCH_1_13, TORCH_2_1
|
|
15
|
+
from ultralytics.utils import ARM64, IS_RASPBERRYPI, LINUX, MACOS, WINDOWS, checks
|
|
16
|
+
from ultralytics.utils.torch_utils import TORCH_1_11, TORCH_1_13, TORCH_2_1, TORCH_2_9
|
|
24
17
|
|
|
25
18
|
|
|
26
19
|
def test_export_torchscript():
|
|
@@ -262,3 +255,38 @@ def test_export_imx():
|
|
|
262
255
|
model = YOLO("yolov8n.pt")
|
|
263
256
|
file = model.export(format="imx", imgsz=32)
|
|
264
257
|
YOLO(file)(SOURCE, imgsz=32)
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
@pytest.mark.skipif(not checks.IS_PYTHON_MINIMUM_3_10 or not TORCH_2_9, reason="Requires Python>=3.10 and Torch>=2.9.0")
|
|
261
|
+
@pytest.mark.skipif(WINDOWS, reason="Skipping test on Windows")
|
|
262
|
+
def test_export_executorch():
|
|
263
|
+
"""Test YOLO model export to ExecuTorch format."""
|
|
264
|
+
file = YOLO(MODEL).export(format="executorch", imgsz=32)
|
|
265
|
+
assert Path(file).exists(), f"ExecuTorch export failed, directory not found: {file}"
|
|
266
|
+
# Check that .pte file exists in the exported directory
|
|
267
|
+
pte_file = Path(file) / Path(MODEL).with_suffix(".pte").name
|
|
268
|
+
assert pte_file.exists(), f"ExecuTorch .pte file not found: {pte_file}"
|
|
269
|
+
# Check that metadata.yaml exists
|
|
270
|
+
metadata_file = Path(file) / "metadata.yaml"
|
|
271
|
+
assert metadata_file.exists(), f"ExecuTorch metadata.yaml not found: {metadata_file}"
|
|
272
|
+
# Note: Inference testing skipped as ExecuTorch requires special runtime setup
|
|
273
|
+
shutil.rmtree(file, ignore_errors=True) # cleanup
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
@pytest.mark.slow
|
|
277
|
+
@pytest.mark.skipif(not checks.IS_PYTHON_MINIMUM_3_10 or not TORCH_2_9, reason="Requires Python>=3.10 and Torch>=2.9.0")
|
|
278
|
+
@pytest.mark.skipif(WINDOWS, reason="Skipping test on Windows")
|
|
279
|
+
@pytest.mark.parametrize("task", TASKS)
|
|
280
|
+
def test_export_executorch_matrix(task):
|
|
281
|
+
"""Test YOLO export to ExecuTorch format for various task types."""
|
|
282
|
+
file = YOLO(TASK2MODEL[task]).export(format="executorch", imgsz=32)
|
|
283
|
+
assert Path(file).exists(), f"ExecuTorch export failed for task '{task}', directory not found: {file}"
|
|
284
|
+
# Check that .pte file exists in the exported directory
|
|
285
|
+
model_name = Path(TASK2MODEL[task]).with_suffix(".pte").name
|
|
286
|
+
pte_file = Path(file) / model_name
|
|
287
|
+
assert pte_file.exists(), f"ExecuTorch .pte file not found for task '{task}': {pte_file}"
|
|
288
|
+
# Check that metadata.yaml exists
|
|
289
|
+
metadata_file = Path(file) / "metadata.yaml"
|
|
290
|
+
assert metadata_file.exists(), f"ExecuTorch metadata.yaml not found for task '{task}': {metadata_file}"
|
|
291
|
+
# Note: Inference testing skipped as ExecuTorch requires special runtime setup
|
|
292
|
+
shutil.rmtree(file, ignore_errors=True) # cleanup
|
|
@@ -8,7 +8,7 @@ from pathlib import Path
|
|
|
8
8
|
|
|
9
9
|
import pytest
|
|
10
10
|
|
|
11
|
-
from tests import MODEL, SOURCE
|
|
11
|
+
from tests import MODEL, SOURCE
|
|
12
12
|
from ultralytics import YOLO, download
|
|
13
13
|
from ultralytics.utils import ASSETS_URL, DATASETS_DIR, SETTINGS
|
|
14
14
|
from ultralytics.utils.checks import check_requirements
|
|
@@ -71,14 +71,14 @@ def test_mlflow_keep_run_active():
|
|
|
71
71
|
|
|
72
72
|
|
|
73
73
|
@pytest.mark.skipif(not check_requirements("tritonclient", install=False), reason="tritonclient[all] not installed")
|
|
74
|
-
def test_triton():
|
|
74
|
+
def test_triton(tmp_path):
|
|
75
75
|
"""Test NVIDIA Triton Server functionalities with YOLO model."""
|
|
76
76
|
check_requirements("tritonclient[all]")
|
|
77
|
-
from tritonclient.http import InferenceServerClient
|
|
77
|
+
from tritonclient.http import InferenceServerClient
|
|
78
78
|
|
|
79
79
|
# Create variables
|
|
80
80
|
model_name = "yolo"
|
|
81
|
-
triton_repo =
|
|
81
|
+
triton_repo = tmp_path / "triton_repo" # Triton repo path
|
|
82
82
|
triton_model = triton_repo / model_name # Triton model path
|
|
83
83
|
|
|
84
84
|
# Export model to ONNX
|
|
@@ -12,7 +12,7 @@ import pytest
|
|
|
12
12
|
import torch
|
|
13
13
|
from PIL import Image
|
|
14
14
|
|
|
15
|
-
from tests import CFG, MODEL, MODELS, SOURCE, SOURCES_LIST, TASK_MODEL_DATA
|
|
15
|
+
from tests import CFG, MODEL, MODELS, SOURCE, SOURCES_LIST, TASK_MODEL_DATA
|
|
16
16
|
from ultralytics import RTDETR, YOLO
|
|
17
17
|
from ultralytics.cfg import TASK2DATA, TASKS
|
|
18
18
|
from ultralytics.data.build import load_inference_source
|
|
@@ -33,14 +33,11 @@ from ultralytics.utils import (
|
|
|
33
33
|
WINDOWS,
|
|
34
34
|
YAML,
|
|
35
35
|
checks,
|
|
36
|
-
is_dir_writeable,
|
|
37
36
|
is_github_action_running,
|
|
38
37
|
)
|
|
39
38
|
from ultralytics.utils.downloads import download
|
|
40
39
|
from ultralytics.utils.torch_utils import TORCH_1_11, TORCH_1_13
|
|
41
40
|
|
|
42
|
-
IS_TMP_WRITEABLE = is_dir_writeable(TMP) # WARNING: must be run once tests start as TMP does not exist on tests/init
|
|
43
|
-
|
|
44
41
|
|
|
45
42
|
def test_model_forward():
|
|
46
43
|
"""Test the forward pass of the YOLO model."""
|
|
@@ -77,10 +74,9 @@ def test_model_profile():
|
|
|
77
74
|
_ = model.predict(im, profile=True)
|
|
78
75
|
|
|
79
76
|
|
|
80
|
-
|
|
81
|
-
def test_predict_txt():
|
|
77
|
+
def test_predict_txt(tmp_path):
|
|
82
78
|
"""Test YOLO predictions with file, directory, and pattern sources listed in a text file."""
|
|
83
|
-
file =
|
|
79
|
+
file = tmp_path / "sources_multi_row.txt"
|
|
84
80
|
with open(file, "w") as f:
|
|
85
81
|
for src in SOURCES_LIST:
|
|
86
82
|
f.write(f"{src}\n")
|
|
@@ -89,10 +85,9 @@ def test_predict_txt():
|
|
|
89
85
|
|
|
90
86
|
|
|
91
87
|
@pytest.mark.skipif(True, reason="disabled for testing")
|
|
92
|
-
|
|
93
|
-
def test_predict_csv_multi_row():
|
|
88
|
+
def test_predict_csv_multi_row(tmp_path):
|
|
94
89
|
"""Test YOLO predictions with sources listed in multiple rows of a CSV file."""
|
|
95
|
-
file =
|
|
90
|
+
file = tmp_path / "sources_multi_row.csv"
|
|
96
91
|
with open(file, "w", newline="") as f:
|
|
97
92
|
writer = csv.writer(f)
|
|
98
93
|
writer.writerow(["source"])
|
|
@@ -102,10 +97,9 @@ def test_predict_csv_multi_row():
|
|
|
102
97
|
|
|
103
98
|
|
|
104
99
|
@pytest.mark.skipif(True, reason="disabled for testing")
|
|
105
|
-
|
|
106
|
-
def test_predict_csv_single_row():
|
|
100
|
+
def test_predict_csv_single_row(tmp_path):
|
|
107
101
|
"""Test YOLO predictions with sources listed in a single row of a CSV file."""
|
|
108
|
-
file =
|
|
102
|
+
file = tmp_path / "sources_single_row.csv"
|
|
109
103
|
with open(file, "w", newline="") as f:
|
|
110
104
|
writer = csv.writer(f)
|
|
111
105
|
writer.writerow(SOURCES_LIST)
|
|
@@ -142,25 +136,23 @@ def test_predict_visualize(model):
|
|
|
142
136
|
YOLO(WEIGHTS_DIR / model)(SOURCE, imgsz=32, visualize=True)
|
|
143
137
|
|
|
144
138
|
|
|
145
|
-
def
|
|
146
|
-
"""Test YOLO prediction on SOURCE converted to
|
|
139
|
+
def test_predict_gray_and_4ch(tmp_path):
|
|
140
|
+
"""Test YOLO prediction on SOURCE converted to grayscale and 4-channel images with various filenames."""
|
|
147
141
|
im = Image.open(SOURCE)
|
|
148
|
-
directory = TMP / "im4"
|
|
149
|
-
directory.mkdir(parents=True, exist_ok=True)
|
|
150
142
|
|
|
151
|
-
|
|
152
|
-
source_rgba =
|
|
153
|
-
source_non_utf =
|
|
154
|
-
source_spaces =
|
|
143
|
+
source_grayscale = tmp_path / "grayscale.jpg"
|
|
144
|
+
source_rgba = tmp_path / "4ch.png"
|
|
145
|
+
source_non_utf = tmp_path / "non_UTF_测试文件_tést_image.jpg"
|
|
146
|
+
source_spaces = tmp_path / "image with spaces.jpg"
|
|
155
147
|
|
|
156
|
-
im.convert("L").save(
|
|
148
|
+
im.convert("L").save(source_grayscale) # grayscale
|
|
157
149
|
im.convert("RGBA").save(source_rgba) # 4-ch PNG with alpha
|
|
158
150
|
im.save(source_non_utf) # non-UTF characters in filename
|
|
159
151
|
im.save(source_spaces) # spaces in filename
|
|
160
152
|
|
|
161
153
|
# Inference
|
|
162
154
|
model = YOLO(MODEL)
|
|
163
|
-
for f in source_rgba,
|
|
155
|
+
for f in source_rgba, source_grayscale, source_non_utf, source_spaces:
|
|
164
156
|
for source in Image.open(f), cv2.imread(str(f)), f:
|
|
165
157
|
results = model(source, save=True, verbose=True, imgsz=32)
|
|
166
158
|
assert len(results) == 1 # verify that an image was run
|
|
@@ -181,11 +173,9 @@ def test_youtube():
|
|
|
181
173
|
|
|
182
174
|
|
|
183
175
|
@pytest.mark.skipif(not ONLINE, reason="environment is offline")
|
|
184
|
-
@pytest.mark.skipif(not IS_TMP_WRITEABLE, reason="directory is not writeable")
|
|
185
176
|
@pytest.mark.parametrize("model", MODELS)
|
|
186
|
-
def test_track_stream(model):
|
|
187
|
-
"""
|
|
188
|
-
Test streaming tracking on a short 10 frame video using ByteTrack tracker and different GMC methods.
|
|
177
|
+
def test_track_stream(model, tmp_path):
|
|
178
|
+
"""Test streaming tracking on a short 10 frame video using ByteTrack tracker and different GMC methods.
|
|
189
179
|
|
|
190
180
|
Note imgsz=160 required for tracking for higher confidence and better matches.
|
|
191
181
|
"""
|
|
@@ -199,7 +189,7 @@ def test_track_stream(model):
|
|
|
199
189
|
# Test Global Motion Compensation (GMC) methods and ReID
|
|
200
190
|
for gmc, reidm in zip(["orb", "sift", "ecc"], ["auto", "auto", "yolo11n-cls.pt"]):
|
|
201
191
|
default_args = YAML.load(ROOT / "cfg/trackers/botsort.yaml")
|
|
202
|
-
custom_yaml =
|
|
192
|
+
custom_yaml = tmp_path / f"botsort-{gmc}.yaml"
|
|
203
193
|
YAML.save(custom_yaml, {**default_args, "gmc_method": gmc, "with_reid": True, "model": reidm})
|
|
204
194
|
model.track(video_url, imgsz=160, tracker=custom_yaml)
|
|
205
195
|
|
|
@@ -278,7 +268,7 @@ def test_predict_callback_and_setup():
|
|
|
278
268
|
model.add_callback("on_predict_batch_end", on_predict_batch_end)
|
|
279
269
|
|
|
280
270
|
dataset = load_inference_source(source=SOURCE)
|
|
281
|
-
bs = dataset.bs #
|
|
271
|
+
bs = dataset.bs # access predictor properties
|
|
282
272
|
results = model.predict(dataset, stream=True, imgsz=160) # source already setup
|
|
283
273
|
for r, im0, bs in results:
|
|
284
274
|
print("test_callback", im0.shape)
|
|
@@ -288,7 +278,7 @@ def test_predict_callback_and_setup():
|
|
|
288
278
|
|
|
289
279
|
|
|
290
280
|
@pytest.mark.parametrize("model", MODELS)
|
|
291
|
-
def test_results(model: str):
|
|
281
|
+
def test_results(model: str, tmp_path):
|
|
292
282
|
"""Test YOLO model results processing and output in various formats."""
|
|
293
283
|
im = f"{ASSETS_URL}/boats.jpg" if model == "yolo11n-obb.pt" else SOURCE
|
|
294
284
|
results = YOLO(WEIGHTS_DIR / model)([im, im], imgsz=160)
|
|
@@ -297,12 +287,12 @@ def test_results(model: str):
|
|
|
297
287
|
r = r.cpu().numpy()
|
|
298
288
|
print(r, len(r), r.path) # print numpy attributes
|
|
299
289
|
r = r.to(device="cpu", dtype=torch.float32)
|
|
300
|
-
r.save_txt(txt_file=
|
|
301
|
-
r.save_crop(save_dir=
|
|
290
|
+
r.save_txt(txt_file=tmp_path / "runs/tests/label.txt", save_conf=True)
|
|
291
|
+
r.save_crop(save_dir=tmp_path / "runs/tests/crops/")
|
|
302
292
|
r.to_df(decimals=3) # Align to_ methods: https://docs.ultralytics.com/modes/predict/#working-with-results
|
|
303
293
|
r.to_csv()
|
|
304
294
|
r.to_json(normalize=True)
|
|
305
|
-
r.plot(pil=True, save=True, filename=
|
|
295
|
+
r.plot(pil=True, save=True, filename=tmp_path / "results_plot_save.jpg")
|
|
306
296
|
r.plot(conf=True, boxes=True)
|
|
307
297
|
print(r, len(r), r.path) # print after methods
|
|
308
298
|
|
|
@@ -332,7 +322,7 @@ def test_labels_and_crops():
|
|
|
332
322
|
|
|
333
323
|
|
|
334
324
|
@pytest.mark.skipif(not ONLINE, reason="environment is offline")
|
|
335
|
-
def test_data_utils():
|
|
325
|
+
def test_data_utils(tmp_path):
|
|
336
326
|
"""Test utility functions in ultralytics/data/utils.py, including dataset stats and auto-splitting."""
|
|
337
327
|
from ultralytics.data.split import autosplit
|
|
338
328
|
from ultralytics.data.utils import HUBDatasetStats
|
|
@@ -343,26 +333,28 @@ def test_data_utils():
|
|
|
343
333
|
|
|
344
334
|
for task in TASKS:
|
|
345
335
|
file = Path(TASK2DATA[task]).with_suffix(".zip") # i.e. coco8.zip
|
|
346
|
-
download(f"https://github.com/ultralytics/hub/raw/main/example_datasets/{file}", unzip=False, dir=
|
|
347
|
-
stats = HUBDatasetStats(
|
|
336
|
+
download(f"https://github.com/ultralytics/hub/raw/main/example_datasets/{file}", unzip=False, dir=tmp_path)
|
|
337
|
+
stats = HUBDatasetStats(tmp_path / file, task=task)
|
|
348
338
|
stats.get_json(save=True)
|
|
349
339
|
stats.process_images()
|
|
350
340
|
|
|
351
|
-
autosplit(
|
|
352
|
-
zip_directory(
|
|
341
|
+
autosplit(tmp_path / "coco8")
|
|
342
|
+
zip_directory(tmp_path / "coco8/images/val") # zip
|
|
353
343
|
|
|
354
344
|
|
|
355
345
|
@pytest.mark.skipif(not ONLINE, reason="environment is offline")
|
|
356
|
-
def test_data_converter():
|
|
346
|
+
def test_data_converter(tmp_path):
|
|
357
347
|
"""Test dataset conversion functions from COCO to YOLO format and class mappings."""
|
|
358
348
|
from ultralytics.data.converter import coco80_to_coco91_class, convert_coco
|
|
359
349
|
|
|
360
|
-
download(f"{ASSETS_URL}/instances_val2017.json", dir=
|
|
361
|
-
convert_coco(
|
|
350
|
+
download(f"{ASSETS_URL}/instances_val2017.json", dir=tmp_path)
|
|
351
|
+
convert_coco(
|
|
352
|
+
labels_dir=tmp_path, save_dir=tmp_path / "yolo_labels", use_segments=True, use_keypoints=False, cls91to80=True
|
|
353
|
+
)
|
|
362
354
|
coco80_to_coco91_class()
|
|
363
355
|
|
|
364
356
|
|
|
365
|
-
def test_data_annotator():
|
|
357
|
+
def test_data_annotator(tmp_path):
|
|
366
358
|
"""Test automatic annotation of data using detection and segmentation models."""
|
|
367
359
|
from ultralytics.data.annotator import auto_annotate
|
|
368
360
|
|
|
@@ -370,7 +362,7 @@ def test_data_annotator():
|
|
|
370
362
|
ASSETS,
|
|
371
363
|
det_model=WEIGHTS_DIR / "yolo11n.pt",
|
|
372
364
|
sam_model=WEIGHTS_DIR / "mobile_sam.pt",
|
|
373
|
-
output_dir=
|
|
365
|
+
output_dir=tmp_path / "auto_annotate_labels",
|
|
374
366
|
)
|
|
375
367
|
|
|
376
368
|
|
|
@@ -393,7 +385,46 @@ def test_cfg_init():
|
|
|
393
385
|
check_dict_alignment({"a": 1}, {"b": 2})
|
|
394
386
|
copy_default_cfg()
|
|
395
387
|
(Path.cwd() / DEFAULT_CFG_PATH.name.replace(".yaml", "_copy.yaml")).unlink(missing_ok=False)
|
|
396
|
-
|
|
388
|
+
|
|
389
|
+
# Test smart_value() with comprehensive cases
|
|
390
|
+
# Test None conversion
|
|
391
|
+
assert smart_value("none") is None
|
|
392
|
+
assert smart_value("None") is None
|
|
393
|
+
assert smart_value("NONE") is None
|
|
394
|
+
|
|
395
|
+
# Test boolean conversion
|
|
396
|
+
assert smart_value("true") is True
|
|
397
|
+
assert smart_value("True") is True
|
|
398
|
+
assert smart_value("TRUE") is True
|
|
399
|
+
assert smart_value("false") is False
|
|
400
|
+
assert smart_value("False") is False
|
|
401
|
+
assert smart_value("FALSE") is False
|
|
402
|
+
|
|
403
|
+
# Test numeric conversion (ast.literal_eval)
|
|
404
|
+
assert smart_value("42") == 42
|
|
405
|
+
assert smart_value("-42") == -42
|
|
406
|
+
assert smart_value("3.14") == 3.14
|
|
407
|
+
assert smart_value("-3.14") == -3.14
|
|
408
|
+
assert smart_value("1e-3") == 0.001
|
|
409
|
+
|
|
410
|
+
# Test list/tuple conversion (ast.literal_eval)
|
|
411
|
+
assert smart_value("[1, 2, 3]") == [1, 2, 3]
|
|
412
|
+
assert smart_value("(1, 2, 3)") == (1, 2, 3)
|
|
413
|
+
assert smart_value("[640, 640]") == [640, 640]
|
|
414
|
+
|
|
415
|
+
# Test dict conversion (ast.literal_eval)
|
|
416
|
+
assert smart_value("{'a': 1, 'b': 2}") == {"a": 1, "b": 2}
|
|
417
|
+
|
|
418
|
+
# Test string fallback (when ast.literal_eval fails)
|
|
419
|
+
assert smart_value("some_string") == "some_string"
|
|
420
|
+
assert smart_value("path/to/file") == "path/to/file"
|
|
421
|
+
assert smart_value("hello world") == "hello world"
|
|
422
|
+
|
|
423
|
+
# Test that code injection is prevented (ast.literal_eval safety)
|
|
424
|
+
# These should return strings, not execute code
|
|
425
|
+
assert smart_value("__import__('os').system('ls')") == "__import__('os').system('ls')"
|
|
426
|
+
assert smart_value("eval('1+1')") == "eval('1+1')"
|
|
427
|
+
assert smart_value("exec('x=1')") == "exec('x=1')"
|
|
397
428
|
|
|
398
429
|
|
|
399
430
|
def test_utils_init():
|
|
@@ -464,7 +495,7 @@ def test_utils_ops():
|
|
|
464
495
|
torch.allclose(boxes, xyxyxyxy2xywhr(xywhr2xyxyxyxy(boxes)), rtol=1e-3)
|
|
465
496
|
|
|
466
497
|
|
|
467
|
-
def test_utils_files():
|
|
498
|
+
def test_utils_files(tmp_path):
|
|
468
499
|
"""Test file handling utilities including file age, date, and paths with spaces."""
|
|
469
500
|
from ultralytics.utils.files import file_age, file_date, get_latest_run, spaces_in_path
|
|
470
501
|
|
|
@@ -472,14 +503,14 @@ def test_utils_files():
|
|
|
472
503
|
file_date(SOURCE)
|
|
473
504
|
get_latest_run(ROOT / "runs")
|
|
474
505
|
|
|
475
|
-
path =
|
|
506
|
+
path = tmp_path / "path/with spaces"
|
|
476
507
|
path.mkdir(parents=True, exist_ok=True)
|
|
477
508
|
with spaces_in_path(path) as new_path:
|
|
478
509
|
print(new_path)
|
|
479
510
|
|
|
480
511
|
|
|
481
512
|
@pytest.mark.slow
|
|
482
|
-
def test_utils_patches_torch_save():
|
|
513
|
+
def test_utils_patches_torch_save(tmp_path):
|
|
483
514
|
"""Test torch_save backoff when _torch_save raises RuntimeError."""
|
|
484
515
|
from unittest.mock import MagicMock, patch
|
|
485
516
|
|
|
@@ -489,7 +520,7 @@ def test_utils_patches_torch_save():
|
|
|
489
520
|
|
|
490
521
|
with patch("ultralytics.utils.patches._torch_save", new=mock):
|
|
491
522
|
with pytest.raises(RuntimeError):
|
|
492
|
-
torch_save(torch.zeros(1),
|
|
523
|
+
torch_save(torch.zeros(1), tmp_path / "test.pt")
|
|
493
524
|
|
|
494
525
|
assert mock.call_count == 4, "torch_save was not attempted the expected number of times"
|
|
495
526
|
|
|
@@ -722,14 +753,14 @@ def test_multichannel():
|
|
|
722
753
|
|
|
723
754
|
|
|
724
755
|
@pytest.mark.parametrize("task,model,data", TASK_MODEL_DATA)
|
|
725
|
-
def test_grayscale(task: str, model: str, data: str) -> None:
|
|
756
|
+
def test_grayscale(task: str, model: str, data: str, tmp_path) -> None:
|
|
726
757
|
"""Test YOLO model grayscale training, validation, and prediction functionality."""
|
|
727
758
|
if task == "classify": # not support grayscale classification yet
|
|
728
759
|
return
|
|
729
|
-
grayscale_data =
|
|
760
|
+
grayscale_data = tmp_path / f"{Path(data).stem}-grayscale.yaml"
|
|
730
761
|
data = check_det_dataset(data)
|
|
731
762
|
data["channels"] = 1 # add additional channels key for grayscale
|
|
732
|
-
YAML.save(
|
|
763
|
+
YAML.save(data=data, file=grayscale_data)
|
|
733
764
|
# remove npy files in train/val splits if exists, might be created by previous tests
|
|
734
765
|
for split in {"train", "val"}:
|
|
735
766
|
for npy_file in (Path(data["path"]) / data[split]).glob("*.npy"):
|