ultralytics 8.2.18__tar.gz → 8.2.20__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 (225) hide show
  1. {ultralytics-8.2.18 → ultralytics-8.2.20}/PKG-INFO +1 -1
  2. {ultralytics-8.2.18 → ultralytics-8.2.20}/tests/test_cli.py +1 -1
  3. {ultralytics-8.2.18 → ultralytics-8.2.20}/tests/test_cuda.py +1 -1
  4. {ultralytics-8.2.18 → ultralytics-8.2.20}/tests/test_engine.py +1 -1
  5. {ultralytics-8.2.18 → ultralytics-8.2.20}/tests/test_exports.py +1 -2
  6. {ultralytics-8.2.18 → ultralytics-8.2.20}/tests/test_integrations.py +1 -1
  7. {ultralytics-8.2.18 → ultralytics-8.2.20}/tests/test_python.py +4 -4
  8. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/__init__.py +1 -1
  9. ultralytics-8.2.20/ultralytics/cfg/datasets/signature.yaml +20 -0
  10. ultralytics-8.2.20/ultralytics/cfg/models/v9/yolov9c-seg.yaml +38 -0
  11. ultralytics-8.2.20/ultralytics/cfg/models/v9/yolov9c.yaml +38 -0
  12. ultralytics-8.2.20/ultralytics/cfg/models/v9/yolov9e-seg.yaml +61 -0
  13. ultralytics-8.2.20/ultralytics/cfg/models/v9/yolov9e.yaml +61 -0
  14. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/data/build.py +1 -1
  15. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/engine/exporter.py +24 -16
  16. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/engine/results.py +1 -1
  17. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/solutions/__init__.py +2 -0
  18. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/solutions/ai_gym.py +3 -3
  19. ultralytics-8.2.20/ultralytics/solutions/analytics.py +197 -0
  20. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics.egg-info/PKG-INFO +1 -1
  21. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics.egg-info/SOURCES.txt +2 -0
  22. ultralytics-8.2.18/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -38
  23. ultralytics-8.2.18/ultralytics/cfg/models/v9/yolov9c.yaml +0 -38
  24. ultralytics-8.2.18/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -61
  25. ultralytics-8.2.18/ultralytics/cfg/models/v9/yolov9e.yaml +0 -61
  26. {ultralytics-8.2.18 → ultralytics-8.2.20}/LICENSE +0 -0
  27. {ultralytics-8.2.18 → ultralytics-8.2.20}/README.md +0 -0
  28. {ultralytics-8.2.18 → ultralytics-8.2.20}/pyproject.toml +0 -0
  29. {ultralytics-8.2.18 → ultralytics-8.2.20}/setup.cfg +0 -0
  30. {ultralytics-8.2.18 → ultralytics-8.2.20}/tests/test_explorer.py +0 -0
  31. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/assets/bus.jpg +0 -0
  32. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/assets/zidane.jpg +0 -0
  33. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/__init__.py +0 -0
  34. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
  35. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
  36. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
  37. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
  38. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
  39. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
  40. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
  41. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/VOC.yaml +0 -0
  42. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
  43. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
  44. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
  45. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
  46. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
  47. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/coco.yaml +0 -0
  48. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
  49. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/coco128.yaml +0 -0
  50. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
  51. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
  52. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/coco8.yaml +0 -0
  53. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
  54. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/dota8.yaml +0 -0
  55. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/lvis.yaml +0 -0
  56. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
  57. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
  58. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
  59. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/datasets/xView.yaml +0 -0
  60. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/default.yaml +0 -0
  61. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
  62. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
  63. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
  64. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
  65. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
  66. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
  67. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
  68. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
  69. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
  70. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
  71. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
  72. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
  73. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
  74. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
  75. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
  76. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
  77. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
  78. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
  79. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
  80. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
  81. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
  82. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
  83. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
  84. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
  85. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
  86. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
  87. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
  88. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/trackers/botsort.yaml +0 -0
  89. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
  90. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/data/__init__.py +0 -0
  91. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/data/annotator.py +0 -0
  92. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/data/augment.py +0 -0
  93. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/data/base.py +0 -0
  94. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/data/converter.py +0 -0
  95. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/data/dataset.py +0 -0
  96. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/data/explorer/__init__.py +0 -0
  97. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/data/explorer/explorer.py +0 -0
  98. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/data/explorer/gui/__init__.py +0 -0
  99. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/data/explorer/gui/dash.py +0 -0
  100. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/data/explorer/utils.py +0 -0
  101. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/data/loaders.py +0 -0
  102. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/data/split_dota.py +0 -0
  103. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/data/utils.py +0 -0
  104. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/engine/__init__.py +0 -0
  105. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/engine/model.py +0 -0
  106. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/engine/predictor.py +0 -0
  107. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/engine/trainer.py +0 -0
  108. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/engine/tuner.py +0 -0
  109. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/engine/validator.py +0 -0
  110. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/hub/__init__.py +0 -0
  111. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/hub/auth.py +0 -0
  112. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/hub/session.py +0 -0
  113. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/hub/utils.py +0 -0
  114. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/__init__.py +0 -0
  115. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/fastsam/__init__.py +0 -0
  116. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/fastsam/model.py +0 -0
  117. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/fastsam/predict.py +0 -0
  118. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/fastsam/prompt.py +0 -0
  119. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/fastsam/utils.py +0 -0
  120. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/fastsam/val.py +0 -0
  121. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/nas/__init__.py +0 -0
  122. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/nas/model.py +0 -0
  123. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/nas/predict.py +0 -0
  124. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/nas/val.py +0 -0
  125. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/rtdetr/__init__.py +0 -0
  126. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/rtdetr/model.py +0 -0
  127. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/rtdetr/predict.py +0 -0
  128. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/rtdetr/train.py +0 -0
  129. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/rtdetr/val.py +0 -0
  130. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/sam/__init__.py +0 -0
  131. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/sam/amg.py +0 -0
  132. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/sam/build.py +0 -0
  133. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/sam/model.py +0 -0
  134. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/sam/modules/__init__.py +0 -0
  135. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/sam/modules/decoders.py +0 -0
  136. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/sam/modules/encoders.py +0 -0
  137. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/sam/modules/sam.py +0 -0
  138. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
  139. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/sam/modules/transformer.py +0 -0
  140. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/sam/predict.py +0 -0
  141. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/utils/__init__.py +0 -0
  142. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/utils/loss.py +0 -0
  143. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/utils/ops.py +0 -0
  144. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/__init__.py +0 -0
  145. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/classify/__init__.py +0 -0
  146. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/classify/predict.py +0 -0
  147. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/classify/train.py +0 -0
  148. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/classify/val.py +0 -0
  149. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/detect/__init__.py +0 -0
  150. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/detect/predict.py +0 -0
  151. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/detect/train.py +0 -0
  152. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/detect/val.py +0 -0
  153. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/model.py +0 -0
  154. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/obb/__init__.py +0 -0
  155. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/obb/predict.py +0 -0
  156. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/obb/train.py +0 -0
  157. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/obb/val.py +0 -0
  158. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/pose/__init__.py +0 -0
  159. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/pose/predict.py +0 -0
  160. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/pose/train.py +0 -0
  161. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/pose/val.py +0 -0
  162. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/segment/__init__.py +0 -0
  163. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/segment/predict.py +0 -0
  164. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/segment/train.py +0 -0
  165. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/segment/val.py +0 -0
  166. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/world/__init__.py +0 -0
  167. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/world/train.py +0 -0
  168. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/models/yolo/world/train_world.py +0 -0
  169. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/nn/__init__.py +0 -0
  170. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/nn/autobackend.py +0 -0
  171. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/nn/modules/__init__.py +0 -0
  172. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/nn/modules/block.py +0 -0
  173. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/nn/modules/conv.py +0 -0
  174. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/nn/modules/head.py +0 -0
  175. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/nn/modules/transformer.py +0 -0
  176. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/nn/modules/utils.py +0 -0
  177. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/nn/tasks.py +0 -0
  178. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/solutions/distance_calculation.py +0 -0
  179. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/solutions/heatmap.py +0 -0
  180. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/solutions/object_counter.py +0 -0
  181. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/solutions/parking_management.py +0 -0
  182. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/solutions/queue_management.py +0 -0
  183. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/solutions/speed_estimation.py +0 -0
  184. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/trackers/__init__.py +0 -0
  185. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/trackers/basetrack.py +0 -0
  186. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/trackers/bot_sort.py +0 -0
  187. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/trackers/byte_tracker.py +0 -0
  188. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/trackers/track.py +0 -0
  189. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/trackers/utils/__init__.py +0 -0
  190. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/trackers/utils/gmc.py +0 -0
  191. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/trackers/utils/kalman_filter.py +0 -0
  192. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/trackers/utils/matching.py +0 -0
  193. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/__init__.py +0 -0
  194. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/autobatch.py +0 -0
  195. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/benchmarks.py +0 -0
  196. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/callbacks/__init__.py +0 -0
  197. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/callbacks/base.py +0 -0
  198. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/callbacks/clearml.py +0 -0
  199. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/callbacks/comet.py +0 -0
  200. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/callbacks/dvc.py +0 -0
  201. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/callbacks/hub.py +0 -0
  202. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/callbacks/mlflow.py +0 -0
  203. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/callbacks/neptune.py +0 -0
  204. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/callbacks/raytune.py +0 -0
  205. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/callbacks/tensorboard.py +0 -0
  206. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/callbacks/wb.py +0 -0
  207. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/checks.py +0 -0
  208. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/dist.py +0 -0
  209. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/downloads.py +0 -0
  210. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/errors.py +0 -0
  211. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/files.py +0 -0
  212. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/instance.py +0 -0
  213. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/loss.py +0 -0
  214. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/metrics.py +0 -0
  215. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/ops.py +0 -0
  216. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/patches.py +0 -0
  217. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/plotting.py +0 -0
  218. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/tal.py +0 -0
  219. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/torch_utils.py +0 -0
  220. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/triton.py +0 -0
  221. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics/utils/tuner.py +0 -0
  222. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics.egg-info/dependency_links.txt +0 -0
  223. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics.egg-info/entry_points.txt +0 -0
  224. {ultralytics-8.2.18 → ultralytics-8.2.20}/ultralytics.egg-info/requires.txt +0 -0
  225. {ultralytics-8.2.18 → ultralytics-8.2.20}/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.18
