ultralytics 8.3.205__tar.gz → 8.3.207__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (288) hide show
  1. {ultralytics-8.3.205 → ultralytics-8.3.207}/PKG-INFO +1 -1
  2. {ultralytics-8.3.205 → ultralytics-8.3.207}/tests/test_exports.py +5 -2
  3. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/__init__.py +6 -1
  4. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/engine/exporter.py +38 -17
  5. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/nn/autobackend.py +7 -3
  6. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/utils/downloads.py +2 -2
  7. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/utils/plotting.py +13 -1
  8. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics.egg-info/PKG-INFO +1 -1
  9. {ultralytics-8.3.205 → ultralytics-8.3.207}/LICENSE +0 -0
  10. {ultralytics-8.3.205 → ultralytics-8.3.207}/README.md +0 -0
  11. {ultralytics-8.3.205 → ultralytics-8.3.207}/pyproject.toml +0 -0
  12. {ultralytics-8.3.205 → ultralytics-8.3.207}/setup.cfg +0 -0
  13. {ultralytics-8.3.205 → ultralytics-8.3.207}/tests/__init__.py +0 -0
  14. {ultralytics-8.3.205 → ultralytics-8.3.207}/tests/conftest.py +0 -0
  15. {ultralytics-8.3.205 → ultralytics-8.3.207}/tests/test_cli.py +0 -0
  16. {ultralytics-8.3.205 → ultralytics-8.3.207}/tests/test_cuda.py +0 -0
  17. {ultralytics-8.3.205 → ultralytics-8.3.207}/tests/test_engine.py +0 -0
  18. {ultralytics-8.3.205 → ultralytics-8.3.207}/tests/test_integrations.py +0 -0
  19. {ultralytics-8.3.205 → ultralytics-8.3.207}/tests/test_python.py +0 -0
  20. {ultralytics-8.3.205 → ultralytics-8.3.207}/tests/test_solutions.py +0 -0
  21. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/assets/bus.jpg +0 -0
  22. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/assets/zidane.jpg +0 -0
  23. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/__init__.py +0 -0
  24. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
  25. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
  26. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
  27. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
  28. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/datasets/HomeObjects-3K.yaml +0 -0
  29. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
  30. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
  31. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
  32. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/datasets/VOC.yaml +0 -0
  33. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
  34. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
  35. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
  36. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
  37. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
  38. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/datasets/coco.yaml +0 -0
  39. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
  40. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/datasets/coco128.yaml +0 -0
  41. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/datasets/coco8-grayscale.yaml +0 -0
  42. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/datasets/coco8-multispectral.yaml +0 -0
  43. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
  44. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
  45. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/datasets/coco8.yaml +0 -0
  46. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/datasets/construction-ppe.yaml +0 -0
  47. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
  48. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/datasets/dog-pose.yaml +0 -0
  49. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/datasets/dota8-multispectral.yaml +0 -0
  50. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/datasets/dota8.yaml +0 -0
  51. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/datasets/hand-keypoints.yaml +0 -0
  52. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/datasets/lvis.yaml +0 -0
  53. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/datasets/medical-pills.yaml +0 -0
  54. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
  55. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
  56. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/datasets/signature.yaml +0 -0
  57. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
  58. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/datasets/xView.yaml +0 -0
  59. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/default.yaml +0 -0
  60. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/11/yolo11-cls-resnet18.yaml +0 -0
  61. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/11/yolo11-cls.yaml +0 -0
  62. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/11/yolo11-obb.yaml +0 -0
  63. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/11/yolo11-pose.yaml +0 -0
  64. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/11/yolo11-seg.yaml +0 -0
  65. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/11/yolo11.yaml +0 -0
  66. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/11/yoloe-11-seg.yaml +0 -0
  67. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/11/yoloe-11.yaml +0 -0
  68. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/12/yolo12-cls.yaml +0 -0
  69. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/12/yolo12-obb.yaml +0 -0
  70. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/12/yolo12-pose.yaml +0 -0
  71. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/12/yolo12-seg.yaml +0 -0
  72. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/12/yolo12.yaml +0 -0
  73. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
  74. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
  75. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
  76. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
  77. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/v10/yolov10b.yaml +0 -0
  78. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/v10/yolov10l.yaml +0 -0
  79. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/v10/yolov10m.yaml +0 -0
  80. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/v10/yolov10n.yaml +0 -0
  81. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/v10/yolov10s.yaml +0 -0
  82. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/v10/yolov10x.yaml +0 -0
  83. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
  84. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
  85. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
  86. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
  87. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
  88. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
  89. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/v8/yoloe-v8-seg.yaml +0 -0
  90. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/v8/yoloe-v8.yaml +0 -0
  91. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
  92. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
  93. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
  94. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
  95. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
  96. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
  97. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
  98. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
  99. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
  100. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
  101. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
  102. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
  103. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
  104. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
  105. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
  106. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
  107. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
  108. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
  109. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
  110. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
  111. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
  112. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/v9/yolov9m.yaml +0 -0
  113. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/v9/yolov9s.yaml +0 -0
  114. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/models/v9/yolov9t.yaml +0 -0
  115. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/trackers/botsort.yaml +0 -0
  116. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
  117. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/data/__init__.py +0 -0
  118. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/data/annotator.py +0 -0
  119. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/data/augment.py +0 -0
  120. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/data/base.py +0 -0
  121. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/data/build.py +0 -0
  122. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/data/converter.py +0 -0
  123. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/data/dataset.py +0 -0
  124. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/data/loaders.py +0 -0
  125. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/data/scripts/download_weights.sh +0 -0
  126. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/data/scripts/get_coco.sh +0 -0
  127. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/data/scripts/get_coco128.sh +0 -0
  128. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/data/scripts/get_imagenet.sh +0 -0
  129. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/data/split.py +0 -0
  130. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/data/split_dota.py +0 -0
  131. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/data/utils.py +0 -0
  132. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/engine/__init__.py +0 -0
  133. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/engine/model.py +0 -0
  134. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/engine/predictor.py +0 -0
  135. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/engine/results.py +0 -0
  136. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/engine/trainer.py +0 -0
  137. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/engine/tuner.py +0 -0
  138. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/engine/validator.py +0 -0
  139. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/hub/__init__.py +0 -0
  140. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/hub/auth.py +0 -0
  141. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/hub/google/__init__.py +0 -0
  142. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/hub/session.py +0 -0
  143. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/hub/utils.py +0 -0
  144. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/__init__.py +0 -0
  145. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/fastsam/__init__.py +0 -0
  146. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/fastsam/model.py +0 -0
  147. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/fastsam/predict.py +0 -0
  148. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/fastsam/utils.py +0 -0
  149. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/fastsam/val.py +0 -0
  150. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/nas/__init__.py +0 -0
  151. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/nas/model.py +0 -0
  152. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/nas/predict.py +0 -0
  153. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/nas/val.py +0 -0
  154. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/rtdetr/__init__.py +0 -0
  155. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/rtdetr/model.py +0 -0
  156. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/rtdetr/predict.py +0 -0
  157. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/rtdetr/train.py +0 -0
  158. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/rtdetr/val.py +0 -0
  159. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/sam/__init__.py +0 -0
  160. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/sam/amg.py +0 -0
  161. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/sam/build.py +0 -0
  162. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/sam/model.py +0 -0
  163. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/sam/modules/__init__.py +0 -0
  164. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/sam/modules/blocks.py +0 -0
  165. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/sam/modules/decoders.py +0 -0
  166. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/sam/modules/encoders.py +0 -0
  167. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/sam/modules/memory_attention.py +0 -0
  168. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/sam/modules/sam.py +0 -0
  169. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
  170. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/sam/modules/transformer.py +0 -0
  171. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/sam/modules/utils.py +0 -0
  172. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/sam/predict.py +0 -0
  173. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/utils/__init__.py +0 -0
  174. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/utils/loss.py +0 -0
  175. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/utils/ops.py +0 -0
  176. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/yolo/__init__.py +0 -0
  177. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/yolo/classify/__init__.py +0 -0
  178. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/yolo/classify/predict.py +0 -0
  179. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/yolo/classify/train.py +0 -0
  180. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/yolo/classify/val.py +0 -0
  181. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/yolo/detect/__init__.py +0 -0
  182. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/yolo/detect/predict.py +0 -0
  183. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/yolo/detect/train.py +0 -0
  184. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/yolo/detect/val.py +0 -0
  185. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/yolo/model.py +0 -0
  186. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/yolo/obb/__init__.py +0 -0
  187. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/yolo/obb/predict.py +0 -0
  188. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/yolo/obb/train.py +0 -0
  189. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/yolo/obb/val.py +0 -0
  190. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/yolo/pose/__init__.py +0 -0
  191. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/yolo/pose/predict.py +0 -0
  192. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/yolo/pose/train.py +0 -0
  193. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/yolo/pose/val.py +0 -0
  194. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/yolo/segment/__init__.py +0 -0
  195. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/yolo/segment/predict.py +0 -0
  196. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/yolo/segment/train.py +0 -0
  197. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/yolo/segment/val.py +0 -0
  198. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/yolo/world/__init__.py +0 -0
  199. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/yolo/world/train.py +0 -0
  200. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/yolo/world/train_world.py +0 -0
  201. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/yolo/yoloe/__init__.py +0 -0
  202. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/yolo/yoloe/predict.py +0 -0
  203. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/yolo/yoloe/train.py +0 -0
  204. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/yolo/yoloe/train_seg.py +0 -0
  205. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/models/yolo/yoloe/val.py +0 -0
  206. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/nn/__init__.py +0 -0
  207. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/nn/modules/__init__.py +0 -0
  208. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/nn/modules/activation.py +0 -0
  209. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/nn/modules/block.py +0 -0
  210. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/nn/modules/conv.py +0 -0
  211. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/nn/modules/head.py +0 -0
  212. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/nn/modules/transformer.py +0 -0
  213. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/nn/modules/utils.py +0 -0
  214. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/nn/tasks.py +0 -0
  215. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/nn/text_model.py +0 -0
  216. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/py.typed +0 -0
  217. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/solutions/__init__.py +0 -0
  218. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/solutions/ai_gym.py +0 -0
  219. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/solutions/analytics.py +0 -0
  220. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/solutions/config.py +0 -0
  221. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/solutions/distance_calculation.py +0 -0
  222. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/solutions/heatmap.py +0 -0
  223. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/solutions/instance_segmentation.py +0 -0
  224. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/solutions/object_blurrer.py +0 -0
  225. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/solutions/object_counter.py +0 -0
  226. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/solutions/object_cropper.py +0 -0
  227. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/solutions/parking_management.py +0 -0
  228. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/solutions/queue_management.py +0 -0
  229. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/solutions/region_counter.py +0 -0
  230. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/solutions/security_alarm.py +0 -0
  231. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/solutions/similarity_search.py +0 -0
  232. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/solutions/solutions.py +0 -0
  233. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/solutions/speed_estimation.py +0 -0
  234. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/solutions/streamlit_inference.py +0 -0
  235. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/solutions/templates/similarity-search.html +0 -0
  236. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/solutions/trackzone.py +0 -0
  237. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/solutions/vision_eye.py +0 -0
  238. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/trackers/__init__.py +0 -0
  239. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/trackers/basetrack.py +0 -0
  240. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/trackers/bot_sort.py +0 -0
  241. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/trackers/byte_tracker.py +0 -0
  242. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/trackers/track.py +0 -0
  243. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/trackers/utils/__init__.py +0 -0
  244. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/trackers/utils/gmc.py +0 -0
  245. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/trackers/utils/kalman_filter.py +0 -0
  246. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/trackers/utils/matching.py +0 -0
  247. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/utils/__init__.py +0 -0
  248. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/utils/autobatch.py +0 -0
  249. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/utils/autodevice.py +0 -0
  250. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/utils/benchmarks.py +0 -0
  251. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/utils/callbacks/__init__.py +0 -0
  252. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/utils/callbacks/base.py +0 -0
  253. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/utils/callbacks/clearml.py +0 -0
  254. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/utils/callbacks/comet.py +0 -0
  255. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/utils/callbacks/dvc.py +0 -0
  256. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/utils/callbacks/hub.py +0 -0
  257. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/utils/callbacks/mlflow.py +0 -0
  258. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/utils/callbacks/neptune.py +0 -0
  259. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/utils/callbacks/platform.py +0 -0
  260. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/utils/callbacks/raytune.py +0 -0
  261. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/utils/callbacks/tensorboard.py +0 -0
  262. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/utils/callbacks/wb.py +0 -0
  263. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/utils/checks.py +0 -0
  264. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/utils/cpu.py +0 -0
  265. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/utils/dist.py +0 -0
  266. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/utils/errors.py +0 -0
  267. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/utils/events.py +0 -0
  268. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/utils/export/__init__.py +0 -0
  269. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/utils/export/imx.py +0 -0
  270. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/utils/files.py +0 -0
  271. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/utils/git.py +0 -0
  272. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/utils/instance.py +0 -0
  273. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/utils/logger.py +0 -0
  274. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/utils/loss.py +0 -0
  275. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/utils/metrics.py +0 -0
  276. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/utils/nms.py +0 -0
  277. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/utils/ops.py +0 -0
  278. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/utils/patches.py +0 -0
  279. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/utils/tal.py +0 -0
  280. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/utils/torch_utils.py +0 -0
  281. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/utils/tqdm.py +0 -0
  282. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/utils/triton.py +0 -0
  283. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics/utils/tuner.py +0 -0
  284. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics.egg-info/SOURCES.txt +0 -0
  285. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics.egg-info/dependency_links.txt +0 -0
  286. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics.egg-info/entry_points.txt +0 -0
  287. {ultralytics-8.3.205 → ultralytics-8.3.207}/ultralytics.egg-info/requires.txt +0 -0
  288. {ultralytics-8.3.205 → ultralytics-8.3.207}/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.205
