ultralytics 8.2.4__tar.gz → 8.2.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 (218) hide show
  1. {ultralytics-8.2.4/ultralytics.egg-info → ultralytics-8.2.5}/PKG-INFO +1 -1
  2. {ultralytics-8.2.4 → ultralytics-8.2.5}/tests/test_python.py +1 -0
  3. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/__init__.py +1 -1
  4. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/solutions/heatmap.py +13 -22
  5. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/solutions/object_counter.py +13 -22
  6. ultralytics-8.2.5/ultralytics/solutions/parking_management.py +235 -0
  7. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/utils/plotting.py +47 -35
  8. {ultralytics-8.2.4 → ultralytics-8.2.5/ultralytics.egg-info}/PKG-INFO +1 -1
  9. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics.egg-info/SOURCES.txt +1 -0
  10. {ultralytics-8.2.4 → ultralytics-8.2.5}/LICENSE +0 -0
  11. {ultralytics-8.2.4 → ultralytics-8.2.5}/README.md +0 -0
  12. {ultralytics-8.2.4 → ultralytics-8.2.5}/pyproject.toml +0 -0
  13. {ultralytics-8.2.4 → ultralytics-8.2.5}/setup.cfg +0 -0
  14. {ultralytics-8.2.4 → ultralytics-8.2.5}/tests/test_cli.py +0 -0
  15. {ultralytics-8.2.4 → ultralytics-8.2.5}/tests/test_cuda.py +0 -0
  16. {ultralytics-8.2.4 → ultralytics-8.2.5}/tests/test_engine.py +0 -0
  17. {ultralytics-8.2.4 → ultralytics-8.2.5}/tests/test_explorer.py +0 -0
  18. {ultralytics-8.2.4 → ultralytics-8.2.5}/tests/test_integrations.py +0 -0
  19. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/assets/bus.jpg +0 -0
  20. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/assets/zidane.jpg +0 -0
  21. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/__init__.py +0 -0
  22. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
  23. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
  24. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
  25. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
  26. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
  27. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
  28. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
  29. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/datasets/VOC.yaml +0 -0
  30. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
  31. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
  32. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
  33. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
  34. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
  35. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/datasets/coco.yaml +0 -0
  36. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
  37. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/datasets/coco128.yaml +0 -0
  38. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
  39. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
  40. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/datasets/coco8.yaml +0 -0
  41. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
  42. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/datasets/dota8.yaml +0 -0
  43. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/datasets/lvis.yaml +0 -0
  44. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
  45. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
  46. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
  47. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/datasets/xView.yaml +0 -0
  48. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/default.yaml +0 -0
  49. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
  50. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
  51. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
  52. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
  53. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
  54. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
  55. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
  56. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
  57. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
  58. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
  59. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
  60. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
  61. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
  62. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
  63. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
  64. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
  65. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
  66. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
  67. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
  68. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
  69. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
  70. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
  71. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
  72. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
  73. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
  74. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
  75. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
  76. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
  77. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
  78. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
  79. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
  80. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/trackers/botsort.yaml +0 -0
  81. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
  82. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/data/__init__.py +0 -0
  83. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/data/annotator.py +0 -0
  84. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/data/augment.py +0 -0
  85. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/data/base.py +0 -0
  86. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/data/build.py +0 -0
  87. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/data/converter.py +0 -0
  88. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/data/dataset.py +0 -0
  89. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/data/explorer/__init__.py +0 -0
  90. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/data/explorer/explorer.py +0 -0
  91. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/data/explorer/gui/__init__.py +0 -0
  92. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/data/explorer/gui/dash.py +0 -0
  93. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/data/explorer/utils.py +0 -0
  94. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/data/loaders.py +0 -0
  95. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/data/split_dota.py +0 -0
  96. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/data/utils.py +0 -0
  97. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/engine/__init__.py +0 -0
  98. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/engine/exporter.py +0 -0
  99. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/engine/model.py +0 -0
  100. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/engine/predictor.py +0 -0
  101. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/engine/results.py +0 -0
  102. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/engine/trainer.py +0 -0
  103. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/engine/tuner.py +0 -0
  104. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/engine/validator.py +0 -0
  105. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/hub/__init__.py +0 -0
  106. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/hub/auth.py +0 -0
  107. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/hub/session.py +0 -0
  108. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/hub/utils.py +0 -0
  109. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/__init__.py +0 -0
  110. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/fastsam/__init__.py +0 -0
  111. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/fastsam/model.py +0 -0
  112. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/fastsam/predict.py +0 -0
  113. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/fastsam/prompt.py +0 -0
  114. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/fastsam/utils.py +0 -0
  115. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/fastsam/val.py +0 -0
  116. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/nas/__init__.py +0 -0
  117. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/nas/model.py +0 -0
  118. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/nas/predict.py +0 -0
  119. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/nas/val.py +0 -0
  120. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/rtdetr/__init__.py +0 -0
  121. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/rtdetr/model.py +0 -0
  122. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/rtdetr/predict.py +0 -0
  123. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/rtdetr/train.py +0 -0
  124. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/rtdetr/val.py +0 -0
  125. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/sam/__init__.py +0 -0
  126. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/sam/amg.py +0 -0
  127. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/sam/build.py +0 -0
  128. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/sam/model.py +0 -0
  129. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/sam/modules/__init__.py +0 -0
  130. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/sam/modules/decoders.py +0 -0
  131. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/sam/modules/encoders.py +0 -0
  132. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/sam/modules/sam.py +0 -0
  133. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
  134. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/sam/modules/transformer.py +0 -0
  135. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/sam/predict.py +0 -0
  136. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/utils/__init__.py +0 -0
  137. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/utils/loss.py +0 -0
  138. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/utils/ops.py +0 -0
  139. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/yolo/__init__.py +0 -0
  140. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/yolo/classify/__init__.py +0 -0
  141. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/yolo/classify/predict.py +0 -0
  142. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/yolo/classify/train.py +0 -0
  143. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/yolo/classify/val.py +0 -0
  144. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/yolo/detect/__init__.py +0 -0
  145. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/yolo/detect/predict.py +0 -0
  146. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/yolo/detect/train.py +0 -0
  147. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/yolo/detect/val.py +0 -0
  148. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/yolo/model.py +0 -0
  149. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/yolo/obb/__init__.py +0 -0
  150. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/yolo/obb/predict.py +0 -0
  151. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/yolo/obb/train.py +0 -0
  152. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/yolo/obb/val.py +0 -0
  153. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/yolo/pose/__init__.py +0 -0
  154. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/yolo/pose/predict.py +0 -0
  155. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/yolo/pose/train.py +0 -0
  156. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/yolo/pose/val.py +0 -0
  157. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/yolo/segment/__init__.py +0 -0
  158. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/yolo/segment/predict.py +0 -0
  159. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/yolo/segment/train.py +0 -0
  160. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/yolo/segment/val.py +0 -0
  161. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/yolo/world/__init__.py +0 -0
  162. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/yolo/world/train.py +0 -0
  163. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/models/yolo/world/train_world.py +0 -0
  164. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/nn/__init__.py +0 -0
  165. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/nn/autobackend.py +0 -0
  166. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/nn/modules/__init__.py +0 -0
  167. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/nn/modules/block.py +0 -0
  168. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/nn/modules/conv.py +0 -0
  169. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/nn/modules/head.py +0 -0
  170. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/nn/modules/transformer.py +0 -0
  171. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/nn/modules/utils.py +0 -0
  172. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/nn/tasks.py +0 -0
  173. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/solutions/__init__.py +0 -0
  174. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/solutions/ai_gym.py +0 -0
  175. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/solutions/distance_calculation.py +0 -0
  176. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/solutions/queue_management.py +0 -0
  177. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/solutions/speed_estimation.py +0 -0
  178. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/trackers/__init__.py +0 -0
  179. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/trackers/basetrack.py +0 -0
  180. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/trackers/bot_sort.py +0 -0
  181. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/trackers/byte_tracker.py +0 -0
  182. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/trackers/track.py +0 -0
  183. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/trackers/utils/__init__.py +0 -0
  184. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/trackers/utils/gmc.py +0 -0
  185. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/trackers/utils/kalman_filter.py +0 -0
  186. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/trackers/utils/matching.py +0 -0
  187. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/utils/__init__.py +0 -0
  188. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/utils/autobatch.py +0 -0
  189. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/utils/benchmarks.py +0 -0
  190. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/utils/callbacks/__init__.py +0 -0
  191. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/utils/callbacks/base.py +0 -0
  192. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/utils/callbacks/clearml.py +0 -0
  193. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/utils/callbacks/comet.py +0 -0
  194. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/utils/callbacks/dvc.py +0 -0
  195. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/utils/callbacks/hub.py +0 -0
  196. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/utils/callbacks/mlflow.py +0 -0
  197. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/utils/callbacks/neptune.py +0 -0
  198. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/utils/callbacks/raytune.py +0 -0
  199. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/utils/callbacks/tensorboard.py +0 -0
  200. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/utils/callbacks/wb.py +0 -0
  201. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/utils/checks.py +0 -0
  202. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/utils/dist.py +0 -0
  203. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/utils/downloads.py +0 -0
  204. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/utils/errors.py +0 -0
  205. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/utils/files.py +0 -0
  206. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/utils/instance.py +0 -0
  207. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/utils/loss.py +0 -0
  208. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/utils/metrics.py +0 -0
  209. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/utils/ops.py +0 -0
  210. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/utils/patches.py +0 -0
  211. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/utils/tal.py +0 -0
  212. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/utils/torch_utils.py +0 -0
  213. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/utils/triton.py +0 -0
  214. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics/utils/tuner.py +0 -0
  215. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics.egg-info/dependency_links.txt +0 -0
  216. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics.egg-info/entry_points.txt +0 -0
  217. {ultralytics-8.2.4 → ultralytics-8.2.5}/ultralytics.egg-info/requires.txt +0 -0
  218. {ultralytics-8.2.4 → ultralytics-8.2.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.2.4
3
+ Version: 8.2.5
4
4
  Summary: Ultralytics YOLOv8 for SOTA object detection, multi-object tracking, instance segmentation, pose estimation and image classification.
5
5
  Author: Glenn Jocher, Ayush Chaurasia, Jing Qiu
6
6
  Maintainer: Glenn Jocher, Ayush Chaurasia, Jing Qiu
@@ -637,6 +637,7 @@ def test_model_embeddings():
637
637
 
638
638
  @pytest.mark.skipif(checks.IS_PYTHON_3_12, reason="YOLOWorld with CLIP is not supported in Python 3.12")
639
639
  def test_yolo_world():
640
+ """Tests YOLO world models with different configurations, including classes, detection, and training scenarios."""
640
641
  model = YOLO("yolov8s-world.pt") # no YOLOv8n-world model yet
641
642
  model.set_classes(["tree", "window"])
642
643
  model(ASSETS / "bus.jpg", conf=0.01)
@@ -1,6 +1,6 @@
1
1
  # Ultralytics YOLO 🚀, AGPL-3.0 license
2
2
 
3
- __version__ = "8.2.4"
3
+ __version__ = "8.2.5"
4
4
 
5
5
  from ultralytics.data.explorer.explorer import Explorer
6
6
  from ultralytics.models import RTDETR, SAM, YOLO, YOLOWorld
@@ -190,9 +190,7 @@ class Heatmap:
190
190
  for box, cls, track_id in zip(self.boxes, self.clss, self.track_ids):
191
191
  # Store class info
192
192
  if self.names[cls] not in self.class_wise_count:
193
- if len(self.names[cls]) > 5:
194
- self.names[cls] = self.names[cls][:5]
195
- self.class_wise_count[self.names[cls]] = {"in": 0, "out": 0}
193
+ self.class_wise_count[self.names[cls]] = {"IN": 0, "OUT": 0}
196
194
 
197
195
  if self.shape == "circle":
198
196
  center = (int((box[0] + box[2]) // 2), int((box[1] + box[3]) // 2))
@@ -225,10 +223,10 @@ class Heatmap:
225
223
 
226
224
  if (box[0] - prev_position[0]) * (self.counting_region.centroid.x - prev_position[0]) > 0:
227
225
  self.in_counts += 1
228
- self.class_wise_count[self.names[cls]]["in"] += 1
226
+ self.class_wise_count[self.names[cls]]["IN"] += 1
229
227
  else:
230
228
  self.out_counts += 1
231
- self.class_wise_count[self.names[cls]]["out"] += 1
229
+ self.class_wise_count[self.names[cls]]["OUT"] += 1
232
230
 
233
231
  # Count objects using line
234
232
  elif len(self.count_reg_pts) == 2:
@@ -239,10 +237,10 @@ class Heatmap:
239
237
 
240
238
  if (box[0] - prev_position[0]) * (self.counting_region.centroid.x - prev_position[0]) > 0:
241
239
  self.in_counts += 1
242
- self.class_wise_count[self.names[cls]]["in"] += 1
240
+ self.class_wise_count[self.names[cls]]["IN"] += 1
243
241
  else:
244
242
  self.out_counts += 1
245
- self.class_wise_count[self.names[cls]]["out"] += 1
243
+ self.class_wise_count[self.names[cls]]["OUT"] += 1
246
244
 
247
245
  else:
248
246
  for box, cls in zip(self.boxes, self.clss):
@@ -264,28 +262,21 @@ class Heatmap:
264
262
  heatmap_normalized = cv2.normalize(self.heatmap, None, 0, 255, cv2.NORM_MINMAX)
265
263
  heatmap_colored = cv2.applyColorMap(heatmap_normalized.astype(np.uint8), self.colormap)
266
264
 
267
- label = "Ultralytics Analytics \t"
265
+ labels_dict = {}
268
266
 
269
267
  for key, value in self.class_wise_count.items():
270
- if value["in"] != 0 or value["out"] != 0:
268
+ if value["IN"] != 0 or value["OUT"] != 0:
271
269
  if not self.view_in_counts and not self.view_out_counts:
272
- label = None
270
+ continue
273
271
  elif not self.view_in_counts:
274
- label += f"{str.capitalize(key)}: IN {value['in']} \t"
272
+ labels_dict[str.capitalize(key)] = f"OUT {value['OUT']}"
275
273
  elif not self.view_out_counts:
276
- label += f"{str.capitalize(key)}: OUT {value['out']} \t"
274
+ labels_dict[str.capitalize(key)] = f"IN {value['IN']}"
277
275
  else:
278
- label += f"{str.capitalize(key)}: IN {value['in']} OUT {value['out']} \t"
276
+ labels_dict[str.capitalize(key)] = f"IN {value['IN']} OUT {value['OUT']}"
279
277
 
280
- label = label.rstrip()
281
- label = label.split("\t")
282
-
283
- if self.count_reg_pts is not None and label is not None:
284
- self.annotator.display_counts(
285
- counts=label,
286
- count_txt_color=self.count_txt_color,
287
- count_bg_color=self.count_bg_color,
288
- )
278
+ if labels_dict is not None:
279
+ self.annotator.display_analytics(self.im0, labels_dict, self.count_txt_color, self.count_bg_color, 10)
289
280
 
290
281
  self.im0 = cv2.addWeighted(self.im0, 1 - self.heatmap_alpha, heatmap_colored, self.heatmap_alpha, 0)
291
282
 
@@ -181,9 +181,7 @@ class ObjectCounter:
181
181
 
182
182
  # Store class info
183
183
  if self.names[cls] not in self.class_wise_count:
184
- if len(self.names[cls]) > 5:
185
- self.names[cls] = self.names[cls][:5]
186
- self.class_wise_count[self.names[cls]] = {"in": 0, "out": 0}
184
+ self.class_wise_count[self.names[cls]] = {"IN": 0, "OUT": 0}
187
185
 
188
186
  # Draw Tracks
189
187
  track_line = self.track_history[track_id]
@@ -210,10 +208,10 @@ class ObjectCounter:
210
208
 
211
209
  if (box[0] - prev_position[0]) * (self.counting_region.centroid.x - prev_position[0]) > 0:
212
210
  self.in_counts += 1
213
- self.class_wise_count[self.names[cls]]["in"] += 1
211
+ self.class_wise_count[self.names[cls]]["IN"] += 1
214
212
  else:
215
213
  self.out_counts += 1
216
- self.class_wise_count[self.names[cls]]["out"] += 1
214
+ self.class_wise_count[self.names[cls]]["OUT"] += 1
217
215
 
218
216
  # Count objects using line
219
217
  elif len(self.reg_pts) == 2:
@@ -224,33 +222,26 @@ class ObjectCounter:
224
222
 
225
223
  if (box[0] - prev_position[0]) * (self.counting_region.centroid.x - prev_position[0]) > 0:
226
224
  self.in_counts += 1
227
- self.class_wise_count[self.names[cls]]["in"] += 1
225
+ self.class_wise_count[self.names[cls]]["IN"] += 1
228
226
  else:
229
227
  self.out_counts += 1
230
- self.class_wise_count[self.names[cls]]["out"] += 1
228
+ self.class_wise_count[self.names[cls]]["OUT"] += 1
231
229
 
232
- label = "Ultralytics Analytics \t"
230
+ labels_dict = {}
233
231
 
234
232
  for key, value in self.class_wise_count.items():
235
- if value["in"] != 0 or value["out"] != 0:
233
+ if value["IN"] != 0 or value["OUT"] != 0:
236
234
  if not self.view_in_counts and not self.view_out_counts:
237
- label = None
235
+ continue
238
236
  elif not self.view_in_counts:
239
- label += f"{str.capitalize(key)}: IN {value['in']} \t"
237
+ labels_dict[str.capitalize(key)] = f"OUT {value['OUT']}"
240
238
  elif not self.view_out_counts:
241
- label += f"{str.capitalize(key)}: OUT {value['out']} \t"
239
+ labels_dict[str.capitalize(key)] = f"IN {value['IN']}"
242
240
  else:
243
- label += f"{str.capitalize(key)}: IN {value['in']} OUT {value['out']} \t"
241
+ labels_dict[str.capitalize(key)] = f"IN {value['IN']} OUT {value['OUT']}"
244
242
 
245
- label = label.rstrip()
246
- label = label.split("\t")
247
-
248
- if label is not None:
249
- self.annotator.display_counts(
250
- counts=label,
251
- count_txt_color=self.count_txt_color,
252
- count_bg_color=self.count_bg_color,
253
- )
243
+ if labels_dict is not None:
244
+ self.annotator.display_analytics(self.im0, labels_dict, self.count_txt_color, self.count_bg_color, 10)
254
245
 
255
246
  def display_frames(self):
256
247
  """Display frame."""
@@ -0,0 +1,235 @@
1
+ import json
2
+ from tkinter import filedialog, messagebox
3
+
4
+ import cv2
5
+ import numpy as np
6
+ from PIL import Image, ImageTk
7
+
8
+ from ultralytics.utils.checks import check_imshow, check_requirements
9
+ from ultralytics.utils.plotting import Annotator
10
+
11
+ check_requirements("tkinter")
12
+ import tkinter as tk
13
+
14
+
15
+ class ParkingPtsSelection:
16
+ def __init__(self, master):
17
+ # Initialize window and widgets.
18
+ self.master = master
19
+ master.title("Ultralytics Parking Zones Points Selector")
20
+ self.initialize_ui()
21
+
22
+ # Initialize properties
23
+ self.image_path = None
24
+ self.image = None
25
+ self.canvas_image = None
26
+ self.canvas = None
27
+ self.bounding_boxes = []
28
+ self.current_box = []
29
+ self.img_width = 0
30
+ self.img_height = 0
31
+
32
+ # Constants
33
+ self.canvas_max_width = 1280
34
+ self.canvas_max_height = 720
35
+
36
+ def initialize_ui(self):
37
+ """Setup UI components."""
38
+ # Setup buttons
39
+ button_frame = tk.Frame(self.master)
40
+ button_frame.pack(side=tk.TOP)
41
+
42
+ tk.Button(button_frame, text="Upload Image", command=self.upload_image).grid(row=0, column=0)
43
+ tk.Button(button_frame, text="Remove Last BBox", command=self.remove_last_bounding_box).grid(row=0, column=1)
44
+ tk.Button(button_frame, text="Save", command=self.save_to_json).grid(row=0, column=2)
45
+
46
+ # Setup canvas for image display
47
+ self.canvas = tk.Canvas(self.master, bg="white")
48
+ self.canvas.pack(side=tk.BOTTOM)
49
+ self.canvas.bind("<Button-1>", self.on_canvas_click)
50
+
51
+ def upload_image(self):
52
+ """Upload an image and resize it to fit canvas."""
53
+ self.image_path = filedialog.askopenfilename(filetypes=[("Image Files", "*.png;*.jpg;*.jpeg")])
54
+ if not self.image_path:
55
+ return
56
+
57
+ self.image = Image.open(self.image_path)
58
+ self.img_width, self.img_height = self.image.size
59
+
60
+ # Calculate the aspect ratio and resize image
61
+ aspect_ratio = self.img_width / self.img_height
62
+ if aspect_ratio > 1:
63
+ # Landscape orientation
64
+ canvas_width = min(self.canvas_max_width, self.img_width)
65
+ canvas_height = int(canvas_width / aspect_ratio)
66
+ else:
67
+ # Portrait orientation
68
+ canvas_height = min(self.canvas_max_height, self.img_height)
69
+ canvas_width = int(canvas_height * aspect_ratio)
70
+
71
+ self.canvas.config(width=canvas_width, height=canvas_height)
72
+ resized_image = self.image.resize((canvas_width, canvas_height), Image.LANCZOS)
73
+ self.canvas_image = ImageTk.PhotoImage(resized_image)
74
+ self.canvas.create_image(0, 0, anchor=tk.NW, image=self.canvas_image)
75
+
76
+ # Reset bounding boxes and current box
77
+ self.bounding_boxes = []
78
+ self.current_box = []
79
+
80
+ def on_canvas_click(self, event):
81
+ """Handle mouse clicks on canvas to create points for bounding boxes."""
82
+ self.current_box.append((event.x, event.y))
83
+
84
+ if len(self.current_box) == 4:
85
+ self.bounding_boxes.append(self.current_box)
86
+ self.draw_bounding_box(self.current_box)
87
+ self.current_box = []
88
+
89
+ def draw_bounding_box(self, box):
90
+ """Draw bounding box on canvas."""
91
+ for i in range(4):
92
+ x1, y1 = box[i]
93
+ x2, y2 = box[(i + 1) % 4]
94
+ self.canvas.create_line(x1, y1, x2, y2, fill="blue", width=2)
95
+
96
+ def remove_last_bounding_box(self):
97
+ """Remove the last drawn bounding box from canvas."""
98
+ if self.bounding_boxes:
99
+ self.bounding_boxes.pop() # Remove the last bounding box
100
+ self.canvas.delete("all") # Clear the canvas
101
+ self.canvas.create_image(0, 0, anchor=tk.NW, image=self.canvas_image) # Redraw the image
102
+
103
+ # Redraw all bounding boxes
104
+ for box in self.bounding_boxes:
105
+ self.draw_bounding_box(box)
106
+
107
+ messagebox.showinfo("Success", "Last bounding box removed.")
108
+ else:
109
+ messagebox.showwarning("Warning", "No bounding boxes to remove.")
110
+
111
+ def save_to_json(self):
112
+ canvas_width, canvas_height = self.canvas.winfo_width(), self.canvas.winfo_height()
113
+ width_scaling_factor = self.img_width / canvas_width
114
+ height_scaling_factor = self.img_height / canvas_height
115
+ bounding_boxes_data = []
116
+ for box in self.bounding_boxes:
117
+ print("Bounding Box ", bounding_boxes_data)
118
+ rescaled_box = []
119
+ for x, y in box:
120
+ rescaled_x = int(x * width_scaling_factor)
121
+ rescaled_y = int(y * height_scaling_factor)
122
+ rescaled_box.append((rescaled_x, rescaled_y))
123
+ bounding_boxes_data.append({"points": rescaled_box})
124
+ with open("bounding_boxes.json", "w") as json_file:
125
+ json.dump(bounding_boxes_data, json_file, indent=4)
126
+
127
+ messagebox.showinfo("Success", "Bounding boxes saved to bounding_boxes.json")
128
+
129
+
130
+ class ParkingManagement:
131
+ def __init__(
132
+ self,
133
+ model_path,
134
+ txt_color=(0, 0, 0),
135
+ bg_color=(255, 255, 255),
136
+ occupied_region_color=(0, 255, 0),
137
+ available_region_color=(0, 0, 255),
138
+ margin=10,
139
+ ):
140
+ # Model path and initialization
141
+ self.model_path = model_path
142
+ self.model = self.load_model()
143
+
144
+ # Labels dictionary
145
+ self.labels_dict = {"Occupancy": 0, "Available": 0}
146
+
147
+ # Visualization details
148
+ self.margin = margin
149
+ self.bg_color = bg_color
150
+ self.txt_color = txt_color
151
+ self.occupied_region_color = occupied_region_color
152
+ self.available_region_color = available_region_color
153
+
154
+ self.window_name = "Ultralytics YOLOv8 Parking Management System"
155
+ # Check if environment support imshow
156
+ self.env_check = check_imshow(warn=True)
157
+
158
+ def load_model(self):
159
+ """Load the Ultralytics YOLOv8 model for inference and analytics."""
160
+ from ultralytics import YOLO
161
+
162
+ self.model = YOLO(self.model_path)
163
+ return self.model
164
+
165
+ def parking_regions_extraction(self, json_file):
166
+ """
167
+ Extract parking regions from json file.
168
+
169
+ Args:
170
+ json_file (str): file that have all parking slot points
171
+ """
172
+
173
+ with open(json_file, "r") as json_file:
174
+ json_data = json.load(json_file)
175
+ return json_data
176
+
177
+ def process_data(self, json_data, im0, boxes, clss):
178
+ """
179
+ Process the model data for parking lot management.
180
+
181
+ Args:
182
+ json_data (str): json data for parking lot management
183
+ im0 (ndarray): inference image
184
+ boxes (list): bounding boxes data
185
+ clss (list): bounding boxes classes list
186
+ Returns:
187
+ filled_slots (int): total slots that are filled in parking lot
188
+ empty_slots (int): total slots that are available in parking lot
189
+ """
190
+ annotator = Annotator(im0)
191
+ total_slots, filled_slots = len(json_data), 0
192
+ empty_slots = total_slots
193
+
194
+ for region in json_data:
195
+ points = region["points"]
196
+ points_array = np.array(points, dtype=np.int32).reshape((-1, 1, 2))
197
+ region_occupied = False
198
+
199
+ for box, cls in zip(boxes, clss):
200
+ x_center = int((box[0] + box[2]) / 2)
201
+ y_center = int((box[1] + box[3]) / 2)
202
+ text = f"{self.model.names[int(cls)]}"
203
+
204
+ annotator.display_objects_labels(
205
+ im0, text, self.txt_color, self.bg_color, x_center, y_center, self.margin
206
+ )
207
+ dist = cv2.pointPolygonTest(points_array, (x_center, y_center), False)
208
+ if dist >= 0:
209
+ region_occupied = True
210
+ break
211
+
212
+ color = self.occupied_region_color if region_occupied else self.available_region_color
213
+ cv2.polylines(im0, [points_array], isClosed=True, color=color, thickness=2)
214
+ if region_occupied:
215
+ filled_slots += 1
216
+ empty_slots -= 1
217
+
218
+ self.labels_dict["Occupancy"] = filled_slots
219
+ self.labels_dict["Available"] = empty_slots
220
+
221
+ annotator.display_analytics(im0, self.labels_dict, self.txt_color, self.bg_color, self.margin)
222
+
223
+ def display_frames(self, im0):
224
+ """
225
+ Display frame.
226
+
227
+ Args:
228
+ im0 (ndarray): inference image
229
+ """
230
+ if self.env_check:
231
+ cv2.namedWindow(self.window_name)
232
+ cv2.imshow(self.window_name, im0)
233
+ # Break Window
234
+ if cv2.waitKey(1) & 0xFF == ord("q"):
235
+ return
@@ -419,51 +419,63 @@ class Annotator:
419
419
  lineType=cv2.LINE_AA,
420
420
  )
421
421
 
422
- def display_counts(self, counts=None, count_bg_color=(0, 0, 0), count_txt_color=(255, 255, 255)):
422
+ ### Parking management utils
423
+ def display_objects_labels(self, im0, text, txt_color, bg_color, x_center, y_center, margin):
423
424
  """
424
- Display counts on im0 with text background and border.
425
+ Display the bounding boxes labels in parking management app.
425
426
 
426
427
  Args:
427
- counts (str): objects count data
428
- count_bg_color (RGB Color): counts highlighter color
429
- count_txt_color (RGB Color): counts display color
428
+ im0 (ndarray): inference image
429
+ text (str): object/class name
430
+ txt_color (bgr color): display color for text foreground
431
+ bg_color (bgr color): display color for text background
432
+ x_center (float): x position center point for bounding box
433
+ y_center (float): y position center point for bounding box
434
+ margin (int): gap between text and rectangle for better display
430
435
  """
431
436
 
432
- tl = self.tf or round(0.002 * (self.im.shape[0] + self.im.shape[1]) / 2) + 1
433
- tf = max(tl - 1, 1)
437
+ text_size = cv2.getTextSize(text, 0, fontScale=self.sf, thickness=self.tf)[0]
438
+ text_x = x_center - text_size[0] // 2
439
+ text_y = y_center + text_size[1] // 2
434
440
 
435
- t_sizes = [cv2.getTextSize(str(count), 0, fontScale=self.sf, thickness=self.tf)[0] for count in counts]
441
+ rect_x1 = text_x - margin
442
+ rect_y1 = text_y - text_size[1] - margin
443
+ rect_x2 = text_x + text_size[0] + margin
444
+ rect_y2 = text_y + margin
445
+ cv2.rectangle(im0, (rect_x1, rect_y1), (rect_x2, rect_y2), bg_color, -1)
446
+ cv2.putText(im0, text, (text_x, text_y), 0, self.sf, txt_color, self.tf, lineType=cv2.LINE_AA)
436
447
 
437
- max_text_width = max([size[0] for size in t_sizes])
438
- max_text_height = max([size[1] for size in t_sizes])
439
-
440
- text_x = self.im.shape[1] - int(self.im.shape[1] * 0.025 + max_text_width)
441
- text_y = int(self.im.shape[0] * 0.025)
442
-
443
- for i, count in enumerate(counts):
444
- text_x_pos = text_x
445
- text_y_pos = text_y + i * (max_text_height + 25 * tf)
446
-
447
- # Draw the border
448
- cv2.rectangle(
449
- self.im,
450
- (text_x_pos - (10 * tf), text_y_pos - (10 * tf)),
451
- (text_x_pos + max_text_width + (10 * tf), text_y_pos + max_text_height + (10 * tf)),
452
- count_bg_color,
453
- -1,
454
- )
448
+ # Parking lot and object counting app
449
+ def display_analytics(self, im0, text, txt_color, bg_color, margin):
450
+ """
451
+ Display the overall statistics for parking lots
452
+ Args:
453
+ im0 (ndarray): inference image
454
+ text (dict): labels dictionary
455
+ txt_color (bgr color): display color for text foreground
456
+ bg_color (bgr color): display color for text background
457
+ margin (int): gap between text and rectangle for better display
458
+ """
455
459
 
456
- # Draw the count text
460
+ horizontal_gap = int(im0.shape[1] * 0.02)
461
+ vertical_gap = int(im0.shape[0] * 0.01)
462
+
463
+ text_y_offset = 0
464
+
465
+ for label, value in text.items():
466
+ txt = f"{label}: {value}"
467
+ text_size = cv2.getTextSize(txt, 0, int(self.sf * 1.5), int(self.tf * 1.5))[0]
468
+ text_x = im0.shape[1] - text_size[0] - margin * 2 - horizontal_gap
469
+ text_y = text_y_offset + text_size[1] + margin * 2 + vertical_gap
470
+ rect_x1 = text_x - margin * 2
471
+ rect_y1 = text_y - text_size[1] - margin * 2
472
+ rect_x2 = text_x + text_size[0] + margin * 2
473
+ rect_y2 = text_y + margin * 2
474
+ cv2.rectangle(im0, (rect_x1, rect_y1), (rect_x2, rect_y2), bg_color, -1)
457
475
  cv2.putText(
458
- self.im,
459
- str(count),
460
- (text_x_pos, text_y_pos + max_text_height),
461
- 0,
462
- fontScale=self.sf,
463
- color=count_txt_color,
464
- thickness=self.tf,
465
- lineType=cv2.LINE_AA,
476
+ im0, txt, (text_x, text_y), 0, int(self.sf * 1.5), txt_color, int(self.tf * 1.5), lineType=cv2.LINE_AA
466
477
  )
478
+ text_y_offset = rect_y2
467
479
 
468
480
  @staticmethod
469
481
  def estimate_pose_angle(a, b, c):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ultralytics
3
- Version: 8.2.4
3
+ Version: 8.2.5
4
4
  Summary: Ultralytics YOLOv8 for SOTA object detection, multi-object tracking, instance segmentation, pose estimation and image classification.
5
5
  Author: Glenn Jocher, Ayush Chaurasia, Jing Qiu
6
6
  Maintainer: Glenn Jocher, Ayush Chaurasia, Jing Qiu
@@ -173,6 +173,7 @@ ultralytics/solutions/ai_gym.py
173
173
  ultralytics/solutions/distance_calculation.py
174
174
  ultralytics/solutions/heatmap.py
175
175
  ultralytics/solutions/object_counter.py
176
+ ultralytics/solutions/parking_management.py
176
177
  ultralytics/solutions/queue_management.py
177
178
  ultralytics/solutions/speed_estimation.py
178
179
  ultralytics/trackers/__init__.py
File without changes
File without changes
File without changes
File without changes