ultralytics 8.3.3__tar.gz → 8.3.5__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 (247) hide show
  1. {ultralytics-8.3.3 → ultralytics-8.3.5}/PKG-INFO +3 -2
  2. {ultralytics-8.3.3 → ultralytics-8.3.5}/pyproject.toml +2 -1
  3. {ultralytics-8.3.3 → ultralytics-8.3.5}/tests/test_solutions.py +2 -2
  4. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/__init__.py +1 -1
  5. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/default.yaml +1 -1
  6. ultralytics-8.3.5/ultralytics/cfg/solutions/default.yaml +12 -0
  7. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/data/base.py +37 -5
  8. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/data/utils.py +3 -3
  9. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/engine/exporter.py +10 -0
  10. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/engine/trainer.py +2 -2
  11. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/engine/validator.py +2 -0
  12. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/sam/predict.py +1 -0
  13. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/solutions/heatmap.py +2 -12
  14. ultralytics-8.3.5/ultralytics/solutions/object_counter.py +129 -0
  15. ultralytics-8.3.5/ultralytics/solutions/solutions.py +88 -0
  16. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/utils/__init__.py +9 -8
  17. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/utils/torch_utils.py +3 -1
  18. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics.egg-info/PKG-INFO +3 -2
  19. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics.egg-info/SOURCES.txt +2 -0
  20. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics.egg-info/requires.txt +2 -1
  21. ultralytics-8.3.3/ultralytics/solutions/object_counter.py +0 -243
  22. {ultralytics-8.3.3 → ultralytics-8.3.5}/LICENSE +0 -0
  23. {ultralytics-8.3.3 → ultralytics-8.3.5}/README.md +0 -0
  24. {ultralytics-8.3.3 → ultralytics-8.3.5}/setup.cfg +0 -0
  25. {ultralytics-8.3.3 → ultralytics-8.3.5}/tests/__init__.py +0 -0
  26. {ultralytics-8.3.3 → ultralytics-8.3.5}/tests/conftest.py +0 -0
  27. {ultralytics-8.3.3 → ultralytics-8.3.5}/tests/test_cli.py +0 -0
  28. {ultralytics-8.3.3 → ultralytics-8.3.5}/tests/test_cuda.py +0 -0
  29. {ultralytics-8.3.3 → ultralytics-8.3.5}/tests/test_engine.py +0 -0
  30. {ultralytics-8.3.3 → ultralytics-8.3.5}/tests/test_explorer.py +0 -0
  31. {ultralytics-8.3.3 → ultralytics-8.3.5}/tests/test_exports.py +0 -0
  32. {ultralytics-8.3.3 → ultralytics-8.3.5}/tests/test_integrations.py +0 -0
  33. {ultralytics-8.3.3 → ultralytics-8.3.5}/tests/test_python.py +0 -0
  34. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/assets/bus.jpg +0 -0
  35. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/assets/zidane.jpg +0 -0
  36. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/__init__.py +0 -0
  37. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
  38. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
  39. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
  40. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
  41. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
  42. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
  43. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
  44. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/datasets/VOC.yaml +0 -0
  45. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
  46. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
  47. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
  48. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
  49. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
  50. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/datasets/coco.yaml +0 -0
  51. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
  52. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/datasets/coco128.yaml +0 -0
  53. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
  54. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
  55. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/datasets/coco8.yaml +0 -0
  56. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
  57. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/datasets/dota8.yaml +0 -0
  58. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/datasets/hand-keypoints.yaml +0 -0
  59. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/datasets/lvis.yaml +0 -0
  60. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
  61. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
  62. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/datasets/signature.yaml +0 -0
  63. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
  64. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/datasets/xView.yaml +0 -0
  65. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/models/11/yolo11-cls.yaml +0 -0
  66. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/models/11/yolo11-obb.yaml +0 -0
  67. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/models/11/yolo11-pose.yaml +0 -0
  68. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/models/11/yolo11-seg.yaml +0 -0
  69. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/models/11/yolo11.yaml +0 -0
  70. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
  71. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
  72. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
  73. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
  74. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/models/v10/yolov10b.yaml +0 -0
  75. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/models/v10/yolov10l.yaml +0 -0
  76. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/models/v10/yolov10m.yaml +0 -0
  77. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/models/v10/yolov10n.yaml +0 -0
  78. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/models/v10/yolov10s.yaml +0 -0
  79. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/models/v10/yolov10x.yaml +0 -0
  80. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
  81. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
  82. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
  83. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
  84. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
  85. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
  86. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
  87. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
  88. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
  89. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
  90. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
  91. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
  92. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
  93. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
  94. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
  95. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
  96. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
  97. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
  98. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
  99. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
  100. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
  101. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
  102. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
  103. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
  104. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
  105. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
  106. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
  107. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/models/v9/yolov9m.yaml +0 -0
  108. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/models/v9/yolov9s.yaml +0 -0
  109. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/models/v9/yolov9t.yaml +0 -0
  110. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/trackers/botsort.yaml +0 -0
  111. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
  112. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/data/__init__.py +0 -0
  113. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/data/annotator.py +0 -0
  114. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/data/augment.py +0 -0
  115. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/data/build.py +0 -0
  116. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/data/converter.py +0 -0
  117. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/data/dataset.py +0 -0
  118. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/data/explorer/__init__.py +0 -0
  119. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/data/explorer/explorer.py +0 -0
  120. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/data/explorer/gui/__init__.py +0 -0
  121. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/data/explorer/gui/dash.py +0 -0
  122. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/data/explorer/utils.py +0 -0
  123. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/data/loaders.py +0 -0
  124. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/data/split_dota.py +0 -0
  125. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/engine/__init__.py +0 -0
  126. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/engine/model.py +0 -0
  127. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/engine/predictor.py +0 -0
  128. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/engine/results.py +0 -0
  129. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/engine/tuner.py +0 -0
  130. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/hub/__init__.py +0 -0
  131. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/hub/auth.py +0 -0
  132. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/hub/google/__init__.py +0 -0
  133. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/hub/session.py +0 -0
  134. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/hub/utils.py +0 -0
  135. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/__init__.py +0 -0
  136. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/fastsam/__init__.py +0 -0
  137. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/fastsam/model.py +0 -0
  138. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/fastsam/predict.py +0 -0
  139. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/fastsam/utils.py +0 -0
  140. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/fastsam/val.py +0 -0
  141. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/nas/__init__.py +0 -0
  142. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/nas/model.py +0 -0
  143. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/nas/predict.py +0 -0
  144. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/nas/val.py +0 -0
  145. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/rtdetr/__init__.py +0 -0
  146. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/rtdetr/model.py +0 -0
  147. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/rtdetr/predict.py +0 -0
  148. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/rtdetr/train.py +0 -0
  149. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/rtdetr/val.py +0 -0
  150. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/sam/__init__.py +0 -0
  151. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/sam/amg.py +0 -0
  152. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/sam/build.py +0 -0
  153. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/sam/model.py +0 -0
  154. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/sam/modules/__init__.py +0 -0
  155. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/sam/modules/blocks.py +0 -0
  156. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/sam/modules/decoders.py +0 -0
  157. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/sam/modules/encoders.py +0 -0
  158. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/sam/modules/memory_attention.py +0 -0
  159. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/sam/modules/sam.py +0 -0
  160. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
  161. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/sam/modules/transformer.py +0 -0
  162. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/sam/modules/utils.py +0 -0
  163. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/utils/__init__.py +0 -0
  164. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/utils/loss.py +0 -0
  165. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/utils/ops.py +0 -0
  166. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/yolo/__init__.py +0 -0
  167. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/yolo/classify/__init__.py +0 -0
  168. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/yolo/classify/predict.py +0 -0
  169. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/yolo/classify/train.py +0 -0
  170. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/yolo/classify/val.py +0 -0
  171. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/yolo/detect/__init__.py +0 -0
  172. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/yolo/detect/predict.py +0 -0
  173. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/yolo/detect/train.py +0 -0
  174. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/yolo/detect/val.py +0 -0
  175. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/yolo/model.py +0 -0
  176. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/yolo/obb/__init__.py +0 -0
  177. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/yolo/obb/predict.py +0 -0
  178. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/yolo/obb/train.py +0 -0
  179. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/yolo/obb/val.py +0 -0
  180. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/yolo/pose/__init__.py +0 -0
  181. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/yolo/pose/predict.py +0 -0
  182. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/yolo/pose/train.py +0 -0
  183. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/yolo/pose/val.py +0 -0
  184. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/yolo/segment/__init__.py +0 -0
  185. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/yolo/segment/predict.py +0 -0
  186. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/yolo/segment/train.py +0 -0
  187. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/yolo/segment/val.py +0 -0
  188. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/yolo/world/__init__.py +0 -0
  189. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/yolo/world/train.py +0 -0
  190. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/models/yolo/world/train_world.py +0 -0
  191. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/nn/__init__.py +0 -0
  192. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/nn/autobackend.py +0 -0
  193. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/nn/modules/__init__.py +0 -0
  194. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/nn/modules/activation.py +0 -0
  195. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/nn/modules/block.py +0 -0
  196. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/nn/modules/conv.py +0 -0
  197. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/nn/modules/head.py +0 -0
  198. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/nn/modules/transformer.py +0 -0
  199. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/nn/modules/utils.py +0 -0
  200. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/nn/tasks.py +0 -0
  201. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/solutions/__init__.py +0 -0
  202. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/solutions/ai_gym.py +0 -0
  203. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/solutions/analytics.py +0 -0
  204. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/solutions/distance_calculation.py +0 -0
  205. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/solutions/parking_management.py +0 -0
  206. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/solutions/queue_management.py +0 -0
  207. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/solutions/speed_estimation.py +0 -0
  208. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/solutions/streamlit_inference.py +0 -0
  209. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/trackers/__init__.py +0 -0
  210. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/trackers/basetrack.py +0 -0
  211. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/trackers/bot_sort.py +0 -0
  212. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/trackers/byte_tracker.py +0 -0
  213. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/trackers/track.py +0 -0
  214. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/trackers/utils/__init__.py +0 -0
  215. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/trackers/utils/gmc.py +0 -0
  216. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/trackers/utils/kalman_filter.py +0 -0
  217. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/trackers/utils/matching.py +0 -0
  218. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/utils/autobatch.py +0 -0
  219. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/utils/benchmarks.py +0 -0
  220. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/utils/callbacks/__init__.py +0 -0
  221. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/utils/callbacks/base.py +0 -0
  222. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/utils/callbacks/clearml.py +0 -0
  223. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/utils/callbacks/comet.py +0 -0
  224. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/utils/callbacks/dvc.py +0 -0
  225. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/utils/callbacks/hub.py +0 -0
  226. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/utils/callbacks/mlflow.py +0 -0
  227. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/utils/callbacks/neptune.py +0 -0
  228. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/utils/callbacks/raytune.py +0 -0
  229. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/utils/callbacks/tensorboard.py +0 -0
  230. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/utils/callbacks/wb.py +0 -0
  231. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/utils/checks.py +0 -0
  232. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/utils/dist.py +0 -0
  233. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/utils/downloads.py +0 -0
  234. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/utils/errors.py +0 -0
  235. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/utils/files.py +0 -0
  236. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/utils/instance.py +0 -0
  237. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/utils/loss.py +0 -0
  238. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/utils/metrics.py +0 -0
  239. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/utils/ops.py +0 -0
  240. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/utils/patches.py +0 -0
  241. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/utils/plotting.py +0 -0
  242. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/utils/tal.py +0 -0
  243. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/utils/triton.py +0 -0
  244. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics/utils/tuner.py +0 -0
  245. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics.egg-info/dependency_links.txt +0 -0
  246. {ultralytics-8.3.3 → ultralytics-8.3.5}/ultralytics.egg-info/entry_points.txt +0 -0
  247. {ultralytics-8.3.3 → ultralytics-8.3.5}/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.3.3