3
+ Version: 8.3.207
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>
@@ -124,9 +124,12 @@ def test_export_torchscript_matrix(task, dynamic, int8, half, batch, nms):
124
124
  [ # generate all combinations except for exclusion cases
125
125
  (task, dynamic, int8, half, nms, batch)
126
126
  for task, dynamic, int8, half, nms, batch in product(
127
- TASKS, [False], [True, False], [True, False], [True, False], [1]
127
+ TASKS, [True, False], [True, False], [True, False], [True, False], [1]
128
128
  )
129
- if not (int8 and half) and not (task != "detect" and nms)
129
+ if not (int8 and half)
130
+ and not (task != "detect" and nms)
131
+ and not (dynamic and nms)
132
+ and not (task == "classify" and dynamic)
130
133
  ],
131
134
  )
132
135
  def test_export_coreml_matrix(task, dynamic, int8, half, nms, batch):
@@ -1,9 +1,10 @@
1
1
  # Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
2
2
 
3
- __version__ = "8.3.205"
3
+ __version__ = "8.3.207"
4
4
 
5
5
  import importlib
6
6
  import os
7
+ from typing import TYPE_CHECKING
7
8
 
8
9
  # Set ENV variables (place before imports)
9
10
  if not os.environ.get("OMP_NUM_THREADS"):
