ultralytics 8.3.161__tar.gz → 8.3.163__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.
Files changed (278) hide show
  1. {ultralytics-8.3.161/ultralytics.egg-info → ultralytics-8.3.163}/PKG-INFO +9 -1
  2. {ultralytics-8.3.161 → ultralytics-8.3.163}/pyproject.toml +9 -0
  3. {ultralytics-8.3.161 → ultralytics-8.3.163}/tests/conftest.py +2 -2
  4. {ultralytics-8.3.161 → ultralytics-8.3.163}/tests/test_python.py +2 -2
  5. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/__init__.py +1 -1
  6. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/data/augment.py +2 -0
  7. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/data/converter.py +2 -2
  8. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/data/split_dota.py +1 -1
  9. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/data/utils.py +3 -2
  10. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/engine/exporter.py +7 -6
  11. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/engine/predictor.py +6 -6
  12. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/engine/tuner.py +2 -2
  13. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/nas/model.py +2 -1
  14. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/sam/modules/tiny_encoder.py +1 -1
  15. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/detect/val.py +1 -1
  16. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/world/train.py +1 -1
  17. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/world/train_world.py +11 -3
  18. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/yoloe/train.py +1 -1
  19. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/nn/tasks.py +6 -3
  20. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/solutions/region_counter.py +29 -32
  21. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/solutions/solutions.py +1 -1
  22. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/__init__.py +1 -2
  23. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/checks.py +21 -0
  24. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/metrics.py +4 -3
  25. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/patches.py +1 -2
  26. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/plotting.py +2 -2
  27. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/torch_utils.py +2 -1
  28. {ultralytics-8.3.161 → ultralytics-8.3.163/ultralytics.egg-info}/PKG-INFO +9 -1
  29. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics.egg-info/requires.txt +9 -0
  30. {ultralytics-8.3.161 → ultralytics-8.3.163}/LICENSE +0 -0
  31. {ultralytics-8.3.161 → ultralytics-8.3.163}/README.md +0 -0
  32. {ultralytics-8.3.161 → ultralytics-8.3.163}/setup.cfg +0 -0
  33. {ultralytics-8.3.161 → ultralytics-8.3.163}/tests/__init__.py +0 -0
  34. {ultralytics-8.3.161 → ultralytics-8.3.163}/tests/test_cli.py +0 -0
  35. {ultralytics-8.3.161 → ultralytics-8.3.163}/tests/test_cuda.py +0 -0
  36. {ultralytics-8.3.161 → ultralytics-8.3.163}/tests/test_engine.py +0 -0
  37. {ultralytics-8.3.161 → ultralytics-8.3.163}/tests/test_exports.py +0 -0
  38. {ultralytics-8.3.161 → ultralytics-8.3.163}/tests/test_integrations.py +0 -0
  39. {ultralytics-8.3.161 → ultralytics-8.3.163}/tests/test_solutions.py +0 -0
  40. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/assets/bus.jpg +0 -0
  41. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/assets/zidane.jpg +0 -0
  42. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/__init__.py +0 -0
  43. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
  44. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
  45. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
  46. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
  47. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/HomeObjects-3K.yaml +0 -0
  48. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
  49. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
  50. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
  51. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/VOC.yaml +0 -0
  52. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
  53. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
  54. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
  55. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
  56. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
  57. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/coco.yaml +0 -0
  58. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
  59. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/coco128.yaml +0 -0
  60. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/coco8-grayscale.yaml +0 -0
  61. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/coco8-multispectral.yaml +0 -0
  62. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
  63. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
  64. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/coco8.yaml +0 -0
  65. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
  66. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/dog-pose.yaml +0 -0
  67. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/dota8-multispectral.yaml +0 -0
  68. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/dota8.yaml +0 -0
  69. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/hand-keypoints.yaml +0 -0
  70. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/lvis.yaml +0 -0
  71. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/medical-pills.yaml +0 -0
  72. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
  73. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
  74. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/signature.yaml +0 -0
  75. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
  76. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/datasets/xView.yaml +0 -0
  77. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/default.yaml +0 -0
  78. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/11/yolo11-cls-resnet18.yaml +0 -0
  79. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/11/yolo11-cls.yaml +0 -0
  80. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/11/yolo11-obb.yaml +0 -0
  81. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/11/yolo11-pose.yaml +0 -0
  82. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/11/yolo11-seg.yaml +0 -0
  83. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/11/yolo11.yaml +0 -0
  84. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/11/yoloe-11-seg.yaml +0 -0
  85. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/11/yoloe-11.yaml +0 -0
  86. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/12/yolo12-cls.yaml +0 -0
  87. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/12/yolo12-obb.yaml +0 -0
  88. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/12/yolo12-pose.yaml +0 -0
  89. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/12/yolo12-seg.yaml +0 -0
  90. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/12/yolo12.yaml +0 -0
  91. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
  92. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
  93. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
  94. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
  95. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v10/yolov10b.yaml +0 -0
  96. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v10/yolov10l.yaml +0 -0
  97. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v10/yolov10m.yaml +0 -0
  98. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v10/yolov10n.yaml +0 -0
  99. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v10/yolov10s.yaml +0 -0
  100. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v10/yolov10x.yaml +0 -0
  101. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
  102. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
  103. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
  104. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
  105. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
  106. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
  107. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v8/yoloe-v8-seg.yaml +0 -0
  108. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v8/yoloe-v8.yaml +0 -0
  109. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
  110. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
  111. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
  112. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
  113. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
  114. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
  115. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
  116. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
  117. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
  118. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
  119. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
  120. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
  121. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
  122. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
  123. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
  124. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
  125. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
  126. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
  127. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
  128. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
  129. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
  130. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v9/yolov9m.yaml +0 -0
  131. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v9/yolov9s.yaml +0 -0
  132. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/models/v9/yolov9t.yaml +0 -0
  133. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/trackers/botsort.yaml +0 -0
  134. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
  135. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/data/__init__.py +0 -0
  136. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/data/annotator.py +0 -0
  137. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/data/base.py +0 -0
  138. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/data/build.py +0 -0
  139. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/data/dataset.py +0 -0
  140. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/data/loaders.py +0 -0
  141. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/data/scripts/download_weights.sh +0 -0
  142. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/data/scripts/get_coco.sh +0 -0
  143. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/data/scripts/get_coco128.sh +0 -0
  144. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/data/scripts/get_imagenet.sh +0 -0
  145. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/data/split.py +0 -0
  146. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/engine/__init__.py +0 -0
  147. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/engine/model.py +0 -0
  148. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/engine/results.py +0 -0
  149. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/engine/trainer.py +0 -0
  150. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/engine/validator.py +0 -0
  151. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/hub/__init__.py +0 -0
  152. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/hub/auth.py +0 -0
  153. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/hub/google/__init__.py +0 -0
  154. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/hub/session.py +0 -0
  155. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/hub/utils.py +0 -0
  156. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/__init__.py +0 -0
  157. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/fastsam/__init__.py +0 -0
  158. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/fastsam/model.py +0 -0
  159. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/fastsam/predict.py +0 -0
  160. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/fastsam/utils.py +0 -0
  161. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/fastsam/val.py +0 -0
  162. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/nas/__init__.py +0 -0
  163. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/nas/predict.py +0 -0
  164. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/nas/val.py +0 -0
  165. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/rtdetr/__init__.py +0 -0
  166. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/rtdetr/model.py +0 -0
  167. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/rtdetr/predict.py +0 -0
  168. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/rtdetr/train.py +0 -0
  169. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/rtdetr/val.py +0 -0
  170. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/sam/__init__.py +0 -0
  171. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/sam/amg.py +0 -0
  172. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/sam/build.py +0 -0
  173. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/sam/model.py +0 -0
  174. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/sam/modules/__init__.py +0 -0
  175. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/sam/modules/blocks.py +0 -0
  176. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/sam/modules/decoders.py +0 -0
  177. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/sam/modules/encoders.py +0 -0
  178. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/sam/modules/memory_attention.py +0 -0
  179. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/sam/modules/sam.py +0 -0
  180. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/sam/modules/transformer.py +0 -0
  181. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/sam/modules/utils.py +0 -0
  182. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/sam/predict.py +0 -0
  183. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/utils/__init__.py +0 -0
  184. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/utils/loss.py +0 -0
  185. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/utils/ops.py +0 -0
  186. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/__init__.py +0 -0
  187. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/classify/__init__.py +0 -0
  188. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/classify/predict.py +0 -0
  189. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/classify/train.py +0 -0
  190. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/classify/val.py +0 -0
  191. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/detect/__init__.py +0 -0
  192. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/detect/predict.py +0 -0
  193. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/detect/train.py +0 -0
  194. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/model.py +0 -0
  195. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/obb/__init__.py +0 -0
  196. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/obb/predict.py +0 -0
  197. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/obb/train.py +0 -0
  198. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/obb/val.py +0 -0
  199. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/pose/__init__.py +0 -0
  200. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/pose/predict.py +0 -0
  201. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/pose/train.py +0 -0
  202. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/pose/val.py +0 -0
  203. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/segment/__init__.py +0 -0
  204. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/segment/predict.py +0 -0
  205. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/segment/train.py +0 -0
  206. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/segment/val.py +0 -0
  207. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/world/__init__.py +0 -0
  208. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/yoloe/__init__.py +0 -0
  209. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/yoloe/predict.py +0 -0
  210. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/yoloe/train_seg.py +0 -0
  211. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/models/yolo/yoloe/val.py +0 -0
  212. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/nn/__init__.py +0 -0
  213. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/nn/autobackend.py +0 -0
  214. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/nn/modules/__init__.py +0 -0
  215. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/nn/modules/activation.py +0 -0
  216. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/nn/modules/block.py +0 -0
  217. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/nn/modules/conv.py +0 -0
  218. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/nn/modules/head.py +0 -0
  219. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/nn/modules/transformer.py +0 -0
  220. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/nn/modules/utils.py +0 -0
  221. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/nn/text_model.py +0 -0
  222. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/solutions/__init__.py +0 -0
  223. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/solutions/ai_gym.py +0 -0
  224. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/solutions/analytics.py +0 -0
  225. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/solutions/config.py +0 -0
  226. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/solutions/distance_calculation.py +0 -0
  227. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/solutions/heatmap.py +0 -0
  228. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/solutions/instance_segmentation.py +0 -0
  229. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/solutions/object_blurrer.py +0 -0
  230. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/solutions/object_counter.py +0 -0
  231. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/solutions/object_cropper.py +0 -0
  232. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/solutions/parking_management.py +0 -0
  233. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/solutions/queue_management.py +0 -0
  234. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/solutions/security_alarm.py +0 -0
  235. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/solutions/similarity_search.py +0 -0
  236. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/solutions/speed_estimation.py +0 -0
  237. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/solutions/streamlit_inference.py +0 -0
  238. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/solutions/templates/similarity-search.html +0 -0
  239. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/solutions/trackzone.py +0 -0
  240. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/solutions/vision_eye.py +0 -0
  241. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/trackers/__init__.py +0 -0
  242. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/trackers/basetrack.py +0 -0
  243. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/trackers/bot_sort.py +0 -0
  244. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/trackers/byte_tracker.py +0 -0
  245. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/trackers/track.py +0 -0
  246. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/trackers/utils/__init__.py +0 -0
  247. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/trackers/utils/gmc.py +0 -0
  248. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/trackers/utils/kalman_filter.py +0 -0
  249. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/trackers/utils/matching.py +0 -0
  250. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/autobatch.py +0 -0
  251. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/autodevice.py +0 -0
  252. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/benchmarks.py +0 -0
  253. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/callbacks/__init__.py +0 -0
  254. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/callbacks/base.py +0 -0
  255. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/callbacks/clearml.py +0 -0
  256. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/callbacks/comet.py +0 -0
  257. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/callbacks/dvc.py +0 -0
  258. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/callbacks/hub.py +0 -0
  259. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/callbacks/mlflow.py +0 -0
  260. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/callbacks/neptune.py +0 -0
  261. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/callbacks/raytune.py +0 -0
  262. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/callbacks/tensorboard.py +0 -0
  263. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/callbacks/wb.py +0 -0
  264. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/dist.py +0 -0
  265. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/downloads.py +0 -0
  266. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/errors.py +0 -0
  267. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/export.py +0 -0
  268. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/files.py +0 -0
  269. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/instance.py +0 -0
  270. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/loss.py +0 -0
  271. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/ops.py +0 -0
  272. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/tal.py +0 -0
  273. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/triton.py +0 -0
  274. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics/utils/tuner.py +0 -0
  275. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics.egg-info/SOURCES.txt +0 -0
  276. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics.egg-info/dependency_links.txt +0 -0
  277. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics.egg-info/entry_points.txt +0 -0
  278. {ultralytics-8.3.161 → ultralytics-8.3.163}/ultralytics.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ultralytics
