ultralytics 8.3.119__tar.gz → 8.3.121__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.119/ultralytics.egg-info → ultralytics-8.3.121}/PKG-INFO +1 -1
  2. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/__init__.py +1 -1
  3. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/data/augment.py +33 -50
  4. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/data/dataset.py +1 -1
  5. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/engine/exporter.py +2 -0
  6. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/utils/loss.py +1 -1
  7. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/yolo/world/train_world.py +17 -5
  8. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/yolo/yoloe/__init__.py +2 -1
  9. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/yolo/yoloe/train.py +12 -113
  10. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/yolo/yoloe/train_seg.py +1 -17
  11. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/trackers/bot_sort.py +5 -5
  12. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/utils/downloads.py +2 -1
  13. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/utils/export.py +1 -1
  14. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/utils/loss.py +8 -6
  15. {ultralytics-8.3.119 → ultralytics-8.3.121/ultralytics.egg-info}/PKG-INFO +1 -1
  16. {ultralytics-8.3.119 → ultralytics-8.3.121}/LICENSE +0 -0
  17. {ultralytics-8.3.119 → ultralytics-8.3.121}/README.md +0 -0
  18. {ultralytics-8.3.119 → ultralytics-8.3.121}/pyproject.toml +0 -0
  19. {ultralytics-8.3.119 → ultralytics-8.3.121}/setup.cfg +0 -0
  20. {ultralytics-8.3.119 → ultralytics-8.3.121}/tests/__init__.py +0 -0
  21. {ultralytics-8.3.119 → ultralytics-8.3.121}/tests/conftest.py +0 -0
  22. {ultralytics-8.3.119 → ultralytics-8.3.121}/tests/test_cli.py +0 -0
  23. {ultralytics-8.3.119 → ultralytics-8.3.121}/tests/test_cuda.py +0 -0
  24. {ultralytics-8.3.119 → ultralytics-8.3.121}/tests/test_engine.py +0 -0
  25. {ultralytics-8.3.119 → ultralytics-8.3.121}/tests/test_exports.py +0 -0
  26. {ultralytics-8.3.119 → ultralytics-8.3.121}/tests/test_integrations.py +0 -0
  27. {ultralytics-8.3.119 → ultralytics-8.3.121}/tests/test_python.py +0 -0
  28. {ultralytics-8.3.119 → ultralytics-8.3.121}/tests/test_solutions.py +0 -0
  29. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/assets/bus.jpg +0 -0
  30. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/assets/zidane.jpg +0 -0
  31. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/__init__.py +0 -0
  32. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
  33. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
  34. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
  35. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
  36. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
  37. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
  38. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
  39. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/datasets/VOC.yaml +0 -0
  40. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
  41. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
  42. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
  43. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
  44. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
  45. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/datasets/coco.yaml +0 -0
  46. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
  47. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/datasets/coco128.yaml +0 -0
  48. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/datasets/coco8-multispectral.yaml +0 -0
  49. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
  50. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
  51. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/datasets/coco8.yaml +0 -0
  52. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
  53. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/datasets/dog-pose.yaml +0 -0
  54. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/datasets/dota8-multispectral.yaml +0 -0
  55. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/datasets/dota8.yaml +0 -0
  56. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/datasets/hand-keypoints.yaml +0 -0
  57. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/datasets/lvis.yaml +0 -0
  58. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/datasets/medical-pills.yaml +0 -0
  59. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
  60. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
  61. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/datasets/signature.yaml +0 -0
  62. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
  63. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/datasets/xView.yaml +0 -0
  64. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/default.yaml +0 -0
  65. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/11/yolo11-cls-resnet18.yaml +0 -0
  66. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/11/yolo11-cls.yaml +0 -0
  67. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/11/yolo11-obb.yaml +0 -0
  68. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/11/yolo11-pose.yaml +0 -0
  69. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/11/yolo11-seg.yaml +0 -0
  70. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/11/yolo11.yaml +0 -0
  71. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/11/yoloe-11-seg.yaml +0 -0
  72. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/11/yoloe-11.yaml +0 -0
  73. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/12/yolo12-cls.yaml +0 -0
  74. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/12/yolo12-obb.yaml +0 -0
  75. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/12/yolo12-pose.yaml +0 -0
  76. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/12/yolo12-seg.yaml +0 -0
  77. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/12/yolo12.yaml +0 -0
  78. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
  79. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
  80. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
  81. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
  82. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/v10/yolov10b.yaml +0 -0
  83. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/v10/yolov10l.yaml +0 -0
  84. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/v10/yolov10m.yaml +0 -0
  85. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/v10/yolov10n.yaml +0 -0
  86. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/v10/yolov10s.yaml +0 -0
  87. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/v10/yolov10x.yaml +0 -0
  88. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
  89. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
  90. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
  91. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
  92. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
  93. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
  94. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/v8/yoloe-v8-seg.yaml +0 -0
  95. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/v8/yoloe-v8.yaml +0 -0
  96. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
  97. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
  98. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
  99. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
  100. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
  101. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
  102. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
  103. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
  104. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
  105. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
  106. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
  107. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
  108. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
  109. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
  110. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
  111. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
  112. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
  113. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
  114. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
  115. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
  116. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
  117. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/v9/yolov9m.yaml +0 -0
  118. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/v9/yolov9s.yaml +0 -0
  119. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/models/v9/yolov9t.yaml +0 -0
  120. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/solutions/default.yaml +0 -0
  121. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/trackers/botsort.yaml +0 -0
  122. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
  123. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/data/__init__.py +0 -0
  124. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/data/annotator.py +0 -0
  125. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/data/base.py +0 -0
  126. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/data/build.py +0 -0
  127. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/data/converter.py +0 -0
  128. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/data/loaders.py +0 -0
  129. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/data/scripts/download_weights.sh +0 -0
  130. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/data/scripts/get_coco.sh +0 -0
  131. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/data/scripts/get_coco128.sh +0 -0
  132. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/data/scripts/get_imagenet.sh +0 -0
  133. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/data/split.py +0 -0
  134. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/data/split_dota.py +0 -0
  135. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/data/utils.py +0 -0
  136. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/engine/__init__.py +0 -0
  137. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/engine/model.py +0 -0
  138. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/engine/predictor.py +0 -0
  139. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/engine/results.py +0 -0
  140. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/engine/trainer.py +0 -0
  141. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/engine/tuner.py +0 -0
  142. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/engine/validator.py +0 -0
  143. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/hub/__init__.py +0 -0
  144. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/hub/auth.py +0 -0
  145. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/hub/google/__init__.py +0 -0
  146. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/hub/session.py +0 -0
  147. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/hub/utils.py +0 -0
  148. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/__init__.py +0 -0
  149. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/fastsam/__init__.py +0 -0
  150. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/fastsam/model.py +0 -0
  151. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/fastsam/predict.py +0 -0
  152. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/fastsam/utils.py +0 -0
  153. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/fastsam/val.py +0 -0
  154. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/nas/__init__.py +0 -0
  155. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/nas/model.py +0 -0
  156. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/nas/predict.py +0 -0
  157. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/nas/val.py +0 -0
  158. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/rtdetr/__init__.py +0 -0
  159. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/rtdetr/model.py +0 -0
  160. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/rtdetr/predict.py +0 -0
  161. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/rtdetr/train.py +0 -0
  162. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/rtdetr/val.py +0 -0
  163. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/sam/__init__.py +0 -0
  164. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/sam/amg.py +0 -0
  165. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/sam/build.py +0 -0
  166. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/sam/model.py +0 -0
  167. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/sam/modules/__init__.py +0 -0
  168. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/sam/modules/blocks.py +0 -0
  169. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/sam/modules/decoders.py +0 -0
  170. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/sam/modules/encoders.py +0 -0
  171. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/sam/modules/memory_attention.py +0 -0
  172. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/sam/modules/sam.py +0 -0
  173. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
  174. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/sam/modules/transformer.py +0 -0
  175. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/sam/modules/utils.py +0 -0
  176. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/sam/predict.py +0 -0
  177. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/utils/__init__.py +0 -0
  178. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/utils/ops.py +0 -0
  179. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/yolo/__init__.py +0 -0
  180. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/yolo/classify/__init__.py +0 -0
  181. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/yolo/classify/predict.py +0 -0
  182. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/yolo/classify/train.py +0 -0
  183. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/yolo/classify/val.py +0 -0
  184. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/yolo/detect/__init__.py +0 -0
  185. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/yolo/detect/predict.py +0 -0
  186. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/yolo/detect/train.py +0 -0
  187. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/yolo/detect/val.py +0 -0
  188. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/yolo/model.py +0 -0
  189. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/yolo/obb/__init__.py +0 -0
  190. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/yolo/obb/predict.py +0 -0
  191. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/yolo/obb/train.py +0 -0
  192. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/yolo/obb/val.py +0 -0
  193. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/yolo/pose/__init__.py +0 -0
  194. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/yolo/pose/predict.py +0 -0
  195. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/yolo/pose/train.py +0 -0
  196. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/yolo/pose/val.py +0 -0
  197. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/yolo/segment/__init__.py +0 -0
  198. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/yolo/segment/predict.py +0 -0
  199. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/yolo/segment/train.py +0 -0
  200. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/yolo/segment/val.py +0 -0
  201. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/yolo/world/__init__.py +0 -0
  202. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/yolo/world/train.py +0 -0
  203. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/yolo/yoloe/predict.py +0 -0
  204. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/models/yolo/yoloe/val.py +0 -0
  205. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/nn/__init__.py +0 -0
  206. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/nn/autobackend.py +0 -0
  207. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/nn/modules/__init__.py +0 -0
  208. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/nn/modules/activation.py +0 -0
  209. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/nn/modules/block.py +0 -0
  210. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/nn/modules/conv.py +0 -0
  211. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/nn/modules/head.py +0 -0
  212. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/nn/modules/transformer.py +0 -0
  213. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/nn/modules/utils.py +0 -0
  214. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/nn/tasks.py +0 -0
  215. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/nn/text_model.py +0 -0
  216. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/solutions/__init__.py +0 -0
  217. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/solutions/ai_gym.py +0 -0
  218. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/solutions/analytics.py +0 -0
  219. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/solutions/distance_calculation.py +0 -0
  220. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/solutions/heatmap.py +0 -0
  221. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/solutions/instance_segmentation.py +0 -0
  222. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/solutions/object_blurrer.py +0 -0
  223. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/solutions/object_counter.py +0 -0
  224. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/solutions/object_cropper.py +0 -0
  225. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/solutions/parking_management.py +0 -0
  226. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/solutions/queue_management.py +0 -0
  227. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/solutions/region_counter.py +0 -0
  228. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/solutions/security_alarm.py +0 -0
  229. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/solutions/solutions.py +0 -0
  230. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/solutions/speed_estimation.py +0 -0
  231. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/solutions/streamlit_inference.py +0 -0
  232. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/solutions/trackzone.py +0 -0
  233. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/solutions/vision_eye.py +0 -0
  234. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/trackers/__init__.py +0 -0
  235. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/trackers/basetrack.py +0 -0
  236. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/trackers/byte_tracker.py +0 -0
  237. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/trackers/track.py +0 -0
  238. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/trackers/utils/__init__.py +0 -0
  239. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/trackers/utils/gmc.py +0 -0
  240. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/trackers/utils/kalman_filter.py +0 -0
  241. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/trackers/utils/matching.py +0 -0
  242. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/utils/__init__.py +0 -0
  243. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/utils/autobatch.py +0 -0
  244. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/utils/benchmarks.py +0 -0
  245. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/utils/callbacks/__init__.py +0 -0
  246. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/utils/callbacks/base.py +0 -0
  247. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/utils/callbacks/clearml.py +0 -0
  248. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/utils/callbacks/comet.py +0 -0
  249. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/utils/callbacks/dvc.py +0 -0
  250. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/utils/callbacks/hub.py +0 -0
  251. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/utils/callbacks/mlflow.py +0 -0
  252. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/utils/callbacks/neptune.py +0 -0
  253. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/utils/callbacks/raytune.py +0 -0
  254. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/utils/callbacks/tensorboard.py +0 -0
  255. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/utils/callbacks/wb.py +0 -0
  256. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/utils/checks.py +0 -0
  257. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/utils/dist.py +0 -0
  258. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/utils/errors.py +0 -0
  259. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/utils/files.py +0 -0
  260. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/utils/instance.py +0 -0
  261. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/utils/metrics.py +0 -0
  262. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/utils/ops.py +0 -0
  263. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/utils/patches.py +0 -0
  264. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/utils/plotting.py +0 -0
  265. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/utils/tal.py +0 -0
  266. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/utils/torch_utils.py +0 -0
  267. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/utils/triton.py +0 -0
  268. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics/utils/tuner.py +0 -0
  269. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics.egg-info/SOURCES.txt +0 -0
  270. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics.egg-info/dependency_links.txt +0 -0
  271. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics.egg-info/entry_points.txt +0 -0
  272. {ultralytics-8.3.119 → ultralytics-8.3.121}/ultralytics.egg-info/requires.txt +0 -0
  273. {ultralytics-8.3.119 → ultralytics-8.3.121}/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.119
