ultralytics 8.3.124__tar.gz → 8.3.126__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.
Files changed (274) hide show
  1. {ultralytics-8.3.124/ultralytics.egg-info → ultralytics-8.3.126}/PKG-INFO +1 -1
  2. {ultralytics-8.3.124 → ultralytics-8.3.126}/tests/test_cuda.py +71 -66
  3. {ultralytics-8.3.124 → ultralytics-8.3.126}/tests/test_python.py +5 -8
  4. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/__init__.py +1 -1
  5. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/__init__.py +4 -5
  6. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/default.yaml +3 -3
  7. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/data/utils.py +7 -7
  8. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/engine/exporter.py +7 -7
  9. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/engine/model.py +3 -3
  10. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/engine/trainer.py +3 -2
  11. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/engine/tuner.py +3 -3
  12. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/hub/session.py +1 -1
  13. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/yolo/model.py +3 -3
  14. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/nn/autobackend.py +4 -4
  15. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/nn/tasks.py +2 -2
  16. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/solutions/analytics.py +7 -6
  17. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/trackers/track.py +2 -2
  18. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/utils/__init__.py +118 -56
  19. ultralytics-8.3.126/ultralytics/utils/autodevice.py +175 -0
  20. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/utils/benchmarks.py +6 -10
  21. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/utils/checks.py +4 -4
  22. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/utils/metrics.py +6 -2
  23. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/utils/plotting.py +11 -5
  24. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/utils/torch_utils.py +18 -5
  25. {ultralytics-8.3.124 → ultralytics-8.3.126/ultralytics.egg-info}/PKG-INFO +1 -1
  26. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics.egg-info/SOURCES.txt +1 -0
  27. {ultralytics-8.3.124 → ultralytics-8.3.126}/LICENSE +0 -0
  28. {ultralytics-8.3.124 → ultralytics-8.3.126}/README.md +0 -0
  29. {ultralytics-8.3.124 → ultralytics-8.3.126}/pyproject.toml +0 -0
  30. {ultralytics-8.3.124 → ultralytics-8.3.126}/setup.cfg +0 -0
  31. {ultralytics-8.3.124 → ultralytics-8.3.126}/tests/__init__.py +0 -0
  32. {ultralytics-8.3.124 → ultralytics-8.3.126}/tests/conftest.py +0 -0
  33. {ultralytics-8.3.124 → ultralytics-8.3.126}/tests/test_cli.py +0 -0
  34. {ultralytics-8.3.124 → ultralytics-8.3.126}/tests/test_engine.py +0 -0
  35. {ultralytics-8.3.124 → ultralytics-8.3.126}/tests/test_exports.py +0 -0
  36. {ultralytics-8.3.124 → ultralytics-8.3.126}/tests/test_integrations.py +0 -0
  37. {ultralytics-8.3.124 → ultralytics-8.3.126}/tests/test_solutions.py +0 -0
  38. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/assets/bus.jpg +0 -0
  39. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/assets/zidane.jpg +0 -0
  40. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
  41. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
  42. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
  43. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
  44. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
  45. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
  46. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
  47. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/datasets/VOC.yaml +0 -0
  48. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
  49. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
  50. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
  51. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
  52. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
  53. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/datasets/coco.yaml +0 -0
  54. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
  55. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/datasets/coco128.yaml +0 -0
  56. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/datasets/coco8-multispectral.yaml +0 -0
  57. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
  58. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
  59. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/datasets/coco8.yaml +0 -0
  60. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
  61. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/datasets/dog-pose.yaml +0 -0
  62. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/datasets/dota8-multispectral.yaml +0 -0
  63. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/datasets/dota8.yaml +0 -0
  64. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/datasets/hand-keypoints.yaml +0 -0
  65. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/datasets/lvis.yaml +0 -0
  66. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/datasets/medical-pills.yaml +0 -0
  67. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
  68. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
  69. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/datasets/signature.yaml +0 -0
  70. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
  71. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/datasets/xView.yaml +0 -0
  72. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/11/yolo11-cls-resnet18.yaml +0 -0
  73. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/11/yolo11-cls.yaml +0 -0
  74. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/11/yolo11-obb.yaml +0 -0
  75. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/11/yolo11-pose.yaml +0 -0
  76. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/11/yolo11-seg.yaml +0 -0
  77. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/11/yolo11.yaml +0 -0
  78. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/11/yoloe-11-seg.yaml +0 -0
  79. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/11/yoloe-11.yaml +0 -0
  80. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/12/yolo12-cls.yaml +0 -0
  81. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/12/yolo12-obb.yaml +0 -0
  82. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/12/yolo12-pose.yaml +0 -0
  83. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/12/yolo12-seg.yaml +0 -0
  84. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/12/yolo12.yaml +0 -0
  85. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
  86. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
  87. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
  88. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
  89. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/v10/yolov10b.yaml +0 -0
  90. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/v10/yolov10l.yaml +0 -0
  91. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/v10/yolov10m.yaml +0 -0
  92. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/v10/yolov10n.yaml +0 -0
  93. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/v10/yolov10s.yaml +0 -0
  94. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/v10/yolov10x.yaml +0 -0
  95. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
  96. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
  97. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
  98. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
  99. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
  100. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
  101. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/v8/yoloe-v8-seg.yaml +0 -0
  102. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/v8/yoloe-v8.yaml +0 -0
  103. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
  104. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
  105. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
  106. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
  107. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
  108. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
  109. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
  110. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
  111. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
  112. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
  113. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
  114. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
  115. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
  116. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
  117. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
  118. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
  119. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
  120. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
  121. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
  122. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
  123. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
  124. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/v9/yolov9m.yaml +0 -0
  125. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/v9/yolov9s.yaml +0 -0
  126. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/models/v9/yolov9t.yaml +0 -0
  127. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/trackers/botsort.yaml +0 -0
  128. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
  129. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/data/__init__.py +0 -0
  130. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/data/annotator.py +0 -0
  131. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/data/augment.py +0 -0
  132. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/data/base.py +0 -0
  133. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/data/build.py +0 -0
  134. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/data/converter.py +0 -0
  135. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/data/dataset.py +0 -0
  136. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/data/loaders.py +0 -0
  137. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/data/scripts/download_weights.sh +0 -0
  138. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/data/scripts/get_coco.sh +0 -0
  139. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/data/scripts/get_coco128.sh +0 -0
  140. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/data/scripts/get_imagenet.sh +0 -0
  141. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/data/split.py +0 -0
  142. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/data/split_dota.py +0 -0
  143. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/engine/__init__.py +0 -0
  144. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/engine/predictor.py +0 -0
  145. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/engine/results.py +0 -0
  146. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/engine/validator.py +0 -0
  147. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/hub/__init__.py +0 -0
  148. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/hub/auth.py +0 -0
  149. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/hub/google/__init__.py +0 -0
  150. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/hub/utils.py +0 -0
  151. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/__init__.py +0 -0
  152. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/fastsam/__init__.py +0 -0
  153. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/fastsam/model.py +0 -0
  154. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/fastsam/predict.py +0 -0
  155. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/fastsam/utils.py +0 -0
  156. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/fastsam/val.py +0 -0
  157. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/nas/__init__.py +0 -0
  158. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/nas/model.py +0 -0
  159. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/nas/predict.py +0 -0
  160. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/nas/val.py +0 -0
  161. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/rtdetr/__init__.py +0 -0
  162. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/rtdetr/model.py +0 -0
  163. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/rtdetr/predict.py +0 -0
  164. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/rtdetr/train.py +0 -0
  165. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/rtdetr/val.py +0 -0
  166. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/sam/__init__.py +0 -0
  167. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/sam/amg.py +0 -0
  168. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/sam/build.py +0 -0
  169. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/sam/model.py +0 -0
  170. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/sam/modules/__init__.py +0 -0
  171. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/sam/modules/blocks.py +0 -0
  172. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/sam/modules/decoders.py +0 -0
  173. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/sam/modules/encoders.py +0 -0
  174. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/sam/modules/memory_attention.py +0 -0
  175. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/sam/modules/sam.py +0 -0
  176. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
  177. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/sam/modules/transformer.py +0 -0
  178. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/sam/modules/utils.py +0 -0
  179. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/sam/predict.py +0 -0
  180. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/utils/__init__.py +0 -0
  181. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/utils/loss.py +0 -0
  182. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/utils/ops.py +0 -0
  183. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/yolo/__init__.py +0 -0
  184. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/yolo/classify/__init__.py +0 -0
  185. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/yolo/classify/predict.py +0 -0
  186. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/yolo/classify/train.py +0 -0
  187. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/yolo/classify/val.py +0 -0
  188. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/yolo/detect/__init__.py +0 -0
  189. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/yolo/detect/predict.py +0 -0
  190. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/yolo/detect/train.py +0 -0
  191. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/yolo/detect/val.py +0 -0
  192. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/yolo/obb/__init__.py +0 -0
  193. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/yolo/obb/predict.py +0 -0
  194. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/yolo/obb/train.py +0 -0
  195. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/yolo/obb/val.py +0 -0
  196. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/yolo/pose/__init__.py +0 -0
  197. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/yolo/pose/predict.py +0 -0
  198. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/yolo/pose/train.py +0 -0
  199. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/yolo/pose/val.py +0 -0
  200. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/yolo/segment/__init__.py +0 -0
  201. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/yolo/segment/predict.py +0 -0
  202. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/yolo/segment/train.py +0 -0
  203. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/yolo/segment/val.py +0 -0
  204. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/yolo/world/__init__.py +0 -0
  205. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/yolo/world/train.py +0 -0
  206. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/yolo/world/train_world.py +0 -0
  207. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/yolo/yoloe/__init__.py +0 -0
  208. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/yolo/yoloe/predict.py +0 -0
  209. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/yolo/yoloe/train.py +0 -0
  210. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/yolo/yoloe/train_seg.py +0 -0
  211. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/models/yolo/yoloe/val.py +0 -0
  212. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/nn/__init__.py +0 -0
  213. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/nn/modules/__init__.py +0 -0
  214. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/nn/modules/activation.py +0 -0
  215. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/nn/modules/block.py +0 -0
  216. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/nn/modules/conv.py +0 -0
  217. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/nn/modules/head.py +0 -0
  218. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/nn/modules/transformer.py +0 -0
  219. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/nn/modules/utils.py +0 -0
  220. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/nn/text_model.py +0 -0
  221. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/solutions/__init__.py +0 -0
  222. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/solutions/ai_gym.py +0 -0
  223. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/solutions/config.py +0 -0
  224. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/solutions/distance_calculation.py +0 -0
  225. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/solutions/heatmap.py +0 -0
  226. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/solutions/instance_segmentation.py +0 -0
  227. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/solutions/object_blurrer.py +0 -0
  228. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/solutions/object_counter.py +0 -0
  229. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/solutions/object_cropper.py +0 -0
  230. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/solutions/parking_management.py +0 -0
  231. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/solutions/queue_management.py +0 -0
  232. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/solutions/region_counter.py +0 -0
  233. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/solutions/security_alarm.py +0 -0
  234. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/solutions/solutions.py +0 -0
  235. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/solutions/speed_estimation.py +0 -0
  236. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/solutions/streamlit_inference.py +0 -0
  237. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/solutions/trackzone.py +0 -0
  238. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/solutions/vision_eye.py +0 -0
  239. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/trackers/__init__.py +0 -0
  240. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/trackers/basetrack.py +0 -0
  241. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/trackers/bot_sort.py +0 -0
  242. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/trackers/byte_tracker.py +0 -0
  243. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/trackers/utils/__init__.py +0 -0
  244. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/trackers/utils/gmc.py +0 -0
  245. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/trackers/utils/kalman_filter.py +0 -0
  246. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/trackers/utils/matching.py +0 -0
  247. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/utils/autobatch.py +0 -0
  248. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/utils/callbacks/__init__.py +0 -0
  249. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/utils/callbacks/base.py +0 -0
  250. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/utils/callbacks/clearml.py +0 -0
  251. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/utils/callbacks/comet.py +0 -0
  252. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/utils/callbacks/dvc.py +0 -0
  253. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/utils/callbacks/hub.py +0 -0
  254. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/utils/callbacks/mlflow.py +0 -0
  255. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/utils/callbacks/neptune.py +0 -0
  256. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/utils/callbacks/raytune.py +0 -0
  257. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/utils/callbacks/tensorboard.py +0 -0
  258. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/utils/callbacks/wb.py +0 -0
  259. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/utils/dist.py +0 -0
  260. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/utils/downloads.py +0 -0
  261. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/utils/errors.py +0 -0
  262. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/utils/export.py +0 -0
  263. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/utils/files.py +0 -0
  264. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/utils/instance.py +0 -0
  265. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/utils/loss.py +0 -0
  266. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/utils/ops.py +0 -0
  267. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/utils/patches.py +0 -0
  268. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/utils/tal.py +0 -0
  269. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/utils/triton.py +0 -0
  270. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics/utils/tuner.py +0 -0
  271. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics.egg-info/dependency_links.txt +0 -0
  272. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics.egg-info/entry_points.txt +0 -0
  273. {ultralytics-8.3.124 → ultralytics-8.3.126}/ultralytics.egg-info/requires.txt +0 -0
  274. {ultralytics-8.3.124 → ultralytics-8.3.126}/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.124
