ultralytics 8.3.7__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 (249) hide show
  1. {ultralytics-8.3.7/ultralytics.egg-info → ultralytics-8.3.9}/PKG-INFO +1 -1
  2. {ultralytics-8.3.7 → ultralytics-8.3.9}/tests/test_solutions.py +4 -7
  3. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/__init__.py +4 -3
  4. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/__init__.py +3 -2
  5. ultralytics-8.3.9/ultralytics/cfg/solutions/default.yaml +16 -0
  6. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/data/converter.py +11 -8
  7. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/data/dataset.py +23 -23
  8. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/data/utils.py +3 -2
  9. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/engine/model.py +1 -3
  10. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/engine/trainer.py +7 -8
  11. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/detect/val.py +1 -1
  12. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/nn/autobackend.py +11 -6
  13. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/nn/tasks.py +18 -12
  14. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/solutions/object_counter.py +1 -1
  15. ultralytics-8.3.9/ultralytics/solutions/queue_management.py +64 -0
  16. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/solutions/solutions.py +5 -3
  17. ultralytics-8.3.9/ultralytics/solutions/speed_estimation.py +76 -0
  18. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/__init__.py +22 -16
  19. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/autobatch.py +3 -2
  20. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/callbacks/clearml.py +2 -2
  21. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/callbacks/comet.py +4 -4
  22. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/callbacks/mlflow.py +1 -1
  23. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/callbacks/neptune.py +5 -1
  24. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/callbacks/tensorboard.py +16 -16
  25. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/callbacks/wb.py +1 -1
  26. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/checks.py +14 -8
  27. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/downloads.py +3 -3
  28. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/plotting.py +7 -10
  29. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/torch_utils.py +3 -2
  30. {ultralytics-8.3.7 → ultralytics-8.3.9/ultralytics.egg-info}/PKG-INFO +1 -1
  31. ultralytics-8.3.7/ultralytics/cfg/solutions/default.yaml +0 -16
  32. ultralytics-8.3.7/ultralytics/solutions/queue_management.py +0 -127
  33. ultralytics-8.3.7/ultralytics/solutions/speed_estimation.py +0 -116
  34. {ultralytics-8.3.7 → ultralytics-8.3.9}/LICENSE +0 -0
  35. {ultralytics-8.3.7 → ultralytics-8.3.9}/README.md +0 -0
  36. {ultralytics-8.3.7 → ultralytics-8.3.9}/pyproject.toml +0 -0
  37. {ultralytics-8.3.7 → ultralytics-8.3.9}/setup.cfg +0 -0
  38. {ultralytics-8.3.7 → ultralytics-8.3.9}/tests/__init__.py +0 -0
  39. {ultralytics-8.3.7 → ultralytics-8.3.9}/tests/conftest.py +0 -0
  40. {ultralytics-8.3.7 → ultralytics-8.3.9}/tests/test_cli.py +0 -0
  41. {ultralytics-8.3.7 → ultralytics-8.3.9}/tests/test_cuda.py +0 -0
  42. {ultralytics-8.3.7 → ultralytics-8.3.9}/tests/test_engine.py +0 -0
  43. {ultralytics-8.3.7 → ultralytics-8.3.9}/tests/test_explorer.py +0 -0
  44. {ultralytics-8.3.7 → ultralytics-8.3.9}/tests/test_exports.py +0 -0
  45. {ultralytics-8.3.7 → ultralytics-8.3.9}/tests/test_integrations.py +0 -0
  46. {ultralytics-8.3.7 → ultralytics-8.3.9}/tests/test_python.py +0 -0
  47. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/assets/bus.jpg +0 -0
  48. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/assets/zidane.jpg +0 -0
  49. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
  50. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
  51. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
  52. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
  53. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
  54. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
  55. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
  56. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/VOC.yaml +0 -0
  57. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
  58. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
  59. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
  60. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
  61. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
  62. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/coco.yaml +0 -0
  63. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
  64. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/coco128.yaml +0 -0
  65. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
  66. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
  67. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/coco8.yaml +0 -0
  68. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
  69. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/dota8.yaml +0 -0
  70. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/hand-keypoints.yaml +0 -0
  71. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/lvis.yaml +0 -0
  72. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
  73. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
  74. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/signature.yaml +0 -0
  75. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
  76. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/datasets/xView.yaml +0 -0
  77. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/default.yaml +0 -0
  78. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/11/yolo11-cls.yaml +0 -0
  79. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/11/yolo11-obb.yaml +0 -0
  80. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/11/yolo11-pose.yaml +0 -0
  81. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/11/yolo11-seg.yaml +0 -0
  82. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/11/yolo11.yaml +0 -0
  83. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
  84. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
  85. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
  86. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
  87. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v10/yolov10b.yaml +0 -0
  88. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v10/yolov10l.yaml +0 -0
  89. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v10/yolov10m.yaml +0 -0
  90. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v10/yolov10n.yaml +0 -0
  91. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v10/yolov10s.yaml +0 -0
  92. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v10/yolov10x.yaml +0 -0
  93. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
  94. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
  95. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
  96. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
  97. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
  98. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
  99. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
  100. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
  101. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
  102. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
  103. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
  104. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
  105. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
  106. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
  107. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
  108. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
  109. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
  110. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
  111. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
  112. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
  113. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
  114. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
  115. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
  116. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
  117. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
  118. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
  119. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
  120. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v9/yolov9m.yaml +0 -0
  121. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v9/yolov9s.yaml +0 -0
  122. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/models/v9/yolov9t.yaml +0 -0
  123. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/trackers/botsort.yaml +0 -0
  124. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
  125. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/data/__init__.py +0 -0
  126. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/data/annotator.py +0 -0
  127. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/data/augment.py +0 -0
  128. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/data/base.py +0 -0
  129. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/data/build.py +0 -0
  130. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/data/explorer/__init__.py +0 -0
  131. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/data/explorer/explorer.py +0 -0
  132. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/data/explorer/gui/__init__.py +0 -0
  133. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/data/explorer/gui/dash.py +0 -0
  134. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/data/explorer/utils.py +0 -0
  135. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/data/loaders.py +0 -0
  136. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/data/split_dota.py +0 -0
  137. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/engine/__init__.py +0 -0
  138. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/engine/exporter.py +0 -0
  139. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/engine/predictor.py +0 -0
  140. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/engine/results.py +0 -0
  141. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/engine/tuner.py +0 -0
  142. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/engine/validator.py +0 -0
  143. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/hub/__init__.py +0 -0
  144. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/hub/auth.py +0 -0
  145. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/hub/google/__init__.py +0 -0
  146. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/hub/session.py +0 -0
  147. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/hub/utils.py +0 -0
  148. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/__init__.py +0 -0
  149. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/fastsam/__init__.py +0 -0
  150. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/fastsam/model.py +0 -0
  151. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/fastsam/predict.py +0 -0
  152. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/fastsam/utils.py +0 -0
  153. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/fastsam/val.py +0 -0
  154. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/nas/__init__.py +0 -0
  155. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/nas/model.py +0 -0
  156. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/nas/predict.py +0 -0
  157. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/nas/val.py +0 -0
  158. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/rtdetr/__init__.py +0 -0
  159. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/rtdetr/model.py +0 -0
  160. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/rtdetr/predict.py +0 -0
  161. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/rtdetr/train.py +0 -0
  162. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/rtdetr/val.py +0 -0
  163. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/sam/__init__.py +0 -0
  164. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/sam/amg.py +0 -0
  165. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/sam/build.py +0 -0
  166. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/sam/model.py +0 -0
  167. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/sam/modules/__init__.py +0 -0
  168. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/sam/modules/blocks.py +0 -0
  169. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/sam/modules/decoders.py +0 -0
  170. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/sam/modules/encoders.py +0 -0
  171. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/sam/modules/memory_attention.py +0 -0
  172. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/sam/modules/sam.py +0 -0
  173. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
  174. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/sam/modules/transformer.py +0 -0
  175. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/sam/modules/utils.py +0 -0
  176. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/sam/predict.py +0 -0
  177. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/utils/__init__.py +0 -0
  178. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/utils/loss.py +0 -0
  179. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/utils/ops.py +0 -0
  180. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/__init__.py +0 -0
  181. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/classify/__init__.py +0 -0
  182. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/classify/predict.py +0 -0
  183. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/classify/train.py +0 -0
  184. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/classify/val.py +0 -0
  185. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/detect/__init__.py +0 -0
  186. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/detect/predict.py +0 -0
  187. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/detect/train.py +0 -0
  188. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/model.py +0 -0
  189. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/obb/__init__.py +0 -0
  190. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/obb/predict.py +0 -0
  191. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/obb/train.py +0 -0
  192. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/obb/val.py +0 -0
  193. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/pose/__init__.py +0 -0
  194. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/pose/predict.py +0 -0
  195. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/pose/train.py +0 -0
  196. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/pose/val.py +0 -0
  197. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/segment/__init__.py +0 -0
  198. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/segment/predict.py +0 -0
  199. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/segment/train.py +0 -0
  200. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/segment/val.py +0 -0
  201. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/world/__init__.py +0 -0
  202. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/world/train.py +0 -0
  203. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/models/yolo/world/train_world.py +0 -0
  204. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/nn/__init__.py +0 -0
  205. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/nn/modules/__init__.py +0 -0
  206. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/nn/modules/activation.py +0 -0
  207. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/nn/modules/block.py +0 -0
  208. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/nn/modules/conv.py +0 -0
  209. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/nn/modules/head.py +0 -0
  210. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/nn/modules/transformer.py +0 -0
  211. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/nn/modules/utils.py +0 -0
  212. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/solutions/__init__.py +0 -0
  213. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/solutions/ai_gym.py +0 -0
  214. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/solutions/analytics.py +0 -0
  215. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/solutions/distance_calculation.py +0 -0
  216. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/solutions/heatmap.py +0 -0
  217. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/solutions/parking_management.py +0 -0
  218. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/solutions/streamlit_inference.py +0 -0
  219. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/trackers/__init__.py +0 -0
  220. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/trackers/basetrack.py +0 -0
  221. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/trackers/bot_sort.py +0 -0
  222. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/trackers/byte_tracker.py +0 -0
  223. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/trackers/track.py +0 -0
  224. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/trackers/utils/__init__.py +0 -0
  225. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/trackers/utils/gmc.py +0 -0
  226. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/trackers/utils/kalman_filter.py +0 -0
  227. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/trackers/utils/matching.py +0 -0
  228. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/benchmarks.py +0 -0
  229. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/callbacks/__init__.py +0 -0
  230. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/callbacks/base.py +0 -0
  231. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/callbacks/dvc.py +0 -0
  232. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/callbacks/hub.py +0 -0
  233. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/callbacks/raytune.py +0 -0
  234. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/dist.py +0 -0
  235. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/errors.py +0 -0
  236. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/files.py +0 -0
  237. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/instance.py +0 -0
  238. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/loss.py +0 -0
  239. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/metrics.py +0 -0
  240. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/ops.py +0 -0
  241. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/patches.py +0 -0
  242. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/tal.py +0 -0
  243. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/triton.py +0 -0
  244. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics/utils/tuner.py +0 -0
  245. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics.egg-info/SOURCES.txt +0 -0
  246. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics.egg-info/dependency_links.txt +0 -0
  247. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics.egg-info/entry_points.txt +0 -0
  248. {ultralytics-8.3.7 → ultralytics-8.3.9}/ultralytics.egg-info/requires.txt +0 -0
  249. {ultralytics-8.3.7 → 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.7
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,25 +14,22 @@ 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)
25
- queue = solutions.QueueManager(names=names, reg_pts=region_points, view_img=False)
22
+ speed = solutions.SpeedEstimator(region=region_points, model="yolo11n.pt", show=False)
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)
35
- _ = queue.process_queue(original_im0.copy(), tracks)
31
+ _ = speed.estimate_speed(original_im0.copy())
32
+ _ = queue.process_queue(original_im0.copy())
36
33
  cap.release()