3
+ Version: 8.2.20
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
@@ -7,7 +7,7 @@ import pytest
7
7
  from ultralytics.cfg import TASK2DATA, TASK2MODEL, TASKS
8
8
  from ultralytics.utils import ASSETS, WEIGHTS_DIR, checks
9
9
 
10
- from . import CUDA_DEVICE_COUNT, CUDA_IS_AVAILABLE
10
+ from tests import CUDA_DEVICE_COUNT, CUDA_IS_AVAILABLE
11
11
 
12
12
  # Constants
13
13
  TASK_MODEL_DATA = [(task, WEIGHTS_DIR / TASK2MODEL[task], TASK2DATA[task]) for task in TASKS]
@@ -10,7 +10,7 @@ from ultralytics import YOLO
10
10
  from ultralytics.utils import ASSETS, WEIGHTS_DIR
11
11
  from ultralytics.cfg import TASK2DATA, TASK2MODEL, TASKS
12
12
 
13
- from . import CUDA_DEVICE_COUNT, CUDA_IS_AVAILABLE, MODEL, SOURCE
13
+ from tests import CUDA_DEVICE_COUNT, CUDA_IS_AVAILABLE, MODEL, SOURCE
14
14
 
15
15
 
16
16
  def test_checks():
@@ -9,7 +9,7 @@ from ultralytics.engine.exporter import Exporter
9
9
  from ultralytics.models.yolo import classify, detect, segment