@@ -26,6 +27,10 @@ __all__ = (
26
27
  "settings",
27
28
  )
28
29
 
30
+ if TYPE_CHECKING:
31
+ # Enable hints for type checkers
32
+ from ultralytics.models import YOLO, YOLOWorld, YOLOE, NAS, SAM, FastSAM, RTDETR # noqa
33
+
29
34
 
30
35
  def __getattr__(name: str):
31
36
  """Lazy-import model classes on first access."""
@@ -137,7 +137,7 @@ def export_formats():
137
137
  True,
138
138
  ["batch", "dynamic", "half", "int8", "simplify", "nms", "fraction"],
139
139
  ],
140
- ["CoreML", "coreml", ".mlpackage", True, False, ["batch", "half", "int8", "nms"]],
140
+ ["CoreML", "coreml", ".mlpackage", True, False, ["batch", "dynamic", "half", "int8", "nms"]],
141
141
  ["TensorFlow SavedModel", "saved_model", "_saved_model", True, True, ["batch", "int8", "keras", "nms"]],
142
142
  ["TensorFlow GraphDef", "pb", ".pb", True, True, ["batch"]],
143
143
  ["TensorFlow Lite", "tflite", ".tflite", True, False, ["batch", "half", "int8", "nms", "fraction"]],
