ultralytics 8.3.138__tar.gz → 8.3.140__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 (277) hide show
  1. {ultralytics-8.3.138/ultralytics.egg-info → ultralytics-8.3.140}/PKG-INFO +1 -1
  2. {ultralytics-8.3.138 → ultralytics-8.3.140}/tests/test_cuda.py +3 -2
  3. {ultralytics-8.3.138 → ultralytics-8.3.140}/tests/test_python.py +9 -2
  4. {ultralytics-8.3.138 → ultralytics-8.3.140}/tests/test_solutions.py +4 -5
  5. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/__init__.py +1 -1
  6. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/engine/exporter.py +1 -0
  7. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/engine/results.py +2 -209
  8. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/utils/__init__.py +153 -0
  9. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/utils/benchmarks.py +1 -0
  10. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/utils/checks.py +20 -6
  11. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/utils/metrics.py +90 -5
  12. {ultralytics-8.3.138 → ultralytics-8.3.140/ultralytics.egg-info}/PKG-INFO +1 -1
  13. {ultralytics-8.3.138 → ultralytics-8.3.140}/LICENSE +0 -0
  14. {ultralytics-8.3.138 → ultralytics-8.3.140}/README.md +0 -0
  15. {ultralytics-8.3.138 → ultralytics-8.3.140}/pyproject.toml +0 -0
  16. {ultralytics-8.3.138 → ultralytics-8.3.140}/setup.cfg +0 -0
  17. {ultralytics-8.3.138 → ultralytics-8.3.140}/tests/__init__.py +0 -0
  18. {ultralytics-8.3.138 → ultralytics-8.3.140}/tests/conftest.py +0 -0
  19. {ultralytics-8.3.138 → ultralytics-8.3.140}/tests/test_cli.py +0 -0
  20. {ultralytics-8.3.138 → ultralytics-8.3.140}/tests/test_engine.py +0 -0
  21. {ultralytics-8.3.138 → ultralytics-8.3.140}/tests/test_exports.py +0 -0
  22. {ultralytics-8.3.138 → ultralytics-8.3.140}/tests/test_integrations.py +0 -0
  23. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/assets/bus.jpg +0 -0
  24. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/assets/zidane.jpg +0 -0
  25. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/__init__.py +0 -0
  26. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
  27. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
  28. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
  29. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
  30. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/datasets/HomeObjects-3K.yaml +0 -0
  31. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
  32. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
  33. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
  34. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/datasets/VOC.yaml +0 -0
  35. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
  36. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
  37. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
  38. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
  39. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
  40. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/datasets/coco.yaml +0 -0
  41. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
  42. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/datasets/coco128.yaml +0 -0
  43. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/datasets/coco8-multispectral.yaml +0 -0
  44. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
  45. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
  46. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/datasets/coco8.yaml +0 -0
  47. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
  48. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/datasets/dog-pose.yaml +0 -0
  49. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/datasets/dota8-multispectral.yaml +0 -0
  50. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/datasets/dota8.yaml +0 -0
  51. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/datasets/hand-keypoints.yaml +0 -0
  52. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/datasets/lvis.yaml +0 -0
  53. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/datasets/medical-pills.yaml +0 -0
  54. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
  55. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
  56. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/datasets/signature.yaml +0 -0
  57. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
  58. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/datasets/xView.yaml +0 -0
  59. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/default.yaml +0 -0
  60. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/11/yolo11-cls-resnet18.yaml +0 -0
  61. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/11/yolo11-cls.yaml +0 -0
  62. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/11/yolo11-obb.yaml +0 -0
  63. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/11/yolo11-pose.yaml +0 -0
  64. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/11/yolo11-seg.yaml +0 -0
  65. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/11/yolo11.yaml +0 -0
  66. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/11/yoloe-11-seg.yaml +0 -0
  67. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/11/yoloe-11.yaml +0 -0
  68. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/12/yolo12-cls.yaml +0 -0
  69. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/12/yolo12-obb.yaml +0 -0
  70. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/12/yolo12-pose.yaml +0 -0
  71. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/12/yolo12-seg.yaml +0 -0
  72. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/12/yolo12.yaml +0 -0
  73. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
  74. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
  75. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
  76. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
  77. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/v10/yolov10b.yaml +0 -0
  78. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/v10/yolov10l.yaml +0 -0
  79. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/v10/yolov10m.yaml +0 -0
  80. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/v10/yolov10n.yaml +0 -0
  81. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/v10/yolov10s.yaml +0 -0
  82. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/v10/yolov10x.yaml +0 -0
  83. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
  84. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
  85. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
  86. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
  87. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
  88. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
  89. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/v8/yoloe-v8-seg.yaml +0 -0
  90. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/v8/yoloe-v8.yaml +0 -0
  91. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
  92. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
  93. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
  94. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
  95. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
  96. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
  97. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
  98. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
  99. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
  100. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
  101. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
  102. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
  103. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
  104. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
  105. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
  106. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
  107. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
  108. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
  109. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
  110. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
  111. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
  112. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/v9/yolov9m.yaml +0 -0
  113. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/v9/yolov9s.yaml +0 -0
  114. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/models/v9/yolov9t.yaml +0 -0
  115. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/trackers/botsort.yaml +0 -0
  116. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
  117. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/data/__init__.py +0 -0
  118. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/data/annotator.py +0 -0
  119. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/data/augment.py +0 -0
  120. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/data/base.py +0 -0
  121. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/data/build.py +0 -0
  122. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/data/converter.py +0 -0
  123. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/data/dataset.py +0 -0
  124. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/data/loaders.py +0 -0
  125. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/data/scripts/download_weights.sh +0 -0
  126. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/data/scripts/get_coco.sh +0 -0
  127. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/data/scripts/get_coco128.sh +0 -0
  128. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/data/scripts/get_imagenet.sh +0 -0
  129. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/data/split.py +0 -0
  130. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/data/split_dota.py +0 -0
  131. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/data/utils.py +0 -0
  132. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/engine/__init__.py +0 -0
  133. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/engine/model.py +0 -0
  134. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/engine/predictor.py +0 -0
  135. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/engine/trainer.py +0 -0
  136. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/engine/tuner.py +0 -0
  137. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/engine/validator.py +0 -0
  138. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/hub/__init__.py +0 -0
  139. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/hub/auth.py +0 -0
  140. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/hub/google/__init__.py +0 -0
  141. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/hub/session.py +0 -0
  142. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/hub/utils.py +0 -0
  143. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/__init__.py +0 -0
  144. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/fastsam/__init__.py +0 -0
  145. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/fastsam/model.py +0 -0
  146. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/fastsam/predict.py +0 -0
  147. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/fastsam/utils.py +0 -0
  148. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/fastsam/val.py +0 -0
  149. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/nas/__init__.py +0 -0
  150. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/nas/model.py +0 -0
  151. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/nas/predict.py +0 -0
  152. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/nas/val.py +0 -0
  153. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/rtdetr/__init__.py +0 -0
  154. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/rtdetr/model.py +0 -0
  155. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/rtdetr/predict.py +0 -0
  156. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/rtdetr/train.py +0 -0
  157. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/rtdetr/val.py +0 -0
  158. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/sam/__init__.py +0 -0
  159. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/sam/amg.py +0 -0
  160. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/sam/build.py +0 -0
  161. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/sam/model.py +0 -0
  162. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/sam/modules/__init__.py +0 -0
  163. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/sam/modules/blocks.py +0 -0
  164. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/sam/modules/decoders.py +0 -0
  165. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/sam/modules/encoders.py +0 -0
  166. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/sam/modules/memory_attention.py +0 -0
  167. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/sam/modules/sam.py +0 -0
  168. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
  169. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/sam/modules/transformer.py +0 -0
  170. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/sam/modules/utils.py +0 -0
  171. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/sam/predict.py +0 -0
  172. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/utils/__init__.py +0 -0
  173. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/utils/loss.py +0 -0
  174. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/utils/ops.py +0 -0
  175. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/yolo/__init__.py +0 -0
  176. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/yolo/classify/__init__.py +0 -0
  177. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/yolo/classify/predict.py +0 -0
  178. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/yolo/classify/train.py +0 -0
  179. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/yolo/classify/val.py +0 -0
  180. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/yolo/detect/__init__.py +0 -0
  181. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/yolo/detect/predict.py +0 -0
  182. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/yolo/detect/train.py +0 -0
  183. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/yolo/detect/val.py +0 -0
  184. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/yolo/model.py +0 -0
  185. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/yolo/obb/__init__.py +0 -0
  186. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/yolo/obb/predict.py +0 -0
  187. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/yolo/obb/train.py +0 -0
  188. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/yolo/obb/val.py +0 -0
  189. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/yolo/pose/__init__.py +0 -0
  190. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/yolo/pose/predict.py +0 -0
  191. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/yolo/pose/train.py +0 -0
  192. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/yolo/pose/val.py +0 -0
  193. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/yolo/segment/__init__.py +0 -0
  194. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/yolo/segment/predict.py +0 -0
  195. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/yolo/segment/train.py +0 -0
  196. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/yolo/segment/val.py +0 -0
  197. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/yolo/world/__init__.py +0 -0
  198. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/yolo/world/train.py +0 -0
  199. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/yolo/world/train_world.py +0 -0
  200. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/yolo/yoloe/__init__.py +0 -0
  201. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/yolo/yoloe/predict.py +0 -0
  202. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/yolo/yoloe/train.py +0 -0
  203. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/yolo/yoloe/train_seg.py +0 -0
  204. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/models/yolo/yoloe/val.py +0 -0
  205. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/nn/__init__.py +0 -0
  206. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/nn/autobackend.py +0 -0
  207. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/nn/modules/__init__.py +0 -0
  208. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/nn/modules/activation.py +0 -0
  209. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/nn/modules/block.py +0 -0
  210. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/nn/modules/conv.py +0 -0
  211. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/nn/modules/head.py +0 -0
  212. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/nn/modules/transformer.py +0 -0
  213. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/nn/modules/utils.py +0 -0
  214. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/nn/tasks.py +0 -0
  215. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/nn/text_model.py +0 -0
  216. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/solutions/__init__.py +0 -0
  217. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/solutions/ai_gym.py +0 -0
  218. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/solutions/analytics.py +0 -0
  219. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/solutions/config.py +0 -0
  220. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/solutions/distance_calculation.py +0 -0
  221. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/solutions/heatmap.py +0 -0
  222. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/solutions/instance_segmentation.py +0 -0
  223. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/solutions/object_blurrer.py +0 -0
  224. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/solutions/object_counter.py +0 -0
  225. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/solutions/object_cropper.py +0 -0
  226. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/solutions/parking_management.py +0 -0
  227. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/solutions/queue_management.py +0 -0
  228. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/solutions/region_counter.py +0 -0
  229. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/solutions/security_alarm.py +0 -0
  230. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/solutions/similarity_search.py +0 -0
  231. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/solutions/solutions.py +0 -0
  232. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/solutions/speed_estimation.py +0 -0
  233. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/solutions/streamlit_inference.py +0 -0
  234. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/solutions/templates/similarity-search.html +0 -0
  235. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/solutions/trackzone.py +0 -0
  236. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/solutions/vision_eye.py +0 -0
  237. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/trackers/__init__.py +0 -0
  238. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/trackers/basetrack.py +0 -0
  239. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/trackers/bot_sort.py +0 -0
  240. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/trackers/byte_tracker.py +0 -0
  241. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/trackers/track.py +0 -0
  242. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/trackers/utils/__init__.py +0 -0
  243. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/trackers/utils/gmc.py +0 -0
  244. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/trackers/utils/kalman_filter.py +0 -0
  245. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/trackers/utils/matching.py +0 -0
  246. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/utils/autobatch.py +0 -0
  247. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/utils/autodevice.py +0 -0
  248. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/utils/callbacks/__init__.py +0 -0
  249. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/utils/callbacks/base.py +0 -0
  250. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/utils/callbacks/clearml.py +0 -0
  251. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/utils/callbacks/comet.py +0 -0
  252. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/utils/callbacks/dvc.py +0 -0
  253. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/utils/callbacks/hub.py +0 -0
  254. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/utils/callbacks/mlflow.py +0 -0
  255. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/utils/callbacks/neptune.py +0 -0
  256. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/utils/callbacks/raytune.py +0 -0
  257. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/utils/callbacks/tensorboard.py +0 -0
  258. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/utils/callbacks/wb.py +0 -0
  259. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/utils/dist.py +0 -0
  260. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/utils/downloads.py +0 -0
  261. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/utils/errors.py +0 -0
  262. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/utils/export.py +0 -0
  263. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/utils/files.py +0 -0
  264. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/utils/instance.py +0 -0
  265. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/utils/loss.py +0 -0
  266. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/utils/ops.py +0 -0
  267. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/utils/patches.py +0 -0
  268. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/utils/plotting.py +0 -0
  269. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/utils/tal.py +0 -0
  270. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/utils/torch_utils.py +0 -0
  271. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/utils/triton.py +0 -0
  272. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics/utils/tuner.py +0 -0
  273. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics.egg-info/SOURCES.txt +0 -0
  274. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics.egg-info/dependency_links.txt +0 -0
  275. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics.egg-info/entry_points.txt +0 -0
  276. {ultralytics-8.3.138 → ultralytics-8.3.140}/ultralytics.egg-info/requires.txt +0 -0
  277. {ultralytics-8.3.138 → ultralytics-8.3.140}/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.138