3
- Version: 8.3.161
3
+ Version: 8.3.163
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>
@@ -79,6 +79,14 @@ Requires-Dist: hub-sdk>=0.0.12; extra == "extra"
79
79
  Requires-Dist: ipython; extra == "extra"
80
80
  Requires-Dist: albumentations>=1.4.6; extra == "extra"
81
81
  Requires-Dist: faster-coco-eval>=1.6.7; extra == "extra"
82
+ Provides-Extra: typing
83
+ Requires-Dist: pandas-stubs; extra == "typing"
84
+ Requires-Dist: scipy-stubs; extra == "typing"
85
+ Requires-Dist: types-pillow; extra == "typing"
86
+ Requires-Dist: types-psutil; extra == "typing"
87
+ Requires-Dist: types-pyyaml; extra == "typing"
88
+ Requires-Dist: types-requests; extra == "typing"
89
+ Requires-Dist: types-shapely; extra == "typing"
82
90
  Dynamic: license-file
83
91
 
84
92
  <div align="center">
@@ -117,6 +117,15 @@ extra = [
117
117
  "albumentations>=1.4.6", # training augmentations
118
118
  "faster-coco-eval>=1.6.7", # COCO mAP
119
119
  ]
120
+ typing = [
121
+ "pandas-stubs",
122
+ "scipy-stubs",
123
+ "types-pillow",
124
+ "types-psutil",
125
+ "types-pyyaml",
126
+ "types-requests",
127
+ "types-shapely",
128
+ ]
120
129
 
