dgenerate-ultralytics-headless 8.3.217__tar.gz → 8.3.220__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. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/PKG-INFO +1 -1
  2. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/dgenerate_ultralytics_headless.egg-info/PKG-INFO +1 -1
  3. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/tests/test_cli.py +8 -1
  4. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/tests/test_exports.py +37 -9
  5. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/__init__.py +1 -1
  6. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/default.yaml +1 -1
  7. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/data/build.py +106 -1
  8. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/engine/exporter.py +57 -4
  9. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/engine/predictor.py +1 -0
  10. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/engine/trainer.py +37 -31
  11. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/engine/validator.py +27 -9
  12. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/fastsam/predict.py +10 -16
  13. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/classify/train.py +2 -15
  14. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/classify/val.py +15 -1
  15. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/detect/val.py +17 -1
  16. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/nn/autobackend.py +27 -0
  17. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/solutions/similarity_search.py +2 -2
  18. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/torch_utils.py +1 -0
  19. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/LICENSE +0 -0
  20. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/README.md +0 -0
  21. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/dgenerate_ultralytics_headless.egg-info/SOURCES.txt +0 -0
  22. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/dgenerate_ultralytics_headless.egg-info/dependency_links.txt +0 -0
  23. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/dgenerate_ultralytics_headless.egg-info/entry_points.txt +0 -0
  24. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/dgenerate_ultralytics_headless.egg-info/requires.txt +0 -0
  25. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/dgenerate_ultralytics_headless.egg-info/top_level.txt +0 -0
  26. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/pyproject.toml +0 -0
  27. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/setup.cfg +0 -0
  28. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/tests/__init__.py +0 -0
  29. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/tests/conftest.py +0 -0
  30. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/tests/test_cuda.py +0 -0
  31. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/tests/test_engine.py +0 -0
  32. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/tests/test_integrations.py +0 -0
  33. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/tests/test_python.py +0 -0
  34. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/tests/test_solutions.py +0 -0
  35. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/assets/bus.jpg +0 -0
  36. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/assets/zidane.jpg +0 -0
  37. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/__init__.py +0 -0
  38. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
  39. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
  40. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
  41. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
  42. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/HomeObjects-3K.yaml +0 -0
  43. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
  44. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
  45. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
  46. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/VOC.yaml +0 -0
  47. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
  48. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
  49. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
  50. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
  51. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
  52. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/coco.yaml +0 -0
  53. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
  54. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/coco128.yaml +0 -0
  55. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/coco8-grayscale.yaml +0 -0
  56. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/coco8-multispectral.yaml +0 -0
  57. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
  58. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
  59. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/coco8.yaml +0 -0
  60. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/construction-ppe.yaml +0 -0
  61. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
  62. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/dog-pose.yaml +0 -0
  63. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/dota8-multispectral.yaml +0 -0
  64. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/dota8.yaml +0 -0
  65. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/hand-keypoints.yaml +0 -0
  66. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/lvis.yaml +0 -0
  67. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/medical-pills.yaml +0 -0
  68. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
  69. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
  70. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/signature.yaml +0 -0
  71. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
  72. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/datasets/xView.yaml +0 -0
  73. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/11/yolo11-cls-resnet18.yaml +0 -0
  74. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/11/yolo11-cls.yaml +0 -0
  75. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/11/yolo11-obb.yaml +0 -0
  76. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/11/yolo11-pose.yaml +0 -0
  77. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/11/yolo11-seg.yaml +0 -0
  78. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/11/yolo11.yaml +0 -0
  79. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/11/yoloe-11-seg.yaml +0 -0
  80. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/11/yoloe-11.yaml +0 -0
  81. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/12/yolo12-cls.yaml +0 -0
  82. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/12/yolo12-obb.yaml +0 -0
  83. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/12/yolo12-pose.yaml +0 -0
  84. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/12/yolo12-seg.yaml +0 -0
  85. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/12/yolo12.yaml +0 -0
  86. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
  87. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
  88. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
  89. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
  90. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v10/yolov10b.yaml +0 -0
  91. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v10/yolov10l.yaml +0 -0
  92. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v10/yolov10m.yaml +0 -0
  93. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v10/yolov10n.yaml +0 -0
  94. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v10/yolov10s.yaml +0 -0
  95. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v10/yolov10x.yaml +0 -0
  96. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
  97. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
  98. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
  99. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
  100. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
  101. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
  102. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v8/yoloe-v8-seg.yaml +0 -0
  103. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v8/yoloe-v8.yaml +0 -0
  104. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
  105. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
  106. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
  107. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
  108. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
  109. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
  110. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
  111. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
  112. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
  113. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
  114. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
  115. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
  116. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
  117. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
  118. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
  119. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
  120. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
  121. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
  122. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
  123. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
  124. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
  125. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v9/yolov9m.yaml +0 -0
  126. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v9/yolov9s.yaml +0 -0
  127. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/models/v9/yolov9t.yaml +0 -0
  128. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/trackers/botsort.yaml +0 -0
  129. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
  130. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/data/__init__.py +0 -0
  131. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/data/annotator.py +0 -0
  132. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/data/augment.py +0 -0
  133. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/data/base.py +0 -0
  134. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/data/converter.py +0 -0
  135. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/data/dataset.py +0 -0
  136. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/data/loaders.py +0 -0
  137. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/data/scripts/download_weights.sh +0 -0
  138. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/data/scripts/get_coco.sh +0 -0
  139. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/data/scripts/get_coco128.sh +0 -0
  140. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/data/scripts/get_imagenet.sh +0 -0
  141. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/data/split.py +0 -0
  142. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/data/split_dota.py +0 -0
  143. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/data/utils.py +0 -0
  144. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/engine/__init__.py +0 -0
  145. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/engine/model.py +0 -0
  146. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/engine/results.py +0 -0
  147. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/engine/tuner.py +0 -0
  148. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/hub/__init__.py +0 -0
  149. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/hub/auth.py +0 -0
  150. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/hub/google/__init__.py +0 -0
  151. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/hub/session.py +0 -0
  152. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/hub/utils.py +0 -0
  153. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/__init__.py +0 -0
  154. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/fastsam/__init__.py +0 -0
  155. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/fastsam/model.py +0 -0
  156. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/fastsam/utils.py +0 -0
  157. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/fastsam/val.py +0 -0
  158. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/nas/__init__.py +0 -0
  159. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/nas/model.py +0 -0
  160. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/nas/predict.py +0 -0
  161. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/nas/val.py +0 -0
  162. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/rtdetr/__init__.py +0 -0
  163. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/rtdetr/model.py +0 -0
  164. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/rtdetr/predict.py +0 -0
  165. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/rtdetr/train.py +0 -0
  166. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/rtdetr/val.py +0 -0
  167. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/sam/__init__.py +0 -0
  168. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/sam/amg.py +0 -0
  169. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/sam/build.py +0 -0
  170. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/sam/model.py +0 -0
  171. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/sam/modules/__init__.py +0 -0
  172. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/sam/modules/blocks.py +0 -0
  173. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/sam/modules/decoders.py +0 -0
  174. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/sam/modules/encoders.py +0 -0
  175. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/sam/modules/memory_attention.py +0 -0
  176. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/sam/modules/sam.py +0 -0
  177. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
  178. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/sam/modules/transformer.py +0 -0
  179. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/sam/modules/utils.py +0 -0
  180. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/sam/predict.py +0 -0
  181. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/utils/__init__.py +0 -0
  182. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/utils/loss.py +0 -0
  183. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/utils/ops.py +0 -0
  184. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/__init__.py +0 -0
  185. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/classify/__init__.py +0 -0
  186. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/classify/predict.py +0 -0
  187. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/detect/__init__.py +0 -0
  188. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/detect/predict.py +0 -0
  189. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/detect/train.py +0 -0
  190. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/model.py +0 -0
  191. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/obb/__init__.py +0 -0
  192. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/obb/predict.py +0 -0
  193. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/obb/train.py +0 -0
  194. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/obb/val.py +0 -0
  195. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/pose/__init__.py +0 -0
  196. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/pose/predict.py +0 -0
  197. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/pose/train.py +0 -0
  198. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/pose/val.py +0 -0
  199. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/segment/__init__.py +0 -0
  200. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/segment/predict.py +0 -0
  201. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/segment/train.py +0 -0
  202. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/segment/val.py +0 -0
  203. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/world/__init__.py +0 -0
  204. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/world/train.py +0 -0
  205. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/world/train_world.py +0 -0
  206. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/yoloe/__init__.py +0 -0
  207. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/yoloe/predict.py +0 -0
  208. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/yoloe/train.py +0 -0
  209. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/yoloe/train_seg.py +0 -0
  210. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/models/yolo/yoloe/val.py +0 -0
  211. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/nn/__init__.py +0 -0
  212. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/nn/modules/__init__.py +0 -0
  213. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/nn/modules/activation.py +0 -0
  214. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/nn/modules/block.py +0 -0
  215. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/nn/modules/conv.py +0 -0
  216. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/nn/modules/head.py +0 -0
  217. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/nn/modules/transformer.py +0 -0
  218. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/nn/modules/utils.py +0 -0
  219. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/nn/tasks.py +0 -0
  220. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/nn/text_model.py +0 -0
  221. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/py.typed +0 -0
  222. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/solutions/__init__.py +0 -0
  223. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/solutions/ai_gym.py +0 -0
  224. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/solutions/analytics.py +0 -0
  225. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/solutions/config.py +0 -0
  226. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/solutions/distance_calculation.py +0 -0
  227. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/solutions/heatmap.py +0 -0
  228. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/solutions/instance_segmentation.py +0 -0
  229. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/solutions/object_blurrer.py +0 -0
  230. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/solutions/object_counter.py +0 -0
  231. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/solutions/object_cropper.py +0 -0
  232. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/solutions/parking_management.py +0 -0
  233. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/solutions/queue_management.py +0 -0
  234. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/solutions/region_counter.py +0 -0
  235. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/solutions/security_alarm.py +0 -0
  236. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/solutions/solutions.py +0 -0
  237. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/solutions/speed_estimation.py +0 -0
  238. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/solutions/streamlit_inference.py +0 -0
  239. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/solutions/templates/similarity-search.html +0 -0
  240. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/solutions/trackzone.py +0 -0
  241. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/solutions/vision_eye.py +0 -0
  242. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/trackers/__init__.py +0 -0
  243. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/trackers/basetrack.py +0 -0
  244. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/trackers/bot_sort.py +0 -0
  245. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/trackers/byte_tracker.py +0 -0
  246. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/trackers/track.py +0 -0
  247. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/trackers/utils/__init__.py +0 -0
  248. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/trackers/utils/gmc.py +0 -0
  249. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/trackers/utils/kalman_filter.py +0 -0
  250. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/trackers/utils/matching.py +0 -0
  251. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/__init__.py +0 -0
  252. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/autobatch.py +0 -0
  253. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/autodevice.py +0 -0
  254. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/benchmarks.py +0 -0
  255. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/callbacks/__init__.py +0 -0
  256. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/callbacks/base.py +0 -0
  257. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/callbacks/clearml.py +0 -0
  258. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/callbacks/comet.py +0 -0
  259. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/callbacks/dvc.py +0 -0
  260. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/callbacks/hub.py +0 -0
  261. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/callbacks/mlflow.py +0 -0
  262. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/callbacks/neptune.py +0 -0
  263. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/callbacks/platform.py +0 -0
  264. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/callbacks/raytune.py +0 -0
  265. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/callbacks/tensorboard.py +0 -0
  266. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/callbacks/wb.py +0 -0
  267. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/checks.py +0 -0
  268. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/cpu.py +0 -0
  269. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/dist.py +0 -0
  270. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/downloads.py +0 -0
  271. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/errors.py +0 -0
  272. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/events.py +0 -0
  273. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/export/__init__.py +0 -0
  274. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/export/imx.py +0 -0
  275. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/files.py +0 -0
  276. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/git.py +0 -0
  277. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/instance.py +0 -0
  278. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/logger.py +0 -0
  279. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/loss.py +0 -0
  280. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/metrics.py +0 -0
  281. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/nms.py +0 -0
  282. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/ops.py +0 -0
  283. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/patches.py +0 -0
  284. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/plotting.py +0 -0
  285. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/tal.py +0 -0
  286. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/tqdm.py +0 -0
  287. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/triton.py +0 -0
  288. {dgenerate_ultralytics_headless-8.3.217 → dgenerate_ultralytics_headless-8.3.220}/ultralytics/utils/tuner.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dgenerate-ultralytics-headless