3
+ Version: 8.3.5
4
4
  Summary: Ultralytics YOLO for SOTA object detection, multi-object tracking, instance segmentation, pose estimation and image classification.
5
5
  Author: Ayush Chaurasia
6
6
  Author-email: Glenn Jocher <glenn.jocher@ultralytics.com>, Jing Qiu <jing.qiu@ultralytics.com>
@@ -33,7 +33,7 @@ Classifier: Operating System :: Microsoft :: Windows
33
33
  Requires-Python: >=3.8
34
34
  Description-Content-Type: text/markdown
35
35
  License-File: LICENSE
36
- Requires-Dist: numpy<2.0.0,>=1.23.0
36
+ Requires-Dist: numpy>=1.23.0
37
37
  Requires-Dist: matplotlib>=3.3.0
38
38
  Requires-Dist: opencv-python>=4.6.0
39
39
  Requires-Dist: pillow>=7.1.2
@@ -64,6 +64,7 @@ Requires-Dist: mkdocs-macros-plugin>=1.0.5; extra == "dev"
64
64
  Provides-Extra: export
65
65
  Requires-Dist: onnx>=1.12.0; extra == "export"
66
66
  Requires-Dist: coremltools>=7.0; (platform_system != "Windows" and python_version <= "3.11") and extra == "export"