10
10
  from ultralytics.utils import ASSETS, DEFAULT_CFG, WEIGHTS_DIR
11
11
 
12
- from . import MODEL
12
+ from tests import MODEL
13
13
 
14
14
 
15
15
  def test_func(*args): # noqa
@@ -18,8 +18,7 @@ from ultralytics.utils import (
18
18
  checks,
19
19
  )
20
20
  from ultralytics.utils.torch_utils import TORCH_1_9, TORCH_1_13
21
-
22
- from . import MODEL, SOURCE
21
+ from tests import MODEL, SOURCE
23
22
 
24
23
 
25
24
  def test_export_torchscript():
@@ -12,7 +12,7 @@ from ultralytics import YOLO, download
12
12
  from ultralytics.utils import DATASETS_DIR, SETTINGS
13
13
  from ultralytics.utils.checks import check_requirements
14
14
 
15
- from . import MODEL, SOURCE, TMP
15
+ from tests import MODEL, SOURCE, TMP
16
16
 
17
17
 
18
18
  @pytest.mark.skipif(not check_requirements("ray", install=False), reason="ray[tune] not installed")
@@ -25,10 +25,9 @@ from ultralytics.utils import (
25
25
  Retry,
26
26
  checks,
27
27
  )
28
- from ultralytics.utils.downloads import download
28
+ from ultralytics.utils.downloads import download, is_url
29
29
  from ultralytics.utils.torch_utils import TORCH_1_9
30
-
31
- from . import CFG, IS_TMP_WRITEABLE, MODEL, SOURCE, TMP
30
+ from tests import CFG, IS_TMP_WRITEABLE, MODEL, SOURCE, TMP
32
31
 
33
32
 
34
33
  def test_model_forward():
@@ -102,7 +101,7 @@ def test_predict_img(model_name):
102
101
  def test_predict_visualize(model):
103
102
  """Test model predict methods with 'visualize=True' arguments."""
104
103
  YOLO(WEIGHTS_DIR / model)(SOURCE, imgsz=32, visualize=True)
105
-
104
+
106
105
 
107
106
  def test_predict_grey_and_4ch():
108
107
  """Test YOLO prediction on SOURCE converted to greyscale and 4-channel images."""
@@ -131,6 +130,7 @@ def test_predict_grey_and_4ch():
131
130
 
132
131
  @pytest.mark.slow
133
132
  @pytest.mark.skipif(not ONLINE, reason="environment is offline")
133
+ @pytest.mark.skipif(not is_url("https://youtu.be/G17sBkb38XQ"), reason="YouTube URL issue")
134
134
  @Retry(times=3, delay=10)
135
135
  def test_youtube():
