ultralytics 8.3.8__tar.gz → 8.3.9__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 (248) hide show
  1. {ultralytics-8.3.8/ultralytics.egg-info → ultralytics-8.3.9}/PKG-INFO +1 -1
  2. {ultralytics-8.3.8 → ultralytics-8.3.9}/tests/test_solutions.py +2 -5
  3. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/__init__.py +1 -1
  4. ultralytics-8.3.9/ultralytics/cfg/solutions/default.yaml +16 -0
  5. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/engine/trainer.py +7 -8
  6. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/nn/autobackend.py +2 -2
  7. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/nn/tasks.py +2 -2
  8. ultralytics-8.3.9/ultralytics/solutions/speed_estimation.py +76 -0
  9. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/utils/autobatch.py +1 -1
  10. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/utils/callbacks/clearml.py +2 -2
  11. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/utils/callbacks/comet.py +4 -4
  12. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/utils/callbacks/mlflow.py +1 -1
  13. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/utils/callbacks/neptune.py +5 -1
  14. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/utils/callbacks/wb.py +1 -1
  15. {ultralytics-8.3.8 → ultralytics-8.3.9/ultralytics.egg-info}/PKG-INFO +1 -1
  16. ultralytics-8.3.8/ultralytics/cfg/solutions/default.yaml +0 -16
  17. ultralytics-8.3.8/ultralytics/solutions/speed_estimation.py +0 -116
  18. {ultralytics-8.3.8 → ultralytics-8.3.9}/LICENSE +0 -0
  19. {ultralytics-8.3.8 → ultralytics-8.3.9}/README.md +0 -0
  20. {ultralytics-8.3.8 → ultralytics-8.3.9}/pyproject.toml +0 -0
  21. {ultralytics-8.3.8 → ultralytics-8.3.9}/setup.cfg +0 -0
  22. {ultralytics-8.3.8 → ultralytics-8.3.9}/tests/__init__.py +0 -0
  23. {ultralytics-8.3.8 → ultralytics-8.3.9}/tests/conftest.py +0 -0
  24. {ultralytics-8.3.8 → ultralytics-8.3.9}/tests/test_cli.py +0 -0
  25. {ultralytics-8.3.8 → ultralytics-8.3.9}/tests/test_cuda.py +0 -0
  26. {ultralytics-8.3.8 → ultralytics-8.3.9}/tests/test_engine.py +0 -0
  27. {ultralytics-8.3.8 → ultralytics-8.3.9}/tests/test_explorer.py +0 -0
  28. {ultralytics-8.3.8 → ultralytics-8.3.9}/tests/test_exports.py +0 -0
  29. {ultralytics-8.3.8 → ultralytics-8.3.9}/tests/test_integrations.py +0 -0
  30. {ultralytics-8.3.8 → ultralytics-8.3.9}/tests/test_python.py +0 -0
  31. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/assets/bus.jpg +0 -0
  32. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/assets/zidane.jpg +0 -0
  33. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/__init__.py +0 -0
  34. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
  35. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
  36. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
  37. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
  38. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
  39. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
  40. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
  41. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/datasets/VOC.yaml +0 -0
  42. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
  43. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
  44. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
  45. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
  46. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
  47. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/datasets/coco.yaml +0 -0
  48. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
  49. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/datasets/coco128.yaml +0 -0
  50. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
  51. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
  52. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/datasets/coco8.yaml +0 -0
  53. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
  54. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/datasets/dota8.yaml +0 -0
  55. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/datasets/hand-keypoints.yaml +0 -0
  56. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/datasets/lvis.yaml +0 -0
  57. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
  58. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
  59. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/datasets/signature.yaml +0 -0
  60. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
  61. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/datasets/xView.yaml +0 -0
  62. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/default.yaml +0 -0
  63. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/models/11/yolo11-cls.yaml +0 -0
  64. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/models/11/yolo11-obb.yaml +0 -0
  65. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/models/11/yolo11-pose.yaml +0 -0
  66. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/models/11/yolo11-seg.yaml +0 -0
  67. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/models/11/yolo11.yaml +0 -0
  68. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
  69. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
  70. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
  71. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
  72. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/models/v10/yolov10b.yaml +0 -0
  73. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/models/v10/yolov10l.yaml +0 -0
  74. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/models/v10/yolov10m.yaml +0 -0
  75. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/models/v10/yolov10n.yaml +0 -0
  76. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/models/v10/yolov10s.yaml +0 -0
  77. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/models/v10/yolov10x.yaml +0 -0
  78. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
  79. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
  80. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
  81. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
  82. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
  83. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
  84. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
  85. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
  86. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
  87. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
  88. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
  89. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
  90. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
  91. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
  92. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
  93. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
  94. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
  95. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
  96. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
  97. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
  98. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
  99. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
  100. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
  101. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
  102. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
  103. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
  104. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
  105. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/models/v9/yolov9m.yaml +0 -0
  106. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/models/v9/yolov9s.yaml +0 -0
  107. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/models/v9/yolov9t.yaml +0 -0
  108. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/trackers/botsort.yaml +0 -0
  109. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
  110. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/data/__init__.py +0 -0
  111. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/data/annotator.py +0 -0
  112. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/data/augment.py +0 -0
  113. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/data/base.py +0 -0
  114. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/data/build.py +0 -0
  115. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/data/converter.py +0 -0
  116. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/data/dataset.py +0 -0
  117. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/data/explorer/__init__.py +0 -0
  118. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/data/explorer/explorer.py +0 -0
  119. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/data/explorer/gui/__init__.py +0 -0
  120. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/data/explorer/gui/dash.py +0 -0
  121. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/data/explorer/utils.py +0 -0
  122. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/data/loaders.py +0 -0
  123. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/data/split_dota.py +0 -0
  124. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/data/utils.py +0 -0
  125. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/engine/__init__.py +0 -0
  126. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/engine/exporter.py +0 -0
  127. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/engine/model.py +0 -0
  128. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/engine/predictor.py +0 -0
  129. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/engine/results.py +0 -0
  130. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/engine/tuner.py +0 -0
  131. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/engine/validator.py +0 -0
  132. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/hub/__init__.py +0 -0
  133. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/hub/auth.py +0 -0
  134. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/hub/google/__init__.py +0 -0
  135. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/hub/session.py +0 -0
  136. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/hub/utils.py +0 -0
  137. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/__init__.py +0 -0
  138. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/fastsam/__init__.py +0 -0
  139. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/fastsam/model.py +0 -0
  140. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/fastsam/predict.py +0 -0
  141. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/fastsam/utils.py +0 -0
  142. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/fastsam/val.py +0 -0
  143. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/nas/__init__.py +0 -0
  144. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/nas/model.py +0 -0
  145. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/nas/predict.py +0 -0
  146. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/nas/val.py +0 -0
  147. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/rtdetr/__init__.py +0 -0
  148. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/rtdetr/model.py +0 -0
  149. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/rtdetr/predict.py +0 -0
  150. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/rtdetr/train.py +0 -0
  151. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/rtdetr/val.py +0 -0
  152. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/sam/__init__.py +0 -0
  153. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/sam/amg.py +0 -0
  154. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/sam/build.py +0 -0
  155. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/sam/model.py +0 -0
  156. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/sam/modules/__init__.py +0 -0
  157. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/sam/modules/blocks.py +0 -0
  158. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/sam/modules/decoders.py +0 -0
  159. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/sam/modules/encoders.py +0 -0
  160. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/sam/modules/memory_attention.py +0 -0
  161. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/sam/modules/sam.py +0 -0
  162. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
  163. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/sam/modules/transformer.py +0 -0
  164. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/sam/modules/utils.py +0 -0
  165. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/sam/predict.py +0 -0
  166. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/utils/__init__.py +0 -0
  167. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/utils/loss.py +0 -0
  168. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/utils/ops.py +0 -0
  169. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/yolo/__init__.py +0 -0
  170. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/yolo/classify/__init__.py +0 -0
  171. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/yolo/classify/predict.py +0 -0
  172. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/yolo/classify/train.py +0 -0
  173. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/yolo/classify/val.py +0 -0
  174. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/yolo/detect/__init__.py +0 -0
  175. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/yolo/detect/predict.py +0 -0
  176. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/yolo/detect/train.py +0 -0
  177. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/yolo/detect/val.py +0 -0
  178. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/yolo/model.py +0 -0
  179. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/yolo/obb/__init__.py +0 -0
  180. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/yolo/obb/predict.py +0 -0
  181. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/yolo/obb/train.py +0 -0
  182. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/yolo/obb/val.py +0 -0
  183. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/yolo/pose/__init__.py +0 -0
  184. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/yolo/pose/predict.py +0 -0
  185. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/yolo/pose/train.py +0 -0
  186. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/yolo/pose/val.py +0 -0
  187. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/yolo/segment/__init__.py +0 -0
  188. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/yolo/segment/predict.py +0 -0
  189. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/yolo/segment/train.py +0 -0
  190. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/yolo/segment/val.py +0 -0
  191. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/yolo/world/__init__.py +0 -0
  192. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/yolo/world/train.py +0 -0
  193. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/models/yolo/world/train_world.py +0 -0
  194. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/nn/__init__.py +0 -0
  195. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/nn/modules/__init__.py +0 -0
  196. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/nn/modules/activation.py +0 -0
  197. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/nn/modules/block.py +0 -0
  198. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/nn/modules/conv.py +0 -0
  199. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/nn/modules/head.py +0 -0
  200. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/nn/modules/transformer.py +0 -0
  201. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/nn/modules/utils.py +0 -0
  202. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/solutions/__init__.py +0 -0
  203. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/solutions/ai_gym.py +0 -0
  204. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/solutions/analytics.py +0 -0
  205. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/solutions/distance_calculation.py +0 -0
  206. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/solutions/heatmap.py +0 -0
  207. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/solutions/object_counter.py +0 -0
  208. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/solutions/parking_management.py +0 -0
  209. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/solutions/queue_management.py +0 -0
  210. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/solutions/solutions.py +0 -0
  211. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/solutions/streamlit_inference.py +0 -0
  212. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/trackers/__init__.py +0 -0
  213. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/trackers/basetrack.py +0 -0
  214. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/trackers/bot_sort.py +0 -0
  215. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/trackers/byte_tracker.py +0 -0
  216. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/trackers/track.py +0 -0
  217. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/trackers/utils/__init__.py +0 -0
  218. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/trackers/utils/gmc.py +0 -0
  219. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/trackers/utils/kalman_filter.py +0 -0
  220. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/trackers/utils/matching.py +0 -0
  221. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/utils/__init__.py +0 -0
  222. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/utils/benchmarks.py +0 -0
  223. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/utils/callbacks/__init__.py +0 -0
  224. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/utils/callbacks/base.py +0 -0
  225. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/utils/callbacks/dvc.py +0 -0
  226. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/utils/callbacks/hub.py +0 -0
  227. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/utils/callbacks/raytune.py +0 -0
  228. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/utils/callbacks/tensorboard.py +0 -0
  229. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/utils/checks.py +0 -0
  230. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/utils/dist.py +0 -0
  231. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/utils/downloads.py +0 -0
  232. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/utils/errors.py +0 -0
  233. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/utils/files.py +0 -0
  234. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/utils/instance.py +0 -0
  235. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/utils/loss.py +0 -0
  236. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/utils/metrics.py +0 -0
  237. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/utils/ops.py +0 -0
  238. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/utils/patches.py +0 -0
  239. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/utils/plotting.py +0 -0
  240. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/utils/tal.py +0 -0
  241. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/utils/torch_utils.py +0 -0
  242. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/utils/triton.py +0 -0
  243. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics/utils/tuner.py +0 -0
  244. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics.egg-info/SOURCES.txt +0 -0
  245. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics.egg-info/dependency_links.txt +0 -0
  246. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics.egg-info/entry_points.txt +0 -0
  247. {ultralytics-8.3.8 → ultralytics-8.3.9}/ultralytics.egg-info/requires.txt +0 -0
  248. {ultralytics-8.3.8 → ultralytics-8.3.9}/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.8