3
+ Version: 8.3.140
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>
@@ -41,7 +41,6 @@ def test_amp():
41
41
 
42
42
 
43
43
  @pytest.mark.slow
44
- @pytest.mark.skipif(IS_JETSON, reason="Temporary disable ONNX for Jetson")
45
44
  @pytest.mark.skipif(not DEVICES, reason="No CUDA devices available")
46
45
  @pytest.mark.parametrize(
47
46
  "task, dynamic, int8, half, batch, simplify, nms",
@@ -50,7 +49,9 @@ def test_amp():
50
49
  for task, dynamic, int8, half, batch, simplify, nms in product(
51
50
  TASKS, [True, False], [False], [False], [1, 2], [True, False], [True, False]
52
51
  )
53
- if not ((int8 and half) or (task == "classify" and nms) or (task == "obb" and nms and not TORCH_1_13))
52
+ if not (
53
+ (int8 and half) or (task == "classify" and nms) or (task == "obb" and nms and (not TORCH_1_13 or IS_JETSON))
54
+ )
54
55
  ],
55
56
  )
56
57
  def test_export_onnx_matrix(task, dynamic, int8, half, batch, simplify, nms):
@@ -198,7 +198,13 @@ def test_track_stream():
198
198
 
199
199
  def test_val():
200
200
  """Test the validation mode of the YOLO model."""