@@ -389,9 +389,9 @@ class Exporter:
389
389
  LOGGER.warning("'nms=True' is not available for end2end models. Forcing 'nms=False'.")
390
390
  self.args.nms = False
391
391
  self.args.conf = self.args.conf or 0.25 # set conf default value for nms export
392
- if (engine or self.args.nms) and self.args.dynamic and self.args.batch == 1:
392
+ if (engine or coreml or self.args.nms) and self.args.dynamic and self.args.batch == 1:
393
393
  LOGGER.warning(
394
- f"'dynamic=True' model with '{'nms=True' if self.args.nms else 'format=engine'}' requires max batch size, i.e. 'batch=16'"
394
+ f"'dynamic=True' model with '{'nms=True' if self.args.nms else f'format={self.args.format}'}' requires max batch size, i.e. 'batch=16'"
395
395
  )
396
396
  if edgetpu:
397
397
  if not LINUX or ARM64:
@@ -876,19 +876,25 @@ class Exporter:
876
876
  LOGGER.info(f"\n{prefix} starting export with coremltools {ct.__version__}...")
877
877
  assert not WINDOWS, "CoreML export is not supported on Windows, please run on macOS or Linux."
878
878
  assert TORCH_1_11, "CoreML export requires torch>=1.11"
879
- assert self.args.batch == 1, "CoreML batch sizes > 1 are not supported. Please retry at 'batch=1'."
879
+ if self.args.batch > 1:
880
+ assert self.args.dynamic, (
881
+ "batch sizes > 1 are not supported without 'dynamic=True' for CoreML export. Please retry at 'dynamic=True'."
882
+ )
883
+ if self.args.dynamic:
884
+ assert not self.args.nms, (
885
+ "'nms=True' cannot be used together with 'dynamic=True' for CoreML export. Please disable one of them."
886
+ )
887
+ assert self.model.task != "classify", "'dynamic=True' is not supported for CoreML classification models."
880
888
  f = self.file.with_suffix(".mlmodel" if mlmodel else ".mlpackage")
