ultralytics 8.2.26__tar.gz → 8.2.28__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 (223) hide show
  1. {ultralytics-8.2.26 → ultralytics-8.2.28}/PKG-INFO +3 -3
  2. {ultralytics-8.2.26 → ultralytics-8.2.28}/pyproject.toml +2 -2
  3. {ultralytics-8.2.26 → ultralytics-8.2.28}/tests/test_cli.py +17 -15
  4. {ultralytics-8.2.26 → ultralytics-8.2.28}/tests/test_cuda.py +1 -0
  5. {ultralytics-8.2.26 → ultralytics-8.2.28}/tests/test_exports.py +5 -2
  6. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/__init__.py +1 -1
  7. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/default.yaml +1 -1
  8. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/engine/exporter.py +13 -11
  9. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/fastsam/prompt.py +2 -6
  10. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/nn/autobackend.py +3 -1
  11. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/nn/modules/__init__.py +1 -1
  12. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/nn/tasks.py +1 -1
  13. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/benchmarks.py +3 -1
  14. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/ops.py +26 -29
  15. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics.egg-info/PKG-INFO +3 -3
  16. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics.egg-info/requires.txt +2 -2
  17. {ultralytics-8.2.26 → ultralytics-8.2.28}/LICENSE +0 -0
  18. {ultralytics-8.2.26 → ultralytics-8.2.28}/README.md +0 -0
  19. {ultralytics-8.2.26 → ultralytics-8.2.28}/setup.cfg +0 -0
  20. {ultralytics-8.2.26 → ultralytics-8.2.28}/tests/__init__.py +0 -0
  21. {ultralytics-8.2.26 → ultralytics-8.2.28}/tests/conftest.py +0 -0
  22. {ultralytics-8.2.26 → ultralytics-8.2.28}/tests/test_engine.py +0 -0
  23. {ultralytics-8.2.26 → ultralytics-8.2.28}/tests/test_explorer.py +0 -0
  24. {ultralytics-8.2.26 → ultralytics-8.2.28}/tests/test_integrations.py +0 -0
  25. {ultralytics-8.2.26 → ultralytics-8.2.28}/tests/test_python.py +0 -0
  26. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/assets/bus.jpg +0 -0
  27. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/assets/zidane.jpg +0 -0
  28. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/__init__.py +0 -0
  29. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
  30. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
  31. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
  32. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
  33. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
  34. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
  35. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
  36. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/VOC.yaml +0 -0
  37. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
  38. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
  39. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
  40. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
  41. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
  42. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/coco.yaml +0 -0
  43. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
  44. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/coco128.yaml +0 -0
  45. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
  46. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
  47. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/coco8.yaml +0 -0
  48. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
  49. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/dota8.yaml +0 -0
  50. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/lvis.yaml +0 -0
  51. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
  52. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
  53. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/signature.yaml +0 -0
  54. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
  55. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/datasets/xView.yaml +0 -0
  56. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
  57. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
  58. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
  59. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
  60. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
  61. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
  62. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
  63. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
  64. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
  65. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
  66. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
  67. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
  68. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
  69. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
  70. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
  71. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
  72. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
  73. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
  74. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
  75. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
  76. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
  77. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
  78. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
  79. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
  80. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
  81. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
  82. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
  83. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
  84. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
  85. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
  86. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
  87. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/trackers/botsort.yaml +0 -0
  88. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
  89. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/data/__init__.py +0 -0
  90. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/data/annotator.py +0 -0
  91. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/data/augment.py +0 -0
  92. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/data/base.py +0 -0
  93. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/data/build.py +0 -0
  94. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/data/converter.py +0 -0
  95. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/data/dataset.py +0 -0
  96. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/data/explorer/__init__.py +0 -0
  97. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/data/explorer/explorer.py +0 -0
  98. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/data/explorer/gui/__init__.py +0 -0
  99. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/data/explorer/gui/dash.py +0 -0
  100. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/data/explorer/utils.py +0 -0
  101. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/data/loaders.py +0 -0
  102. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/data/split_dota.py +0 -0
  103. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/data/utils.py +0 -0
  104. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/engine/__init__.py +0 -0
  105. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/engine/model.py +0 -0
  106. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/engine/predictor.py +0 -0
  107. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/engine/results.py +0 -0
  108. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/engine/trainer.py +0 -0
  109. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/engine/tuner.py +0 -0
  110. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/engine/validator.py +0 -0
  111. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/hub/__init__.py +0 -0
  112. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/hub/auth.py +0 -0
  113. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/hub/session.py +0 -0
  114. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/hub/utils.py +0 -0
  115. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/__init__.py +0 -0
  116. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/fastsam/__init__.py +0 -0
  117. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/fastsam/model.py +0 -0
  118. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/fastsam/predict.py +0 -0
  119. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/fastsam/utils.py +0 -0
  120. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/fastsam/val.py +0 -0
  121. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/nas/__init__.py +0 -0
  122. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/nas/model.py +0 -0
  123. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/nas/predict.py +0 -0
  124. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/nas/val.py +0 -0
  125. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/rtdetr/__init__.py +0 -0
  126. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/rtdetr/model.py +0 -0
  127. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/rtdetr/predict.py +0 -0
  128. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/rtdetr/train.py +0 -0
  129. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/rtdetr/val.py +0 -0
  130. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/sam/__init__.py +0 -0
  131. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/sam/amg.py +0 -0
  132. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/sam/build.py +0 -0
  133. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/sam/model.py +0 -0
  134. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/sam/modules/__init__.py +0 -0
  135. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/sam/modules/decoders.py +0 -0
  136. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/sam/modules/encoders.py +0 -0
  137. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/sam/modules/sam.py +0 -0
  138. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
  139. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/sam/modules/transformer.py +0 -0
  140. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/sam/predict.py +0 -0
  141. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/utils/__init__.py +0 -0
  142. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/utils/loss.py +0 -0
  143. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/utils/ops.py +0 -0
  144. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/__init__.py +0 -0
  145. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/classify/__init__.py +0 -0
  146. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/classify/predict.py +0 -0
  147. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/classify/train.py +0 -0
  148. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/classify/val.py +0 -0
  149. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/detect/__init__.py +0 -0
  150. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/detect/predict.py +0 -0
  151. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/detect/train.py +0 -0
  152. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/detect/val.py +0 -0
  153. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/model.py +0 -0
  154. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/obb/__init__.py +0 -0
  155. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/obb/predict.py +0 -0
  156. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/obb/train.py +0 -0
  157. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/obb/val.py +0 -0
  158. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/pose/__init__.py +0 -0
  159. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/pose/predict.py +0 -0
  160. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/pose/train.py +0 -0
  161. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/pose/val.py +0 -0
  162. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/segment/__init__.py +0 -0
  163. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/segment/predict.py +0 -0
  164. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/segment/train.py +0 -0
  165. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/segment/val.py +0 -0
  166. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/world/__init__.py +0 -0
  167. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/world/train.py +0 -0
  168. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/models/yolo/world/train_world.py +0 -0
  169. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/nn/__init__.py +0 -0
  170. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/nn/modules/block.py +0 -0
  171. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/nn/modules/conv.py +0 -0
  172. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/nn/modules/head.py +0 -0
  173. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/nn/modules/transformer.py +0 -0
  174. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/nn/modules/utils.py +0 -0
  175. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/solutions/__init__.py +0 -0
  176. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/solutions/ai_gym.py +0 -0
  177. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/solutions/analytics.py +0 -0
  178. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/solutions/distance_calculation.py +0 -0
  179. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/solutions/heatmap.py +0 -0
  180. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/solutions/object_counter.py +0 -0
  181. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/solutions/parking_management.py +0 -0
  182. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/solutions/queue_management.py +0 -0
  183. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/solutions/speed_estimation.py +0 -0
  184. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/trackers/__init__.py +0 -0
  185. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/trackers/basetrack.py +0 -0
  186. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/trackers/bot_sort.py +0 -0
  187. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/trackers/byte_tracker.py +0 -0
  188. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/trackers/track.py +0 -0
  189. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/trackers/utils/__init__.py +0 -0
  190. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/trackers/utils/gmc.py +0 -0
  191. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/trackers/utils/kalman_filter.py +0 -0
  192. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/trackers/utils/matching.py +0 -0
  193. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/__init__.py +0 -0
  194. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/autobatch.py +0 -0
  195. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/callbacks/__init__.py +0 -0
  196. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/callbacks/base.py +0 -0
  197. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/callbacks/clearml.py +0 -0
  198. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/callbacks/comet.py +0 -0
  199. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/callbacks/dvc.py +0 -0
  200. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/callbacks/hub.py +0 -0
  201. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/callbacks/mlflow.py +0 -0
  202. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/callbacks/neptune.py +0 -0
  203. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/callbacks/raytune.py +0 -0
  204. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/callbacks/tensorboard.py +0 -0
  205. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/callbacks/wb.py +0 -0
  206. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/checks.py +0 -0
  207. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/dist.py +0 -0
  208. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/downloads.py +0 -0
  209. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/errors.py +0 -0
  210. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/files.py +0 -0
  211. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/instance.py +0 -0
  212. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/loss.py +0 -0
  213. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/metrics.py +0 -0
  214. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/patches.py +0 -0
  215. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/plotting.py +0 -0
  216. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/tal.py +0 -0
  217. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/torch_utils.py +0 -0
  218. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/triton.py +0 -0
  219. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics/utils/tuner.py +0 -0
  220. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics.egg-info/SOURCES.txt +0 -0
  221. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics.egg-info/dependency_links.txt +0 -0
  222. {ultralytics-8.2.26 → ultralytics-8.2.28}/ultralytics.egg-info/entry_points.txt +0 -0
  223. {ultralytics-8.2.26 → ultralytics-8.2.28}/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.2.26