3
- Version: 8.3.217
3
+ Version: 8.3.220
4
4
  Summary: Automatically built Ultralytics package with python-opencv-headless dependency instead of python-opencv
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
  Metadata-Version: 2.4
2
2
  Name: dgenerate-ultralytics-headless
3
- Version: 8.3.217
3
+ Version: 8.3.220
4
4
  Summary: Automatically built Ultralytics package with python-opencv-headless dependency instead of python-opencv
5
5
  Author-email: Glenn Jocher <glenn.jocher@ultralytics.com>, Jing Qiu <jing.qiu@ultralytics.com>
6
6
  Maintainer-email: Ultralytics <hello@ultralytics.com>
@@ -8,7 +8,7 @@ from PIL import Image
8
8
 
9
9
  from tests import CUDA_DEVICE_COUNT, CUDA_IS_AVAILABLE, MODELS, TASK_MODEL_DATA
10
10
  from ultralytics.utils import ARM64, ASSETS, LINUX, WEIGHTS_DIR, checks
11
- from ultralytics.utils.torch_utils import TORCH_1_11
11
+ from ultralytics.utils.torch_utils import TORCH_1_11, TORCH_2_9, WINDOWS
12
12
 
13
13
 
14
14
  def run(cmd: str) -> None:
@@ -129,3 +129,10 @@ def test_train_gpu(task: str, model: str, data: str) -> None:
129
129
  def test_solutions(solution: str) -> None:
130
130
  """Test yolo solutions command-line modes."""
131
131
  run(f"yolo solutions {solution} verbose=False")
132
+
133
+
134
+ @pytest.mark.skipif(not checks.IS_PYTHON_MINIMUM_3_10 or not TORCH_2_9, reason="Requires Python>=3.10 and Torch>=2.9.0")
135
+ @pytest.mark.skipif(WINDOWS, reason="Skipping test on Windows")
136
+ def test_export_executorch() -> None:
137
+ """Test exporting a YOLO model to ExecuTorch format via CLI."""
138
+ run("yolo export model=yolo11n.pt format=executorch imgsz=32")
@@ -12,15 +12,8 @@ import pytest
12
12
  from tests import MODEL, SOURCE
13
13
  from ultralytics import YOLO
14
14
  from ultralytics.cfg import TASK2DATA, TASK2MODEL, TASKS
15
- from ultralytics.utils import (
16
- ARM64,
17
- IS_RASPBERRYPI,
18
- LINUX,
19
- MACOS,
20
- WINDOWS,
21
- checks,
22
- )
23
- from ultralytics.utils.torch_utils import TORCH_1_11, TORCH_1_13, TORCH_2_1
15
+ from ultralytics.utils import ARM64, IS_RASPBERRYPI, LINUX, MACOS, WINDOWS, checks
16
+ from ultralytics.utils.torch_utils import TORCH_1_11, TORCH_1_13, TORCH_2_1, TORCH_2_9
24
17
 