3
+ Version: 8.3.126
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>
@@ -10,8 +10,18 @@ from tests import CUDA_DEVICE_COUNT, CUDA_IS_AVAILABLE, MODEL, SOURCE
10
10
  from ultralytics import YOLO
11
11
  from ultralytics.cfg import TASK2DATA, TASK2MODEL, TASKS
12
12
  from ultralytics.utils import ASSETS, WEIGHTS_DIR
13
+ from ultralytics.utils.autodevice import GPUInfo
13
14
  from ultralytics.utils.checks import check_amp
14
15
 
16
+ # Try to find idle devices if CUDA is available
17
+ DEVICES = []
18
+ if CUDA_IS_AVAILABLE:
19
+ gpu_info = GPUInfo()
20
+ gpu_info.print_status()
21
+ idle_gpus = gpu_info.select_idle_gpu(count=2, min_memory_mb=2048)
22
+ if idle_gpus:
23
+ DEVICES = idle_gpus
24
+
15
25
 
16
26
  def test_checks():
17
27
  """Validate CUDA settings against torch CUDA functions."""
@@ -19,16 +29,16 @@ def test_checks():
19
29
  assert torch.cuda.device_count() == CUDA_DEVICE_COUNT
20
30
 
21
31
 
22
- @pytest.mark.skipif(not CUDA_IS_AVAILABLE, reason="CUDA is not available")
32
+ @pytest.mark.skipif(not DEVICES, reason="No CUDA devices available")
23
33
  def test_amp():