201
- YOLO(MODEL).val(data="coco8.yaml", imgsz=32)
201
+ metrics = YOLO(MODEL).val(data="coco8.yaml", imgsz=32)
202
+ metrics.to_df()
203
+ metrics.to_csv()
204
+ metrics.to_xml()
205
+ metrics.to_html()
206
+ metrics.to_json()
207
+ metrics.to_sql()
202
208
 
203
209
 
204
210
  def test_train_scratch():
@@ -264,7 +270,8 @@ def test_predict_callback_and_setup():
264
270
  @pytest.mark.parametrize("model", MODELS)
265
271
  def test_results(model):
266
272
  """Test YOLO model results processing and output in various formats."""
267
- results = YOLO(WEIGHTS_DIR / model)([SOURCE, SOURCE], imgsz=160)
273
+ temp_s = "https://ultralytics.com/images/boats.jpg" if model == "yolo11n-obb.pt" else SOURCE
274
+ results = YOLO(WEIGHTS_DIR / model)([temp_s, temp_s], imgsz=160)
268
275
  for r in results:
269
276
  r = r.cpu().numpy()
270
277
  print(r, len(r), r.path) # print numpy attributes
@@ -12,7 +12,7 @@ import pytest
12
12
 
13
13
  from tests import MODEL, TMP