3
+ Version: 8.3.121
4
4
  Summary: Ultralytics YOLO 🚀 for SOTA object detection, multi-object tracking, instance segmentation, pose estimation and image classification.
5
5
  Author-email: Glenn Jocher <glenn.jocher@ultralytics.com>, Jing Qiu <jing.qiu@ultralytics.com>
6
6
  Maintainer-email: Ultralytics <hello@ultralytics.com>
@@ -1,6 +1,6 @@
1
1
  # Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
2
2
 
3
- __version__ = "8.3.119"
3
+ __version__ = "8.3.121"
4
4
 
5
5
  import os
6
6
 
@@ -439,7 +439,7 @@ class BaseMixTransform:
439
439
  >>> indexes = transform.get_indexes()
440
440
  >>> print(indexes) # [3, 18, 7, 2]
441
441
  """
442
- raise NotImplementedError
442
+ return random.randint(0, len(self.dataset) - 1)
443
443
 
444
444
  @staticmethod
445
445
  def _update_label_text(labels):
@@ -877,7 +877,6 @@ class MixUp(BaseMixTransform):
877
877
  p (float): Probability of applying MixUp augmentation.
878
878
 
879
879
  Methods:
880
- get_indexes: Returns a random index from the dataset.
881
880
  _mix_transform: Applies MixUp augmentation to the input labels.
882
881
 
883
882
  Examples:
@@ -906,24 +905,6 @@ class MixUp(BaseMixTransform):
906
905
  """