24
34
  """Test AMP training checks."""
25
- model = YOLO("yolo11n.pt").model.cuda()
35
+ model = YOLO("yolo11n.pt").model.to(f"cuda:{DEVICES[0]}")
26
36
  assert check_amp(model)
27
37
 
28
38
 
29
39
  @pytest.mark.slow
30
40
  @pytest.mark.skipif(True, reason="CUDA export tests disabled pending additional Ultralytics GPU server availability")
31
- @pytest.mark.skipif(not CUDA_IS_AVAILABLE, reason="CUDA is not available")
41
+ @pytest.mark.skipif(not DEVICES, reason="No CUDA devices available")
32
42
  @pytest.mark.parametrize(
33
43
  "task, dynamic, int8, half, batch",
34
44
  [ # generate all combinations but exclude those where both int8 and half are True
@@ -40,16 +50,7 @@ def test_amp():
40
50
  ],
41
51
  )
42
52
  def test_export_engine_matrix(task, dynamic, int8, half, batch):
43
- """
44
- Test YOLO model export to TensorRT format for various configurations and run inference.
45
-
46
- Args:
47
- task (str): Task type like 'detect', 'segment', etc.
48
- dynamic (bool): Whether to use dynamic input size.
49
- int8 (bool): Whether to use INT8 precision.
50
- half (bool): Whether to use FP16 precision.
51
- batch (int): Batch size for export.
52
- """
53
+ """Test YOLO model export to TensorRT format for various configurations and run inference."""
53
54
  file = YOLO(TASK2MODEL[task]).export(
54
55
  format="engine",
55
56
  imgsz=32,
@@ -60,105 +61,109 @@ def test_export_engine_matrix(task, dynamic, int8, half, batch):
60
61
  data=TASK2DATA[task],
61
62
  workspace=1, # reduce workspace GB for less resource utilization during testing
62
63
  simplify=True, # use 'onnxslim'
64
+ device=DEVICES[0],
63
65
  )
64
- YOLO(file)([SOURCE] * batch, imgsz=64 if dynamic else 32) # exported model inference
66
+ YOLO(file)([SOURCE] * batch, imgsz=64 if dynamic else 32, device=DEVICES[0]) # exported model inference
65
67
  Path(file).unlink() # cleanup
66
68
  Path(file).with_suffix(".cache").unlink() if int8 else None # cleanup INT8 cache
67
69
 
68
70
 
69
- @pytest.mark.skipif(not CUDA_IS_AVAILABLE, reason="CUDA is not available")
71
+ @pytest.mark.skipif(not DEVICES, reason="No CUDA devices available")
70
72
  def test_train():
71
73
  """Test model training on a minimal dataset using available CUDA devices."""
72
- device = 0 if CUDA_DEVICE_COUNT == 1 else [0, 1]
74
+ device = DEVICES if len(DEVICES) > 1 else DEVICES[0]
73
75
  YOLO(MODEL).train(data="coco8.yaml", imgsz=64, epochs=1, device=device) # requires imgsz>=64
74
76
 
75
77
 
76
78
  @pytest.mark.slow
77
- @pytest.mark.skipif(not CUDA_IS_AVAILABLE, reason="CUDA is not available")
79
+ @pytest.mark.skipif(not DEVICES, reason="No CUDA devices available")
78
80
  def test_predict_multiple_devices():