136
136
  """
@@ -1,6 +1,6 @@
1
1
  # Ultralytics YOLO 🚀, AGPL-3.0 license
2
2
 
3
- __version__ = "8.2.18"
3
+ __version__ = "8.2.20"
4
4
 
5
5
  from ultralytics.data.explorer.explorer import Explorer
6
6
  from ultralytics.models import RTDETR, SAM, YOLO, YOLOWorld
@@ -0,0 +1,20 @@
1
+ # Ultralytics YOLO 🚀, AGPL-3.0 license
2
+ # Signature dataset by Ultralytics
3
+ # Documentation: https://docs.ultralytics.com/datasets/detect/signature/
4
+ # Example usage: yolo train data=signature.yaml
5
+ # parent
6
+ # ├── ultralytics
7
+ # └── datasets
8
+ # └── signature ← downloads here (11.2 MB)
9
+
10
+ # Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
11
+ path: ../datasets/signature # dataset root dir
12
+ train: train/images # train images (relative to 'path') 143 images
13
+ val: valid/images # val images (relative to 'path') 35 images
14
+
15
+ # Classes
16
+ names:
17
+ 0: signature
18
+
19
+ # Download script/URL (optional)
20
+ download: https://ultralytics.com/assets/signature.zip
@@ -0,0 +1,38 @@
1
+ # Ultralytics YOLO 🚀, AGPL-3.0 license
2
+ # YOLOv9c-seg
3
+ # 654 layers, 27897120 parameters, 159.4 GFLOPs
4
+
5
+ # parameters
6
+ nc: 80 # number of classes
7
+
8
+ # gelan backbone
9
+ backbone:
10
+ - [-1, 1, Conv, [64, 3, 2]] # 0-P1/2
11
+ - [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
12
+ - [-1, 1, RepNCSPELAN4, [256, 128, 64, 1]] # 2
13
+ - [-1, 1, ADown, [256]] # 3-P3/8
14
+ - [-1, 1, RepNCSPELAN4, [512, 256, 128, 1]] # 4
15
+ - [-1, 1, ADown, [512]] # 5-P4/16
16
+ - [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]] # 6
17
+ - [-1, 1, ADown, [512]] # 7-P5/32
18
+ - [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]] # 8
19
+ - [-1, 1, SPPELAN, [512, 256]] # 9
20
+
21
+ head:
22
+ - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
23
+ - [[-1, 6], 1, Concat, [1]] # cat backbone P4
24
+ - [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]] # 12
25
+
26
+ - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
27
+ - [[-1, 4], 1, Concat, [1]] # cat backbone P3
28
+ - [-1, 1, RepNCSPELAN4, [256, 256, 128, 1]] # 15 (P3/8-small)
29
+
30
+ - [-1, 1, ADown, [256]]
31
+ - [[-1, 12], 1, Concat, [1]] # cat head P4
32
+ - [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]] # 18 (P4/16-medium)
33
+
34
+ - [-1, 1, ADown, [512]]
35
+ - [[-1, 9], 1, Concat, [1]] # cat head P5
36
+ - [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]] # 21 (P5/32-large)
37
+
38
+ - [[15, 18, 21], 1, Segment, [nc, 32, 256]] # Segment(P3, P4, P5)
@@ -0,0 +1,38 @@
1
+ # Ultralytics YOLO 🚀, AGPL-3.0 license
2
+ # YOLOv9c
3
+ # 618 layers, 25590912 parameters, 104.0 GFLOPs
4
+
5
+ # parameters
6
+ nc: 80 # number of classes
7
+
8
+ # gelan backbone
9
+ backbone:
10
+ - [-1, 1, Conv, [64, 3, 2]] # 0-P1/2
11
+ - [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
12
+ - [-1, 1, RepNCSPELAN4, [256, 128, 64, 1]] # 2
13
+ - [-1, 1, ADown, [256]] # 3-P3/8
14
+ - [-1, 1, RepNCSPELAN4, [512, 256, 128, 1]] # 4
15
+ - [-1, 1, ADown, [512]] # 5-P4/16
16
+ - [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]] # 6
17
+ - [-1, 1, ADown, [512]] # 7-P5/32
18
+ - [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]] # 8
19
+ - [-1, 1, SPPELAN, [512, 256]] # 9
20
+
21
+ head:
22
+ - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
23
+ - [[-1, 6], 1, Concat, [1]] # cat backbone P4
24
+ - [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]] # 12
25
+
26
+ - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
27
+ - [[-1, 4], 1, Concat, [1]] # cat backbone P3
28
+ - [-1, 1, RepNCSPELAN4, [256, 256, 128, 1]] # 15 (P3/8-small)
29
+
30
+ - [-1, 1, ADown, [256]]
31
+ - [[-1, 12], 1, Concat, [1]] # cat head P4
32
+ - [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]] # 18 (P4/16-medium)
33
+
34
+ - [-1, 1, ADown, [512]]
35
+ - [[-1, 9], 1, Concat, [1]] # cat head P5
36
+ - [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]] # 21 (P5/32-large)
37
+
38
+ - [[15, 18, 21], 1, Detect, [nc]] # Detect(P3, P4, P5)
@@ -0,0 +1,61 @@
1
+ # Ultralytics YOLO 🚀, AGPL-3.0 license
2
+ # YOLOv9c-seg
3
+ # 1261 layers, 60512800 parameters, 248.4 GFLOPs
4
+
5
+ # parameters
6
+ nc: 80 # number of classes
7
+
8
+ # gelan backbone
9
+ backbone:
10
+ - [-1, 1, Silence, []]
11
+ - [-1, 1, Conv, [64, 3, 2]] # 1-P1/2
12
+ - [-1, 1, Conv, [128, 3, 2]] # 2-P2/4
13
+ - [-1, 1, RepNCSPELAN4, [256, 128, 64, 2]] # 3
14
+ - [-1, 1, ADown, [256]] # 4-P3/8
15
+ - [-1, 1, RepNCSPELAN4, [512, 256, 128, 2]] # 5
16
+ - [-1, 1, ADown, [512]] # 6-P4/16
17
+ - [-1, 1, RepNCSPELAN4, [1024, 512, 256, 2]] # 7
18
+ - [-1, 1, ADown, [1024]] # 8-P5/32
19
+ - [-1, 1, RepNCSPELAN4, [1024, 512, 256, 2]] # 9
20
+
21
+ - [1, 1, CBLinear, [[64]]] # 10
22
+ - [3, 1, CBLinear, [[64, 128]]] # 11
23
+ - [5, 1, CBLinear, [[64, 128, 256]]] # 12
24
+ - [7, 1, CBLinear, [[64, 128, 256, 512]]] # 13
25
+ - [9, 1, CBLinear, [[64, 128, 256, 512, 1024]]] # 14
26
+
27
+ - [0, 1, Conv, [64, 3, 2]] # 15-P1/2
28
+ - [[10, 11, 12, 13, 14, -1], 1, CBFuse, [[0, 0, 0, 0, 0]]] # 16
29
+ - [-1, 1, Conv, [128, 3, 2]] # 17-P2/4
30
+ - [[11, 12, 13, 14, -1], 1, CBFuse, [[1, 1, 1, 1]]] # 18
31
+ - [-1, 1, RepNCSPELAN4, [256, 128, 64, 2]] # 19
32
+ - [-1, 1, ADown, [256]] # 20-P3/8
33
+ - [[12, 13, 14, -1], 1, CBFuse, [[2, 2, 2]]] # 21
34
+ - [-1, 1, RepNCSPELAN4, [512, 256, 128, 2]] # 22
35
+ - [-1, 1, ADown, [512]] # 23-P4/16
36
+ - [[13, 14, -1], 1, CBFuse, [[3, 3]]] # 24
37
+ - [-1, 1, RepNCSPELAN4, [1024, 512, 256, 2]] # 25
38
+ - [-1, 1, ADown, [1024]] # 26-P5/32
39
+ - [[14, -1], 1, CBFuse, [[4]]] # 27
40
+ - [-1, 1, RepNCSPELAN4, [1024, 512, 256, 2]] # 28
41
+ - [-1, 1, SPPELAN, [512, 256]] # 29
42
+
43
+ # gelan head
44
+ head:
45
+ - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
46
+ - [[-1, 25], 1, Concat, [1]] # cat backbone P4
47
+ - [-1, 1, RepNCSPELAN4, [512, 512, 256, 2]] # 32
48
+
49
+ - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
50
+ - [[-1, 22], 1, Concat, [1]] # cat backbone P3
51
+ - [-1, 1, RepNCSPELAN4, [256, 256, 128, 2]] # 35 (P3/8-small)
52
+
53
+ - [-1, 1, ADown, [256]]
54
+ - [[-1, 32], 1, Concat, [1]] # cat head P4
55
+ - [-1, 1, RepNCSPELAN4, [512, 512, 256, 2]] # 38 (P4/16-medium)
56
+
57
+ - [-1, 1, ADown, [512]]
58
+ - [[-1, 29], 1, Concat, [1]] # cat head P5
59
+ - [-1, 1, RepNCSPELAN4, [512, 1024, 512, 2]] # 41 (P5/32-large)
60
+
61
+ - [[35, 38, 41], 1, Segment, [nc, 32, 256]] # Segment (P3, P4, P5)
@@ -0,0 +1,61 @@
1
+ # Ultralytics YOLO 🚀, AGPL-3.0 license
2
+ # YOLOv9e
3
+ # 1225 layers, 58206592 parameters, 193.0 GFLOPs
4
+
5
+ # parameters
6
+ nc: 80 # number of classes
7
+
8
+ # gelan backbone
9
+ backbone:
10
+ - [-1, 1, Silence, []]
11
+ - [-1, 1, Conv, [64, 3, 2]] # 1-P1/2
12
+ - [-1, 1, Conv, [128, 3, 2]] # 2-P2/4
13
+ - [-1, 1, RepNCSPELAN4, [256, 128, 64, 2]] # 3
14
+ - [-1, 1, ADown, [256]] # 4-P3/8
15
+ - [-1, 1, RepNCSPELAN4, [512, 256, 128, 2]] # 5
16
+ - [-1, 1, ADown, [512]] # 6-P4/16
17
+ - [-1, 1, RepNCSPELAN4, [1024, 512, 256, 2]] # 7
18
+ - [-1, 1, ADown, [1024]] # 8-P5/32
19
+ - [-1, 1, RepNCSPELAN4, [1024, 512, 256, 2]] # 9
20
+
21
+ - [1, 1, CBLinear, [[64]]] # 10
22
+ - [3, 1, CBLinear, [[64, 128]]] # 11
23
+ - [5, 1, CBLinear, [[64, 128, 256]]] # 12
24
+ - [7, 1, CBLinear, [[64, 128, 256, 512]]] # 13
25
+ - [9, 1, CBLinear, [[64, 128, 256, 512, 1024]]] # 14
26
+
27
+ - [0, 1, Conv, [64, 3, 2]] # 15-P1/2
28
+ - [[10, 11, 12, 13, 14, -1], 1, CBFuse, [[0, 0, 0, 0, 0]]] # 16
29
+ - [-1, 1, Conv, [128, 3, 2]] # 17-P2/4
30
+ - [[11, 12, 13, 14, -1], 1, CBFuse, [[1, 1, 1, 1]]] # 18
31
+ - [-1, 1, RepNCSPELAN4, [256, 128, 64, 2]] # 19
32
+ - [-1, 1, ADown, [256]] # 20-P3/8
33
+ - [[12, 13, 14, -1], 1, CBFuse, [[2, 2, 2]]] # 21
34
+ - [-1, 1, RepNCSPELAN4, [512, 256, 128, 2]] # 22
35
+ - [-1, 1, ADown, [512]] # 23-P4/16
36
+ - [[13, 14, -1], 1, CBFuse, [[3, 3]]] # 24
37
+ - [-1, 1, RepNCSPELAN4, [1024, 512, 256, 2]] # 25
38
+ - [-1, 1, ADown, [1024]] # 26-P5/32
39
+ - [[14, -1], 1, CBFuse, [[4]]] # 27
40
+ - [-1, 1, RepNCSPELAN4, [1024, 512, 256, 2]] # 28
41
+ - [-1, 1, SPPELAN, [512, 256]] # 29
42
+
43
+ # gelan head
44
+ head:
45
+ - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
46
+ - [[-1, 25], 1, Concat, [1]] # cat backbone P4
47
+ - [-1, 1, RepNCSPELAN4, [512, 512, 256, 2]] # 32
48
+
49
+ - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
50
+ - [[-1, 22], 1, Concat, [1]] # cat backbone P3
51
+ - [-1, 1, RepNCSPELAN4, [256, 256, 128, 2]] # 35 (P3/8-small)
52
+
53
+ - [-1, 1, ADown, [256]]
54
+ - [[-1, 32], 1, Concat, [1]] # cat head P4
55
+ - [-1, 1, RepNCSPELAN4, [512, 512, 256, 2]] # 38 (P4/16-medium)
56
+
57
+ - [-1, 1, ADown, [512]]
58
+ - [[-1, 29], 1, Concat, [1]] # cat head P5
59
+ - [-1, 1, RepNCSPELAN4, [512, 1024, 512, 2]] # 41 (P5/32-large)
60
+
61
+ - [[35, 38, 41], 1, Detect, [nc]] # Detect(P3, P4, P5)
@@ -128,7 +128,7 @@ def build_dataloader(dataset, batch, workers, shuffle=True, rank=-1):
128
128
  """Return an InfiniteDataLoader or DataLoader for training or validation set."""
129
129
  batch = min(batch, len(dataset))
130
130
  nd = torch.cuda.device_count() # number of CUDA devices
131
- nw = min([os.cpu_count() // max(nd, 1), workers]) # number of workers
131
+ nw = min(os.cpu_count() // max(nd, 1), workers) # number of workers
132
132
  sampler = None if rank == -1 else distributed.DistributedSampler(dataset, shuffle=shuffle)
133
133
  generator = torch.Generator()
134
134
  generator.manual_seed(6148914691236517205 + RANK)
@@ -195,6 +195,9 @@ class Exporter:
195
195
  if not hasattr(model, "names"):
196
196
  model.names = default_class_names()
197
197
  model.names = check_class_names(model.names)
198
+ if self.args.half and self.args.int8:
199
+ LOGGER.warning("WARNING ⚠️ half=True and int8=True are mutually exclusive, setting half=False.")
200
+ self.args.half = False
198
201
  if self.args.half and onnx and self.device.type == "cpu":
199
202
  LOGGER.warning("WARNING ⚠️ half=True only compatible with GPU export, i.e. use device=0")
200
203
  self.args.half = False
@@ -1012,12 +1015,17 @@ class Exporter:
1012
1015
 
1013
1016
  def _add_tflite_metadata(self, file):
1014
1017
  """Add metadata to *.tflite models per https://www.tensorflow.org/lite/models/convert/metadata."""
