ultralytics 8.3.117__tar.gz → 8.3.119__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 (273) hide show
  1. {ultralytics-8.3.117/ultralytics.egg-info → ultralytics-8.3.119}/PKG-INFO +6 -7
  2. {ultralytics-8.3.117 → ultralytics-8.3.119}/pyproject.toml +7 -7
  3. ultralytics-8.3.119/tests/__init__.py +22 -0
  4. ultralytics-8.3.119/tests/conftest.py +83 -0
  5. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/__init__.py +1 -1
  6. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/__init__.py +1 -0
  7. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/default.yaml +1 -0
  8. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/data/augment.py +122 -7
  9. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/data/base.py +9 -2
  10. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/data/dataset.py +7 -5
  11. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/engine/exporter.py +10 -91
  12. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/engine/tuner.py +2 -1
  13. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/rtdetr/val.py +1 -0
  14. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/detect/predict.py +1 -1
  15. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/model.py +2 -3
  16. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/obb/train.py +1 -1
  17. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/pose/predict.py +1 -1
  18. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/pose/train.py +1 -1
  19. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/pose/val.py +1 -1
  20. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/segment/train.py +3 -3
  21. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/nn/autobackend.py +2 -5
  22. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/nn/text_model.py +97 -13
  23. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/benchmarks.py +1 -1
  24. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/downloads.py +1 -0
  25. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/ops.py +1 -1
  26. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/tuner.py +2 -1
  27. {ultralytics-8.3.117 → ultralytics-8.3.119/ultralytics.egg-info}/PKG-INFO +6 -7
  28. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics.egg-info/SOURCES.txt +9 -0
  29. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics.egg-info/requires.txt +5 -8
  30. {ultralytics-8.3.117 → ultralytics-8.3.119}/LICENSE +0 -0
  31. {ultralytics-8.3.117 → ultralytics-8.3.119}/README.md +0 -0
  32. {ultralytics-8.3.117 → ultralytics-8.3.119}/setup.cfg +0 -0
  33. {ultralytics-8.3.117 → ultralytics-8.3.119}/tests/test_cli.py +0 -0
  34. {ultralytics-8.3.117 → ultralytics-8.3.119}/tests/test_cuda.py +0 -0
  35. {ultralytics-8.3.117 → ultralytics-8.3.119}/tests/test_engine.py +0 -0
  36. {ultralytics-8.3.117 → ultralytics-8.3.119}/tests/test_exports.py +0 -0
  37. {ultralytics-8.3.117 → ultralytics-8.3.119}/tests/test_integrations.py +0 -0
  38. {ultralytics-8.3.117 → ultralytics-8.3.119}/tests/test_python.py +0 -0
  39. {ultralytics-8.3.117 → ultralytics-8.3.119}/tests/test_solutions.py +0 -0
  40. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/assets/bus.jpg +0 -0
  41. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/assets/zidane.jpg +0 -0
  42. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
  43. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
  44. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
  45. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
  46. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
  47. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
  48. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
  49. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/VOC.yaml +0 -0
  50. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
  51. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
  52. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
  53. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
  54. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
  55. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/coco.yaml +0 -0
  56. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
  57. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/coco128.yaml +0 -0
  58. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/coco8-multispectral.yaml +0 -0
  59. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
  60. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
  61. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/coco8.yaml +0 -0
  62. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
  63. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/dog-pose.yaml +0 -0
  64. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/dota8-multispectral.yaml +0 -0
  65. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/dota8.yaml +0 -0
  66. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/hand-keypoints.yaml +0 -0
  67. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/lvis.yaml +0 -0
  68. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/medical-pills.yaml +0 -0
  69. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
  70. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
  71. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/signature.yaml +0 -0
  72. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
  73. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/datasets/xView.yaml +0 -0
  74. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/11/yolo11-cls-resnet18.yaml +0 -0
  75. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/11/yolo11-cls.yaml +0 -0
  76. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/11/yolo11-obb.yaml +0 -0
  77. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/11/yolo11-pose.yaml +0 -0
  78. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/11/yolo11-seg.yaml +0 -0
  79. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/11/yolo11.yaml +0 -0
  80. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/11/yoloe-11-seg.yaml +0 -0
  81. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/11/yoloe-11.yaml +0 -0
  82. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/12/yolo12-cls.yaml +0 -0
  83. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/12/yolo12-obb.yaml +0 -0
  84. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/12/yolo12-pose.yaml +0 -0
  85. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/12/yolo12-seg.yaml +0 -0
  86. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/12/yolo12.yaml +0 -0
  87. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
  88. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
  89. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
  90. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
  91. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v10/yolov10b.yaml +0 -0
  92. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v10/yolov10l.yaml +0 -0
  93. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v10/yolov10m.yaml +0 -0
  94. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v10/yolov10n.yaml +0 -0
  95. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v10/yolov10s.yaml +0 -0
  96. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v10/yolov10x.yaml +0 -0
  97. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
  98. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
  99. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
  100. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
  101. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
  102. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
  103. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v8/yoloe-v8-seg.yaml +0 -0
  104. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v8/yoloe-v8.yaml +0 -0
  105. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
  106. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
  107. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
  108. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
  109. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
  110. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
  111. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
  112. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
  113. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
  114. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
  115. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
  116. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
  117. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
  118. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
  119. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
  120. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
  121. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
  122. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
  123. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
  124. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
  125. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
  126. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v9/yolov9m.yaml +0 -0
  127. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v9/yolov9s.yaml +0 -0
  128. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/models/v9/yolov9t.yaml +0 -0
  129. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/solutions/default.yaml +0 -0
  130. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/trackers/botsort.yaml +0 -0
  131. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
  132. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/data/__init__.py +0 -0
  133. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/data/annotator.py +0 -0
  134. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/data/build.py +0 -0
  135. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/data/converter.py +0 -0
  136. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/data/loaders.py +0 -0
  137. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/data/scripts/download_weights.sh +0 -0
  138. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/data/scripts/get_coco.sh +0 -0
  139. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/data/scripts/get_coco128.sh +0 -0
  140. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/data/scripts/get_imagenet.sh +0 -0
  141. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/data/split.py +0 -0
  142. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/data/split_dota.py +0 -0
  143. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/data/utils.py +0 -0
  144. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/engine/__init__.py +0 -0
  145. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/engine/model.py +0 -0
  146. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/engine/predictor.py +0 -0
  147. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/engine/results.py +0 -0
  148. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/engine/trainer.py +0 -0
  149. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/engine/validator.py +0 -0
  150. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/hub/__init__.py +0 -0
  151. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/hub/auth.py +0 -0
  152. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/hub/google/__init__.py +0 -0
  153. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/hub/session.py +0 -0
  154. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/hub/utils.py +0 -0
  155. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/__init__.py +0 -0
  156. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/fastsam/__init__.py +0 -0
  157. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/fastsam/model.py +0 -0
  158. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/fastsam/predict.py +0 -0
  159. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/fastsam/utils.py +0 -0
  160. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/fastsam/val.py +0 -0
  161. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/nas/__init__.py +0 -0
  162. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/nas/model.py +0 -0
  163. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/nas/predict.py +0 -0
  164. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/nas/val.py +0 -0
  165. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/rtdetr/__init__.py +0 -0
  166. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/rtdetr/model.py +0 -0
  167. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/rtdetr/predict.py +0 -0
  168. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/rtdetr/train.py +0 -0
  169. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/sam/__init__.py +0 -0
  170. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/sam/amg.py +0 -0
  171. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/sam/build.py +0 -0
  172. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/sam/model.py +0 -0
  173. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/sam/modules/__init__.py +0 -0
  174. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/sam/modules/blocks.py +0 -0
  175. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/sam/modules/decoders.py +0 -0
  176. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/sam/modules/encoders.py +0 -0
  177. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/sam/modules/memory_attention.py +0 -0
  178. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/sam/modules/sam.py +0 -0
  179. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
  180. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/sam/modules/transformer.py +0 -0
  181. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/sam/modules/utils.py +0 -0
  182. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/sam/predict.py +0 -0
  183. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/utils/__init__.py +0 -0
  184. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/utils/loss.py +0 -0
  185. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/utils/ops.py +0 -0
  186. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/__init__.py +0 -0
  187. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/classify/__init__.py +0 -0
  188. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/classify/predict.py +0 -0
  189. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/classify/train.py +0 -0
  190. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/classify/val.py +0 -0
  191. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/detect/__init__.py +0 -0
  192. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/detect/train.py +0 -0
  193. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/detect/val.py +0 -0
  194. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/obb/__init__.py +0 -0
  195. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/obb/predict.py +0 -0
  196. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/obb/val.py +0 -0
  197. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/pose/__init__.py +0 -0
  198. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/segment/__init__.py +0 -0
  199. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/segment/predict.py +0 -0
  200. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/segment/val.py +0 -0
  201. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/world/__init__.py +0 -0
  202. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/world/train.py +0 -0
  203. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/world/train_world.py +0 -0
  204. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/yoloe/__init__.py +0 -0
  205. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/yoloe/predict.py +0 -0
  206. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/yoloe/train.py +0 -0
  207. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/yoloe/train_seg.py +0 -0
  208. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/models/yolo/yoloe/val.py +0 -0
  209. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/nn/__init__.py +0 -0
  210. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/nn/modules/__init__.py +0 -0
  211. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/nn/modules/activation.py +0 -0
  212. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/nn/modules/block.py +0 -0
  213. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/nn/modules/conv.py +0 -0
  214. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/nn/modules/head.py +0 -0
  215. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/nn/modules/transformer.py +0 -0
  216. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/nn/modules/utils.py +0 -0
  217. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/nn/tasks.py +0 -0
  218. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/solutions/__init__.py +0 -0
  219. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/solutions/ai_gym.py +0 -0
  220. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/solutions/analytics.py +0 -0
  221. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/solutions/distance_calculation.py +0 -0
  222. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/solutions/heatmap.py +0 -0
  223. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/solutions/instance_segmentation.py +0 -0
  224. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/solutions/object_blurrer.py +0 -0
  225. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/solutions/object_counter.py +0 -0
  226. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/solutions/object_cropper.py +0 -0
  227. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/solutions/parking_management.py +0 -0
  228. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/solutions/queue_management.py +0 -0
  229. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/solutions/region_counter.py +0 -0
  230. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/solutions/security_alarm.py +0 -0
  231. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/solutions/solutions.py +0 -0
  232. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/solutions/speed_estimation.py +0 -0
  233. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/solutions/streamlit_inference.py +0 -0
  234. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/solutions/trackzone.py +0 -0
  235. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/solutions/vision_eye.py +0 -0
  236. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/trackers/__init__.py +0 -0
  237. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/trackers/basetrack.py +0 -0
  238. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/trackers/bot_sort.py +0 -0
  239. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/trackers/byte_tracker.py +0 -0
  240. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/trackers/track.py +0 -0
  241. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/trackers/utils/__init__.py +0 -0
  242. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/trackers/utils/gmc.py +0 -0
  243. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/trackers/utils/kalman_filter.py +0 -0
  244. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/trackers/utils/matching.py +0 -0
  245. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/__init__.py +0 -0
  246. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/autobatch.py +0 -0
  247. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/callbacks/__init__.py +0 -0
  248. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/callbacks/base.py +0 -0
  249. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/callbacks/clearml.py +0 -0
  250. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/callbacks/comet.py +0 -0
  251. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/callbacks/dvc.py +0 -0
  252. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/callbacks/hub.py +0 -0
  253. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/callbacks/mlflow.py +0 -0
  254. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/callbacks/neptune.py +0 -0
  255. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/callbacks/raytune.py +0 -0
  256. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/callbacks/tensorboard.py +0 -0
  257. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/callbacks/wb.py +0 -0
  258. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/checks.py +0 -0
  259. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/dist.py +0 -0
  260. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/errors.py +0 -0
  261. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/export.py +0 -0
  262. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/files.py +0 -0
  263. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/instance.py +0 -0
  264. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/loss.py +0 -0
  265. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/metrics.py +0 -0
  266. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/patches.py +0 -0
  267. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/plotting.py +0 -0
  268. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/tal.py +0 -0
  269. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/torch_utils.py +0 -0
  270. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics/utils/triton.py +0 -0
  271. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics.egg-info/dependency_links.txt +0 -0
  272. {ultralytics-8.3.117 → ultralytics-8.3.119}/ultralytics.egg-info/entry_points.txt +0 -0
  273. {ultralytics-8.3.117 → ultralytics-8.3.119}/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.117