881
889
  if f.is_dir():
882
890
  shutil.rmtree(f)
883
891
 
884
- bias = [0.0, 0.0, 0.0]
885
- scale = 1 / 255
886
892
  classifier_config = None
887
893
  if self.model.task == "classify":
888
894
  classifier_config = ct.ClassifierConfig(list(self.model.names.values()))
889
895
  model = self.model
890
896
  elif self.model.task == "detect":
891
- model = IOSDetectModel(self.model, self.im) if self.args.nms else self.model
897
+ model = IOSDetectModel(self.model, self.im, mlprogram=not mlmodel) if self.args.nms else self.model
892
898
  else:
893
899
  if self.args.nms:
894
900
  LOGGER.warning(f"{prefix} 'nms=True' is only available for Detect models like 'yolo11n.pt'.")
@@ -896,13 +902,26 @@ class Exporter:
896
902
  model = self.model
897
903
  ts = torch.jit.trace(model.eval(), self.im, strict=False) # TorchScript model
898
904
 
905
+ if self.args.dynamic:
906
+ input_shape = ct.Shape(
907
+ shape=(
908
+ ct.RangeDim(lower_bound=1, upper_bound=self.args.batch, default=1),
909
+ self.im.shape[1],
910
+ ct.RangeDim(lower_bound=32, upper_bound=self.imgsz[0] * 2, default=self.imgsz[0]),
911
+ ct.RangeDim(lower_bound=32, upper_bound=self.imgsz[1] * 2, default=self.imgsz[1]),
912
+ )
913
+ )
914
+ inputs = [ct.TensorType("image", shape=input_shape)]
915
+ else:
916
+ inputs = [ct.ImageType("image", shape=self.im.shape, scale=1 / 255, bias=[0.0, 0.0, 0.0])]
917
+
899
918
  # Based on apple's documentation it is better to leave out the minimum_deployment target and let that get set