121
130
  [project.urls]
122
131
  "Homepage" = "https://ultralytics.com"
@@ -56,11 +56,11 @@ def pytest_terminal_summary(terminalreporter, exitstatus, config):
56
56
  from ultralytics.utils import WEIGHTS_DIR
57
57
 
58
58
  # Remove files
59
- models = [path for x in ["*.onnx", "*.torchscript"] for path in WEIGHTS_DIR.rglob(x)]
59
+ models = [path for x in {"*.onnx", "*.torchscript"} for path in WEIGHTS_DIR.rglob(x)]
60
60
  for file in ["decelera_portrait_min.mov", "bus.jpg", "yolo11n.onnx", "yolo11n.torchscript"] + models:
61
61
  Path(file).unlink(missing_ok=True)
62
62
 
63
63
  # Remove directories
64
- models = [path for x in ["*.mlpackage", "*_openvino_model"] for path in WEIGHTS_DIR.rglob(x)]
64
+ models = [path for x in {"*.mlpackage", "*_openvino_model"} for path in WEIGHTS_DIR.rglob(x)]
65
65
  for directory in [WEIGHTS_DIR / "path with spaces", TMP.parents[1] / ".pytest_cache", TMP] + models:
66
66
  shutil.rmtree(directory, ignore_errors=True)
@@ -204,7 +204,7 @@ def test_track_stream(model):
204
204
  @pytest.mark.parametrize("task,model,data", TASK_MODEL_DATA)
205
205
  def test_val(task: str, model: str, data: str) -> None:
206
206
  """Test the validation mode of the YOLO model."""
207
- for plots in [True, False]: # Test both cases i.e. plots=True and plots=False
207
+ for plots in {True, False}: # Test both cases i.e. plots=True and plots=False
208
208
  metrics = YOLO(model).val(data=data, imgsz=32, plots=plots)
209
209
  metrics.to_df()
210
210
  metrics.to_csv()
@@ -390,7 +390,7 @@ def test_cfg_init():
390
390
  check_dict_alignment({"a": 1}, {"b": 2})
391
391
  copy_default_cfg()
392
392
  (Path.cwd() / DEFAULT_CFG_PATH.name.replace(".yaml", "_copy.yaml")).unlink(missing_ok=False)
393
- [smart_value(x) for x in ["none", "true", "false"]]
393
+ [smart_value(x) for x in {"none", "true", "false"}]
394
394
 
395
395
 
396
396
  def test_utils_init():
@@ -1,6 +1,6 @@
1
1
  # Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
2
2
 
3
- __version__ = "8.3.161"
3
+ __version__ = "8.3.163"
4
4
 
5
5
  import os
6
6
 
@@ -1805,6 +1805,8 @@ class CopyPaste(BaseMixTransform):
1805
1805
  def _transform(self, labels1, labels2={}):
1806
1806
  """Apply Copy-Paste augmentation to combine objects from another image into the current image."""
1807
1807
  im = labels1["img"]
1808
+ if "mosaic_border" not in labels1:
1809
+ im = im.copy() # avoid modifying original non-mosaic image
1808
1810
  cls = labels1["cls"]
