ultralytics 8.2.20__tar.gz → 8.2.22__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 (223) hide show
  1. {ultralytics-8.2.20 → ultralytics-8.2.22}/PKG-INFO +1 -1
  2. {ultralytics-8.2.20 → ultralytics-8.2.22}/pyproject.toml +1 -1
  3. ultralytics-8.2.22/tests/__init__.py +22 -0
  4. ultralytics-8.2.22/tests/conftest.py +71 -0
  5. {ultralytics-8.2.20 → ultralytics-8.2.22}/tests/test_exports.py +15 -15
  6. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/__init__.py +1 -1
  7. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/data/augment.py +67 -10
  8. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/engine/exporter.py +14 -19
  9. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/solutions/__init__.py +1 -1
  10. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/solutions/analytics.py +2 -0
  11. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/solutions/parking_management.py +24 -20
  12. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/utils/checks.py +4 -3
  13. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics.egg-info/PKG-INFO +1 -1
  14. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics.egg-info/SOURCES.txt +9 -0
  15. {ultralytics-8.2.20 → ultralytics-8.2.22}/LICENSE +0 -0
  16. {ultralytics-8.2.20 → ultralytics-8.2.22}/README.md +0 -0
  17. {ultralytics-8.2.20 → ultralytics-8.2.22}/setup.cfg +0 -0
  18. {ultralytics-8.2.20 → ultralytics-8.2.22}/tests/test_cli.py +0 -0
  19. {ultralytics-8.2.20 → ultralytics-8.2.22}/tests/test_cuda.py +0 -0
  20. {ultralytics-8.2.20 → ultralytics-8.2.22}/tests/test_engine.py +0 -0
  21. {ultralytics-8.2.20 → ultralytics-8.2.22}/tests/test_explorer.py +0 -0
  22. {ultralytics-8.2.20 → ultralytics-8.2.22}/tests/test_integrations.py +0 -0
  23. {ultralytics-8.2.20 → ultralytics-8.2.22}/tests/test_python.py +0 -0
  24. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/assets/bus.jpg +0 -0
  25. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/assets/zidane.jpg +0 -0
  26. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/__init__.py +0 -0
  27. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
  28. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
  29. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
  30. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
  31. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
  32. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
  33. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
  34. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/datasets/VOC.yaml +0 -0
  35. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
  36. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
  37. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
  38. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
  39. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
  40. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/datasets/coco.yaml +0 -0
  41. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
  42. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/datasets/coco128.yaml +0 -0
  43. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
  44. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
  45. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/datasets/coco8.yaml +0 -0
  46. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
  47. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/datasets/dota8.yaml +0 -0
  48. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/datasets/lvis.yaml +0 -0
  49. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
  50. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
  51. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/datasets/signature.yaml +0 -0
  52. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
  53. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/datasets/xView.yaml +0 -0
  54. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/default.yaml +0 -0
  55. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
  56. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
  57. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
  58. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
  59. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
  60. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
  61. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
  62. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
  63. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
  64. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
  65. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
  66. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
  67. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
  68. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
  69. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
  70. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
  71. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
  72. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
  73. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
  74. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
  75. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
  76. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
  77. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
  78. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
  79. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
  80. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
  81. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
  82. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
  83. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
  84. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
  85. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
  86. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/trackers/botsort.yaml +0 -0
  87. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
  88. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/data/__init__.py +0 -0
  89. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/data/annotator.py +0 -0
  90. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/data/base.py +0 -0
  91. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/data/build.py +0 -0
  92. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/data/converter.py +0 -0
  93. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/data/dataset.py +0 -0
  94. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/data/explorer/__init__.py +0 -0
  95. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/data/explorer/explorer.py +0 -0
  96. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/data/explorer/gui/__init__.py +0 -0
  97. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/data/explorer/gui/dash.py +0 -0
  98. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/data/explorer/utils.py +0 -0
  99. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/data/loaders.py +0 -0
  100. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/data/split_dota.py +0 -0
  101. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/data/utils.py +0 -0
  102. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/engine/__init__.py +0 -0
  103. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/engine/model.py +0 -0
  104. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/engine/predictor.py +0 -0
  105. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/engine/results.py +0 -0
  106. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/engine/trainer.py +0 -0
  107. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/engine/tuner.py +0 -0
  108. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/engine/validator.py +0 -0
  109. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/hub/__init__.py +0 -0
  110. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/hub/auth.py +0 -0
  111. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/hub/session.py +0 -0
  112. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/hub/utils.py +0 -0
  113. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/__init__.py +0 -0
  114. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/fastsam/__init__.py +0 -0
  115. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/fastsam/model.py +0 -0
  116. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/fastsam/predict.py +0 -0
  117. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/fastsam/prompt.py +0 -0
  118. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/fastsam/utils.py +0 -0
  119. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/fastsam/val.py +0 -0
  120. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/nas/__init__.py +0 -0
  121. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/nas/model.py +0 -0
  122. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/nas/predict.py +0 -0
  123. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/nas/val.py +0 -0
  124. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/rtdetr/__init__.py +0 -0
  125. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/rtdetr/model.py +0 -0
  126. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/rtdetr/predict.py +0 -0
  127. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/rtdetr/train.py +0 -0
  128. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/rtdetr/val.py +0 -0
  129. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/sam/__init__.py +0 -0
  130. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/sam/amg.py +0 -0
  131. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/sam/build.py +0 -0
  132. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/sam/model.py +0 -0
  133. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/sam/modules/__init__.py +0 -0
  134. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/sam/modules/decoders.py +0 -0
  135. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/sam/modules/encoders.py +0 -0
  136. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/sam/modules/sam.py +0 -0
  137. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
  138. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/sam/modules/transformer.py +0 -0
  139. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/sam/predict.py +0 -0
  140. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/utils/__init__.py +0 -0
  141. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/utils/loss.py +0 -0
  142. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/utils/ops.py +0 -0
  143. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/yolo/__init__.py +0 -0
  144. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/yolo/classify/__init__.py +0 -0
  145. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/yolo/classify/predict.py +0 -0
  146. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/yolo/classify/train.py +0 -0
  147. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/yolo/classify/val.py +0 -0
  148. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/yolo/detect/__init__.py +0 -0
  149. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/yolo/detect/predict.py +0 -0
  150. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/yolo/detect/train.py +0 -0
  151. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/yolo/detect/val.py +0 -0
  152. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/yolo/model.py +0 -0
  153. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/yolo/obb/__init__.py +0 -0
  154. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/yolo/obb/predict.py +0 -0
  155. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/yolo/obb/train.py +0 -0
  156. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/yolo/obb/val.py +0 -0
  157. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/yolo/pose/__init__.py +0 -0
  158. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/yolo/pose/predict.py +0 -0
  159. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/yolo/pose/train.py +0 -0
  160. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/yolo/pose/val.py +0 -0
  161. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/yolo/segment/__init__.py +0 -0
  162. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/yolo/segment/predict.py +0 -0
  163. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/yolo/segment/train.py +0 -0
  164. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/yolo/segment/val.py +0 -0
  165. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/yolo/world/__init__.py +0 -0
  166. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/yolo/world/train.py +0 -0
  167. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/models/yolo/world/train_world.py +0 -0
  168. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/nn/__init__.py +0 -0
  169. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/nn/autobackend.py +0 -0
  170. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/nn/modules/__init__.py +0 -0
  171. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/nn/modules/block.py +0 -0
  172. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/nn/modules/conv.py +0 -0
  173. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/nn/modules/head.py +0 -0
  174. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/nn/modules/transformer.py +0 -0
  175. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/nn/modules/utils.py +0 -0
  176. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/nn/tasks.py +0 -0
  177. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/solutions/ai_gym.py +0 -0
  178. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/solutions/distance_calculation.py +0 -0
  179. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/solutions/heatmap.py +0 -0
  180. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/solutions/object_counter.py +0 -0
  181. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/solutions/queue_management.py +0 -0
  182. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/solutions/speed_estimation.py +0 -0
  183. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/trackers/__init__.py +0 -0
  184. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/trackers/basetrack.py +0 -0
  185. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/trackers/bot_sort.py +0 -0
  186. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/trackers/byte_tracker.py +0 -0
  187. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/trackers/track.py +0 -0
  188. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/trackers/utils/__init__.py +0 -0
  189. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/trackers/utils/gmc.py +0 -0
  190. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/trackers/utils/kalman_filter.py +0 -0
  191. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/trackers/utils/matching.py +0 -0
  192. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/utils/__init__.py +0 -0
  193. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/utils/autobatch.py +0 -0
  194. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/utils/benchmarks.py +0 -0
  195. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/utils/callbacks/__init__.py +0 -0
  196. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/utils/callbacks/base.py +0 -0
  197. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/utils/callbacks/clearml.py +0 -0
  198. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/utils/callbacks/comet.py +0 -0
  199. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/utils/callbacks/dvc.py +0 -0
  200. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/utils/callbacks/hub.py +0 -0
  201. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/utils/callbacks/mlflow.py +0 -0
  202. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/utils/callbacks/neptune.py +0 -0
  203. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/utils/callbacks/raytune.py +0 -0
  204. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/utils/callbacks/tensorboard.py +0 -0
  205. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/utils/callbacks/wb.py +0 -0
  206. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/utils/dist.py +0 -0
  207. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/utils/downloads.py +0 -0
  208. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/utils/errors.py +0 -0
  209. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/utils/files.py +0 -0
  210. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/utils/instance.py +0 -0
  211. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/utils/loss.py +0 -0
  212. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/utils/metrics.py +0 -0
  213. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/utils/ops.py +0 -0
  214. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/utils/patches.py +0 -0
  215. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/utils/plotting.py +0 -0
  216. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/utils/tal.py +0 -0
  217. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/utils/torch_utils.py +0 -0
  218. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/utils/triton.py +0 -0
  219. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics/utils/tuner.py +0 -0
  220. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics.egg-info/dependency_links.txt +0 -0
  221. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics.egg-info/entry_points.txt +0 -0
  222. {ultralytics-8.2.20 → ultralytics-8.2.22}/ultralytics.egg-info/requires.txt +0 -0
  223. {ultralytics-8.2.20 → ultralytics-8.2.22}/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.20
