ultralytics 8.3.199__tar.gz → 8.3.200__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.199 → ultralytics-8.3.200}/PKG-INFO +1 -1
  2. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/__init__.py +1 -1
  3. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/engine/exporter.py +17 -166
  4. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/engine/trainer.py +31 -28
  5. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/engine/tuner.py +2 -1
  6. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/nn/modules/head.py +1 -5
  7. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/utils/benchmarks.py +1 -1
  8. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/utils/dist.py +11 -3
  9. ultralytics-8.3.199/ultralytics/utils/export.py → ultralytics-8.3.200/ultralytics/utils/export/__init__.py +9 -7
  10. ultralytics-8.3.200/ultralytics/utils/export/imx.py +289 -0
  11. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/utils/torch_utils.py +1 -48
  12. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics.egg-info/PKG-INFO +1 -1
  13. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics.egg-info/SOURCES.txt +3 -2
  14. {ultralytics-8.3.199 → ultralytics-8.3.200}/LICENSE +0 -0
  15. {ultralytics-8.3.199 → ultralytics-8.3.200}/README.md +0 -0
  16. {ultralytics-8.3.199 → ultralytics-8.3.200}/pyproject.toml +0 -0
  17. {ultralytics-8.3.199 → ultralytics-8.3.200}/setup.cfg +0 -0
  18. {ultralytics-8.3.199 → ultralytics-8.3.200}/tests/__init__.py +0 -0
  19. {ultralytics-8.3.199 → ultralytics-8.3.200}/tests/conftest.py +0 -0
  20. {ultralytics-8.3.199 → ultralytics-8.3.200}/tests/test_cli.py +0 -0
  21. {ultralytics-8.3.199 → ultralytics-8.3.200}/tests/test_cuda.py +0 -0
  22. {ultralytics-8.3.199 → ultralytics-8.3.200}/tests/test_engine.py +0 -0
  23. {ultralytics-8.3.199 → ultralytics-8.3.200}/tests/test_exports.py +0 -0
  24. {ultralytics-8.3.199 → ultralytics-8.3.200}/tests/test_integrations.py +0 -0
  25. {ultralytics-8.3.199 → ultralytics-8.3.200}/tests/test_python.py +0 -0
  26. {ultralytics-8.3.199 → ultralytics-8.3.200}/tests/test_solutions.py +0 -0
  27. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/assets/bus.jpg +0 -0
  28. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/assets/zidane.jpg +0 -0
  29. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/__init__.py +0 -0
  30. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
  31. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
  32. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
  33. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
  34. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/datasets/HomeObjects-3K.yaml +0 -0
  35. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
  36. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
  37. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
  38. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/datasets/VOC.yaml +0 -0
  39. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
  40. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
  41. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
  42. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
  43. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
  44. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/datasets/coco.yaml +0 -0
  45. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
  46. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/datasets/coco128.yaml +0 -0
  47. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/datasets/coco8-grayscale.yaml +0 -0
  48. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/datasets/coco8-multispectral.yaml +0 -0
  49. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
  50. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
  51. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/datasets/coco8.yaml +0 -0
  52. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/datasets/construction-ppe.yaml +0 -0
  53. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
  54. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/datasets/dog-pose.yaml +0 -0
  55. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/datasets/dota8-multispectral.yaml +0 -0
  56. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/datasets/dota8.yaml +0 -0
  57. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/datasets/hand-keypoints.yaml +0 -0
  58. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/datasets/lvis.yaml +0 -0
  59. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/datasets/medical-pills.yaml +0 -0
  60. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
  61. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
  62. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/datasets/signature.yaml +0 -0
  63. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
  64. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/datasets/xView.yaml +0 -0
  65. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/default.yaml +0 -0
  66. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/11/yolo11-cls-resnet18.yaml +0 -0
  67. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/11/yolo11-cls.yaml +0 -0
  68. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/11/yolo11-obb.yaml +0 -0
  69. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/11/yolo11-pose.yaml +0 -0
  70. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/11/yolo11-seg.yaml +0 -0
  71. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/11/yolo11.yaml +0 -0
  72. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/11/yoloe-11-seg.yaml +0 -0
  73. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/11/yoloe-11.yaml +0 -0
  74. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/12/yolo12-cls.yaml +0 -0
  75. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/12/yolo12-obb.yaml +0 -0
  76. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/12/yolo12-pose.yaml +0 -0
  77. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/12/yolo12-seg.yaml +0 -0
  78. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/12/yolo12.yaml +0 -0
  79. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
  80. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
  81. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
  82. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
  83. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/v10/yolov10b.yaml +0 -0
  84. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/v10/yolov10l.yaml +0 -0
  85. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/v10/yolov10m.yaml +0 -0
  86. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/v10/yolov10n.yaml +0 -0
  87. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/v10/yolov10s.yaml +0 -0
  88. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/v10/yolov10x.yaml +0 -0
  89. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
  90. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
  91. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
  92. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
  93. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
  94. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
  95. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/v8/yoloe-v8-seg.yaml +0 -0
  96. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/v8/yoloe-v8.yaml +0 -0
  97. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
  98. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
  99. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
  100. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
  101. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
  102. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
  103. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
  104. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
  105. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
  106. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
  107. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
  108. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
  109. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
  110. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
  111. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
  112. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
  113. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
  114. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
  115. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
  116. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
  117. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
  118. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/v9/yolov9m.yaml +0 -0
  119. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/v9/yolov9s.yaml +0 -0
  120. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/models/v9/yolov9t.yaml +0 -0
  121. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/trackers/botsort.yaml +0 -0
  122. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
  123. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/data/__init__.py +0 -0
  124. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/data/annotator.py +0 -0
  125. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/data/augment.py +0 -0
  126. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/data/base.py +0 -0
  127. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/data/build.py +0 -0
  128. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/data/converter.py +0 -0
  129. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/data/dataset.py +0 -0
  130. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/data/loaders.py +0 -0
  131. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/data/scripts/download_weights.sh +0 -0
  132. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/data/scripts/get_coco.sh +0 -0
  133. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/data/scripts/get_coco128.sh +0 -0
  134. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/data/scripts/get_imagenet.sh +0 -0
  135. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/data/split.py +0 -0
  136. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/data/split_dota.py +0 -0
  137. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/data/utils.py +0 -0
  138. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/engine/__init__.py +0 -0
  139. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/engine/model.py +0 -0
  140. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/engine/predictor.py +0 -0
  141. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/engine/results.py +0 -0
  142. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/engine/validator.py +0 -0
  143. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/hub/__init__.py +0 -0
  144. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/hub/auth.py +0 -0
  145. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/hub/google/__init__.py +0 -0
  146. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/hub/session.py +0 -0
  147. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/hub/utils.py +0 -0
  148. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/__init__.py +0 -0
  149. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/fastsam/__init__.py +0 -0
  150. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/fastsam/model.py +0 -0
  151. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/fastsam/predict.py +0 -0
  152. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/fastsam/utils.py +0 -0
  153. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/fastsam/val.py +0 -0
  154. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/nas/__init__.py +0 -0
  155. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/nas/model.py +0 -0
  156. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/nas/predict.py +0 -0
  157. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/nas/val.py +0 -0
  158. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/rtdetr/__init__.py +0 -0
  159. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/rtdetr/model.py +0 -0
  160. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/rtdetr/predict.py +0 -0
  161. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/rtdetr/train.py +0 -0
  162. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/rtdetr/val.py +0 -0
  163. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/sam/__init__.py +0 -0
  164. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/sam/amg.py +0 -0
  165. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/sam/build.py +0 -0
  166. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/sam/model.py +0 -0
  167. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/sam/modules/__init__.py +0 -0
  168. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/sam/modules/blocks.py +0 -0
  169. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/sam/modules/decoders.py +0 -0
  170. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/sam/modules/encoders.py +0 -0
  171. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/sam/modules/memory_attention.py +0 -0
  172. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/sam/modules/sam.py +0 -0
  173. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
  174. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/sam/modules/transformer.py +0 -0
  175. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/sam/modules/utils.py +0 -0
  176. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/sam/predict.py +0 -0
  177. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/utils/__init__.py +0 -0
  178. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/utils/loss.py +0 -0
  179. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/utils/ops.py +0 -0
  180. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/yolo/__init__.py +0 -0
  181. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/yolo/classify/__init__.py +0 -0
  182. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/yolo/classify/predict.py +0 -0
  183. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/yolo/classify/train.py +0 -0
  184. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/yolo/classify/val.py +0 -0
  185. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/yolo/detect/__init__.py +0 -0
  186. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/yolo/detect/predict.py +0 -0
  187. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/yolo/detect/train.py +0 -0
  188. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/yolo/detect/val.py +0 -0
  189. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/yolo/model.py +0 -0
  190. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/yolo/obb/__init__.py +0 -0
  191. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/yolo/obb/predict.py +0 -0
  192. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/yolo/obb/train.py +0 -0
  193. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/yolo/obb/val.py +0 -0
  194. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/yolo/pose/__init__.py +0 -0
  195. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/yolo/pose/predict.py +0 -0
  196. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/yolo/pose/train.py +0 -0
  197. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/yolo/pose/val.py +0 -0
  198. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/yolo/segment/__init__.py +0 -0
  199. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/yolo/segment/predict.py +0 -0
  200. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/yolo/segment/train.py +0 -0
  201. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/yolo/segment/val.py +0 -0
  202. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/yolo/world/__init__.py +0 -0
  203. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/yolo/world/train.py +0 -0
  204. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/yolo/world/train_world.py +0 -0
  205. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/yolo/yoloe/__init__.py +0 -0
  206. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/yolo/yoloe/predict.py +0 -0
  207. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/yolo/yoloe/train.py +0 -0
  208. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/yolo/yoloe/train_seg.py +0 -0
  209. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/models/yolo/yoloe/val.py +0 -0
  210. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/nn/__init__.py +0 -0
  211. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/nn/autobackend.py +0 -0
  212. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/nn/modules/__init__.py +0 -0
  213. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/nn/modules/activation.py +0 -0
  214. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/nn/modules/block.py +0 -0
  215. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/nn/modules/conv.py +0 -0
  216. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/nn/modules/transformer.py +0 -0
  217. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/nn/modules/utils.py +0 -0
  218. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/nn/tasks.py +0 -0
  219. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/nn/text_model.py +0 -0
  220. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/py.typed +0 -0
  221. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/solutions/__init__.py +0 -0
  222. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/solutions/ai_gym.py +0 -0
  223. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/solutions/analytics.py +0 -0
  224. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/solutions/config.py +0 -0
  225. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/solutions/distance_calculation.py +0 -0
  226. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/solutions/heatmap.py +0 -0
  227. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/solutions/instance_segmentation.py +0 -0
  228. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/solutions/object_blurrer.py +0 -0
  229. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/solutions/object_counter.py +0 -0
  230. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/solutions/object_cropper.py +0 -0
  231. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/solutions/parking_management.py +0 -0
  232. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/solutions/queue_management.py +0 -0
  233. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/solutions/region_counter.py +0 -0
  234. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/solutions/security_alarm.py +0 -0
  235. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/solutions/similarity_search.py +0 -0
  236. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/solutions/solutions.py +0 -0
  237. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/solutions/speed_estimation.py +0 -0
  238. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/solutions/streamlit_inference.py +0 -0
  239. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/solutions/templates/similarity-search.html +0 -0
  240. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/solutions/trackzone.py +0 -0
  241. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/solutions/vision_eye.py +0 -0
  242. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/trackers/__init__.py +0 -0
  243. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/trackers/basetrack.py +0 -0
  244. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/trackers/bot_sort.py +0 -0
  245. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/trackers/byte_tracker.py +0 -0
  246. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/trackers/track.py +0 -0
  247. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/trackers/utils/__init__.py +0 -0
  248. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/trackers/utils/gmc.py +0 -0
  249. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/trackers/utils/kalman_filter.py +0 -0
  250. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/trackers/utils/matching.py +0 -0
  251. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/utils/__init__.py +0 -0
  252. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/utils/autobatch.py +0 -0
  253. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/utils/autodevice.py +0 -0
  254. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/utils/callbacks/__init__.py +0 -0
  255. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/utils/callbacks/base.py +0 -0
  256. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/utils/callbacks/clearml.py +0 -0
  257. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/utils/callbacks/comet.py +0 -0
  258. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/utils/callbacks/dvc.py +0 -0
  259. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/utils/callbacks/hub.py +0 -0
  260. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/utils/callbacks/mlflow.py +0 -0
  261. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/utils/callbacks/neptune.py +0 -0
  262. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/utils/callbacks/platform.py +0 -0
  263. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/utils/callbacks/raytune.py +0 -0
  264. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/utils/callbacks/tensorboard.py +0 -0
  265. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/utils/callbacks/wb.py +0 -0
  266. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/utils/checks.py +0 -0
  267. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/utils/cpu.py +0 -0
  268. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/utils/downloads.py +0 -0
  269. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/utils/errors.py +0 -0
  270. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/utils/events.py +0 -0
  271. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/utils/files.py +0 -0
  272. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/utils/git.py +0 -0
  273. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/utils/instance.py +0 -0
  274. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/utils/logger.py +0 -0
  275. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/utils/loss.py +0 -0
  276. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/utils/metrics.py +0 -0
  277. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/utils/nms.py +0 -0
  278. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/utils/ops.py +0 -0
  279. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/utils/patches.py +0 -0
  280. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/utils/plotting.py +0 -0
  281. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/utils/tal.py +0 -0
  282. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/utils/tqdm.py +0 -0
  283. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/utils/triton.py +0 -0
  284. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics/utils/tuner.py +0 -0
  285. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics.egg-info/dependency_links.txt +0 -0
  286. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics.egg-info/entry_points.txt +0 -0
  287. {ultralytics-8.3.199 → ultralytics-8.3.200}/ultralytics.egg-info/requires.txt +0 -0
  288. {ultralytics-8.3.199 → ultralytics-8.3.200}/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.199
