ultralytics 8.1.44__tar.gz → 8.1.46__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.

Potentially problematic release.


This version of ultralytics might be problematic. Click here for more details.

Files changed (217) hide show
  1. {ultralytics-8.1.44/ultralytics.egg-info → ultralytics-8.1.46}/PKG-INFO +1 -1
  2. {ultralytics-8.1.44 → ultralytics-8.1.46}/pyproject.toml +1 -1
  3. {ultralytics-8.1.44 → ultralytics-8.1.46}/tests/test_cuda.py +7 -0
  4. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/__init__.py +1 -1
  5. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/data/augment.py +7 -2
  6. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/data/base.py +18 -22
  7. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/data/dataset.py +1 -0
  8. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/engine/exporter.py +28 -17
  9. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/engine/tuner.py +1 -1
  10. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/nn/autobackend.py +51 -20
  11. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/utils/__init__.py +30 -6
  12. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/utils/plotting.py +6 -6
  13. {ultralytics-8.1.44 → ultralytics-8.1.46/ultralytics.egg-info}/PKG-INFO +1 -1
  14. {ultralytics-8.1.44 → ultralytics-8.1.46}/LICENSE +0 -0
  15. {ultralytics-8.1.44 → ultralytics-8.1.46}/README.md +0 -0
  16. {ultralytics-8.1.44 → ultralytics-8.1.46}/setup.cfg +0 -0
  17. {ultralytics-8.1.44 → ultralytics-8.1.46}/tests/test_cli.py +0 -0
  18. {ultralytics-8.1.44 → ultralytics-8.1.46}/tests/test_engine.py +0 -0
  19. {ultralytics-8.1.44 → ultralytics-8.1.46}/tests/test_explorer.py +0 -0
  20. {ultralytics-8.1.44 → ultralytics-8.1.46}/tests/test_integrations.py +0 -0
  21. {ultralytics-8.1.44 → ultralytics-8.1.46}/tests/test_python.py +0 -0
  22. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/assets/bus.jpg +0 -0
  23. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/assets/zidane.jpg +0 -0
  24. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/__init__.py +0 -0
  25. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
  26. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
  27. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
  28. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
  29. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
  30. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
  31. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
  32. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/datasets/VOC.yaml +0 -0
  33. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
  34. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
  35. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
  36. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
  37. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
  38. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/datasets/coco.yaml +0 -0
  39. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
  40. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/datasets/coco128.yaml +0 -0
  41. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
  42. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
  43. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/datasets/coco8.yaml +0 -0
  44. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
  45. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/datasets/dota8.yaml +0 -0
  46. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/datasets/lvis.yaml +0 -0
  47. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
  48. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
  49. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
  50. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/datasets/xView.yaml +0 -0
  51. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/default.yaml +0 -0
  52. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
  53. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
  54. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
  55. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
  56. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
  57. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
  58. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
  59. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
  60. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
  61. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
  62. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
  63. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
  64. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
  65. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
  66. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
  67. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
  68. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
  69. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
  70. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
  71. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
  72. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
  73. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
  74. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
  75. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
  76. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
  77. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
  78. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
  79. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
  80. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
  81. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
  82. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
  83. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/trackers/botsort.yaml +0 -0
  84. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
  85. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/data/__init__.py +0 -0
  86. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/data/annotator.py +0 -0
  87. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/data/build.py +0 -0
  88. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/data/converter.py +0 -0
  89. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/data/explorer/__init__.py +0 -0
  90. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/data/explorer/explorer.py +0 -0
  91. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/data/explorer/gui/__init__.py +0 -0
  92. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/data/explorer/gui/dash.py +0 -0
  93. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/data/explorer/utils.py +0 -0
  94. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/data/loaders.py +0 -0
  95. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/data/split_dota.py +0 -0
  96. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/data/utils.py +0 -0
  97. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/engine/__init__.py +0 -0
  98. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/engine/model.py +0 -0
  99. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/engine/predictor.py +0 -0
  100. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/engine/results.py +0 -0
  101. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/engine/trainer.py +0 -0
  102. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/engine/validator.py +0 -0
  103. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/hub/__init__.py +0 -0
  104. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/hub/auth.py +0 -0
  105. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/hub/session.py +0 -0
  106. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/hub/utils.py +0 -0
  107. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/__init__.py +0 -0
  108. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/fastsam/__init__.py +0 -0
  109. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/fastsam/model.py +0 -0
  110. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/fastsam/predict.py +0 -0
  111. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/fastsam/prompt.py +0 -0
  112. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/fastsam/utils.py +0 -0
  113. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/fastsam/val.py +0 -0
  114. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/nas/__init__.py +0 -0
  115. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/nas/model.py +0 -0
  116. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/nas/predict.py +0 -0
  117. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/nas/val.py +0 -0
  118. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/rtdetr/__init__.py +0 -0
  119. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/rtdetr/model.py +0 -0
  120. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/rtdetr/predict.py +0 -0
  121. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/rtdetr/train.py +0 -0
  122. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/rtdetr/val.py +0 -0
  123. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/sam/__init__.py +0 -0
  124. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/sam/amg.py +0 -0
  125. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/sam/build.py +0 -0
  126. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/sam/model.py +0 -0
  127. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/sam/modules/__init__.py +0 -0
  128. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/sam/modules/decoders.py +0 -0
  129. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/sam/modules/encoders.py +0 -0
  130. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/sam/modules/sam.py +0 -0
  131. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
  132. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/sam/modules/transformer.py +0 -0
  133. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/sam/predict.py +0 -0
  134. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/utils/__init__.py +0 -0
  135. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/utils/loss.py +0 -0
  136. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/utils/ops.py +0 -0
  137. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/yolo/__init__.py +0 -0
  138. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/yolo/classify/__init__.py +0 -0
  139. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/yolo/classify/predict.py +0 -0
  140. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/yolo/classify/train.py +0 -0
  141. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/yolo/classify/val.py +0 -0
  142. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/yolo/detect/__init__.py +0 -0
  143. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/yolo/detect/predict.py +0 -0
  144. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/yolo/detect/train.py +0 -0
  145. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/yolo/detect/val.py +0 -0
  146. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/yolo/model.py +0 -0
  147. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/yolo/obb/__init__.py +0 -0
  148. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/yolo/obb/predict.py +0 -0
  149. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/yolo/obb/train.py +0 -0
  150. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/yolo/obb/val.py +0 -0
  151. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/yolo/pose/__init__.py +0 -0
  152. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/yolo/pose/predict.py +0 -0
  153. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/yolo/pose/train.py +0 -0
  154. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/yolo/pose/val.py +0 -0
  155. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/yolo/segment/__init__.py +0 -0
  156. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/yolo/segment/predict.py +0 -0
  157. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/yolo/segment/train.py +0 -0
  158. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/yolo/segment/val.py +0 -0
  159. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/yolo/world/__init__.py +0 -0
  160. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/yolo/world/train.py +0 -0
  161. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/models/yolo/world/train_world.py +0 -0
  162. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/nn/__init__.py +0 -0
  163. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/nn/modules/__init__.py +0 -0
  164. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/nn/modules/block.py +0 -0
  165. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/nn/modules/conv.py +0 -0
  166. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/nn/modules/head.py +0 -0
  167. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/nn/modules/transformer.py +0 -0
  168. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/nn/modules/utils.py +0 -0
  169. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/nn/tasks.py +0 -0
  170. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/solutions/__init__.py +0 -0
  171. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/solutions/ai_gym.py +0 -0
  172. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/solutions/distance_calculation.py +0 -0
  173. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/solutions/heatmap.py +0 -0
  174. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/solutions/object_counter.py +0 -0
  175. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/solutions/queue_management.py +0 -0
  176. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/solutions/speed_estimation.py +0 -0
  177. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/trackers/__init__.py +0 -0
  178. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/trackers/basetrack.py +0 -0
  179. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/trackers/bot_sort.py +0 -0
  180. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/trackers/byte_tracker.py +0 -0
  181. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/trackers/track.py +0 -0
  182. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/trackers/utils/__init__.py +0 -0
  183. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/trackers/utils/gmc.py +0 -0
  184. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/trackers/utils/kalman_filter.py +0 -0
  185. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/trackers/utils/matching.py +0 -0
  186. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/utils/autobatch.py +0 -0
  187. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/utils/benchmarks.py +0 -0
  188. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/utils/callbacks/__init__.py +0 -0
  189. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/utils/callbacks/base.py +0 -0
  190. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/utils/callbacks/clearml.py +0 -0
  191. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/utils/callbacks/comet.py +0 -0
  192. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/utils/callbacks/dvc.py +0 -0
  193. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/utils/callbacks/hub.py +0 -0
  194. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/utils/callbacks/mlflow.py +0 -0
  195. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/utils/callbacks/neptune.py +0 -0
  196. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/utils/callbacks/raytune.py +0 -0
  197. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/utils/callbacks/tensorboard.py +0 -0
  198. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/utils/callbacks/wb.py +0 -0
  199. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/utils/checks.py +0 -0
  200. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/utils/dist.py +0 -0
  201. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/utils/downloads.py +0 -0
  202. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/utils/errors.py +0 -0
  203. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/utils/files.py +0 -0
  204. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/utils/instance.py +0 -0
  205. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/utils/loss.py +0 -0
  206. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/utils/metrics.py +0 -0
  207. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/utils/ops.py +0 -0
  208. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/utils/patches.py +0 -0
  209. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/utils/tal.py +0 -0
  210. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/utils/torch_utils.py +0 -0
  211. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/utils/triton.py +0 -0
  212. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics/utils/tuner.py +0 -0
  213. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics.egg-info/SOURCES.txt +0 -0
  214. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics.egg-info/dependency_links.txt +0 -0
  215. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics.egg-info/entry_points.txt +0 -0
  216. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics.egg-info/requires.txt +0 -0
  217. {ultralytics-8.1.44 → ultralytics-8.1.46}/ultralytics.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ultralytics