3
+ Version: 8.3.9
4
4
  Summary: Ultralytics YOLO for SOTA object detection, multi-object tracking, instance segmentation, pose estimation and image classification.
5
5
  Author-email: Glenn Jocher <glenn.jocher@ultralytics.com>, Jing Qiu <jing.qiu@ultralytics.com>
6
6
  Maintainer-email: Ultralytics <hello@ultralytics.com>
@@ -14,24 +14,21 @@ WORKOUTS_SOLUTION_DEMO = "https://github.com/ultralytics/assets/releases/downloa
14
14
  def test_major_solutions():
15
15
  """Test the object counting, heatmap, speed estimation and queue management solution."""
16
16
  safe_download(url=MAJOR_SOLUTIONS_DEMO)
17
- model = YOLO("yolo11n.pt")
18
- names = model.names
19
17
  cap = cv2.VideoCapture("solutions_ci_demo.mp4")
20
18
  assert cap.isOpened(), "Error reading video file"
21
19
  region_points = [(20, 400), (1080, 404), (1080, 360), (20, 360)]
22
20
  counter = solutions.ObjectCounter(region=region_points, model="yolo11n.pt", show=False)
23
21
  heatmap = solutions.Heatmap(colormap=cv2.COLORMAP_PARULA, model="yolo11n.pt", show=False)