67
+ Requires-Dist: scikit-learn>=1.3.2; (platform_system != "Windows" and python_version <= "3.11") and extra == "export"
67
68
  Requires-Dist: openvino>=2024.0.0; extra == "export"
68
69
  Requires-Dist: tensorflow>=2.0.0; extra == "export"
69
70
  Requires-Dist: tensorflowjs>=3.9.0; extra == "export"
@@ -62,7 +62,7 @@ classifiers = [
62
62
 
63
63
  # Required dependencies ------------------------------------------------------------------------------------------------
64
64
  dependencies = [
65
- "numpy>=1.23.0,<2.0.0", # temporary patch for compat errors https://github.com/ultralytics/yolov5/actions/runs/9538130424/job/26286956354
65
+ "numpy>=1.23.0", # temporary patch for compat errors https://github.com/ultralytics/yolov5/actions/runs/9538130424/job/26286956354
66
66
  "matplotlib>=3.3.0",
67
67
  "opencv-python>=4.6.0",
68
68
  "pillow>=7.1.2",
@@ -98,6 +98,7 @@ dev = [
98
98
  export = [
99
99
  "onnx>=1.12.0", # ONNX export
100
100
  "coremltools>=7.0; platform_system != 'Windows' and python_version <= '3.11'", # CoreML supported on macOS and Linux
101
+ "scikit-learn>=1.3.2; platform_system != 'Windows' and python_version <= '3.11'", # CoreML k-means quantization
101
102
  "openvino>=2024.0.0", # OpenVINO export
102
103
  "tensorflow>=2.0.0", # TF bug https://github.com/ultralytics/ultralytics/issues/5161
103
104
  "tensorflowjs>=3.9.0", # TF.js export, automatically installs tensorflow
@@ -19,7 +19,7 @@ def test_major_solutions():
19
19
  cap = cv2.VideoCapture("solutions_ci_demo.mp4")
20
20
  assert cap.isOpened(), "Error reading video file"
21
21
  region_points = [(20, 400), (1080, 404), (1080, 360), (20, 360)]
22
- counter = solutions.ObjectCounter(reg_pts=region_points, names=names, view_img=False)
22
+ # counter = solutions.ObjectCounter(reg_pts=region_points, names=names, view_img=False)
23
23
  heatmap = solutions.Heatmap(colormap=cv2.COLORMAP_PARULA, names=names, view_img=False)
24
24
  speed = solutions.SpeedEstimator(reg_pts=region_points, names=names, view_img=False)
25
25
  queue = solutions.QueueManager(names=names, reg_pts=region_points, view_img=False)
@@ -29,7 +29,7 @@ def test_major_solutions():
29
29
  break
30
30
  original_im0 = im0.copy()
31
31
  tracks = model.track(im0, persist=True, show=False)
32
- _ = counter.start_counting(original_im0.copy(), tracks)
32
+ # _ = counter.start_counting(original_im0.copy(), tracks)
33
33
  _ = heatmap.generate_heatmap(original_im0.copy(), tracks)
34
34
  _ = speed.estimate_speed(original_im0.copy(), tracks)
35
35
  _ = queue.process_queue(original_im0.copy(), tracks)
@@ -1,6 +1,6 @@
1
1
  # Ultralytics YOLO 🚀, AGPL-3.0 license
2
2
 
3
- __version__ = "8.3.3"
3
+ __version__ = "8.3.5"
4
4
 
5
5
  import os
6
6
 
@@ -1,7 +1,7 @@
1
1
  # Ultralytics YOLO 🚀, AGPL-3.0 license
2
2
  # Default training settings and hyperparameters for medium-augmentation COCO training
3
3
 
4
- task: detect # (str) YOLO task, i.e. detect, segment, classify, pose
4
+ task: detect # (str) YOLO task, i.e. detect, segment, classify, pose, obb
5
5
  mode: train # (str) YOLO mode, i.e. train, val, predict, export, track, benchmark
6
6
 
7
7
  # Train settings -------------------------------------------------------------------------------------------------------
@@ -0,0 +1,12 @@
1
+ # Ultralytics YOLO 🚀, AGPL-3.0 license
2
+
3
+ # Configuration for Ultralytics Solutions
4
+
5
+ model: "yolo11n.pt" # The Ultralytics YOLO11 model to be used (e.g., yolo11n.pt for YOLO11 nano version)
6
+
7
+ region: # Object counting, queue or speed estimation region points
8
+ line_width: 2 # Thickness of the lines used to draw regions on the image/video frames
9
+ show: True # Flag to control whether to display output image or not
10
+ show_in: True # Flag to display objects moving *into* the defined region
11
+ show_out: True # Flag to display objects moving *out of* the defined region
12
+ classes: # To count specific classes
@@ -90,13 +90,15 @@ class BaseDataset(Dataset):
90
90
  self.ims, self.im_hw0, self.im_hw = [None] * self.ni, [None] * self.ni, [None] * self.ni
91
91
  self.npy_files = [Path(f).with_suffix(".npy") for f in self.im_files]
92
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
- if self.cache == "ram" and hyp.deterministic:
93
+ if self.cache == "ram" and self.check_cache_ram():
94
+ if hyp.deterministic:
95
95
  LOGGER.warning(
96
96
  "WARNING ⚠️ cache='ram' may produce non-deterministic training results. "
97
97
  "Consider cache='disk' as a deterministic alternative if your disk space allows."
98
98
  )
99
99
  self.cache_images()
100
+ elif self.cache == "disk" and self.check_cache_disk():
101
+ self.cache_images()
100
102
 
101
103
  # Transforms
102
104
  self.transforms = self.build_transforms(hyp=hyp)
@@ -206,25 +208,55 @@ class BaseDataset(Dataset):
206
208
  if not f.exists():
207
209
  np.save(f.as_posix(), cv2.imread(self.im_files[i]), allow_pickle=False)
208
210
 
211
+ def check_cache_disk(self, safety_margin=0.5):
212
+ """Check image caching requirements vs available disk space."""
213
+ import shutil
214
+
215
+ b, gb = 0, 1 << 30 # bytes of cached images, bytes per gigabytes
216
+ n = min(self.ni, 30) # extrapolate from 30 random images
217
+ for _ in range(n):
218
+ im_file = random.choice(self.im_files)
219
+ im = cv2.imread(im_file)
220
+ if im is None:
221
+ continue
222
+ b += im.nbytes
223
+ if not os.access(Path(im_file).parent, os.W_OK):
224
+ self.cache = None
225
+ LOGGER.info(f"{self.prefix}Skipping caching images to disk, directory not writeable ⚠️")
226
+ return False
227
+ disk_required = b * self.ni / n * (1 + safety_margin) # bytes required to cache dataset to disk
228
+ total, used, free = shutil.disk_usage(Path(self.im_files[0]).parent)
229
+ if disk_required > free:
230
+ self.cache = None
231
+ LOGGER.info(
232
+ f"{self.prefix}{disk_required / gb:.1f}GB disk space required, "
233
+ f"with {int(safety_margin * 100)}% safety margin but only "
234
+ f"{free / gb:.1f}/{total / gb:.1f}GB free, not caching images to disk ⚠️"
235
+ )
236
+ return False
237
+ return True
238
+
209
239
  def check_cache_ram(self, safety_margin=0.5):
210
240
  """Check image caching requirements vs available memory."""
211
241
  b, gb = 0, 1 << 30 # bytes of cached images, bytes per gigabytes
212
242
  n = min(self.ni, 30) # extrapolate from 30 random images
213
243
  for _ in range(n):
214
244
  im = cv2.imread(random.choice(self.im_files)) # sample image
245
+ if im is None:
246
+ continue
215
247
  ratio = self.imgsz / max(im.shape[0], im.shape[1]) # max(h, w) # ratio
216
248
  b += im.nbytes * ratio**2
217
249
  mem_required = b * self.ni / n * (1 + safety_margin) # GB required to cache dataset into RAM
218
250
  mem = psutil.virtual_memory()
219
- success = mem_required < mem.available # to cache or not to cache, that is the question
220
- if not success:
251
+ if mem_required > mem.available:
221
252
  self.cache = None
222
253
  LOGGER.info(
223
254
  f"{self.prefix}{mem_required / gb:.1f}GB RAM required to cache images "
224
255
  f"with {int(safety_margin * 100)}% safety margin but only "
225
256
  f"{mem.available / gb:.1f}/{mem.total / gb:.1f}GB available, not caching images ⚠️"
226
257
  )
227
- return success
258
+ return False
259
+ return True
228
260
 
229
261
  def set_rectangle(self):
230
262
  """Sets the shape of bounding boxes for YOLO detections as rectangles."""
@@ -216,7 +216,7 @@ def polygons2masks_overlap(imgsz, segments, downsample_ratio=1):
216
216
  ms = []
217
217
  for si in range(len(segments)):
218
218
  mask = polygon2mask(imgsz, [segments[si].reshape(-1)], downsample_ratio=downsample_ratio, color=1)
219
- ms.append(mask)
219
+ ms.append(mask.astype(masks.dtype))
220
220
  areas.append(mask.sum())
221
221
  areas = np.asarray(areas)
222
222
  index = np.argsort(-areas)
@@ -452,12 +452,12 @@ class HUBDatasetStats:
452
452
  path = Path(path).resolve()
453
453
  LOGGER.info(f"Starting HUB dataset checks for {path}....")
454
454
 
455
- self.task = task # detect, segment, pose, classify
455
+ self.task = task # detect, segment, pose, classify, obb
456
456
  if self.task == "classify":
457
457
  unzip_dir = unzip_file(path)
458
458
  data = check_cls_dataset(unzip_dir)
459
459
  data["path"] = unzip_dir
460
- else: # detect, segment, pose
460
+ else: # detect, segment, pose, obb
461
461
  _, data_dir, yaml_path = self._unzip(Path(path))
462
462
  try:
463
463
  # Load YAML with checks
@@ -178,6 +178,16 @@ class Exporter:
178
178
  if fmt in {"mlmodel", "mlpackage", "mlprogram", "apple", "ios", "coreml"}: # 'coreml' aliases
179
179
  fmt = "coreml"
180
180
  fmts = tuple(export_formats()["Argument"][1:]) # available export formats
181
+ if fmt not in fmts:
182
+ import difflib
183
+
184
+ # Get the closest match if format is invalid
185
+ matches = difflib.get_close_matches(fmt, fmts, n=1, cutoff=0.6) # 60% similarity required to match
186
+ if matches:
187
+ LOGGER.warning(f"WARNING ⚠️ Invalid export format='{fmt}', updating to format='{matches[0]}'")
188
+ fmt = matches[0]
189
+ else:
190
+ raise ValueError(f"Invalid export format='{fmt}'. Valid formats are {fmts}")
181
191
  flags = [x == fmt for x in fmts]
182
192
  if sum(flags) != 1:
183
193
  raise ValueError(f"Invalid export format='{fmt}'. Valid formats are {fmts}")
@@ -12,7 +12,7 @@ import os
12
12
  import subprocess
13
13
  import time
14
14
  import warnings
15
- from copy import deepcopy
15
+ from copy import copy, deepcopy
16
16
  from datetime import datetime, timedelta
17
17
  from pathlib import Path
18
18
 
@@ -749,7 +749,7 @@ class BaseTrainer:
749
749
  self.train_loader.dataset.mosaic = False
750
750
  if hasattr(self.train_loader.dataset, "close_mosaic"):
751
751
  LOGGER.info("Closing dataloader mosaic")
752
- self.train_loader.dataset.close_mosaic(hyp=self.args)
752
+ self.train_loader.dataset.close_mosaic(hyp=copy(self.args))
753
753
 
754
754
  def build_optimizer(self, model, name="auto", lr=0.001, momentum=0.9, decay=1e-5, iterations=1e5):
755
755
  """
@@ -119,6 +119,8 @@ class BaseValidator:
119
119
  self.args.plots &= trainer.stopper.possible_stop or (trainer.epoch == trainer.epochs - 1)
120
120
  model.eval()
121
121
  else:
122
+ if str(self.args.model).endswith(".yaml"):
123
+ LOGGER.warning("WARNING ⚠️ validating an untrained model YAML will result in 0 mAP.")
122
124
  callbacks.add_integration_callbacks(self)
123
125
  model = AutoBackend(
124
126
  weights=model or self.args.model,
@@ -196,6 +196,7 @@ class Predictor(BasePredictor):
196
196
  bboxes = self.prompts.pop("bboxes", bboxes)
197
197
  points = self.prompts.pop("points", points)
198
198
  masks = self.prompts.pop("masks", masks)
199
+ labels = self.prompts.pop("labels", labels)
199
200
 
200
201
  if all(i is None for i in [bboxes, points, masks]):
201
202
  return self.generate(im, *args, **kwargs)
@@ -19,10 +19,7 @@ class Heatmap:
19
19
  def __init__(
20
20
  self,
21
21
  names,
22
- imw=0,
23
- imh=0,
24
22
  colormap=cv2.COLORMAP_JET,
25
- heatmap_alpha=0.5,
26
23
  view_img=False,
27
24
  view_in_counts=True,
28
25
  view_out_counts=True,
@@ -33,7 +30,6 @@ class Heatmap:
33
30
  region_thickness=5,
34
31
  line_dist_thresh=15,
35
32
  line_thickness=2,
36
- decay_factor=0.99,
37
33
  shape="circle",
38
34
  ):
39
35
  """Initializes the heatmap class with default values for Visual, Image, track, count and heatmap parameters."""
@@ -46,8 +42,6 @@ class Heatmap:
46
42
  self.names = names # Classes names
47
43
 
48
44
  # Image information
49
- self.imw = imw
50
- self.imh = imh
51
45
  self.im0 = None
52
46
  self.tf = line_thickness
53
47
  self.view_in_counts = view_in_counts
@@ -56,7 +50,6 @@ class Heatmap:
56
50
  # Heatmap colormap and heatmap np array
57
51
  self.colormap = colormap
58
52
  self.heatmap = None
59
- self.heatmap_alpha = heatmap_alpha
60
53
 
61
54
  # Predict/track information
62
55
  self.boxes = []
@@ -79,9 +72,6 @@ class Heatmap:
79
72
  self.count_bg_color = count_bg_color
80
73
  self.cls_txtdisplay_gap = 50
81
74
 
82
- # Decay factor
83
- self.decay_factor = decay_factor
84
-
85
75
  # Check if environment supports imshow
86
76
  self.env_check = check_imshow(warn=True)
87
77
 
@@ -133,7 +123,7 @@ class Heatmap:
133
123
  self.heatmap = np.zeros((int(self.im0.shape[0]), int(self.im0.shape[1])), dtype=np.float32)
134
124
  self.initialized = True
135
125
 
136
- self.heatmap *= self.decay_factor # decay factor
126
+ self.heatmap *= 0.99 # decay factor
137
127
 
138
128
  self.extract_results(tracks)
139
129
  self.annotator = Annotator(self.im0, self.tf, None)
@@ -239,7 +229,7 @@ class Heatmap:
239
229
  # Normalize, apply colormap to heatmap and combine with original image
240
230
  heatmap_normalized = cv2.normalize(self.heatmap, None, 0, 255, cv2.NORM_MINMAX)
241
231
  heatmap_colored = cv2.applyColorMap(heatmap_normalized.astype(np.uint8), self.colormap)
242
- self.im0 = cv2.addWeighted(self.im0, 1 - self.heatmap_alpha, heatmap_colored, self.heatmap_alpha, 0)
232
+ self.im0 = cv2.addWeighted(self.im0, 0.5, heatmap_colored, 0.5, 0)
243
233
 
244
234
  if self.env_check and self.view_img:
245
235
  self.display_frames()
@@ -0,0 +1,129 @@
1
+ # Ultralytics YOLO 🚀, AGPL-3.0 license
2
+
3
+ from shapely.geometry import LineString, Point
4
+
5
+ from ultralytics.solutions.solutions import BaseSolution # Import a parent class
6
+ from ultralytics.utils.plotting import Annotator, colors
7
+
8
+
9
+ class ObjectCounter(BaseSolution):
10
+ """A class to manage the counting of objects in a real-time video stream based on their tracks."""
11
+
12
+ def __init__(self, **kwargs):
13
+ """Initialization function for Count class, a child class of BaseSolution class, can be used for counting the
14
+ objects.
15
+ """
16
+ super().__init__(**kwargs)
17
+
18
+ self.in_count = 0 # Counter for objects moving inward
19
+ self.out_count = 0 # Counter for objects moving outward
20
+ self.counted_ids = [] # List of IDs of objects that have been counted
21
+ self.classwise_counts = {} # Dictionary for counts, categorized by object class
22
+
23
+ self.initialize_region() # Setup region and counting areas
24
+
25
+ self.show_in = self.CFG["show_in"]
26
+ self.show_out = self.CFG["show_out"]
27
+
28
+ def count_objects(self, track_line, box, track_id, prev_position, cls):
29
+ """
30
+ Helper function to count objects within a polygonal region.
31
+
32
+ Args:
33
+ track_line (dict): last 30 frame track record
34
+ box (list): Bounding box data for specific track in current frame
35
+ track_id (int): track ID of the object
36
+ prev_position (tuple): last frame position coordinates of the track
37
+ cls (int): Class index for classwise count updates
38
+ """
39
+ if prev_position is None or track_id in self.counted_ids:
40
+ return
41
+
42
+ centroid = self.r_s.centroid
43
+ dx = (box[0] - prev_position[0]) * (centroid.x - prev_position[0])
44
+ dy = (box[1] - prev_position[1]) * (centroid.y - prev_position[1])
45
+
46
+ if len(self.region) >= 3 and self.r_s.contains(Point(track_line[-1])):
47
+ self.counted_ids.append(track_id)
48
+ # For polygon region
49
+ if dx > 0:
50
+ self.in_count += 1
51
+ self.classwise_counts[self.names[cls]]["IN"] += 1
52
+ else:
53
+ self.out_count += 1
54
+ self.classwise_counts[self.names[cls]]["OUT"] += 1
55
+
56
+ elif len(self.region) < 3 and LineString([prev_position, box[:2]]).intersects(self.l_s):
57
+ self.counted_ids.append(track_id)
58
+ # For linear region
59
+ if dx > 0 and dy > 0:
60
+ self.in_count += 1
61
+ self.classwise_counts[self.names[cls]]["IN"] += 1
62
+ else:
63
+ self.out_count += 1
64
+ self.classwise_counts[self.names[cls]]["OUT"] += 1
65
+
66
+ def store_classwise_counts(self, cls):
67
+ """
68
+ Initialize class-wise counts if not already present.
69
+
70
+ Args:
71
+ cls (int): Class index for classwise count updates
72
+ """
73
+ if self.names[cls] not in self.classwise_counts:
74
+ self.classwise_counts[self.names[cls]] = {"IN": 0, "OUT": 0}
75
+
76
+ def display_counts(self, im0):
77
+ """
78
+ Helper function to display object counts on the frame.
79
+
80
+ Args:
81
+ im0 (ndarray): The input image or frame
82
+ """
83
+ labels_dict = {
84
+ str.capitalize(key): f"{'IN ' + str(value['IN']) if self.show_in else ''} "
85
+ f"{'OUT ' + str(value['OUT']) if self.show_out else ''}".strip()
86
+ for key, value in self.classwise_counts.items()
87
+ if value["IN"] != 0 or value["OUT"] != 0
88
+ }
89
+
90
+ if labels_dict:
91
+ self.annotator.display_analytics(im0, labels_dict, (104, 31, 17), (255, 255, 255), 10)
92
+
93
+ def count(self, im0):
94
+ """
95
+ Processes input data (frames or object tracks) and updates counts.
96
+
97
+ Args:
98
+ im0 (ndarray): The input image that will be used for processing
99
+ Returns
100
+ im0 (ndarray): The processed image for more usage
101
+ """
102
+ self.annotator = Annotator(im0, line_width=self.line_width) # Initialize annotator
103
+ self.extract_tracks(im0) # Extract tracks
104
+
105
+ self.annotator.draw_region(
106
+ reg_pts=self.region, color=(104, 0, 123), thickness=self.line_width * 2
107
+ ) # Draw region
108
+
109
+ # Iterate over bounding boxes, track ids and classes index
110
+ if self.track_data is not None and self.track_data.id is not None:
111
+ for box, track_id, cls in zip(self.boxes, self.track_ids, self.clss):
112
+ # Draw bounding box and counting region
113
+ self.annotator.box_label(box, label=self.names[cls], color=colors(track_id, True))
114
+ self.store_tracking_history(track_id, box) # Store track history
115
+ self.store_classwise_counts(cls) # store classwise counts in dict
116
+
117
+ # Draw centroid of objects
118
+ self.annotator.draw_centroid_and_tracks(
119
+ self.track_line, color=colors(int(track_id), True), track_thickness=self.line_width
120
+ )
121
+
122
+ # store previous position of track for object counting
123
+ prev_position = self.track_history[track_id][-2] if len(self.track_history[track_id]) > 1 else None
124
+ self.count_objects(self.track_line, box, track_id, prev_position, cls) # Perform object counting
125
+
126
+ self.display_counts(im0) # Display the counts on the frame
127
+ self.display_output(im0) # display output with base class function
128
+
129
+ return im0 # return output image for more usage
@@ -0,0 +1,88 @@
1
+ # Ultralytics YOLO 🚀, AGPL-3.0 license
2
+
3
+ from collections import defaultdict
4
+ from pathlib import Path
5
+
6
+ import cv2
7
+ from shapely.geometry import LineString, Polygon
8
+
9
+ from ultralytics import YOLO
10
+ from ultralytics.utils import yaml_load
11
+ from ultralytics.utils.checks import check_imshow
12
+
13
+ DEFAULT_SOL_CFG_PATH = Path(__file__).resolve().parents[1] / "cfg/solutions/default.yaml"
14
+
15
+
16
+ class BaseSolution:
17
+ """A class to manage all the Ultralytics Solutions: https://docs.ultralytics.com/solutions/."""
18
+
19
+ def __init__(self, **kwargs):
20
+ """
21
+ Base initializer for all solutions.
22
+
23
+ Child classes should call this with necessary parameters.
24
+ """
25
+ # Load config and update with args
26
+ self.CFG = yaml_load(DEFAULT_SOL_CFG_PATH)
27
+ self.CFG.update(kwargs)
28
+ print("Ultralytics Solutions: ✅", self.CFG)
29
+
30
+ self.region = self.CFG["region"] # Store region data for other classes usage
31
+ self.line_width = self.CFG["line_width"] # Store line_width for usage
32
+
33
+ # Load Model and store classes names
34
+ self.model = YOLO(self.CFG["model"])
35
+ self.names = self.model.names
36
+
37
+ # Initialize environment and region setup
38
+ self.env_check = check_imshow(warn=True)
39
+ self.track_history = defaultdict(list)
40
+
41
+ def extract_tracks(self, im0):
42
+ """
43
+ Apply object tracking and extract tracks.
44
+
45
+ Args:
46
+ im0 (ndarray): The input image or frame
47
+ """
48
+ self.tracks = self.model.track(source=im0, persist=True, classes=self.CFG["classes"])
49
+
50
+ # Extract tracks for OBB or object detection
51
+ self.track_data = self.tracks[0].obb or self.tracks[0].boxes
52
+
53
+ if self.track_data and self.track_data.id is not None:
54
+ self.boxes = self.track_data.xyxy.cpu()
55
+ self.clss = self.track_data.cls.cpu().tolist()
56
+ self.track_ids = self.track_data.id.int().cpu().tolist()
57
+
58
+ def store_tracking_history(self, track_id, box):
59
+ """
60
+ Store object tracking history.
61
+
62
+ Args:
63
+ track_id (int): The track ID of the object
64
+ box (list): Bounding box coordinates of the object
65
+ """
66
+ # Store tracking history
67
+ self.track_line = self.track_history[track_id]
68
+ self.track_line.append(((box[0] + box[2]) / 2, (box[1] + box[3]) / 2))
69
+ if len(self.track_line) > 30:
70
+ self.track_line.pop(0)
71
+
72
+ def initialize_region(self):
73
+ """Initialize the counting region and line segment based on config."""
74
+ self.region = [(20, 400), (1260, 400)] if self.region is None else self.region
75
+ self.r_s = Polygon(self.region) if len(self.region) >= 3 else LineString(self.region)
76
+ self.l_s = LineString([(self.region[0][0], self.region[0][1]), (self.region[1][0], self.region[1][1])])
77
+
78
+ def display_output(self, im0):
79
+ """
80
+ Display the results of the processing, which could involve showing frames, printing counts, or saving results.
81
+
82
+ Args:
83
+ im0 (ndarray): The input image or frame
84
+ """
85
+ if self.CFG.get("show") and self.env_check:
86
+ cv2.imshow("Ultralytics Solutions", im0)
87
+ if cv2.waitKey(1) & 0xFF == ord("q"):
88
+ return
@@ -61,8 +61,8 @@ HELP_MSG = """
61
61
  from ultralytics import YOLO
62
62
 
63
63
  # Load a model
64
- model = YOLO("yolov8n.yaml") # build a new model from scratch
65
- model = YOLO("yolov8n.pt") # load a pretrained model (recommended for training)
64
+ model = YOLO("yolo11n.yaml") # build a new model from scratch
65
+ model = YOLO("yolo11n.pt") # load a pretrained model (recommended for training)
66
66
 
67
67
  # Use the model
68
68
  results = model.train(data="coco8.yaml", epochs=3) # train the model
@@ -77,21 +77,21 @@ HELP_MSG = """
77
77
  yolo TASK MODE ARGS
78
78
 
79
79
  Where TASK (optional) is one of [detect, segment, classify, pose, obb]
80
- MODE (required) is one of [train, val, predict, export, benchmark]
80
+ MODE (required) is one of [train, val, predict, export, track, benchmark]
81
81
  ARGS (optional) are any number of custom "arg=value" pairs like "imgsz=320" that override defaults.
82
82
  See all ARGS at https://docs.ultralytics.com/usage/cfg or with "yolo cfg"
83
83
 
84
84
  - Train a detection model for 10 epochs with an initial learning_rate of 0.01
85
- yolo detect train data=coco8.yaml model=yolov8n.pt epochs=10 lr0=0.01
85
+ yolo detect train data=coco8.yaml model=yolo11n.pt epochs=10 lr0=0.01
86
86
 
87
87
  - Predict a YouTube video using a pretrained segmentation model at image size 320:
88
- yolo segment predict model=yolov8n-seg.pt source='https://youtu.be/LNwODJXcvt4' imgsz=320
88
+ yolo segment predict model=yolo11n-seg.pt source='https://youtu.be/LNwODJXcvt4' imgsz=320
89
89
 
90
90
  - Val a pretrained detection model at batch-size 1 and image size 640:
91
- yolo detect val model=yolov8n.pt data=coco8.yaml batch=1 imgsz=640
91
+ yolo detect val model=yolo11n.pt data=coco8.yaml batch=1 imgsz=640
92
92
 
93
- - Export a YOLOv8n classification model to ONNX format at image size 224 by 128 (no TASK required)
94
- yolo export model=yolov8n-cls.pt format=onnx imgsz=224,128
93
+ - Export a YOLO11n classification model to ONNX format at image size 224 by 128 (no TASK required)
94
+ yolo export model=yolo11n-cls.pt format=onnx imgsz=224,128
95
95
 
96
96
  - Run special commands:
97
97
  yolo help
@@ -1030,6 +1030,7 @@ def set_sentry():
1030
1030
  sentry_sdk.init(
1031
1031
  dsn="https://888e5a0778212e1d0314c37d4b9aae5d@o4504521589325824.ingest.us.sentry.io/4504521592406016",
1032
1032
  debug=False,
1033
+ auto_enabling_integrations=False,
1033
1034
  traces_sample_rate=1.0,
1034
1035
  release=__version__,
1035
1036
  environment="production", # 'dev' or 'production'
@@ -170,6 +170,8 @@ def select_device(device="", batch=0, newline=False, verbose=True):
170
170
  elif device: # non-cpu device requested
171
171
  if device == "cuda":
172
172
  device = "0"
173
+ if "," in device:
174
+ device = ",".join([x for x in device.split(",") if x]) # remove sequential commas, i.e. "0,,1" -> "0,1"
173
175
  visible = os.environ.get("CUDA_VISIBLE_DEVICES", None)
174
176
  os.environ["CUDA_VISIBLE_DEVICES"] = device # set environment variable - must be before assert is_available()
175
177
  if not (torch.cuda.is_available() and torch.cuda.device_count() >= len(device.split(","))):
@@ -191,7 +193,7 @@ def select_device(device="", batch=0, newline=False, verbose=True):
191
193
  )
192
194
 
193
195
  if not cpu and not mps and torch.cuda.is_available(): # prefer GPU if available
194
- devices = device.split(",") if device else "0" # range(torch.cuda.device_count()) # i.e. 0,1,6,7
196
+ devices = device.split(",") if device else "0" # i.e. "0,1" -> ["0", "1"]
195
197
  n = len(devices) # device count
196
198
  if n > 1: # multi-GPU
197
199
  if batch < 1:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ultralytics
3
- Version: 8.3.3
3
+ Version: 8.3.5
4
4
  Summary: Ultralytics YOLO for SOTA object detection, multi-object tracking, instance segmentation, pose estimation and image classification.
5
5
  Author: Ayush Chaurasia
6
6
  Author-email: Glenn Jocher <glenn.jocher@ultralytics.com>, Jing Qiu <jing.qiu@ultralytics.com>
@@ -33,7 +33,7 @@ Classifier: Operating System :: Microsoft :: Windows
33
33
  Requires-Python: >=3.8
34
34
  Description-Content-Type: text/markdown
35
35
  License-File: LICENSE
36
- Requires-Dist: numpy<2.0.0,>=1.23.0
36
+ Requires-Dist: numpy>=1.23.0
37
37
  Requires-Dist: matplotlib>=3.3.0
38
38
  Requires-Dist: opencv-python>=4.6.0
39
39
  Requires-Dist: pillow>=7.1.2
@@ -64,6 +64,7 @@ Requires-Dist: mkdocs-macros-plugin>=1.0.5; extra == "dev"
64
64
  Provides-Extra: export
65
65
  Requires-Dist: onnx>=1.12.0; extra == "export"
66
66
  Requires-Dist: coremltools>=7.0; (platform_system != "Windows" and python_version <= "3.11") and extra == "export"
67
+ Requires-Dist: scikit-learn>=1.3.2; (platform_system != "Windows" and python_version <= "3.11") and extra == "export"
67
68
  Requires-Dist: openvino>=2024.0.0; extra == "export"
68
69
  Requires-Dist: tensorflow>=2.0.0; extra == "export"
69
70
  Requires-Dist: tensorflowjs>=3.9.0; extra == "export"
@@ -103,6 +103,7 @@ ultralytics/cfg/models/v9/yolov9e.yaml
103
103
  ultralytics/cfg/models/v9/yolov9m.yaml
104
104
  ultralytics/cfg/models/v9/yolov9s.yaml
105
105
  ultralytics/cfg/models/v9/yolov9t.yaml
106
+ ultralytics/cfg/solutions/default.yaml
106
107
  ultralytics/cfg/trackers/botsort.yaml
107
108
  ultralytics/cfg/trackers/bytetrack.yaml
108
109
  ultralytics/data/__init__.py
@@ -208,6 +209,7 @@ ultralytics/solutions/heatmap.py
208
209
  ultralytics/solutions/object_counter.py
209
210
  ultralytics/solutions/parking_management.py
210
211
  ultralytics/solutions/queue_management.py
212
+ ultralytics/solutions/solutions.py
211
213
  ultralytics/solutions/speed_estimation.py
212
214
  ultralytics/solutions/streamlit_inference.py
213
215
  ultralytics/trackers/__init__.py
@@ -1,4 +1,4 @@
1
- numpy<2.0.0,>=1.23.0
1
+ numpy>=1.23.0
2
2
  matplotlib>=3.3.0
3
3
  opencv-python>=4.6.0
4
4
  pillow>=7.1.2
@@ -52,6 +52,7 @@ tensorstore>=0.1.63
52
52
 
53
53
  [export:platform_system != "Windows" and python_version <= "3.11"]
54
54
  coremltools>=7.0
55
+ scikit-learn>=1.3.2
55
56
 
56
57
  [extra]
57
58
  hub-sdk>=0.0.12