25
18
 
26
19
  def test_export_torchscript():
@@ -262,3 +255,38 @@ def test_export_imx():
262
255
  model = YOLO("yolov8n.pt")
263
256
  file = model.export(format="imx", imgsz=32)
264
257
  YOLO(file)(SOURCE, imgsz=32)
258
+
259
+
260
+ @pytest.mark.skipif(not checks.IS_PYTHON_MINIMUM_3_10 or not TORCH_2_9, reason="Requires Python>=3.10 and Torch>=2.9.0")
261
+ @pytest.mark.skipif(WINDOWS, reason="Skipping test on Windows")
262
+ def test_export_executorch():
263
+ """Test YOLO model export to ExecuTorch format."""
264
+ file = YOLO(MODEL).export(format="executorch", imgsz=32)
265
+ assert Path(file).exists(), f"ExecuTorch export failed, directory not found: {file}"
266
+ # Check that .pte file exists in the exported directory
267
+ pte_file = Path(file) / Path(MODEL).with_suffix(".pte").name
268
+ assert pte_file.exists(), f"ExecuTorch .pte file not found: {pte_file}"
269
+ # Check that metadata.yaml exists
270
+ metadata_file = Path(file) / "metadata.yaml"
271
+ assert metadata_file.exists(), f"ExecuTorch metadata.yaml not found: {metadata_file}"
272
+ # Note: Inference testing skipped as ExecuTorch requires special runtime setup
273
+ shutil.rmtree(file, ignore_errors=True) # cleanup
274
+
275
+
276
+ @pytest.mark.slow
277
+ @pytest.mark.skipif(not checks.IS_PYTHON_MINIMUM_3_10 or not TORCH_2_9, reason="Requires Python>=3.10 and Torch>=2.9.0")
278
+ @pytest.mark.skipif(WINDOWS, reason="Skipping test on Windows")
279
+ @pytest.mark.parametrize("task", TASKS)
280
+ def test_export_executorch_matrix(task):
281
+ """Test YOLO export to ExecuTorch format for various task types."""
282
+ file = YOLO(TASK2MODEL[task]).export(format="executorch", imgsz=32)
283
+ assert Path(file).exists(), f"ExecuTorch export failed for task '{task}', directory not found: {file}"
284
+ # Check that .pte file exists in the exported directory
285
+ model_name = Path(TASK2MODEL[task]).with_suffix(".pte").name
286
+ pte_file = Path(file) / model_name
287
+ assert pte_file.exists(), f"ExecuTorch .pte file not found for task '{task}': {pte_file}"
288
+ # Check that metadata.yaml exists
289
+ metadata_file = Path(file) / "metadata.yaml"
290
+ assert metadata_file.exists(), f"ExecuTorch metadata.yaml not found for task '{task}': {metadata_file}"
291
+ # Note: Inference testing skipped as ExecuTorch requires special runtime setup
292
+ shutil.rmtree(file, ignore_errors=True) # cleanup
@@ -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.220"
4
4
 