24
- speed = solutions.SpeedEstimator(reg_pts=region_points, names=names, view_img=False)
22
+ speed = solutions.SpeedEstimator(region=region_points, model="yolo11n.pt", show=False)
25
23
  queue = solutions.QueueManager(region=region_points, model="yolo11n.pt", show=False)
26
24
  while cap.isOpened():
27
25
  success, im0 = cap.read()
28
26
  if not success:
29
27
  break
30
28
  original_im0 = im0.copy()
31
- tracks = model.track(im0, persist=True, show=False)
32
29
  _ = counter.count(original_im0.copy())
33
30
  _ = heatmap.generate_heatmap(original_im0.copy())
34
- _ = speed.estimate_speed(original_im0.copy(), tracks)
31
+ _ = speed.estimate_speed(original_im0.copy())
35
32
  _ = queue.process_queue(original_im0.copy())
36
33
  cap.release()
37
34
  cv2.destroyAllWindows()
@@ -1,6 +1,6 @@
1
1
  # Ultralytics YOLO 🚀, AGPL-3.0 license
2
2
 
3
- __version__ = "8.3.8"
3
+ __version__ = "8.3.9"
4
4
 
5
5
  import os
6
6
 
@@ -0,0 +1,16 @@
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 and yolov8n.pt for YOLOv8 nano version)
6
+
7
+ region: # Object counting, queue or speed estimation region points. Default region points are [(20, 400), (1080, 404), (1080, 360), (20, 360)]
8
+ line_width: 2 # Width of the annotator used to draw regions on the image/video frames + bounding boxes and tracks drawing. Default value is 2.
9
+ show: True # Flag to control whether to display output image or not, you can set this as False i.e. when deploying it on some embedded devices.
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. i.e, if you want to detect, track and count the person with COCO model, you can use classes=0, Default its None
13
+ up_angle: 145.0 # Workouts up_angle for counts, 145.0 is default value. You can adjust it for different workouts, based on position of keypoints.
14
+ down_angle: 90 # Workouts down_angle for counts, 90 is default value. You can change it for different workouts, based on position of keypoints.
15
+ kpts: [6, 8, 10] # Keypoints for workouts monitoring, i.e. If you want to consider keypoints for pushups that have mostly values of [6, 8, 10].
16
+ colormap: # Colormap for heatmap, Only OPENCV supported colormaps can be used. By default COLORMAP_PARULA will be used for visualization.
@@ -469,11 +469,9 @@ class BaseTrainer:
469
469
 