37
34
  cv2.destroyAllWindows()
38
35
 
@@ -1,11 +1,12 @@
1
1
  # Ultralytics YOLO 🚀, AGPL-3.0 license
2
2
 
3
- __version__ = "8.3.7"
3
+ __version__ = "8.3.9"
4
4
 
5
5
  import os
6
6
 
7
- # Set ENV Variables (place before imports)
8
- os.environ["OMP_NUM_THREADS"] = "1" # reduce CPU utilization during training
7
+ # Set ENV variables (place before imports)
8
+ if not os.environ.get("OMP_NUM_THREADS"):
9
+ os.environ["OMP_NUM_THREADS"] = "1" # default for reduced CPU utilization during training
9
10
 
10
11
  from ultralytics.data.explorer.explorer import Explorer
11
12
  from ultralytics.models import NAS, RTDETR, SAM, YOLO, FastSAM, YOLOWorld
@@ -669,9 +669,10 @@ def smart_value(v):
669
669
  elif v_lower == "false":
670
670
  return False
671
671
  else:
672
- with contextlib.suppress(Exception):
672
+ try:
673
673
  return eval(v)
674
- return v
674
+ except: # noqa E722
675
+ return v
675
676
 
676
677
 
677
678
  def entrypoint(debug=""):
@@ -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.
@@ -642,19 +642,21 @@ def yolo_bbox2segment(im_dir, save_dir=None, sam_model="sam_b.pt"):
642
642
 