1015
- from tflite_support import flatbuffers # noqa
1016
- from tflite_support import metadata as _metadata # noqa
1017
- from tflite_support import metadata_schema_py_generated as _metadata_fb # noqa
1018
+ import flatbuffers
1019
+
1020
+ if MACOS: # TFLite Support bug https://github.com/tensorflow/tflite-support/issues/954#issuecomment-2108570845
1021
+ from tflite_support import metadata # noqa
1022
+ from tflite_support import metadata_schema_py_generated as schema # noqa
1023
+ else:
1024
+ from tensorflow_lite_support.metadata import metadata_schema_py_generated as schema # noqa
1025
+ from tensorflow_lite_support.metadata.python import metadata # noqa
1018
1026
 
1019
1027
  # Create model info
1020
- model_meta = _metadata_fb.ModelMetadataT()
1028
+ model_meta = schema.ModelMetadataT()
1021
1029
  model_meta.name = self.metadata["description"]
1022
1030
  model_meta.version = self.metadata["version"]
1023
1031
  model_meta.author = self.metadata["author"]
@@ -1028,41 +1036,41 @@ class Exporter:
1028
1036
  with open(tmp_file, "w") as f:
1029
1037
  f.write(str(self.metadata))
1030
1038
 
1031
- label_file = _metadata_fb.AssociatedFileT()
1039
+ label_file = schema.AssociatedFileT()
1032
1040
  label_file.name = tmp_file.name