1809
1811
  h, w = im.shape[:2]
1810
1812
  instances = labels1.pop("instances")
@@ -496,7 +496,7 @@ def convert_dota_to_yolo_obb(dota_root_path: str):
496
496
  formatted_coords = [f"{coord:.6g}" for coord in normalized_coords]
497
497
  g.write(f"{class_idx} {' '.join(formatted_coords)}\n")
498
498
 
499
- for phase in ["train", "val"]:
499
+ for phase in {"train", "val"}:
500
500
  image_dir = dota_root_path / "images" / phase
501
501
  orig_label_dir = dota_root_path / "labels" / f"{phase}_original"
502
502
  save_dir = dota_root_path / "labels" / phase
@@ -684,7 +684,7 @@ def create_synthetic_coco_dataset():
684
684
  # Create synthetic images
685
685
  shutil.rmtree(dir / "labels" / "test2017", ignore_errors=True) # Remove test2017 directory as not needed
686
686
  with ThreadPoolExecutor(max_workers=NUM_THREADS) as executor:
687
- for subset in ["train2017", "val2017"]:
687
+ for subset in {"train2017", "val2017"}:
688
688
  subset_dir = dir / "images" / subset
689
689
  subset_dir.mkdir(parents=True, exist_ok=True)
690
690
 
@@ -295,7 +295,7 @@ def split_trainval(
295
295
  for r in rates:
296
296
  crop_sizes.append(int(crop_size / r))
297
297
  gaps.append(int(gap / r))
298
- for split in ["train", "val"]:
298
+ for split in {"train", "val"}:
299
299
  split_images_and_labels(data_root, save_dir, split, crop_sizes, gaps)
300
300
 
301
301
 
@@ -214,8 +214,9 @@ def verify_image_label(args: Tuple) -> List:
214
214
  else:
215
215
  assert lb.shape[1] == 5, f"labels require 5 columns, {lb.shape[1]} columns detected"
216
216
  points = lb[:, 1:]
217
- assert points.max() <= 1, f"non-normalized or out of bounds coordinates {points[points > 1]}"
218
- assert lb.min() >= 0, f"negative label values {lb[lb < 0]}"
217
+ # Coordinate points check with 1% tolerance
218
+ assert points.max() <= 1.01, f"non-normalized or out of bounds coordinates {points[points > 1.01]}"
219
+ assert lb.min() >= -0.01, f"negative class labels {lb[lb < -0.01]}"
219
220
 
220
221
  # All labels
221
222
  if single_cls:
@@ -100,6 +100,7 @@ from ultralytics.utils.checks import (
100
100
  check_is_path_safe,
101
101
  check_requirements,
102
102
  check_version,
103
+ is_intel,
103
104
  is_sudo_available,
104
105
  )
105
106
  from ultralytics.utils.downloads import attempt_download_asset, get_github_assets, safe_download
@@ -107,7 +108,7 @@ from ultralytics.utils.export import export_engine, export_onnx
107
108
  from ultralytics.utils.files import file_size, spaces_in_path
108
109
  from ultralytics.utils.ops import Profile, nms_rotated
109
110
  from ultralytics.utils.patches import arange_patch
110
- from ultralytics.utils.torch_utils import TORCH_1_13, get_cpu_info, get_latest_opset, select_device
111
+ from ultralytics.utils.torch_utils import TORCH_1_13, get_latest_opset, select_device
111
112
 
112
113
 
113
114
  def export_formats():
@@ -372,9 +373,9 @@ class Exporter:
372
373
  raise SystemError("TF.js exports are not currently supported on ARM64 Linux")
373
374
  # Recommend OpenVINO if export and Intel CPU
374
375
  if SETTINGS.get("openvino_msg"):
375
- if "intel" in get_cpu_info().lower():
376
+ if is_intel():
376
377
  LOGGER.info(
377
- "💡 ProTip: Export to OpenVINO format for best performance on Intel CPUs."
378
+ "💡 ProTip: Export to OpenVINO format for best performance on Intel hardware."
378
379
  " Learn more at https://docs.ultralytics.com/integrations/openvino/"
379
380
  )
380
381
  SETTINGS["openvino_msg"] = False
@@ -573,7 +574,7 @@ class Exporter:
573
574
  """Export YOLO model to ONNX format."""
574
575
  requirements = ["onnx>=1.12.0,<1.18.0"]
575
576
  if self.args.simplify:
576
- requirements += ["onnxslim>=0.1.56", "onnxruntime" + ("-gpu" if torch.cuda.is_available() else "")]
577
+ requirements += ["onnxslim>=0.1.59", "onnxruntime" + ("-gpu" if torch.cuda.is_available() else "")]
577
578
  check_requirements(requirements)
578
579
  import onnx # noqa
579
580
 
@@ -948,10 +949,10 @@ class Exporter:
948
949
  "tf_keras", # required by 'onnx2tf' package
949
950
  "sng4onnx>=1.0.1", # required by 'onnx2tf' package
950
951
  "onnx_graphsurgeon>=0.3.26", # required by 'onnx2tf' package
951
- "ai-edge-litert>=1.2.0", # required by 'onnx2tf' package
952
+ "ai-edge-litert>=1.2.0,<1.4.0", # required by 'onnx2tf' package
952
953
  "onnx>=1.12.0,<1.18.0",
953
954
  "onnx2tf>=1.26.3",
954
- "onnxslim>=0.1.56",
955
+ "onnxslim>=0.1.59",
955
956
  "onnxruntime-gpu" if cuda else "onnxruntime",
956
957
  "protobuf>=5",
957
958
  ),
@@ -452,16 +452,16 @@ class BasePredictor:
452
452
  if self.args.show:
453
453
  self.show(str(p))
454
454
  if self.args.save:
455
- self.save_predicted_images(str(self.save_dir / p.name), frame)
455
+ self.save_predicted_images(self.save_dir / p.name, frame)
456
456
 