470
470
  if RANK in {-1, 0}:
471
471
  # Do final val with best.pt
472
- epochs = epoch - self.start_epoch + 1 # total training epochs
473
- seconds = time.time() - self.train_time_start # total training seconds
474
- LOGGER.info(f"\n{epochs} epochs completed in {seconds / 3600:.3f} hours.")
472
+ seconds = time.time() - self.train_time_start
473
+ LOGGER.info(f"\n{epoch - self.start_epoch + 1} epochs completed in {seconds / 3600:.3f} hours.")
475
474
  self.final_eval()
476
- self.validator.metrics.training = {"epochs": epochs, "seconds": seconds} # add training speed
477
475
  if self.args.plots:
478
476
  self.plot_metrics()
479
477
  self.run_callbacks("on_train_end")
@@ -504,7 +502,7 @@ class BaseTrainer:
504
502
  """Read results.csv into a dict using pandas."""
505
503
  import pandas as pd # scope for faster 'import ultralytics'
506
504
 
507
- return {k.strip(): v for k, v in pd.read_csv(self.csv).to_dict(orient="list").items()}
505
+ return pd.read_csv(self.csv).to_dict(orient="list")
508
506
 
509
507
  def save_model(self):
510
508
  """Save model training checkpoints with additional metadata."""
@@ -654,10 +652,11 @@ class BaseTrainer:
654
652
  def save_metrics(self, metrics):
