ultralytics 8.3.111__tar.gz → 8.3.112__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 (270) hide show
  1. {ultralytics-8.3.111/ultralytics.egg-info → ultralytics-8.3.112}/PKG-INFO +1 -1
  2. {ultralytics-8.3.111 → ultralytics-8.3.112}/tests/test_cli.py +5 -1
  3. {ultralytics-8.3.111 → ultralytics-8.3.112}/tests/test_integrations.py +1 -1
  4. {ultralytics-8.3.111 → ultralytics-8.3.112}/tests/test_python.py +24 -3
  5. {ultralytics-8.3.111 → ultralytics-8.3.112}/tests/test_solutions.py +9 -6
  6. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/__init__.py +1 -1
  7. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/__init__.py +14 -16
  8. ultralytics-8.3.112/ultralytics/cfg/datasets/coco8-multispectral.yaml +104 -0
  9. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/data/augment.py +16 -6
  10. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/data/base.py +24 -26
  11. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/data/converter.py +52 -3
  12. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/data/dataset.py +5 -5
  13. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/data/loaders.py +7 -9
  14. ultralytics-8.3.112/ultralytics/data/split.py +123 -0
  15. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/data/utils.py +34 -52
  16. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/engine/exporter.py +22 -24
  17. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/engine/model.py +3 -6
  18. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/engine/predictor.py +5 -3
  19. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/engine/results.py +7 -7
  20. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/engine/trainer.py +4 -5
  21. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/engine/tuner.py +1 -1
  22. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/engine/validator.py +4 -4
  23. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/hub/auth.py +1 -1
  24. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/hub/session.py +3 -3
  25. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/rtdetr/train.py +1 -22
  26. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/sam/modules/sam.py +2 -1
  27. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/yolo/classify/train.py +1 -1
  28. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/yolo/detect/train.py +2 -2
  29. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/yolo/detect/val.py +1 -1
  30. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/yolo/obb/train.py +1 -1
  31. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/yolo/pose/predict.py +1 -1
  32. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/yolo/pose/train.py +4 -2
  33. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/yolo/pose/val.py +1 -1
  34. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/yolo/segment/train.py +1 -1
  35. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/yolo/segment/val.py +1 -1
  36. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/yolo/world/train.py +1 -1
  37. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/yolo/world/train_world.py +1 -0
  38. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/yolo/yoloe/train.py +2 -2
  39. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/yolo/yoloe/train_seg.py +2 -2
  40. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/nn/autobackend.py +7 -4
  41. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/nn/tasks.py +11 -11
  42. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/solutions/instance_segmentation.py +1 -1
  43. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/solutions/object_blurrer.py +1 -1
  44. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/solutions/object_cropper.py +2 -2
  45. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/solutions/parking_management.py +1 -1
  46. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/solutions/security_alarm.py +1 -1
  47. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/solutions/solutions.py +3 -6
  48. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/trackers/byte_tracker.py +1 -1
  49. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/trackers/utils/gmc.py +4 -4
  50. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/utils/__init__.py +28 -21
  51. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/utils/autobatch.py +4 -4
  52. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/utils/benchmarks.py +8 -8
  53. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/utils/callbacks/clearml.py +1 -1
  54. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/utils/callbacks/comet.py +5 -5
  55. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/utils/callbacks/dvc.py +1 -1
  56. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/utils/callbacks/mlflow.py +2 -1
  57. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/utils/callbacks/neptune.py +1 -1
  58. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/utils/callbacks/tensorboard.py +7 -9
  59. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/utils/checks.py +20 -26
  60. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/utils/downloads.py +4 -4
  61. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/utils/export.py +1 -1
  62. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/utils/metrics.py +1 -1
  63. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/utils/ops.py +1 -1
  64. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/utils/patches.py +8 -1
  65. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/utils/plotting.py +27 -29
  66. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/utils/tal.py +1 -1
  67. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/utils/torch_utils.py +4 -4
  68. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/utils/tuner.py +2 -2
  69. {ultralytics-8.3.111 → ultralytics-8.3.112/ultralytics.egg-info}/PKG-INFO +1 -1
  70. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics.egg-info/SOURCES.txt +2 -0
  71. {ultralytics-8.3.111 → ultralytics-8.3.112}/LICENSE +0 -0
  72. {ultralytics-8.3.111 → ultralytics-8.3.112}/README.md +0 -0
  73. {ultralytics-8.3.111 → ultralytics-8.3.112}/pyproject.toml +0 -0
  74. {ultralytics-8.3.111 → ultralytics-8.3.112}/setup.cfg +0 -0
  75. {ultralytics-8.3.111 → ultralytics-8.3.112}/tests/test_cuda.py +0 -0
  76. {ultralytics-8.3.111 → ultralytics-8.3.112}/tests/test_engine.py +0 -0
  77. {ultralytics-8.3.111 → ultralytics-8.3.112}/tests/test_exports.py +0 -0
  78. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/assets/bus.jpg +0 -0
  79. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/assets/zidane.jpg +0 -0
  80. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
  81. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
  82. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
  83. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
  84. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
  85. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
  86. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
  87. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/datasets/VOC.yaml +0 -0
  88. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
  89. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
  90. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
  91. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
  92. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
  93. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/datasets/coco.yaml +0 -0
  94. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
  95. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/datasets/coco128.yaml +0 -0
  96. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
  97. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
  98. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/datasets/coco8.yaml +0 -0
  99. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
  100. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/datasets/dog-pose.yaml +0 -0
  101. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/datasets/dota8.yaml +0 -0
  102. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/datasets/hand-keypoints.yaml +0 -0
  103. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/datasets/lvis.yaml +0 -0
  104. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/datasets/medical-pills.yaml +0 -0
  105. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
  106. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
  107. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/datasets/signature.yaml +0 -0
  108. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
  109. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/datasets/xView.yaml +0 -0
  110. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/default.yaml +0 -0
  111. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/11/yolo11-cls-resnet18.yaml +0 -0
  112. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/11/yolo11-cls.yaml +0 -0
  113. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/11/yolo11-obb.yaml +0 -0
  114. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/11/yolo11-pose.yaml +0 -0
  115. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/11/yolo11-seg.yaml +0 -0
  116. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/11/yolo11.yaml +0 -0
  117. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/11/yoloe-11-seg.yaml +0 -0
  118. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/11/yoloe-11.yaml +0 -0
  119. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/12/yolo12-cls.yaml +0 -0
  120. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/12/yolo12-obb.yaml +0 -0
  121. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/12/yolo12-pose.yaml +0 -0
  122. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/12/yolo12-seg.yaml +0 -0
  123. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/12/yolo12.yaml +0 -0
  124. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
  125. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
  126. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
  127. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
  128. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/v10/yolov10b.yaml +0 -0
  129. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/v10/yolov10l.yaml +0 -0
  130. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/v10/yolov10m.yaml +0 -0
  131. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/v10/yolov10n.yaml +0 -0
  132. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/v10/yolov10s.yaml +0 -0
  133. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/v10/yolov10x.yaml +0 -0
  134. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
  135. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
  136. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
  137. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
  138. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
  139. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
  140. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/v8/yoloe-v8-seg.yaml +0 -0
  141. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/v8/yoloe-v8.yaml +0 -0
  142. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
  143. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
  144. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
  145. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
  146. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
  147. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
  148. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
  149. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
  150. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
  151. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
  152. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
  153. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
  154. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
  155. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
  156. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
  157. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
  158. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
  159. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
  160. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
  161. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
  162. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
  163. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/v9/yolov9m.yaml +0 -0
  164. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/v9/yolov9s.yaml +0 -0
  165. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/models/v9/yolov9t.yaml +0 -0
  166. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/solutions/default.yaml +0 -0
  167. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/trackers/botsort.yaml +0 -0
  168. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
  169. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/data/__init__.py +0 -0
  170. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/data/annotator.py +0 -0
  171. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/data/build.py +0 -0
  172. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/data/scripts/download_weights.sh +0 -0
  173. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/data/scripts/get_coco.sh +0 -0
  174. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/data/scripts/get_coco128.sh +0 -0
  175. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/data/scripts/get_imagenet.sh +0 -0
  176. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/data/split_dota.py +0 -0
  177. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/engine/__init__.py +0 -0
  178. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/hub/__init__.py +0 -0
  179. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/hub/google/__init__.py +0 -0
  180. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/hub/utils.py +0 -0
  181. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/__init__.py +0 -0
  182. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/fastsam/__init__.py +0 -0
  183. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/fastsam/model.py +0 -0
  184. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/fastsam/predict.py +0 -0
  185. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/fastsam/utils.py +0 -0
  186. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/fastsam/val.py +0 -0
  187. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/nas/__init__.py +0 -0
  188. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/nas/model.py +0 -0
  189. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/nas/predict.py +0 -0
  190. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/nas/val.py +0 -0
  191. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/rtdetr/__init__.py +0 -0
  192. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/rtdetr/model.py +0 -0
  193. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/rtdetr/predict.py +0 -0
  194. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/rtdetr/val.py +0 -0
  195. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/sam/__init__.py +0 -0
  196. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/sam/amg.py +0 -0
  197. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/sam/build.py +0 -0
  198. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/sam/model.py +0 -0
  199. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/sam/modules/__init__.py +0 -0
  200. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/sam/modules/blocks.py +0 -0
  201. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/sam/modules/decoders.py +0 -0
  202. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/sam/modules/encoders.py +0 -0
  203. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/sam/modules/memory_attention.py +0 -0
  204. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
  205. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/sam/modules/transformer.py +0 -0
  206. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/sam/modules/utils.py +0 -0
  207. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/sam/predict.py +0 -0
  208. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/utils/__init__.py +0 -0
  209. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/utils/loss.py +0 -0
  210. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/utils/ops.py +0 -0
  211. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/yolo/__init__.py +0 -0
  212. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/yolo/classify/__init__.py +0 -0
  213. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/yolo/classify/predict.py +0 -0
  214. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/yolo/classify/val.py +0 -0
  215. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/yolo/detect/__init__.py +0 -0
  216. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/yolo/detect/predict.py +0 -0
  217. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/yolo/model.py +0 -0
  218. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/yolo/obb/__init__.py +0 -0
  219. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/yolo/obb/predict.py +0 -0
  220. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/yolo/obb/val.py +0 -0
  221. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/yolo/pose/__init__.py +0 -0
  222. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/yolo/segment/__init__.py +0 -0
  223. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/yolo/segment/predict.py +0 -0
  224. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/yolo/world/__init__.py +0 -0
  225. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/yolo/yoloe/__init__.py +0 -0
  226. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/yolo/yoloe/predict.py +0 -0
  227. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/models/yolo/yoloe/val.py +0 -0
  228. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/nn/__init__.py +0 -0
  229. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/nn/modules/__init__.py +0 -0
  230. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/nn/modules/activation.py +0 -0
  231. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/nn/modules/block.py +0 -0
  232. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/nn/modules/conv.py +0 -0
  233. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/nn/modules/head.py +0 -0
  234. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/nn/modules/transformer.py +0 -0
  235. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/nn/modules/utils.py +0 -0
  236. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/nn/text_model.py +0 -0
  237. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/solutions/__init__.py +0 -0
  238. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/solutions/ai_gym.py +0 -0
  239. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/solutions/analytics.py +0 -0
  240. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/solutions/distance_calculation.py +0 -0
  241. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/solutions/heatmap.py +0 -0
  242. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/solutions/object_counter.py +0 -0
  243. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/solutions/queue_management.py +0 -0
  244. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/solutions/region_counter.py +0 -0
  245. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/solutions/speed_estimation.py +0 -0
  246. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/solutions/streamlit_inference.py +0 -0
  247. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/solutions/trackzone.py +0 -0
  248. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/solutions/vision_eye.py +0 -0
  249. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/trackers/__init__.py +0 -0
  250. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/trackers/basetrack.py +0 -0
  251. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/trackers/bot_sort.py +0 -0
  252. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/trackers/track.py +0 -0
  253. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/trackers/utils/__init__.py +0 -0
  254. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/trackers/utils/kalman_filter.py +0 -0
  255. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/trackers/utils/matching.py +0 -0
  256. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/utils/callbacks/__init__.py +0 -0
  257. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/utils/callbacks/base.py +0 -0
  258. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/utils/callbacks/hub.py +0 -0
  259. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/utils/callbacks/raytune.py +0 -0
  260. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/utils/callbacks/wb.py +0 -0
  261. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/utils/dist.py +0 -0
  262. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/utils/errors.py +0 -0
  263. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/utils/files.py +0 -0
  264. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/utils/instance.py +0 -0
  265. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/utils/loss.py +0 -0
  266. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics/utils/triton.py +0 -0
  267. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics.egg-info/dependency_links.txt +0 -0
  268. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics.egg-info/entry_points.txt +0 -0
  269. {ultralytics-8.3.111 → ultralytics-8.3.112}/ultralytics.egg-info/requires.txt +0 -0
  270. {ultralytics-8.3.111 → ultralytics-8.3.112}/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.111