907
906
  super().__init__(dataset=dataset, pre_transform=pre_transform, p=p)
908
907
 
909
- def get_indexes(self):
910
- """
911
- Get a random index from the dataset.
912
-
913
- This method returns a single random index from the dataset, which is used to select an image for MixUp
914
- augmentation.
915
-
916
- Returns:
917
- (int): A random integer index within the range of the dataset length.
918
-
919
- Examples:
920
- >>> mixup = MixUp(dataset)
921
- >>> index = mixup.get_indexes()
922
- >>> print(index)
923
- 42
924
- """
925
- return random.randint(0, len(self.dataset) - 1)
926
-
927
908
  def _mix_transform(self, labels):
928
909
  """
929
910
  Applies MixUp augmentation to the input labels.
@@ -961,9 +942,9 @@ class CutMix(BaseMixTransform):
961
942
  pre_transform (Callable | None): Optional transform to apply before CutMix.
962
943
  p (float): Probability of applying CutMix augmentation.
963
944
  beta (float): Beta distribution parameter for sampling the mixing ratio (default=1.0).
945
+ num_areas (int): Number of areas to try to cut and mix (default=3).
964
946
 
965
947
  Methods:
966
- get_indexes: Returns a random index from the dataset.
967
948
  _mix_transform: Applies CutMix augmentation to the input labels.
968
949
  _rand_bbox: Generates random bounding box coordinates for the cut region.
969
950
 
@@ -974,7 +955,7 @@ class CutMix(BaseMixTransform):
974
955
  >>> augmented_labels = cutmix(original_labels)
975
956
  """
976
957
 
977
- def __init__(self, dataset, pre_transform=None, p=0.0, beta=1.0) -> None:
958
+ def __init__(self, dataset, pre_transform=None, p=0.0, beta=1.0, num_areas=3) -> None:
978
959
  """
979
960
  Initializes the CutMix augmentation object.
980
961
 
@@ -983,31 +964,26 @@ class CutMix(BaseMixTransform):
983
964
  pre_transform (Callable | None): Optional transform to apply before CutMix.
984
965
  p (float): Probability of applying CutMix augmentation.
985
966
  beta (float): Beta distribution parameter for sampling the mixing ratio (default=1.0).
967
+ num_areas (int): Number of areas to try to cut and mix (default=3).
986
968
  """
987
969
  super().__init__(dataset=dataset, pre_transform=pre_transform, p=p)