643
643
  def create_synthetic_coco_dataset():
644
644
  """
645
- Creates a synthetic COCO dataset with random images and existing labels.
645
+ Creates a synthetic COCO dataset with random images based on filenames from label lists.
646
646
 
647
- This function downloads COCO labels, creates synthetic images for train2017 and val2017 subsets, and organizes
647
+ This function downloads COCO labels, reads image filenames from label list files,
648
+ creates synthetic images for train2017 and val2017 subsets, and organizes
648
649
  them in the COCO dataset structure. It uses multithreading to generate images efficiently.
649
650
 
650
651
  Examples:
652
+ >>> from ultralytics.data.converter import create_synthetic_coco_dataset
651
653
  >>> create_synthetic_coco_dataset()
652
654
 
653
655
  Notes:
654
656
  - Requires internet connection to download label files.
655
657
  - Generates random RGB images of varying sizes (480x480 to 640x640 pixels).
656
658
  - Existing test2017 directory is removed as it's not needed.
657
- - If label directories don't exist, image creation for that subset is skipped.
659
+ - Reads image filenames from train2017.txt and val2017.txt files.
658
660
  """
659
661
 
660
662
  def create_synthetic_image(image_file):
@@ -680,16 +682,17 @@ def create_synthetic_coco_dataset():
680
682
  subset_dir = dir / "images" / subset