1033
- label_file.type = _metadata_fb.AssociatedFileType.TENSOR_AXIS_LABELS
1041
+ label_file.type = schema.AssociatedFileType.TENSOR_AXIS_LABELS
1034
1042
 
1035
1043
  # Create input info
1036
- input_meta = _metadata_fb.TensorMetadataT()
1044
+ input_meta = schema.TensorMetadataT()
1037
1045
  input_meta.name = "image"
1038
1046
  input_meta.description = "Input image to be detected."
1039
- input_meta.content = _metadata_fb.ContentT()
1040
- input_meta.content.contentProperties = _metadata_fb.ImagePropertiesT()
1041
- input_meta.content.contentProperties.colorSpace = _metadata_fb.ColorSpaceType.RGB
1042
- input_meta.content.contentPropertiesType = _metadata_fb.ContentProperties.ImageProperties
1047
+ input_meta.content = schema.ContentT()
1048
+ input_meta.content.contentProperties = schema.ImagePropertiesT()
1049
+ input_meta.content.contentProperties.colorSpace = schema.ColorSpaceType.RGB
1050
+ input_meta.content.contentPropertiesType = schema.ContentProperties.ImageProperties
1043
1051
 
1044
1052
  # Create output info
1045
- output1 = _metadata_fb.TensorMetadataT()
1053
+ output1 = schema.TensorMetadataT()
1046
1054
  output1.name = "output"
1047
1055
  output1.description = "Coordinates of detected objects, class labels, and confidence score"
1048
1056
  output1.associatedFiles = [label_file]
1049
1057
  if self.model.task == "segment":
1050
- output2 = _metadata_fb.TensorMetadataT()
1058
+ output2 = schema.TensorMetadataT()
1051
1059
  output2.name = "output"
1052
1060
  output2.description = "Mask protos"
1053
1061
  output2.associatedFiles = [label_file]
1054
1062
 
1055
1063
  # Create subgraph info
1056
- subgraph = _metadata_fb.SubGraphMetadataT()
1064
+ subgraph = schema.SubGraphMetadataT()
1057
1065
  subgraph.inputTensorMetadata = [input_meta]
1058
1066
  subgraph.outputTensorMetadata = [output1, output2] if self.model.task == "segment" else [output1]
1059
1067
  model_meta.subgraphMetadata = [subgraph]
1060
1068
 
1061
1069
  b = flatbuffers.Builder(0)