988
970
  self.beta = beta
971
+ self.num_areas = num_areas
989
972
 
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):
973
+ def _rand_bbox(self, width, height):
1000
974
  """
1001
975
  Generates random bounding box coordinates for the cut region.
1002
976
 
1003
977
  Args:
1004
978
  width (int): Width of the image.
1005
979
  height (int): Height of the image.
1006
- lam (float): Mixing ratio from the Beta distribution.
1007
980
 
1008
981
  Returns:
1009
982
  (tuple): (x1, y1, x2, y2) coordinates of the bounding box.
1010
983
  """
984
+ # Sample mixing ratio from Beta distribution
985
+ lam = np.random.beta(self.beta, self.beta)
986
+
1011
987
  cut_ratio = np.sqrt(1.0 - lam)
1012
988
  cut_w = int(width * cut_ratio)
1013
989
  cut_h = int(height * cut_ratio)
@@ -1038,25 +1014,37 @@ class CutMix(BaseMixTransform):
1038
1014
  >>> cutter = CutMix(dataset)
1039
1015
  >>> mixed_labels = cutter._mix_transform(labels)
1040
1016
  """
1041
- # Sample mixing ratio from Beta distribution
1042
- lam = np.random.beta(self.beta, self.beta)
1043
-
1044
1017
  # Get a random second image
1045
- labels2 = labels["mix_labels"][0]
1046
- img2 = labels2["img"]
1047
1018
  h, w = labels["img"].shape[:2]
1048
1019
 
1049
- # Generate random bounding box
1050
- x1, y1, x2, y2 = self._rand_bbox(w, h, lam)
1020
+ cut_areas = np.asarray([self._rand_bbox(w, h) for _ in range(self.num_areas)], dtype=np.float32)
1021
+ ioa1 = bbox_ioa(cut_areas, labels["instances"].bboxes) # (self.num_areas, num_boxes)
1022
+ idx = np.nonzero(ioa1.sum(axis=1) <= 0)[0]
1023
+ if len(idx) == 0:
1024
+ return labels
1025
+
1026
+ labels2 = labels.pop("mix_labels")[0]
1027
+ area = cut_areas[np.random.choice(idx)] # randomle select one
1028
+ ioa2 = bbox_ioa(area[None], labels2["instances"].bboxes).squeeze(0)
1029
+ indexes2 = np.nonzero(ioa2 >= (0.01 if len(labels["instances"].segments) else 0.1))[0]
1030
+ if len(indexes2) == 0:
1031
+ return labels
1032
+
1033
+ instances2 = labels2["instances"][indexes2]
1034
+ instances2.convert_bbox("xyxy")
1035
+ instances2.denormalize(w, h)
1051
1036
 
1052
1037
  # Apply CutMix
1053
- labels["img"][y1:y2, x1:x2] = img2[y1:y2, x1:x2]
1038
+ x1, y1, x2, y2 = area.astype(np.int32)
1039
+ labels["img"][y1:y2, x1:x2] = labels2["img"][y1:y2, x1:x2]
1054
1040
 
1055
- # Adjust lambda to match the actual area ratio
1056
- lam = 1 - ((x2 - x1) * (y2 - y1) / (w * h))
1041
+ # Restrain instances2 to the random bounding border
1042
+ instances2.add_padding(-x1, -y1)
1043
+ instances2.clip(x2 - x1, y2 - y1)
1044
+ instances2.add_padding(x1, y1)
1057
1045
 
1058
- labels["cls"] = np.concatenate([labels["cls"], labels2["cls"]], axis=0)
1059
- labels["instances"] = Instances.concatenate([labels["instances"], labels2["instances"]], axis=0)
1046
+ labels["cls"] = np.concatenate([labels["cls"], labels2["cls"][indexes2]], axis=0)
1047
+ labels["instances"] = Instances.concatenate([labels["instances"], instances2], axis=0)
1060
1048
  return labels
1061
1049
 
1062
1050
 
@@ -1766,7 +1754,6 @@ class CopyPaste(BaseMixTransform):
1766
1754
  p (float): Probability of applying Copy-Paste augmentation.
1767
1755
 
1768
1756
  Methods:
1769
- get_indexes: Returns a random index from the dataset.
1770
1757
  _mix_transform: Applies Copy-Paste augmentation to the input labels.
1771
1758
  __call__: Applies the Copy-Paste transformation to images and annotations.
1772
1759
 
@@ -1783,10 +1770,6 @@ class CopyPaste(BaseMixTransform):
1783
1770
  assert mode in {"flip", "mixup"}, f"Expected `mode` to be `flip` or `mixup`, but got {mode}."
1784
1771
  self.mode = mode
1785
1772
 
1786
- def get_indexes(self):
1787
- """Returns a list of random indexes from the dataset for CopyPaste augmentation."""
1788
- return random.randint(0, len(self.dataset) - 1)
1789
-
1790
1773
  def _mix_transform(self, labels):
1791
1774
  """Applies Copy-Paste augmentation to combine objects from another image into the current image."""
1792
1775
  labels2 = labels["mix_labels"][0]
@@ -443,7 +443,7 @@ class GroundingDataset(YOLODataset):
443
443
  """
444
444
  assert task in {"detect", "segment"}, "GroundingDataset currently only supports `detect` and `segment` tasks"
445
445
  self.json_file = json_file
446
- super().__init__(*args, task=task, data={}, **kwargs)
446
+ super().__init__(*args, task=task, data={"channels": 3}, **kwargs)
447
447
 
448
448
  def get_img_files(self, img_path):