3
+ Version: 8.2.22
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
@@ -139,7 +139,7 @@ ultralytics = "ultralytics.cfg:entrypoint"
139
139
  # Tools settings -------------------------------------------------------------------------------------------------------
140
140
  [tool.setuptools] # configuration specific to the `setuptools` build backend.
141
141
  packages = { find = { where = ["."], include = ["ultralytics", "ultralytics.*"] } }
142
- package-data = { "ultralytics" = ["**/*.yaml"], "ultralytics.assets" = ["*.jpg"] }
142
+ package-data = { "ultralytics" = ["**/*.yaml", "../tests/*.py"], "ultralytics.assets" = ["*.jpg"] }
143
143
 
144
144
  [tool.setuptools.dynamic]
145
145
  version = { attr = "ultralytics.__version__" }
@@ -0,0 +1,22 @@
1
+ # Ultralytics YOLO 🚀, AGPL-3.0 license
2
+
3
+ from ultralytics.utils import ASSETS, ROOT, WEIGHTS_DIR, checks, is_dir_writeable
4
+
5
+ # Constants used in tests
6
+ MODEL = WEIGHTS_DIR / "path with spaces" / "yolov8n.pt" # test spaces in path
7
+ CFG = "yolov8n.yaml"
8
+ SOURCE = ASSETS / "bus.jpg"
9
+ TMP = (ROOT / "../tests/tmp").resolve() # temp directory for test files
10
+ IS_TMP_WRITEABLE = is_dir_writeable(TMP)
11
+ CUDA_IS_AVAILABLE = checks.cuda_is_available()
12
+ CUDA_DEVICE_COUNT = checks.cuda_device_count()
13
+
14
+ __all__ = (
15
+ "MODEL",
16
+ "CFG",
17
+ "SOURCE",
18
+ "TMP",
19
+ "IS_TMP_WRITEABLE",
20
+ "CUDA_IS_AVAILABLE",
21
+ "CUDA_DEVICE_COUNT",
22
+ )
@@ -0,0 +1,71 @@
1
+ # Ultralytics YOLO 🚀, AGPL-3.0 license
2
+
3
+ import shutil
4
+ from pathlib import Path
5
+
6
+ from tests import TMP
7
+
8
+
9
+ def pytest_addoption(parser):
10
+ """
11
+ Add custom command-line options to pytest.
12
+
13
+ Args:
14
+ parser (pytest.config.Parser): The pytest parser object.
15
+ """
16
+ parser.addoption("--slow", action="store_true", default=False, help="Run slow tests")
17
+
18
+
19
+ def pytest_collection_modifyitems(config, items):
20
+ """
21
+ Modify the list of test items to remove tests marked as slow if the --slow option is not provided.
22
+
23
+ Args:
24
+ config (pytest.config.Config): The pytest config object.
25
+ items (list): List of test items to be executed.
26
+ """
27
+ if not config.getoption("--slow"):
28
+ # Remove the item entirely from the list of test items if it's marked as 'slow'
29
+ items[:] = [item for item in items if "slow" not in item.keywords]
30
+
31
+
32
+ def pytest_sessionstart(session):
33
+ """
34
+ Initialize session configurations for pytest.
35
+
36
+ This function is automatically called by pytest after the 'Session' object has been created but before performing
37
+ test collection. It sets the initial seeds and prepares the temporary directory for the test session.
38
+
39
+ Args:
40
+ session (pytest.Session): The pytest session object.
41
+ """
42
+ from ultralytics.utils.torch_utils import init_seeds
43
+
44
+ init_seeds()
45
+ shutil.rmtree(TMP, ignore_errors=True) # delete any existing tests/tmp directory
46
+ TMP.mkdir(parents=True, exist_ok=True) # create a new empty directory
47
+
48
+
49
+ def pytest_terminal_summary(terminalreporter, exitstatus, config):
50
+ """
51
+ Cleanup operations after pytest session.
52
+
53
+ This function is automatically called by pytest at the end of the entire test session. It removes certain files
54
+ and directories used during testing.
55
+
56
+ Args:
57
+ terminalreporter (pytest.terminal.TerminalReporter): The terminal reporter object.
58
+ exitstatus (int): The exit status of the test run.
59
+ config (pytest.config.Config): The pytest config object.
60
+ """
61
+ from ultralytics.utils import WEIGHTS_DIR
62
+
63
+ # Remove files
64
+ models = [path for x in ["*.onnx", "*.torchscript"] for path in WEIGHTS_DIR.rglob(x)]
65
+ for file in ["bus.jpg", "yolov8n.onnx", "yolov8n.torchscript"] + models:
66
+ Path(file).unlink(missing_ok=True)
67
+
68
+ # Remove directories
69
+ models = [path for x in ["*.mlpackage", "*_openvino_model"] for path in WEIGHTS_DIR.rglob(x)]
70
+ for directory in [TMP.parents[1] / ".pytest_cache", TMP] + models:
71
+ shutil.rmtree(directory, ignore_errors=True)
@@ -23,22 +23,22 @@ from tests import MODEL, SOURCE
23
23
 