3
- Version: 8.1.44
3
+ Version: 8.1.46
4
4
  Summary: Ultralytics YOLOv8 for SOTA object detection, multi-object tracking, instance segmentation, pose estimation and image classification.
5
5
  Author: Glenn Jocher, Ayush Chaurasia, Jing Qiu
6
6
  Maintainer: Glenn Jocher, Ayush Chaurasia, Jing Qiu
@@ -19,7 +19,7 @@
19
19
  # For comprehensive documentation and usage instructions, visit: https://docs.ultralytics.com
20
20
 
21
21
  [build-system]
22
- requires = ["setuptools>=43.0.0", "wheel"]
22
+ requires = ["setuptools>=57.0.0", "wheel"]
23
23
  build-backend = "setuptools.build_meta"
24
24
 
25
25
  # Project settings -----------------------------------------------------------------------------------------------------
@@ -19,6 +19,13 @@ def test_checks():
19
19
  assert torch.cuda.is_available() == CUDA_IS_AVAILABLE
20
20
  assert torch.cuda.device_count() == CUDA_DEVICE_COUNT
21
21
 
22
+ @pytest.mark.slow
23
+ @pytest.mark.skipif(not CUDA_IS_AVAILABLE, reason="CUDA is not available")
24
+ def test_export_engine():
25
+ """Test exporting the YOLO model to NVIDIA TensorRT format."""
26
+ f = YOLO(MODEL).export(format="engine", device=0)
27
+ YOLO(f)(BUS, device=0)
28
+
22
29
 