449
449
  """
@@ -636,6 +636,8 @@ class Exporter:
636
636
  if self.args.int8:
637
637
  fq = str(self.file).replace(self.file.suffix, f"_int8_openvino_model{os.sep}")
638
638
  fq_ov = str(Path(fq) / self.file.with_suffix(".xml").name)
639
+ # INT8 requires nncf, nncf requires packaging>=23.2 https://github.com/openvinotoolkit/nncf/issues/3463
640
+ check_requirements("packaging>=23.2") # must be installed first to build nncf wheel
639
641
  check_requirements("nncf>=2.14.0")
640
642
  import nncf
641
643
 
@@ -58,7 +58,7 @@ class DETRLoss(nn.Module):
58
58
  use_uni_match (bool): Whether to use fixed layer for auxiliary branch label assignment.
59
59
  uni_match_ind (int): Index of fixed layer for uni_match.
60
60
  gamma (float): The focusing parameter that controls how much the loss focuses on hard-to-classify examples.
61
- alpha (float): The balancing factor used to address class imbalance.
61
+ alpha (float | list): The balancing factor used to address class imbalance.
62
62
  """
63
63
  super().__init__()
64
64
 
@@ -3,7 +3,7 @@
3
3
  from ultralytics.data import YOLOConcatDataset, build_grounding, build_yolo_dataset
4
4
  from ultralytics.data.utils import check_det_dataset
5
5
  from ultralytics.models.yolo.world import WorldTrainer
6
- from ultralytics.utils import DEFAULT_CFG
6
+ from ultralytics.utils import DEFAULT_CFG, LOGGER
7
7
  from ultralytics.utils.torch_utils import de_parallel
8
8
 
9
9
 
@@ -93,14 +93,14 @@ class WorldTrainerFromScratch(WorldTrainer):
93
93
  """
94
94
  gs = max(int(de_parallel(self.model).stride.max() if self.model else 0), 32)
95
95
  if mode != "train":
96
- return build_yolo_dataset(self.args, img_path, batch, self.data, mode=mode, rect=mode == "val", stride=gs)
97
- dataset = [
98
- build_yolo_dataset(self.args, im_path, batch, self.data, stride=gs, multi_modal=True)
96
+ return build_yolo_dataset(self.args, img_path, batch, self.data, mode=mode, rect=False, stride=gs)
97
+ datasets = [
98
+ build_yolo_dataset(self.args, im_path, batch, self.training_data[im_path], stride=gs, multi_modal=True)
99
99
  if isinstance(im_path, str)
100
100
  else build_grounding(self.args, im_path["img_path"], im_path["json_file"], batch, stride=gs)
101
101
  for im_path in img_path
102
102
  ]
103
- return YOLOConcatDataset(dataset) if len(dataset) > 1 else dataset[0]
103
+ return YOLOConcatDataset(datasets) if len(datasets) > 1 else datasets[0]
104
104
 
105
105
  def get_dataset(self):
106
106
  """
@@ -140,8 +140,20 @@ class WorldTrainerFromScratch(WorldTrainer):
140
140
  # NOTE: to make training work properly, set `nc` and `names`
141
141
  final_data["nc"] = data["val"][0]["nc"]
142
142
  final_data["names"] = data["val"][0]["names"]
143
+ # NOTE: add path with lvis path
144
+ final_data["path"] = data["val"][0]["path"]
143
145
  final_data["channels"] = data["val"][0]["channels"]
144
146
  self.data = final_data
147
+ if self.args.single_cls: # consistent with base trainer
148
+ LOGGER.info("Overriding class names with single class.")
149
+ self.data["names"] = {0: "object"}
150
+ self.data["nc"] = 1
151
+ self.training_data = {}
152
+ for d in data["train"]:
153
+ if self.args.single_cls:
154
+ d["names"] = {0: "object"}
155
+ d["nc"] = 1
156
+ self.training_data[d["train"]] = d
145
157
  return final_data["train"], final_data["val"][0]
146
158
 
147
159
  def plot_training_labels(self):
@@ -1,7 +1,7 @@
1
1
  # Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
2
2
 
3
3
  from .predict import YOLOEVPDetectPredictor, YOLOEVPSegPredictor
4
- from .train import YOLOEPEFreeTrainer, YOLOEPETrainer, YOLOETrainer, YOLOEVPTrainer
4
+ from .train import YOLOEPEFreeTrainer, YOLOEPETrainer, YOLOETrainer, YOLOETrainerFromScratch, YOLOEVPTrainer
5
5
  from .train_seg import YOLOEPESegTrainer, YOLOESegTrainer, YOLOESegTrainerFromScratch, YOLOESegVPTrainer
6
6
  from .val import YOLOEDetectValidator, YOLOESegValidator
7
7
 
@@ -18,4 +18,5 @@ __all__ = [
18
18
  "YOLOEPEFreeTrainer",
19
19
  "YOLOEVPDetectPredictor",
20
20
  "YOLOEVPSegPredictor",
21
+ "YOLOETrainerFromScratch",
21
22
  ]
@@ -6,14 +6,14 @@ from pathlib import Path
6
6
 
7
7
  import torch
8
8
 
9
- from ultralytics.data import YOLOConcatDataset, build_grounding, build_yolo_dataset
9
+ from ultralytics.data import YOLOConcatDataset, build_yolo_dataset
10
10
  from ultralytics.data.augment import LoadVisualPrompt
11
- from ultralytics.data.utils import check_det_dataset
12
11
  from ultralytics.models.yolo.detect import DetectionTrainer, DetectionValidator
13
12
  from ultralytics.nn.tasks import YOLOEModel
14
13
  from ultralytics.utils import DEFAULT_CFG, LOGGER, RANK
15
14
  from ultralytics.utils.torch_utils import de_parallel
16
15
 
16
+ from ..world.train_world import WorldTrainerFromScratch
17
17
  from .val import YOLOEDetectValidator
18
18
 
19
19
 