655
653
  """Saves training metrics to a CSV file."""
656
654
  keys, vals = list(metrics.keys()), list(metrics.values())
657
- n = len(metrics) + 1 # number of cols
658
- s = "" if self.csv.exists() else (("%23s," * n % tuple(["epoch"] + keys)).rstrip(",") + "\n") # header
655
+ n = len(metrics) + 2 # number of cols
656
+ s = "" if self.csv.exists() else (("%s," * n % tuple(["epoch", "time"] + keys)).rstrip(",") + "\n") # header
657
+ t = time.time() - self.train_time_start
659
658
  with open(self.csv, "a") as f:
660
- f.write(s + ("%23.5g," * n % tuple([self.epoch + 1] + vals)).rstrip(",") + "\n")
659
+ f.write(s + ("%.6g," * n % tuple([self.epoch + 1, t] + vals)).rstrip(",") + "\n")
661
660
 
662
661
  def plot_metrics(self):
663
662
  """Plot and display metrics visually."""
@@ -265,8 +265,8 @@ class AutoBackend(nn.Module):
265
265
  if -1 in tuple(model.get_tensor_shape(name)):
266
266
  dynamic = True
267
267
  context.set_input_shape(name, tuple(model.get_tensor_profile_shape(name, 0)[1]))
268
- if dtype == np.float16:
269
- fp16 = True
268
+ if dtype == np.float16:
269
+ fp16 = True
270
270
  else:
271
271
  output_names.append(name)
272
272
  shape = tuple(context.get_tensor_shape(name))
@@ -1061,10 +1061,10 @@ def parse_model(d, ch, verbose=True): # model_dict, input_channels(3)
1061
1061
 
1062
1062
  m_ = nn.Sequential(*(m(*args) for _ in range(n))) if n > 1 else m(*args) # module
1063
1063
  t = str(m)[8:-2].replace("__main__.", "") # module type
1064
- m.np = sum(x.numel() for x in m_.parameters()) # number params
1064
+ m_.np = sum(x.numel() for x in m_.parameters()) # number params
1065
1065
  m_.i, m_.f, m_.type = i, f, t # attach index, 'from' index, type
1066
1066
  if verbose:
1067
- LOGGER.info(f"{i:>3}{str(f):>20}{n_:>3}{m.np:10.0f} {t:<45}{str(args):<30}") # print
1067
+ LOGGER.info(f"{i:>3}{str(f):>20}{n_:>3}{m_.np:10.0f} {t:<45}{str(args):<30}") # print
1068
1068
  save.extend(x % i for x in ([f] if isinstance(f, int) else f) if x != -1) # append to savelist
1069
1069
  layers.append(m_)
1070
1070
  if i == 0:
@@ -0,0 +1,76 @@
1
+ # Ultralytics YOLO 🚀, AGPL-3.0 license
2
+
3
+ from time import time
4
+
5
+ import numpy as np
6
+
7
+ from ultralytics.solutions.solutions import BaseSolution, LineString
8
+ from ultralytics.utils.plotting import Annotator, colors
9
+
10
+
11
+ class SpeedEstimator(BaseSolution):
12
+ """A class to estimate the speed of objects in a real-time video stream based on their tracks."""
13
+
14
+ def __init__(self, **kwargs):
15
+ """Initializes the SpeedEstimator with the given parameters."""
16
+ super().__init__(**kwargs)
17
+
18
+ self.initialize_region() # Initialize speed region
19
+
20
+ self.spd = {} # set for speed data
21
+ self.trkd_ids = [] # list for already speed_estimated and tracked ID's
22
+ self.trk_pt = {} # set for tracks previous time
23
+ self.trk_pp = {} # set for tracks previous point
24
+
25
+ def estimate_speed(self, im0):
26
+ """
27
+ Estimates the speed of objects based on tracking data.
28
+
29
+ Args:
30
+ im0 (ndarray): The input image that will be used for processing
31
+ Returns
32
+ im0 (ndarray): The processed image for more usage
33
+ """
34
+ self.annotator = Annotator(im0, line_width=self.line_width) # Initialize annotator
35
+ self.extract_tracks(im0) # Extract tracks
36
+
37
+ self.annotator.draw_region(
38
+ reg_pts=self.region, color=(104, 0, 123), thickness=self.line_width * 2
39
+ ) # Draw region
40
+
41
+ for box, track_id, cls in zip(self.boxes, self.track_ids, self.clss):
42
+ self.store_tracking_history(track_id, box) # Store track history
43
+
44
+ # Check if track_id is already in self.trk_pp or trk_pt initialize if not
45
+ if track_id not in self.trk_pt:
46
+ self.trk_pt[track_id] = 0
47
+ if track_id not in self.trk_pp:
48
+ self.trk_pp[track_id] = self.track_line[-1]
49
+
50
+ speed_label = f"{int(self.spd[track_id])} km/h" if track_id in self.spd else self.names[int(cls)]
51
+ self.annotator.box_label(box, label=speed_label, color=colors(track_id, True)) # Draw bounding box
52
+
53
+ # Draw tracks of objects
54
+ self.annotator.draw_centroid_and_tracks(
55
+ self.track_line, color=colors(int(track_id), True), track_thickness=self.line_width
56
+ )
57
+
58
+ # Calculate object speed and direction based on region intersection
59
+ if LineString([self.trk_pp[track_id], self.track_line[-1]]).intersects(self.l_s):
60
+ direction = "known"
61
+ else:
62
+ direction = "unknown"
63
+
64
+ # Perform speed calculation and tracking updates if direction is valid
65
+ if direction == "known" and track_id not in self.trkd_ids:
66
+ self.trkd_ids.append(track_id)
67
+ time_difference = time() - self.trk_pt[track_id]
68
+ if time_difference > 0:
69
+ self.spd[track_id] = np.abs(self.track_line[-1][1] - self.trk_pp[track_id][1]) / time_difference
70
+
71
+ self.trk_pt[track_id] = time()
72
+ self.trk_pp[track_id] = self.track_line[-1]
73
+
74
+ self.display_output(im0) # display output with base class function
75
+
76
+ return im0 # return output image for more usage
@@ -67,7 +67,7 @@ def autobatch(model, imgsz=640, fraction=0.60, batch_size=DEFAULT_CFG.batch):
67
67
  LOGGER.info(f"{prefix}{d} ({properties.name}) {t:.2f}G total, {r:.2f}G reserved, {a:.2f}G allocated, {f:.2f}G free")
68
68
 
69
69
  # Profile batch sizes
70
- batch_sizes = [1, 2, 4, 8, 16]
70
+ batch_sizes = [1, 2, 4, 8, 16] if t < 16 else [1, 2, 4, 8, 16, 32, 64]
71
71
  try:
72
72
  img = [torch.empty(b, 3, imgsz, imgsz) for b in batch_sizes]
73
73
  results = profile(img, model, n=1, device=device)
@@ -68,9 +68,9 @@ def on_pretrain_routine_start(trainer):
68
68
  PatchedMatplotlib.update_current_task(None)
69
69
  else:
70
70
  task = Task.init(
71
- project_name=trainer.args.project or "YOLOv8",
71
+ project_name=trainer.args.project or "Ultralytics",
72
72
  task_name=trainer.args.name,
73
- tags=["YOLOv8"],
73
+ tags=["Ultralytics"],
74
74
  output_uri=True,
75
75
  reuse_last_task_id=False,
76
76
  auto_connect_frameworks={"pytorch": False, "matplotlib": False},
@@ -15,7 +15,7 @@ try:
15
15
  # Ensures certain logging functions only run for supported tasks
16
16
  COMET_SUPPORTED_TASKS = ["detect"]
17
17
 
18
- # Names of plots created by YOLOv8 that are logged to Comet
18
+ # Names of plots created by Ultralytics that are logged to Comet
19
19
  EVALUATION_PLOT_NAMES = "F1_curve", "P_curve", "R_curve", "PR_curve", "confusion_matrix"
20
20
  LABEL_PLOT_NAMES = "labels", "labels_correlogram"
21
21
 
@@ -31,8 +31,8 @@ def _get_comet_mode():
31
31
 
32
32
 
33
33
  def _get_comet_model_name():
34
- """Returns the model name for Comet from the environment variable 'COMET_MODEL_NAME' or defaults to 'YOLOv8'."""
35
- return os.getenv("COMET_MODEL_NAME", "YOLOv8")
34
+ """Returns the model name for Comet from the environment variable COMET_MODEL_NAME or defaults to 'Ultralytics'."""
35
+ return os.getenv("COMET_MODEL_NAME", "Ultralytics")
36
36
 
37
37
 
38
38
  def _get_eval_batch_logging_interval():
@@ -110,7 +110,7 @@ def _fetch_trainer_metadata(trainer):
110
110
 
111
111
  def _scale_bounding_box_to_original_image_shape(box, resized_image_shape, original_image_shape, ratio_pad):
112
112
  """
113
- YOLOv8 resizes images during training and the label values are normalized based on this resized shape.
113
+ YOLO resizes images during training and the label values are normalized based on this resized shape.
114
114
 
115
115
  This function rescales the bounding box labels to the original image shape.
116
116
  """
@@ -71,7 +71,7 @@ def on_pretrain_routine_end(trainer):
71
71
  mlflow.set_tracking_uri(uri)
72
72
 
73
73
  # Set experiment and run names
74
- experiment_name = os.environ.get("MLFLOW_EXPERIMENT_NAME") or trainer.args.project or "/Shared/YOLOv8"
74
+ experiment_name = os.environ.get("MLFLOW_EXPERIMENT_NAME") or trainer.args.project or "/Shared/Ultralytics"
75
75
  run_name = os.environ.get("MLFLOW_RUN") or trainer.args.name
76
76
  mlflow.set_experiment(experiment_name)
77
77
 
@@ -52,7 +52,11 @@ def on_pretrain_routine_start(trainer):
52
52
  """Callback function called before the training routine starts."""
53
53
  try:
54
54
  global run
55
- run = neptune.init_run(project=trainer.args.project or "YOLOv8", name=trainer.args.name, tags=["YOLOv8"])
55
+ run = neptune.init_run(
56
+ project=trainer.args.project or "Ultralytics",
57
+ name=trainer.args.name,
58
+ tags=["Ultralytics"],
59
+ )
56
60
  run["Configuration/Hyperparameters"] = {k: "" if v is None else v for k, v in vars(trainer.args).items()}
57
61
  except Exception as e:
58
62
  LOGGER.warning(f"WARNING ⚠️ NeptuneAI installed but not initialized correctly, not logging this run. {e}")
@@ -109,7 +109,7 @@ def _log_plots(plots, step):
109
109
 
110
110
  def on_pretrain_routine_start(trainer):
111
111
  """Initiate and start project if module is present."""
112
- wb.run or wb.init(project=trainer.args.project or "YOLOv8", name=trainer.args.name, config=vars(trainer.args))
112
+ wb.run or wb.init(project=trainer.args.project or "Ultralytics", name=trainer.args.name, config=vars(trainer.args))
113
113
 
114
114
 
115
115
  def on_fit_epoch_end(trainer):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ultralytics
3
- Version: 8.3.8
3
+ Version: 8.3.9
4
4
  Summary: Ultralytics YOLO for SOTA object detection, multi-object tracking, instance segmentation, pose estimation and image classification.
5
5
  Author-email: Glenn Jocher <glenn.jocher@ultralytics.com>, Jing Qiu <jing.qiu@ultralytics.com>
6
6
  Maintainer-email: Ultralytics <hello@ultralytics.com>
@@ -1,16 +0,0 @@
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
13
- up_angle: 145.0 # Workouts up_angle for counts, 145.0 is default value
14
- down_angle: 90 # Workouts down_angle for counts, 90 is default value
15
- kpts: [6, 8, 10] # Keypoints for workouts monitoring
16
- colormap: # Colormap for heatmap
@@ -1,116 +0,0 @@
1
- # Ultralytics YOLO 🚀, AGPL-3.0 license
2
-
3
- from collections import defaultdict
4
- from time import time
5
-
6
- import cv2
7
- import numpy as np
8
-
9
- from ultralytics.utils.checks import check_imshow
10
- from ultralytics.utils.plotting import Annotator, colors
11
-
12
-
13
- class SpeedEstimator:
14
- """A class to estimate the speed of objects in a real-time video stream based on their tracks."""
15
-
16
- def __init__(self, names, reg_pts=None, view_img=False, line_thickness=2, spdl_dist_thresh=10):
17
- """
18
- Initializes the SpeedEstimator with the given parameters.
19
-
20
- Args:
21
- names (dict): Dictionary of class names.
22
- reg_pts (list, optional): List of region points for speed estimation. Defaults to [(20, 400), (1260, 400)].
23
- view_img (bool, optional): Whether to display the image with annotations. Defaults to False.
24
- line_thickness (int, optional): Thickness of the lines for drawing boxes and tracks. Defaults to 2.
25
- spdl_dist_thresh (int, optional): Distance threshold for speed calculation. Defaults to 10.
26
- """
27
- # Region information
28
- self.reg_pts = reg_pts if reg_pts is not None else [(20, 400), (1260, 400)]
29
-
30
- self.names = names # Classes names
31
-
32
- # Tracking information
33
- self.trk_history = defaultdict(list)
34
-
35
- self.view_img = view_img # bool for displaying inference
36
- self.tf = line_thickness # line thickness for annotator
37
- self.spd = {} # set for speed data
38
- self.trkd_ids = [] # list for already speed_estimated and tracked ID's
39
- self.spdl = spdl_dist_thresh # Speed line distance threshold
40
- self.trk_pt = {} # set for tracks previous time
41
- self.trk_pp = {} # set for tracks previous point
42
-
43
- # Check if the environment supports imshow
44
- self.env_check = check_imshow(warn=True)
45
-
46
- def estimate_speed(self, im0, tracks):
47
- """
48
- Estimates the speed of objects based on tracking data.
49
-
50
- Args:
51
- im0 (ndarray): Image.
52
- tracks (list): List of tracks obtained from the object tracking process.
53
-
54
- Returns:
55
- (ndarray): The image with annotated boxes and tracks.
56
- """
57
- if tracks[0].boxes.id is None:
58
- return im0
59
-
60
- boxes = tracks[0].boxes.xyxy.cpu()
61
- clss = tracks[0].boxes.cls.cpu().tolist()
62
- t_ids = tracks[0].boxes.id.int().cpu().tolist()
63
- annotator = Annotator(im0, line_width=self.tf)
64
- annotator.draw_region(reg_pts=self.reg_pts, color=(255, 0, 255), thickness=self.tf * 2)
65
-
66
- for box, t_id, cls in zip(boxes, t_ids, clss):
67
- track = self.trk_history[t_id]
68
- bbox_center = (float((box[0] + box[2]) / 2), float((box[1] + box[3]) / 2))
69
- track.append(bbox_center)
70
-
71
- if len(track) > 30:
72
- track.pop(0)
73
-
74
- trk_pts = np.hstack(track).astype(np.int32).reshape((-1, 1, 2))
75
-
76
- if t_id not in self.trk_pt:
77
- self.trk_pt[t_id] = 0
78
-
79
- speed_label = f"{int(self.spd[t_id])} km/h" if t_id in self.spd else self.names[int(cls)]
80
- bbox_color = colors(int(t_id), True)
81
-
82
- annotator.box_label(box, speed_label, bbox_color)
83
- cv2.polylines(im0, [trk_pts], isClosed=False, color=bbox_color, thickness=self.tf)
84
- cv2.circle(im0, (int(track[-1][0]), int(track[-1][1])), self.tf * 2, bbox_color, -1)
85
-
86
- # Calculation of object speed
87
- if not self.reg_pts[0][0] < track[-1][0] < self.reg_pts[1][0]:
88
- return
89
- if self.reg_pts[1][1] - self.spdl < track[-1][1] < self.reg_pts[1][1] + self.spdl:
90
- direction = "known"
91
- elif self.reg_pts[0][1] - self.spdl < track[-1][1] < self.reg_pts[0][1] + self.spdl:
92
- direction = "known"
93
- else:
94
- direction = "unknown"
95
-
96
- if self.trk_pt.get(t_id) != 0 and direction != "unknown" and t_id not in self.trkd_ids:
97
- self.trkd_ids.append(t_id)
98
-
99
- time_difference = time() - self.trk_pt[t_id]
100
- if time_difference > 0:
101
- self.spd[t_id] = np.abs(track[-1][1] - self.trk_pp[t_id][1]) / time_difference
102
-
103
- self.trk_pt[t_id] = time()
104
- self.trk_pp[t_id] = track[-1]
105
-
106
- if self.view_img and self.env_check:
107
- cv2.imshow("Ultralytics Speed Estimation", im0)
108
- if cv2.waitKey(1) & 0xFF == ord("q"):
109
- return
110
-
111
- return im0
112
-
113
-
114
- if __name__ == "__main__":
115
- names = {0: "person", 1: "car"} # example class names
116
- speed_estimator = SpeedEstimator(names)
File without changes
File without changes
File without changes
File without changes