23
30
  @pytest.mark.skipif(not CUDA_IS_AVAILABLE, reason="CUDA is not available")
24
31
  def test_train():
@@ -1,6 +1,6 @@
1
1
  # Ultralytics YOLO 🚀, AGPL-3.0 license
2
2
 
3
- __version__ = "8.1.44"
3
+ __version__ = "8.1.46"
4
4
 
5
5
  from ultralytics.data.explorer.explorer import Explorer
6
6
  from ultralytics.models import RTDETR, SAM, YOLO, YOLOWorld
@@ -975,17 +975,22 @@ class Format:
975
975
  1 if self.mask_overlap else nl, img.shape[0] // self.mask_ratio, img.shape[1] // self.mask_ratio
976
976
  )
977
977
  labels["masks"] = masks
978
- if self.normalize:
979
- instances.normalize(w, h)
980
978
  labels["img"] = self._format_img(img)
981
979
  labels["cls"] = torch.from_numpy(cls) if nl else torch.zeros(nl)
982
980
  labels["bboxes"] = torch.from_numpy(instances.bboxes) if nl else torch.zeros((nl, 4))
983
981
  if self.return_keypoint:
984
982
  labels["keypoints"] = torch.from_numpy(instances.keypoints)
983
+ if self.normalize:
984
+ labels["keypoints"][..., 0] /= w
985
+ labels["keypoints"][..., 1] /= h
985
986
  if self.return_obb:
986
987
  labels["bboxes"] = (
987
988
  xyxyxyxy2xywhr(torch.from_numpy(instances.segments)) if len(instances.segments) else torch.zeros((0, 5))
988
989
  )