@@ -92,11 +92,6 @@ class YOLOETrainer(DetectionTrainer):
92
92
  self.args, img_path, batch, self.data, mode=mode, rect=mode == "val", stride=gs, multi_modal=mode == "train"
93
93
  )
94
94
 
95
- def preprocess_batch(self, batch):
96
- """Process batch for training, moving text features to the appropriate device."""
97
- batch = super().preprocess_batch(batch)
98
- return batch
99
-
100
95
 
101
96
  class YOLOEPETrainer(DetectionTrainer):
102
97
  """Fine-tune YOLOE model in linear probing way."""
@@ -144,30 +139,9 @@ class YOLOEPETrainer(DetectionTrainer):
144
139
  return model
145
140
 
146
141
 
147
- class YOLOETrainerFromScratch(YOLOETrainer):
142
+ class YOLOETrainerFromScratch(YOLOETrainer, WorldTrainerFromScratch):
148
143
  """Train YOLOE models from scratch."""
149
144
 
150
- def __init__(self, cfg=DEFAULT_CFG, overrides=None, _callbacks=None):
151
- """
152
- Initialize the YOLOETrainerFromScratch class.
153
-
154
- This class extends YOLOETrainer to train YOLOE models from scratch. It inherits all functionality from
155
- the parent class while providing specialized initialization for training without pre-trained weights.
156
-
157
- Args:
158
- cfg (dict, optional): Configuration dictionary with training parameters. Defaults to DEFAULT_CFG.
159
- overrides (dict, optional): Dictionary of parameter overrides for configuration.
160
- _callbacks (list, optional): List of callback functions to be executed during training.
161
-
162
- Examples:
163
- >>> from ultralytics.models.yoloe.train import YOLOETrainerFromScratch
164
- >>> trainer = YOLOETrainerFromScratch()
165
- >>> trainer.train()
166
- """
167
- if overrides is None:
168
- overrides = {}
169
- super().__init__(cfg, overrides, _callbacks)
170
-
171
145
  def build_dataset(self, img_path, mode="train", batch=None):
172
146
  """
173
147
  Build YOLO Dataset for training or validation.
@@ -183,17 +157,12 @@ class YOLOETrainerFromScratch(YOLOETrainer):
183
157
  Returns:
184
158
  (YOLOConcatDataset | Dataset): The constructed dataset for training or validation.
185
159
  """
186
- gs = max(int(de_parallel(self.model).stride.max() if self.model else 0), 32)
187
- if mode != "train":
188
- return build_yolo_dataset(self.args, img_path, batch, self.data, mode=mode, rect=False, stride=gs)
189
- datasets = [
190
- build_yolo_dataset(self.args, im_path, batch, self.training_data[im_path], stride=gs, multi_modal=True)
191
- if isinstance(im_path, str)
192
- else build_grounding(self.args, im_path["img_path"], im_path["json_file"], batch, stride=gs)
193
- for im_path in img_path
194
- ]
195
- self.set_text_embeddings(datasets, batch) # cache text embeddings to accelerate training
196
- return YOLOConcatDataset(datasets) if len(datasets) > 1 else datasets[0]
160
+ datasets = WorldTrainerFromScratch.build_dataset(self, img_path, mode, batch)
161
+ if mode == "train":
162
+ self.set_text_embeddings(
163
+ datasets.datasets if hasattr(datasets, "datasets") else [datasets], batch
164
+ ) # cache text embeddings to accelerate training
165
+ return datasets
197
166
 
198
167
  def set_text_embeddings(self, datasets, batch):
199
168
  """
@@ -225,7 +194,7 @@ class YOLOETrainerFromScratch(YOLOETrainer):
225
194
 
226
195
  def preprocess_batch(self, batch):
227
196
  """Process batch for training, moving text features to the appropriate device."""
228
- batch = super().preprocess_batch(batch)
197
+ batch = DetectionTrainer.preprocess_batch(self, batch)
229
198
 
230
199
  texts = list(itertools.chain(*batch["texts"]))
231
200
  txt_feats = torch.stack([self.text_embeddings[text] for text in texts]).to(self.device)
@@ -246,6 +215,7 @@ class YOLOETrainerFromScratch(YOLOETrainer):
246
215
  (dict): Dictionary mapping text samples to their embeddings.
247
216
  """
248
217
  if cache_path.exists():
218
+ LOGGER.info(f"Reading existed cache from '{cache_path}'")
249
219
  return torch.load(cache_path)
250
220
  assert self.model is not None
251
221
  txt_feats = self.model.get_text_pe(texts, batch, without_reprta=True)
@@ -253,77 +223,6 @@ class YOLOETrainerFromScratch(YOLOETrainer):
253
223
  torch.save(txt_map, cache_path)
254
224
  return txt_map
255
225
 