14
14
  from ultralytics import solutions
15
- from ultralytics.utils import ASSETS_URL, IS_RASPBERRYPI, LINUX, checks
15
+ from ultralytics.utils import ASSETS_URL, IS_RASPBERRYPI, checks
16
16
  from ultralytics.utils.downloads import safe_download
17
17
 
18
18
  # Pre-defined arguments values
@@ -180,10 +180,7 @@ def process_video(solution, video_path, needs_frame_count=False):
180
180
  cap.release()
181
181
 
182
182
 
183
- @pytest.mark.skipif(
184
- (LINUX and checks.IS_PYTHON_3_11) or IS_RASPBERRYPI,
185
- reason="Disabled for testing due to --slow test errors after YOLOE PR.",
186
- )
183
+ @pytest.mark.skipif(IS_RASPBERRYPI, reason="Disabled for testing due to --slow test errors after YOLOE PR.")
187
184
  @pytest.mark.parametrize("name, solution_class, needs_frame_count, video, kwargs", SOLUTIONS)
188
185
  def test_solution(name, solution_class, needs_frame_count, video, kwargs):
189
186
  """Test individual Ultralytics solution."""
@@ -300,6 +297,7 @@ def test_streamlit_handle_video_upload_creates_file():
300
297
  os.remove("ultralytics.mp4")
301
298
 
302
299
 
300
+ @pytest.mark.skipif(IS_RASPBERRYPI, reason="Disabled due to slow performance on Raspberry Pi.")
303
301
  def test_similarity_search_app_init():
304
302
  """Test SearchApp initializes with required attributes."""
305
303
  app = solutions.SearchApp(device="cpu")
@@ -307,6 +305,7 @@ def test_similarity_search_app_init():
307
305
  assert hasattr(app, "run")
308
306
 
309
307
 
308
+ @pytest.mark.skipif(IS_RASPBERRYPI, reason="Disabled due to slow performance on Raspberry Pi.")
310
309
  def test_similarity_search_complete(tmp_path):
311
310
  """Test VisualAISearch end-to-end with sample image and query."""
312
311
  from PIL import Image
@@ -1,6 +1,6 @@
1
1
  # Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
2
2
 
3
- __version__ = "8.3.138"
3
+ __version__ = "8.3.140"
4
4
 
5
5
  import os
6
6
 
@@ -981,6 +981,7 @@ class Exporter:
981
981
  custom_input_op_name_np_data_path=np_data,
982
982
  enable_batchmatmul_unfold=True, # fix lower no. of detected objects on GPU delegate
983
983
  output_signaturedefs=True, # fix error with Attention block group convolution
984
+ disable_group_convolution=self.args.format == "tfjs", # fix TF.js error with group convolution
984
985
  optimization_for_gpu_delegate=True,
985
986
  )
986
987
  YAML.save(f / "metadata.yaml", self.metadata) # add metadata.yaml
@@ -13,8 +13,7 @@ import numpy as np
13
13
  import torch
14
14
 
15
15
  from ultralytics.data.augment import LetterBox
16
- from ultralytics.utils import LOGGER, SimpleClass, ops
17
- from ultralytics.utils.checks import check_requirements
16
+ from ultralytics.utils import LOGGER, DataExportMixin, SimpleClass, ops
18
17
  from ultralytics.utils.plotting import Annotator, colors, save_one_box
19
18
  from ultralytics.utils.torch_utils import smart_inference_mode
20
19
 
@@ -184,7 +183,7 @@ class BaseTensor(SimpleClass):
184
183
  return self.__class__(self.data[idx], self.orig_shape)
185
184
 
186
185
 