457
457
  return string
458
458
 
459
- def save_predicted_images(self, save_path: str = "", frame: int = 0):
459
+ def save_predicted_images(self, save_path: Path, frame: int = 0):
460
460
  """
461
461
  Save video predictions as mp4 or images as jpg at specified path.
462
462
 
463
463
  Args:
464
- save_path (str): Path to save the results.
464
+ save_path (Path): Path to save the results.
465
465
  frame (int): Frame number for video mode.
466
466
  """
467
467
  im = self.plotted_img
@@ -469,7 +469,7 @@ class BasePredictor:
469
469
  # Save videos and streams
470
470
  if self.dataset.mode in {"stream", "video"}:
471
471
  fps = self.dataset.fps if self.dataset.mode == "video" else 30
472
- frames_path = f"{save_path.split('.', 1)[0]}_frames/"
472
+ frames_path = self.save_dir / f"{save_path.stem}_frames" # save frames to a separate directory
473
473
  if save_path not in self.vid_writer: # new video
474
474
  if self.args.save_frames:
475
475
  Path(frames_path).mkdir(parents=True, exist_ok=True)
@@ -484,11 +484,11 @@ class BasePredictor:
484
484
  # Save video
485
485
  self.vid_writer[save_path].write(im)
486
486
  if self.args.save_frames:
487
- cv2.imwrite(f"{frames_path}{frame}.jpg", im)
487
+ cv2.imwrite(f"{frames_path}/{save_path.stem}_{frame}.jpg", im)
488
488
 
489
489
  # Save images
490
490
  else:
491
- cv2.imwrite(str(Path(save_path).with_suffix(".jpg")), im) # save to JPG for best support
491
+ cv2.imwrite(str(save_path.with_suffix(".jpg")), im) # save to JPG for best support
492
492
 
493
493
  def show(self, p: str = ""):
494
494
  """Display an image in a window."""
@@ -21,10 +21,10 @@ import time
21
21
  from typing import Dict, List, Optional
22
22
 
23
23
  import numpy as np
24
- import torch
25
24
 
26
25
  from ultralytics.cfg import get_cfg, get_save_dir
27
26
  from ultralytics.utils import DEFAULT_CFG, LOGGER, YAML, callbacks, colorstr, remove_colorstr
27
+ from ultralytics.utils.patches import torch_load
28
28
  from ultralytics.utils.plotting import plot_tune_results
29
29
 
30
30
 
@@ -198,7 +198,7 @@ class Tuner:
198
198
  cmd = [*launch, "train", *(f"{k}={v}" for k, v in train_args.items())]
199
199
  return_code = subprocess.run(cmd, check=True).returncode
200
200
  ckpt_file = weights_dir / ("best.pt" if (weights_dir / "best.pt").exists() else "last.pt")
201
- metrics = torch.load(ckpt_file)["train_metrics"]
201
+ metrics = torch_load(ckpt_file)["train_metrics"]
202
202
  assert return_code == 0, "training failed"
203
203
 
204
204
  except Exception as e:
@@ -8,6 +8,7 @@ import torch
8
8
  from ultralytics.engine.model import Model
9
9
  from ultralytics.utils import DEFAULT_CFG_DICT
10
10
  from ultralytics.utils.downloads import attempt_download_asset
11
+ from ultralytics.utils.patches import torch_load
11
12
  from ultralytics.utils.torch_utils import model_info
12
13
 
13
14
  from .predict import NASPredictor
@@ -56,7 +57,7 @@ class NAS(Model):
56
57
 
57
58
  suffix = Path(weights).suffix
58
59
  if suffix == ".pt":
59
- self.model = torch.load(attempt_download_asset(weights))
60
+ self.model = torch_load(attempt_download_asset(weights))
60
61
  elif suffix == "":
61
62
  self.model = super_gradients.training.models.get(weights, pretrained_weights="coco")
62
63
 
@@ -931,7 +931,7 @@ class TinyViT(nn.Module):
931
931
  if layer.downsample is not None:
932
932
  layer.downsample.apply(lambda x: _set_lr_scale(x, lr_scales[i - 1]))
933
933
  assert i == depth
934
- for m in [self.norm_head, self.head]:
934
+ for m in {self.norm_head, self.head}:
935
935
  m.apply(lambda x: _set_lr_scale(x, lr_scales[-1]))
936
936
 
937
937
  for k, p in self.named_parameters():