5
5
  import importlib
6
6
  import os
@@ -80,7 +80,7 @@ show_boxes: True # (bool) draw bounding boxes on images
80
80
  line_width: # (int, optional) line width of boxes; auto-scales with image size if not set
81
81
 
82
82
  # Export settings ------------------------------------------------------------------------------------------------------
83
- format: torchscript # (str) target format, e.g. torchscript|onnx|openvino|engine|coreml|saved_model|pb|tflite|edgetpu|tfjs|paddle|mnn|ncnn|imx|rknn
83
+ format: torchscript # (str) target format, e.g. torchscript|onnx|openvino|engine|coreml|saved_model|pb|tflite|edgetpu|tfjs|paddle|mnn|ncnn|imx|rknn|executorch
84
84
  keras: False # (bool) TF SavedModel only (format=saved_model); enable Keras layers during export
85
85
  optimize: False # (bool) TorchScript only; apply mobile optimizations to the scripted model
86
86
  int8: False # (bool) INT8/PTQ where supported (openvino, tflite, tfjs, engine, imx); needs calibration data/fraction
@@ -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(
@@ -20,6 +20,7 @@ MNN | `mnn` | yolo11n.mnn
20
20
  NCNN | `ncnn` | yolo11n_ncnn_model/
21
21
  IMX | `imx` | yolo11n_imx_model/
22
22
  RKNN | `rknn` | yolo11n_rknn_model/
23
+ ExecuTorch | `executorch` | yolo11n_executorch_model/
23
24
 
24
25
  Requirements:
25
26
  $ pip install "ultralytics[export]"
@@ -48,6 +49,7 @@ Inference:
48
49
  yolo11n_ncnn_model # NCNN
49
50
  yolo11n_imx_model # IMX
50
51
  yolo11n_rknn_model # RKNN
52
+ yolo11n_executorch_model # ExecuTorch
51
53
 
52
54
  TensorFlow.js:
53
55
  $ cd .. && git clone https://github.com/zldrobit/tfjs-yolov5-example.git && cd tfjs-yolov5-example
@@ -112,7 +114,7 @@ from ultralytics.utils.metrics import batch_probiou
112
114
  from ultralytics.utils.nms import TorchNMS
113
115
  from ultralytics.utils.ops import Profile
114
116
  from ultralytics.utils.patches import arange_patch
115
- from ultralytics.utils.torch_utils import TORCH_1_11, TORCH_1_13, TORCH_2_1, TORCH_2_4, select_device
117
+ from ultralytics.utils.torch_utils import TORCH_1_11, TORCH_1_13, TORCH_2_1, TORCH_2_4, TORCH_2_9, select_device
116
118
 
117
119
 
118
120
  def export_formats():
@@ -148,6 +150,7 @@ def export_formats():
148
150
  ["NCNN", "ncnn", "_ncnn_model", True, True, ["batch", "half"]],
149
151
  ["IMX", "imx", "_imx_model", True, True, ["int8", "fraction", "nms"]],
150
152
  ["RKNN", "rknn", "_rknn_model", False, False, ["batch", "name"]],
153
+ ["ExecuTorch", "executorch", "_executorch_model", False, False, ["batch"]],
151
154
  ]