900
919
  # Internally based on the model conversion and output type.
901
920
  # Setting minimum_depoloyment_target >= iOS16 will require setting compute_precision=ct.precision.FLOAT32.
902
921
  # iOS16 adds in better support for FP16, but none of the CoreML NMS specifications handle FP16 as input.
903
922
  ct_model = ct.convert(
904
923
  ts,
905
- inputs=[ct.ImageType("image", shape=self.im.shape, scale=scale, bias=bias)], # expects ct.TensorType
924
+ inputs=inputs,
906
925
  classifier_config=classifier_config,
907
926
  convert_to="neuralnetwork" if mlmodel else "mlprogram",
908
927
  )
@@ -919,12 +938,7 @@ class Exporter:
919
938
  config = cto.OptimizationConfig(global_config=op_config)
920
939
  ct_model = cto.palettize_weights(ct_model, config=config)
921
940
  if self.args.nms and self.model.task == "detect":
922
- if mlmodel:
923
- weights_dir = None
924
- else:
925
- ct_model.save(str(f)) # save otherwise weights_dir does not exist
926
- weights_dir = str(f / "Data/com.apple.CoreML/weights")
927
- ct_model = self._pipeline_coreml(ct_model, weights_dir=weights_dir)
941
+ ct_model = self._pipeline_coreml(ct_model, weights_dir=None if mlmodel else ct_model.weights_dir)
928
942
 
929
943
  m = self.metadata # metadata dict
930
944
  ct_model.short_description = m.pop("description")
@@ -1258,7 +1272,8 @@ class Exporter:
1258
1272
  names = self.metadata["names"]
1259
1273
  nx, ny = spec.description.input[0].type.imageType.width, spec.description.input[0].type.imageType.height
1260
1274
  nc = outs[0].type.multiArrayType.shape[-1]
1261
- assert len(names) == nc, f"{len(names)} names found for nc={nc}" # check
1275
+ if len(names) != nc: # Hack fix for MLProgram NMS bug https://github.com/ultralytics/ultralytics/issues/22309
1276
+ names = {**names, **{i: str(i) for i in range(len(names), nc)}}
1262
1277
 
1263
1278
  # Model from spec
1264
1279
  model = ct.models.MLModel(spec, weights_dir=weights_dir)
@@ -1348,18 +1363,20 @@ class Exporter:
1348
1363
  class IOSDetectModel(torch.nn.Module):
1349
1364
  """Wrap an Ultralytics YOLO model for Apple iOS CoreML export."""
1350
1365
 
1351
- def __init__(self, model, im):
1366
+ def __init__(self, model, im, mlprogram=True):
1352
1367
  """
1353
1368
  Initialize the IOSDetectModel class with a YOLO model and example image.
1354
1369
 
1355
1370
  Args:
1356
1371
  model (torch.nn.Module): The YOLO model to wrap.
1357
1372
  im (torch.Tensor): Example input tensor with shape (B, C, H, W).
1373
+ mlprogram (bool): Whether exporting to MLProgram format to fix NMS bug.
1358
1374
  """
1359
1375
  super().__init__()
1360
1376
  _, _, h, w = im.shape # batch, channel, height, width
1361
1377
  self.model = model
1362
1378
  self.nc = len(model.names) # number of classes
1379
+ self.mlprogram = mlprogram
1363
1380
  if w == h:
1364
1381
  self.normalize = 1.0 / w # scalar
1365
1382
  else:
@@ -1371,7 +1388,11 @@ class IOSDetectModel(torch.nn.Module):
1371
1388
  def forward(self, x):
1372
1389
  """Normalize predictions of object detection model with input size-dependent factors."""
1373
1390
  xywh, cls = self.model(x)[0].transpose(0, 1).split((4, self.nc), 1)