681
683
  subset_dir.mkdir(parents=True, exist_ok=True)
682
684
 
683
- label_dir = dir / "labels" / subset
684
- if label_dir.exists():
685
- label_files = list(label_dir.glob("*.txt"))
686
- image_files = [subset_dir / f"{label_file.stem}.jpg" for label_file in label_files]
685
+ # Read image filenames from label list file
686
+ label_list_file = dir / f"{subset}.txt"
687
+ if label_list_file.exists():
688
+ with open(label_list_file) as f:
689
+ image_files = [dir / line.strip() for line in f]
687
690
 
688
691
  # Submit all tasks
689
692
  futures = [executor.submit(create_synthetic_image, image_file) for image_file in image_files]
690
693
  for _ in TQDM(as_completed(futures), total=len(futures), desc=f"Generating images for {subset}"):
691
694
  pass # The actual work is done in the background
692
695
  else:
693
- print(f"Warning: Label directory {label_dir} does not exist. Skipping image creation for {subset}.")
696
+ print(f"Warning: Labels file {label_list_file} does not exist. Skipping image creation for {subset}.")
694
697
 
695
698
  print("Synthetic COCO dataset created successfully.")
@@ -1,6 +1,5 @@
1
1
  # Ultralytics YOLO 🚀, AGPL-3.0 license
