ultralytics 8.3.217__tar.gz → 8.3.219__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 (288) hide show
  1. {ultralytics-8.3.217 → ultralytics-8.3.219}/PKG-INFO +1 -1
  2. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/__init__.py +1 -1
  3. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/data/build.py +106 -1
  4. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/engine/trainer.py +37 -31
  5. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/engine/validator.py +27 -9
  6. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/fastsam/predict.py +10 -16
  7. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/yolo/classify/train.py +2 -15
  8. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/yolo/classify/val.py +15 -1
  9. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/yolo/detect/val.py +17 -1
  10. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics.egg-info/PKG-INFO +1 -1
  11. {ultralytics-8.3.217 → ultralytics-8.3.219}/LICENSE +0 -0
  12. {ultralytics-8.3.217 → ultralytics-8.3.219}/README.md +0 -0
  13. {ultralytics-8.3.217 → ultralytics-8.3.219}/pyproject.toml +0 -0
  14. {ultralytics-8.3.217 → ultralytics-8.3.219}/setup.cfg +0 -0
  15. {ultralytics-8.3.217 → ultralytics-8.3.219}/tests/__init__.py +0 -0
  16. {ultralytics-8.3.217 → ultralytics-8.3.219}/tests/conftest.py +0 -0
  17. {ultralytics-8.3.217 → ultralytics-8.3.219}/tests/test_cli.py +0 -0
  18. {ultralytics-8.3.217 → ultralytics-8.3.219}/tests/test_cuda.py +0 -0
  19. {ultralytics-8.3.217 → ultralytics-8.3.219}/tests/test_engine.py +0 -0
  20. {ultralytics-8.3.217 → ultralytics-8.3.219}/tests/test_exports.py +0 -0
  21. {ultralytics-8.3.217 → ultralytics-8.3.219}/tests/test_integrations.py +0 -0
  22. {ultralytics-8.3.217 → ultralytics-8.3.219}/tests/test_python.py +0 -0
  23. {ultralytics-8.3.217 → ultralytics-8.3.219}/tests/test_solutions.py +0 -0
  24. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/assets/bus.jpg +0 -0
  25. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/assets/zidane.jpg +0 -0
  26. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/__init__.py +0 -0
  27. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
  28. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
  29. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
  30. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
  31. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/datasets/HomeObjects-3K.yaml +0 -0
  32. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
  33. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
  34. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
  35. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/datasets/VOC.yaml +0 -0
  36. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
  37. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
  38. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
  39. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
  40. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
  41. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/datasets/coco.yaml +0 -0
  42. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
  43. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/datasets/coco128.yaml +0 -0
  44. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/datasets/coco8-grayscale.yaml +0 -0
  45. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/datasets/coco8-multispectral.yaml +0 -0
  46. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
  47. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
  48. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/datasets/coco8.yaml +0 -0
  49. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/datasets/construction-ppe.yaml +0 -0
  50. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
  51. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/datasets/dog-pose.yaml +0 -0
  52. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/datasets/dota8-multispectral.yaml +0 -0
  53. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/datasets/dota8.yaml +0 -0
  54. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/datasets/hand-keypoints.yaml +0 -0
  55. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/datasets/lvis.yaml +0 -0
  56. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/datasets/medical-pills.yaml +0 -0
  57. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
  58. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
  59. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/datasets/signature.yaml +0 -0
  60. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
  61. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/datasets/xView.yaml +0 -0
  62. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/default.yaml +0 -0
  63. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/11/yolo11-cls-resnet18.yaml +0 -0
  64. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/11/yolo11-cls.yaml +0 -0
  65. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/11/yolo11-obb.yaml +0 -0
  66. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/11/yolo11-pose.yaml +0 -0
  67. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/11/yolo11-seg.yaml +0 -0
  68. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/11/yolo11.yaml +0 -0
  69. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/11/yoloe-11-seg.yaml +0 -0
  70. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/11/yoloe-11.yaml +0 -0
  71. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/12/yolo12-cls.yaml +0 -0
  72. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/12/yolo12-obb.yaml +0 -0
  73. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/12/yolo12-pose.yaml +0 -0
  74. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/12/yolo12-seg.yaml +0 -0
  75. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/12/yolo12.yaml +0 -0
  76. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
  77. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
  78. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
  79. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
  80. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/v10/yolov10b.yaml +0 -0
  81. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/v10/yolov10l.yaml +0 -0
  82. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/v10/yolov10m.yaml +0 -0
  83. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/v10/yolov10n.yaml +0 -0
  84. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/v10/yolov10s.yaml +0 -0
  85. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/v10/yolov10x.yaml +0 -0
  86. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
  87. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
  88. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
  89. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
  90. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
  91. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
  92. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/v8/yoloe-v8-seg.yaml +0 -0
  93. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/v8/yoloe-v8.yaml +0 -0
  94. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
  95. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
  96. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
  97. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
  98. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
  99. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
  100. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
  101. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
  102. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
  103. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
  104. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
  105. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
  106. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
  107. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
  108. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
  109. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
  110. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
  111. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
  112. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
  113. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
  114. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
  115. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/v9/yolov9m.yaml +0 -0
  116. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/v9/yolov9s.yaml +0 -0
  117. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/models/v9/yolov9t.yaml +0 -0
  118. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/trackers/botsort.yaml +0 -0
  119. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
  120. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/data/__init__.py +0 -0
  121. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/data/annotator.py +0 -0
  122. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/data/augment.py +0 -0
  123. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/data/base.py +0 -0
  124. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/data/converter.py +0 -0
  125. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/data/dataset.py +0 -0
  126. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/data/loaders.py +0 -0
  127. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/data/scripts/download_weights.sh +0 -0
  128. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/data/scripts/get_coco.sh +0 -0
  129. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/data/scripts/get_coco128.sh +0 -0
  130. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/data/scripts/get_imagenet.sh +0 -0
  131. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/data/split.py +0 -0
  132. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/data/split_dota.py +0 -0
  133. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/data/utils.py +0 -0
  134. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/engine/__init__.py +0 -0
  135. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/engine/exporter.py +0 -0
  136. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/engine/model.py +0 -0
  137. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/engine/predictor.py +0 -0
  138. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/engine/results.py +0 -0
  139. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/engine/tuner.py +0 -0
  140. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/hub/__init__.py +0 -0
  141. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/hub/auth.py +0 -0
  142. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/hub/google/__init__.py +0 -0
  143. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/hub/session.py +0 -0
  144. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/hub/utils.py +0 -0
  145. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/__init__.py +0 -0
  146. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/fastsam/__init__.py +0 -0
  147. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/fastsam/model.py +0 -0
  148. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/fastsam/utils.py +0 -0
  149. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/fastsam/val.py +0 -0
  150. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/nas/__init__.py +0 -0
  151. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/nas/model.py +0 -0
  152. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/nas/predict.py +0 -0
  153. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/nas/val.py +0 -0
  154. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/rtdetr/__init__.py +0 -0
  155. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/rtdetr/model.py +0 -0
  156. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/rtdetr/predict.py +0 -0
  157. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/rtdetr/train.py +0 -0
  158. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/rtdetr/val.py +0 -0
  159. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/sam/__init__.py +0 -0
  160. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/sam/amg.py +0 -0
  161. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/sam/build.py +0 -0
  162. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/sam/model.py +0 -0
  163. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/sam/modules/__init__.py +0 -0
  164. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/sam/modules/blocks.py +0 -0
  165. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/sam/modules/decoders.py +0 -0
  166. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/sam/modules/encoders.py +0 -0
  167. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/sam/modules/memory_attention.py +0 -0
  168. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/sam/modules/sam.py +0 -0
  169. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
  170. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/sam/modules/transformer.py +0 -0
  171. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/sam/modules/utils.py +0 -0
  172. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/sam/predict.py +0 -0
  173. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/utils/__init__.py +0 -0
  174. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/utils/loss.py +0 -0
  175. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/utils/ops.py +0 -0
  176. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/yolo/__init__.py +0 -0
  177. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/yolo/classify/__init__.py +0 -0
  178. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/yolo/classify/predict.py +0 -0
  179. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/yolo/detect/__init__.py +0 -0
  180. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/yolo/detect/predict.py +0 -0
  181. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/yolo/detect/train.py +0 -0
  182. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/yolo/model.py +0 -0
  183. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/yolo/obb/__init__.py +0 -0
  184. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/yolo/obb/predict.py +0 -0
  185. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/yolo/obb/train.py +0 -0
  186. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/yolo/obb/val.py +0 -0
  187. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/yolo/pose/__init__.py +0 -0
  188. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/yolo/pose/predict.py +0 -0
  189. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/yolo/pose/train.py +0 -0
  190. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/yolo/pose/val.py +0 -0
  191. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/yolo/segment/__init__.py +0 -0
  192. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/yolo/segment/predict.py +0 -0
  193. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/yolo/segment/train.py +0 -0
  194. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/yolo/segment/val.py +0 -0
  195. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/yolo/world/__init__.py +0 -0
  196. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/yolo/world/train.py +0 -0
  197. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/yolo/world/train_world.py +0 -0
  198. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/yolo/yoloe/__init__.py +0 -0
  199. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/yolo/yoloe/predict.py +0 -0
  200. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/yolo/yoloe/train.py +0 -0
  201. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/yolo/yoloe/train_seg.py +0 -0
  202. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/models/yolo/yoloe/val.py +0 -0
  203. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/nn/__init__.py +0 -0
  204. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/nn/autobackend.py +0 -0
  205. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/nn/modules/__init__.py +0 -0
  206. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/nn/modules/activation.py +0 -0
  207. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/nn/modules/block.py +0 -0
  208. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/nn/modules/conv.py +0 -0
  209. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/nn/modules/head.py +0 -0
  210. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/nn/modules/transformer.py +0 -0
  211. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/nn/modules/utils.py +0 -0
  212. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/nn/tasks.py +0 -0
  213. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/nn/text_model.py +0 -0
  214. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/py.typed +0 -0
  215. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/solutions/__init__.py +0 -0
  216. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/solutions/ai_gym.py +0 -0
  217. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/solutions/analytics.py +0 -0
  218. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/solutions/config.py +0 -0
  219. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/solutions/distance_calculation.py +0 -0
  220. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/solutions/heatmap.py +0 -0
  221. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/solutions/instance_segmentation.py +0 -0
  222. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/solutions/object_blurrer.py +0 -0
  223. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/solutions/object_counter.py +0 -0
  224. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/solutions/object_cropper.py +0 -0
  225. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/solutions/parking_management.py +0 -0
  226. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/solutions/queue_management.py +0 -0
  227. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/solutions/region_counter.py +0 -0
  228. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/solutions/security_alarm.py +0 -0
  229. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/solutions/similarity_search.py +0 -0
  230. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/solutions/solutions.py +0 -0
  231. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/solutions/speed_estimation.py +0 -0
  232. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/solutions/streamlit_inference.py +0 -0
  233. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/solutions/templates/similarity-search.html +0 -0
  234. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/solutions/trackzone.py +0 -0
  235. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/solutions/vision_eye.py +0 -0
  236. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/trackers/__init__.py +0 -0
  237. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/trackers/basetrack.py +0 -0
  238. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/trackers/bot_sort.py +0 -0
  239. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/trackers/byte_tracker.py +0 -0
  240. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/trackers/track.py +0 -0
  241. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/trackers/utils/__init__.py +0 -0
  242. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/trackers/utils/gmc.py +0 -0
  243. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/trackers/utils/kalman_filter.py +0 -0
  244. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/trackers/utils/matching.py +0 -0
  245. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/utils/__init__.py +0 -0
  246. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/utils/autobatch.py +0 -0
  247. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/utils/autodevice.py +0 -0
  248. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/utils/benchmarks.py +0 -0
  249. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/utils/callbacks/__init__.py +0 -0
  250. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/utils/callbacks/base.py +0 -0
  251. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/utils/callbacks/clearml.py +0 -0
  252. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/utils/callbacks/comet.py +0 -0
  253. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/utils/callbacks/dvc.py +0 -0
  254. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/utils/callbacks/hub.py +0 -0
  255. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/utils/callbacks/mlflow.py +0 -0
  256. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/utils/callbacks/neptune.py +0 -0
  257. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/utils/callbacks/platform.py +0 -0
  258. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/utils/callbacks/raytune.py +0 -0
  259. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/utils/callbacks/tensorboard.py +0 -0
  260. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/utils/callbacks/wb.py +0 -0
  261. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/utils/checks.py +0 -0
  262. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/utils/cpu.py +0 -0
  263. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/utils/dist.py +0 -0
  264. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/utils/downloads.py +0 -0
  265. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/utils/errors.py +0 -0
  266. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/utils/events.py +0 -0
  267. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/utils/export/__init__.py +0 -0
  268. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/utils/export/imx.py +0 -0
  269. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/utils/files.py +0 -0
  270. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/utils/git.py +0 -0
  271. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/utils/instance.py +0 -0
  272. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/utils/logger.py +0 -0
  273. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/utils/loss.py +0 -0
  274. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/utils/metrics.py +0 -0
  275. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/utils/nms.py +0 -0
  276. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/utils/ops.py +0 -0
  277. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/utils/patches.py +0 -0
  278. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/utils/plotting.py +0 -0
  279. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/utils/tal.py +0 -0
  280. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/utils/torch_utils.py +0 -0
  281. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/utils/tqdm.py +0 -0
  282. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/utils/triton.py +0 -0
  283. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics/utils/tuner.py +0 -0
  284. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics.egg-info/SOURCES.txt +0 -0
  285. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics.egg-info/dependency_links.txt +0 -0
  286. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics.egg-info/entry_points.txt +0 -0
  287. {ultralytics-8.3.217 → ultralytics-8.3.219}/ultralytics.egg-info/requires.txt +0 -0
  288. {ultralytics-8.3.217 → ultralytics-8.3.219}/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.217