@@ -71,7 +71,7 @@ class DetectionValidator(BaseValidator):
71
71
  """
72
72
  batch["img"] = batch["img"].to(self.device, non_blocking=True)
73
73
  batch["img"] = (batch["img"].half() if self.args.half else batch["img"].float()) / 255
74
- for k in ["batch_idx", "cls", "bboxes"]:
74
+ for k in {"batch_idx", "cls", "bboxes"}:
75
75
  batch[k] = batch[k].to(self.device)
76
76
 
77
77
  return batch
@@ -153,7 +153,7 @@ class WorldTrainer(DetectionTrainer):
153
153
  cache_path = cache_dir / f"text_embeddings_{model.replace(':', '_').replace('/', '_')}.pt"
154
154
  if cache_path.exists():
155
155
  LOGGER.info(f"Reading existed cache from '{cache_path}'")
156
- txt_map = torch.load(cache_path)
156
+ txt_map = torch.load(cache_path, map_location=self.device)
157
157
  if sorted(txt_map.keys()) == sorted(texts):
158
158
  return txt_map
159
159
  LOGGER.info(f"Caching text embeddings to '{cache_path}'")
@@ -1,9 +1,11 @@
1
1
  # Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
2
2
 
3
+ from pathlib import Path
4
+
3
5
  from ultralytics.data import YOLOConcatDataset, build_grounding, build_yolo_dataset
4
6
  from ultralytics.data.utils import check_det_dataset
5
7
  from ultralytics.models.yolo.world import WorldTrainer
6
- from ultralytics.utils import DEFAULT_CFG, LOGGER
8
+ from ultralytics.utils import DATASETS_DIR, DEFAULT_CFG, LOGGER
7
9
  from ultralytics.utils.torch_utils import de_parallel
8
10
 
9
11
 
@@ -136,7 +138,7 @@ class WorldTrainerFromScratch(WorldTrainer):
136
138
  if d.get("minival") is None: # for lvis dataset
137
139
  continue
138
140
  d["minival"] = str(d["path"] / d["minival"])
139
- for s in ["train", "val"]:
141
+ for s in {"train", "val"}:
140
142
  final_data[s] = [d["train" if s == "train" else val_split] for d in data[s]]
141
143
  # save grounding data if there's one
142
144
  grounding_data = data_yaml[s].get("grounding_data")
@@ -145,8 +147,14 @@ class WorldTrainerFromScratch(WorldTrainer):
145
147
  grounding_data = grounding_data if isinstance(grounding_data, list) else [grounding_data]
146
148
  for g in grounding_data:
147
149
  assert isinstance(g, dict), f"Grounding data should be provided in dict format, but got {type(g)}"
150
+ for k in {"img_path", "json_file"}:
151
+ path = Path(g[k])
152
+ if not path.exists() and not path.is_absolute():
153
+ g[k] = str((DATASETS_DIR / g[k]).resolve()) # path relative to DATASETS_DIR
148
154
  final_data[s] += grounding_data
149
- data["val"] = data["val"][0] # assign the first val dataset as currently only one validation set is supported
155
+ # assign the first val dataset as currently only one validation set is supported
156
+ data["val"] = data["val"][0]
157
+ final_data["val"] = final_data["val"][0]
150
158
  # NOTE: to make training work properly, set `nc` and `names`
151
159
  final_data["nc"] = data["val"]["nc"]
152
160
  final_data["names"] = data["val"]["names"]
@@ -217,7 +217,7 @@ class YOLOETrainerFromScratch(YOLOETrainer, WorldTrainerFromScratch):
217
217
  cache_path = cache_dir / f"text_embeddings_{model.replace(':', '_').replace('/', '_')}.pt"
218
218
  if cache_path.exists():
219
219
  LOGGER.info(f"Reading existed cache from '{cache_path}'")
220
- txt_map = torch.load(cache_path)
220
+ txt_map = torch.load(cache_path, map_location=self.device)
221
221
  if sorted(txt_map.keys()) == sorted(texts):
222
222
  return txt_map
223
223
  LOGGER.info(f"Caching text embeddings to '{cache_path}'")
@@ -80,6 +80,7 @@ from ultralytics.utils.loss import (
80
80
  v8SegmentationLoss,
81
81
  )
82
82
  from ultralytics.utils.ops import make_divisible
83
+ from ultralytics.utils.patches import torch_load
83
84
  from ultralytics.utils.plotting import feature_visualization
84
85
  from ultralytics.utils.torch_utils import (
85
86
  fuse_conv_and_bn,
@@ -248,6 +249,8 @@ class BaseModel(torch.nn.Module):
248
249
  m.forward = m.forward_fuse
249
250
  if isinstance(m, v10Detect):
250
251
  m.fuse() # remove one2many head
252
+ if isinstance(m, YOLOEDetect) and hasattr(self, "pe"):
253
+ m.fuse(self.pe.to(next(self.model.parameters()).device))
251
254
  self.info(verbose=verbose)
252
255
 
253
256
  return self
@@ -1441,9 +1444,9 @@ def torch_safe_load(weight, safe_only=False):
1441
1444
  safe_pickle.Unpickler = SafeUnpickler
1442
1445
  safe_pickle.load = lambda file_obj: SafeUnpickler(file_obj).load()
1443
1446
  with open(file, "rb") as f:
1444
- ckpt = torch.load(f, pickle_module=safe_pickle)
1447
+ ckpt = torch_load(f, pickle_module=safe_pickle)
1445
1448
  else:
1446
- ckpt = torch.load(file, map_location="cpu")
1449
+ ckpt = torch_load(file, map_location="cpu")
1447
1450
 
1448
1451
  except ModuleNotFoundError as e: # e.name is missing module name
1449
1452
  if e.name == "models":
@@ -1469,7 +1472,7 @@ def torch_safe_load(weight, safe_only=False):
1469
1472
  f"run a command with an official Ultralytics model, i.e. 'yolo predict model=yolo11n.pt'"
1470
1473
  )
1471
1474
  check_requirements(e.name) # install missing module
1472
- ckpt = torch.load(file, map_location="cpu")
1475
+ ckpt = torch_load(file, map_location="cpu")
1473
1476
 
1474
1477
  if not isinstance(ckpt, dict):
1475
1478
  # File is likely a YOLO instance saved with i.e. torch.save(model, "saved_model.pt")
@@ -1,6 +1,6 @@
1
1
  # Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
2
2
 
3
- from typing import Any, List, Tuple
3
+ from typing import Any, Dict, List, Tuple
4
4
 
5
5
  import numpy as np
6
6
 
@@ -26,6 +26,7 @@ class RegionCounter(BaseSolution):
26
26
  Methods:
27
27
  add_region: Add a new counting region with specified attributes.
28
28
  process: Process video frames to count objects in each region.
29
+ initialize_regions: Initialize zones to count the objects in each one. Zones could be multiple as well.
29
30
 
30
31
  Examples:
31
32
  Initialize a RegionCounter and add a counting region
@@ -42,12 +43,12 @@ class RegionCounter(BaseSolution):
42
43
  "name": "Default Region",
43
44
  "polygon": None,
44
45
  "counts": 0,
45
- "dragging": False,
46
46
  "region_color": (255, 255, 255),
47
47
  "text_color": (0, 0, 0),
48
48
  }
49
49
  self.region_counts = {}
50
50
  self.counting_regions = []
51
+ self.initialize_regions()
51
52
 
52
53
  def add_region(
53
54
  self,
@@ -55,7 +56,7 @@ class RegionCounter(BaseSolution):
55
56
  polygon_points: List[Tuple],
56
57
  region_color: Tuple[int, int, int],
57
58
  text_color: Tuple[int, int, int],
58
- ) -> None:
59
+ ) -> Dict[str, Any]:
59
60
  """