187
- class Results(SimpleClass):
186
+ class Results(SimpleClass, DataExportMixin):
188
187
  """
189
188
  A class for storing and manipulating inference results.
190
189
 
@@ -828,212 +827,6 @@ class Results(SimpleClass):
828
827
 
829
828
  return results
830
829
 
831
- def to_df(self, normalize=False, decimals=5):
832
- """
833
- Converts detection results to a Pandas Dataframe.
834
-
835
- This method converts the detection results into Pandas Dataframe format. It includes information
836
- about detected objects such as bounding boxes, class names, confidence scores, and optionally
837
- segmentation masks and keypoints.
838
-
839
- Args:
840
- normalize (bool): Whether to normalize the bounding box coordinates by the image dimensions.
841
- If True, coordinates will be returned as float values between 0 and 1.
842
- decimals (int): Number of decimal places to round the output values to.
843
-
844
- Returns:
845
- (DataFrame): A Pandas Dataframe containing all the information in results in an organized way.
846
-
847
- Examples:
848
- >>> results = model("path/to/image.jpg")
849
- >>> for result in results:
850
- >>> df_result = result.to_df()
851
- >>> print(df_result)
852
- """
853
- import pandas as pd # scope for faster 'import ultralytics'
854
-
855
- return pd.DataFrame(self.summary(normalize=normalize, decimals=decimals))
856
-
857
- def to_csv(self, normalize=False, decimals=5, *args, **kwargs):
858
- """
859
- Converts detection results to a CSV format.
860
-
861
- This method serializes the detection results into a CSV format. It includes information
862
- about detected objects such as bounding boxes, class names, confidence scores, and optionally
863
- segmentation masks and keypoints.
864
-
865
- Args:
866
- normalize (bool): Whether to normalize the bounding box coordinates by the image dimensions.
867
- If True, coordinates will be returned as float values between 0 and 1.
868
- decimals (int): Number of decimal places to round the output values to.
869
- *args (Any): Variable length argument list to be passed to pandas.DataFrame.to_csv().
870
- **kwargs (Any): Arbitrary keyword arguments to be passed to pandas.DataFrame.to_csv().
871
-
872
-
873
- Returns:
874
- (str): CSV containing all the information in results in an organized way.
875
-
876
- Examples:
877
- >>> results = model("path/to/image.jpg")
878
- >>> for result in results:
879
- >>> csv_result = result.to_csv()
880
- >>> print(csv_result)
881
- """
882
- return self.to_df(normalize=normalize, decimals=decimals).to_csv(*args, **kwargs)
883
-
884
- def to_xml(self, normalize=False, decimals=5, *args, **kwargs):
885
- """
886
- Converts detection results to XML format.
887
-
888
- This method serializes the detection results into an XML format. It includes information
889
- about detected objects such as bounding boxes, class names, confidence scores, and optionally
890
- segmentation masks and keypoints.
891
-
892
- Args:
893
- normalize (bool): Whether to normalize the bounding box coordinates by the image dimensions.
894
- If True, coordinates will be returned as float values between 0 and 1.
895
- decimals (int): Number of decimal places to round the output values to.
896
- *args (Any): Variable length argument list to be passed to pandas.DataFrame.to_xml().
897
- **kwargs (Any): Arbitrary keyword arguments to be passed to pandas.DataFrame.to_xml().
898
-
899
- Returns:
900
- (str): An XML string containing all the information in results in an organized way.
901
-
902
- Examples:
903
- >>> results = model("path/to/image.jpg")
904
- >>> for result in results:
905
- >>> xml_result = result.to_xml()
906
- >>> print(xml_result)
907
- """
908
- check_requirements("lxml")
909
- df = self.to_df(normalize=normalize, decimals=decimals)
910
- return '<?xml version="1.0" encoding="utf-8"?>\n<root></root>' if df.empty else df.to_xml(*args, **kwargs)
911
-
912
- def to_html(self, normalize=False, decimals=5, index=False, *args, **kwargs):
913
- """
914
- Converts detection results to HTML format.
915
-
916
- This method serializes the detection results into an HTML format. It includes information
917
- about detected objects such as bounding boxes, class names, confidence scores, and optionally
918
- segmentation masks and keypoints.
919
-
920
- Args:
921
- normalize (bool): Whether to normalize the bounding box coordinates by the image dimensions.
922
- If True, coordinates will be returned as float values between 0 and 1.
923
- decimals (int): Number of decimal places to round the output values to.
924
- index (bool): Whether to include the DataFrame index in the HTML output.
925
- *args (Any): Variable length argument list to be passed to pandas.DataFrame.to_html().
926
- **kwargs (Any): Arbitrary keyword arguments to be passed to pandas.DataFrame.to_html().
927
-
928
- Returns:
929
- (str): An HTML string containing all the information in results in an organized way.
930
-
931
- Examples:
932
- >>> results = model("path/to/image.jpg")
933
- >>> for result in results:
934
- >>> html_result = result.to_html()
935
- >>> print(html_result)
936
- """
937
- df = self.to_df(normalize=normalize, decimals=decimals)
938
- return "<table></table>" if df.empty else df.to_html(index=index, *args, **kwargs)
939
-
940
- def tojson(self, normalize=False, decimals=5):
941
- """Deprecated version of to_json()."""
942
- LOGGER.warning("'result.tojson()' is deprecated, replace with 'result.to_json()'.")
943
- return self.to_json(normalize, decimals)
944
-
945
- def to_json(self, normalize=False, decimals=5):
946
- """
947
- Converts detection results to JSON format.
948
-
949
- This method serializes the detection results into a JSON-compatible format. It includes information
950
- about detected objects such as bounding boxes, class names, confidence scores, and optionally
951
- segmentation masks and keypoints.
952
-
953
- Args:
954
- normalize (bool): Whether to normalize the bounding box coordinates by the image dimensions.
955
- If True, coordinates will be returned as float values between 0 and 1.
956
- decimals (int): Number of decimal places to round the output values to.
957
-
958
- Returns:
959
- (str): A JSON string containing the serialized detection results.
960
-
961
- Examples:
962
- >>> results = model("path/to/image.jpg")
963
- >>> for result in results:
964
- >>> json_result = result.to_json()
965
- >>> print(json_result)
966
-
967
- Notes:
968
- - For classification tasks, the JSON will contain class probabilities instead of bounding boxes.
969
- - For object detection tasks, the JSON will include bounding box coordinates, class names, and
970
- confidence scores.
971
- - If available, segmentation masks and keypoints will also be included in the JSON output.
972
- - The method uses the `summary` method internally to generate the data structure before
973
- converting it to JSON.
974
- """
975
- import json
976
-
977
- return json.dumps(self.summary(normalize=normalize, decimals=decimals), indent=2)
978
-
979
- def to_sql(self, table_name="results", normalize=False, decimals=5, db_path="results.db"):
980
- """
981
- Converts detection results to an SQL-compatible format.
982
-
983
- This method serializes the detection results into a format compatible with SQL databases.
984
- It includes information about detected objects such as bounding boxes, class names, confidence scores,
985
- and optionally segmentation masks, keypoints or oriented bounding boxes.
986
-
987
- Args:
988
- table_name (str): Name of the SQL table where the data will be inserted.
989
- normalize (bool): Whether to normalize the bounding box coordinates by the image dimensions.
990
- If True, coordinates will be returned as float values between 0 and 1.
991
- decimals (int): Number of decimal places to round the bounding boxes values to.
992
- db_path (str): Path to the SQLite database file.
993
-
994
- Examples:
995
- >>> results = model("path/to/image.jpg")
996
- >>> for result in results:
997
- >>> result.to_sql()
998
- """
999
- import json
1000
- import sqlite3
1001
-
1002
- # Convert results to a list of dictionaries
1003
- data = self.summary(normalize=normalize, decimals=decimals)
1004
- if len(data) == 0:
1005
- LOGGER.warning("No results to save to SQL. Results dict is empty.")
1006
- return
1007
-
1008
- # Connect to the SQLite database
1009
- conn = sqlite3.connect(db_path)
1010
- cursor = conn.cursor()
1011
-
1012
- # Create table if it doesn't exist
1013
- columns = (
1014
- "id INTEGER PRIMARY KEY AUTOINCREMENT, class_name TEXT, confidence REAL, box TEXT, masks TEXT, kpts TEXT"
1015
- )
1016
- cursor.execute(f"CREATE TABLE IF NOT EXISTS {table_name} ({columns})")
1017
-
1018
- # Insert data into the table
1019
- for item in data:
1020
- cursor.execute(
1021
- f"INSERT INTO {table_name} (class_name, confidence, box, masks, kpts) VALUES (?, ?, ?, ?, ?)",
1022
- (
1023
- item.get("name"),
1024
- item.get("confidence"),
1025
- json.dumps(item.get("box", {})),
1026
- json.dumps(item.get("segments", {})),
1027
- json.dumps(item.get("keypoints", {})),
1028
- ),
1029
- )
1030
-
1031
- # Commit and close the connection
1032
- conn.commit()
1033
- conn.close()
1034
-
1035
- LOGGER.info(f"Detection results successfully written to SQL table '{table_name}' in database '{db_path}'.")
1036
-
1037
830
 
1038
831
  class Boxes(BaseTensor):
1039
832
  """