3
+ Version: 8.3.219
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>
@@ -1,6 +1,6 @@
1
1
  # Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
2
2
 
3
- __version__ = "8.3.217"
3
+ __version__ = "8.3.219"
4
4
 
5
5
  import importlib
6
6
  import os
@@ -2,6 +2,7 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ import math
5
6
  import os
6
7
  import random
7
8
  from collections.abc import Iterator
@@ -11,6 +12,7 @@ from urllib.parse import urlsplit
11
12
 
12
13
  import numpy as np
13
14
  import torch
15
+ import torch.distributed as dist
14
16
  from PIL import Image
15
17
  from torch.utils.data import dataloader, distributed
16
18
 
@@ -112,6 +114,103 @@ class _RepeatSampler:
112
114
  yield from iter(self.sampler)
113
115
 
114
116
 
117
+ class ContiguousDistributedSampler(torch.utils.data.Sampler):
118
+ """
119
+ Distributed sampler that assigns contiguous batch-aligned chunks of the dataset to each GPU.
120
+
121
+ Unlike PyTorch's DistributedSampler which distributes samples in a round-robin fashion (GPU 0 gets indices
122
+ [0,2,4,...], GPU 1 gets [1,3,5,...]), this sampler gives each GPU contiguous batches of the dataset
123
+ (GPU 0 gets batches [0,1,2,...], GPU 1 gets batches [k,k+1,...], etc.). This preserves any ordering or
124
+ grouping in the original dataset, which is critical when samples are organized by similarity (e.g., images
125
+ sorted by size to enable efficient batching without padding when using rect=True).
126
+
127
+ The sampler handles uneven batch counts by distributing remainder batches to the first few ranks, ensuring
128
+ all samples are covered exactly once across all GPUs.
129
+
130
+ Args:
131
+ dataset (torch.utils.data.Dataset): Dataset to sample from. Must implement __len__.
132
+ num_replicas (int, optional): Number of distributed processes. Defaults to world size.
133
+ batch_size (int, optional): Batch size used by dataloader. Defaults to dataset batch size.
134
+ rank (int, optional): Rank of current process. Defaults to current rank.
135
+ shuffle (bool, optional): Whether to shuffle indices within each rank's chunk. Defaults to False.
136
+ When True, shuffling is deterministic and controlled by set_epoch() for reproducibility.
137
+
138
+ Example:
139
+ >>> # For validation with size-grouped images
140
+ >>> sampler = ContiguousDistributedSampler(val_dataset, batch_size=32, shuffle=False)
141
+ >>> loader = DataLoader(val_dataset, batch_size=32, sampler=sampler)
142
+ >>> # For training with shuffling
143
+ >>> sampler = ContiguousDistributedSampler(train_dataset, batch_size=32, shuffle=True)
144
+ >>> for epoch in range(num_epochs):
145
+ ... sampler.set_epoch(epoch)
146
+ ... for batch in loader:
147
+ ... ...
148
+ """
149
+
150
+ def __init__(self, dataset, num_replicas=None, batch_size=None, rank=None, shuffle=False):
151
+ """Initialize the sampler with dataset and distributed training parameters."""
152
+ if num_replicas is None:
153
+ num_replicas = dist.get_world_size() if dist.is_initialized() else 1
154
+ if rank is None:
155
+ rank = dist.get_rank() if dist.is_initialized() else 0
156
+ if batch_size is None:
157
+ batch_size = getattr(dataset, "batch_size", 1)
158
+
159
+ self.dataset = dataset
160
+ self.num_replicas = num_replicas
161
+ self.batch_size = batch_size
162
+ self.rank = rank
163
+ self.epoch = 0
164
+ self.shuffle = shuffle
165
+ self.total_size = len(dataset)
166
+ self.num_batches = math.ceil(self.total_size / self.batch_size)
167
+
168
+ def _get_rank_indices(self):
169
+ """Calculate the start and end sample indices for this rank."""
170
+ # Calculate which batches this rank handles
171
+ batches_per_rank_base = self.num_batches // self.num_replicas
172
+ remainder = self.num_batches % self.num_replicas
173
+
174
+ # This rank gets an extra batch if rank < remainder
175
+ batches_for_this_rank = batches_per_rank_base + (1 if self.rank < remainder else 0)
176
+
177
+ # Calculate starting batch: base position + number of extra batches given to earlier ranks
178
+ start_batch = self.rank * batches_per_rank_base + min(self.rank, remainder)
179
+ end_batch = start_batch + batches_for_this_rank
180
+
181
+ # Convert batch indices to sample indices
182
+ start_idx = start_batch * self.batch_size
183
+ end_idx = min(end_batch * self.batch_size, self.total_size)
184
+
185
+ return start_idx, end_idx
186
+
187
+ def __iter__(self):
188
+ """Generate indices for this rank's contiguous chunk of the dataset."""
189
+ start_idx, end_idx = self._get_rank_indices()
190
+ indices = list(range(start_idx, end_idx))
191
+
192
+ if self.shuffle:
193
+ g = torch.Generator()
194
+ g.manual_seed(self.epoch)
195
+ indices = [indices[i] for i in torch.randperm(len(indices), generator=g).tolist()]
196
+
197
+ return iter(indices)
198
+
199
+ def __len__(self):
200
+ """Return the number of samples in this rank's chunk."""
201
+ start_idx, end_idx = self._get_rank_indices()
202
+ return end_idx - start_idx
203
+
204
+ def set_epoch(self, epoch):
205
+ """
206
+ Set the epoch for this sampler to ensure different shuffling patterns across epochs.
207
+
208
+ Args:
209
+ epoch (int): Epoch number to use as the random seed for shuffling.
210
+ """
211
+ self.epoch = epoch
212
+
213
+
115
214
  def seed_worker(worker_id: int): # noqa