152
155
  return dict(zip(["Format", "Argument", "Suffix", "CPU", "GPU", "Arguments"], zip(*x)))
153
156
 
@@ -322,9 +325,24 @@ class Exporter:
322
325
  flags = [x == fmt for x in fmts]
323
326
  if sum(flags) != 1:
324
327
  raise ValueError(f"Invalid export format='{fmt}'. Valid formats are {fmts}")
325
- (jit, onnx, xml, engine, coreml, saved_model, pb, tflite, edgetpu, tfjs, paddle, mnn, ncnn, imx, rknn) = (
326
- flags # export booleans
327
- )
328
+ (
329
+ jit,
330
+ onnx,
331
+ xml,
332
+ engine,
333
+ coreml,
334
+ saved_model,
335
+ pb,
336
+ tflite,
337
+ edgetpu,
338
+ tfjs,
339
+ paddle,
340
+ mnn,
341
+ ncnn,
342
+ imx,
343
+ rknn,
344
+ executorch,
345
+ ) = flags # export booleans
328
346
 
329
347
  is_tf_format = any((saved_model, pb, tflite, edgetpu, tfjs))
330
348
 
@@ -543,6 +561,8 @@ class Exporter:
543
561
  f[13] = self.export_imx()
544
562
  if rknn:
545
563
  f[14] = self.export_rknn()
564
+ if executorch:
565
+ f[15] = self.export_executorch()
546
566
 
547
567
  # Finish
548
568
  f = [str(x) for x in f if x] # filter out '' and None
@@ -1122,6 +1142,39 @@ class Exporter:
1122
1142
  f = saved_model / f"{self.file.stem}_float32.tflite"
1123
1143
  return str(f)
1124
1144
 
1145
+ @try_export
1146
+ def export_executorch(self, prefix=colorstr("ExecuTorch:")):
1147
+ """Exports a model to ExecuTorch (.pte) format into a dedicated directory and saves the required metadata,
1148
+ following Ultralytics conventions.
1149
+ """
1150
+ LOGGER.info(f"\n{prefix} starting export with ExecuTorch...")
1151
+ assert TORCH_2_9, f"ExecuTorch export requires torch>=2.9.0 but torch=={TORCH_VERSION} is installed"
1152
+ # TorchAO release compatibility table bug https://github.com/pytorch/ao/issues/2919
1153
+ # Setuptools bug: https://github.com/pypa/setuptools/issues/4483
1154
+ check_requirements("setuptools<71.0.0") # Setuptools bug: https://github.com/pypa/setuptools/issues/4483
1155
+ check_requirements(("executorch==1.0.0", "flatbuffers"))
1156
+
1157
+ import torch
1158
+ from executorch.backends.xnnpack.partition.xnnpack_partitioner import XnnpackPartitioner
1159
+ from executorch.exir import to_edge_transform_and_lower
1160
+
1161
+ file_directory = Path(str(self.file).replace(self.file.suffix, "_executorch_model"))
1162
+ file_directory.mkdir(parents=True, exist_ok=True)
1163
+
1164
+ file_pte = file_directory / self.file.with_suffix(".pte").name
1165
+ sample_inputs = (self.im,)
1166
+
1167
+ et_program = to_edge_transform_and_lower(
1168
+ torch.export.export(self.model, sample_inputs), partitioner=[XnnpackPartitioner()]
1169
+ ).to_executorch()
1170
+
1171
+ with open(file_pte, "wb") as file:
1172
+ file.write(et_program.buffer)
1173
+
1174
+ YAML.save(file_directory / "metadata.yaml", self.metadata)
1175
+
1176
+ return str(file_directory)
1177
+
1125
1178
  @try_export
1126
1179
  def export_edgetpu(self, tflite_model="", prefix=colorstr("Edge TPU:")):
1127
1180
  """Export YOLO model to Edge TPU format https://coral.ai/docs/edgetpu/models-intro/."""
@@ -30,6 +30,7 @@ Usage - formats:
30
30
  yolo11n_ncnn_model # NCNN
31
31
  yolo11n_imx_model # Sony IMX
32
32
  yolo11n_rknn_model # Rockchip RKNN
33
+ yolo11n.pte # PyTorch Executorch
33
34
  """
34
35
 
35
36
  from __future__ import annotations
@@ -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.