24
24
  def test_export_torchscript():
25
25
  """Test YOLO exports to TorchScript format."""
26
- f = YOLO(MODEL).export(format="torchscript", optimize=False, imgsz=32)
27
- YOLO(f)(SOURCE, imgsz=32) # exported model inference
26
+ file = YOLO(MODEL).export(format="torchscript", optimize=False, imgsz=32)
27
+ YOLO(file)(SOURCE, imgsz=32) # exported model inference
28
28
 
29
29
 
30
30
  def test_export_onnx():
31
31
  """Test YOLO exports to ONNX format."""
32
- f = YOLO(MODEL).export(format="onnx", dynamic=True, imgsz=32)
33
- YOLO(f)(SOURCE, imgsz=32) # exported model inference
32
+ file = YOLO(MODEL).export(format="onnx", dynamic=True, imgsz=32)
33
+ YOLO(file)(SOURCE, imgsz=32) # exported model inference
34
34
 
35
35
 
36
36
  @pytest.mark.skipif(checks.IS_PYTHON_3_12, reason="OpenVINO not supported in Python 3.12")
37
37
  @pytest.mark.skipif(not TORCH_1_13, reason="OpenVINO requires torch>=1.13")
38
38
  def test_export_openvino():
39
39
  """Test YOLO exports to OpenVINO format."""