@@ -187,6 +187,159 @@ class TQDM(rich.tqdm if TQDM_RICH else tqdm.tqdm):
187
187
  return super().__iter__()
188
188
 
189
189
 
190
+ class DataExportMixin:
191
+ """
192
+ Mixin class for exporting validation metrics or prediction results in various formats.
193
+
194
+ This class provides utilities to export performance metrics (e.g., mAP, precision, recall) or prediction results
195
+ from classification, object detection, segmentation, or pose estimation tasks into various formats, Pandas DataFrame
196
+ CSV, XML, HTML, JSON and SQLite (SQL)
197
+
198
+ Methods:
199
+ to_df(): Convert summary to a Pandas DataFrame.
200
+ to_csv(): Export results as a CSV string.
201
+ to_xml(): Export results as an XML string (requires `lxml`).
202
+ to_html(): Export results as an HTML table.
203
+ to_json(): Export results as a JSON string.
204
+ tojson(): Deprecated alias for `to_json()`.
205
+ to_sql(): Export results to an SQLite database.
206
+
207
+ Examples:
208
+ >>> model = YOLO("yolov8n.pt")
209
+ >>> results = model("image.jpg")
210
+ >>> df = results.to_df()
211
+ >>> print(df)
212
+ >>> csv_data = results.to_csv()
213
+ >>> results.to_sql(table_name="yolo_results")
214
+ """
215
+
216
+ def to_df(self, normalize=False, decimals=5):
217
+ """
218
+ Create a pandas DataFrame from the prediction results summary or validation metrics.
219
+
220
+ Args:
221
+ normalize (bool, optional): Normalize numerical values for easier comparison. Defaults to False.
222
+ decimals (int, optional): Decimal places to round floats. Defaults to 5.
223
+
224
+ Returns:
225
+ (DataFrame): DataFrame containing the summary data.
226
+ """
227
+ import pandas as pd # scope for faster 'import ultralytics'
228
+
229
+ return pd.DataFrame(self.summary(normalize=normalize, decimals=decimals))
230
+
231
+ def to_csv(self, normalize=False, decimals=5):
232
+ """
233
+ Export results to CSV string format.
234
+
235
+ Args:
236
+ normalize (bool, optional): Normalize numeric values. Defaults to False.
237
+ decimals (int, optional): Decimal precision. Defaults to 5.
238
+
239
+ Returns:
240
+ (str): CSV content as string.
241
+ """
242
+ return self.to_df(normalize=normalize, decimals=decimals).to_csv()
243
+
244
+ def to_xml(self, normalize=False, decimals=5):
245
+ """
246
+ Export results to XML format.
247
+
248
+ Args:
249
+ normalize (bool, optional): Normalize numeric values. Defaults to False.
250
+ decimals (int, optional): Decimal precision. Defaults to 5.
251
+
252
+ Returns:
253
+ (str): XML string.
254
+
255
+ Note:
256
+ Requires `lxml` package to be installed.
257
+ """
258
+ from ultralytics.utils.checks import check_requirements
259
+
260
+ check_requirements("lxml")
261
+ df = self.to_df(normalize=normalize, decimals=decimals)
262
+ return '<?xml version="1.0" encoding="utf-8"?>\n<root></root>' if df.empty else df.to_xml()
263
+
264
+ def to_html(self, normalize=False, decimals=5, index=False):
265
+ """
266
+ Export results to HTML table format.
267
+
268
+ Args:
269
+ normalize (bool, optional): Normalize numeric values. Defaults to False.
270
+ decimals (int, optional): Decimal precision. Defaults to 5.
271
+ index (bool, optional): Whether to include index column in the HTML table. Defaults to False.
272
+
273
+ Returns:
274
+ (str): HTML representation of the results.
275
+ """
276
+ df = self.to_df(normalize=normalize, decimals=decimals)
277
+ return "<table></table>" if df.empty else df.to_html(index=index)
278
+
279
+ def tojson(self, normalize=False, decimals=5):
280
+ """Deprecated version of to_json()."""
281
+ LOGGER.warning("'result.tojson()' is deprecated, replace with 'result.to_json()'.")
282
+ return self.to_json(normalize, decimals)
283
+
284
+ def to_json(self, normalize=False, decimals=5):
285
+ """
286
+ Export results to JSON format.
287
+
288
+ Args:
289
+ normalize (bool, optional): Normalize numeric values. Defaults to False.
290
+ decimals (int, optional): Decimal precision. Defaults to 5.
291
+
292
+ Returns:
293
+ (str): JSON-formatted string of the results.
294
+ """
295
+ return self.to_df(normalize=normalize, decimals=decimals).to_json(orient="records", indent=2)
296
+
297
+ def to_sql(self, normalize=False, decimals=5, table_name="results", db_path="results.db"):
298
+ """
299
+ Save results to an SQLite database.
300
+
301
+ Args:
302
+ normalize (bool, optional): Normalize numeric values. Defaults to False.
303
+ decimals (int, optional): Decimal precision. Defaults to 5.
304
+ table_name (str, optional): Name of the SQL table. Defaults to "results".
305
+ db_path (str, optional): SQLite database file path. Defaults to "results.db".
306
+ """
307
+ df = self.to_df(normalize, decimals)
308
+ if df.empty or df.columns.empty: # Exit if df is None or has no columns (i.e., no schema)
309
+ return
310
+
311
+ import sqlite3
312
+
313
+ conn = sqlite3.connect(db_path)
314
+ cursor = conn.cursor()
315
+
316
+ # Dynamically create table schema based on summary to support prediction and validation results export
317
+ columns = []
318
+ for col in df.columns:
319
+ sample_val = df[col].dropna().iloc[0] if not df[col].dropna().empty else ""
320
+ if isinstance(sample_val, dict):
321
+ col_type = "TEXT"
322
+ elif isinstance(sample_val, (float, int)):
323
+ col_type = "REAL"
324
+ else:
325
+ col_type = "TEXT"
326
+ columns.append(f'"{col}" {col_type}') # Quote column names to handle special characters like hyphens
327
+
328
+ # Create table (Drop table from db if it's already exist)
329
+ cursor.execute(f'DROP TABLE IF EXISTS "{table_name}"')
330
+ cursor.execute(f'CREATE TABLE "{table_name}" (id INTEGER PRIMARY KEY AUTOINCREMENT, {", ".join(columns)})')
331
+
332
+ for _, row in df.iterrows():
333
+ values = [json.dumps(v) if isinstance(v, dict) else v for v in row]
334
+ column_names = ", ".join(f'"{col}"' for col in df.columns)
335
+ placeholders = ", ".join("?" for _ in df.columns)
336
+ cursor.execute(f'INSERT INTO "{table_name}" ({column_names}) VALUES ({placeholders})', values)
337
+
338
+ conn.commit()
339
+ conn.close()
340
+ LOGGER.info(f"Results saved to SQL table '{table_name}' in '{db_path}'.")
341
+
342
+
190
343
  class SimpleClass:
191
344
  """
192
345
  A simple base class for creating objects with string representations of their attributes.
@@ -23,6 +23,7 @@ TensorFlow.js | `tfjs` | yolo11n_web_model/
23
23
  PaddlePaddle | `paddle` | yolo11n_paddle_model/
24
24
  MNN | `mnn` | yolo11n.mnn
25
25
  NCNN | `ncnn` | yolo11n_ncnn_model/
26
+ IMX | `imx` | yolo11n_imx_model/
26
27
  RKNN | `rknn` | yolo11n_rknn_model/
27
28
  """
28
29
 
@@ -165,6 +165,15 @@ def check_imgsz(imgsz, stride=32, min_dim=1, max_dim=2, floor=0):
165
165
  return sz
166
166
 
167
167
 
168
+ @functools.lru_cache
169
+ def check_uv():
170
+ """Check if uv is installed and can run successfully."""
171
+ try:
172
+ return subprocess.run(["uv", "-V"], capture_output=True).returncode == 0
173
+ except FileNotFoundError:
174
+ return False
175
+
176
+
168
177
  @functools.lru_cache
169
178
  def check_version(
170
179
  current: str = "0.0.0",
@@ -388,21 +397,27 @@ def check_requirements(requirements=ROOT.parent / "requirements.txt", exclude=()
388
397
  pkgs.append(r)
389
398
 
390
399
  @Retry(times=2, delay=1)
391
- def attempt_install(packages, commands):
392
- """Attempt pip install command with retries on failure."""
393
- return subprocess.check_output(f"pip install --no-cache-dir {packages} {commands}", shell=True).decode()
400
+ def attempt_install(packages, commands, use_uv):
401
+ """Attempt package installation with uv if available, falling back to pip."""
402
+ if use_uv:
403
+ # Note requires --break-system-packages on ARM64 dockerfile
404
+ cmd = f"uv pip install --system --no-cache-dir {packages} {commands} --index-strategy=unsafe-best-match --break-system-packages --prerelease=allow"
405
+ else:
406
+ cmd = f"pip install --no-cache-dir {packages} {commands}"
407
+ return subprocess.check_output(cmd, shell=True).decode()
394
408
 
395
409
  s = " ".join(f'"{x}"' for x in pkgs) # console string
396
410
  if s:
397
411
  if install and AUTOINSTALL: # check environment variable
412
+ # Note uv fails on arm64 macOS and Raspberry Pi runners
398
413
  n = len(pkgs) # number of packages updates
399
414
  LOGGER.info(f"{prefix} Ultralytics requirement{'s' * (n > 1)} {pkgs} not found, attempting AutoUpdate...")
400
415
  try:
401
416
  t = time.time()
402
417
  assert ONLINE, "AutoUpdate skipped (offline)"
403
- LOGGER.info(attempt_install(s, cmds))
418
+ LOGGER.info(attempt_install(s, cmds, use_uv=not ARM64 and check_uv()))
404
419
  dt = time.time() - t
405
- LOGGER.info(f"{prefix} AutoUpdate success ✅ {dt:.1f}s, installed {n} package{'s' * (n > 1)}: {pkgs}")
420
+ LOGGER.info(f"{prefix} AutoUpdate success ✅ {dt:.1f}s")
406
421
  LOGGER.warning(
407
422
  f"{prefix} {colorstr('bold', 'Restart runtime or rerun command for updates to take effect')}\n"
408
423
  )
@@ -894,7 +909,6 @@ check_torchvision() # check torch-torchvision compatibility
894
909
 
895
910
  # Define constants
896
911
  IS_PYTHON_3_8 = PYTHON_VERSION.startswith("3.8")
897
- IS_PYTHON_3_11 = PYTHON_VERSION.startswith("3.11")
898
912
  IS_PYTHON_3_12 = PYTHON_VERSION.startswith("3.12")
899
913
  IS_PYTHON_3_13 = PYTHON_VERSION.startswith("3.13")
900
914