3
+ Version: 8.3.119
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>
@@ -32,7 +32,7 @@ Classifier: Operating System :: Microsoft :: Windows
32
32
  Requires-Python: >=3.8
33
33
  Description-Content-Type: text/markdown
34
34
  License-File: LICENSE
35
- Requires-Dist: numpy<=2.1.1,>=1.23.0
35
+ Requires-Dist: numpy>=1.23.0
36
36
  Requires-Dist: matplotlib>=3.3.0
37
37
  Requires-Dist: opencv-python>=4.6.0
38
38
  Requires-Dist: pillow>=7.1.2
@@ -61,20 +61,19 @@ Requires-Dist: mkdocs-macros-plugin>=1.0.5; extra == "dev"
61
61
  Provides-Extra: export
62
62
  Requires-Dist: onnx>=1.12.0; extra == "export"
63
63
  Requires-Dist: coremltools>=8.0; (platform_system != "Windows" and python_version <= "3.13") and extra == "export"
64
- Requires-Dist: scikit-learn>=1.3.2; (platform_system != "Windows" and python_version <= "3.12") and extra == "export"
64
+ Requires-Dist: scikit-learn>=1.3.2; (platform_system != "Windows" and python_version <= "3.13") and extra == "export"
65
65
  Requires-Dist: openvino>=2024.0.0; extra == "export"