40
- f = YOLO(MODEL).export(format="openvino", imgsz=32)
41
- YOLO(f)(SOURCE, imgsz=32) # exported model inference
40
+ file = YOLO(MODEL).export(format="openvino", imgsz=32)
41
+ YOLO(file)(SOURCE, imgsz=32) # exported model inference
42
42
 
43
43
 
44
44
  @pytest.mark.slow
@@ -118,7 +118,7 @@ def test_export_torchscript_matrix(task, dynamic, int8, half, batch):
118
118
  ],
119
119
  )
120
120
  def test_export_coreml_matrix(task, dynamic, int8, half, batch):
121
- """Test YOLO exports to TorchScript format."""
121
+ """Test YOLO exports to CoreML format."""
122
122
  file = YOLO(TASK2MODEL[task]).export(
123
123
  format="coreml",
124
124
  imgsz=32,
@@ -138,8 +138,8 @@ def test_export_coreml_matrix(task, dynamic, int8, half, batch):
138
138
  def test_export_coreml():
139
139
  """Test YOLO exports to CoreML format."""
140
140
  if MACOS:
141
- f = YOLO(MODEL).export(format="coreml", imgsz=32)
142
- YOLO(f)(SOURCE, imgsz=32) # model prediction only supported on macOS for nms=False models
141
+ file = YOLO(MODEL).export(format="coreml", imgsz=32)
142
+ YOLO(file)(SOURCE, imgsz=32) # model prediction only supported on macOS for nms=False models
143
143
  else:
144
144
  YOLO(MODEL).export(format="coreml", nms=True, imgsz=32)
145
145
 
@@ -152,8 +152,8 @@ def test_export_tflite():
152
152
  Note TF suffers from install conflicts on Windows and macOS.
153
153
  """
154
154
  model = YOLO(MODEL)
155
- f = model.export(format="tflite", imgsz=32)
156
- YOLO(f)(SOURCE, imgsz=32)
155
+ file = model.export(format="tflite", imgsz=32)
156
+ YOLO(file)(SOURCE, imgsz=32)
157
157
 
158
158
 
159
159
  @pytest.mark.skipif(True, reason="Test disabled")
@@ -165,8 +165,8 @@ def test_export_pb():
165
165
  Note TF suffers from install conflicts on Windows and macOS.
166
166
  """
167
167
  model = YOLO(MODEL)
168
- f = model.export(format="pb", imgsz=32)
169
- YOLO(f)(SOURCE, imgsz=32)
168
+ file = model.export(format="pb", imgsz=32)
169
+ YOLO(file)(SOURCE, imgsz=32)
170
170
 
171
171
 
172
172
  @pytest.mark.skipif(True, reason="Test disabled as Paddle protobuf and ONNX protobuf requirementsk conflict.")
@@ -182,5 +182,5 @@ def test_export_paddle():
182
182
  @pytest.mark.slow
183
183
  def test_export_ncnn():
184
184
  """Test YOLO exports to NCNN format."""
185
- f = YOLO(MODEL).export(format="ncnn", imgsz=32)
186
- YOLO(f)(SOURCE, imgsz=32) # exported model inference
185
+ file = YOLO(MODEL).export(format="ncnn", imgsz=32)
186
+ YOLO(file)(SOURCE, imgsz=32) # exported model inference
@@ -1,6 +1,6 @@
1
1
  # Ultralytics YOLO 🚀, AGPL-3.0 license
2
2
 
3
- __version__ = "8.2.20"
3
+ __version__ = "8.2.22"
4
4
 
5
5
  from ultralytics.data.explorer.explorer import Explorer
6
6
  from ultralytics.models import RTDETR, SAM, YOLO, YOLOWorld
@@ -874,11 +874,56 @@ class Albumentations:
874
874
  self.p = p
875
875
  self.transform = None
876
876
  prefix = colorstr("albumentations: ")
877
+
877
878
  try:
878
879
  import albumentations as A
879
880
 
880
881
  check_version(A.__version__, "1.0.3", hard=True) # version requirement
881
882
 
883
+ # List of possible spatial transforms
884
+ spatial_transforms = {
885
+ "Affine",
886
+ "BBoxSafeRandomCrop",
887
+ "CenterCrop",
888
+ "CoarseDropout",
889
+ "Crop",
890
+ "CropAndPad",
891
+ "CropNonEmptyMaskIfExists",
892
+ "D4",
893
+ "ElasticTransform",
894
+ "Flip",
895
+ "GridDistortion",
896
+ "GridDropout",
897
+ "HorizontalFlip",
898
+ "Lambda",
899
+ "LongestMaxSize",
900
+ "MaskDropout",
901
+ "MixUp",
902
+ "Morphological",
903
+ "NoOp",
904
+ "OpticalDistortion",
905
+ "PadIfNeeded",
906
+ "Perspective",
907
+ "PiecewiseAffine",
908
+ "PixelDropout",
909
+ "RandomCrop",
910
+ "RandomCropFromBorders",
911
+ "RandomGridShuffle",
912
+ "RandomResizedCrop",
913
+ "RandomRotate90",
914
+ "RandomScale",
915
+ "RandomSizedBBoxSafeCrop",
916
+ "RandomSizedCrop",
917
+ "Resize",
918
+ "Rotate",
919
+ "SafeRotate",
920
+ "ShiftScaleRotate",
921
+ "SmallestMaxSize",
922
+ "Transpose",
923
+ "VerticalFlip",
924
+ "XYMasking",
925
+ } # from https://albumentations.ai/docs/getting_started/transforms_and_targets/#spatial-level-transforms
926
+
882
927
  # Transforms
883
928
  T = [
884
929
  A.Blur(p=0.01),
@@ -889,8 +934,14 @@ class Albumentations:
889
934
  A.RandomGamma(p=0.0),
890
935
  A.ImageCompression(quality_lower=75, p=0.0),
891
936
  ]
892
- self.transform = A.Compose(T, bbox_params=A.BboxParams(format="yolo", label_fields=["class_labels"]))
893
937
 
938
+ # Compose transforms
939
+ self.contains_spatial = any(transform.__class__.__name__ in spatial_transforms for transform in T)
940
+ self.transform = (
941
+ A.Compose(T, bbox_params=A.BboxParams(format="yolo", label_fields=["class_labels"]))
942
+ if self.contains_spatial
943
+ else A.Compose(T)
944
+ )
894
945
  LOGGER.info(prefix + ", ".join(f"{x}".replace("always_apply=False, ", "") for x in T if x.p))
895
946
  except ImportError: # package not installed, skip
896
947
  pass
@@ -899,20 +950,26 @@ class Albumentations:
899
950
 
900
951
  def __call__(self, labels):
901
952
  """Generates object detections and returns a dictionary with detection results."""
902
- im = labels["img"]
903
- cls = labels["cls"]
904
- if len(cls):
905
- labels["instances"].convert_bbox("xywh")
906
- labels["instances"].normalize(*im.shape[:2][::-1])
907
- bboxes = labels["instances"].bboxes
908
- # TODO: add supports of segments and keypoints
909
- if self.transform and random.random() < self.p:
953
+ if self.transform is None or random.random() > self.p:
954
+ return labels
955
+
956
+ if self.contains_spatial:
957
+ cls = labels["cls"]
958
+ if len(cls):
959
+ im = labels["img"]
960
+ labels["instances"].convert_bbox("xywh")
961
+ labels["instances"].normalize(*im.shape[:2][::-1])
962
+ bboxes = labels["instances"].bboxes
963
+ # TODO: add supports of segments and keypoints
910
964
  new = self.transform(image=im, bboxes=bboxes, class_labels=cls) # transformed
911
965
  if len(new["class_labels"]) > 0: # skip update if no bbox in new im
912
966
  labels["img"] = new["image"]
913
967
  labels["cls"] = np.array(new["class_labels"])
914
968
  bboxes = np.array(new["bboxes"], dtype=np.float32)
915
- labels["instances"].update(bboxes=bboxes)
969
+ labels["instances"].update(bboxes=bboxes)
970
+ else:
971
+ labels["img"] = self.transform(image=labels["img"])["image"] # transformed
972
+
916
973
  return labels
917
974
 
918
975
 
@@ -83,6 +83,7 @@ from ultralytics.utils import (
83
83
  WINDOWS,
84
84
  __version__,
85
85
  callbacks,
86
+ checks,
86
87
  colorstr,
87
88
  get_default_args,
88
89
  yaml_save,
@@ -184,6 +185,7 @@ class Exporter:
184
185
  if sum(flags) != 1:
185
186
  raise ValueError(f"Invalid export format='{fmt}'. Valid formats are {fmts}")
186
187
  jit, onnx, xml, engine, coreml, saved_model, pb, tflite, edgetpu, tfjs, paddle, ncnn = flags # export booleans
188
+ is_tf_format = any((saved_model, pb, tflite, edgetpu, tfjs))
187
189
 
188
190
  # Device
189
191
  if fmt == "engine" and self.args.device is None:
@@ -243,7 +245,7 @@ class Exporter:
243
245
  m.dynamic = self.args.dynamic
244
246
  m.export = True
245
247
  m.format = self.args.format
246
- elif isinstance(m, C2f) and not any((saved_model, pb, tflite, edgetpu, tfjs)):
248
+ elif isinstance(m, C2f) and not is_tf_format:
247
249
  # EdgeTPU does not support FlexSplitV while split provides cleaner ONNX graph
248
250
  m.forward = m.forward_split
249
251
 
@@ -303,7 +305,7 @@ class Exporter:
303
305
  f[3], _ = self.export_openvino()
304
306
  if coreml: # CoreML
305
307
  f[4], _ = self.export_coreml()
306
- if any((saved_model, pb, tflite, edgetpu, tfjs)): # TensorFlow formats
308
+ if is_tf_format: # TensorFlow formats
307
309
  self.args.int8 |= edgetpu
308
310
  f[5], keras_model = self.export_saved_model()
309
311
  if pb or tfjs: # pb prerequisite to tfjs
@@ -777,11 +779,10 @@ class Exporter:
777
779
  _ = self.cache.write_bytes(cache)
778
780
 
779
781
  # Load dataset w/ builder (for batching) and calibrate
780
- dataset = self.get_int8_calibration_dataloader(prefix)
781
782
  config.int8_calibrator = EngineCalibrator(
782
- dataset=dataset,
783
+ dataset=self.get_int8_calibration_dataloader(prefix),
783
784
  batch=2 * self.args.batch,
784
- cache=self.file.with_suffix(".cache"),
785
+ cache=str(self.file.with_suffix(".cache")),
785
786
  )
786
787
 
787
788
  elif half:
@@ -813,7 +814,7 @@ class Exporter:
813
814
  except ImportError:
814
815
  suffix = "-macos" if MACOS else "-aarch64" if ARM64 else "" if cuda else "-cpu"
815
816
  version = "" if ARM64 else "<=2.13.1"
816
- check_requirements(f"tensorflow{suffix}{version}")
817
+ check_requirements((f"tensorflow{suffix}{version}", "keras"))
817
818
  import tensorflow as tf # noqa
818
819
  if ARM64:
819
820
  check_requirements("cmake") # 'cmake' is needed to build onnxsim on aarch64
@@ -828,8 +829,8 @@ class Exporter:
828
829
  "flatbuffers>=23.5.26,<100", # update old 'flatbuffers' included inside tensorflow package
829
830
  "onnxruntime-gpu" if cuda else "onnxruntime",
830
831
  ),
831
- cmds="--extra-index-url https://pypi.ngc.nvidia.com",
832
- ) # onnx_graphsurgeon only on NVIDIA
832
+ cmds="--extra-index-url https://pypi.ngc.nvidia.com", # onnx_graphsurgeon only on NVIDIA
833
+ )
833
834
 