2
2
 
3
- import contextlib
4
3
  import json
5
4
  from collections import defaultdict
6
5
  from itertools import repeat
@@ -483,7 +482,7 @@ class ClassificationDataset:
483
482
  desc = f"{self.prefix}Scanning {self.root}..."
484
483
  path = Path(self.root).with_suffix(".cache") # *.cache file path
485
484
 
486
- with contextlib.suppress(FileNotFoundError, AssertionError, AttributeError):
485
+ try:
487
486
  cache = load_dataset_cache_file(path) # attempt to load a *.cache file
488
487
  assert cache["version"] == DATASET_CACHE_VERSION # matches current version
489
488
  assert cache["hash"] == get_hash([x[0] for x in self.samples]) # identical hash
@@ -495,24 +494,25 @@ class ClassificationDataset:
495
494
  LOGGER.info("\n".join(cache["msgs"])) # display warnings
496
495
  return samples
497
496
 
498
- # Run scan if *.cache retrieval failed
499
- nf, nc, msgs, samples, x = 0, 0, [], [], {}
500
- with ThreadPool(NUM_THREADS) as pool:
501
- results = pool.imap(func=verify_image, iterable=zip(self.samples, repeat(self.prefix)))
502
- pbar = TQDM(results, desc=desc, total=len(self.samples))
503
- for sample, nf_f, nc_f, msg in pbar:
504
- if nf_f:
505
- samples.append(sample)
506
- if msg:
507
- msgs.append(msg)
508
- nf += nf_f
509
- nc += nc_f
510
- pbar.desc = f"{desc} {nf} images, {nc} corrupt"
511
- pbar.close()
512
- if msgs:
513
- LOGGER.info("\n".join(msgs))
514
- x["hash"] = get_hash([x[0] for x in self.samples])
515
- x["results"] = nf, nc, len(samples), samples
516
- x["msgs"] = msgs # warnings
517
- save_dataset_cache_file(self.prefix, path, x, DATASET_CACHE_VERSION)
518
- return samples
497
+ except (FileNotFoundError, AssertionError, AttributeError):
498
+ # Run scan if *.cache retrieval failed
499
+ nf, nc, msgs, samples, x = 0, 0, [], [], {}
500
+ with ThreadPool(NUM_THREADS) as pool:
501
+ results = pool.imap(func=verify_image, iterable=zip(self.samples, repeat(self.prefix)))
502
+ pbar = TQDM(results, desc=desc, total=len(self.samples))
503
+ for sample, nf_f, nc_f, msg in pbar:
504
+ if nf_f:
505
+ samples.append(sample)
506
+ if msg:
507
+ msgs.append(msg)
508
+ nf += nf_f
509
+ nc += nc_f
510
+ pbar.desc = f"{desc} {nf} images, {nc} corrupt"
511
+ pbar.close()
512
+ if msgs:
513
+ LOGGER.info("\n".join(msgs))
514
+ x["hash"] = get_hash([x[0] for x in self.samples])
515
+ x["results"] = nf, nc, len(samples), samples
516
+ x["msgs"] = msgs # warnings
517
+ save_dataset_cache_file(self.prefix, path, x, DATASET_CACHE_VERSION)
518
+ return samples
@@ -1,6 +1,5 @@
1
1
  # Ultralytics YOLO 🚀, AGPL-3.0 license
2
2
 
3
- import contextlib
4
3
  import hashlib
5
4
  import json
6
5
  import os
@@ -60,12 +59,14 @@ def exif_size(img: Image.Image):
60
59
  """Returns exif-corrected PIL size."""
61
60
  s = img.size # (width, height)
62
61
  if img.format == "JPEG": # only support JPEG images
63
- with contextlib.suppress(Exception):
62
+ try:
64
63
  exif = img.getexif()
65
64
  if exif:
66
65
  rotation = exif.get(274, None) # the EXIF key for the orientation tag is 274
67
66
  if rotation in {6, 8}: # rotation 270 or 90
68
67
  s = s[1], s[0]
68
+ except: # noqa E722
69
+ pass
69
70
  return s
70
71
 
71
72
 