3
+ Version: 8.3.200
4
4
  Summary: Ultralytics YOLO 🚀 for SOTA object detection, multi-object tracking, instance segmentation, pose estimation and image classification.
5
5
  Author-email: Glenn Jocher <glenn.jocher@ultralytics.com>, Jing Qiu <jing.qiu@ultralytics.com>
6
6
  Maintainer-email: Ultralytics <hello@ultralytics.com>
@@ -1,6 +1,6 @@
1
1
  # Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
2
2
 
3
- __version__ = "8.3.199"
3
+ __version__ = "8.3.200"
4
4
 
5
5
  import importlib
6
6
  import os
@@ -106,7 +106,7 @@ from ultralytics.utils.checks import (
106
106
  is_sudo_available,
107
107
  )
108
108
  from ultralytics.utils.downloads import attempt_download_asset, get_github_assets, safe_download
109
- from ultralytics.utils.export import export_engine, export_onnx
109
+ from ultralytics.utils.export import onnx2engine, torch2imx, torch2onnx
110
110
  from ultralytics.utils.files import file_size, spaces_in_path
111
111
  from ultralytics.utils.metrics import batch_probiou
112
112
  from ultralytics.utils.nms import TorchNMS
@@ -284,7 +284,8 @@ class Exporter:
284
284
  # Get the closest match if format is invalid
