ultralytics 8.2.28__tar.gz → 8.2.29__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of ultralytics might be problematic. Click here for more details.

Files changed (223) hide show
  1. {ultralytics-8.2.28 → ultralytics-8.2.29}/PKG-INFO +1 -1
  2. {ultralytics-8.2.28 → ultralytics-8.2.29}/tests/test_python.py +2 -1
  3. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/__init__.py +1 -1
  4. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/__init__.py +15 -7
  5. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/engine/exporter.py +4 -1
  6. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/engine/trainer.py +9 -4
  7. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/yolo/model.py +1 -1
  8. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/yolo/world/train_world.py +2 -0
  9. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/nn/autobackend.py +6 -2
  10. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/solutions/analytics.py +88 -24
  11. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/utils/autobatch.py +4 -4
  12. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/utils/callbacks/tensorboard.py +1 -0
  13. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/utils/ops.py +1 -1
  14. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/utils/torch_utils.py +11 -5
  15. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics.egg-info/PKG-INFO +1 -1
  16. {ultralytics-8.2.28 → ultralytics-8.2.29}/LICENSE +0 -0
  17. {ultralytics-8.2.28 → ultralytics-8.2.29}/README.md +0 -0
  18. {ultralytics-8.2.28 → ultralytics-8.2.29}/pyproject.toml +0 -0
  19. {ultralytics-8.2.28 → ultralytics-8.2.29}/setup.cfg +0 -0
  20. {ultralytics-8.2.28 → ultralytics-8.2.29}/tests/__init__.py +0 -0
  21. {ultralytics-8.2.28 → ultralytics-8.2.29}/tests/conftest.py +0 -0
  22. {ultralytics-8.2.28 → ultralytics-8.2.29}/tests/test_cli.py +0 -0
  23. {ultralytics-8.2.28 → ultralytics-8.2.29}/tests/test_cuda.py +0 -0
  24. {ultralytics-8.2.28 → ultralytics-8.2.29}/tests/test_engine.py +0 -0
  25. {ultralytics-8.2.28 → ultralytics-8.2.29}/tests/test_explorer.py +0 -0
  26. {ultralytics-8.2.28 → ultralytics-8.2.29}/tests/test_exports.py +0 -0
  27. {ultralytics-8.2.28 → ultralytics-8.2.29}/tests/test_integrations.py +0 -0
  28. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/assets/bus.jpg +0 -0
  29. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/assets/zidane.jpg +0 -0
  30. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
  31. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
  32. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
  33. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
  34. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
  35. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
  36. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
  37. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/datasets/VOC.yaml +0 -0
  38. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
  39. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
  40. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
  41. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
  42. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
  43. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/datasets/coco.yaml +0 -0
  44. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
  45. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/datasets/coco128.yaml +0 -0
  46. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
  47. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
  48. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/datasets/coco8.yaml +0 -0
  49. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
  50. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/datasets/dota8.yaml +0 -0
  51. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/datasets/lvis.yaml +0 -0
  52. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
  53. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
  54. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/datasets/signature.yaml +0 -0
  55. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
  56. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/datasets/xView.yaml +0 -0
  57. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/default.yaml +0 -0
  58. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
  59. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
  60. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
  61. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
  62. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
  63. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
  64. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
  65. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
  66. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
  67. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
  68. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
  69. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
  70. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
  71. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
  72. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
  73. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
  74. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
  75. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
  76. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
  77. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
  78. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
  79. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
  80. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
  81. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
  82. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
  83. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
  84. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
  85. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
  86. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
  87. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
  88. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
  89. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/trackers/botsort.yaml +0 -0
  90. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
  91. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/data/__init__.py +0 -0
  92. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/data/annotator.py +0 -0
  93. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/data/augment.py +0 -0
  94. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/data/base.py +0 -0
  95. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/data/build.py +0 -0
  96. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/data/converter.py +0 -0
  97. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/data/dataset.py +0 -0
  98. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/data/explorer/__init__.py +0 -0
  99. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/data/explorer/explorer.py +0 -0
  100. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/data/explorer/gui/__init__.py +0 -0
  101. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/data/explorer/gui/dash.py +0 -0
  102. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/data/explorer/utils.py +0 -0
  103. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/data/loaders.py +0 -0
  104. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/data/split_dota.py +0 -0
  105. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/data/utils.py +0 -0
  106. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/engine/__init__.py +0 -0
  107. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/engine/model.py +0 -0
  108. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/engine/predictor.py +0 -0
  109. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/engine/results.py +0 -0
  110. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/engine/tuner.py +0 -0
  111. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/engine/validator.py +0 -0
  112. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/hub/__init__.py +0 -0
  113. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/hub/auth.py +0 -0
  114. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/hub/session.py +0 -0
  115. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/hub/utils.py +0 -0
  116. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/__init__.py +0 -0
  117. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/fastsam/__init__.py +0 -0
  118. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/fastsam/model.py +0 -0
  119. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/fastsam/predict.py +0 -0
  120. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/fastsam/prompt.py +0 -0
  121. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/fastsam/utils.py +0 -0
  122. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/fastsam/val.py +0 -0
  123. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/nas/__init__.py +0 -0
  124. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/nas/model.py +0 -0
  125. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/nas/predict.py +0 -0
  126. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/nas/val.py +0 -0
  127. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/rtdetr/__init__.py +0 -0
  128. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/rtdetr/model.py +0 -0
  129. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/rtdetr/predict.py +0 -0
  130. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/rtdetr/train.py +0 -0
  131. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/rtdetr/val.py +0 -0
  132. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/sam/__init__.py +0 -0
  133. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/sam/amg.py +0 -0
  134. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/sam/build.py +0 -0
  135. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/sam/model.py +0 -0
  136. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/sam/modules/__init__.py +0 -0
  137. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/sam/modules/decoders.py +0 -0
  138. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/sam/modules/encoders.py +0 -0
  139. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/sam/modules/sam.py +0 -0
  140. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
  141. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/sam/modules/transformer.py +0 -0
  142. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/sam/predict.py +0 -0
  143. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/utils/__init__.py +0 -0
  144. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/utils/loss.py +0 -0
  145. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/utils/ops.py +0 -0
  146. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/yolo/__init__.py +0 -0
  147. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/yolo/classify/__init__.py +0 -0
  148. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/yolo/classify/predict.py +0 -0
  149. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/yolo/classify/train.py +0 -0
  150. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/yolo/classify/val.py +0 -0
  151. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/yolo/detect/__init__.py +0 -0
  152. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/yolo/detect/predict.py +0 -0
  153. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/yolo/detect/train.py +0 -0
  154. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/yolo/detect/val.py +0 -0
  155. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/yolo/obb/__init__.py +0 -0
  156. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/yolo/obb/predict.py +0 -0
  157. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/yolo/obb/train.py +0 -0
  158. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/yolo/obb/val.py +0 -0
  159. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/yolo/pose/__init__.py +0 -0
  160. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/yolo/pose/predict.py +0 -0
  161. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/yolo/pose/train.py +0 -0
  162. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/yolo/pose/val.py +0 -0
  163. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/yolo/segment/__init__.py +0 -0
  164. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/yolo/segment/predict.py +0 -0
  165. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/yolo/segment/train.py +0 -0
  166. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/yolo/segment/val.py +0 -0
  167. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/yolo/world/__init__.py +0 -0
  168. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/models/yolo/world/train.py +0 -0
  169. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/nn/__init__.py +0 -0
  170. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/nn/modules/__init__.py +0 -0
  171. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/nn/modules/block.py +0 -0
  172. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/nn/modules/conv.py +0 -0
  173. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/nn/modules/head.py +0 -0
  174. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/nn/modules/transformer.py +0 -0
  175. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/nn/modules/utils.py +0 -0
  176. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/nn/tasks.py +0 -0
  177. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/solutions/__init__.py +0 -0
  178. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/solutions/ai_gym.py +0 -0
  179. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/solutions/distance_calculation.py +0 -0
  180. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/solutions/heatmap.py +0 -0
  181. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/solutions/object_counter.py +0 -0
  182. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/solutions/parking_management.py +0 -0
  183. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/solutions/queue_management.py +0 -0
  184. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/solutions/speed_estimation.py +0 -0
  185. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/trackers/__init__.py +0 -0
  186. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/trackers/basetrack.py +0 -0
  187. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/trackers/bot_sort.py +0 -0
  188. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/trackers/byte_tracker.py +0 -0
  189. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/trackers/track.py +0 -0
  190. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/trackers/utils/__init__.py +0 -0
  191. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/trackers/utils/gmc.py +0 -0
  192. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/trackers/utils/kalman_filter.py +0 -0
  193. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/trackers/utils/matching.py +0 -0
  194. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/utils/__init__.py +0 -0
  195. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/utils/benchmarks.py +0 -0
  196. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/utils/callbacks/__init__.py +0 -0
  197. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/utils/callbacks/base.py +0 -0
  198. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/utils/callbacks/clearml.py +0 -0
  199. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/utils/callbacks/comet.py +0 -0
  200. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/utils/callbacks/dvc.py +0 -0
  201. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/utils/callbacks/hub.py +0 -0
  202. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/utils/callbacks/mlflow.py +0 -0
  203. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/utils/callbacks/neptune.py +0 -0
  204. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/utils/callbacks/raytune.py +0 -0
  205. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/utils/callbacks/wb.py +0 -0
  206. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/utils/checks.py +0 -0
  207. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/utils/dist.py +0 -0
  208. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/utils/downloads.py +0 -0
  209. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/utils/errors.py +0 -0
  210. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/utils/files.py +0 -0
  211. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/utils/instance.py +0 -0
  212. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/utils/loss.py +0 -0
  213. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/utils/metrics.py +0 -0
  214. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/utils/patches.py +0 -0
  215. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/utils/plotting.py +0 -0
  216. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/utils/tal.py +0 -0
  217. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/utils/triton.py +0 -0
  218. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics/utils/tuner.py +0 -0
  219. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics.egg-info/SOURCES.txt +0 -0
  220. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics.egg-info/dependency_links.txt +0 -0
  221. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics.egg-info/entry_points.txt +0 -0
  222. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics.egg-info/requires.txt +0 -0
  223. {ultralytics-8.2.28 → ultralytics-8.2.29}/ultralytics.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ultralytics