@@ -543,9 +543,7 @@ class Model(nn.Module):
543
543
  prompts = args.pop("prompts", None) # for SAM-type models
544
544
 
545
545
  if not self.predictor:
546
- self.predictor = predictor or self._smart_load("predictor")(overrides=args, _callbacks=self.callbacks)
547
- if predictor:
548
- self.predictor.args = get_cfg(self.predictor.args, args)
546
+ self.predictor = (predictor or self._smart_load("predictor"))(overrides=args, _callbacks=self.callbacks)
549
547
  self.predictor.setup_model(model=self.model, verbose=is_cli)
550
548
  else: # only update args if predictor is already setup
551
549
  self.predictor.args = get_cfg(self.predictor.args, args)
@@ -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."""
@@ -75,7 +75,7 @@ class DetectionValidator(BaseValidator):
75
75
  ) # is COCO
76
76
  self.is_lvis = isinstance(val, str) and "lvis" in val and not self.is_coco # is LVIS
77
77
  self.class_map = converter.coco80_to_coco91_class() if self.is_coco else list(range(len(model.names)))
78
- self.args.save_json |= (self.is_coco or self.is_lvis) and not self.training # run on final val if training COCO
78
+ self.args.save_json |= self.args.val and (self.is_coco or self.is_lvis) and not self.training # run final val
79
79
  self.names = model.names
80
80
  self.nc = len(model.names)
81
81
  self.metrics.names = self.names
@@ -1,7 +1,6 @@
1
1
  # Ultralytics YOLO 🚀, AGPL-3.0 license
2
2
 
3
3
  import ast
4
- import contextlib
5
4
  import json
6
5
  import platform
7
6
  import zipfile
@@ -45,8 +44,10 @@ def check_class_names(names):
45
44
  def default_class_names(data=None):
46
45
  """Applies default class names to an input YAML file or returns numerical class names."""
47
46
  if data:
48
- with contextlib.suppress(Exception):
47
+ try:
49
48
  return yaml_load(check_yaml(data))["names"]
49
+ except: # noqa E722
50
+ pass
50
51
  return {i: f"class{i}" for i in range(999)} # return default if above errors
51
52
 
52
53
 
@@ -264,8 +265,8 @@ class AutoBackend(nn.Module):
264
265
  if -1 in tuple(model.get_tensor_shape(name)):
265
266
  dynamic = True
266
267
  context.set_input_shape(name, tuple(model.get_tensor_profile_shape(name, 0)[1]))
267
- if dtype == np.float16:
268
- fp16 = True
268
+ if dtype == np.float16:
269
+ fp16 = True
269
270
  else:
270
271
  output_names.append(name)
271
272
  shape = tuple(context.get_tensor_shape(name))
@@ -321,8 +322,10 @@ class AutoBackend(nn.Module):
321
322
  with open(w, "rb") as f:
322
323
  gd.ParseFromString(f.read())
323
324
  frozen_func = wrap_frozen_graph(gd, inputs="x:0", outputs=gd_outputs(gd))
324
- with contextlib.suppress(StopIteration): # find metadata in SavedModel alongside GraphDef
325
+ try: # find metadata in SavedModel alongside GraphDef
325
326
  metadata = next(Path(w).resolve().parent.rglob(f"{Path(w).stem}_saved_model*/metadata.yaml"))
327
+ except StopIteration:
328
+ pass
326
329
 
327
330
  # TFLite or TFLite Edge TPU
328
331
  elif tflite or edgetpu: # https://www.tensorflow.org/lite/guide/python#install_tensorflow_lite_for_python
@@ -345,10 +348,12 @@ class AutoBackend(nn.Module):
345
348
  input_details = interpreter.get_input_details() # inputs
346
349
  output_details = interpreter.get_output_details() # outputs
347
350
  # Load metadata
348
- with contextlib.suppress(zipfile.BadZipFile):
351
+ try:
349
352
  with zipfile.ZipFile(w, "r") as model:
350
353
  meta_file = model.namelist()[0]
351
354
  metadata = ast.literal_eval(model.read(meta_file).decode("utf-8"))
355
+ except zipfile.BadZipFile:
356
+ pass
352
357
 
353
358
  # TF.js
354
359
  elif tfjs:
@@ -2,6 +2,7 @@
2
2
 
3
3
  import contextlib
4
4
  import pickle
5
+ import re
5
6
  import types
6
7
  from copy import deepcopy
7
8
  from pathlib import Path
@@ -958,8 +959,10 @@ def parse_model(d, ch, verbose=True): # model_dict, input_channels(3)
958
959
  m = getattr(torch.nn, m[3:]) if "nn." in m else globals()[m] # get module
959
960
  for j, a in enumerate(args):
960
961
  if isinstance(a, str):
961
- with contextlib.suppress(ValueError):
962
+ try:
962
963
  args[j] = locals()[a] if a in locals() else ast.literal_eval(a)
964
+ except ValueError:
965
+ pass
963
966
 
964
967
  n = n_ = max(round(n * depth), 1) if n > 1 else n # depth gain
965
968
  if m in {
@@ -1058,10 +1061,10 @@ def parse_model(d, ch, verbose=True): # model_dict, input_channels(3)
1058
1061
 
1059
1062
  m_ = nn.Sequential(*(m(*args) for _ in range(n))) if n > 1 else m(*args) # module
1060
1063
  t = str(m)[8:-2].replace("__main__.", "") # module type
1061
- 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
1062
1065
  m_.i, m_.f, m_.type = i, f, t # attach index, 'from' index, type
1063
1066
  if verbose:
1064
- 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
1065
1068
  save.extend(x % i for x in ([f] if isinstance(f, int) else f) if x != -1) # append to savelist
1066
1069
  layers.append(m_)
1067
1070
  if i == 0:
@@ -1072,8 +1075,6 @@ def parse_model(d, ch, verbose=True): # model_dict, input_channels(3)
1072
1075
 
1073
1076
  def yaml_model_load(path):
1074
1077
  """Load a YOLOv8 model from a YAML file."""
1075
- import re
1076
-
1077
1078
  path = Path(path)
1078
1079
  if path.stem in (f"yolov{d}{x}6" for x in "nsmlx" for d in (5, 8)):
1079
1080
  new_stem = re.sub(r"(\d+)([nslmx])6(.+)?$", r"\1\2-p6\3", path.stem)
@@ -1100,11 +1101,10 @@ def guess_model_scale(model_path):
1100
1101
  Returns:
1101
1102
  (str): The size character of the model's scale, which can be n, s, m, l, or x.
1102
1103
  """