990
+ # NOTE: need to normalize obb in xywhr format for width-height consistency
991
+ if self.normalize:
992
+ labels["bboxes"][:, [0, 2]] /= w
993
+ labels["bboxes"][:, [1, 3]] /= h
989
994
  # Then we can use collate_fn
990
995
  if self.batch_idx:
991
996
  labels["batch_idx"] = torch.zeros(nl)
@@ -81,20 +81,17 @@ class BaseDataset(Dataset):
81
81
  if self.rect:
82
82
  assert self.batch_size is not None
83
83
  self.set_rectangle()
84
- if isinstance(cache, str):
85
- cache = cache.lower()
86
84
 
87
85
  # Buffer thread for mosaic images
88
86
  self.buffer = [] # buffer size = batch size
89
87
  self.max_buffer_length = min((self.ni, self.batch_size * 8, 1000)) if self.augment else 0
90
88
 
91
- # Cache images
92
- if cache == "ram" and not self.check_cache_ram():
93
- cache = False
89
+ # Cache images (options are cache = True, False, None, "ram", "disk")
94
90
  self.ims, self.im_hw0, self.im_hw = [None] * self.ni, [None] * self.ni, [None] * self.ni
95
91
  self.npy_files = [Path(f).with_suffix(".npy") for f in self.im_files]
96
- if cache:
97
- self.cache_images(cache)
92
+ self.cache = cache.lower() if isinstance(cache, str) else "ram" if cache is True else None
93
+ if (self.cache == "ram" and self.check_cache_ram()) or self.cache == "disk":
94
+ self.cache_images()
98
95
 
99
96
  # Transforms
100
97
  self.transforms = self.build_transforms(hyp=hyp)
@@ -122,9 +119,7 @@ class BaseDataset(Dataset):
122
119
  except Exception as e:
123
120
  raise FileNotFoundError(f"{self.prefix}Error loading data from {img_path}\n{HELP_URL}") from e
124
121
  if self.fraction < 1:
125
- # im_files = im_files[: round(len(im_files) * self.fraction)]
126
- num_elements_to_select = round(len(im_files) * self.fraction)
127
- im_files = random.sample(im_files, num_elements_to_select)
122
+ im_files = im_files[: round(len(im_files) * self.fraction)] # retain a fraction of the dataset
128
123
  return im_files
129
124
 
130
125
  def update_labels(self, include_class: Optional[list]):
@@ -177,26 +172,27 @@ class BaseDataset(Dataset):
177
172
  self.buffer.append(i)
178
173
  if len(self.buffer) >= self.max_buffer_length:
179
174
  j = self.buffer.pop(0)
180
- self.ims[j], self.im_hw0[j], self.im_hw[j] = None, None, None
175
+ if self.cache != "ram":
176
+ self.ims[j], self.im_hw0[j], self.im_hw[j] = None, None, None
181
177
 
182
178
  return im, (h0, w0), im.shape[:2]
183
179
 
184
180
  return self.ims[i], self.im_hw0[i], self.im_hw[i]
185
181
 
186
- def cache_images(self, cache):
182
+ def cache_images(self):
187
183
  """Cache images to memory or disk."""
188
184
  b, gb = 0, 1 << 30 # bytes of cached images, bytes per gigabytes
189
- fcn = self.cache_images_to_disk if cache == "disk" else self.load_image
185
+ fcn, storage = (self.cache_images_to_disk, "Disk") if self.cache == "disk" else (self.load_image, "RAM")
190
186
  with ThreadPool(NUM_THREADS) as pool:
191
187
  results = pool.imap(fcn, range(self.ni))
192
188
  pbar = TQDM(enumerate(results), total=self.ni, disable=LOCAL_RANK > 0)
193
189
  for i, x in pbar:
194
- if cache == "disk":
190
+ if self.cache == "disk":
195
191
  b += self.npy_files[i].stat().st_size
196
192
  else: # 'ram'
197
193
  self.ims[i], self.im_hw0[i], self.im_hw[i] = x # im, hw_orig, hw_resized = load_image(self, i)
198
194
  b += self.ims[i].nbytes
199
- pbar.desc = f"{self.prefix}Caching images ({b / gb:.1f}GB {cache})"
195
+ pbar.desc = f"{self.prefix}Caching images ({b / gb:.1f}GB {storage})"
200
196
  pbar.close()
201
197
 
202
198
  def cache_images_to_disk(self, i):
@@ -215,15 +211,15 @@ class BaseDataset(Dataset):
215
211
  b += im.nbytes * ratio**2