79
81
  """Validate model prediction consistency across CPU and CUDA devices."""
80
82
  model = YOLO("yolo11n.pt")
83
+
84
+ # Test CPU
81
85
  model = model.cpu()
82
86
  assert str(model.device) == "cpu"
83
- _ = model(SOURCE) # CPU inference
87
+ _ = model(SOURCE)
84
88
  assert str(model.device) == "cpu"
85
89
 
86
- model = model.to("cuda:0")
87
- assert str(model.device) == "cuda:0"
88
- _ = model(SOURCE) # CUDA inference
89
- assert str(model.device) == "cuda:0"
90
+ # Test CUDA
91
+ cuda_device = f"cuda:{DEVICES[0]}"
92
+ model = model.to(cuda_device)
93
+ assert str(model.device) == cuda_device
94
+ _ = model(SOURCE)
95
+ assert str(model.device) == cuda_device
90
96
 
97
+ # Test CPU again
91
98
  model = model.cpu()
92
99
  assert str(model.device) == "cpu"
93
- _ = model(SOURCE) # CPU inference
100
+ _ = model(SOURCE)
94
101
  assert str(model.device) == "cpu"
95
102
 
96
- model = model.cuda()
97
- assert str(model.device) == "cuda:0"
98
- _ = model(SOURCE) # CUDA inference
99
- assert str(model.device) == "cuda:0"
103
+ # Test CUDA again
104
+ model = model.to(cuda_device)
105
+ assert str(model.device) == cuda_device
106
+ _ = model(SOURCE)
107
+ assert str(model.device) == cuda_device
100
108
 
101
109
 
102
- @pytest.mark.skipif(not CUDA_IS_AVAILABLE, reason="CUDA is not available")
110
+ @pytest.mark.skipif(not DEVICES, reason="No CUDA devices available")
103
111
  def test_autobatch():
104
112
  """Check optimal batch size for YOLO model training using autobatch utility."""
105
113
  from ultralytics.utils.autobatch import check_train_batch_size
106
114
 
107
- check_train_batch_size(YOLO(MODEL).model.cuda(), imgsz=128, amp=True)
115
+ check_train_batch_size(YOLO(MODEL).model.to(f"cuda:{DEVICES[0]}"), imgsz=128, amp=True)
108
116
 
109
117
 
110
118
  @pytest.mark.slow
111
- @pytest.mark.skipif(not CUDA_IS_AVAILABLE, reason="CUDA is not available")
119
+ @pytest.mark.skipif(not DEVICES, reason="No CUDA devices available")
112
120
  def test_utils_benchmarks():
113
121
  """Profile YOLO models for performance benchmarks."""
114
122
  from ultralytics.utils.benchmarks import ProfileModels
115
123
 
116
124
  # Pre-export a dynamic engine model to use dynamic inference
117
- YOLO(MODEL).export(format="engine", imgsz=32, dynamic=True, batch=1)
118
- ProfileModels([MODEL], imgsz=32, half=False, min_time=1, num_timed_runs=3, num_warmup_runs=1).run()
125
+ YOLO(MODEL).export(format="engine", imgsz=32, dynamic=True, batch=1, device=DEVICES[0])
126
+ ProfileModels(
127
+ [MODEL],
128
+ imgsz=32,
129
+ half=False,
130
+ min_time=1,
131
+ num_timed_runs=3,
132
+ num_warmup_runs=1,
133
+ device=DEVICES[0],
134
+ ).run()
119
135
 
120
136
 
121
- @pytest.mark.skipif(not CUDA_IS_AVAILABLE, reason="CUDA is not available")
137
+ @pytest.mark.skipif(not DEVICES, reason="No CUDA devices available")
122
138
  def test_predict_sam():
123
- """Test SAM model predictions using different prompts, including bounding boxes and point annotations."""
139
+ """Test SAM model predictions using different prompts."""
124
140
  from ultralytics import SAM
125
141
  from ultralytics.models.sam import Predictor as SAMPredictor
126
142
 
127
- # Load a model
128
143
  model = SAM(WEIGHTS_DIR / "sam2.1_b.pt")
129
-
130
- # Display model information (optional)
131
144
  model.info()
132
145
 
133
- # Run inference
134
- model(SOURCE, device=0)
135
-
136
- # Run inference with bboxes prompt
137
- model(SOURCE, bboxes=[439, 437, 524, 709], device=0)
138
-
139
- # Run inference with no labels
140
- model(ASSETS / "zidane.jpg", points=[900, 370], device=0)
141
-
142
- # Run inference with 1D points and 1D labels
143
- model(ASSETS / "zidane.jpg", points=[900, 370], labels=[1], device=0)
144
-
145
- # Run inference with 2D points and 1D labels
146
- model(ASSETS / "zidane.jpg", points=[[900, 370]], labels=[1], device=0)
147
-
148
- # Run inference with multiple 2D points and 1D labels
149
- model(ASSETS / "zidane.jpg", points=[[400, 370], [900, 370]], labels=[1, 1], device=0)
150
-
151
- # Run inference with 3D points and 2D labels (multiple points per object)
152
- model(ASSETS / "zidane.jpg", points=[[[900, 370], [1000, 100]]], labels=[[1, 1]], device=0)
153
-
154
- # Create SAMPredictor
155
- overrides = dict(conf=0.25, task="segment", mode="predict", imgsz=1024, model=WEIGHTS_DIR / "mobile_sam.pt")
156
- predictor = SAMPredictor(overrides=overrides)
157
-
158
- # Set image
159
- predictor.set_image(ASSETS / "zidane.jpg") # set with image file
146
+ # Run inference with various prompts
147
+ model(SOURCE, device=DEVICES[0])
148
+ model(SOURCE, bboxes=[439, 437, 524, 709], device=DEVICES[0])
149
+ model(ASSETS / "zidane.jpg", points=[900, 370], device=DEVICES[0])
150
+ model(ASSETS / "zidane.jpg", points=[900, 370], labels=[1], device=DEVICES[0])
151
+ model(ASSETS / "zidane.jpg", points=[[900, 370]], labels=[1], device=DEVICES[0])
152
+ model(ASSETS / "zidane.jpg", points=[[400, 370], [900, 370]], labels=[1, 1], device=DEVICES[0])
153
+ model(ASSETS / "zidane.jpg", points=[[[900, 370], [1000, 100]]], labels=[[1, 1]], device=DEVICES[0])
154
+
155
+ # Test predictor
156
+ predictor = SAMPredictor(
157
+ overrides=dict(
158
+ conf=0.25,
159
+ task="segment",
160
+ mode="predict",
161
+ imgsz=1024,
162
+ model=WEIGHTS_DIR / "mobile_sam.pt",
163
+ device=DEVICES[0],
164
+ )
165
+ )
166
+ predictor.set_image(ASSETS / "zidane.jpg")
160
167
  # predictor(bboxes=[439, 437, 524, 709])