66
66
  Requires-Dist: tensorflow>=2.0.0; extra == "export"
67
67
  Requires-Dist: tensorflowjs>=2.0.0; extra == "export"
68
68
  Requires-Dist: tensorstore>=0.1.63; (platform_machine == "aarch64" and python_version >= "3.9") and extra == "export"
69
- Requires-Dist: keras; extra == "export"
70
69
  Requires-Dist: h5py!=3.11.0; platform_machine == "aarch64" and extra == "export"
71
70
  Provides-Extra: solutions
72
71
  Requires-Dist: shapely<2.1.0,>=2.0.0; extra == "solutions"
73
72
  Requires-Dist: streamlit<1.44.0,>=1.29.0; extra == "solutions"
74
73
  Provides-Extra: logging
75
- Requires-Dist: comet; extra == "logging"
76
- Requires-Dist: tensorboard>=2.13.0; extra == "logging"
77
- Requires-Dist: dvclive>=2.12.0; extra == "logging"
74
+ Requires-Dist: wandb; extra == "logging"
75
+ Requires-Dist: tensorboard; extra == "logging"
76
+ Requires-Dist: mlflow; extra == "logging"
78
77
  Provides-Extra: extra
79
78
  Requires-Dist: hub-sdk>=0.0.12; extra == "extra"