216
212
  mem_required = b * self.ni / n * (1 + safety_margin) # GB required to cache dataset into RAM
217
213
  mem = psutil.virtual_memory()
218
- cache = mem_required < mem.available # to cache or not to cache, that is the question
219
- if not cache:
214
+ success = mem_required < mem.available # to cache or not to cache, that is the question
215
+ if not success:
216
+ self.cache = None
220
217
  LOGGER.info(
221
- f'{self.prefix}{mem_required / gb:.1f}GB RAM required to cache images '
222
- f'with {int(safety_margin * 100)}% safety margin but only '
223
- f'{mem.available / gb:.1f}/{mem.total / gb:.1f}GB available, '
224
- f"{'caching images ✅' if cache else 'not caching images ⚠️'}"
218
+ f"{self.prefix}{mem_required / gb:.1f}GB RAM required to cache images "
219
+ f"with {int(safety_margin * 100)}% safety margin but only "
220
+ f"{mem.available / gb:.1f}/{mem.total / gb:.1f}GB available, not caching images ⚠️"
225
221
  )
226
- return cache
222
+ return success
227
223
 
228
224
  def set_rectangle(self):
229
225
  """Sets the shape of bounding boxes for YOLO detections as rectangles."""
@@ -1,4 +1,5 @@
1
1
  # Ultralytics YOLO 🚀, AGPL-3.0 license
2
+
2
3
  import contextlib
3
4
  import json
4
5
  from collections import defaultdict
@@ -529,12 +529,16 @@ class Exporter:
529
529
  f"or in {ROOT}. See PNNX repo for full installation instructions."
530
530
  )
531
531
  system = "macos" if MACOS else "windows" if WINDOWS else "linux-aarch64" if ARM64 else "linux"
532
- _, assets = get_github_assets(repo="pnnx/pnnx", retry=True)
533
- if assets:
534
- url = [x for x in assets if f"{system}.zip" in x][0]
535
- else:
536
- url = f"https://github.com/pnnx/pnnx/releases/download/20240226/pnnx-20240226-{system}.zip"
537
- LOGGER.warning(f"{prefix} WARNING ⚠️ PNNX GitHub assets not found, using default {url}")
532
+
533
+ # PNNX link fixed at 20240226 due to bug in 20240410
534
+ # try:
535
+ # _, assets = get_github_assets(repo="pnnx/pnnx", retry=True)
536
+ # url = [x for x in assets if f"{system}.zip" in x][0]
537
+ # except Exception as e:
538
+ # url = f"https://github.com/pnnx/pnnx/releases/download/20240226/pnnx-20240226-{system}.zip"
539
+ # LOGGER.warning(f"{prefix} WARNING ⚠️ PNNX GitHub assets not found: {e}, using default {url}")
540
+
541
+ url = f"https://github.com/pnnx/pnnx/releases/download/20240226/pnnx-20240226-{system}.zip"
538
542
  asset = attempt_download_asset(url, repo="pnnx/pnnx", release="latest")
539
543
  if check_is_path_safe(Path.cwd(), asset): # avoid path traversal security vulnerability
540
544
  unzip_dir = Path(asset).with_suffix("")
@@ -654,6 +658,7 @@ class Exporter:
654
658
  def export_engine(self, prefix=colorstr("TensorRT:")):
655
659
  """YOLOv8 TensorRT export https://developer.nvidia.com/tensorrt."""
656
660
  assert self.im.device.type != "cpu", "export running on CPU but must be on GPU, i.e. use 'device=0'"
661
+ self.args.simplify = True
657
662
  f_onnx, _ = self.export_onnx() # run before trt import https://github.com/ultralytics/ultralytics/issues/7016
658
663
 
659
664
  try:
@@ -662,12 +667,10 @@ class Exporter:
662
667
  if LINUX:
663
668
  check_requirements("nvidia-tensorrt", cmds="-U --index-url https://pypi.ngc.nvidia.com")
664
669
  import tensorrt as trt # noqa
665
-
666
670
  check_version(trt.__version__, "7.0.0", hard=True) # require tensorrt>=7.0.0
667
671
 
668
- self.args.simplify = True
669
-
670
672
  LOGGER.info(f"\n{prefix} starting export with TensorRT {trt.__version__}...")
673
+ is_trt10 = int(trt.__version__.split(".")[0]) >= 10 # is TensorRT >= 10
671
674
  assert Path(f_onnx).exists(), f"failed to export ONNX file: {f_onnx}"
672
675
  f = self.file.with_suffix(".engine") # TensorRT engine file