1374
- return cls, xywh * self.normalize # confidence (3780, 80), coordinates (3780, 4)
1391
+ if self.mlprogram and self.nc % 80 != 0: # NMS bug https://github.com/ultralytics/ultralytics/issues/22309
1392
+ pad_length = int(((self.nc + 79) // 80) * 80) - self.nc # pad class length to multiple of 80
1393
+ cls = torch.nn.functional.pad(cls, (0, pad_length, 0, 0), "constant", 0)
1394
+
1395
+ return cls, xywh * self.normalize
1375
1396
 
1376
1397
 
1377
1398
  class NMSModel(torch.nn.Module):
@@ -406,6 +406,7 @@ class AutoBackend(nn.Module):
406
406
  import coremltools as ct
407
407
 
408
408
  model = ct.models.MLModel(w)
409
+ dynamic = model.get_spec().description.input[0].type.HasField("multiArrayType")
409
410
  metadata = dict(model.user_defined_metadata)
410
411
 
411
412
  # TF SavedModel
@@ -720,10 +721,13 @@ class AutoBackend(nn.Module):
720
721
 
721
722
  # CoreML
722
723
  elif self.coreml:
723
- im = im[0].cpu().numpy()
724
- im_pil = Image.fromarray((im * 255).astype("uint8"))
724
+ im = im.cpu().numpy()
725
+ if self.dynamic:
726
+ im = im.transpose(0, 3, 1, 2)
727
+ else:
728
+ im = Image.fromarray((im[0] * 255).astype("uint8"))
725
729
  # im = im.resize((192, 320), Image.BILINEAR)
726
- y = self.model.predict({"image": im_pil}) # coordinates are xywh normalized
730
+ y = self.model.predict({"image": im}) # coordinates are xywh normalized
727
731
  if "confidence" in y: # NMS included
728
732
  from ultralytics.utils.ops import xywh2xyxy
729
733
 
@@ -376,8 +376,8 @@ def safe_download(
376
376
  if i == 0 and not is_online():
377
377
  raise ConnectionError(emojis(f"❌ Download failure for {uri}. Environment is not online.")) from e
378
378
  elif i >= retry:
379
- raise ConnectionError(emojis(f"❌ Download failure for {uri}. Retry limit reached.")) from e
380
- LOGGER.warning(f"Download failure, retrying {i + 1}/{retry} {uri}...")
379
+ raise ConnectionError(emojis(f"❌ Download failure for {uri}. Retry limit reached. {e}")) from e
380
+ LOGGER.warning(f"Download failure, retrying {i + 1}/{retry} {uri}... {e}")
381
381
 
382
382
  if unzip and f.exists() and f.suffix in {"", ".zip", ".tar", ".gz"}:
383
383
  from zipfile import is_zipfile
@@ -712,6 +712,12 @@ def plot_images(
712
712
  Note:
713
713
  This function supports both tensor and numpy array inputs. It will automatically
714
714
  convert tensor inputs to numpy arrays for processing.
715
+
716
+ Channel Support:
717
+ - 1 channel: Greyscale
718
+ - 2 channels: Third channel added as zeros
719
+ - 3 channels: Used as-is (standard RGB)
720
+ - 4+ channels: Cropped to first 3 channels
715
721
  """
716
722
  for k in {"cls", "bboxes", "conf", "masks", "keypoints", "batch_idx", "images"}:
717
723
  if k not in labels:
@@ -731,7 +737,13 @@ def plot_images(
731
737
 
732
738
  if len(images) and isinstance(images, torch.Tensor):
733
739
  images = images.cpu().float().numpy()
734
- if images.shape[1] > 3:
740
+
741
+ # Handle 2-ch and n-ch images
742
+ c = images.shape[1]
743
+ if c == 2:
744
+ zero = np.zeros_like(images[:, :1])
745
+ images = np.concatenate((images, zero), axis=1) # pad 2-ch with a black channel
746
+ elif c > 3:
735
747
  images = images[:, :3] # crop multispectral images to first 3 channels
736
748
 
737
749
  bs, _, h, w = images.shape # batch size, _, height, width
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ultralytics
3
- Version: 8.3.205
3
+ Version: 8.3.207
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