256
- def get_dataset(self):
257
- """
258
- Get train and validation paths from data dictionary.
259
-
260
- Processes the data configuration to extract paths for training and validation datasets,
261
- handling both YOLO detection datasets and grounding datasets.
262
-
263
- Returns:
264
- (str): Train dataset path.
265
- (str): Validation dataset path.
266
-
267
- Raises:
268
- AssertionError: If train or validation datasets are not found, or if validation has multiple datasets.
269
- """
270
- final_data = {}
271
- data_yaml = self.args.data
272
- assert data_yaml.get("train", False), "train dataset not found" # object365.yaml
273
- assert data_yaml.get("val", False), "validation dataset not found" # lvis.yaml
274
- data = {k: [check_det_dataset(d) for d in v.get("yolo_data", [])] for k, v in data_yaml.items()}
275
- assert len(data["val"]) == 1, f"Only support validating on 1 dataset for now, but got {len(data['val'])}."
276
- val_split = "minival" if "lvis" in data["val"][0]["val"] else "val"
277
- for d in data["val"]:
278
- if d.get("minival") is None: # for lvis dataset
279
- continue
280
- d["minival"] = str(d["path"] / d["minival"])
281
- for s in ["train", "val"]:
282
- final_data[s] = [d["train" if s == "train" else val_split] for d in data[s]]
283
- # save grounding data if there's one
284
- grounding_data = data_yaml[s].get("grounding_data")
285
- if grounding_data is None:
286
- continue
287
- grounding_data = grounding_data if isinstance(grounding_data, list) else [grounding_data]
288
- for g in grounding_data:
289
- assert isinstance(g, dict), f"Grounding data should be provided in dict format, but got {type(g)}"
290
- final_data[s] += grounding_data
291
- # NOTE: to make training work properly, set `nc` and `names`
292
- final_data["nc"] = data["val"][0]["nc"]
293
- final_data["names"] = data["val"][0]["names"]
294
- # NOTE: add path with lvis path
295
- final_data["path"] = data["val"][0]["path"]
296
- self.data = final_data
297
- if self.args.single_cls: # consistent with base trainer
298
- LOGGER.info("Overriding class names with single class.")
299
- self.data["names"] = {0: "object"}
300
- self.data["nc"] = 1
301
- self.training_data = {}
302
- for d in data["train"]:
303
- if self.args.single_cls:
304
- d["names"] = {0: "object"}
305
- d["nc"] = 1
306
- self.training_data[d["train"]] = d
307
- return final_data["train"], final_data["val"][0]
308
-
309
- def plot_training_labels(self):
310
- """Do not plot labels for YOLO-World training."""
311
- pass
312
-
313
- def final_eval(self):
314
- """
315
- Perform final evaluation on the validation dataset.
316
-
317
- Configures the validator with the appropriate dataset and split before running evaluation.
318
-
319
- Returns:
320
- (dict): Evaluation metrics.
321
- """
322
- val = self.args.data["val"]["yolo_data"][0]
323
- self.validator.args.data = val
324
- self.validator.args.split = "minival" if isinstance(val, str) and "lvis" in val else "val"
325
- return super().final_eval()
326
-
327
226
 
328
227
  class YOLOEPEFreeTrainer(YOLOEPETrainer, YOLOETrainerFromScratch):
329
228
  """Train prompt-free YOLOE model."""
@@ -337,7 +236,7 @@ class YOLOEPEFreeTrainer(YOLOEPETrainer, YOLOETrainerFromScratch):
337
236
 
338
237
  def preprocess_batch(self, batch):
339
238
  """Preprocesses a batch of images for YOLOE training, adjusting formatting and dimensions as needed."""
340
- batch = super(YOLOETrainer, self).preprocess_batch(batch)
239
+ batch = DetectionTrainer.preprocess_batch(self, batch)
341
240
  return batch
342
241
 
343
242
  def set_text_embeddings(self, datasets, batch):
@@ -5,7 +5,7 @@ from copy import copy, deepcopy
5
5
 
6
6
  from ultralytics.models.yolo.segment import SegmentationTrainer
7
7
  from ultralytics.nn.tasks import YOLOESegModel
8
- from ultralytics.utils import DEFAULT_CFG, RANK
8
+ from ultralytics.utils import RANK
9
9
 
10
10
  from .train import YOLOETrainer, YOLOETrainerFromScratch, YOLOEVPTrainer
11
11
  from .val import YOLOESegValidator
@@ -24,22 +24,6 @@ class YOLOESegTrainer(YOLOETrainer, SegmentationTrainer):
24
24
  _callbacks (list): List of callback functions for training events.
25
25
  """
26
26
 
27
- def __init__(self, cfg=DEFAULT_CFG, overrides=None, _callbacks=None):
28
- """
29
- Initialize the YOLOESegTrainer class.
30
-
31
- This class combines YOLOETrainer and SegmentationTrainer to provide training functionality
32
- specifically for YOLOE segmentation models.
33
-
34
- Args:
35
- cfg (Dict): Configuration dictionary with training parameters.
36
- overrides (Dict, optional): Dictionary with parameter overrides.
37
- _callbacks (List, optional): List of callback functions for training events.
38
- """
39
- if overrides is None:
40
- overrides = {}
41
- super().__init__(cfg, overrides, _callbacks)
42
-
43
27
  def get_model(self, cfg=None, weights=None, verbose=True):
44
28
  """
45
29
  Return YOLOESegModel initialized with specified config and weights.
@@ -17,7 +17,7 @@ from .utils.kalman_filter import KalmanFilterXYWH
17
17
 
18
18
  class BOTrack(STrack):
19
19
  """
20
- An extended version of the STrack class for YOLOv8, adding object tracking features.
20
+ An extended version of the STrack class for YOLO, adding object tracking features.
21
21
 
22
22
  This class extends the STrack class to include additional functionalities for object tracking, such as feature
23
23
  smoothing, Kalman filter prediction, and reactivation of tracks.
@@ -150,7 +150,7 @@ class BOTrack(STrack):
150
150
 
151
151
  class BOTSORT(BYTETracker):
152
152
  """
153
- An extended version of the BYTETracker class for YOLOv8, designed for object tracking with ReID and GMC algorithm.
153
+ An extended version of the BYTETracker class for YOLO, designed for object tracking with ReID and GMC algorithm.
154
154
 
155
155
  Attributes:
156
156
  proximity_thresh (float): Threshold for spatial proximity (IoU) between tracks and detections.
@@ -163,7 +163,7 @@ class BOTSORT(BYTETracker):
163
163
  get_kalmanfilter: Return an instance of KalmanFilterXYWH for object tracking.
164
164
  init_track: Initialize track with detections, scores, and classes.