80
79
  Requires-Dist: ipython; extra == "extra"
@@ -61,7 +61,7 @@ classifiers = [
61
61
 
62
62
  # Required dependencies ------------------------------------------------------------------------------------------------
63
63
  dependencies = [
64
- "numpy>=1.23.0,<=2.1.1", # OpenVINO and TFLite errors on '--slow' CI Tests https://github.com/ultralytics/ultralytics/pull/18943
64
+ "numpy>=1.23.0",
65
65
  "matplotlib>=3.3.0",
66
66
  "opencv-python>=4.6.0",
67
67
  "pillow>=7.1.2",
@@ -95,12 +95,11 @@ dev = [
95
95
  export = [
96
96
  "onnx>=1.12.0", # ONNX export
97
97
  "coremltools>=8.0; platform_system != 'Windows' and python_version <= '3.13'", # CoreML supported on macOS and Linux
98
- "scikit-learn>=1.3.2; platform_system != 'Windows' and python_version <= '3.12'", # CoreML k-means quantization
98
+ "scikit-learn>=1.3.2; platform_system != 'Windows' and python_version <= '3.13'", # CoreML k-means quantization
99
99
  "openvino>=2024.0.0", # OpenVINO export
100
100
  "tensorflow>=2.0.0", # TF bug https://github.com/ultralytics/ultralytics/issues/5161
101
101
  "tensorflowjs>=2.0.0", # TF.js export, automatically installs tensorflow
102
102
  "tensorstore>=0.1.63; platform_machine == 'aarch64' and python_version >= '3.9'", # for TF Raspberry Pi exports
103
- "keras", # not installed automatically by tensorflow>=2.16
104
103
  "h5py!=3.11.0; platform_machine == 'aarch64'", # fix h5py build issues due to missing aarch64 wheels in 3.11 release
105
104
  ]
106
105
  solutions = [
@@ -108,9 +107,9 @@ solutions = [
108
107
  "streamlit>=1.29.0,<1.44.0", # for live inference on web browser, i.e `yolo streamlit-predict`
109
108
  ]
110
109
  logging = [
111
- "comet", # https://docs.ultralytics.com/integrations/comet/
112
- "tensorboard>=2.13.0",
113
- "dvclive>=2.12.0",
110
+ "wandb", # https://docs.ultralytics.com/integrations/weights-biases/
111
+ "tensorboard", # https://docs.ultralytics.com/integrations/tensorboard/
112
+ "mlflow", # https://docs.ultralytics.com/integrations/mlflow/
114
113
  ]
115
114
  extra = [
116
115
  "hub-sdk>=0.0.12", # Ultralytics HUB
@@ -133,7 +132,8 @@ ultralytics = "ultralytics.cfg:entrypoint"
133
132
  # Tools settings -------------------------------------------------------------------------------------------------------
134
133
  [tool.setuptools] # configuration specific to the `setuptools` build backend.
135
134
  packages = { find = { where = ["."], include = ["ultralytics", "ultralytics.*"] } }
136
- package-data = { "ultralytics" = ["**/*.yaml", "**/*.sh"], "ultralytics.assets" = ["*.jpg"] }
135
+ # Tests included below for checking Conda builds in https://github.com/conda-forge/ultralytics-feedstock
136
+ package-data = { "ultralytics" = ["**/*.yaml", "**/*.sh", "../tests/*.py"], "ultralytics.assets" = ["*.jpg"] }
137
137
 
138
138
  [tool.setuptools.dynamic]
139
139
  version = { attr = "ultralytics.__version__" }
@@ -0,0 +1,22 @@
1
+ # Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
2
+
3
+ from ultralytics.utils import ASSETS, ROOT, WEIGHTS_DIR, checks
4
+
5
+ # Constants used in tests
6
+ MODEL = WEIGHTS_DIR / "path with spaces" / "yolo11n.pt" # test spaces in path
7
+ CFG = "yolo11n.yaml"
8
+ SOURCE = ASSETS / "bus.jpg"
9
+ SOURCES_LIST = [ASSETS / "bus.jpg", ASSETS, ASSETS / "*", ASSETS / "**/*.jpg"]
10
+ TMP = (ROOT / "../tests/tmp").resolve() # temp directory for test files
11
+ CUDA_IS_AVAILABLE = checks.cuda_is_available()
12
+ CUDA_DEVICE_COUNT = checks.cuda_device_count()
13
+
14
+ __all__ = (
15
+ "MODEL",
16
+ "CFG",
17
+ "SOURCE",
18
+ "SOURCES_LIST",
19
+ "TMP",
20
+ "CUDA_IS_AVAILABLE",
21
+ "CUDA_DEVICE_COUNT",
22
+ )
@@ -0,0 +1,83 @@
1
+ # Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
2
+
3
+ import shutil
4
+ from pathlib import Path
5
+
6
+ from tests import TMP
7
+
8
+
9
+ def pytest_addoption(parser):
10
+ """
11
+ Add custom command-line options to pytest.
12
+
13
+ Args:
14
+ parser (pytest.config.Parser): The pytest parser object for adding custom command-line options.
15
+
16
+ Returns:
17
+ (None)
18
+ """
19
+ parser.addoption("--slow", action="store_true", default=False, help="Run slow tests")
20
+
21
+
22
+ def pytest_collection_modifyitems(config, items):
23
+ """
24
+ Modify the list of test items to exclude tests marked as slow if the --slow option is not specified.
25
+
26
+ Args:
27
+ config (pytest.config.Config): The pytest configuration object that provides access to command-line options.
28
+ items (list): The list of collected pytest item objects to be modified based on the presence of --slow option.
29
+
30
+ Returns:
31
+ (None): The function modifies the 'items' list in place.
32
+ """
33
+ if not config.getoption("--slow"):
34
+ # Remove the item entirely from the list of test items if it's marked as 'slow'
35
+ items[:] = [item for item in items if "slow" not in item.keywords]
36
+
37
+
38
+ def pytest_sessionstart(session):
39
+ """
40
+ Initialize session configurations for pytest.
41
+
42
+ This function is automatically called by pytest after the 'Session' object has been created but before performing
43
+ test collection. It sets the initial seeds and prepares the temporary directory for the test session.
44
+
45
+ Args:
46
+ session (pytest.Session): The pytest session object.
47
+
48
+ Returns:
49
+ (None)
50
+ """
51
+ from ultralytics.utils.torch_utils import init_seeds
52
+
53
+ init_seeds()
54
+ shutil.rmtree(TMP, ignore_errors=True) # delete any existing tests/tmp directory
55
+ TMP.mkdir(parents=True, exist_ok=True) # create a new empty directory
56
+
57
+
58
+ def pytest_terminal_summary(terminalreporter, exitstatus, config):
59
+ """
60
+ Cleanup operations after pytest session.
61
+
62
+ This function is automatically called by pytest at the end of the entire test session. It removes certain files
63
+ and directories used during testing.
64
+
65
+ Args:
66
+ terminalreporter (pytest.terminal.TerminalReporter): The terminal reporter object used for terminal output.
67
+ exitstatus (int): The exit status of the test run.
68
+ config (pytest.config.Config): The pytest config object.
69
+
70
+ Returns:
71
+ (None)
72
+ """
73
+ from ultralytics.utils import WEIGHTS_DIR
74
+
75
+ # Remove files
76
+ models = [path for x in ["*.onnx", "*.torchscript"] for path in WEIGHTS_DIR.rglob(x)]
77
+ for file in ["decelera_portrait_min.mov", "bus.jpg", "yolo11n.onnx", "yolo11n.torchscript"] + models:
78
+ Path(file).unlink(missing_ok=True)
79
+
80
+ # Remove directories
81
+ models = [path for x in ["*.mlpackage", "*_openvino_model"] for path in WEIGHTS_DIR.rglob(x)]
82
+ for directory in [WEIGHTS_DIR / "path with spaces", TMP.parents[1] / ".pytest_cache", TMP] + models:
83
+ shutil.rmtree(directory, ignore_errors=True)
@@ -1,6 +1,6 @@
1
1
  # Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
2
2
 
3
- __version__ = "8.3.117"
3
+ __version__ = "8.3.119"
4
4
 
5
5
  import os
6
6
 
@@ -181,6 +181,7 @@ CFG_FRACTION_KEYS = frozenset(
181
181
  "bgr",
182
182
  "mosaic",
183
183
  "mixup",
184
+ "cutmix",
184
185
  "copy_paste",
185
186
  "conf",
186
187
  "iou",
@@ -114,6 +114,7 @@ fliplr: 0.5 # (float) image flip left-right (probability)
114
114
  bgr: 0.0 # (float) image channel BGR (probability)
115
115
  mosaic: 1.0 # (float) image mosaic (probability)
116
116
  mixup: 0.0 # (float) image mixup (probability)
117
+ cutmix: 0.0 # (float) image cutmix (probability)
117
118
  copy_paste: 0.0 # (float) segment copy-paste (probability)
118
119
  copy_paste_mode: "flip" # (str) the method to do copy_paste augmentation (flip, mixup)
119
120
  auto_augment: randaugment # (str) auto augmentation policy for classification (randaugment, autoaugment, augmix)
@@ -317,7 +317,7 @@ class Compose:
317
317
 
318
318
  class BaseMixTransform:
319
319
  """
320
- Base class for mix transformations like MixUp and Mosaic.
320
+ Base class for mix transformations like Cutmix, MixUp and Mosaic.
321
321
 
322
322
  This class provides a foundation for implementing mix transformations on datasets. It handles the
323
323
  probability-based application of transforms and manages the mixing of multiple images and labels.
@@ -348,7 +348,7 @@ class BaseMixTransform:
348
348
 
349
349
  def __init__(self, dataset, pre_transform=None, p=0.0) -> None:
350
350
  """
351
- Initializes the BaseMixTransform object for mix transformations like MixUp and Mosaic.
351
+ Initializes the BaseMixTransform object for mix transformations like CutMix, MixUp and Mosaic.
352
352
 
353
353
  This class serves as a base for implementing mix transformations in image processing pipelines.
354
354
 
@@ -368,7 +368,7 @@ class BaseMixTransform:
368
368
 
369
369
  def __call__(self, labels):
370
370
  """
371
- Applies pre-processing transforms and mixup/mosaic transforms to labels data.
371
+ Applies pre-processing transforms and cutmix/mixup/mosaic transforms to labels data.
372
372
 
373
373
  This method determines whether to apply the mix transform based on a probability factor. If applied, it
374
374
  selects additional images, applies pre-transforms if specified, and then performs the mix transform.
@@ -391,7 +391,7 @@ class BaseMixTransform:
391
391
  if isinstance(indexes, int):
392
392
  indexes = [indexes]
393
393
 
394
- # Get images information will be used for Mosaic or MixUp
394
+ # Get images information will be used for Mosaic, CutMix or MixUp
395
395
  mix_labels = [self.dataset.get_image_and_label(i) for i in indexes]
396
396
 
397
397
  if self.pre_transform is not None:
@@ -401,16 +401,16 @@ class BaseMixTransform:
401
401
 
402
402
  # Update cls and texts
403
403
  labels = self._update_label_text(labels)
404
- # Mosaic or MixUp
404
+ # Mosaic, CutMix or MixUp
405
405
  labels = self._mix_transform(labels)
406
406
  labels.pop("mix_labels", None)
407
407
  return labels
408
408
 
409
409
  def _mix_transform(self, labels):
410
410
  """
411
- Applies MixUp or Mosaic augmentation to the label dictionary.
411
+ Applies CutMix, MixUp or Mosaic augmentation to the label dictionary.
412
412
 
413
- This method should be implemented by subclasses to perform specific mix transformations like MixUp or
413
+ This method should be implemented by subclasses to perform specific mix transformations like CutMix, MixUp or
414
414
  Mosaic. It modifies the input label dictionary in-place with the augmented data.
415
415
 
416
416
  Args:
@@ -949,6 +949,117 @@ class MixUp(BaseMixTransform):
949
949
  return labels
950
950
 
951
951
 
952
+ class CutMix(BaseMixTransform):
953
+ """
954
+ Applies CutMix augmentation to image datasets as described in the paper https://arxiv.org/abs/1905.04899.
955
+
956
+ CutMix combines two images by replacing a random rectangular region of one image with the corresponding region from another image,
957
+ and adjusts the labels proportionally to the area of the mixed region.
958
+
959
+ Attributes:
960
+ dataset (Any): The dataset to which CutMix augmentation will be applied.
961
+ pre_transform (Callable | None): Optional transform to apply before CutMix.
962
+ p (float): Probability of applying CutMix augmentation.
963
+ beta (float): Beta distribution parameter for sampling the mixing ratio (default=1.0).
964
+
965
+ Methods:
966
+ get_indexes: Returns a random index from the dataset.
967
+ _mix_transform: Applies CutMix augmentation to the input labels.
968
+ _rand_bbox: Generates random bounding box coordinates for the cut region.
969
+
970
+ Examples:
971
+ >>> from ultralytics.data.augment import CutMix
972
+ >>> dataset = YourDataset(...) # Your image dataset
973
+ >>> cutmix = CutMix(dataset, p=0.5)
974
+ >>> augmented_labels = cutmix(original_labels)
975
+ """
976
+
977
+ def __init__(self, dataset, pre_transform=None, p=0.0, beta=1.0) -> None:
978
+ """
979
+ Initializes the CutMix augmentation object.
980
+
981
+ Args:
982
+ dataset (Any): The dataset to which CutMix augmentation will be applied.
983
+ pre_transform (Callable | None): Optional transform to apply before CutMix.
984
+ p (float): Probability of applying CutMix augmentation.
985
+ beta (float): Beta distribution parameter for sampling the mixing ratio (default=1.0).
986
+ """
987
+ super().__init__(dataset=dataset, pre_transform=pre_transform, p=p)
988
+ self.beta = beta
989
+
990
+ def get_indexes(self):
991
+ """
992
+ Get a random index from the dataset.
993
+
994
+ Returns:
995
+ (int): A random integer index within the range of the dataset length.
996
+ """
997
+ return random.randint(0, len(self.dataset) - 1)
998
+
999
+ def _rand_bbox(self, width, height, lam):
1000
+ """
1001
+ Generates random bounding box coordinates for the cut region.
1002
+
1003
+ Args:
1004
+ width (int): Width of the image.
1005
+ height (int): Height of the image.
1006
+ lam (float): Mixing ratio from the Beta distribution.
1007
+
1008
+ Returns:
1009
+ (tuple): (x1, y1, x2, y2) coordinates of the bounding box.
1010
+ """
1011
+ cut_ratio = np.sqrt(1.0 - lam)
1012
+ cut_w = int(width * cut_ratio)
1013
+ cut_h = int(height * cut_ratio)
1014
+
1015
+ # Random center
1016
+ cx = np.random.randint(width)
1017
+ cy = np.random.randint(height)
1018
+
1019
+ # Bounding box coordinates
1020
+ x1 = np.clip(cx - cut_w // 2, 0, width)
1021
+ y1 = np.clip(cy - cut_h // 2, 0, height)
1022
+ x2 = np.clip(cx + cut_w // 2, 0, width)
1023
+ y2 = np.clip(cy + cut_h // 2, 0, height)
1024
+
1025
+ return x1, y1, x2, y2
1026
+
1027
+ def _mix_transform(self, labels):
1028
+ """
1029
+ Applies CutMix augmentation to the input labels.
1030
+
1031
+ Args:
1032
+ labels (dict): A dictionary containing the original image and label information.
1033
+
1034
+ Returns:
1035
+ (dict): A dictionary containing the mixed image and adjusted labels.
1036
+
1037
+ Examples:
1038
+ >>> cutter = CutMix(dataset)
1039
+ >>> mixed_labels = cutter._mix_transform(labels)
1040
+ """
1041
+ # Sample mixing ratio from Beta distribution
1042
+ lam = np.random.beta(self.beta, self.beta)
1043
+
1044
+ # Get a random second image
1045
+ labels2 = labels["mix_labels"][0]
1046
+ img2 = labels2["img"]
1047
+ h, w = labels["img"].shape[:2]
1048
+
1049
+ # Generate random bounding box
1050
+ x1, y1, x2, y2 = self._rand_bbox(w, h, lam)
1051
+
1052
+ # Apply CutMix
1053
+ labels["img"][y1:y2, x1:x2] = img2[y1:y2, x1:x2]
1054
+
1055
+ # Adjust lambda to match the actual area ratio
1056
+ lam = 1 - ((x2 - x1) * (y2 - y1) / (w * h))
1057
+
1058
+ labels["cls"] = np.concatenate([labels["cls"], labels2["cls"]], axis=0)
1059
+ labels["instances"] = Instances.concatenate([labels["instances"], labels2["instances"]], axis=0)
1060
+ return labels
1061
+
1062
+
952
1063
  class RandomPerspective:
953
1064
  """
954
1065
  Implements random perspective and affine transformations on images and corresponding annotations.
@@ -1586,6 +1697,9 @@ class LetterBox:
1586
1697
 
1587
1698
  if shape[::-1] != new_unpad: # resize
1588
1699
  img = cv2.resize(img, new_unpad, interpolation=cv2.INTER_LINEAR)
1700
+ if img.ndim == 2:
1701
+ img = img[..., None]
1702
+
1589
1703
  top, bottom = int(round(dh - 0.1)) if self.center else 0, int(round(dh + 0.1))
1590
1704
  left, right = int(round(dw - 0.1)) if self.center else 0, int(round(dw + 0.1))
1591
1705
  h, w, c = img.shape
@@ -2442,6 +2556,7 @@ def v8_transforms(dataset, imgsz, hyp, stretch=False):
2442
2556
  [
2443
2557
  pre_transform,
2444
2558
  MixUp(dataset, pre_transform=pre_transform, p=hyp.mixup),
2559
+ CutMix(dataset, pre_transform=pre_transform, p=hyp.cutmix),
2445
2560
  Albumentations(p=1.0),
2446
2561
  RandomHSV(hgain=hyp.hsv_h, sgain=hyp.hsv_s, vgain=hyp.hsv_v),
2447
2562
  RandomFlip(direction="vertical", p=hyp.flipud),
@@ -33,6 +33,7 @@ class BaseDataset(Dataset):
33
33
  single_cls (bool): Whether to treat all objects as a single class.
34
34
  prefix (str): Prefix to print in log messages.
35
35
  fraction (float): Fraction of dataset to utilize.
36
+ cv2_flag (int): OpenCV flag for reading images.
36
37
  im_files (List[str]): List of image file paths.
37
38
  labels (List[Dict]): List of label data dictionaries.
38
39
  ni (int): Number of images in the dataset.
@@ -79,6 +80,7 @@ class BaseDataset(Dataset):
79
80
  single_cls=False,
80
81
  classes=None,
81
82
  fraction=1.0,
83
+ channels=3,
82
84
  ):
83
85
  """
84
86
  Initialize BaseDataset with given configuration and options.
@@ -97,6 +99,7 @@ class BaseDataset(Dataset):
97
99
  single_cls (bool, optional): If True, single class training is used.
98
100
  classes (list, optional): List of included classes.
99
101
  fraction (float, optional): Fraction of dataset to utilize.
102
+ channels (int, optional): Number of channels in the images (1 for grayscale, 3 for RGB).
100
103
  """
101
104
  super().__init__()
102
105
  self.img_path = img_path
@@ -105,6 +108,8 @@ class BaseDataset(Dataset):
105
108
  self.single_cls = single_cls
106
109
  self.prefix = prefix
107
110
  self.fraction = fraction
111
+ self.channels = channels
112
+ self.cv2_flag = cv2.IMREAD_GRAYSCALE if channels == 1 else cv2.IMREAD_COLOR
108
113
  self.im_files = self.get_img_files(self.img_path)
109
114
  self.labels = self.get_labels()
110
115
  self.update_labels(include_class=classes) # single_cls and include_class
@@ -224,9 +229,9 @@ class BaseDataset(Dataset):
224
229
  except Exception as e:
225
230
  LOGGER.warning(f"{self.prefix}Removing corrupt *.npy image file {fn} due to: {e}")
226
231
  Path(fn).unlink(missing_ok=True)
227
- im = imread(f) # BGR
232
+ im = imread(f, flags=self.cv2_flag) # BGR
228
233
  else: # read image
229
- im = imread(f) # BGR
234
+ im = imread(f, flags=self.cv2_flag) # BGR
230
235
  if im is None:
231
236
  raise FileNotFoundError(f"Image Not Found {f}")
232
237
 
@@ -238,6 +243,8 @@ class BaseDataset(Dataset):
238
243
  im = cv2.resize(im, (w, h), interpolation=cv2.INTER_LINEAR)
239
244
  elif not (h0 == w0 == self.imgsz): # resize by stretching image to square imgsz
240
245
  im = cv2.resize(im, (self.imgsz, self.imgsz), interpolation=cv2.INTER_LINEAR)
246
+ if im.ndim == 2:
247
+ im = im[..., None]
241
248
 
242
249
  # Add to buffer if training with augmentations
243
250
  if self.augment:
@@ -84,7 +84,7 @@ class YOLODataset(BaseDataset):
84
84
  self.use_obb = task == "obb"
85
85
  self.data = data
86
86
  assert not (self.use_segments and self.use_keypoints), "Can not use both segments and keypoints."
87
- super().__init__(*args, **kwargs)
87
+ super().__init__(*args, channels=self.data["channels"], **kwargs)
88
88
 
89
89
  def cache_labels(self, path=Path("./labels.cache")):
90
90
  """
@@ -215,6 +215,7 @@ class YOLODataset(BaseDataset):
215
215
  if self.augment:
216
216
  hyp.mosaic = hyp.mosaic if self.augment and not self.rect else 0.0
217
217
  hyp.mixup = hyp.mixup if self.augment and not self.rect else 0.0
218
+ hyp.cutmix = hyp.cutmix if self.augment and not self.rect else 0.0
218
219
  transforms = v8_transforms(self, self.imgsz, hyp)
219
220
  else:
220
221
  transforms = Compose([LetterBox(new_shape=(self.imgsz, self.imgsz), scaleup=False)])
@@ -235,14 +236,15 @@ class YOLODataset(BaseDataset):
235
236
 
236
237
  def close_mosaic(self, hyp):
237
238
  """
238
- Sets mosaic, copy_paste and mixup options to 0.0 and builds transformations.
239
+ Disable mosaic, copy_paste, mixup and cutmix augmentations by setting their probabilities to 0.0.
239
240
 
240
241
  Args:
241
242
  hyp (dict): Hyperparameters for transforms.
242
243
  """
243
- hyp.mosaic = 0.0 # set mosaic ratio=0.0
244
- hyp.copy_paste = 0.0 # keep the same behavior as previous v8 close-mosaic
245
- hyp.mixup = 0.0 # keep the same behavior as previous v8 close-mosaic
244
+ hyp.mosaic = 0.0
245
+ hyp.copy_paste = 0.0
246
+ hyp.mixup = 0.0
247
+ hyp.cutmix = 0.0
246
248
  self.transforms = self.build_transforms(hyp)
247
249
 
248
250
  def update_labels_info(self, label):