285
285
  matches = difflib.get_close_matches(fmt, fmts, n=1, cutoff=0.6) # 60% similarity required to match
286
286
  if not matches:
287
- raise ValueError(f"Invalid export format='{fmt}'. Valid formats are {fmts}")
287
+ msg = "Model is already in PyTorch format." if fmt == "pt" else f"Invalid export format='{fmt}'."
288
+ raise ValueError(f"{msg} Valid formats are {fmts}")
288
289
  LOGGER.warning(f"Invalid export format='{fmt}', updating to format='{matches[0]}'")
289
290
  fmt = matches[0]
290
291
  flags = [x == fmt for x in fmts]
@@ -408,9 +409,9 @@ class Exporter:
408
409
  model = model.fuse()
409
410
 
410
411
  if imx:
411
- from ultralytics.utils.torch_utils import FXModel
412
+ from ultralytics.utils.export.imx import FXModel
412
413
 
413
- model = FXModel(model)
414
+ model = FXModel(model, self.imgsz)
414
415
  for m in model.modules():
415
416
  if isinstance(m, Classify):
416
417
  m.export = True
@@ -425,15 +426,6 @@ class Exporter:
425
426
  elif isinstance(m, C2f) and not is_tf_format:
426
427
  # EdgeTPU does not support FlexSplitV while split provides cleaner ONNX graph