161
168
  # predictor(points=[900, 370], labels=[1])
162
-
163
- # Reset image
164
169
  predictor.reset_image()
@@ -10,7 +10,6 @@ import cv2
10
10
  import numpy as np
11
11
  import pytest
12
12
  import torch
13
- import yaml
14
13
  from PIL import Image
15
14
 
16
15
  from tests import CFG, MODEL, SOURCE, SOURCES_LIST, TMP
@@ -28,6 +27,7 @@ from ultralytics.utils import (
28
27
  ROOT,
29
28
  WEIGHTS_DIR,
30
29
  WINDOWS,
30
+ YAML,
31
31
  checks,
32
32
  is_dir_writeable,
33
33
  is_github_action_running,
@@ -190,13 +190,10 @@ def test_track_stream():
190
190
 
191
191
  # Test Global Motion Compensation (GMC) methods
192
192
  for gmc in "orb", "sift", "ecc":
193
- with open(ROOT / "cfg/trackers/botsort.yaml", encoding="utf-8") as f:
194
- data = yaml.safe_load(f)
195
- tracker = TMP / f"botsort-{gmc}.yaml"
196
- data["gmc_method"] = gmc
197
- with open(tracker, "w", encoding="utf-8") as f:
198
- yaml.safe_dump(data, f)
199
- model.track(video_url, imgsz=160, tracker=tracker)
193
+ default_args = YAML.load(ROOT / "cfg/trackers/botsort.yaml")
194
+ custom_yaml = TMP / f"botsort-{gmc}.yaml"
195
+ YAML.save(custom_yaml, {**default_args, "gmc_method": gmc})
196
+ model.track(video_url, imgsz=160, tracker=custom_yaml)
200
197
 
201
198
 
202
199
  def test_val():
@@ -1,6 +1,6 @@
1
1
  # Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
2
2
 
3
- __version__ = "8.3.124"
3
+ __version__ = "8.3.126"
4
4
 
5
5
  import os
6
6
 
@@ -23,13 +23,12 @@ from ultralytics.utils import (
23
23
  SETTINGS,
24
24
  SETTINGS_FILE,
25
25
  TESTS_RUNNING,
26
+ YAML,
26
27
  IterableSimpleNamespace,
27
28
  checks,
28
29
  colorstr,
29
30
  deprecation_warn,
30
31
  vscode_msg,
31
- yaml_load,
32
- yaml_print,
33
32
  )
34
33
 
35
34
  # Define valid solutions
@@ -270,7 +269,7 @@ def cfg2dict(cfg: Union[str, Path, Dict, SimpleNamespace]) -> Dict:
270
269
  - If cfg is already a dictionary, it's returned unchanged.
271
270
  """
272
271
  if isinstance(cfg, (str, Path)):
273
- cfg = yaml_load(cfg) # load dict
272
+ cfg = YAML.load(cfg) # load dict
274
273
  elif isinstance(cfg, SimpleNamespace):
275
274
  cfg = vars(cfg) # convert to dict
276
275
  return cfg
@@ -853,7 +852,7 @@ def entrypoint(debug: str = "") -> None:
853
852
  "checks": checks.collect_system_info,
854
853
  "version": lambda: LOGGER.info(__version__),
855
854
  "settings": lambda: handle_yolo_settings(args[1:]),
856
- "cfg": lambda: yaml_print(DEFAULT_CFG_PATH),
855
+ "cfg": lambda: YAML.print(DEFAULT_CFG_PATH),
857
856
  "hub": lambda: handle_yolo_hub(args[1:]),
858
857
  "login": lambda: handle_yolo_hub(args),
859
858
  "logout": lambda: handle_yolo_hub(args),
@@ -880,7 +879,7 @@ def entrypoint(debug: str = "") -> None:
880
879
  k, v = parse_key_value_pair(a)
881
880
  if k == "cfg" and v is not None: # custom.yaml passed
882
881
  LOGGER.info(f"Overriding {DEFAULT_CFG_PATH} with {v}")
883
- overrides = {k: val for k, val in yaml_load(checks.check_yaml(v)).items() if k != "cfg"}
882
+ overrides = {k: val for k, val in YAML.load(checks.check_yaml(v)).items() if k != "cfg"}
884
883
  else:
885
884
  overrides[k] = v
886
885
  except (NameError, SyntaxError, ValueError, AssertionError) as e:
@@ -17,7 +17,7 @@ imgsz: 640 # (int | list) input images size as int for train and val modes, or l
17
17
  save: True # (bool) save train checkpoints and predict results
18
18
  save_period: -1 # (int) Save checkpoint every x epochs (disabled if < 1)
19
19
  cache: False # (bool) True/ram, disk or False. Use cache for data loading
20
- device: # (int | str | list, optional) device to run on, i.e. cuda device=0 or device=0,1,2,3 or device=cpu
20
+ device: # (int | str | list) device: CUDA device=0 or [0,1,2,3] or "cpu/mps" or -1 or [-1,-1] to auto-select idle GPUs
21
21
  workers: 8 # (int) number of worker threads for data loading (per RANK if DDP)
22
22
  project: # (str, optional) project name
23
23
  name: # (str, optional) experiment name, results saved to 'project/name' directory
@@ -35,7 +35,7 @@ resume: False # (bool) resume training from last checkpoint
35
35
  amp: True # (bool) Automatic Mixed Precision (AMP) training, choices=[True, False], True runs AMP check
36
36
  fraction: 1.0 # (float) dataset fraction to train on (default is 1.0, all images in train set)
37
37
  profile: False # (bool) profile ONNX and TensorRT speeds during training for loggers
38
- freeze: None # (int | list, optional) freeze first n layers, or freeze list of layer indices during training
38
+ freeze: # (int | list, optional) freeze first n layers, or freeze list of layer indices during training
39
39
  multi_scale: False # (bool) Whether to use multiscale during training
40
40
  # Segmentation
41
41
  overlap_mask: True # (bool) merge object masks into a single image mask during training (segment train only)
@@ -84,7 +84,7 @@ int8: False # (bool) CoreML/TF INT8 quantization
84
84
  dynamic: False # (bool) ONNX/TF/TensorRT: dynamic axes
85
85
  simplify: True # (bool) ONNX: simplify model using `onnxslim`
86
86
  opset: # (int, optional) ONNX: opset version
87
- workspace: None # (float, optional) TensorRT: workspace size (GiB), `None` will let TensorRT auto-allocate memory
87
+ workspace: # (float, optional) TensorRT: workspace size (GiB), `None` will let TensorRT auto-allocate memory
88
88
  nms: False # (bool) CoreML: add NMS
89
89
 
90
90
  # Hyperparameters ------------------------------------------------------------------------------------------------------
@@ -18,16 +18,16 @@ from ultralytics.nn.autobackend import check_class_names
18
18
  from ultralytics.utils import (
19
19
  DATASETS_DIR,
20
20
  LOGGER,
21
+ MACOS,
21
22
  NUM_THREADS,
22
23
  ROOT,
23
24
  SETTINGS_FILE,
24
25
  TQDM,
26
+ YAML,
25
27
  clean_url,
26
28
  colorstr,
27
29
  emojis,
28
30
  is_dir_writeable,
29
- yaml_load,
30
- yaml_save,
31
31
  )
32
32
  from ultralytics.utils.checks import check_file, check_font, is_ascii
33
33
  from ultralytics.utils.downloads import download, safe_download, unzip_file
@@ -36,7 +36,7 @@ from ultralytics.utils.ops import segments2boxes
36
36
  HELP_URL = "See https://docs.ultralytics.com/datasets for dataset formatting guidance."
37
37
  IMG_FORMATS = {"bmp", "dng", "jpeg", "jpg", "mpo", "png", "tif", "tiff", "webp", "pfm", "heic"} # image suffixes
38
38
  VID_FORMATS = {"asf", "avi", "gif", "m4v", "mkv", "mov", "mp4", "mpeg", "mpg", "ts", "wmv", "webm"} # video suffixes
39
- PIN_MEMORY = str(os.getenv("PIN_MEMORY", True)).lower() == "true" # global pin_memory for dataloaders
39
+ PIN_MEMORY = str(os.getenv("PIN_MEMORY", not MACOS)).lower() == "true" # global pin_memory for dataloaders
40
40
  FORMATS_HELP_MSG = f"Supported formats are:\nimages: {IMG_FORMATS}\nvideos: {VID_FORMATS}"
41
41
 
42
42
 
@@ -399,7 +399,7 @@ def check_det_dataset(dataset, autodownload=True):
399
399
  extract_dir, autodownload = file.parent, False
400
400
 
401
401
  # Read YAML
402
- data = yaml_load(file, append_filename=True) # dictionary
402
+ data = YAML.load(file, append_filename=True) # dictionary
403
403
 
404
404
  # Checks
405
405
  for k in "train", "val":
@@ -492,7 +492,7 @@ def check_cls_dataset(dataset, split=""):
492
492
  # Download (optional if dataset=https://file.zip is passed directly)
493
493
  if str(dataset).startswith(("http:/", "https:/")):
494
494
  dataset = safe_download(dataset, dir=DATASETS_DIR, unzip=True, delete=False)
495
- elif Path(dataset).suffix in {".zip", ".tar", ".gz"}:
495
+ elif str(dataset).endswith((".zip", ".tar", ".gz")):
496
496
  file = check_file(dataset)
497
497
  dataset = safe_download(file, dir=DATASETS_DIR, unzip=True, delete=False)
498
498
 
@@ -599,9 +599,9 @@ class HUBDatasetStats:
599
599
  _, data_dir, yaml_path = self._unzip(Path(path))
600
600
  try:
601
601
  # Load YAML with checks
602
- data = yaml_load(yaml_path)
602
+ data = YAML.load(yaml_path)
603
603
  data["path"] = "" # strip path since YAML should be in dataset root for all HUB datasets
604
- yaml_save(yaml_path, data)
604
+ YAML.save(yaml_path, data)
605
605
  data = check_det_dataset(yaml_path, autodownload) # dict
606
606
  data["path"] = data_dir # YAML path should be set to '' (relative) or parent (absolute)
607
607
  except Exception as e:
@@ -89,10 +89,10 @@ from ultralytics.utils import (
89
89
  RKNN_CHIPS,
90
90
  ROOT,
91
91
  WINDOWS,
92
+ YAML,
92
93
  callbacks,
93
94
  colorstr,
94
95
  get_default_args,
95
- yaml_save,
96
96
  )
97
97
  from ultralytics.utils.checks import (
98
98
  check_imgsz,
@@ -631,7 +631,7 @@ class Exporter:
631
631
  ov_model.set_rt_info("fit_to_window_letterbox", ["model_info", "resize_type"])
632
632
 
633
633
  ov.save_model(ov_model, file, compress_to_fp16=self.args.half)
634
- yaml_save(Path(file).parent / "metadata.yaml", self.metadata) # add metadata.yaml
634
+ YAML.save(Path(file).parent / "metadata.yaml", self.metadata) # add metadata.yaml
635
635
 
636
636
  if self.args.int8:
637
637
  fq = str(self.file).replace(self.file.suffix, f"_int8_openvino_model{os.sep}")
@@ -690,7 +690,7 @@ class Exporter:
690
690
  f = str(self.file).replace(self.file.suffix, f"_paddle_model{os.sep}")
691
691
 
692
692
  pytorch2paddle(module=self.model, save_dir=f, jit_type="trace", input_examples=[self.im]) # export
693
- yaml_save(Path(f) / "metadata.yaml", self.metadata) # add metadata.yaml
693
+ YAML.save(Path(f) / "metadata.yaml", self.metadata) # add metadata.yaml
694
694
  return f, None
695
695
 
696
696
  @try_export
@@ -783,7 +783,7 @@ class Exporter:
783
783
  for f_debug in ("debug.bin", "debug.param", "debug2.bin", "debug2.param", *pnnx_files):
784
784
  Path(f_debug).unlink(missing_ok=True)
785
785
 
786
- yaml_save(f / "metadata.yaml", self.metadata) # add metadata.yaml
786
+ YAML.save(f / "metadata.yaml", self.metadata) # add metadata.yaml
787
787
  return str(f), None
788
788
 
789
789
  @try_export
@@ -974,7 +974,7 @@ class Exporter:
974
974
  output_signaturedefs=True, # fix error with Attention block group convolution
975
975
  optimization_for_gpu_delegate=True,
976
976
  )
977
- yaml_save(f / "metadata.yaml", self.metadata) # add metadata.yaml
977
+ YAML.save(f / "metadata.yaml", self.metadata) # add metadata.yaml
978
978
 
979
979
  # Remove/rename TFLite models
980
980
  if self.args.int8:
@@ -1087,7 +1087,7 @@ class Exporter:
1087
1087
  LOGGER.warning(f"{prefix} your model may not work correctly with spaces in path '{f}'.")
1088
1088
 
1089
1089
  # Add metadata
1090
- yaml_save(Path(f) / "metadata.yaml", self.metadata) # add metadata.yaml
1090
+ YAML.save(Path(f) / "metadata.yaml", self.metadata) # add metadata.yaml
1091
1091
  return f, None
1092
1092
 
1093
1093
  @try_export
@@ -1114,7 +1114,7 @@ class Exporter:
1114
1114
  rknn.build(do_quantization=self.args.int8)
1115
1115
  f = f.replace(".onnx", f"-{self.args.name}-int8.rknn" if self.args.int8 else f"-{self.args.name}-fp16.rknn")
1116
1116
  rknn.export_rknn(f"{export_path / f}")
1117
- yaml_save(export_path / "metadata.yaml", self.metadata)
1117
+ YAML.save(export_path / "metadata.yaml", self.metadata)
1118
1118
  return export_path, None
1119
1119
 
1120
1120
  @try_export
@@ -18,9 +18,9 @@ from ultralytics.utils import (
18
18
  LOGGER,
19
19
  RANK,
20
20
  SETTINGS,
21
+ YAML,
21
22
  callbacks,
22
23
  checks,
23
- yaml_load,
24
24
  )
25
25
 
26
26
 
@@ -142,7 +142,7 @@ class Model(torch.nn.Module):
142
142
 
143
143
  # Load or create new YOLO model
144
144
  __import__("os").environ["CUBLAS_WORKSPACE_CONFIG"] = ":4096:8" # to avoid deterministic warnings
145
- if Path(model).suffix in {".yaml", ".yml"}:
145
+ if str(model).endswith((".yaml", ".yml")):
146
146
  self._new(model, task=task, verbose=verbose)
147
147
  else:
148
148
  self._load(model, task=task)
@@ -773,7 +773,7 @@ class Model(torch.nn.Module):
773
773
 
774
774
  checks.check_pip_update_available()
775
775
 
776
- overrides = yaml_load(checks.check_yaml(kwargs["cfg"])) if kwargs.get("cfg") else self.overrides
776
+ overrides = YAML.load(checks.check_yaml(kwargs["cfg"])) if kwargs.get("cfg") else self.overrides
777
777
  custom = {
778
778
  # NOTE: handle the case when 'cfg' includes 'data'.
779
779
  "data": overrides.get("data") or DEFAULT_CFG_DICT["data"] or TASK2DATA[self.task],
@@ -31,11 +31,11 @@ from ultralytics.utils import (
31
31
  LOGGER,
32
32
  RANK,
33
33
  TQDM,
34
+ YAML,
34
35
  callbacks,
35
36
  clean_url,
36
37
  colorstr,
37
38
  emojis,
38
- yaml_save,
39
39
  )
40
40
  from ultralytics.utils.autobatch import check_train_batch_size
41
41
  from ultralytics.utils.checks import check_amp, check_file, check_imgsz, check_model_file_from_stem, print_args
@@ -105,6 +105,7 @@ class BaseTrainer:
105
105
  self.args = get_cfg(cfg, overrides)
106
106
  self.check_resume(overrides)
107
107
  self.device = select_device(self.args.device, self.args.batch)
108
+ self.args.device = str(self.device) # ensure -1 is updated to selected CUDA device
108
109
  self.validator = None
109
110
  self.metrics = None
110
111
  self.plots = {}
@@ -117,7 +118,7 @@ class BaseTrainer:
117
118
  if RANK in {-1, 0}:
118
119
  self.wdir.mkdir(parents=True, exist_ok=True) # make dir
119
120
  self.args.save_dir = str(self.save_dir)
120
- yaml_save(self.save_dir / "args.yaml", vars(self.args)) # save run args
121
+ YAML.save(self.save_dir / "args.yaml", vars(self.args)) # save run args
121
122
  self.last, self.best = self.wdir / "last.pt", self.wdir / "best.pt" # checkpoint paths
122
123
  self.save_period = self.args.save_period
123
124
 
@@ -23,7 +23,7 @@ import numpy as np
23
23
  import torch
24
24
 
25
25
  from ultralytics.cfg import get_cfg, get_save_dir
26
- from ultralytics.utils import DEFAULT_CFG, LOGGER, callbacks, colorstr, remove_colorstr, yaml_print, yaml_save
26
+ from ultralytics.utils import DEFAULT_CFG, LOGGER, YAML, callbacks, colorstr, remove_colorstr
27
27
  from ultralytics.utils.plotting import plot_tune_results
28
28
 
29
29
 
@@ -235,9 +235,9 @@ class Tuner:
235
235
  )
236
236
  LOGGER.info("\n" + header)
237
237
  data = {k: float(x[best_idx, i + 1]) for i, k in enumerate(self.space.keys())}
238
- yaml_save(
238
+ YAML.save(
239
239
  self.tune_dir / "best_hyperparameters.yaml",
240
240
  data=data,
241
241
  header=remove_colorstr(header.replace(self.prefix, "# ")) + "\n",
242
242
  )
243
- yaml_print(self.tune_dir / "best_hyperparameters.yaml")
243
+ YAML.print(self.tune_dir / "best_hyperparameters.yaml")
@@ -201,7 +201,7 @@ class HUBTrainingSession:
201
201
  HUBModelError: If the identifier format is not recognized.
202
202
  """
203
203
  api_key, model_id, filename = None, None, None
204
- if Path(identifier).suffix in {".pt", ".yaml"}:
204
+ if str(identifier).endswith((".pt", ".yaml")):
205
205
  filename = identifier
206
206
  elif identifier.startswith(f"{HUB_WEB_ROOT}/models/"):
207
207
  parsed_url = urlparse(identifier)
@@ -15,7 +15,7 @@ from ultralytics.nn.tasks import (
15
15
  YOLOEModel,
16
16
  YOLOESegModel,
17
17
  )
18
- from ultralytics.utils import ROOT, yaml_load
18
+ from ultralytics.utils import ROOT, YAML
19
19
 
20
20
 
21
21
  class YOLO(Model):
@@ -107,7 +107,7 @@ class YOLOWorld(Model):
107
107
 
108
108
  # Assign default COCO class names when there are no custom names
109
109
  if not hasattr(self.model, "names"):
110
- self.model.names = yaml_load(ROOT / "cfg/datasets/coco8.yaml").get("names")
110
+ self.model.names = YAML.load(ROOT / "cfg/datasets/coco8.yaml").get("names")
111
111
 
112
112
  @property
113
113
  def task_map(self):
@@ -156,7 +156,7 @@ class YOLOE(Model):
156
156
 
157
157
  # Assign default COCO class names when there are no custom names
158
158
  if not hasattr(self.model, "names"):
159
- self.model.names = yaml_load(ROOT / "cfg/datasets/coco8.yaml").get("names")
159
+ self.model.names = YAML.load(ROOT / "cfg/datasets/coco8.yaml").get("names")
160
160
 
161
161
  @property
162
162
  def task_map(self):
@@ -14,7 +14,7 @@ import torch
14
14
  import torch.nn as nn
15
15
  from PIL import Image
16
16
 
17
- from ultralytics.utils import ARM64, IS_JETSON, LINUX, LOGGER, PYTHON_VERSION, ROOT, yaml_load
17
+ from ultralytics.utils import ARM64, IS_JETSON, LINUX, LOGGER, PYTHON_VERSION, ROOT, YAML
18
18
  from ultralytics.utils.checks import check_requirements, check_suffix, check_version, check_yaml, is_rockchip
19
19
  from ultralytics.utils.downloads import attempt_download_asset, is_url
20
20
 
@@ -33,7 +33,7 @@ def check_class_names(names):
33
33
  f"{min(names.keys())}-{max(names.keys())} defined in your dataset YAML."
34
34
  )