165
165
  get_dists: Get distances between tracks and detections using IoU and (optionally) ReID.
166
- multi_predict: Predict and track multiple objects with YOLOv8 model.
166
+ multi_predict: Predict and track multiple objects with a YOLO model.
167
167
  reset: Reset the BOTSORT tracker to its initial state.
168
168
 
169
169
  Examples:
@@ -173,7 +173,7 @@ class BOTSORT(BYTETracker):
173
173
  >>> bot_sort.multi_predict(tracks)
174
174
 
175
175
  Note:
176
- The class is designed to work with the YOLOv8 object detection model and supports ReID only if enabled via args.
176
+ The class is designed to work with a YOLO object detection model and supports ReID only if enabled via args.
177
177
  """
178
178
 
179
179
  def __init__(self, args, frame_rate=30):
@@ -197,7 +197,7 @@ class BOTSORT(BYTETracker):
197
197
  self.appearance_thresh = args.appearance_thresh
198
198
  self.encoder = (
199
199
  (lambda feats, s: [f.cpu().numpy() for f in feats]) # native features do not require any model
200
- if self.args.model == "auto"
200
+ if args.with_reid and self.args.model == "auto"
201
201
  else ReID(args.model)
202
202
  if args.with_reid
203
203
  else None
@@ -320,9 +320,10 @@ def safe_download(
320
320
  LOGGER.info(f"{desc}...")
321
321
  f.parent.mkdir(parents=True, exist_ok=True) # make directory if missing
322
322
  check_disk_space(url, path=f.parent)
323
+ curl_installed = shutil.which("curl")
323
324
  for i in range(retry + 1):
324
325
  try:
325
- if curl or i > 0: # curl download with retry, continue
326
+ if (curl or i > 0) and curl_installed: # curl download with retry, continue
326
327
  s = "sS" * (not progress) # silent
327
328
  r = subprocess.run(["curl", "-#", f"-{s}L", url, "-o", f, "--retry", "3", "-C", "-"]).returncode
328
329
  assert r == 0, f"Curl return value {r}"
@@ -167,7 +167,7 @@ def export_engine(
167
167
  trt.IInt8Calibrator.__init__(self)
168
168
  self.dataset = dataset
169
169
  self.data_iter = iter(dataset)
170
- self.algo = trt.CalibrationAlgoType.ENTROPY_CALIBRATION_2
170
+ self.algo = trt.CalibrationAlgoType.MINMAX_CALIBRATION
171
171
  self.batch = dataset.batch_size
172
172
  self.cache = Path(cache)
173
173
 
@@ -48,14 +48,14 @@ class FocalLoss(nn.Module):
48
48
 
49
49
  Args:
50
50
  gamma (float): The focusing parameter that controls how much the loss focuses on hard-to-classify examples.
51
- alpha (float): The balancing factor used to address class imbalance.
51
+ alpha (float | list): The balancing factor used to address class imbalance.
52
52
  """
53
53
 
54
54
  def __init__(self, gamma=1.5, alpha=0.25):
55
55
  """Initialize FocalLoss class with no parameters."""
56
56
  super().__init__()
57
57
  self.gamma = gamma
58
- self.alpha = alpha
58
+ self.alpha = torch.tensor(alpha)
59
59
 
60
60
  def forward(self, pred, label):
61
61
  """Calculate focal loss with modulating factors for class imbalance."""
@@ -68,7 +68,8 @@ class FocalLoss(nn.Module):
68
68
  p_t = label * pred_prob + (1 - label) * (1 - pred_prob)
69
69
  modulating_factor = (1.0 - p_t) ** self.gamma
70
70
  loss *= modulating_factor
71
- if self.alpha > 0:
71
+ if (self.alpha > 0).any():
72
+ self.alpha = self.alpha.to(device=pred.device, dtype=pred.dtype)
72
73
  alpha_factor = label * self.alpha + (1 - label) * (1 - self.alpha)
73
74
  loss *= alpha_factor
74
75
  return loss.mean(1).sum()
@@ -794,15 +795,16 @@ class TVPSegmentLoss(TVPDetectLoss):
794
795
 
795
796
  def __init__(self, model):
796
797
  """Initialize TVPSegmentLoss with task-prompt and visual-prompt criteria using the provided model."""
798
+ super().__init__(model)
797
799
  self.vp_criterion = v8SegmentationLoss(model)
798
800
 
799
801
  def __call__(self, preds, batch):
800
802
  """Calculate the loss for text-visual prompt segmentation."""
801
803
  feats, pred_masks, proto = preds if len(preds) == 3 else preds[1]
802
- assert self.tp_criterion.reg_max == self.vp_criterion.reg_max
804
+ assert self.ori_reg_max == self.vp_criterion.reg_max # TODO: remove it
803
805
 
804
- if self.tp_criterion.reg_max * 4 + self.tp_criterion.nc == feats[0].shape[1]:
805
- loss = torch.zeros(4, device=self.tp_criterion.device, requires_grad=True)
806
+ if self.ori_reg_max * 4 + self.ori_nc == feats[0].shape[1]:
807
+ loss = torch.zeros(4, device=self.vp_criterion.device, requires_grad=True)
806
808
  return loss, loss.detach()
807
809
 
808
810
  vp_feats = self._get_vp_features(feats)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ultralytics
3
- Version: 8.3.119
3
+ Version: 8.3.121
4
4
  Summary: Ultralytics YOLO 🚀 for SOTA object detection, multi-object tracking, instance segmentation, pose estimation and image classification.
5
5
  Author-email: Glenn Jocher <glenn.jocher@ultralytics.com>, Jing Qiu <jing.qiu@ultralytics.com>
6
6
  Maintainer-email: Ultralytics <hello@ultralytics.com>
File without changes
File without changes
File without changes