3
+ Version: 8.3.112
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>
@@ -7,7 +7,7 @@ from PIL import Image
7
7
 
8
8
  from tests import CUDA_DEVICE_COUNT, CUDA_IS_AVAILABLE
9
9
  from ultralytics.cfg import TASK2DATA, TASK2MODEL, TASKS
10
- from ultralytics.utils import ASSETS, WEIGHTS_DIR, checks
10
+ from ultralytics.utils import ARM64, ASSETS, LINUX, WEIGHTS_DIR, checks
11
11
  from ultralytics.utils.torch_utils import TORCH_1_9
12
12
 
13
13
  # Constants
@@ -64,6 +64,10 @@ def test_rtdetr(task: str = "detect", model: str = "yolov8n-rtdetr.yaml", data:
64
64
 
65
65
 
66
66
  @pytest.mark.skipif(checks.IS_PYTHON_3_12, reason="MobileSAM with CLIP is not supported in Python 3.12")
67
+ @pytest.mark.skipif(
68
+ checks.IS_PYTHON_3_8 and LINUX and ARM64,
69
+ reason="MobileSAM with CLIP is not supported in Python 3.8 and aarch64 Linux",
70
+ )
67
71
  def test_fastsam(
68
72
  task: str = "segment", model: str = WEIGHTS_DIR / "FastSAM-s.pt", data: str = "coco8-seg.yaml"
69
73
  ) -> None:
@@ -16,7 +16,7 @@ from ultralytics.utils.checks import check_requirements
16
16
 
17
17
  @pytest.mark.slow
18
18
  def test_tensorboard():
19
- """Test training with MLflow tracking enabled (see https://mlflow.org/ for details)."""
19
+ """Test training with TensorBoard logging enabled."""
20
20
  SETTINGS["tensorboard"] = True
21
21
  YOLO("yolo11n-cls.yaml").train(data="imagenet10", imgsz=32, epochs=3, plots=False, device="cpu")
22
22
  SETTINGS["tensorboard"] = False
@@ -18,9 +18,11 @@ from ultralytics import RTDETR, YOLO
18
18
  from ultralytics.cfg import MODELS, TASK2DATA, TASKS
19
19
  from ultralytics.data.build import load_inference_source
20
20
  from ultralytics.utils import (
21
+ ARM64,
21
22
  ASSETS,
22
23
  DEFAULT_CFG,
23
24
  DEFAULT_CFG_PATH,
25
+ LINUX,
24
26
  LOGGER,
25
27
  ONLINE,
26
28
  ROOT,
@@ -170,7 +172,7 @@ def test_youtube():
170
172
  model.predict("https://youtu.be/G17sBkb38XQ", imgsz=96, save=True)
171
173
  # Handle internet connection errors and 'urllib.error.HTTPError: HTTP Error 429: Too Many Requests'
172
174
  except (urllib.error.HTTPError, ConnectionError) as e:
173
- LOGGER.warning(f"WARNING: YouTube Test Error: {e}")
175
+ LOGGER.error(f"YouTube Test Error: {e}")
174
176
 
175
177
 
176
178
  @pytest.mark.skipif(not ONLINE, reason="environment is offline")
@@ -276,7 +278,7 @@ def test_results(model):
276
278
  r.to_df(decimals=3)
277
279
  r.to_csv()
278
280
  r.to_xml()
279
- r.plot(pil=True)
281
+ r.plot(pil=True, save=True, filename=TMP / "results_plot_save.jpg")
280
282
  r.plot(conf=True, boxes=True)
281
283
  print(r, len(r), r.path) # print after methods
282
284
 
@@ -308,7 +310,8 @@ def test_labels_and_crops():
308
310
  @pytest.mark.skipif(not ONLINE, reason="environment is offline")
309
311
  def test_data_utils():
310
312
  """Test utility functions in ultralytics/data/utils.py, including dataset stats and auto-splitting."""
311
- from ultralytics.data.utils import HUBDatasetStats, autosplit
313
+ from ultralytics.data.split import autosplit
314
+ from ultralytics.data.utils import HUBDatasetStats
312
315
  from ultralytics.utils.downloads import zip_directory
313
316
 
314
317
  # from ultralytics.utils.files import WorkingDirectory
@@ -577,6 +580,10 @@ def test_model_embeddings():
577
580
 
578
581
 
579
582
  @pytest.mark.skipif(checks.IS_PYTHON_3_12, reason="YOLOWorld with CLIP is not supported in Python 3.12")
583
+ @pytest.mark.skipif(
584
+ checks.IS_PYTHON_3_8 and LINUX and ARM64,
585
+ reason="YOLOWorld with CLIP is not supported in Python 3.8 and aarch64 Linux",
586
+ )
580
587
  def test_yolo_world():
581
588
  """Test YOLO world models with CLIP support."""
582
589
  model = YOLO(WEIGHTS_DIR / "yolov8s-world.pt") # no YOLO11n-world model yet
@@ -609,6 +616,10 @@ def test_yolo_world():
609
616
 
610
617
 
611
618
  @pytest.mark.skipif(checks.IS_PYTHON_3_12 or not TORCH_1_9, reason="YOLOE with CLIP is not supported in Python 3.12")
619
+ @pytest.mark.skipif(
620
+ checks.IS_PYTHON_3_8 and LINUX and ARM64,
621
+ reason="YOLOE with CLIP is not supported in Python 3.8 and aarch64 Linux",
622
+ )
612
623
  def test_yoloe():
613
624
  """Test YOLOE models with MobileClip support."""
614
625
  # Predict
@@ -672,3 +683,13 @@ def test_yolov10():
672
683
  model.val(data="coco8.yaml", imgsz=32)
673
684
  model.predict(imgsz=32, save_txt=True, save_crop=True, augment=True)
674
685
  model(SOURCE)
686
+
687
+
688
+ def test_multichannel():
689
+ """Test YOLO model multi-channel training, validation, and prediction functionality."""
690
+ model = YOLO("yolo11n.pt")
691
+ model.train(data="coco8-multispectral.yaml", epochs=1, imgsz=32, close_mosaic=1, cache="disk")
692
+ model.val(data="coco8-multispectral.yaml")
693
+ im = np.zeros((32, 32, 10), dtype=np.uint8)
694
+ model.predict(source=im, imgsz=32, save_txt=True, save_crop=True, augment=True)
695
+ model.export(format="onnx")
@@ -164,10 +164,13 @@ def test_solution(name, solution_class, needs_frame_count, video, kwargs):
164
164
  if name == "ParkingManager":
165
165
  safe_download(url=f"{ASSETS_URL}/{PARKING_AREAS_JSON}", dir=TMP)
166
166
  safe_download(url=f"{ASSETS_URL}/{PARKING_MODEL}", dir=TMP)
167
- solution = solution_class(**kwargs)
167
+ elif name == "StreamlitInference":
168
+ if checks.check_imshow(): # do not merge with elif above
169
+ solution_class(**kwargs).inference() # requires interactive GUI environment
170
+ return
168
171
 
169
- if name == "StreamlitInference":
170
- if checks.check_imshow(): # requires interactive GUI environment
171
- solution.inference()
172
- else:
173
- process_video(solution, str(TMP / video), needs_frame_count)
172
+ process_video(
173
+ solution=solution_class(**kwargs),
174
+ video_path=str(TMP / video),
175
+ needs_frame_count=needs_frame_count,
176
+ )
@@ -1,6 +1,6 @@
1
1
  # Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
2
2
 
3
- __version__ = "8.3.111"
3
+ __version__ = "8.3.112"
4
4
 
5
5
  import os
6
6
 
@@ -315,7 +315,7 @@ def get_cfg(cfg: Union[str, Path, Dict, SimpleNamespace] = DEFAULT_CFG_DICT, ove
315
315
  cfg[k] = str(cfg[k])
316
316
  if cfg.get("name") == "model": # assign model to 'name' arg
317
317
  cfg["name"] = str(cfg.get("model", "")).split(".")[0]
318
- LOGGER.warning(f"WARNING ⚠️ 'name=model' automatically updated to 'name={cfg['name']}'.")
318
+ LOGGER.warning(f"'name=model' automatically updated to 'name={cfg['name']}'.")
319
319
 
320
320
  # Type and Value checks
321
321
  check_cfg(cfg)
@@ -570,9 +570,7 @@ def handle_yolo_hub(args: List[str]) -> None:
570
570
  or 'logout'. For 'login', an optional second argument can be the API key.
571
571
 
572
572
  Examples:
573
- ```bash
574
- yolo login YOUR_API_KEY
575
- ```
573
+ $ yolo login YOUR_API_KEY
576
574
 
577
575
  Notes:
578
576
  - The function imports the 'hub' module from ultralytics to perform login and logout operations.
@@ -625,10 +623,10 @@ def handle_yolo_settings(args: List[str]) -> None:
625
623
  check_dict_alignment(SETTINGS, new)
626
624
  SETTINGS.update(new)
627
625
 
628
- print(SETTINGS) # print the current settings
626
+ LOGGER.info(SETTINGS) # print the current settings
629
627
  LOGGER.info(f"💡 Learn more about Ultralytics Settings at {url}")
630
628
  except Exception as e:
631
- LOGGER.warning(f"WARNING ⚠️ settings error: '{e}'. Please see {url} for help.")
629
+ LOGGER.warning(f"settings error: '{e}'. Please see {url} for help.")
632
630
 
633
631
 
634
632
  def handle_yolo_solutions(args: List[str]) -> None:
@@ -687,7 +685,7 @@ def handle_yolo_solutions(args: List[str]) -> None:
687
685
 
688
686
  # Get solution name
689
687
  if not args:
690
- LOGGER.warning("⚠️ No solution name provided. i.e `yolo solutions count`. Defaulting to 'count'.")
688
+ LOGGER.warning("No solution name provided. i.e `yolo solutions count`. Defaulting to 'count'.")
691
689
  args = ["count"]
692
690
  if args[0] == "help":
693
691
  LOGGER.info(SOLUTIONS_HELP_MSG)
@@ -877,10 +875,10 @@ def entrypoint(debug: str = "") -> None:
877
875
  overrides = {} # basic overrides, i.e. imgsz=320
878
876
  for a in merge_equals_args(args): # merge spaces around '=' sign
879
877
  if a.startswith("--"):
880
- LOGGER.warning(f"WARNING ⚠️ argument '{a}' does not require leading dashes '--', updating to '{a[2:]}'.")
878
+ LOGGER.warning(f"argument '{a}' does not require leading dashes '--', updating to '{a[2:]}'.")
881
879
  a = a[2:]
882
880
  if a.endswith(","):
883
- LOGGER.warning(f"WARNING ⚠️ argument '{a}' does not require trailing comma ',', updating to '{a[:-1]}'.")
881
+ LOGGER.warning(f"argument '{a}' does not require trailing comma ',', updating to '{a[:-1]}'.")
884
882
  a = a[:-1]
885
883
  if "=" in a:
886
884
  try:
@@ -917,7 +915,7 @@ def entrypoint(debug: str = "") -> None:
917
915
  mode = overrides.get("mode")
918
916
  if mode is None:
919
917
  mode = DEFAULT_CFG.mode or "predict"
920
- LOGGER.warning(f"WARNING ⚠️ 'mode' argument is missing. Valid modes are {MODES}. Using default 'mode={mode}'.")
918
+ LOGGER.warning(f"'mode' argument is missing. Valid modes are {MODES}. Using default 'mode={mode}'.")
921
919
  elif mode not in MODES:
922
920
  raise ValueError(f"Invalid 'mode={mode}'. Valid modes are {MODES}.\n{CLI_HELP_MSG}")
923
921
 
@@ -927,7 +925,7 @@ def entrypoint(debug: str = "") -> None:
927
925
  if task not in TASKS:
928
926
  if task == "track":
929
927
  LOGGER.warning(
930
- "WARNING ⚠️ invalid 'task=track', setting 'task=detect' and 'mode=track'. Valid tasks are {TASKS}.\n{CLI_HELP_MSG}."
928
+ "invalid 'task=track', setting 'task=detect' and 'mode=track'. Valid tasks are {TASKS}.\n{CLI_HELP_MSG}."
931
929
  )
932
930
  task, mode = "detect", "track"
933
931
  else:
@@ -939,7 +937,7 @@ def entrypoint(debug: str = "") -> None:
939
937
  model = overrides.pop("model", DEFAULT_CFG.model)
940
938
  if model is None:
941
939
  model = "yolo11n.pt"
942
- LOGGER.warning(f"WARNING ⚠️ 'model' argument is missing. Using default 'model={model}'.")
940
+ LOGGER.warning(f"'model' argument is missing. Using default 'model={model}'.")
943
941
  overrides["model"] = model
944
942
  stem = Path(model).stem.lower()
945
943
  if "rtdetr" in stem: # guess architecture
@@ -965,7 +963,7 @@ def entrypoint(debug: str = "") -> None:
965
963
  if task != model.task:
966
964
  if task:
967
965
  LOGGER.warning(
968
- f"WARNING ⚠️ conflicting 'task={task}' passed with 'task={model.task}' model. "
966
+ f"conflicting 'task={task}' passed with 'task={model.task}' model. "
969
967
  f"Ignoring 'task={task}' and updating to 'task={model.task}' to match model."
970
968
  )
971
969
  task = model.task
@@ -975,15 +973,15 @@ def entrypoint(debug: str = "") -> None:
975
973
  overrides["source"] = (
976
974
  "https://ultralytics.com/images/boats.jpg" if task == "obb" else DEFAULT_CFG.source or ASSETS
977
975
  )
978
- LOGGER.warning(f"WARNING ⚠️ 'source' argument is missing. Using default 'source={overrides['source']}'.")
976
+ LOGGER.warning(f"'source' argument is missing. Using default 'source={overrides['source']}'.")
979
977
  elif mode in {"train", "val"}:
980
978
  if "data" not in overrides and "resume" not in overrides:
981
979
  overrides["data"] = DEFAULT_CFG.data or TASK2DATA.get(task or DEFAULT_CFG.task, DEFAULT_CFG.data)
982
- LOGGER.warning(f"WARNING ⚠️ 'data' argument is missing. Using default 'data={overrides['data']}'.")
980
+ LOGGER.warning(f"'data' argument is missing. Using default 'data={overrides['data']}'.")
983
981
  elif mode == "export":
984
982
  if "format" not in overrides:
985
983
  overrides["format"] = DEFAULT_CFG.format or "torchscript"
986
- LOGGER.warning(f"WARNING ⚠️ 'format' argument is missing. Using default 'format={overrides['format']}'.")
984
+ LOGGER.warning(f"'format' argument is missing. Using default 'format={overrides['format']}'.")
987
985
 
988
986
  # Run command in python
989
987
  getattr(model, mode)(**overrides) # default args from model
@@ -0,0 +1,104 @@
1
+ # Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
2
+
3
+ # COCO8-Multispectral dataset (COCO8 images interpolated across 10 channels in the visual spectrum) by Ultralytics
4
+ # Documentation: https://docs.ultralytics.com/datasets/detect/coco8-multispectral/
5
+ # Example usage: yolo train data=coco8-multispectral.yaml
6
+ # parent
7
+ # ├── ultralytics
8
+ # └── datasets
9
+ # └── coco8-multispectral ← downloads here (20.2 MB)
10
+
11
+ # Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
12
+ path: ../datasets/coco8-multispectral # dataset root dir
13
+ train: images/train # train images (relative to 'path') 4 images
14
+ val: images/val # val images (relative to 'path') 4 images
15
+ test: # test images (optional)
16
+
17
+ # Number of multispectral image channels
18
+ channels: 10
19
+
20
+ # Classes
21
+ names:
22
+ 0: person
23
+ 1: bicycle
24
+ 2: car
25
+ 3: motorcycle
26
+ 4: airplane
27
+ 5: bus
28
+ 6: train
29
+ 7: truck
30
+ 8: boat
31
+ 9: traffic light
32
+ 10: fire hydrant
33
+ 11: stop sign
34
+ 12: parking meter
35
+ 13: bench
36
+ 14: bird
37
+ 15: cat
38
+ 16: dog
39
+ 17: horse
40
+ 18: sheep
41
+ 19: cow
42
+ 20: elephant
43
+ 21: bear
44
+ 22: zebra
45
+ 23: giraffe
46
+ 24: backpack
47
+ 25: umbrella
48
+ 26: handbag
49
+ 27: tie
50
+ 28: suitcase
51
+ 29: frisbee
52
+ 30: skis
53
+ 31: snowboard
54
+ 32: sports ball
55
+ 33: kite
56
+ 34: baseball bat
57
+ 35: baseball glove
58
+ 36: skateboard
59
+ 37: surfboard
60
+ 38: tennis racket
61
+ 39: bottle
62
+ 40: wine glass
63
+ 41: cup
64
+ 42: fork
65
+ 43: knife
66
+ 44: spoon
67
+ 45: bowl
68
+ 46: banana
69
+ 47: apple
70
+ 48: sandwich
71
+ 49: orange
72
+ 50: broccoli
73
+ 51: carrot
74
+ 52: hot dog
75
+ 53: pizza
76
+ 54: donut
77
+ 55: cake
78
+ 56: chair
79
+ 57: couch
80
+ 58: potted plant
81
+ 59: bed
82
+ 60: dining table
83
+ 61: toilet
84
+ 62: tv
85
+ 63: laptop
86
+ 64: mouse
87
+ 65: remote
88
+ 66: keyboard
89
+ 67: cell phone
90
+ 68: microwave
91
+ 69: oven
92
+ 70: toaster
93
+ 71: sink
94
+ 72: refrigerator
95
+ 73: book
96
+ 74: clock
97
+ 75: vase
98
+ 76: scissors
99
+ 77: teddy bear
100
+ 78: hair drier
101
+ 79: toothbrush
102
+
103
+ # Download script/URL (optional)
104
+ download: https://github.com/ultralytics/assets/releases/download/v0.0.0/coco8-multispectral.zip
@@ -1364,8 +1364,10 @@ class RandomHSV:
1364
1364
  >>> hsv_augmenter(labels)
1365
1365
  >>> augmented_img = labels["img"]
1366
1366
  """
1367
+ img = labels["img"]
1368
+ if img.shape[-1] != 3: # only apply to RGB images
1369
+ return labels
1367
1370
  if self.hgain or self.sgain or self.vgain:
1368
- img = labels["img"]
1369
1371
  dtype = img.dtype # uint8
1370
1372
 
1371
1373
  r = np.random.uniform(-1, 1, 3) * [self.hgain, self.sgain, self.vgain] # random gains
@@ -1588,9 +1590,14 @@ class LetterBox:
1588
1590
  img = cv2.resize(img, new_unpad, interpolation=cv2.INTER_LINEAR)
1589
1591
  top, bottom = int(round(dh - 0.1)) if self.center else 0, int(round(dh + 0.1))
1590
1592
  left, right = int(round(dw - 0.1)) if self.center else 0, int(round(dw + 0.1))
1591
- img = cv2.copyMakeBorder(
1592
- img, top, bottom, left, right, cv2.BORDER_CONSTANT, value=(114, 114, 114)
1593
- ) # add border
1593
+ h, w, c = img.shape
1594
+ if c == 3:
1595
+ img = cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_CONSTANT, value=(114, 114, 114))
1596
+ else: # multispectral
1597
+ pad_img = np.full((h + top + bottom, w + left + right, c), fill_value=114, dtype=img.dtype)
1598
+ pad_img[top : top + h, left : left + w] = img
1599
+ img = pad_img
1600
+
1594
1601
  if labels.get("ratio_pad"):
1595
1602
  labels["ratio_pad"] = (labels["ratio_pad"], (left, top)) # for evaluation
1596
1603
 
@@ -1908,10 +1915,13 @@ class Albumentations:
1908
1915
  if self.transform is None or random.random() > self.p:
1909
1916
  return labels
1910
1917
 
1918
+ im = labels["img"]
1919
+ if im.shape[2] != 3: # Only apply Albumentation on 3-channel images
1920
+ return labels
1921
+
1911
1922
  if self.contains_spatial:
1912
1923
  cls = labels["cls"]
1913
1924
  if len(cls):
1914
- im = labels["img"]
1915
1925
  labels["instances"].convert_bbox("xywh")
1916
1926
  labels["instances"].normalize(*im.shape[:2][::-1])
1917
1927
  bboxes = labels["instances"].bboxes
@@ -2426,7 +2436,7 @@ def v8_transforms(dataset, imgsz, hyp, stretch=False):
2426
2436
  kpt_shape = dataset.data.get("kpt_shape", None)
2427
2437
  if len(flip_idx) == 0 and hyp.fliplr > 0.0:
2428
2438
  hyp.fliplr = 0.0
2429
- LOGGER.warning("WARNING ⚠️ No 'flip_idx' array defined in data.yaml, setting augmentation 'fliplr=0.0'")
2439
+ LOGGER.warning("No 'flip_idx' array defined in data.yaml, setting augmentation 'fliplr=0.0'")
2430
2440
  elif flip_idx and (len(flip_idx) != kpt_shape[0]):
2431
2441
  raise ValueError(f"data.yaml flip_idx={flip_idx} length must be equal to kpt_shape[0]={kpt_shape[0]}")
2432
2442
 
@@ -15,7 +15,7 @@ import psutil
15
15
  from torch.utils.data import Dataset
16
16
 
17
17
  from ultralytics.data.utils import FORMATS_HELP_MSG, HELP_URL, IMG_FORMATS, check_file_speeds
18
- from ultralytics.utils import DEFAULT_CFG, LOCAL_RANK, LOGGER, NUM_THREADS, TQDM
18
+ from ultralytics.utils import DEFAULT_CFG, LOCAL_RANK, LOGGER, NUM_THREADS, TQDM, imread
19
19
 
20
20
 
21
21
  class BaseDataset(Dataset):
@@ -127,7 +127,7 @@ class BaseDataset(Dataset):
127
127
  if self.cache == "ram" and self.check_cache_ram():
128
128
  if hyp.deterministic:
129
129
  LOGGER.warning(
130
- "WARNING ⚠️ cache='ram' may produce non-deterministic training results. "
130
+ "cache='ram' may produce non-deterministic training results. "
131
131
  "Consider cache='disk' as a deterministic alternative if your disk space allows."
132
132
  )
133
133
  self.cache_images()
@@ -221,11 +221,11 @@ class BaseDataset(Dataset):
221
221
  try:
222
222
  im = np.load(fn)
223
223
  except Exception as e:
224
- LOGGER.warning(f"{self.prefix}WARNING ⚠️ Removing corrupt *.npy image file {fn} due to: {e}")
224
+ LOGGER.warning(f"{self.prefix}Removing corrupt *.npy image file {fn} due to: {e}")
225
225
  Path(fn).unlink(missing_ok=True)
226
- im = cv2.imread(f) # BGR
226
+ im = imread(f) # BGR
227
227
  else: # read image
228
- im = cv2.imread(f) # BGR
228
+ im = imread(f) # BGR
229
229
  if im is None:
230
230
  raise FileNotFoundError(f"Image Not Found {f}")
231
231
 
@@ -271,7 +271,7 @@ class BaseDataset(Dataset):
271
271
  """Save an image as an *.npy file for faster loading."""
272
272
  f = self.npy_files[i]
273
273
  if not f.exists():
274
- np.save(f.as_posix(), cv2.imread(self.im_files[i]), allow_pickle=False)
274
+ np.save(f.as_posix(), imread(self.im_files[i]), allow_pickle=False)
275
275
 
276
276
  def check_cache_disk(self, safety_margin=0.5):
277
277
  """
@@ -289,22 +289,22 @@ class BaseDataset(Dataset):
289
289
  n = min(self.ni, 30) # extrapolate from 30 random images
290
290
  for _ in range(n):
291
291
  im_file = random.choice(self.im_files)
292
- im = cv2.imread(im_file)
292
+ im = imread(im_file)
293
293
  if im is None:
294
294
  continue
295
295
  b += im.nbytes
296
296
  if not os.access(Path(im_file).parent, os.W_OK):
297
297
  self.cache = None
298
- LOGGER.info(f"{self.prefix}Skipping caching images to disk, directory not writeable ⚠️")
298
+ LOGGER.warning(f"{self.prefix}Skipping caching images to disk, directory not writeable")
299
299
  return False
300
300
  disk_required = b * self.ni / n * (1 + safety_margin) # bytes required to cache dataset to disk
301
301
  total, used, free = shutil.disk_usage(Path(self.im_files[0]).parent)
302
302
  if disk_required > free:
303
303
  self.cache = None
304
- LOGGER.info(
304
+ LOGGER.warning(
305
305
  f"{self.prefix}{disk_required / gb:.1f}GB disk space required, "
306
306
  f"with {int(safety_margin * 100)}% safety margin but only "
307
- f"{free / gb:.1f}/{total / gb:.1f}GB free, not caching images to disk ⚠️"
307
+ f"{free / gb:.1f}/{total / gb:.1f}GB free, not caching images to disk"
308
308
  )
309
309
  return False
310
310
  return True
@@ -322,7 +322,7 @@ class BaseDataset(Dataset):
322
322
  b, gb = 0, 1 << 30 # bytes of cached images, bytes per gigabytes
323
323
  n = min(self.ni, 30) # extrapolate from 30 random images
324
324
  for _ in range(n):
325
- im = cv2.imread(random.choice(self.im_files)) # sample image
325
+ im = imread(random.choice(self.im_files)) # sample image
326
326
  if im is None:
327
327
  continue
328
328
  ratio = self.imgsz / max(im.shape[0], im.shape[1]) # max(h, w) # ratio
@@ -331,10 +331,10 @@ class BaseDataset(Dataset):
331
331
  mem = psutil.virtual_memory()
332
332
  if mem_required > mem.available:
333
333
  self.cache = None
334
- LOGGER.info(
334
+ LOGGER.warning(
335
335
  f"{self.prefix}{mem_required / gb:.1f}GB RAM required to cache images "
336
336
  f"with {int(safety_margin * 100)}% safety margin but only "
337
- f"{mem.available / gb:.1f}/{mem.total / gb:.1f}GB available, not caching images ⚠️"
337
+ f"{mem.available / gb:.1f}/{mem.total / gb:.1f}GB available, not caching images"
338
338
  )
339
339
  return False
340
340
  return True
@@ -415,19 +415,17 @@ class BaseDataset(Dataset):
415
415
  """
416
416
  Users can customize their own format here.
417
417
 
418
- Note:
418
+ Examples:
419
419
  Ensure output is a dictionary with the following keys:
420
- ```python
421
- dict(
422
- im_file=im_file,
423
- shape=shape, # format: (height, width)
424
- cls=cls,
425
- bboxes=bboxes, # xywh
426
- segments=segments, # xy
427
- keypoints=keypoints, # xy
428
- normalized=True, # or False
429
- bbox_format="xyxy", # or xywh, ltwh
430
- )
431
- ```
420
+ >>> dict(
421
+ ... im_file=im_file,
422
+ ... shape=shape, # format: (height, width)
423
+ ... cls=cls,
424
+ ... bboxes=bboxes, # xywh
425
+ ... segments=segments, # xy
426
+ ... keypoints=keypoints, # xy
427
+ ... normalized=True, # or False
428
+ ... bbox_format="xyxy", # or xywh, ltwh
429
+ ... )
432
430
  """
433
431
  raise NotImplementedError
@@ -12,7 +12,7 @@ import numpy as np
12
12
  from PIL import Image
13
13
 
14
14
  from ultralytics.utils import DATASETS_DIR, LOGGER, NUM_THREADS, TQDM
15
- from ultralytics.utils.downloads import download
15
+ from ultralytics.utils.downloads import download, zip_directory
16
16
  from ultralytics.utils.files import increment_path
17
17
 
18
18
 
@@ -698,6 +698,55 @@ def create_synthetic_coco_dataset():
698
698
  for _ in TQDM(as_completed(futures), total=len(futures), desc=f"Generating images for {subset}"):
699
699
  pass # The actual work is done in the background
700
700
  else:
701
- print(f"Warning: Labels file {label_list_file} does not exist. Skipping image creation for {subset}.")
701
+ LOGGER.warning(f"Labels file {label_list_file} does not exist. Skipping image creation for {subset}.")
702
702
 
703
- print("Synthetic COCO dataset created successfully.")
703
+ LOGGER.info("Synthetic COCO dataset created successfully.")
704
+
705
+
706
+ def convert_to_multispectral(path, n_channels=10, replace=False, zip=False):
707
+ """
708
+ Convert RGB images to multispectral images by interpolating across wavelength bands.
709
+
710
+ This function takes RGB images and interpolates them to create multispectral images with a specified number
711
+ of channels. It can process either a single image or a directory of images.
712
+
713
+ Args:
714
+ path (str | Path): Path to an image file or directory containing images to convert.
715
+ n_channels (int): Number of spectral channels to generate in the output image.
716
+ replace (bool): Whether to replace the original image file with the converted one.
717
+ zip (bool): Whether to zip the converted images into a zip file.
718
+
719
+ Examples:
720
+ >>> # Convert a single image
721
+ >>> convert_to_multispectral("path/to/image.jpg", n_channels=12)
722
+ """
723
+ from scipy.interpolate import interp1d
724
+
725
+ from ultralytics.data.utils import IMG_FORMATS
726
+
727
+ path = Path(path)
728
+ if path.is_dir():
729
+ # Process directory
730
+ im_files = sum([list(path.rglob(f"*.{ext}")) for ext in (IMG_FORMATS - {"tif", "tiff"})], [])
731
+ for im_path in im_files:
732
+ try:
733
+ convert_to_multispectral(im_path, n_channels)
734
+ if replace:
735
+ im_path.unlink()
736
+ except Exception as e:
737
+ LOGGER.info(f"Error converting {im_path}: {e}")
738
+
739
+ if zip:
740
+ zip_directory(path)
741
+ else:
742
+ # Process a single image
743
+ output_path = path.with_suffix(".tiff")
744
+ img = cv2.cvtColor(cv2.imread(str(path)), cv2.COLOR_BGR2RGB)
745
+
746
+ # Interpolate all pixels at once
747
+ rgb_wavelengths = np.array([650, 510, 475]) # R, G, B wavelengths (nm)
748
+ target_wavelengths = np.linspace(450, 700, n_channels)
749
+ f = interp1d(rgb_wavelengths.T, img, kind="linear", bounds_error=False, fill_value="extrapolate")
750
+ multispectral = f(target_wavelengths)
751
+ cv2.imwritemulti(str(output_path), np.clip(multispectral, 0, 255).astype(np.uint8).transpose(2, 0, 1))
752
+ LOGGER.info(f"Converted {output_path}")
@@ -148,7 +148,7 @@ class YOLODataset(BaseDataset):
148
148
  if msgs:
149
149
  LOGGER.info("\n".join(msgs))
150
150
  if nf == 0:
151
- LOGGER.warning(f"{self.prefix}WARNING ⚠️ No labels found in {path}. {HELP_URL}")
151
+ LOGGER.warning(f"{self.prefix}No labels found in {path}. {HELP_URL}")
152
152
  x["hash"] = get_hash(self.label_files + self.im_files)
153
153
  x["results"] = nf, nm, ne, nc, len(self.im_files)
154
154
  x["msgs"] = msgs # warnings
@@ -185,7 +185,7 @@ class YOLODataset(BaseDataset):
185
185
  [cache.pop(k) for k in ("hash", "version", "msgs")] # remove items
186
186
  labels = cache["labels"]
187
187
  if not labels:
188
- LOGGER.warning(f"WARNING ⚠️ No images found in {cache_path}, training may not work correctly. {HELP_URL}")
188
+ LOGGER.warning(f"No images found in {cache_path}, training may not work correctly. {HELP_URL}")
189
189
  self.im_files = [lb["im_file"] for lb in labels] # update im_files
190
190
 
191
191
  # Check if the dataset is all boxes or all segments
@@ -193,14 +193,14 @@ class YOLODataset(BaseDataset):
193
193
  len_cls, len_boxes, len_segments = (sum(x) for x in zip(*lengths))
194
194
  if len_segments and len_boxes != len_segments:
195
195
  LOGGER.warning(
196
- f"WARNING ⚠️ Box and segment counts should be equal, but got len(segments) = {len_segments}, "
196
+ f"Box and segment counts should be equal, but got len(segments) = {len_segments}, "
197
197
  f"len(boxes) = {len_boxes}. To resolve this only boxes will be used and all segments will be removed. "
198
198
  "To avoid this please supply either a detect or segment dataset, not a detect-segment mixed dataset."
199
199
  )
200
200
  for lb in labels:
201
201
  lb["segments"] = []
202
202
  if len_cls == 0:
203
- LOGGER.warning(f"WARNING ⚠️ No labels found in {cache_path}, training may not work correctly. {HELP_URL}")
203
+ LOGGER.warning(f"No labels found in {cache_path}, training may not work correctly. {HELP_URL}")
204
204
  return labels
205
205
 
206
206
  def build_transforms(self, hyp=None):
@@ -731,7 +731,7 @@ class ClassificationDataset:
731
731
  self.cache_ram = args.cache is True or str(args.cache).lower() == "ram" # cache images into RAM
732
732
  if self.cache_ram:
733
733
  LOGGER.warning(
734
- "WARNING ⚠️ Classification `cache_ram` training has known memory leak in "
734
+ "Classification `cache_ram` training has known memory leak in "
735
735
  "https://github.com/ultralytics/ultralytics/issues/9824, setting `cache_ram=False`."
736
736
  )
737
737
  self.cache_ram = False