3
- Version: 8.2.28
3
+ Version: 8.2.29
4
4
  Summary: Ultralytics YOLOv8 for SOTA object detection, multi-object tracking, instance segmentation, pose estimation and image classification.
5
5
  Author: Glenn Jocher, Ayush Chaurasia, Jing Qiu
6
6
  Maintainer: Glenn Jocher, Ayush Chaurasia, Jing Qiu
@@ -140,7 +140,8 @@ def test_youtube():
140
140
  model = YOLO(MODEL)
141
141
  try:
142
142
  model.predict("https://youtu.be/G17sBkb38XQ", imgsz=96, save=True)
143
- except urllib.error.HTTPError as e: # handle 'urllib.error.HTTPError: HTTP Error 429: Too Many Requests'
143
+ # Handle internet connection errors and 'urllib.error.HTTPError: HTTP Error 429: Too Many Requests'
144
+ except (urllib.error.HTTPError, ConnectionError) as e:
144
145
  LOGGER.warning(f"WARNING: YouTube Test Error: {e}")
145
146
 
146
147
 
@@ -1,6 +1,6 @@
1
1
  # Ultralytics YOLO 🚀, AGPL-3.0 license
2
2
 
3
- __version__ = "8.2.28"
3
+ __version__ = "8.2.29"
4
4
 