1062
- b.Finish(model_meta.Pack(b), _metadata.MetadataPopulator.METADATA_FILE_IDENTIFIER)
1070
+ b.Finish(model_meta.Pack(b), metadata.MetadataPopulator.METADATA_FILE_IDENTIFIER)
1063
1071
  metadata_buf = b.Output()
1064
1072
 
1065
- populator = _metadata.MetadataPopulator.with_model_file(str(file))
1073
+ populator = metadata.MetadataPopulator.with_model_file(str(file))
1066
1074
  populator.load_metadata_buffer(metadata_buf)
1067
1075
  populator.load_associated_files([str(tmp_file)])
1068
1076
  populator.populate()
@@ -402,8 +402,8 @@ class Results(SimpleClass):
402
402
  )
403
403
  return results
404
404
 
405
- data = self.boxes or self.obb
406
405
  is_obb = self.obb is not None
406
+ data = self.obb if is_obb else self.boxes
407
407
  h, w = self.orig_shape if normalize else (1, 1)
408
408
  for i, row in enumerate(data): # xyxy, track_id if tracking, conf, class_id
409
409
  class_id, conf = int(row.cls), round(row.conf.item(), decimals)
@@ -1,6 +1,7 @@
1
1
  # Ultralytics YOLO 🚀, AGPL-3.0 license
2
2
 
3
3
  from .ai_gym import AIGym
4
+ from .analytics import Analytics
4
5
  from .distance_calculation import DistanceCalculation
5
6
  from .heatmap import Heatmap
6
7
  from .object_counter import ObjectCounter
@@ -16,4 +17,5 @@ __all__ = (
16
17
  "ParkingManagement",
17
18
  "QueueManager",
18
19
  "SpeedEstimator",
20
+ "Analytics",
19
21
  )
@@ -73,11 +73,11 @@ class AIGym:
73
73
  self.stage = ["-" for _ in results[0]]
74
74
 
75
75
  self.keypoints = results[0].keypoints.data
76
- self.annotator = Annotator(im0, line_width=2)
76
+ self.annotator = Annotator(im0, line_width=self.tf)
77
77
 
78
78
  for ind, k in enumerate(reversed(self.keypoints)):
79
79
  # Estimate angle and draw specific points based on pose type