834
835
  LOGGER.info(f"\n{prefix} starting export with tensorflow {tf.__version__}...")
835
836
  check_version(
@@ -855,24 +856,17 @@ class Exporter:
855
856
  f_onnx, _ = self.export_onnx()
856
857
 
857
858
  # Export to TF
858
- tmp_file = f / "tmp_tflite_int8_calibration_images.npy" # int8 calibration images file
859
859
  np_data = None
860
860
  if self.args.int8:
861
+ tmp_file = f / "tmp_tflite_int8_calibration_images.npy" # int8 calibration images file
861
862
  verbosity = "info"
862
863
  if self.args.data:
863
- # Generate calibration data for integer quantization
864
- dataloader = self.get_int8_calibration_dataloader(prefix)
865
- images = []
866
- for i, batch in enumerate(dataloader):
867
- if i >= 100: # maximum number of calibration images
868
- break
869
- im = batch["img"].permute(1, 2, 0)[None] # list to nparray, CHW to BHWC
870
- images.append(im)
871
864
  f.mkdir()
865
+ images = [batch["img"].permute(0, 2, 3, 1) for batch in self.get_int8_calibration_dataloader(prefix)]
872
866
  images = torch.cat(images, 0).float()
873
867
  # mean = images.view(-1, 3).mean(0) # imagenet mean [123.675, 116.28, 103.53]
874
868
  # std = images.view(-1, 3).std(0) # imagenet std [58.395, 57.12, 57.375]
875
- np.save(str(tmp_file), images.numpy()) # BHWC
869
+ np.save(str(tmp_file), images.numpy().astype(np.float32)) # BHWC
876
870
  np_data = [["images", tmp_file, [[[[0, 0, 0]]]], [[[[255, 255, 255]]]]]]
877
871
  else:
878
872
  verbosity = "error"
@@ -1017,10 +1011,11 @@ class Exporter:
1017
1011
  """Add metadata to *.tflite models per https://www.tensorflow.org/lite/models/convert/metadata."""
1018
1012
  import flatbuffers
1019
1013
 
1020
- if MACOS: # TFLite Support bug https://github.com/tensorflow/tflite-support/issues/954#issuecomment-2108570845
1014
+ if ARM64:
1021
1015
  from tflite_support import metadata # noqa
1022
1016
  from tflite_support import metadata_schema_py_generated as schema # noqa
1023
1017
  else:
1018
+ # TFLite Support bug https://github.com/tensorflow/tflite-support/issues/954#issuecomment-2108570845
1024
1019
  from tensorflow_lite_support.metadata import metadata_schema_py_generated as schema # noqa
1025
1020
  from tensorflow_lite_support.metadata.python import metadata # noqa
1026
1021
 
@@ -5,7 +5,7 @@ from .analytics import Analytics
5
5
  from .distance_calculation import DistanceCalculation
6
6
  from .heatmap import Heatmap
7
7
  from .object_counter import ObjectCounter
8
- from .parking_management import ParkingManagement
8
+ from .parking_management import ParkingManagement, ParkingPtsSelection
9
9
  from .queue_management import QueueManager
10
10
  from .speed_estimation import SpeedEstimator
11
11
 
@@ -1,3 +1,5 @@
1
+ # Ultralytics YOLO 🚀, AGPL-3.0 license
2
+
1
3
  from itertools import cycle
2
4
 
3
5
  import cv2
@@ -1,3 +1,5 @@
1
+ # Ultralytics YOLO 🚀, AGPL-3.0 license
2
+
1
3
  import json
2
4
  from tkinter import filedialog, messagebox
3
5
 
@@ -10,32 +12,31 @@ from ultralytics.utils.plotting import Annotator
10
12
 
11
13
 
12
14
  class ParkingPtsSelection:
13
- def __init__(self, master):
14
- """
15
- Initializes the UI for selecting parking zone points in a tkinter window.
16
-
17
- Args:
18
- master (tk.Tk): The main tkinter window object.
19
- """
15
+ def __init__(self):
16
+ """Initializes the UI for selecting parking zone points in a tkinter window."""
20
17
  check_requirements("tkinter")
18
+
21
19
  import tkinter as tk
22
20
 
23
- self.master = master
24
- master.title("Ultralytics Parking Zones Points Selector")
21
+ self.tk = tk
22
+ self.master = tk.Tk()
23
+ self.master.title("Ultralytics Parking Zones Points Selector")
25
24
 
26
25
  # Disable window resizing
27
- master.resizable(False, False)
26
+ self.master.resizable(False, False)
28
27
 
29
28
  # Setup canvas for image display
30
- self.canvas = tk.Canvas(master, bg="white")
29
+ self.canvas = self.tk.Canvas(self.master, bg="white")
31
30
 
32
31
  # Setup buttons
33
- button_frame = tk.Frame(master)
34
- button_frame.pack(side=tk.TOP)
32
+ button_frame = self.tk.Frame(self.master)
33
+ button_frame.pack(side=self.tk.TOP)
35
34
 
36
- tk.Button(button_frame, text="Upload Image", command=self.upload_image).grid(row=0, column=0)
37
- tk.Button(button_frame, text="Remove Last BBox", command=self.remove_last_bounding_box).grid(row=0, column=1)
38
- tk.Button(button_frame, text="Save", command=self.save_to_json).grid(row=0, column=2)
35
+ self.tk.Button(button_frame, text="Upload Image", command=self.upload_image).grid(row=0, column=0)
36
+ self.tk.Button(button_frame, text="Remove Last BBox", command=self.remove_last_bounding_box).grid(
37
+ row=0, column=1
38
+ )
39
+ self.tk.Button(button_frame, text="Save", command=self.save_to_json).grid(row=0, column=2)
39
40
 
40
41
  # Initialize properties
41
42
  self.image_path = None
@@ -50,6 +51,8 @@ class ParkingPtsSelection:
50
51
  self.canvas_max_width = 1280
51
52
  self.canvas_max_height = 720
52
53
 
54
+ self.master.mainloop()
55
+
53
56
  def upload_image(self):
54
57
  """Upload an image and resize it to fit canvas."""
55
58
  self.image_path = filedialog.askopenfilename(filetypes=[("Image Files", "*.png;*.jpg;*.jpeg")])
@@ -74,12 +77,12 @@ class ParkingPtsSelection:
74
77
  if self.canvas:
75
78
  self.canvas.destroy() # Destroy previous canvas
76
79
 
77
- self.canvas = tk.Canvas(self.master, bg="white", width=canvas_width, height=canvas_height)
80
+ self.canvas = self.tk.Canvas(self.master, bg="white", width=canvas_width, height=canvas_height)
78
81
  resized_image = self.image.resize((canvas_width, canvas_height), Image.LANCZOS)
79
82
  self.canvas_image = ImageTk.PhotoImage(resized_image)
80
- self.canvas.create_image(0, 0, anchor=tk.NW, image=self.canvas_image)
83
+ self.canvas.create_image(0, 0, anchor=self.tk.NW, image=self.canvas_image)
81
84
 
82
- self.canvas.pack(side=tk.BOTTOM)
85
+ self.canvas.pack(side=self.tk.BOTTOM)
83
86
  self.canvas.bind("<Button-1>", self.on_canvas_click)
84
87
 
85
88
  # Reset bounding boxes and current box
@@ -115,7 +118,7 @@ class ParkingPtsSelection:
115
118
  if self.bounding_boxes:
116
119
  self.bounding_boxes.pop() # Remove the last bounding box
117
120
  self.canvas.delete("all") # Clear the canvas
118
- self.canvas.create_image(0, 0, anchor=tk.NW, image=self.canvas_image) # Redraw the image
121
+ self.canvas.create_image(0, 0, anchor=self.tk.NW, image=self.canvas_image) # Redraw the image
119
122
 
120
123
  # Redraw all bounding boxes
121
124
  for box in self.bounding_boxes:
@@ -210,6 +213,7 @@ class ParkingManagement:
210
213
  im0 (ndarray): inference image
211
214
  boxes (list): bounding boxes data
212
215
  clss (list): bounding boxes classes list
216
+
213
217
  Returns:
214
218
  filled_slots (int): total slots that are filled in parking lot
215
219
  empty_slots (int): total slots that are available in parking lot
@@ -23,7 +23,6 @@ from ultralytics.utils import (
23
23
  ASSETS,
24
24
  AUTOINSTALL,
25
25
  IS_COLAB,
26
- IS_DOCKER,
27
26
  IS_JUPYTER,
28
27
  IS_KAGGLE,
29
28
  IS_PIP_PACKAGE,
@@ -322,17 +321,18 @@ def check_font(font="Arial.ttf"):
322
321
  return file
323
322
 
324
323
 
325
- def check_python(minimum: str = "3.8.0") -> bool:
324
+ def check_python(minimum: str = "3.8.0", hard: bool = True) -> bool:
326
325
  """
327
326
  Check current python version against the required minimum version.
328
327
 
329
328
  Args:
330
329
  minimum (str): Required minimum version of python.
330
+ hard (bool, optional): If True, raise an AssertionError if the requirement is not met.
331
331
 
332
332
  Returns:
333
333
  (bool): Whether the installed Python version meets the minimum constraints.
334
334
  """
335
- return check_version(PYTHON_VERSION, minimum, name="Python ", hard=True)
335
+ return check_version(PYTHON_VERSION, minimum, name="Python", hard=hard)
336
336
 
337
337
 
338
338
  @TryExcept()
@@ -735,4 +735,5 @@ def cuda_is_available() -> bool:
735
735
 
736
736
 
737
737
  # Define constants
738
+ IS_PYTHON_MINIMUM_3_10 = check_python("3.10", hard=False)
738
739
  IS_PYTHON_3_12 = PYTHON_VERSION.startswith("3.12")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ultralytics
3
- Version: 8.2.20
3
+ Version: 8.2.22
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
@@ -15,6 +15,15 @@ ultralytics.egg-info/dependency_links.txt
15
15
  ultralytics.egg-info/entry_points.txt
16
16
  ultralytics.egg-info/requires.txt
17
17
  ultralytics.egg-info/top_level.txt
18
+ ultralytics/../tests/__init__.py
19
+ ultralytics/../tests/conftest.py
20
+ ultralytics/../tests/test_cli.py
21
+ ultralytics/../tests/test_cuda.py
22
+ ultralytics/../tests/test_engine.py
23
+ ultralytics/../tests/test_explorer.py
24
+ ultralytics/../tests/test_exports.py
25
+ ultralytics/../tests/test_integrations.py
26
+ ultralytics/../tests/test_python.py
18
27
  ultralytics/assets/bus.jpg
19
28
  ultralytics/assets/zidane.jpg
20
29
  ultralytics/cfg/__init__.py
File without changes
File without changes
File without changes