35
35
  if isinstance(names[0], str) and names[0].startswith("n0"): # imagenet class codes, i.e. 'n01440764'
36
- names_map = yaml_load(ROOT / "cfg/datasets/ImageNet.yaml")["map"] # human-readable names
36
+ names_map = YAML.load(ROOT / "cfg/datasets/ImageNet.yaml")["map"] # human-readable names
37
37
  names = {k: names_map[v] for k, v in names.items()}
38
38
  return names
39
39
 
@@ -42,7 +42,7 @@ def default_class_names(data=None):
42
42
  """Applies default class names to an input YAML file or returns numerical class names."""
43
43
  if data:
44
44
  try:
45
- return yaml_load(check_yaml(data))["names"]
45
+ return YAML.load(check_yaml(data))["names"]
46
46
  except Exception:
47
47
  pass
48
48
  return {i: f"class{i}" for i in range(999)} # return default if above errors
@@ -536,7 +536,7 @@ class AutoBackend(nn.Module):
536
536
 
537
537
  # Load external metadata YAML
538
538
  if isinstance(metadata, (str, Path)) and Path(metadata).exists():
539
- metadata = yaml_load(metadata)
539
+ metadata = YAML.load(metadata)
540
540
  if metadata and isinstance(metadata, dict):
541
541
  for k, v in metadata.items():