1103
- with contextlib.suppress(AttributeError):
1104
- import re
1105
-
1104
+ try:
1106
1105
  return re.search(r"yolo[v]?\d+([nslmx])", Path(model_path).stem).group(1) # n, s, m, l, or x
1107
- return ""
1106
+ except AttributeError:
1107
+ return ""
1108
1108
 
1109
1109
 
1110
1110
  def guess_model_task(model):
@@ -1137,17 +1137,23 @@ def guess_model_task(model):
1137
1137
 
1138
1138
  # Guess from model cfg
1139
1139
  if isinstance(model, dict):
1140
- with contextlib.suppress(Exception):
1140
+ try:
1141
1141
  return cfg2task(model)
1142
+ except: # noqa E722
1143
+ pass
1142
1144
 
1143
1145
  # Guess from PyTorch model
1144
1146
  if isinstance(model, nn.Module): # PyTorch model
1145
1147
  for x in "model.args", "model.model.args", "model.model.model.args":
1146
- with contextlib.suppress(Exception):
1148
+ try:
1147
1149
  return eval(x)["task"]
1150
+ except: # noqa E722
1151
+ pass
1148
1152
  for x in "model.yaml", "model.model.yaml", "model.model.model.yaml":
1149
- with contextlib.suppress(Exception):
1153
+ try:
1150
1154
  return cfg2task(eval(x))
1155
+ except: # noqa E722
1156
+ pass
1151
1157
 
1152
1158
  for m in model.modules():
1153
1159
  if isinstance(m, Segment):