80
- if self.pose_type in {"pushup", "pullup", "abworkout"}:
80
+ if self.pose_type in {"pushup", "pullup", "abworkout", "squat"}:
81
81
  self.angle[ind] = self.annotator.estimate_pose_angle(
82
82
  k[int(self.kpts_to_check[0])].cpu(),
83
83
  k[int(self.kpts_to_check[1])].cpu(),
@@ -93,7 +93,7 @@ class AIGym:
93
93
  self.stage[ind] = "up"
94
94
  self.count[ind] += 1
95
95
 
96
- elif self.pose_type == "pushup":
96
+ elif self.pose_type == "pushup" or self.pose_type == "squat":
97
97
  if self.angle[ind] > self.poseup_angle:
98
98
  self.stage[ind] = "up"
99
99
  if self.angle[ind] < self.posedown_angle and self.stage[ind] == "up":
@@ -0,0 +1,197 @@
1
+ from itertools import cycle
2
+
3
+ import cv2
4
+ import matplotlib.pyplot as plt
5
+ import numpy as np
6
+ from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
7
+ from matplotlib.figure import Figure
8
+
9
+
10
+ class Analytics:
11
+ """A class to create and update various types of charts (line, bar, pie) for visual analytics."""
12
+
13
+ def __init__(
14
+ self,
15
+ type,
16
+ writer,
17
+ im0_shape,
18
+ title="ultralytics",
19
+ x_label="x",
20
+ y_label="y",
21
+ bg_color="white",
22
+ fg_color="black",
23
+ line_color="yellow",
24
+ line_width=2,
25
+ fontsize=13,
26
+ view_img=False,
27
+ save_img=True,
28
+ ):
29
+ """
30
+ Initialize the Analytics class with various chart types.
31
+
32
+ Args:
33
+ type (str): Type of chart to initialize ('line', 'bar', or 'pie').
34
+ writer: Video writer object to save the frames.
35
+ im0_shape (tuple): Shape of the input image (width, height).
36
+ title (str): Title of the chart.
37
+ x_label (str): Label for the x-axis.
38
+ y_label (str): Label for the y-axis.
39
+ bg_color (str): Background color of the chart.
40
+ fg_color (str): Foreground (text) color of the chart.
41
+ line_color (str): Line color for line charts.
42
+ line_width (int): Width of the lines in line charts.
43
+ fontsize (int): Font size for chart text.
44
+ view_img (bool): Whether to display the image.
45
+ save_img (bool): Whether to save the image.
46
+ """
47
+
48
+ self.bg_color = bg_color
49
+ self.fg_color = fg_color
50
+ self.view_img = view_img
51
+ self.save_img = save_img
52
+ self.title = title
53
+ self.writer = writer
54
+
55
+ # Set figure size based on image shape
56
+ figsize = (im0_shape[0] / 100, im0_shape[1] / 100)
57
+
58
+ if type == "line":
59
+ # Initialize line plot
60
+ fig = Figure(facecolor=self.bg_color, figsize=figsize)
61
+ self.canvas = FigureCanvas(fig)
62
+ self.ax = fig.add_subplot(111, facecolor=self.bg_color)
63
+ (self.line,) = self.ax.plot([], [], color=line_color, linewidth=line_width)
64
+
65
+ elif type == "bar" or type == "pie":
66
+ # Initialize bar or pie plot
67
+ self.fig, self.ax = plt.subplots(figsize=figsize, facecolor=self.bg_color)
68
+ self.ax.set_facecolor(self.bg_color)
69
+ color_palette = [
70
+ (31, 119, 180),
71
+ (255, 127, 14),
72
+ (44, 160, 44),
73
+ (214, 39, 40),
74
+ (148, 103, 189),
75
+ (140, 86, 75),
76
+ (227, 119, 194),
77
+ (127, 127, 127),
78
+ (188, 189, 34),
79
+ (23, 190, 207),
80
+ ]
81
+ self.color_palette = [(r / 255, g / 255, b / 255, 1) for r, g, b in color_palette]
82
+ self.color_cycle = cycle(self.color_palette)
83
+ self.color_mapping = {}
84
+
85
+ # Ensure pie chart is circular
86
+ self.ax.axis("equal") if type == "pie" else None
87
+
88
+ # Set common axis properties
89
+ self.ax.set_title(self.title, color=self.fg_color, fontsize=fontsize)
90
+ self.ax.set_xlabel(x_label, color=self.fg_color, fontsize=fontsize - 3)
91
+ self.ax.set_ylabel(y_label, color=self.fg_color, fontsize=fontsize - 3)
92
+ self.ax.tick_params(axis="both", colors=self.fg_color)
93
+
94
+ def update_line(self, frame_number, total_counts):
95
+ """
96
+ Update the line graph with new data.
97
+
98
+ Args:
99
+ frame_number (int): The current frame number.
100
+ total_counts (int): The total counts to plot.
101
+ """
102
+
103
+ # Update line graph data
104
+ x_data = self.line.get_xdata()
105
+ y_data = self.line.get_ydata()
106
+ x_data = np.append(x_data, float(frame_number))
107
+ y_data = np.append(y_data, float(total_counts))
108
+ self.line.set_data(x_data, y_data)
109
+ self.ax.relim()
110
+ self.ax.autoscale_view()
111
+ self.canvas.draw()
112
+ im0 = np.array(self.canvas.renderer.buffer_rgba())
113
+ im0 = cv2.cvtColor(im0[:, :, :3], cv2.COLOR_RGBA2BGR)
114
+
115
+ # Display and save the updated graph
116
+ cv2.imshow(self.title, im0) if self.view_img else None
117
+ self.writer.write(im0) if self.save_img else None
118
+
119
+ def update_bar(self, count_dict):
120
+ """
121
+ Update the bar graph with new data.
122
+
123
+ Args:
124
+ count_dict (dict): Dictionary containing the count data to plot.
125
+ """
126
+
127
+ # Update bar graph data
128
+ self.ax.clear()
129
+ self.ax.set_facecolor(self.bg_color)
130
+ labels = list(count_dict.keys())
131
+ counts = list(count_dict.values())
132
+
133
+ # Map labels to colors
134
+ for label in labels:
135
+ if label not in self.color_mapping:
136
+ self.color_mapping[label] = next(self.color_cycle)
137
+
138
+ colors = [self.color_mapping[label] for label in labels]
139
+
140
+ bars = self.ax.bar(labels, counts, color=colors)
141
+ for bar, count in zip(bars, counts):
142
+ self.ax.text(
143
+ bar.get_x() + bar.get_width() / 2,
144
+ bar.get_height(),
145
+ str(count),
146
+ ha="center",
147
+ va="bottom",
148
+ color=self.fg_color,
149
+ )
150
+
151
+ # Display and save the updated graph
152
+ canvas = FigureCanvas(self.fig)
153
+ canvas.draw()
154
+ buf = canvas.buffer_rgba()
155
+ im0 = np.asarray(buf)
156
+ im0 = cv2.cvtColor(im0, cv2.COLOR_RGBA2BGR)
157
+
158
+ self.writer.write(im0) if self.save_img else None
159
+ cv2.imshow(self.title, im0) if self.view_img else None
160
+
161
+ def update_pie(self, classes_dict):
162
+ """
163
+ Update the pie chart with new data.
164
+
165
+ Args:
166
+ classes_dict (dict): Dictionary containing the class data to plot.
167
+ """
168
+
169
+ # Update pie chart data
170
+ labels = list(classes_dict.keys())
171
+ sizes = list(classes_dict.values())
172
+ total = sum(sizes)
173
+ percentages = [size / total * 100 for size in sizes]
174
+ start_angle = 90
175
+ self.ax.clear()
176
+
177
+ # Create pie chart without labels inside the slices
178
+ wedges, autotexts = self.ax.pie(sizes, autopct=None, startangle=start_angle, textprops={"color": self.fg_color})
179
+
180
+ # Construct legend labels with percentages
181
+ legend_labels = [f"{label} ({percentage:.1f}%)" for label, percentage in zip(labels, percentages)]
182
+ self.ax.legend(wedges, legend_labels, title="Classes", loc="center left", bbox_to_anchor=(1, 0, 0.5, 1))
183
+
184
+ # Adjust layout to fit the legend
185
+ self.fig.tight_layout()
186
+ self.fig.subplots_adjust(left=0.1, right=0.75)
187
+
188
+ # Display and save the updated chart
189
+ im0 = self.fig.canvas.draw()
190
+ im0 = np.array(self.fig.canvas.renderer.buffer_rgba())
191
+ im0 = cv2.cvtColor(im0[:, :, :3], cv2.COLOR_RGBA2BGR)
192
+ self.writer.write(im0) if self.save_img else None
193
+ cv2.imshow(self.title, im0) if self.view_img else None
194
+
195
+
196
+ if __name__ == "__main__":
197
+ Analytics("line", writer=None, im0_shape=None)