3
+ Version: 8.2.28
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
@@ -41,9 +41,9 @@ Requires-Dist: torchvision>=0.9.0
41
41
  Requires-Dist: tqdm>=4.64.0
42
42
  Requires-Dist: psutil
43
43
  Requires-Dist: py-cpuinfo
44
- Requires-Dist: thop>=0.1.1
45
44
  Requires-Dist: pandas>=1.1.4
46
45
  Requires-Dist: seaborn>=0.11.0
46
+ Requires-Dist: ultralytics-thop>=0.2.5
47
47
  Provides-Extra: dev
48
48
  Requires-Dist: ipython; extra == "dev"
49
49
  Requires-Dist: check-manifest; extra == "dev"
@@ -56,7 +56,7 @@ Requires-Dist: mkdocs-material>=9.5.9; extra == "dev"
56
56
  Requires-Dist: mkdocstrings[python]; extra == "dev"
57
57
  Requires-Dist: mkdocs-jupyter; extra == "dev"
58
58
  Requires-Dist: mkdocs-redirects; extra == "dev"
59
- Requires-Dist: mkdocs-ultralytics-plugin>=0.0.44; extra == "dev"
59
+ Requires-Dist: mkdocs-ultralytics-plugin>=0.0.45; extra == "dev"
60
60
  Provides-Extra: export