427
428
  m.forward = m.forward_split
428
- if isinstance(m, Detect) and imx:
429
- from ultralytics.utils.tal import make_anchors
430
-
431
- m.anchors, m.strides = (
432
- x.transpose(0, 1)
433
- for x in make_anchors(
434
- torch.cat([s / m.stride.unsqueeze(-1) for s in self.imgsz], dim=1), m.stride, 0.5
435
- )
436
- )
437
429
 
438
430
  y = None
439
431
  for _ in range(2): # dry runs
@@ -609,7 +601,7 @@ class Exporter:
609
601
  self.args.opset = opset_version # for NMSModel
610
602
 
611
603
  with arange_patch(self.args):
612
- export_onnx(
604
+ torch2onnx(
613
605
  NMSModel(self.model, self.args) if self.args.nms else self.model,
614
606
  self.im,
615
607
  f,
@@ -932,7 +924,7 @@ class Exporter:
932
924
  LOGGER.info(f"\n{prefix} starting export with TensorRT {trt.__version__}...")
933
925
  assert Path(f_onnx).exists(), f"failed to export ONNX file: {f_onnx}"
934
926
  f = self.file.with_suffix(".engine") # TensorRT engine file
935
- export_engine(
927
+ onnx2engine(
936
928
  f_onnx,
937
929
  f,
938
930
  self.args.workspace,
@@ -1168,7 +1160,6 @@ class Exporter:
1168
1160
  @try_export
1169
1161
  def export_imx(self, prefix=colorstr("IMX:")):
1170
1162
  """Export YOLO model to IMX format."""
1171
- gptq = False
1172
1163
  assert LINUX, (
1173
1164
  "export only supported on Linux. "
1174
1165
  "See https://developer.aitrios.sony-semicon.com/en/raspberrypi-ai-camera/documentation/imx500-converter"
@@ -1181,13 +1172,6 @@ class Exporter:
1181
1172
  check_requirements("imx500-converter[pt]>=3.16.1") # Separate requirements for imx500-converter
1182
1173
  check_requirements("mct-quantizers>=1.6.0") # Separate for compatibility with model-compression-toolkit
1183
1174
 
1184
- import model_compression_toolkit as mct
1185
- import onnx
1186
- from edgemdt_tpc import get_target_platform_capabilities
1187
- from sony_custom_layers.pytorch import multiclass_nms_with_indices
1188
-
1189
- LOGGER.info(f"\n{prefix} starting export with model_compression_toolkit {mct.__version__}...")
1190
-
1191
1175
  # Install Java>=17
1192
1176
  try:
1193
1177
  java_output = subprocess.run(["java", "--version"], check=True, capture_output=True).stdout.decode()
@@ -1198,150 +1182,17 @@ class Exporter:
1198
1182
  cmd = (["sudo"] if is_sudo_available() else []) + ["apt", "install", "-y", "openjdk-21-jre"]
1199
1183
  subprocess.run(cmd, check=True)
1200
1184
 
1201
- def representative_dataset_gen(dataloader=self.get_int8_calibration_dataloader(prefix)):
1202
- for batch in dataloader:
1203
- img = batch["img"]
1204
- img = img / 255.0
1205
- yield [img]
1206
-
1207
- tpc = get_target_platform_capabilities(tpc_version="4.0", device_type="imx500")
1208
-
1209
- bit_cfg = mct.core.BitWidthConfig()
1210
- if "C2PSA" in self.model.__str__(): # YOLO11
1211
- if self.model.task == "detect":
1212
- layer_names = ["sub", "mul_2", "add_14", "cat_21"]
1213
- weights_memory = 2585350.2439
1214
- n_layers = 238 # 238 layers for fused YOLO11n
1215
- elif self.model.task == "pose":
1216
- layer_names = ["sub", "mul_2", "add_14", "cat_22", "cat_23", "mul_4", "add_15"]
1217
- weights_memory = 2437771.67
1218
- n_layers = 257 # 257 layers for fused YOLO11n-pose
1219
- else: # YOLOv8
1220
- if self.model.task == "detect":
1221
- layer_names = ["sub", "mul", "add_6", "cat_17"]
1222
- weights_memory = 2550540.8
1223
- n_layers = 168 # 168 layers for fused YOLOv8n
1224
- elif self.model.task == "pose":
1225
- layer_names = ["add_7", "mul_2", "cat_19", "mul", "sub", "add_6", "cat_18"]
1226
- weights_memory = 2482451.85
1227
- n_layers = 187 # 187 layers for fused YOLO11n-pose
1228
-
1229
- # Check if the model has the expected number of layers
1230
- if len(list(self.model.modules())) != n_layers:
1231
- raise ValueError("IMX export only supported for YOLOv8n and YOLO11n models.")
1232
-
1233
- for layer_name in layer_names:
1234
- bit_cfg.set_manual_activation_bit_width([mct.core.common.network_editors.NodeNameFilter(layer_name)], 16)
1235
-
1236
- config = mct.core.CoreConfig(
1237
- mixed_precision_config=mct.core.MixedPrecisionQuantizationConfig(num_of_images=10),
1238
- quantization_config=mct.core.QuantizationConfig(concat_threshold_update=True),
1239
- bit_width_config=bit_cfg,
1240
- )
1241
-
1242
- resource_utilization = mct.core.ResourceUtilization(weights_memory=weights_memory)
1243
-
1244
- quant_model = (
1245
- mct.gptq.pytorch_gradient_post_training_quantization( # Perform Gradient-Based Post Training Quantization
1246
- model=self.model,
1247
- representative_data_gen=representative_dataset_gen,
1248
- target_resource_utilization=resource_utilization,
1249
- gptq_config=mct.gptq.get_pytorch_gptq_config(
1250
- n_epochs=1000, use_hessian_based_weights=False, use_hessian_sample_attention=False
1251
- ),
1252
- core_config=config,
1253
- target_platform_capabilities=tpc,
1254
- )[0]
1255
- if gptq
1256
- else mct.ptq.pytorch_post_training_quantization( # Perform post training quantization
1257
- in_module=self.model,
1258
- representative_data_gen=representative_dataset_gen,
1259
- target_resource_utilization=resource_utilization,
1260
- core_config=config,
1261
- target_platform_capabilities=tpc,
1262
- )[0]
1263
- )
1264
-
1265
- class NMSWrapper(torch.nn.Module):
1266
- """Wrap PyTorch Module with multiclass_nms layer from sony_custom_layers."""
1267
-
1268
- def __init__(
1269
- self,
1270
- model: torch.nn.Module,
1271
- score_threshold: float = 0.001,
1272
- iou_threshold: float = 0.7,
1273
- max_detections: int = 300,
1274
- task: str = "detect",
1275
- ):
1276
- """
1277
- Initialize NMSWrapper with PyTorch Module and NMS parameters.
1278
-
1279
- Args:
1280
- model (torch.nn.Module): Model instance.
1281
- score_threshold (float): Score threshold for non-maximum suppression.
1282
- iou_threshold (float): Intersection over union threshold for non-maximum suppression.
1283
- max_detections (int): The number of detections to return.
1284
- task (str): Task type, either 'detect' or 'pose'.
1285
- """
1286
- super().__init__()
1287
- self.model = model
1288
- self.score_threshold = score_threshold
1289
- self.iou_threshold = iou_threshold
1290
- self.max_detections = max_detections
1291
- self.task = task
1292
-
1293
- def forward(self, images):
1294
- """Forward pass with model inference and NMS post-processing."""
1295
- # model inference
1296
- outputs = self.model(images)
1297
-
1298
- boxes, scores = outputs[0], outputs[1]
1299
- nms_outputs = multiclass_nms_with_indices(
1300
- boxes=boxes,
1301
- scores=scores,
1302
- score_threshold=self.score_threshold,
1303
- iou_threshold=self.iou_threshold,
1304
- max_detections=self.max_detections,
1305
- )
1306
- if self.task == "pose":
1307
- kpts = outputs[2] # (bs, max_detections, kpts 17*3)
1308
- out_kpts = torch.gather(kpts, 1, nms_outputs.indices.unsqueeze(-1).expand(-1, -1, kpts.size(-1)))
1309
- return nms_outputs.boxes, nms_outputs.scores, nms_outputs.labels, out_kpts
1310
- return nms_outputs.boxes, nms_outputs.scores, nms_outputs.labels, nms_outputs.n_valid
1311
-
1312
- quant_model = NMSWrapper(
1313
- model=quant_model,
1314
- score_threshold=self.args.conf or 0.001,
1315
- iou_threshold=self.args.iou,
1316
- max_detections=self.args.max_det,
1317
- task=self.model.task,
1318
- ).to(self.device)
1319
-
1320
- f = Path(str(self.file).replace(self.file.suffix, "_imx_model"))
1321
- f.mkdir(exist_ok=True)
1322
- onnx_model = f / Path(str(self.file.name).replace(self.file.suffix, "_imx.onnx")) # js dir
1323
- mct.exporter.pytorch_export_model(
1324
- model=quant_model, save_model_path=onnx_model, repr_dataset=representative_dataset_gen
1325
- )
1326
-
1327
- model_onnx = onnx.load(onnx_model) # load onnx model
1328
- for k, v in self.metadata.items():
1329
- meta = model_onnx.metadata_props.add()
1330
- meta.key, meta.value = k, str(v)
1331
-
1332
- onnx.save(model_onnx, onnx_model)
1333
-
1334
- subprocess.run(
1335
- ["imxconv-pt", "-i", str(onnx_model), "-o", str(f), "--no-input-persistency", "--overwrite-output"],
1336
- check=True,
1185
+ return torch2imx(
1186
+ self.model,
1187
+ self.file,
1188
+ self.args.conf,
1189
+ self.args.iou,
1190
+ self.args.max_det,
1191
+ metadata=self.metadata,
1192
+ dataset=self.get_int8_calibration_dataloader(prefix),
1193
+ prefix=prefix,
1337
1194
  )
1338
1195
 
1339
- # Needed for imx models.
1340
- with open(f / "labels.txt", "w", encoding="utf-8") as file:
1341
- file.writelines([f"{name}\n" for _, name in self.model.names.items()])
1342
-
1343
- return f
1344
-
1345
1196
  def _add_tflite_metadata(self, file):
1346
1197
  """Add metadata to *.tflite models per https://ai.google.dev/edge/litert/models/metadata."""
1347
1198
  import zipfile
@@ -1531,7 +1382,7 @@ class NMSModel(torch.nn.Module):
1531
1382
  for i in range(bs):
1532
1383
  box, cls, score, extra = boxes[i], classes[i], scores[i], extras[i]
1533
1384
  mask = score > self.args.conf
1534
- if self.is_tf:
1385
+ if self.is_tf or (self.args.format == "onnx" and self.obb):
1535
1386
  # TFLite GatherND error if mask is empty
1536
1387
  score *= mask
1537
1388
  # Explicit length otherwise reshape error, hardcoded to `self.args.max_det * 5`
@@ -174,7 +174,22 @@ class BaseTrainer:
174
174
 
175
175
  # Callbacks
176
176
  self.callbacks = _callbacks or callbacks.get_default_callbacks()
177
- if RANK in {-1, 0}:
177
+
178
+ if isinstance(self.args.device, str) and len(self.args.device): # i.e. device='0' or device='0,1,2,3'
179
+ world_size = len(self.args.device.split(","))
180
+ elif isinstance(self.args.device, (tuple, list)): # i.e. device=[0, 1, 2, 3] (multi-GPU from CLI is list)
181
+ world_size = len(self.args.device)
182
+ elif self.args.device in {"cpu", "mps"}: # i.e. device='cpu' or 'mps'
183
+ world_size = 0
184
+ elif torch.cuda.is_available(): # i.e. device=None or device='' or device=number
185
+ world_size = 1 # default to device 0
186
+ else: # i.e. device=None or device=''
187
+ world_size = 0
188
+
189
+ self.ddp = world_size > 1 and "LOCAL_RANK" not in os.environ
190
+ self.world_size = world_size
191
+ # Run subprocess if DDP training, else train normally
192
+ if RANK in {-1, 0} and not self.ddp:
178
193
  callbacks.add_integration_callbacks(self)
179
194
  # Start console logging immediately at trainer initialization
180
195
  self.run_callbacks("on_pretrain_routine_start")
@@ -194,19 +209,8 @@ class BaseTrainer:
194
209
 
195
210
  def train(self):
196
211
  """Allow device='', device=None on Multi-GPU systems to default to device=0."""
197
- if isinstance(self.args.device, str) and len(self.args.device): # i.e. device='0' or device='0,1,2,3'
198
- world_size = len(self.args.device.split(","))
199
- elif isinstance(self.args.device, (tuple, list)): # i.e. device=[0, 1, 2, 3] (multi-GPU from CLI is list)
200
- world_size = len(self.args.device)
201
- elif self.args.device in {"cpu", "mps"}: # i.e. device='cpu' or 'mps'
202
- world_size = 0
203
- elif torch.cuda.is_available(): # i.e. device=None or device='' or device=number
204
- world_size = 1 # default to device 0
205
- else: # i.e. device=None or device=''
206
- world_size = 0
207
-
208
212
  # Run subprocess if DDP training, else train normally
209
- if world_size > 1 and "LOCAL_RANK" not in os.environ:
213
+ if self.ddp:
210
214
  # Argument checks
211
215
  if self.args.rect:
212
216
  LOGGER.warning("'rect=True' is incompatible with Multi-GPU training, setting 'rect=False'")
@@ -218,7 +222,7 @@ class BaseTrainer:
218
222
  self.args.batch = 16
219
223
 
220
224
  # Command
221
- cmd, file = generate_ddp_command(world_size, self)
225
+ cmd, file = generate_ddp_command(self)
222
226
  try:
223
227
  LOGGER.info(f"{colorstr('DDP:')} debug command {' '.join(cmd)}")
224
228
  subprocess.run(cmd, check=True)
@@ -228,7 +232,7 @@ class BaseTrainer:
228
232
  ddp_cleanup(self, str(file))
229
233
 
230
234
  else:
231
- self._do_train(world_size)
235
+ self._do_train()
232
236
 
233
237
  def _setup_scheduler(self):
234
238
  """Initialize training learning rate scheduler."""
@@ -238,20 +242,19 @@ class BaseTrainer:
238
242
  self.lf = lambda x: max(1 - x / self.epochs, 0) * (1.0 - self.args.lrf) + self.args.lrf # linear
239
243
  self.scheduler = optim.lr_scheduler.LambdaLR(self.optimizer, lr_lambda=self.lf)
240
244
 
241
- def _setup_ddp(self, world_size):
245
+ def _setup_ddp(self):
242
246
  """Initialize and set the DistributedDataParallel parameters for training."""
243
247
  torch.cuda.set_device(RANK)
244
248
  self.device = torch.device("cuda", RANK)
245
- # LOGGER.info(f'DDP info: RANK {RANK}, WORLD_SIZE {world_size}, DEVICE {self.device}')
246
249
  os.environ["TORCH_NCCL_BLOCKING_WAIT"] = "1" # set to enforce timeout
247
250
  dist.init_process_group(
248
251
  backend="nccl" if dist.is_nccl_available() else "gloo",
249
252
  timeout=timedelta(seconds=10800), # 3 hours
250
253
  rank=RANK,
251
- world_size=world_size,
254
+ world_size=self.world_size,
252
255
  )
253
256
 
254
- def _setup_train(self, world_size):
257
+ def _setup_train(self):
255
258
  """Build dataloaders and optimizer on correct rank process."""
256
259
  ckpt = self.setup_model()
257
260
  self.model = self.model.to(self.device)
@@ -293,13 +296,13 @@ class BaseTrainer:
293
296
  callbacks_backup = callbacks.default_callbacks.copy() # backup callbacks as check_amp() resets them
294
297
  self.amp = torch.tensor(check_amp(self.model), device=self.device)
295
298
  callbacks.default_callbacks = callbacks_backup # restore callbacks
296
- if RANK > -1 and world_size > 1: # DDP
299
+ if RANK > -1 and self.world_size > 1: # DDP
297
300
  dist.broadcast(self.amp.int(), src=0) # broadcast from rank 0 to all other ranks; gloo errors with boolean
298
301
  self.amp = bool(self.amp) # as boolean
299
302
  self.scaler = (
300
303
  torch.amp.GradScaler("cuda", enabled=self.amp) if TORCH_2_4 else torch.cuda.amp.GradScaler(enabled=self.amp)
301
304
  )
302
- if world_size > 1:
305
+ if self.world_size > 1:
303
306
  self.model = nn.parallel.DistributedDataParallel(self.model, device_ids=[RANK], find_unused_parameters=True)
304
307
 
305
308
  # Check imgsz
@@ -312,7 +315,7 @@ class BaseTrainer:
312
315
  self.args.batch = self.batch_size = self.auto_batch()
313
316
 
314
317
  # Dataloaders
315
- batch_size = self.batch_size // max(world_size, 1)
318
+ batch_size = self.batch_size // max(self.world_size, 1)
316
319
  self.train_loader = self.get_dataloader(
317
320
  self.data["train"], batch_size=batch_size, rank=LOCAL_RANK, mode="train"
318
321
  )
@@ -350,11 +353,11 @@ class BaseTrainer:
350
353
  self.scheduler.last_epoch = self.start_epoch - 1 # do not move
351
354
  self.run_callbacks("on_pretrain_routine_end")
352
355
 
353
- def _do_train(self, world_size=1):
356
+ def _do_train(self):
354
357
  """Train the model with the specified world size."""
355
- if world_size > 1:
356
- self._setup_ddp(world_size)
357
- self._setup_train(world_size)
358
+ if self.world_size > 1:
359
+ self._setup_ddp()
360
+ self._setup_train()
358
361
 
359
362
  nb = len(self.train_loader) # number of batches
360
363
  nw = max(round(self.args.warmup_epochs * nb), 100) if self.args.warmup_epochs > 0 else -1 # warmup iterations
@@ -365,7 +368,7 @@ class BaseTrainer:
365
368
  self.run_callbacks("on_train_start")
366
369
  LOGGER.info(
367
370
  f"Image sizes {self.args.imgsz} train, {self.args.imgsz} val\n"
368
- f"Using {self.train_loader.num_workers * (world_size or 1)} dataloader workers\n"
371
+ f"Using {self.train_loader.num_workers * (self.world_size or 1)} dataloader workers\n"
369
372
  f"Logging results to {colorstr('bold', self.save_dir)}\n"
370
373
  f"Starting training for " + (f"{self.args.time} hours..." if self.args.time else f"{self.epochs} epochs...")
371
374
  )
@@ -417,7 +420,7 @@ class BaseTrainer:
417
420
  loss, self.loss_items = unwrap_model(self.model).loss(batch, preds)
418
421
  self.loss = loss.sum()
419
422
  if RANK != -1:
420
- self.loss *= world_size
423
+ self.loss *= self.world_size
421
424
  self.tloss = (
422
425
  (self.tloss * i + self.loss_items) / (i + 1) if self.tloss is not None else self.loss_items
423
426
  )
@@ -341,7 +341,8 @@ class Tuner:
341
341
  hyp[k] = round(min(max(hyp[k], bounds[0]), bounds[1]), 5)
342
342
 
343
343
  # Update types
344
- hyp["close_mosaic"] = int(round(hyp["close_mosaic"]))
344
+ if "close_mosaic" in hyp:
345
+ hyp["close_mosaic"] = int(round(hyp["close_mosaic"]))
345
346
 
346
347
  return hyp
347
348
 
@@ -162,7 +162,7 @@ class Detect(nn.Module):
162
162
  # Inference path
163
163
  shape = x[0].shape # BCHW
164
164
  x_cat = torch.cat([xi.view(shape[0], self.no, -1) for xi in x], 2)
165
- if self.format != "imx" and (self.dynamic or self.shape != shape):
165
+ if self.dynamic or self.shape != shape:
166
166
  self.anchors, self.strides = (x.transpose(0, 1) for x in make_anchors(x, self.stride, 0.5))
167
167
  self.shape = shape
168
168
 
@@ -182,8 +182,6 @@ class Detect(nn.Module):
182
182
  dbox = self.decode_bboxes(self.dfl(box) * norm, self.anchors.unsqueeze(0) * norm[:, :2])
183
183
  else:
184
184
  dbox = self.decode_bboxes(self.dfl(box), self.anchors.unsqueeze(0)) * self.strides
185
- if self.export and self.format == "imx":
186
- return dbox.transpose(1, 2), cls.sigmoid().permute(0, 2, 1)
187
185
  return torch.cat((dbox, cls.sigmoid()), 1)
188
186
 
189
187
  def bias_init(self):
@@ -387,8 +385,6 @@ class Pose(Detect):
387
385
  if self.training:
388
386
  return x, kpt
389
387
  pred_kpt = self.kpts_decode(bs, kpt)
390
- if self.export and self.format == "imx":
391
- return (*x, pred_kpt.permute(0, 2, 1))
392
388
  return torch.cat([x, pred_kpt], 1) if self.export else (torch.cat([x[0], pred_kpt], 1), (x[1], kpt))
393
389
 
394
390
  def kpts_decode(self, bs: int, kpts: torch.Tensor) -> torch.Tensor:
@@ -145,7 +145,7 @@ def benchmark(
145
145
  assert not is_end2end
146
146
  assert not isinstance(model, YOLOWorld), "YOLOWorldv2 IMX exports not supported"
147
147
  assert model.task == "detect", "IMX only supported for detection task"
148
- assert "C2f" in model.__str__(), "IMX only supported for YOLOv8" # TODO: enable for YOLO11
148
+ assert "C2f" in model.__str__(), "IMX only supported for YOLOv8n and YOLO11n"
149
149
  if format == "rknn":
150
150
  assert not isinstance(model, YOLOWorld), "YOLOWorldv2 RKNN exports not supported yet"
151
151
  assert not is_end2end, "End-to-end models not supported by RKNN yet"
@@ -76,12 +76,11 @@ if __name__ == "__main__":
76
76
  return file.name
77
77
 
78
78
 
79
- def generate_ddp_command(world_size: int, trainer):
79
+ def generate_ddp_command(trainer):
80
80
  """
81
81
  Generate command for distributed training.
82
82
 
83
83
  Args:
84
- world_size (int): Number of processes to spawn for distributed training.
85
84
  trainer (ultralytics.engine.trainer.BaseTrainer): The trainer containing configuration for distributed training.
86
85
 
87
86
  Returns:
@@ -95,7 +94,16 @@ def generate_ddp_command(world_size: int, trainer):
95
94
  file = generate_ddp_file(trainer)
96
95
  dist_cmd = "torch.distributed.run" if TORCH_1_9 else "torch.distributed.launch"
97
96
  port = find_free_network_port()
98
- cmd = [sys.executable, "-m", dist_cmd, "--nproc_per_node", f"{world_size}", "--master_port", f"{port}", file]
97
+ cmd = [
98
+ sys.executable,
99
+ "-m",
100
+ dist_cmd,
101
+ "--nproc_per_node",
102
+ f"{trainer.world_size}",
103
+ "--master_port",
104
+ f"{port}",
105
+ file,
106
+ ]
99
107
  return cmd, file
100
108
 
101
109
 
@@ -9,8 +9,10 @@ import torch
9
9
 
10
10
  from ultralytics.utils import IS_JETSON, LOGGER
11
11
 
12
+ from .imx import torch2imx # noqa
12
13
 
13
- def export_onnx(
14
+
15
+ def torch2onnx(
14
16
  torch_model: torch.nn.Module,
15
17
  im: torch.Tensor,
16
18
  onnx_file: str,
@@ -47,7 +49,7 @@ def export_onnx(
47
49
  )
48
50
 
49
51
 
50
- def export_engine(
52
+ def onnx2engine(
51
53
  onnx_file: str,
52
54
  engine_file: str | None = None,
53
55
  workspace: int | None = None,
@@ -98,12 +100,12 @@ def export_engine(
98
100
  # Engine builder
99
101
  builder = trt.Builder(logger)
100
102
  config = builder.create_builder_config()
101
- workspace = int((workspace or 0) * (1 << 30))
103
+ workspace_bytes = int((workspace or 0) * (1 << 30))
102
104
  is_trt10 = int(trt.__version__.split(".", 1)[0]) >= 10 # is TensorRT >= 10
103
- if is_trt10 and workspace > 0:
104
- config.set_memory_pool_limit(trt.MemoryPoolType.WORKSPACE, workspace)
105
- elif workspace > 0: # TensorRT versions 7, 8
106
- config.max_workspace_size = workspace
105
+ if is_trt10 and workspace_bytes > 0:
106
+ config.set_memory_pool_limit(trt.MemoryPoolType.WORKSPACE, workspace_bytes)
107
+ elif workspace_bytes > 0: # TensorRT versions 7, 8
108
+ config.max_workspace_size = workspace_bytes
107
109
  flag = 1 << int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH)
108
110
  network = builder.create_network(flag)
109
111
  half = builder.platform_has_fast_fp16 and half