542
542
  if k in {"stride", "batch", "channels"}:
@@ -69,7 +69,7 @@ from ultralytics.nn.modules import (
69
69
  YOLOESegment,
70
70
  v10Detect,
71
71
  )
72
- from ultralytics.utils import DEFAULT_CFG_DICT, DEFAULT_CFG_KEYS, LOGGER, colorstr, emojis, yaml_load
72
+ from ultralytics.utils import DEFAULT_CFG_DICT, DEFAULT_CFG_KEYS, LOGGER, YAML, colorstr, emojis
73
73
  from ultralytics.utils.checks import check_requirements, check_suffix, check_yaml
74
74
  from ultralytics.utils.loss import (
75
75
  E2EDetectLoss,
@@ -1523,7 +1523,7 @@ def yaml_model_load(path):
1523
1523
 
1524
1524
  unified_path = re.sub(r"(\d+)([nslmx])(.+)?$", r"\1\3", str(path)) # i.e. yolov8x.yaml -> yolov8.yaml
1525
1525
  yaml_file = check_yaml(unified_path, hard=False) or check_yaml(path)
1526
- d = yaml_load(yaml_file) # model dict
1526
+ d = YAML.load(yaml_file) # model dict
1527
1527
  d["scale"] = guess_model_scale(path)
1528
1528
  d["yaml_file"] = str(path)
1529
1529
  return d