673
676
  logger = trt.Logger(trt.Logger.INFO)
@@ -676,7 +679,11 @@ class Exporter:
676
679
 
677
680
  builder = trt.Builder(logger)
678
681
  config = builder.create_builder_config()
679
- config.max_workspace_size = int(self.args.workspace * (1 << 30))
682
+ workspace = int(self.args.workspace * (1 << 30))
683
+ if is_trt10:
684
+ config.set_memory_pool_limit(trt.MemoryPoolType.WORKSPACE, workspace)
685
+ else: # TensorRT versions 7, 8
686
+ config.max_workspace_size = workspace
680
687
  flag = 1 << int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH)
681
688
  network = builder.create_network(flag)
682
689
  parser = trt.OnnxParser(network, logger)
@@ -695,27 +702,31 @@ class Exporter:
695
702
  if shape[0] <= 1:
696
703
  LOGGER.warning(f"{prefix} WARNING ⚠️ 'dynamic=True' model requires max batch size, i.e. 'batch=16'")
697
704
  profile = builder.create_optimization_profile()
705
+ min_shape = (1, shape[1], 32, 32) # minimum input shape
706
+ opt_shape = (max(1, shape[0] // 2), *shape[1:]) # optimal input shape
707
+ max_shape = (*shape[:2], *(max(1, self.args.workspace) * d for d in shape[2:])) # max input shape
698
708
  for inp in inputs:
699
- profile.set_shape(inp.name, (1, *shape[1:]), (max(1, shape[0] // 2), *shape[1:]), shape)
709
+ profile.set_shape(inp.name, min_shape, opt_shape, max_shape)
700
710
  config.add_optimization_profile(profile)
701
711
 
702
- LOGGER.info(
703
- f"{prefix} building FP{16 if builder.platform_has_fast_fp16 and self.args.half else 32} engine as {f}"
704
- )
705
- if builder.platform_has_fast_fp16 and self.args.half:
712
+ half = builder.platform_has_fast_fp16 and self.args.half
713
+ LOGGER.info(f"{prefix} building FP{16 if half else 32} engine as {f}")
714
+ if half:
706
715
  config.set_flag(trt.BuilderFlag.FP16)
707
716
 
717
+ # Free CUDA memory
708
718
  del self.model
709
719
  torch.cuda.empty_cache()
710
720
 
711
721
  # Write file
712
- with builder.build_engine(network, config) as engine, open(f, "wb") as t:
722
+ build = builder.build_serialized_network if is_trt10 else builder.build_engine
723
+ with build(network, config) as engine, open(f, "wb") as t:
713
724
  # Metadata
714
725
  meta = json.dumps(self.metadata)
715
726
  t.write(len(meta).to_bytes(4, byteorder="little", signed=True))
716
727
  t.write(meta.encode())
717
728
  # Model
718
- t.write(engine.serialize())
729
+ t.write(engine if is_trt10 else engine.serialize())
719
730
 
720
731
  return f, None
721
732
 
@@ -218,7 +218,7 @@ class Tuner:
218
218
  for ckpt in weights_dir.glob("*.pt"):
219
219
  shutil.copy2(ckpt, self.tune_dir / "weights")
220
220
  elif cleanup:
221
- shutil.rmtree(ckpt_file.parent) # remove iteration weights/ dir to reduce storage space
221
+ shutil.rmtree(weights_dir, ignore_errors=True) # remove iteration weights/ dir to reduce storage space
222
222
 
223
223
  # Plot tune results
224
224
  plot_tune_results(self.tune_csv)
@@ -234,23 +234,47 @@ class AutoBackend(nn.Module):
234
234
  meta_len = int.from_bytes(f.read(4), byteorder="little") # read metadata length
235
235
  metadata = json.loads(f.read(meta_len).decode("utf-8")) # read metadata
236
236
  model = runtime.deserialize_cuda_engine(f.read()) # read engine
237
- context = model.create_execution_context()
237
+
238
+ # Model context
239
+ try:
240
+ context = model.create_execution_context()
241
+ except Exception as e: # model is None
242
+ LOGGER.error(f"ERROR: TensorRT model exported with a different version than {trt.__version__}\n")
243
+ raise e
244
+
238
245
  bindings = OrderedDict()
239
246
  output_names = []
240
247
  fp16 = False # default updated below
241
248
  dynamic = False
242
- for i in range(model.num_bindings):
243
- name = model.get_binding_name(i)
244
- dtype = trt.nptype(model.get_binding_dtype(i))
245
- if model.binding_is_input(i):
246
- if -1 in tuple(model.get_binding_shape(i)): # dynamic
247
- dynamic = True
248
- context.set_binding_shape(i, tuple(model.get_profile_shape(0, i)[2]))
249
- if dtype == np.float16:
250
- fp16 = True
251
- else: # output
252
- output_names.append(name)
253
- shape = tuple(context.get_binding_shape(i))
249
+ is_trt10 = not hasattr(model, "num_bindings")
250
+ num = range(model.num_io_tensors) if is_trt10 else range(model.num_bindings)
251
+ for i in num:
252
+ if is_trt10:
253
+ name = model.get_tensor_name(i)
254
+ dtype = trt.nptype(model.get_tensor_dtype(name))
255
+ is_input = model.get_tensor_mode(name) == trt.TensorIOMode.INPUT
256
+ if is_input:
257
+ if -1 in tuple(model.get_tensor_shape(name)):
258
+ dynamic = True
259
+ context.set_input_shape(name, tuple(model.get_tensor_profile_shape(name, 0)[1]))
260
+ if dtype == np.float16:
261
+ fp16 = True
262
+ else:
263
+ output_names.append(name)
264
+ shape = tuple(context.get_tensor_shape(name))
265
+ else: # TensorRT < 10.0
266
+ name = model.get_binding_name(i)
267
+ dtype = trt.nptype(model.get_binding_dtype(i))
268
+ is_input = model.binding_is_input(i)
269
+ if model.binding_is_input(i):
270
+ if -1 in tuple(model.get_binding_shape(i)): # dynamic
271
+ dynamic = True
272
+ context.set_binding_shape(i, tuple(model.get_profile_shape(0, i)[1]))
273
+ if dtype == np.float16:
274
+ fp16 = True
275
+ else:
276
+ output_names.append(name)
277
+ shape = tuple(context.get_binding_shape(i))
254
278
  im = torch.from_numpy(np.empty(shape, dtype=dtype)).to(device)
255
279
  bindings[name] = Binding(name, dtype, shape, im, int(im.data_ptr()))
256
280
  binding_addrs = OrderedDict((n, d.ptr) for n, d in bindings.items())
@@ -463,13 +487,20 @@ class AutoBackend(nn.Module):
463
487
 
464
488
  # TensorRT
465
489
  elif self.engine:
466
- if self.dynamic and im.shape != self.bindings["images"].shape:
467
- i = self.model.get_binding_index("images")
468
- self.context.set_binding_shape(i, im.shape) # reshape if dynamic
469
- self.bindings["images"] = self.bindings["images"]._replace(shape=im.shape)
470
- for name in self.output_names:
471
- i = self.model.get_binding_index(name)
472
- self.bindings[name].data.resize_(tuple(self.context.get_binding_shape(i)))
490
+ if self.dynamic or im.shape != self.bindings["images"].shape:
491
+ if self.is_trt10:
492
+ self.context.set_input_shape("images", im.shape)
493
+ self.bindings["images"] = self.bindings["images"]._replace(shape=im.shape)
494
+ for name in self.output_names:
495
+ self.bindings[name].data.resize_(tuple(self.context.get_tensor_shape(name)))
496
+ else:
497
+ i = self.model.get_binding_index("images")
498
+ self.context.set_binding_shape(i, im.shape)
499
+ self.bindings["images"] = self.bindings["images"]._replace(shape=im.shape)
500
+ for name in self.output_names:
501
+ i = self.model.get_binding_index(name)
502
+ self.bindings[name].data.resize_(tuple(self.context.get_binding_shape(i)))
503
+
473
504
  s = self.bindings["images"].shape
474
505
  assert im.shape == s, f"input size {im.shape} {'>' if self.dynamic else 'not equal to'} max model size {s}"
475
506
  self.binding_addrs["images"] = int(im.data_ptr())
@@ -406,6 +406,20 @@ DEFAULT_CFG_KEYS = DEFAULT_CFG_DICT.keys()
406
406
  DEFAULT_CFG = IterableSimpleNamespace(**DEFAULT_CFG_DICT)
407
407
 
408
408
 
409
+ def read_device_model() -> str:
410
+ """
411
+ Reads the device model information from the system and caches it for quick access. Used by is_jetson() and
412
+ is_raspberrypi().
413
+
414
+ Returns:
415
+ (str): Model file contents if read successfully or empty string otherwise.
416
+ """
417
+ with contextlib.suppress(Exception):
418
+ with open("/proc/device-tree/model") as f:
419
+ return f.read()
420
+ return ""
421
+
422
+
409
423
  def is_ubuntu() -> bool:
410
424
  """
411
425
  Check if the OS is Ubuntu.
@@ -473,10 +487,18 @@ def is_raspberrypi() -> bool:
473
487
  Returns:
474
488
  (bool): True if running on a Raspberry Pi, False otherwise.
475
489
  """
476
- with contextlib.suppress(Exception):
477
- with open("/proc/device-tree/model") as f:
478
- return "Raspberry Pi" in f.read()
479
- return False
490
+ return "Raspberry Pi" in PROC_DEVICE_MODEL
491
+
492
+
493
+ def is_jetson() -> bool:
494
+ """
495
+ Determines if the Python environment is running on a Jetson Nano or Jetson Orin device by checking the device model
496
+ information.
497
+
498
+ Returns:
499
+ (bool): True if running on a Jetson Nano or Jetson Orin, False otherwise.
500
+ """
501
+ return "NVIDIA" in PROC_DEVICE_MODEL # i.e. "NVIDIA Jetson Nano" or "NVIDIA Orin NX"
480
502
 
481
503
 
482
504
  def is_online() -> bool:
@@ -658,9 +680,11 @@ def get_user_config_dir(sub_dir="Ultralytics"):
658
680
 
659
681
 
660
682
  # Define constants (required below)
683
+ PROC_DEVICE_MODEL = read_device_model() # is_jetson() and is_raspberrypi() depend on this constant
661
684
  ONLINE = is_online()
662
685
  IS_COLAB = is_colab()
663
686
  IS_DOCKER = is_docker()
687
+ IS_JETSON = is_jetson()
664
688
  IS_JUPYTER = is_jupyter()
665
689
  IS_KAGGLE = is_kaggle()
666
690
  IS_PIP_PACKAGE = is_pip_package()
@@ -696,8 +720,8 @@ def colorstr(*input):
696
720
  (str): The input string wrapped with ANSI escape codes for the specified color and style.
697
721
 
698
722
  Examples:
699
- >>> colorstr('blue', 'bold', 'hello world')
700
- >>> '\033[34m\033[1mhello world\033[0m'
723
+ >>> colorstr("blue", "bold", "hello world")
724
+ >>> "\033[34m\033[1mhello world\033[0m"
701
725
  """
702
726
  *args, string = input if len(input) > 1 else ("blue", "bold", input[0]) # color arguments, string
703
727
  colors = {
@@ -838,16 +838,16 @@ def plot_images(
838
838
  if len(bboxes):
839
839
  boxes = bboxes[idx]
840
840
  conf = confs[idx] if confs is not None else None # check for confidence presence (label vs pred)
841
- is_obb = boxes.shape[-1] == 5 # xywhr
842
- boxes = ops.xywhr2xyxyxyxy(boxes) if is_obb else ops.xywh2xyxy(boxes)
843
841
  if len(boxes):
844
842
  if boxes[:, :4].max() <= 1.1: # if normalized with tolerance 0.1
845
- boxes[..., 0::2] *= w # scale to pixels
846
- boxes[..., 1::2] *= h
843
+ boxes[..., [0, 2]] *= w # scale to pixels
844
+ boxes[..., [1, 3]] *= h
847
845
  elif scale < 1: # absolute coords need scale if image scales
848
846
  boxes[..., :4] *= scale
849
- boxes[..., 0::2] += x
850
- boxes[..., 1::2] += y
847
+ boxes[..., 0] += x
848
+ boxes[..., 1] += y
849
+ is_obb = boxes.shape[-1] == 5 # xywhr
850
+ boxes = ops.xywhr2xyxyxyxy(boxes) if is_obb else ops.xywh2xyxy(boxes)
851
851
  for j, box in enumerate(boxes.astype(np.int64).tolist()):
852
852
  c = classes[j]
853
853
  color = colors(c)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ultralytics
3
- Version: 8.1.44
3
+ Version: 8.1.46
4
4
  Summary: Ultralytics YOLOv8 for SOTA object detection, multi-object tracking, instance segmentation, pose estimation and image classification.
5
5
  Author: Glenn Jocher, Ayush Chaurasia, Jing Qiu
6
6
  Maintainer: Glenn Jocher, Ayush Chaurasia, Jing Qiu
File without changes
File without changes
File without changes