@@ -116,7 +116,7 @@ class ObjectCounter(BaseSolution):
116
116
  self.store_tracking_history(track_id, box) # Store track history
117
117
  self.store_classwise_counts(cls) # store classwise counts in dict
118
118
 
119
- # Draw centroid of objects
119
+ # Draw tracks of objects
120
120
  self.annotator.draw_centroid_and_tracks(
121
121
  self.track_line, color=colors(int(track_id), True), track_thickness=self.line_width
122
122
  )
@@ -0,0 +1,64 @@
1
+ # Ultralytics YOLO 🚀, AGPL-3.0 license
2
+
3
+ from shapely.geometry import 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 QueueManager(BaseSolution):
10
+ """A class to manage the queue in a real-time video stream based on object tracks."""
11
+
12
+ def __init__(self, **kwargs):
13
+ """Initializes the QueueManager with specified parameters for tracking and counting objects."""
14
+ super().__init__(**kwargs)
15
+ self.initialize_region()
16
+ self.counts = 0 # Queue counts Information
17
+ self.rect_color = (255, 255, 255) # Rectangle color
18
+ self.region_length = len(self.region) # Store region length for further usage
19
+
20
+ def process_queue(self, im0):
21
+ """
22
+ Main function to start the queue management process.
23
+
24
+ Args:
25
+ im0 (ndarray): The input image that will be used for processing
26
+ Returns
27
+ im0 (ndarray): The processed image for more usage
28
+ """
29
+ self.counts = 0 # Reset counts every frame
30
+ self.annotator = Annotator(im0, line_width=self.line_width) # Initialize annotator
31
+ self.extract_tracks(im0) # Extract tracks
32
+
33
+ self.annotator.draw_region(
34
+ reg_pts=self.region, color=self.rect_color, thickness=self.line_width * 2
35
+ ) # Draw region
36
+
37
+ for box, track_id, cls in zip(self.boxes, self.track_ids, self.clss):
38
+ # Draw bounding box and counting region
39
+ self.annotator.box_label(box, label=self.names[cls], color=colors(track_id, True))
40
+ self.store_tracking_history(track_id, box) # Store track history
41
+
42
+ # Draw tracks of objects
43
+ self.annotator.draw_centroid_and_tracks(
44
+ self.track_line, color=colors(int(track_id), True), track_thickness=self.line_width
45
+ )
46
+
47
+ # Cache frequently accessed attributes
48
+ track_history = self.track_history.get(track_id, [])
49
+
50
+ # store previous position of track and check if the object is inside the counting region
51
+ prev_position = track_history[-2] if len(track_history) > 1 else None
52
+ if self.region_length >= 3 and prev_position and self.r_s.contains(Point(self.track_line[-1])):
53
+ self.counts += 1
54
+
55
+ # Display queue counts
56
+ self.annotator.queue_counts_display(
57
+ f"Queue Counts : {str(self.counts)}",
58
+ points=self.region,
59
+ region_color=self.rect_color,
60
+ txt_color=(104, 31, 17),
61
+ )
62
+ self.display_output(im0) # display output with base class function
63
+
64
+ return im0 # return output image for more usage
@@ -76,9 +76,11 @@ class BaseSolution:
76
76
 
77
77
  def initialize_region(self):
78
78
  """Initialize the counting region and line segment based on config."""
79
- self.region = [(20, 400), (1260, 400)] if self.region is None else self.region
80
- self.r_s = Polygon(self.region) if len(self.region) >= 3 else LineString(self.region)
81
- self.l_s = LineString([(self.region[0][0], self.region[0][1]), (self.region[1][0], self.region[1][1])])
79
+ self.region = [(20, 400), (1080, 404), (1080, 360), (20, 360)] if self.region is None else self.region
80
+ self.r_s = Polygon(self.region) if len(self.region) >= 3 else LineString(self.region) # region segment
81
+ self.l_s = LineString(
82
+ [(self.region[0][0], self.region[0][1]), (self.region[1][0], self.region[1][1])]
83
+ ) # line segment
82
84
 
83
85
  def display_output(self, im0):
84
86
  """
@@ -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