116
215
  """Set dataloader worker seed for reproducibility across worker processes."""
117
216
  worker_seed = torch.initial_seed() % 2**32
@@ -213,7 +312,13 @@ def build_dataloader(
213
312
  batch = min(batch, len(dataset))
214
313
  nd = torch.cuda.device_count() # number of CUDA devices
215
314
  nw = min(os.cpu_count() // max(nd, 1), workers) # number of workers
216
- sampler = None if rank == -1 else distributed.DistributedSampler(dataset, shuffle=shuffle)
315
+ sampler = (
316
+ None
317
+ if rank == -1
318
+ else distributed.DistributedSampler(dataset, shuffle=shuffle)
319
+ if shuffle
320
+ else ContiguousDistributedSampler(dataset)
321
+ )
217
322
  generator = torch.Generator()
218
323
  generator.manual_seed(6148914691236517205 + RANK)
219
324
  return InfiniteDataLoader(
@@ -318,18 +318,18 @@ class BaseTrainer:
318
318
  self.train_loader = self.get_dataloader(
319
319
  self.data["train"], batch_size=batch_size, rank=LOCAL_RANK, mode="train"
320
320
  )
321
+ # Note: When training DOTA dataset, double batch size could get OOM on images with >2000 objects.
322
+ self.test_loader = self.get_dataloader(
323
+ self.data.get("val") or self.data.get("test"),
324
+ batch_size=batch_size if self.args.task == "obb" else batch_size * 2,
325
+ rank=LOCAL_RANK,
326
+ mode="val",
327
+ )
328
+ self.validator = self.get_validator()
329
+ self.ema = ModelEMA(self.model)
321
330
  if RANK in {-1, 0}:
322
- # Note: When training DOTA dataset, double batch size could get OOM on images with >2000 objects.
323
- self.test_loader = self.get_dataloader(
324
- self.data.get("val") or self.data.get("test"),
325
- batch_size=batch_size if self.args.task == "obb" else batch_size * 2,
326
- rank=-1,
327
- mode="val",
328
- )
329
- self.validator = self.get_validator()
330
331
  metric_keys = self.validator.metrics.keys + self.label_loss_items(prefix="val")
331
332
  self.metrics = dict(zip(metric_keys, [0] * len(metric_keys)))
332
- self.ema = ModelEMA(self.model)
333
333
  if self.args.plots:
334
334
  self.plot_training_labels()
335
335
 
@@ -467,10 +467,10 @@ class BaseTrainer:
467
467
  final_epoch = epoch + 1 >= self.epochs
468
468
  self.ema.update_attr(self.model, include=["yaml", "nc", "args", "names", "stride", "class_weights"])
469
469
 
470
- # Validation
471
- if self.args.val or final_epoch or self.stopper.possible_stop or self.stop:
472
- self._clear_memory(threshold=0.5) # prevent VRAM spike
473
- self.metrics, self.fitness = self.validate()
470
+ # Validation
471
+ if self.args.val or final_epoch or self.stopper.possible_stop or self.stop:
472
+ self._clear_memory(threshold=0.5) # prevent VRAM spike
473
+ self.metrics, self.fitness = self.validate()
474
474
 
475
475
  # NaN recovery
476
476
  if self._handle_nan_recovery(epoch):
@@ -510,11 +510,11 @@ class BaseTrainer:
510
510
  break # must break all DDP ranks
511
511
  epoch += 1
512
512
 
513
+ seconds = time.time() - self.train_time_start
514
+ LOGGER.info(f"\n{epoch - self.start_epoch + 1} epochs completed in {seconds / 3600:.3f} hours.")
515
+ # Do final val with best.pt
516
+ self.final_eval()
513
517
  if RANK in {-1, 0}:
514
- # Do final val with best.pt
515
- seconds = time.time() - self.train_time_start
516
- LOGGER.info(f"\n{epoch - self.start_epoch + 1} epochs completed in {seconds / 3600:.3f} hours.")
517
- self.final_eval()
518
518
  if self.args.plots:
519
519
  self.plot_metrics()
520
520
  self.run_callbacks("on_train_end")
@@ -695,7 +695,13 @@ class BaseTrainer:
695
695
  metrics (dict): Dictionary of validation metrics.
696
696
  fitness (float): Fitness score for the validation.
697
697
  """
698
+ if self.ema and self.world_size > 1:
699
+ # Sync EMA buffers from rank 0 to all ranks
700
+ for buffer in self.ema.ema.buffers():
701
+ dist.broadcast(buffer, src=0)
698
702
  metrics = self.validator(self)
703
+ if metrics is None:
704
+ return None, None
699
705
  fitness = metrics.pop("fitness", -self.loss.detach().cpu().numpy()) # use loss as fitness measure if not found
700
706
  if not self.best_fitness or self.best_fitness < fitness:
701
707
  self.best_fitness = fitness
@@ -768,20 +774,20 @@ class BaseTrainer:
768
774
 
769
775
  def final_eval(self):
770
776
  """Perform final evaluation and validation for object detection YOLO model."""
771
- ckpt = {}
772
- for f in self.last, self.best:
773
- if f.exists():
774
- if f is self.last:
775
- ckpt = strip_optimizer(f)
776
- elif f is self.best:
777
- k = "train_results" # update best.pt train_metrics from last.pt
778
- strip_optimizer(f, updates={k: ckpt[k]} if k in ckpt else None)
779
- LOGGER.info(f"\nValidating {f}...")
780
- self.validator.args.plots = self.args.plots
781
- self.validator.args.compile = False # disable final val compile as too slow
782
- self.metrics = self.validator(model=f)
783
- self.metrics.pop("fitness", None)
784
- self.run_callbacks("on_fit_epoch_end")
777
+ model = self.best if self.best.exists() else None
778
+ with torch_distributed_zero_first(LOCAL_RANK): # strip only on GPU 0; other GPUs should wait
779
+ if RANK in {-1, 0}:
780
+ ckpt = strip_optimizer(self.last) if self.last.exists() else {}
781
+ if model:
782
+ # update best.pt train_metrics from last.pt
783
+ strip_optimizer(self.best, updates={"train_results": ckpt.get("train_results")})
784
+ if model:
785
+ LOGGER.info(f"\nValidating {model}...")
786
+ self.validator.args.plots = self.args.plots
787
+ self.validator.args.compile = False # disable final val compile as too slow
788
+ self.metrics = self.validator(model=model)
789
+ self.metrics.pop("fitness", None)
790
+ self.run_callbacks("on_fit_epoch_end")
785
791
 
786
792
  def check_resume(self, overrides):
787
793
  """Check if resume checkpoint exists and update arguments accordingly."""
@@ -29,11 +29,12 @@ from pathlib import Path
29
29
 
30
30
  import numpy as np
31
31
  import torch
32
+ import torch.distributed as dist
32
33
 
33
34
  from ultralytics.cfg import get_cfg, get_save_dir
34
35
  from ultralytics.data.utils import check_cls_dataset, check_det_dataset
35
36
  from ultralytics.nn.autobackend import AutoBackend
36
- from ultralytics.utils import LOGGER, TQDM, callbacks, colorstr, emojis
37
+ from ultralytics.utils import LOGGER, RANK, TQDM, callbacks, colorstr, emojis
37
38
  from ultralytics.utils.checks import check_imgsz
38
39
  from ultralytics.utils.ops import Profile
39
40
  from ultralytics.utils.torch_utils import attempt_compile, select_device, smart_inference_mode, unwrap_model
@@ -160,7 +161,7 @@ class BaseValidator:
160
161
  callbacks.add_integration_callbacks(self)
161
162
  model = AutoBackend(
162
163
  model=model or self.args.model,
163
- device=select_device(self.args.device),
164
+ device=select_device(self.args.device) if RANK == -1 else torch.device("cuda", RANK),
164
165
  dnn=self.args.dnn,
165
166
  data=self.args.data,
166
167
  fp16=self.args.half,
@@ -223,21 +224,34 @@ class BaseValidator:
223
224
  preds = self.postprocess(preds)
224
225
 
225
226
  self.update_metrics(preds, batch)
226
- if self.args.plots and batch_i < 3:
227
+ if self.args.plots and batch_i < 3 and RANK in {-1, 0}:
227
228
  self.plot_val_samples(batch, batch_i)
228
229
  self.plot_predictions(batch, preds, batch_i)
229
230
 
230
231
  self.run_callbacks("on_val_batch_end")
231
- stats = self.get_stats()
232
- self.speed = dict(zip(self.speed.keys(), (x.t / len(self.dataloader.dataset) * 1e3 for x in dt)))
233
- self.finalize_metrics()
234
- self.print_results()
235
- self.run_callbacks("on_val_end")
232
+
233
+ stats = {}
234
+ self.gather_stats()
235
+ if RANK in {-1, 0}:
236
+ stats = self.get_stats()
237
+ self.speed = dict(zip(self.speed.keys(), (x.t / len(self.dataloader.dataset) * 1e3 for x in dt)))
238
+ self.finalize_metrics()
239
+ self.print_results()
240
+ self.run_callbacks("on_val_end")
241
+
236
242
  if self.training:
237
243
  model.float()
238
- results = {**stats, **trainer.label_loss_items(self.loss.cpu() / len(self.dataloader), prefix="val")}
244
+ # Reduce loss across all GPUs
245
+ loss = self.loss.clone().detach()
246
+ if trainer.world_size > 1:
247
+ dist.reduce(loss, dst=0, op=dist.ReduceOp.AVG)
248
+ if RANK > 0:
249
+ return
250
+ results = {**stats, **trainer.label_loss_items(loss.cpu() / len(self.dataloader), prefix="val")}
239
251
  return {k: round(float(v), 5) for k, v in results.items()} # return results as 5 decimal place floats
240
252
  else:
253
+ if RANK > 0:
254
+ return stats
241
255
  LOGGER.info(
242
256
  "Speed: {:.1f}ms preprocess, {:.1f}ms inference, {:.1f}ms loss, {:.1f}ms postprocess per image".format(
243
257
  *tuple(self.speed.values())
@@ -336,6 +350,10 @@ class BaseValidator:
336
350
  """Return statistics about the model's performance."""
337
351
  return {}
338
352
 
353
+ def gather_stats(self):
354
+ """Gather statistics from all the GPUs during DDP training to GPU 0."""
355
+ pass
356
+
339
357
  def print_results(self):
340
358
  """Print the results of the model's predictions."""
341
359
  pass
@@ -4,7 +4,7 @@ import torch
4
4
  from PIL import Image
5
5
 
6
6
  from ultralytics.models.yolo.segment import SegmentationPredictor
7
- from ultralytics.utils import DEFAULT_CFG, checks
7
+ from ultralytics.utils import DEFAULT_CFG
8
8
  from ultralytics.utils.metrics import box_iou
9
9
  from ultralytics.utils.ops import scale_masks
10
10
  from ultralytics.utils.torch_utils import TORCH_1_10
@@ -101,7 +101,7 @@ class FastSAMPredictor(SegmentationPredictor):
101
101
  continue
102
102
  masks = result.masks.data
103
103
  if masks.shape[1:] != result.orig_shape:
104
- masks = scale_masks(masks[None], result.orig_shape)[0]
104
+ masks = (scale_masks(masks[None].float(), result.orig_shape)[0] > 0.5).byte()
105
105
  # bboxes prompt
106
106
  idx = torch.zeros(len(result), dtype=torch.bool, device=self.device)
107
107
  if bboxes is not None:
@@ -161,20 +161,14 @@ class FastSAMPredictor(SegmentationPredictor):
161
161
  Returns:
162
162
  (torch.Tensor): Similarity matrix between given images and texts with shape (M, N).
163
163
  """
164
- try:
165
- import clip
166
- except ImportError:
167
- checks.check_requirements("git+https://github.com/ultralytics/CLIP.git")
168
- import clip
169
- if (not hasattr(self, "clip_model")) or (not hasattr(self, "clip_preprocess")):
170
- self.clip_model, self.clip_preprocess = clip.load("ViT-B/32", device=self.device)
171
- images = torch.stack([self.clip_preprocess(image).to(self.device) for image in images])
172
- tokenized_text = clip.tokenize(texts).to(self.device)
173
- image_features = self.clip_model.encode_image(images)
174
- text_features = self.clip_model.encode_text(tokenized_text)
175
- image_features /= image_features.norm(dim=-1, keepdim=True) # (N, 512)
176
- text_features /= text_features.norm(dim=-1, keepdim=True) # (M, 512)
177
- return (image_features * text_features[:, None]).sum(-1) # (M, N)
164
+ from ultralytics.nn.text_model import CLIP
165
+
166
+ if not hasattr(self, "clip"):
167
+ self.clip = CLIP("ViT-B/32", device=self.device)
168
+ images = torch.stack([self.clip.image_preprocess(image).to(self.device) for image in images])
169
+ image_features = self.clip.encode_image(images)
170
+ text_features = self.clip.encode_text(self.clip.tokenize(texts))
171
+ return text_features @ image_features.T # (M, N)
178
172
 
179
173
  def set_prompts(self, prompts):
180
174
  """Set prompts to be used during inference."""
@@ -11,9 +11,9 @@ from ultralytics.data import ClassificationDataset, build_dataloader
11
11
  from ultralytics.engine.trainer import BaseTrainer
12
12
  from ultralytics.models import yolo
13
13
  from ultralytics.nn.tasks import ClassificationModel
14
- from ultralytics.utils import DEFAULT_CFG, LOGGER, RANK
14
+ from ultralytics.utils import DEFAULT_CFG, RANK
15
15
  from ultralytics.utils.plotting import plot_images
16
- from ultralytics.utils.torch_utils import is_parallel, strip_optimizer, torch_distributed_zero_first
16
+ from ultralytics.utils.torch_utils import is_parallel, torch_distributed_zero_first
17
17
 
18
18
 
19
19
  class ClassificationTrainer(BaseTrainer):
@@ -194,19 +194,6 @@ class ClassificationTrainer(BaseTrainer):
194
194
  loss_items = [round(float(loss_items), 5)]
195
195
  return dict(zip(keys, loss_items))
196
196
 
197
- def final_eval(self):
198
- """Evaluate trained model and save validation results."""
199
- for f in self.last, self.best:
200
- if f.exists():
201
- strip_optimizer(f) # strip optimizers
202
- if f is self.best:
203
- LOGGER.info(f"\nValidating {f}...")
204
- self.validator.args.data = self.args.data
205
- self.validator.args.plots = self.args.plots
206
- self.metrics = self.validator(model=f)
207
- self.metrics.pop("fitness", None)
208
- self.run_callbacks("on_fit_epoch_end")
209
-
210
197
  def plot_training_samples(self, batch: dict[str, torch.Tensor], ni: int):
211
198
  """
212
199
  Plot training samples with their annotations.
@@ -6,10 +6,11 @@ from pathlib import Path
6
6
  from typing import Any
7
7
 
8
8
  import torch
9
+ import torch.distributed as dist
9
10
 
10
11
  from ultralytics.data import ClassificationDataset, build_dataloader
11
12
  from ultralytics.engine.validator import BaseValidator
12
- from ultralytics.utils import LOGGER
13
+ from ultralytics.utils import LOGGER, RANK
13
14
  from ultralytics.utils.metrics import ClassifyMetrics, ConfusionMatrix
14
15
  from ultralytics.utils.plotting import plot_images
15
16
 
@@ -142,6 +143,19 @@ class ClassificationValidator(BaseValidator):
142
143
  self.metrics.process(self.targets, self.pred)
143
144
  return self.metrics.results_dict
144
145
 
146
+ def gather_stats(self) -> None:
147
+ """Gather stats from all GPUs."""
148
+ if RANK == 0:
149
+ gathered_preds = [None] * dist.get_world_size()
150
+ gathered_targets = [None] * dist.get_world_size()
151
+ dist.gather_object(self.pred, gathered_preds, dst=0)
152
+ dist.gather_object(self.targets, gathered_targets, dst=0)
153
+ self.pred = [pred for rank in gathered_preds for pred in rank]
154
+ self.targets = [targets for rank in gathered_targets for targets in rank]
155
+ elif RANK > 0:
156
+ dist.gather_object(self.pred, None, dst=0)
157
+ dist.gather_object(self.targets, None, dst=0)
158
+
145
159
  def build_dataset(self, img_path: str) -> ClassificationDataset:
146
160
  """Create a ClassificationDataset instance for validation."""
147
161
  return ClassificationDataset(root=img_path, args=self.args, augment=False, prefix=self.args.split)
@@ -8,10 +8,11 @@ from typing import Any
8
8
 
9
9
  import numpy as np
10
10
  import torch
11
+ import torch.distributed as dist
11
12
 
12
13
  from ultralytics.data import build_dataloader, build_yolo_dataset, converter
13
14
  from ultralytics.engine.validator import BaseValidator
14
- from ultralytics.utils import LOGGER, nms, ops
15
+ from ultralytics.utils import LOGGER, RANK, nms, ops
15
16
  from ultralytics.utils.checks import check_requirements
16
17
  from ultralytics.utils.metrics import ConfusionMatrix, DetMetrics, box_iou
17
18
  from ultralytics.utils.plotting import plot_images
@@ -226,6 +227,21 @@ class DetectionValidator(BaseValidator):
226
227
  self.metrics.confusion_matrix = self.confusion_matrix
227
228
  self.metrics.save_dir = self.save_dir
228
229
 
230
+ def gather_stats(self) -> None:
231
+ """Gather stats from all GPUs."""
232
+ if RANK == 0:
233
+ gathered_stats = [None] * dist.get_world_size()
234
+ dist.gather_object(self.metrics.stats, gathered_stats, dst=0)
235
+ merged_stats = {key: [] for key in self.metrics.stats.keys()}
236
+ for stats_dict in gathered_stats:
237
+ for key in merged_stats.keys():
238
+ merged_stats[key].extend(stats_dict[key])
239
+ self.metrics.stats = merged_stats
240
+ self.seen = len(self.dataloader.dataset) # total image count from dataset
241
+ elif RANK > 0:
242
+ dist.gather_object(self.metrics.stats, None, dst=0)
243
+ self.metrics.clear_stats()
244
+
229
245
  def get_stats(self) -> dict[str, Any]:
230
246
  """
231
247
  Calculate and return metrics statistics.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ultralytics
3
- Version: 8.3.217
3
+ Version: 8.3.219
4
4
  Summary: Ultralytics YOLO 🚀 for SOTA object detection, multi-object tracking, instance segmentation, pose estimation and image classification.
5
5
  Author-email: Glenn Jocher <glenn.jocher@ultralytics.com>, Jing Qiu <jing.qiu@ultralytics.com>
6
6
  Maintainer-email: Ultralytics <hello@ultralytics.com>
File without changes
File without changes
File without changes