61
61
  Requires-Dist: onnx>=1.12.0; extra == "export"
62
62
  Requires-Dist: coremltools>=7.0; (platform_system != "Windows" and python_version <= "3.11") and extra == "export"
@@ -75,9 +75,9 @@ dependencies = [
75
75
  "tqdm>=4.64.0", # progress bars
76
76
  "psutil", # system utilization
77
77
  "py-cpuinfo", # display CPU info
78
- "thop>=0.1.1", # FLOPs computation
79
78
  "pandas>=1.1.4",
80
79
  "seaborn>=0.11.0", # plotting
80
+ "ultralytics-thop>=0.2.5", # FLOPs computation https://github.com/ultralytics/thop
81
81
  ]
82
82
 
83
83
  # Optional dependencies ------------------------------------------------------------------------------------------------
@@ -94,7 +94,7 @@ dev = [
94
94
  "mkdocstrings[python]",
95
95
  "mkdocs-jupyter", # for notebooks
96
96
  "mkdocs-redirects", # for 301 redirects
97
- "mkdocs-ultralytics-plugin>=0.0.44", # for meta descriptions and images, dates and authors
97
+ "mkdocs-ultralytics-plugin>=0.0.45", # for meta descriptions and images, dates and authors
98
98
  ]
99
99
  export = [
100
100
  "onnx>=1.12.0", # ONNX export
@@ -3,6 +3,7 @@
3
3
  import subprocess
4
4
 
5
5
  import pytest
6
+ from PIL import Image
6
7
 
7
8
  from tests import CUDA_DEVICE_COUNT, CUDA_IS_AVAILABLE
8
9
  from ultralytics.cfg import TASK2DATA, TASK2MODEL, TASKS
@@ -74,26 +75,27 @@ def test_fastsam(task="segment", model=WEIGHTS_DIR / "FastSAM-s.pt", data="coco8
74
75
  sam_model = FastSAM(model) # or FastSAM-x.pt
75
76
 
76
77
  # Run inference on an image
77
- everything_results = sam_model(source, device="cpu", retina_masks=True, imgsz=1024, conf=0.4, iou=0.9)
78
+ for s in (source, Image.open(source)):
79
+ everything_results = sam_model(s, device="cpu", retina_masks=True, imgsz=320, conf=0.4, iou=0.9)
78
80
 
79
- # Remove small regions
80
- new_masks, _ = Predictor.remove_small_regions(everything_results[0].masks.data, min_area=20)
81
+ # Remove small regions
82
+ new_masks, _ = Predictor.remove_small_regions(everything_results[0].masks.data, min_area=20)
81
83
 
82
- # Everything prompt
83
- prompt_process = FastSAMPrompt(source, everything_results, device="cpu")
84
- ann = prompt_process.everything_prompt()
84
+ # Everything prompt
85
+ prompt_process = FastSAMPrompt(s, everything_results, device="cpu")
86
+ ann = prompt_process.everything_prompt()
85
87
 
86
- # Bbox default shape [0,0,0,0] -> [x1,y1,x2,y2]
87
- ann = prompt_process.box_prompt(bbox=[200, 200, 300, 300])
88
+ # Bbox default shape [0,0,0,0] -> [x1,y1,x2,y2]
89
+ ann = prompt_process.box_prompt(bbox=[200, 200, 300, 300])
88
90
 
89
- # Text prompt
90
- ann = prompt_process.text_prompt(text="a photo of a dog")
91
+ # Text prompt
92
+ ann = prompt_process.text_prompt(text="a photo of a dog")
91
93
 
92
- # Point prompt
93
- # Points default [[0,0]] [[x1,y1],[x2,y2]]
94
- # Point_label default [0] [1,0] 0:background, 1:foreground
95
- ann = prompt_process.point_prompt(points=[[200, 200]], pointlabel=[1])
96
- prompt_process.plot(annotations=ann, output="./")
94
+ # Point prompt
95
+ # Points default [[0,0]] [[x1,y1],[x2,y2]]
96
+ # Point_label default [0] [1,0] 0:background, 1:foreground
97
+ ann = prompt_process.point_prompt(points=[[200, 200]], pointlabel=[1])
98
+ prompt_process.plot(annotations=ann, output="./")
97
99
 
98
100
 
99
101
  def test_mobilesam():
@@ -41,6 +41,7 @@ def test_export_engine_matrix(task, dynamic, int8, half, batch):
41
41
  batch=batch,
42
42
  data=TASK2DATA[task],
43
43
  workspace=1, # reduce workspace GB for less resource utilization during testing
44
+ simplify=True, # use 'onnxslim'
44
45
  )
45
46
  YOLO(file)([SOURCE] * batch, imgsz=64 if dynamic else 32) # exported model inference
46
47
  Path(file).unlink() # cleanup
@@ -72,8 +72,10 @@ def test_export_openvino_matrix(task, dynamic, int8, half, batch):
72
72
 
73
73
 
74
74
  @pytest.mark.slow
75
- @pytest.mark.parametrize("task, dynamic, int8, half, batch", product(TASKS, [True, False], [False], [False], [1, 2]))
76
- def test_export_onnx_matrix(task, dynamic, int8, half, batch):
75
+ @pytest.mark.parametrize(
76
+ "task, dynamic, int8, half, batch, simplify", product(TASKS, [True, False], [False], [False], [1, 2], [True, False])
77
+ )
78
+ def test_export_onnx_matrix(task, dynamic, int8, half, batch, simplify):
77
79
  """Test YOLO exports to ONNX format."""
78
80
  file = YOLO(TASK2MODEL[task]).export(
79
81
  format="onnx",
@@ -82,6 +84,7 @@ def test_export_onnx_matrix(task, dynamic, int8, half, batch):
82
84
  int8=int8,
83
85
  half=half,
84
86
  batch=batch,
87
+ simplify=simplify,
85
88
  )
86
89
  YOLO(file)([SOURCE] * batch, imgsz=64 if dynamic else 32) # exported model inference
87
90
  Path(file).unlink() # cleanup
@@ -1,6 +1,6 @@
1
1
  # Ultralytics YOLO 🚀, AGPL-3.0 license
2
2
 
3
- __version__ = "8.2.26"
3
+ __version__ = "8.2.28"
4
4
 
5
5
  import os
6
6
 
@@ -81,7 +81,7 @@ keras: False # (bool) use Kera=s
81
81
  optimize: False # (bool) TorchScript: optimize for mobile
82
82
  int8: False # (bool) CoreML/TF INT8 quantization
83
83
  dynamic: False # (bool) ONNX/TF/TensorRT: dynamic axes
84
- simplify: False # (bool) ONNX: simplify model
84
+ simplify: False # (bool) ONNX: simplify model using `onnxslim`
85
85
  opset: # (int, optional) ONNX: opset version
86
86
  workspace: 4 # (int) TensorRT: workspace size (GB)
87
87
  nms: False # (bool) CoreML: add NMS
@@ -384,7 +384,7 @@ class Exporter:
384
384
  """YOLOv8 ONNX export."""
385
385
  requirements = ["onnx>=1.12.0"]
386
386
  if self.args.simplify:
387
- requirements += ["cmake", "onnxsim>=0.4.33", "onnxruntime" + ("-gpu" if torch.cuda.is_available() else "")]
387
+ requirements += ["onnxslim==0.1.28", "onnxruntime" + ("-gpu" if torch.cuda.is_available() else "")]
388
388
  check_requirements(requirements)
389
389
  import onnx # noqa
390
390
 
@@ -421,14 +421,17 @@ class Exporter:
421
421
  # Simplify
422
422
  if self.args.simplify:
423
423
  try:
424
- import onnxsim
424
+ import onnxslim
425
425
 
426
- LOGGER.info(f"{prefix} simplifying with onnxsim {onnxsim.__version__}...")
427
- # subprocess.run(f'onnxsim "{f}" "{f}"', shell=True)
428
- model_onnx, check = onnxsim.simplify(model_onnx)
429
- assert check, "Simplified ONNX model could not be validated"
426
+ LOGGER.info(f"{prefix} slimming with onnxslim {onnxslim.__version__}...")
427
+ model_onnx = onnxslim.slim(model_onnx)
428
+
429
+ # ONNX Simplifier (deprecated as must be compiled with 'cmake' in aarch64 and Conda CI environments)
430
+ # import onnxsim
431
+ # model_onnx, check = onnxsim.simplify(model_onnx)
432
+ # assert check, "Simplified ONNX model could not be validated"
430
433
  except Exception as e:
431
- LOGGER.info(f"{prefix} simplifier failure: {e}")
434
+ LOGGER.warning(f"{prefix} simplifier failure: {e}")
432
435
 
433
436
  # Metadata
434
437
  for k, v in self.metadata.items():
@@ -672,8 +675,8 @@ class Exporter:
672
675
  def export_engine(self, prefix=colorstr("TensorRT:")):
673
676
  """YOLOv8 TensorRT export https://developer.nvidia.com/tensorrt."""
674
677
  assert self.im.device.type != "cpu", "export running on CPU but must be on GPU, i.e. use 'device=0'"
675
- self.args.simplify = True
676
- f_onnx, _ = self.export_onnx() # run before trt import https://github.com/ultralytics/ultralytics/issues/7016
678
+ # self.args.simplify = True
679
+ f_onnx, _ = self.export_onnx() # run before TRT import https://github.com/ultralytics/ultralytics/issues/7016
677
680
 
678
681
  try:
679
682
  import tensorrt as trt # noqa
@@ -815,13 +818,12 @@ class Exporter:
815
818
  import tensorflow as tf # noqa
816
819
  check_requirements(
817
820
  (
818
- "cmake", # 'cmake' is needed to build onnxsim on aarch64 and Conda runners
819
821
  "keras", # required by onnx2tf package
820
822
  "tf_keras", # required by onnx2tf package
821
823
  "onnx>=1.12.0",
822
824
  "onnx2tf>1.17.5,<=1.22.3",
823
825
  "sng4onnx>=1.0.1",
824
- "onnxsim>=0.4.33",
826
+ "onnxslim==0.1.28",
825
827
  "onnx_graphsurgeon>=0.3.26",
826
828
  "tflite_support<=0.4.3" if IS_JETSON else "tflite_support", # fix ImportError 'GLIBCXX_3.4.29'
827
829
  "flatbuffers>=23.5.26,<100", # update old 'flatbuffers' included inside tensorflow package
@@ -24,6 +24,8 @@ class FastSAMPrompt:
24
24
 
25
25
  def __init__(self, source, results, device="cuda") -> None:
26
26
  """Initializes FastSAMPrompt with given source, results and device, and assigns clip for linear assignment."""
27
+ if isinstance(source, (str, Path)) and os.path.isdir(source):
28
+ raise ValueError(f"FastSAM only accepts image paths and PIL Image sources, not directories.")
27
29
  self.device = device
28
30
  self.results = results
29
31
  self.source = source
@@ -261,8 +263,6 @@ class FastSAMPrompt:
261
263
 
262
264
  def _crop_image(self, format_results):
263
265
  """Crops an image based on provided annotation format and returns cropped images and related data."""
264
- if os.path.isdir(self.source):
265
- raise ValueError(f"'{self.source}' is a directory, not a valid source for this function.")
266
266
  image = Image.fromarray(cv2.cvtColor(self.results[0].orig_img, cv2.COLOR_BGR2RGB))
267
267
  ori_w, ori_h = image.size
268
268
  annotations = format_results
@@ -287,8 +287,6 @@ class FastSAMPrompt:
287
287
  """Modifies the bounding box properties and calculates IoU between masks and bounding box."""
288
288
  if self.results[0].masks is not None:
289
289
  assert bbox[2] != 0 and bbox[3] != 0
290
- if os.path.isdir(self.source):
291
- raise ValueError(f"'{self.source}' is a directory, not a valid source for this function.")
292
290
  masks = self.results[0].masks.data
293
291
  target_height, target_width = self.results[0].orig_shape
294
292
  h = masks.shape[1]
@@ -321,8 +319,6 @@ class FastSAMPrompt:
321
319
  def point_prompt(self, points, pointlabel): # numpy
322
320
  """Adjusts points on detected masks based on user input and returns the modified results."""
323
321
  if self.results[0].masks is not None:
324
- if os.path.isdir(self.source):
325
- raise ValueError(f"'{self.source}' is a directory, not a valid source for this function.")
326
322
  masks = self._format_results(self.results[0], 0)
327
323
  target_height, target_width = self.results[0].orig_shape
328
324
  h = masks[0]["segmentation"].shape[0]
@@ -184,7 +184,7 @@ class AutoBackend(nn.Module):
184
184
  LOGGER.info(f"Loading {w} for ONNX Runtime inference...")
185
185
  check_requirements(("onnx", "onnxruntime-gpu" if cuda else "onnxruntime"))
186
186
  if IS_RASPBERRYPI or IS_JETSON:
187
- # Fix error: module 'numpy.linalg._umath_linalg' has no attribute '_ilp64' when exporting to Tensorflow SavedModel on RPi and Jetson
187
+ # Fix 'numpy.linalg._umath_linalg' has no attribute '_ilp64' for TF SavedModel on RPi and Jetson
188
188
  check_requirements("numpy==1.23.5")
189
189
  import onnxruntime
190
190
 
@@ -620,6 +620,8 @@ class AutoBackend(nn.Module):
620
620
  Args:
621
621
  imgsz (tuple): The shape of the dummy input tensor in the format (batch_size, channels, height, width)
622
622
  """
623
+ import torchvision # noqa (import here so torchvision import time not recorded in postprocess time)
624
+
623
625
  warmup_types = self.pt, self.jit, self.onnx, self.engine, self.saved_model, self.pb, self.triton, self.nn_module
624
626
  if any(warmup_types) and (self.device.type != "cpu" or self.triton):
625
627
  im = torch.empty(*imgsz, dtype=torch.half if self.fp16 else torch.float, device=self.device) # input
@@ -13,7 +13,7 @@ Example:
13
13
  m = Conv(128, 128)
14
14
  f = f'{m._get_name()}.onnx'
15
15
  torch.onnx.export(m, x, f)
16
- os.system(f'onnxsim {f} {f} && open {f}')
16
+ os.system(f'onnxslim {f} {f} && open {f}') # pip install onnxslim
17
17
  ```
18
18
  """
19
19
 
@@ -157,7 +157,7 @@ class BaseModel(nn.Module):
157
157
  None
158
158
  """
159
159
  c = m == self.model[-1] and isinstance(x, list) # is final layer list, copy input as inplace fix
160
- flops = thop.profile(m, inputs=[x.copy() if c else x], verbose=False)[0] / 1e9 * 2 if thop else 0 # FLOPs
160
+ flops = thop.profile(m, inputs=[x.copy() if c else x], verbose=False)[0] / 1e9 * 2 if thop else 0 # GFLOPs
161
161
  t = time_sync()
162
162
  for _ in range(10):
163
163
  m(x.copy() if c else x)
@@ -457,6 +457,8 @@ class ProfileModels:
457
457
 
458
458
  input_tensor = sess.get_inputs()[0]
459
459
  input_type = input_tensor.type
460
+ dynamic = not all(isinstance(dim, int) and dim >= 0 for dim in input_tensor.shape) # dynamic input shape
461
+ input_shape = (1, 3, self.imgsz, self.imgsz) if dynamic else input_tensor.shape
460
462
 
461
463
  # Mapping ONNX datatype to numpy datatype
462
464
  if "float16" in input_type:
@@ -472,7 +474,7 @@ class ProfileModels:
472
474
  else:
473
475
  raise ValueError(f"Unsupported ONNX datatype {input_type}")
474
476
 
475
- input_data = np.random.rand(*input_tensor.shape).astype(input_dtype)
477
+ input_data = np.random.rand(*input_shape).astype(input_dtype)
476
478
  input_name = input_tensor.name
477
479
  output_name = sess.get_outputs()[0].name
478
480
 
@@ -402,7 +402,7 @@ def xyxy2xywh(x):
402
402
  def xywh2xyxy(x):
403
403
  """
404
404
  Convert bounding box coordinates from (x, y, width, height) format to (x1, y1, x2, y2) format where (x1, y1) is the
405
- top-left corner and (x2, y2) is the bottom-right corner.
405
+ top-left corner and (x2, y2) is the bottom-right corner. Note: ops per 2 channels faster than per channel.
406
406
 
407
407
  Args:
408
408
  x (np.ndarray | torch.Tensor): The input bounding box coordinates in (x, y, width, height) format.
@@ -412,12 +412,10 @@ def xywh2xyxy(x):
412
412
  """
413
413
  assert x.shape[-1] == 4, f"input shape last dimension expected 4 but input shape is {x.shape}"
414
414
  y = torch.empty_like(x) if isinstance(x, torch.Tensor) else np.empty_like(x) # faster than clone/copy
415
- dw = x[..., 2] / 2 # half-width
416
- dh = x[..., 3] / 2 # half-height
417
- y[..., 0] = x[..., 0] - dw # top left x
418
- y[..., 1] = x[..., 1] - dh # top left y
419
- y[..., 2] = x[..., 0] + dw # bottom right x
420
- y[..., 3] = x[..., 1] + dh # bottom right y
415
+ xy = x[..., :2] # centers
416
+ wh = x[..., 2:] / 2 # half width-height
417
+ y[..., :2] = xy - wh # top left xy
418
+ y[..., 2:] = xy + wh # bottom right xy
421
419
  return y
422
420
 
423
421
 
@@ -518,59 +516,58 @@ def ltwh2xywh(x):
518
516
  return y
519
517
 
520
518
 
521
- def xyxyxyxy2xywhr(corners):
519
+ def xyxyxyxy2xywhr(x):
522
520
  """
523
521
  Convert batched Oriented Bounding Boxes (OBB) from [xy1, xy2, xy3, xy4] to [xywh, rotation]. Rotation values are
524
522
  expected in degrees from 0 to 90.
525
523
 
526
524
  Args:
527
- corners (numpy.ndarray | torch.Tensor): Input corners of shape (n, 8).
525
+ x (numpy.ndarray | torch.Tensor): Input box corners [xy1, xy2, xy3, xy4] of shape (n, 8).
528
526
 
529
527
  Returns:
530
528
  (numpy.ndarray | torch.Tensor): Converted data in [cx, cy, w, h, rotation] format of shape (n, 5).
531
529
  """
532
- is_torch = isinstance(corners, torch.Tensor)
533
- points = corners.cpu().numpy() if is_torch else corners
534
- points = points.reshape(len(corners), -1, 2)
530
+ is_torch = isinstance(x, torch.Tensor)
531
+ points = x.cpu().numpy() if is_torch else x
532
+ points = points.reshape(len(x), -1, 2)
535
533
  rboxes = []
536
534
  for pts in points:
537
535
  # NOTE: Use cv2.minAreaRect to get accurate xywhr,
538
536
  # especially some objects are cut off by augmentations in dataloader.
539
- (x, y), (w, h), angle = cv2.minAreaRect(pts)
540
- rboxes.append([x, y, w, h, angle / 180 * np.pi])
541
- return (
542
- torch.tensor(rboxes, device=corners.device, dtype=corners.dtype)
543
- if is_torch
544
- else np.asarray(rboxes, dtype=points.dtype)
545
- ) # rboxes
537
+ (cx, cy), (w, h), angle = cv2.minAreaRect(pts)
538
+ rboxes.append([cx, cy, w, h, angle / 180 * np.pi])
539
+ return torch.tensor(rboxes, device=x.device, dtype=x.dtype) if is_torch else np.asarray(rboxes)
546
540
 
547
541
 
548
- def xywhr2xyxyxyxy(rboxes):
542
+ def xywhr2xyxyxyxy(x):
549
543
  """
550
544
  Convert batched Oriented Bounding Boxes (OBB) from [xywh, rotation] to [xy1, xy2, xy3, xy4]. Rotation values should
551
545
  be in degrees from 0 to 90.
552
546
 
553
547
  Args:
554
- rboxes (numpy.ndarray | torch.Tensor): Boxes in [cx, cy, w, h, rotation] format of shape (n, 5) or (b, n, 5).
548
+ x (numpy.ndarray | torch.Tensor): Boxes in [cx, cy, w, h, rotation] format of shape (n, 5) or (b, n, 5).
555
549
 
556
550
  Returns:
557
551
  (numpy.ndarray | torch.Tensor): Converted corner points of shape (n, 4, 2) or (b, n, 4, 2).
558
552
  """
559
- is_numpy = isinstance(rboxes, np.ndarray)
560
- cos, sin = (np.cos, np.sin) if is_numpy else (torch.cos, torch.sin)
553
+ cos, sin, cat, stack = (
554
+ (torch.cos, torch.sin, torch.cat, torch.stack)
555
+ if isinstance(x, torch.Tensor)
556
+ else (np.cos, np.sin, np.concatenate, np.stack)
557
+ )
561
558
 
562
- ctr = rboxes[..., :2]
563
- w, h, angle = (rboxes[..., i : i + 1] for i in range(2, 5))
559
+ ctr = x[..., :2]
560
+ w, h, angle = (x[..., i : i + 1] for i in range(2, 5))
564
561
  cos_value, sin_value = cos(angle), sin(angle)
565
562
  vec1 = [w / 2 * cos_value, w / 2 * sin_value]
566
563
  vec2 = [-h / 2 * sin_value, h / 2 * cos_value]
567
- vec1 = np.concatenate(vec1, axis=-1) if is_numpy else torch.cat(vec1, dim=-1)
568
- vec2 = np.concatenate(vec2, axis=-1) if is_numpy else torch.cat(vec2, dim=-1)
564
+ vec1 = cat(vec1, -1)
565
+ vec2 = cat(vec2, -1)
569
566
  pt1 = ctr + vec1 + vec2
570
567
  pt2 = ctr + vec1 - vec2
571
568
  pt3 = ctr - vec1 - vec2
572
569
  pt4 = ctr - vec1 + vec2
573
- return np.stack([pt1, pt2, pt3, pt4], axis=-2) if is_numpy else torch.stack([pt1, pt2, pt3, pt4], dim=-2)
570
+ return stack([pt1, pt2, pt3, pt4], -2)
574
571
 
575
572
 
576
573
  def ltwh2xyxy(x):
@@ -785,7 +782,7 @@ def regularize_rboxes(rboxes):
785
782
  Regularize rotated boxes in range [0, pi/2].
786
783
 
787
784
  Args:
788
- rboxes (torch.Tensor): (N, 5), xywhr.
785
+ rboxes (torch.Tensor): Input boxes of shape(N, 5) in xywhr format.
789
786
 
790
787
  Returns:
791
788
  (torch.Tensor): The regularized boxes.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ultralytics
3
- Version: 8.2.26
3
+ Version: 8.2.28
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
@@ -41,9 +41,9 @@ Requires-Dist: torchvision>=0.9.0
41
41
  Requires-Dist: tqdm>=4.64.0
42
42
  Requires-Dist: psutil
43
43
  Requires-Dist: py-cpuinfo
44
- Requires-Dist: thop>=0.1.1
45
44
  Requires-Dist: pandas>=1.1.4
46
45
  Requires-Dist: seaborn>=0.11.0
46
+ Requires-Dist: ultralytics-thop>=0.2.5
47
47
  Provides-Extra: dev
48
48
  Requires-Dist: ipython; extra == "dev"
49
49
  Requires-Dist: check-manifest; extra == "dev"
@@ -56,7 +56,7 @@ Requires-Dist: mkdocs-material>=9.5.9; extra == "dev"
56
56
  Requires-Dist: mkdocstrings[python]; extra == "dev"
57
57
  Requires-Dist: mkdocs-jupyter; extra == "dev"
58
58
  Requires-Dist: mkdocs-redirects; extra == "dev"
59
- Requires-Dist: mkdocs-ultralytics-plugin>=0.0.44; extra == "dev"
59
+ Requires-Dist: mkdocs-ultralytics-plugin>=0.0.45; extra == "dev"
60
60
  Provides-Extra: export
61
61
  Requires-Dist: onnx>=1.12.0; extra == "export"
62
62
  Requires-Dist: coremltools>=7.0; (platform_system != "Windows" and python_version <= "3.11") and extra == "export"
@@ -9,9 +9,9 @@ torchvision>=0.9.0
9
9
  tqdm>=4.64.0
10
10
  psutil
11
11
  py-cpuinfo
12
- thop>=0.1.1
13
12
  pandas>=1.1.4
14
13
  seaborn>=0.11.0
14
+ ultralytics-thop>=0.2.5
15
15
 
16
16
  [dev]
17
17
  ipython
@@ -25,7 +25,7 @@ mkdocs-material>=9.5.9
25
25
  mkdocstrings[python]
26
26
  mkdocs-jupyter
27
27
  mkdocs-redirects
28
- mkdocs-ultralytics-plugin>=0.0.44
28
+ mkdocs-ultralytics-plugin>=0.0.45
29
29
 
30
30
  [explorer]
31
31
  lancedb
File without changes
File without changes
File without changes