5
5
  import os
6
6
 
@@ -95,10 +95,19 @@ CLI_HELP_MSG = f"""
95
95
  """
96
96
 
97
97
  # Define keys for arg type checks
98
- CFG_FLOAT_KEYS = {"warmup_epochs", "box", "cls", "dfl", "degrees", "shear", "time", "workspace"}
99
- CFG_FRACTION_KEYS = {
98
+ CFG_FLOAT_KEYS = { # integer or float arguments, i.e. x=2 and x=2.0
99
+ "warmup_epochs",
100
+ "box",
101
+ "cls",
102
+ "dfl",
103
+ "degrees",
104
+ "shear",
105
+ "time",
106
+ "workspace",
107
+ "batch",
108
+ }
109
+ CFG_FRACTION_KEYS = { # fractional float arguments with 0.0<=values<=1.0
100
110
  "dropout",
101
- "iou",
102
111
  "lr0",
103
112
  "lrf",
104
113
  "momentum",
@@ -121,11 +130,10 @@ CFG_FRACTION_KEYS = {
121
130
  "conf",
122
131
  "iou",
123
132
  "fraction",
124
- } # fraction floats 0.0 - 1.0
125
- CFG_INT_KEYS = {
133
+ }
134
+ CFG_INT_KEYS = { # integer-only arguments
126
135
  "epochs",
127
136
  "patience",
128
- "batch",
129
137
  "workers",
130
138
  "seed",
131
139
  "close_mosaic",
@@ -136,7 +144,7 @@ CFG_INT_KEYS = {
136
144
  "nbs",
137
145
  "save_period",
138
146
  }
139
- CFG_BOOL_KEYS = {
147
+ CFG_BOOL_KEYS = { # boolean-only arguments
140
148
  "save",
141
149
  "exist_ok",
142
150
  "verbose",
@@ -126,7 +126,7 @@ def gd_outputs(gd):
126
126
 
127
127
 
128
128
  def try_export(inner_func):
129
- """YOLOv8 export decorator, i..e @try_export."""
129
+ """YOLOv8 export decorator, i.e. @try_export."""
130
130
  inner_args = get_default_args(inner_func)
131
131
 
132
132
  def outer_func(*args, **kwargs):
@@ -211,6 +211,9 @@ class Exporter:
211
211
  assert self.device.type == "cpu", "optimize=True not compatible with cuda devices, i.e. use device='cpu'"
212
212
  if edgetpu and not LINUX:
213
213
  raise SystemError("Edge TPU export only supported on Linux. See https://coral.ai/docs/edgetpu/compiler/")
214
+ elif edgetpu and self.args.batch != 1: # see github.com/ultralytics/ultralytics/pull/13420
215
+ LOGGER.warning("WARNING ⚠️ Edge TPU export requires batch size 1, setting batch=1.")
216
+ self.args.batch = 1
214
217
  if isinstance(model, WorldModel):
215
218
  LOGGER.warning(
216
219
  "WARNING ⚠️ YOLOWorld (original version) export is not supported to any format.\n"
@@ -178,9 +178,9 @@ class BaseTrainer:
178
178
  if self.args.rect:
179
179
  LOGGER.warning("WARNING ⚠️ 'rect=True' is incompatible with Multi-GPU training, setting 'rect=False'")
180
180
  self.args.rect = False
181
- if self.args.batch == -1:
181
+ if self.args.batch < 1.0:
182
182
  LOGGER.warning(
183
- "WARNING ⚠️ 'batch=-1' for AutoBatch is incompatible with Multi-GPU training, setting "
183
+ "WARNING ⚠️ 'batch<1' for AutoBatch is incompatible with Multi-GPU training, setting "
184
184
  "default 'batch=16'"
185
185
  )
186
186
  self.args.batch = 16
@@ -269,8 +269,13 @@ class BaseTrainer:
269
269
  self.stride = gs # for multiscale training
270
270
 
271
271
  # Batch size
272
- if self.batch_size == -1 and RANK == -1: # single-GPU only, estimate best batch size
273
- self.args.batch = self.batch_size = check_train_batch_size(self.model, self.args.imgsz, self.amp)
272
+ if self.batch_size < 1 and RANK == -1: # single-GPU only, estimate best batch size
273
+ self.args.batch = self.batch_size = check_train_batch_size(
274
+ model=self.model,
275
+ imgsz=self.args.imgsz,
276
+ amp=self.amp,
277
+ batch=self.batch_size,
278
+ )
274
279
 
275
280
  # Dataloaders
276
281
  batch_size = self.batch_size // max(world_size, 1)
@@ -92,7 +92,7 @@ class YOLOWorld(Model):
92
92
  Set classes.
93
93
 
94
94
  Args:
95
- classes (List(str)): A list of categories i.e ["person"].
95
+ classes (List(str)): A list of categories i.e. ["person"].
96
96
  """
97
97
  self.model.set_classes(classes)
98
98
  # Remove background if it's given
@@ -1,3 +1,5 @@
1
+ # Ultralytics YOLO 🚀, AGPL-3.0 license
2
+
1
3
  from ultralytics.data import YOLOConcatDataset, build_grounding, build_yolo_dataset
2
4
  from ultralytics.data.utils import check_det_dataset
3
5
  from ultralytics.models.yolo.world import WorldTrainer
@@ -320,6 +320,10 @@ class AutoBackend(nn.Module):
320
320
  with open(w, "rb") as f:
321
321
  gd.ParseFromString(f.read())
322
322
  frozen_func = wrap_frozen_graph(gd, inputs="x:0", outputs=gd_outputs(gd))
323
+ try: # attempt to retrieve metadata from SavedModel file potentially alongside GraphDef file
324
+ metadata = next(Path(w).resolve().parent.rglob(f"{Path(w).stem}_saved_model*/metadata.yaml"))
325
+ except StopIteration:
326
+ pass # no metadata file found
323
327
 
324
328
  # TFLite or TFLite Edge TPU
325
329
  elif tflite or edgetpu: # https://www.tensorflow.org/lite/guide/python#install_tensorflow_lite_for_python
@@ -402,7 +406,7 @@ class AutoBackend(nn.Module):
402
406
  # Load external metadata YAML
403
407
  if isinstance(metadata, (str, Path)) and Path(metadata).exists():
404
408
  metadata = yaml_load(metadata)
405
- if metadata:
409
+ if metadata and isinstance(metadata, dict):
406
410
  for k, v in metadata.items():
407
411
  if k in {"stride", "batch"}:
408
412
  metadata[k] = int(v)
@@ -563,7 +567,7 @@ class AutoBackend(nn.Module):
563
567
  y = [y]
564
568
  elif self.pb: # GraphDef
565
569
  y = self.frozen_func(x=self.tf.constant(im))
566
- if len(y) == 2 and len(self.names) == 999: # segments and names not defined
570
+ if (self.task == "segment" or len(y) == 2) and len(self.names) == 999: # segments and names not defined
567
571
  ip, ib = (0, 1) if len(y[0].shape) == 4 else (1, 0) # index of protos, boxes
568
572
  nc = y[ib].shape[1] - y[ip].shape[3] - 4 # y = (1, 160, 160, 32), (1, 116, 8400)
569
573
  self.names = {i: f"class{i}" for i in range(nc)}
@@ -11,7 +11,7 @@ from matplotlib.figure import Figure
11
11
 
12
12
 
13
13
  class Analytics:
14
- """A class to create and update various types of charts (line, bar, pie) for visual analytics."""
14
+ """A class to create and update various types of charts (line, bar, pie, area) for visual analytics."""
15
15
 
16
16
  def __init__(
17
17
  self,
@@ -25,6 +25,7 @@ class Analytics:
25
25
  fg_color="black",
26
26
  line_color="yellow",
27
27
  line_width=2,
28
+ points_width=10,
28
29
  fontsize=13,
29
30
  view_img=False,
30
31
  save_img=True,
@@ -34,7 +35,7 @@ class Analytics:
34
35
  Initialize the Analytics class with various chart types.
35
36
 
36
37
  Args:
37
- type (str): Type of chart to initialize ('line', 'bar', or 'pie').
38
+ type (str): Type of chart to initialize ('line', 'bar', 'pie', or 'area').
38
39
  writer (object): Video writer object to save the frames.
39
40
  im0_shape (tuple): Shape of the input image (width, height).
40
41
  title (str): Title of the chart.
@@ -44,6 +45,7 @@ class Analytics:
44
45
  fg_color (str): Foreground (text) color of the chart.
45
46
  line_color (str): Line color for line charts.
46
47
  line_width (int): Width of the lines in line charts.
48
+ points_width (int): Width of line points highlighter
47
49
  fontsize (int): Font size for chart text.
48
50
  view_img (bool): Whether to display the image.
49
51
  save_img (bool): Whether to save the image.
@@ -57,17 +59,24 @@ class Analytics:
57
59
  self.title = title
58
60
  self.writer = writer
59
61
  self.max_points = max_points
62
+ self.line_color = line_color
63
+ self.x_label = x_label
64
+ self.y_label = y_label
65
+ self.points_width = points_width
66
+ self.line_width = line_width
67
+ self.fontsize = fontsize
60
68
 
61
69
  # Set figure size based on image shape
62
70
  figsize = (im0_shape[0] / 100, im0_shape[1] / 100)
63
71
 
64
- if type == "line":
65
- # Initialize line plot
72
+ if type in {"line", "area"}:
73
+ # Initialize line or area plot
66
74
  self.lines = {}
67
- fig = Figure(facecolor=self.bg_color, figsize=figsize)
68
- self.canvas = FigureCanvas(fig)
69
- self.ax = fig.add_subplot(111, facecolor=self.bg_color)
70
- (self.line,) = self.ax.plot([], [], color=line_color, linewidth=line_width)
75
+ self.fig = Figure(facecolor=self.bg_color, figsize=figsize)
76
+ self.canvas = FigureCanvas(self.fig)
77
+ self.ax = self.fig.add_subplot(111, facecolor=self.bg_color)
78
+ if type == "line":
79
+ (self.line,) = self.ax.plot([], [], color=self.line_color, linewidth=self.line_width)
71
80
 
72
81
  elif type in {"bar", "pie"}:
73
82
  # Initialize bar or pie plot
@@ -93,11 +102,73 @@ class Analytics:
93
102
  self.ax.axis("equal") if type == "pie" else None
94
103
 
95
104
  # Set common axis properties
96
- self.ax.set_title(self.title, color=self.fg_color, fontsize=fontsize)
97
- self.ax.set_xlabel(x_label, color=self.fg_color, fontsize=fontsize - 3)
98
- self.ax.set_ylabel(y_label, color=self.fg_color, fontsize=fontsize - 3)
105
+ self.ax.set_title(self.title, color=self.fg_color, fontsize=self.fontsize)
106
+ self.ax.set_xlabel(x_label, color=self.fg_color, fontsize=self.fontsize - 3)
107
+ self.ax.set_ylabel(y_label, color=self.fg_color, fontsize=self.fontsize - 3)
99
108
  self.ax.tick_params(axis="both", colors=self.fg_color)
100
109
 
110
+ def update_area(self, frame_number, counts_dict):
111
+ """
112
+ Update the area graph with new data for multiple classes.
113
+
114
+ Args:
115
+ frame_number (int): The current frame number.
116
+ counts_dict (dict): Dictionary with class names as keys and counts as values.
117
+ """
118
+
119
+ x_data = np.array([])
120
+ y_data_dict = {key: np.array([]) for key in counts_dict.keys()}
121
+
122
+ if self.ax.lines:
123
+ x_data = self.ax.lines[0].get_xdata()
124
+ for line, key in zip(self.ax.lines, counts_dict.keys()):
125
+ y_data_dict[key] = line.get_ydata()
126
+
127
+ x_data = np.append(x_data, float(frame_number))
128
+ max_length = len(x_data)
129
+
130
+ for key in counts_dict.keys():
131
+ y_data_dict[key] = np.append(y_data_dict[key], float(counts_dict[key]))
132
+ if len(y_data_dict[key]) < max_length:
133
+ y_data_dict[key] = np.pad(y_data_dict[key], (0, max_length - len(y_data_dict[key])), "constant")
134
+
135
+ # Remove the oldest points if the number of points exceeds max_points
136
+ if len(x_data) > self.max_points:
137
+ x_data = x_data[1:]
138
+ for key in counts_dict.keys():
139
+ y_data_dict[key] = y_data_dict[key][1:]
140
+
141
+ self.ax.clear()
142
+
143
+ colors = ["#E1FF25", "#0BDBEB", "#FF64DA", "#111F68", "#042AFF"]
144
+ color_cycle = cycle(colors)
145
+
146
+ for key, y_data in y_data_dict.items():
147
+ color = next(color_cycle)
148
+ self.ax.fill_between(x_data, y_data, color=color, alpha=0.6)
149
+ self.ax.plot(
150
+ x_data,
151
+ y_data,
152
+ color=color,
153
+ linewidth=self.line_width,
154
+ marker="o",
155
+ markersize=self.points_width,
156
+ label=f"{key} Data Points",
157
+ )
158
+
159
+ self.ax.set_title(self.title, color=self.fg_color, fontsize=self.fontsize)
160
+ self.ax.set_xlabel(self.x_label, color=self.fg_color, fontsize=self.fontsize - 3)
161
+ self.ax.set_ylabel(self.y_label, color=self.fg_color, fontsize=self.fontsize - 3)
162
+ legend = self.ax.legend(loc="upper left", fontsize=13, facecolor=self.bg_color, edgecolor=self.fg_color)
163
+
164
+ # Set legend text color
165
+ for text in legend.get_texts():
166
+ text.set_color(self.fg_color)
167
+
168
+ self.canvas.draw()
169
+ im0 = np.array(self.canvas.renderer.buffer_rgba())
170
+ self.write_and_display(im0)
171
+
101
172
  def update_line(self, frame_number, total_counts):
102
173
  """
103
174
  Update the line graph with new data.
@@ -117,7 +188,7 @@ class Analytics:
117
188
  self.ax.autoscale_view()
118
189
  self.canvas.draw()
119
190
  im0 = np.array(self.canvas.renderer.buffer_rgba())
120
- self.write_and_display_line(im0)
191
+ self.write_and_display(im0)
121
192
 
122
193
  def update_multiple_lines(self, counts_dict, labels_list, frame_number):
123
194
  """
@@ -131,7 +202,7 @@ class Analytics:
131
202
  warnings.warn("Display is not supported for multiple lines, output will be stored normally!")
132
203
  for obj in labels_list:
133
204
  if obj not in self.lines:
134
- (line,) = self.ax.plot([], [], label=obj, marker="o", markersize=15)
205
+ (line,) = self.ax.plot([], [], label=obj, marker="o", markersize=self.points_width)
135
206
  self.lines[obj] = line
136
207
 
137
208
  x_data = self.lines[obj].get_xdata()
@@ -153,16 +224,14 @@ class Analytics:
153
224
 
154
225
  im0 = np.array(self.canvas.renderer.buffer_rgba())
155
226
  self.view_img = False # for multiple line view_img not supported yet, coming soon!
156
- self.write_and_display_line(im0)
227
+ self.write_and_display(im0)
157
228
 
158
- def write_and_display_line(self, im0):
229
+ def write_and_display(self, im0):
159
230
  """
160
231
  Write and display the line graph
161
232
  Args:
162
233
  im0 (ndarray): Image for processing
163
234
  """
164
-
165
- # convert image to BGR format
166
235
  im0 = cv2.cvtColor(im0[:, :, :3], cv2.COLOR_RGBA2BGR)
167
236
  cv2.imshow(self.title, im0) if self.view_img else None
168
237
  self.writer.write(im0) if self.save_img else None
@@ -204,10 +273,7 @@ class Analytics:
204
273
  canvas.draw()
205
274
  buf = canvas.buffer_rgba()
206
275
  im0 = np.asarray(buf)
207
- im0 = cv2.cvtColor(im0, cv2.COLOR_RGBA2BGR)
208
-
209
- self.writer.write(im0) if self.save_img else None
210
- cv2.imshow(self.title, im0) if self.view_img else None
276
+ self.write_and_display(im0)
211
277
 
212
278
  def update_pie(self, classes_dict):
213
279
  """
@@ -239,9 +305,7 @@ class Analytics:
239
305
  # Display and save the updated chart
240
306
  im0 = self.fig.canvas.draw()
241
307
  im0 = np.array(self.fig.canvas.renderer.buffer_rgba())
242
- im0 = cv2.cvtColor(im0[:, :, :3], cv2.COLOR_RGBA2BGR)
243
- self.writer.write(im0) if self.save_img else None
244
- cv2.imshow(self.title, im0) if self.view_img else None
308
+ self.write_and_display(im0)
245
309
 
246
310
 
247
311
  if __name__ == "__main__":
@@ -10,9 +10,9 @@ from ultralytics.utils import DEFAULT_CFG, LOGGER, colorstr
10
10
  from ultralytics.utils.torch_utils import profile
11
11
 
12
12
 
13
- def check_train_batch_size(model, imgsz=640, amp=True):
13
+ def check_train_batch_size(model, imgsz=640, amp=True, batch=-1):
14
14
  """
15
- Check YOLO training batch size using the autobatch() function.
15
+ Compute optimal YOLO training batch size using the autobatch() function.
16
16
 
17
17
  Args:
18
18
  model (torch.nn.Module): YOLO model to check batch size for.
@@ -24,7 +24,7 @@ def check_train_batch_size(model, imgsz=640, amp=True):
24
24
  """
25
25
 
26
26
  with torch.cuda.amp.autocast(amp):
27
- return autobatch(deepcopy(model).train(), imgsz) # compute optimal batch size
27
+ return autobatch(deepcopy(model).train(), imgsz, fraction=batch if 0.0 < batch < 1.0 else 0.6)
28
28
 
29
29
 
30
30
  def autobatch(model, imgsz=640, fraction=0.60, batch_size=DEFAULT_CFG.batch):
@@ -43,7 +43,7 @@ def autobatch(model, imgsz=640, fraction=0.60, batch_size=DEFAULT_CFG.batch):
43
43
 
44
44
  # Check device
45
45
  prefix = colorstr("AutoBatch: ")
46
- LOGGER.info(f"{prefix}Computing optimal batch size for imgsz={imgsz}")
46
+ LOGGER.info(f"{prefix}Computing optimal batch size for imgsz={imgsz} at {fraction * 100}% CUDA memory utilization.")
47
47
  device = next(model.parameters()).device # get model device
48
48
  if device.type == "cpu":
49
49
  LOGGER.info(f"{prefix}CUDA not detected, using default CPU batch-size {batch_size}")
@@ -1,4 +1,5 @@
1
1
  # Ultralytics YOLO 🚀, AGPL-3.0 license
2
+
2
3
  import contextlib
3
4
 
4
5
  from ultralytics.utils import LOGGER, SETTINGS, TESTS_RUNNING, colorstr
@@ -215,7 +215,7 @@ def non_max_suppression(
215
215
 
216
216
  bs = prediction.shape[0] # batch size
217
217
  nc = nc or (prediction.shape[1] - 4) # number of classes
218
- nm = prediction.shape[1] - nc - 4
218
+ nm = prediction.shape[1] - nc - 4 # number of masks
219
219
  mi = 4 + nc # mask start index
220
220
  xc = prediction[:, 4:mi].amax(1) > conf_thres # candidates
221
221
 
@@ -146,11 +146,17 @@ def select_device(device="", batch=0, newline=False, verbose=True):
146
146
  if not cpu and not mps and torch.cuda.is_available(): # prefer GPU if available
147
147
  devices = device.split(",") if device else "0" # range(torch.cuda.device_count()) # i.e. 0,1,6,7
148
148
  n = len(devices) # device count
149
- if n > 1 and batch > 0 and batch % n != 0: # check batch_size is divisible by device_count
150
- raise ValueError(
151
- f"'batch={batch}' must be a multiple of GPU count {n}. Try 'batch={batch // n * n}' or "
152
- f"'batch={batch // n * n + n}', the nearest batch sizes evenly divisible by {n}."
153
- )
149
+ if n > 1: # multi-GPU
150
+ if batch < 1:
151
+ raise ValueError(
152
+ "AutoBatch with batch<1 not supported for Multi-GPU training, "
153
+ "please specify a valid batch size, i.e. batch=16."
154
+ )
155
+ if batch >= 0 and batch % n != 0: # check batch_size is divisible by device_count
156
+ raise ValueError(
157
+ f"'batch={batch}' must be a multiple of GPU count {n}. Try 'batch={batch // n * n}' or "
158
+ f"'batch={batch // n * n + n}', the nearest batch sizes evenly divisible by {n}."
159
+ )
154
160
  space = " " * (len(s) + 1)
155
161
  for i, d in enumerate(devices):
156
162
  p = torch.cuda.get_device_properties(i)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ultralytics
3
- Version: 8.2.28
3
+ Version: 8.2.29
4
4
  Summary: Ultralytics YOLOv8 for SOTA object detection, multi-object tracking, instance segmentation, pose estimation and image classification.
5
5
  Author: Glenn Jocher, Ayush Chaurasia, Jing Qiu
6
6
  Maintainer: Glenn Jocher, Ayush Chaurasia, Jing Qiu
File without changes
File without changes
File without changes