60
61
  Add a new region to the counting list based on the provided template with specific attributes.
61
62
 
@@ -64,6 +65,9 @@ class RegionCounter(BaseSolution):
64
65
  polygon_points (List[Tuple]): List of (x, y) coordinates defining the region's polygon.
65
66
  region_color (Tuple[int, int, int]): BGR color for region visualization.
66
67
  text_color (Tuple[int, int, int]): BGR color for the text within the region.
68
+
69
+ Returns:
70
+ (Dict[str, any]): Returns a dictionary including the region information i.e. name, region_color etc.
67
71
  """
68
72
  region = self.region_template.copy()
69
73
  region.update(
@@ -75,6 +79,17 @@ class RegionCounter(BaseSolution):
75
79
  }
76
80
  )
77
81
  self.counting_regions.append(region)
82
+ return region
83
+
84
+ def initialize_regions(self):
85
+ """Initialize regions only once."""
86
+ if self.region is None:
87
+ self.initialize_region()
88
+ if not isinstance(self.region, dict): # Ensure self.region is initialized and structured as a dictionary
89
+ self.region = {"Region#01": self.region}
90
+ for i, (name, pts) in enumerate(self.region.items()):
91
+ region = self.add_region(name, pts, colors(i, True), (255, 255, 255))
92
+ region["prepared_polygon"] = self.prep(region["polygon"])
78
93
 
79
94
  def process(self, im0: np.ndarray) -> SolutionResults:
80
95
  """
@@ -90,39 +105,21 @@ class RegionCounter(BaseSolution):
90
105
  self.extract_tracks(im0)
91
106
  annotator = SolutionAnnotator(im0, line_width=self.line_width)
92
107
 
93
- # Ensure self.region is initialized and structured as a dictionary
94
- if not isinstance(self.region, dict):
95
- self.region = {"Region#01": self.region or self.initialize_region()}
96
-
97
- # Draw only valid regions
98
- for idx, (region_name, reg_pts) in enumerate(self.region.items(), start=1):
99
- color = colors(idx, True)
100
- annotator.draw_region(reg_pts, color, self.line_width * 2)
101
- self.add_region(region_name, reg_pts, color, annotator.get_txt_color())
102
-
103
- # Prepare regions for containment check (only process valid ones)
104
- for region in self.counting_regions:
105
- if "prepared_polygon" not in region:
106
- region["prepared_polygon"] = self.prep(region["polygon"])
107
-
108
- # Convert bounding boxes to NumPy array for center points
109
- boxes_np = np.array([((box[0] + box[2]) / 2, (box[1] + box[3]) / 2) for box in self.boxes], dtype=np.float32)
110
- points = [self.Point(pt) for pt in boxes_np] # Convert centers to Point objects
111
-
112
- # Process bounding boxes & check containment
113
- if points:
114
- for point, cls, track_id, box, conf in zip(points, self.clss, self.track_ids, self.boxes, self.confs):
115
- annotator.box_label(box, label=self.adjust_box_label(cls, conf, track_id), color=colors(track_id, True))
116
-
117
- for region in self.counting_regions:
118
- if region["prepared_polygon"].contains(point):
119
- region["counts"] += 1
120
- self.region_counts[region["name"]] = region["counts"]
108
+ for box, cls, track_id, conf in zip(self.boxes, self.clss, self.track_ids, self.confs):
109
+ annotator.box_label(box, label=self.adjust_box_label(cls, conf, track_id), color=colors(track_id, True))
110
+ center = self.Point(((box[0] + box[2]) / 2, (box[1] + box[3]) / 2))
111
+ for region in self.counting_regions:
112
+ if region["prepared_polygon"].contains(center):
113
+ region["counts"] += 1
114
+ self.region_counts[region["name"]] = region["counts"]
121
115
 
122
116
  # Display region counts
123
117
  for region in self.counting_regions:
118
+ x1, y1, x2, y2 = map(int, region["polygon"].bounds)
119
+ pts = [(x1, y1), (x2, y1), (x2, y2), (x1, y2)]
120
+ annotator.draw_region(pts, region["region_color"], self.line_width * 2)
124
121
  annotator.text_label(
125
- region["polygon"].bounds,
122
+ [x1, y1, x2, y2],
126
123
  label=str(region["counts"]),
127
124
  color=region["region_color"],
128
125
  txt_color=region["text_color"],
@@ -115,7 +115,7 @@ class BaseSolution:
115
115
  self.device = self.CFG["device"]
116
116
 
117
117
  self.track_add_args = { # Tracker additional arguments for advance configuration
118
- k: self.CFG[k] for k in ["iou", "conf", "device", "max_det", "half", "tracker"]
118
+ k: self.CFG[k] for k in {"iou", "conf", "device", "max_det", "half", "tracker"}
119
119
  } # verbose must be passed to track method; setting it False in YOLO still logs the track information.
120
120
 
121
121
  if is_cli and self.CFG["source"] is None:
@@ -25,7 +25,7 @@ import torch
25
25
  import tqdm
26
26
 
27
27
  from ultralytics import __version__
28
- from ultralytics.utils.patches import imread, imshow, imwrite, torch_load, torch_save # for patches
28
+ from ultralytics.utils.patches import imread, imshow, imwrite, torch_save # for patches
29
29
 
30
30
  # PyTorch Multi-GPU DDP Constants
31
31
  RANK = int(os.getenv("RANK", -1))
@@ -1593,7 +1593,6 @@ TESTS_RUNNING = is_pytest_running() or is_github_action_running()
1593
1593
  set_sentry()
1594
1594
 
1595
1595
  # Apply monkey patches
1596
- torch.load = torch_load
1597
1596
  torch.save = torch_save
1598
1597
  if WINDOWS:
1599
1598
  # Apply cv2 patches for non-ASCII and non-UTF characters in image paths
@@ -896,6 +896,27 @@ def is_rockchip():
896
896
  return False
897
897
 
898
898
 
899
+ def is_intel():
900
+ """
901
+ Check if the system has Intel hardware (CPU or GPU).
902
+
903
+ Returns:
904
+ (bool): True if Intel hardware is detected, False otherwise.
905
+ """
906
+ from ultralytics.utils.torch_utils import get_cpu_info
907
+
908
+ # Check CPU
909
+ if "intel" in get_cpu_info().lower():
910
+ return True
911
+
912
+ # Check GPU via xpu-smi
913
+ try:
914
+ result = subprocess.run(["xpu-smi", "discovery"], capture_output=True, text=True, timeout=5)
915
+ return "intel" in result.stdout.lower()
916
+ except (subprocess.TimeoutExpired, FileNotFoundError, subprocess.SubprocessError):
917
+ return False
918
+
919
+
899
920
  def is_sudo_available() -> bool:
900
921
  """
901
922
  Check if the sudo command is available in the environment.
@@ -488,7 +488,7 @@ class ConfusionMatrix(DataExportMixin):
488
488
  if ticklabels != "auto":
489
489
  ax.set_xticklabels(ticklabels, fontsize=tick_fontsize, rotation=90, ha="center")
490
490
  ax.set_yticklabels(ticklabels, fontsize=tick_fontsize)
491
- for s in ["left", "right", "bottom", "top", "outline"]:
491
+ for s in {"left", "right", "bottom", "top", "outline"}:
492
492
  if s != "outline":
493
493
  ax.spines[s].set_visible(False) # Confusion matrix plot don't have outline
494
494
  cbar.ax.spines[s].set_visible(False)
@@ -1006,6 +1006,7 @@ class DetMetrics(SimpleClass, DataExportMixin):
1006
1006
  save_dir=save_dir,
1007
1007
  names=self.names,
1008
1008
  on_plot=on_plot,
1009
+ prefix="Box",
1009
1010
  )[2:]
1010
1011
  self.box.nc = len(self.names)
1011
1012
  self.box.update(results)
@@ -1135,7 +1136,7 @@ class SegmentMetrics(DetMetrics):
1135
1136
  Returns:
1136
1137
  (Dict[str, np.ndarray]): Dictionary containing concatenated statistics arrays.
1137
1138
  """
1138
- stats = DetMetrics.process(self, on_plot=on_plot) # process box stats
1139
+ stats = DetMetrics.process(self, save_dir, plot, on_plot=on_plot) # process box stats
1139
1140
  results_mask = ap_per_class(
1140
1141
  stats["tp_m"],
1141
1142
  stats["conf"],
@@ -1270,7 +1271,7 @@ class PoseMetrics(DetMetrics):
1270
1271
  Returns:
1271
1272
  (Dict[str, np.ndarray]): Dictionary containing concatenated statistics arrays.
1272
1273
  """
1273
- stats = DetMetrics.process(self, on_plot=on_plot) # process box stats
1274
+ stats = DetMetrics.process(self, save_dir, plot, on_plot=on_plot) # process box stats
1274
1275
  results_pose = ap_per_class(
1275
1276
  stats["tp_p"],
1276
1277
  stats["conf"],
@@ -90,7 +90,6 @@ def imshow(winname: str, mat: np.ndarray) -> None:
90
90
 
91
91
 
92
92
  # PyTorch functions ----------------------------------------------------------------------------------------------------
93
- _torch_load = torch.load # copy to avoid recursion errors
94
93
  _torch_save = torch.save
95
94
 
96
95
 
@@ -116,7 +115,7 @@ def torch_load(*args, **kwargs):
116
115
  if TORCH_1_13 and "weights_only" not in kwargs:
117
116
  kwargs["weights_only"] = False
118
117
 
119
- return _torch_load(*args, **kwargs)
118
+ return torch.load(*args, **kwargs)
120
119
 
121
120
 
122
121
  def torch_save(*args, **kwargs):
@@ -610,8 +610,8 @@ def plot_labels(boxes, cls, names=(), save_dir=Path(""), on_plot=None):
610
610
  ax[3].hist2d(x["width"], x["height"], bins=50, cmap=subplot_3_4_color)
611
611
  ax[3].set_xlabel("width")
612
612
  ax[3].set_ylabel("height")
613
- for a in [0, 1, 2, 3]:
614
- for s in ["top", "right", "left", "bottom"]:
613
+ for a in {0, 1, 2, 3}:
614
+ for s in {"top", "right", "left", "bottom"}:
615
615
  ax[a].spines[s].set_visible(False)
616
616
 
617
617
  fname = save_dir / "labels.jpg"
@@ -30,6 +30,7 @@ from ultralytics.utils import (
30
30
  colorstr,
31
31
  )
32
32
  from ultralytics.utils.checks import check_version
33
+ from ultralytics.utils.patches import torch_load
33
34
 
34
35
  # Version checks (all default to version>=min_version)
35
36
  TORCH_1_9 = check_version(torch.__version__, "1.9.0")
@@ -724,7 +725,7 @@ def strip_optimizer(f: Union[str, Path] = "best.pt", s: str = "", updates: Dict[
724
725
  >>> strip_optimizer(f)
725
726
  """
726
727
  try:
727
- x = torch.load(f, map_location=torch.device("cpu"))
728
+ x = torch_load(f, map_location=torch.device("cpu"))
728
729
  assert isinstance(x, dict), "checkpoint is not a Python dictionary"
729
730
  assert "model" in x, "'model' missing from checkpoint"
730
731
  except Exception as e: