ultralytics 8.1.25__tar.gz → 8.1.27__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 (208) hide show
  1. {ultralytics-8.1.25/ultralytics.egg-info → ultralytics-8.1.27}/PKG-INFO +1 -1
  2. {ultralytics-8.1.25 → ultralytics-8.1.27}/tests/test_cli.py +2 -2
  3. {ultralytics-8.1.25 → ultralytics-8.1.27}/tests/test_integrations.py +28 -0
  4. {ultralytics-8.1.25 → ultralytics-8.1.27}/tests/test_python.py +2 -3
  5. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/__init__.py +1 -1
  6. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/__init__.py +1 -1
  7. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/data/base.py +3 -1
  8. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/data/build.py +7 -6
  9. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/data/loaders.py +75 -53
  10. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/engine/model.py +2 -1
  11. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/engine/predictor.py +96 -106
  12. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/engine/validator.py +1 -1
  13. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/rtdetr/model.py +0 -2
  14. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/rtdetr/predict.py +4 -1
  15. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/rtdetr/val.py +3 -0
  16. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/nn/autobackend.py +6 -2
  17. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/trackers/track.py +11 -5
  18. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/callbacks/mlflow.py +7 -1
  19. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/checks.py +1 -1
  20. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/files.py +41 -0
  21. {ultralytics-8.1.25 → ultralytics-8.1.27/ultralytics.egg-info}/PKG-INFO +1 -1
  22. {ultralytics-8.1.25 → ultralytics-8.1.27}/LICENSE +0 -0
  23. {ultralytics-8.1.25 → ultralytics-8.1.27}/README.md +0 -0
  24. {ultralytics-8.1.25 → ultralytics-8.1.27}/pyproject.toml +0 -0
  25. {ultralytics-8.1.25 → ultralytics-8.1.27}/setup.cfg +0 -0
  26. {ultralytics-8.1.25 → ultralytics-8.1.27}/tests/test_cuda.py +0 -0
  27. {ultralytics-8.1.25 → ultralytics-8.1.27}/tests/test_engine.py +0 -0
  28. {ultralytics-8.1.25 → ultralytics-8.1.27}/tests/test_explorer.py +0 -0
  29. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/assets/bus.jpg +0 -0
  30. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/assets/zidane.jpg +0 -0
  31. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
  32. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
  33. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
  34. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
  35. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
  36. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
  37. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
  38. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/datasets/VOC.yaml +0 -0
  39. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
  40. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
  41. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
  42. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/datasets/coco.yaml +0 -0
  43. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
  44. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/datasets/coco128.yaml +0 -0
  45. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
  46. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
  47. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/datasets/coco8.yaml +0 -0
  48. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
  49. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/datasets/dota8.yaml +0 -0
  50. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
  51. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
  52. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
  53. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/datasets/xView.yaml +0 -0
  54. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/default.yaml +0 -0
  55. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
  56. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
  57. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
  58. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
  59. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
  60. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
  61. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
  62. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
  63. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
  64. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
  65. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
  66. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
  67. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
  68. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
  69. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
  70. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
  71. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
  72. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
  73. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
  74. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
  75. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
  76. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
  77. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
  78. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
  79. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
  80. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
  81. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
  82. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
  83. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
  84. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/trackers/botsort.yaml +0 -0
  85. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
  86. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/data/__init__.py +0 -0
  87. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/data/annotator.py +0 -0
  88. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/data/augment.py +0 -0
  89. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/data/converter.py +0 -0
  90. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/data/dataset.py +0 -0
  91. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/data/explorer/__init__.py +0 -0
  92. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/data/explorer/explorer.py +0 -0
  93. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/data/explorer/gui/__init__.py +0 -0
  94. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/data/explorer/gui/dash.py +0 -0
  95. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/data/explorer/utils.py +0 -0
  96. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/data/split_dota.py +0 -0
  97. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/data/utils.py +0 -0
  98. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/engine/__init__.py +0 -0
  99. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/engine/exporter.py +0 -0
  100. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/engine/results.py +0 -0
  101. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/engine/trainer.py +0 -0
  102. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/engine/tuner.py +0 -0
  103. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/hub/__init__.py +0 -0
  104. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/hub/auth.py +0 -0
  105. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/hub/session.py +0 -0
  106. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/hub/utils.py +0 -0
  107. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/__init__.py +0 -0
  108. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/fastsam/__init__.py +0 -0
  109. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/fastsam/model.py +0 -0
  110. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/fastsam/predict.py +0 -0
  111. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/fastsam/prompt.py +0 -0
  112. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/fastsam/utils.py +0 -0
  113. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/fastsam/val.py +0 -0
  114. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/nas/__init__.py +0 -0
  115. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/nas/model.py +0 -0
  116. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/nas/predict.py +0 -0
  117. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/nas/val.py +0 -0
  118. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/rtdetr/__init__.py +0 -0
  119. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/rtdetr/train.py +0 -0
  120. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/sam/__init__.py +0 -0
  121. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/sam/amg.py +0 -0
  122. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/sam/build.py +0 -0
  123. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/sam/model.py +0 -0
  124. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/sam/modules/__init__.py +0 -0
  125. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/sam/modules/decoders.py +0 -0
  126. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/sam/modules/encoders.py +0 -0
  127. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/sam/modules/sam.py +0 -0
  128. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
  129. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/sam/modules/transformer.py +0 -0
  130. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/sam/predict.py +0 -0
  131. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/utils/__init__.py +0 -0
  132. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/utils/loss.py +0 -0
  133. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/utils/ops.py +0 -0
  134. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/yolo/__init__.py +0 -0
  135. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/yolo/classify/__init__.py +0 -0
  136. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/yolo/classify/predict.py +0 -0
  137. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/yolo/classify/train.py +0 -0
  138. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/yolo/classify/val.py +0 -0
  139. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/yolo/detect/__init__.py +0 -0
  140. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/yolo/detect/predict.py +0 -0
  141. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/yolo/detect/train.py +0 -0
  142. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/yolo/detect/val.py +0 -0
  143. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/yolo/model.py +0 -0
  144. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/yolo/obb/__init__.py +0 -0
  145. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/yolo/obb/predict.py +0 -0
  146. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/yolo/obb/train.py +0 -0
  147. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/yolo/obb/val.py +0 -0
  148. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/yolo/pose/__init__.py +0 -0
  149. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/yolo/pose/predict.py +0 -0
  150. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/yolo/pose/train.py +0 -0
  151. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/yolo/pose/val.py +0 -0
  152. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/yolo/segment/__init__.py +0 -0
  153. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/yolo/segment/predict.py +0 -0
  154. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/yolo/segment/train.py +0 -0
  155. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/models/yolo/segment/val.py +0 -0
  156. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/nn/__init__.py +0 -0
  157. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/nn/modules/__init__.py +0 -0
  158. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/nn/modules/block.py +0 -0
  159. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/nn/modules/conv.py +0 -0
  160. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/nn/modules/head.py +0 -0
  161. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/nn/modules/transformer.py +0 -0
  162. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/nn/modules/utils.py +0 -0
  163. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/nn/tasks.py +0 -0
  164. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/solutions/__init__.py +0 -0
  165. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/solutions/ai_gym.py +0 -0
  166. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/solutions/distance_calculation.py +0 -0
  167. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/solutions/heatmap.py +0 -0
  168. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/solutions/object_counter.py +0 -0
  169. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/solutions/speed_estimation.py +0 -0
  170. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/trackers/__init__.py +0 -0
  171. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/trackers/basetrack.py +0 -0
  172. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/trackers/bot_sort.py +0 -0
  173. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/trackers/byte_tracker.py +0 -0
  174. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/trackers/utils/__init__.py +0 -0
  175. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/trackers/utils/gmc.py +0 -0
  176. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/trackers/utils/kalman_filter.py +0 -0
  177. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/trackers/utils/matching.py +0 -0
  178. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/__init__.py +0 -0
  179. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/autobatch.py +0 -0
  180. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/benchmarks.py +0 -0
  181. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/callbacks/__init__.py +0 -0
  182. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/callbacks/base.py +0 -0
  183. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/callbacks/clearml.py +0 -0
  184. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/callbacks/comet.py +0 -0
  185. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/callbacks/dvc.py +0 -0
  186. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/callbacks/hub.py +0 -0
  187. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/callbacks/neptune.py +0 -0
  188. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/callbacks/raytune.py +0 -0
  189. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/callbacks/tensorboard.py +0 -0
  190. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/callbacks/wb.py +0 -0
  191. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/dist.py +0 -0
  192. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/downloads.py +0 -0
  193. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/errors.py +0 -0
  194. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/instance.py +0 -0
  195. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/loss.py +0 -0
  196. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/metrics.py +0 -0
  197. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/ops.py +0 -0
  198. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/patches.py +0 -0
  199. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/plotting.py +0 -0
  200. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/tal.py +0 -0
  201. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/torch_utils.py +0 -0
  202. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/triton.py +0 -0
  203. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics/utils/tuner.py +0 -0
  204. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics.egg-info/SOURCES.txt +0 -0
  205. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics.egg-info/dependency_links.txt +0 -0
  206. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics.egg-info/entry_points.txt +0 -0
  207. {ultralytics-8.1.25 → ultralytics-8.1.27}/ultralytics.egg-info/requires.txt +0 -0
  208. {ultralytics-8.1.25 → ultralytics-8.1.27}/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.1.25
3
+ Version: 8.1.27
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
@@ -65,8 +65,8 @@ def test_export(model, format):
65
65
  def test_rtdetr(task="detect", model="yolov8n-rtdetr.yaml", data="coco8.yaml"):
66
66
  """Test the RTDETR functionality with the Ultralytics framework."""
67
67
  # Warning: MUST use imgsz=640
68
- run(f"yolo train {task} model={model} data={data} --imgsz= 640 epochs =1, cache = disk") # add coma, spaces to args
69
- run(f"yolo predict {task} model={model} source={ASSETS / 'bus.jpg'} imgsz=640 save save_crop save_txt")
68
+ run(f"yolo train {task} model={model} data={data} --imgsz= 160 epochs =1, cache = disk") # add coma, spaces to args
69
+ run(f"yolo predict {task} model={model} source={ASSETS / 'bus.jpg'} imgsz=160 save save_crop save_txt")
70
70
 
71
71
 
72
72
  @pytest.mark.skipif(checks.IS_PYTHON_3_12, reason="MobileSAM Clip is not supported in Python 3.12")
@@ -29,6 +29,34 @@ def test_mlflow():
29
29
  SETTINGS["mlflow"] = True
30
30
  YOLO("yolov8n-cls.yaml").train(data="imagenet10", imgsz=32, epochs=3, plots=False, device="cpu")
31
31
 
32
+ @pytest.mark.skipif(not check_requirements('mlflow', install=False), reason='mlflow not installed')
33
+ def test_mlflow_keep_run_active():
34
+ import os
35
+ import mlflow
36
+ """Test training with MLflow tracking enabled."""
37
+ SETTINGS['mlflow'] = True
38
+ run_name = 'Test Run'
39
+ os.environ['MLFLOW_RUN'] = run_name
40
+
41
+ # Test with MLFLOW_KEEP_RUN_ACTIVE=True
42
+ os.environ['MLFLOW_KEEP_RUN_ACTIVE'] = 'True'
43
+ YOLO('yolov8n-cls.yaml').train(data='imagenet10', imgsz=32, epochs=1, plots=False, device='cpu')
44
+ status = mlflow.active_run().info.status
45
+ assert status == 'RUNNING', "MLflow run should be active when MLFLOW_KEEP_RUN_ACTIVE=True"
46
+
47
+ run_id = mlflow.active_run().info.run_id
48
+
49
+ # Test with MLFLOW_KEEP_RUN_ACTIVE=False
50
+ os.environ['MLFLOW_KEEP_RUN_ACTIVE'] = 'False'
51
+ YOLO('yolov8n-cls.yaml').train(data='imagenet10', imgsz=32, epochs=1, plots=False, device='cpu')
52
+ status = mlflow.get_run(run_id=run_id).info.status
53
+ assert status == 'FINISHED', "MLflow run should be ended when MLFLOW_KEEP_RUN_ACTIVE=False"
54
+
55
+ # Test with MLFLOW_KEEP_RUN_ACTIVE not set
56
+ os.environ.pop('MLFLOW_KEEP_RUN_ACTIVE', None)
57
+ YOLO('yolov8n-cls.yaml').train(data='imagenet10', imgsz=32, epochs=1, plots=False, device='cpu')
58
+ status = mlflow.get_run(run_id=run_id).info.status
59
+ assert status == 'FINISHED', "MLflow run should be ended by default when MLFLOW_KEEP_RUN_ACTIVE is not set"
32
60
 
33
61
  @pytest.mark.skipif(not check_requirements("tritonclient", install=False), reason="tritonclient[all] not installed")
34
62
  def test_triton():
@@ -8,6 +8,7 @@ import cv2
8
8
  import numpy as np
9
9
  import pytest
10
10
  import torch
11
+ import yaml
11
12
  from PIL import Image
12
13
  from torchvision.transforms import ToTensor
13
14
 
@@ -169,8 +170,6 @@ def test_track_stream():
169
170
 
170
171
  Note imgsz=160 required for tracking for higher confidence and better matches
171
172
  """
172
- import yaml
173
-
174
173
  video_url = "https://ultralytics.com/assets/decelera_portrait_min.mov"
175
174
  model = YOLO(MODEL)
176
175
  model.track(video_url, imgsz=160, tracker="bytetrack.yaml")
@@ -302,7 +301,7 @@ def test_predict_callback_and_setup():
302
301
 
303
302
  def on_predict_batch_end(predictor):
304
303
  """Callback function that handles operations at the end of a prediction batch."""
305
- path, im0s, _, _ = predictor.batch
304
+ path, im0s, _ = predictor.batch
306
305
  im0s = im0s if isinstance(im0s, list) else [im0s]
307
306
  bs = [predictor.dataset.bs for _ in range(len(path))]
308
307
  predictor.results = zip(predictor.results, im0s, bs) # results is List[batch_size]
@@ -1,6 +1,6 @@
1
1
  # Ultralytics YOLO 🚀, AGPL-3.0 license
2
2
 
3
- __version__ = "8.1.25"
3
+ __version__ = "8.1.27"
4
4
 
5
5
  from ultralytics.data.explorer.explorer import Explorer
6
6
  from ultralytics.models import RTDETR, SAM, YOLO, YOLOWorld
@@ -396,7 +396,7 @@ def handle_yolo_settings(args: List[str]) -> None:
396
396
  def handle_explorer():
397
397
  """Open the Ultralytics Explorer GUI."""
398
398
  checks.check_requirements("streamlit")
399
- LOGGER.info(f"💡 Loading Explorer dashboard...")
399
+ LOGGER.info("💡 Loading Explorer dashboard...")
400
400
  subprocess.run(["streamlit", "run", ROOT / "data/explorer/gui/dash.py", "--server.maxMessageSize", "2048"])
401
401
 
402
402
 
@@ -120,7 +120,9 @@ class BaseDataset(Dataset):
120
120
  except Exception as e:
121
121
  raise FileNotFoundError(f"{self.prefix}Error loading data from {img_path}\n{HELP_URL}") from e
122
122
  if self.fraction < 1:
123
- im_files = im_files[: round(len(im_files) * self.fraction)]
123
+ # im_files = im_files[: round(len(im_files) * self.fraction)]
124
+ num_elements_to_select = round(len(im_files) * self.fraction)
125
+ im_files = random.sample(im_files, num_elements_to_select)
124
126
  return im_files
125
127
 
126
128
  def update_labels(self, include_class: Optional[list]):
@@ -11,7 +11,7 @@ from torch.utils.data import dataloader, distributed
11
11
 
12
12
  from ultralytics.data.loaders import (
13
13
  LOADERS,
14
- LoadImages,
14
+ LoadImagesAndVideos,
15
15
  LoadPilAndNumpy,
16
16
  LoadScreenshots,
17
17
  LoadStreams,
@@ -150,34 +150,35 @@ def check_source(source):
150
150
  return source, webcam, screenshot, from_img, in_memory, tensor
151
151
 
152
152
 
153
- def load_inference_source(source=None, vid_stride=1, buffer=False):
153
+ def load_inference_source(source=None, batch=1, vid_stride=1, buffer=False):
154
154
  """
155
155
  Loads an inference source for object detection and applies necessary transformations.
156
156
 
157
157
  Args:
158
158
  source (str, Path, Tensor, PIL.Image, np.ndarray): The input source for inference.
159
+ batch (int, optional): Batch size for dataloaders. Default is 1.
159
160
  vid_stride (int, optional): The frame interval for video sources. Default is 1.
160
161
  buffer (bool, optional): Determined whether stream frames will be buffered. Default is False.
161
162
 
162
163
  Returns:
163
164
  dataset (Dataset): A dataset object for the specified input source.
164
165
  """
165
- source, webcam, screenshot, from_img, in_memory, tensor = check_source(source)
166
- source_type = source.source_type if in_memory else SourceTypes(webcam, screenshot, from_img, tensor)
166
+ source, stream, screenshot, from_img, in_memory, tensor = check_source(source)
167
+ source_type = source.source_type if in_memory else SourceTypes(stream, screenshot, from_img, tensor)
167
168
 
168
169
  # Dataloader
169
170
  if tensor:
170
171
  dataset = LoadTensor(source)
171
172
  elif in_memory:
172
173
  dataset = source
173
- elif webcam:
174
+ elif stream:
174
175
  dataset = LoadStreams(source, vid_stride=vid_stride, buffer=buffer)
175
176
  elif screenshot:
176
177
  dataset = LoadScreenshots(source)
177
178
  elif from_img:
178
179
  dataset = LoadPilAndNumpy(source)
179
180
  else:
180
- dataset = LoadImages(source, vid_stride=vid_stride)
181
+ dataset = LoadImagesAndVideos(source, batch=batch, vid_stride=vid_stride)
181
182
 
182
183
  # Attach source types to the dataset
183
184
  setattr(dataset, "source_type", source_type)
@@ -24,7 +24,7 @@ from ultralytics.utils.checks import check_requirements
24
24
  class SourceTypes:
25
25
  """Class to represent various types of input sources for predictions."""
26
26
 
27
- webcam: bool = False
27
+ stream: bool = False
28
28
  screenshot: bool = False
29
29
  from_img: bool = False
30
30
  tensor: bool = False
@@ -32,9 +32,7 @@ class SourceTypes:
32
32
 
33
33
  class LoadStreams:
34
34
  """
35
- Stream Loader for various types of video streams.
36
-
37
- Suitable for use with `yolo predict source='rtsp://example.com/media.mp4'`, supports RTSP, RTMP, HTTP, and TCP streams.
35
+ Stream Loader for various types of video streams, Supports RTSP, RTMP, HTTP, and TCP streams.
38
36
 
39
37
  Attributes:
40
38
  sources (str): The source input paths or URLs for the video streams.
@@ -57,6 +55,11 @@ class LoadStreams:
57
55
  __iter__: Returns an iterator object for the class.
58
56
  __next__: Returns source paths, transformed, and original images for processing.
59
57
  __len__: Return the length of the sources object.
58
+
59
+ Example:
60
+ ```bash
61
+ yolo predict source='rtsp://example.com/media.mp4'
62
+ ```
60
63
  """
61
64
 
62
65
  def __init__(self, sources="file.streams", vid_stride=1, buffer=False):
@@ -69,6 +72,7 @@ class LoadStreams:
69
72
 
70
73
  sources = Path(sources).read_text().rsplit() if os.path.isfile(sources) else [sources]
71
74
  n = len(sources)
75
+ self.bs = n
72
76
  self.fps = [0] * n # frames per second
73
77
  self.frames = [0] * n
74
78
  self.threads = [None] * n
@@ -109,9 +113,6 @@ class LoadStreams:
109
113
  self.threads[i].start()
110
114
  LOGGER.info("") # newline
111
115
 
112
- # Check for common shapes
113
- self.bs = self.__len__()
114
-
115
116
  def update(self, i, cap, stream):
116
117
  """Read stream `i` frames in daemon thread."""
117
118
  n, f = 0, self.frames[i] # frame number, frame array
@@ -175,11 +176,11 @@ class LoadStreams:
175
176
  images.append(x.pop(-1) if x else np.zeros(self.shape[i], dtype=np.uint8))
176
177
  x.clear()
177
178
 
178
- return self.sources, images, None, ""
179
+ return self.sources, images, [""] * self.bs
179
180
 
180
181
  def __len__(self):
181
182
  """Return the length of the sources object."""
182
- return len(self.sources) # 1E12 frames = 32 streams at 30 FPS for 30 years
183
+ return self.bs # 1E12 frames = 32 streams at 30 FPS for 30 years
183
184
 
184
185
 
185
186
  class LoadScreenshots:
@@ -224,6 +225,7 @@ class LoadScreenshots:
224
225
  self.frame = 0
225
226
  self.sct = mss.mss()
226
227
  self.bs = 1
228
+ self.fps = 30
227
229
 
228
230
  # Parse monitor shape
229
231
  monitor = self.sct.monitors[self.screen]
@@ -243,10 +245,10 @@ class LoadScreenshots:
243
245
  s = f"screen {self.screen} (LTWH): {self.left},{self.top},{self.width},{self.height}: "
244
246
 
245
247
  self.frame += 1
246
- return [str(self.screen)], [im0], None, s # screen, img, vid_cap, string
248
+ return [str(self.screen)], [im0], [s] # screen, img, string
247
249
 
248
250
 
249
- class LoadImages:
251
+ class LoadImagesAndVideos:
250
252
  """
251
253
  YOLOv8 image/video dataloader.
252
254
 
@@ -269,7 +271,7 @@ class LoadImages:
269
271
  _new_video(path): Create a new cv2.VideoCapture object for a given video path.
270
272
  """
271
273
 
272
- def __init__(self, path, vid_stride=1):
274
+ def __init__(self, path, batch=1, vid_stride=1):
273
275
  """Initialize the Dataloader and raise FileNotFoundError if file not found."""
274
276
  parent = None
275
277
  if isinstance(path, str) and Path(path).suffix == ".txt": # *.txt file with img/vid/dir on each line
@@ -295,10 +297,11 @@ class LoadImages:
295
297
 
296
298
  self.files = images + videos
297
299
  self.nf = ni + nv # number of files
300
+ self.ni = ni # number of images
298
301
  self.video_flag = [False] * ni + [True] * nv
299
302
  self.mode = "image"
300
303
  self.vid_stride = vid_stride # video frame-rate stride
301
- self.bs = 1
304
+ self.bs = batch
302
305
  if any(videos):
303
306
  self._new_video(videos[0]) # new video
304
307
  else:
@@ -315,49 +318,69 @@ class LoadImages:
315
318
  return self
316
319
 
317
320
  def __next__(self):
318
- """Return next image, path and metadata from dataset."""
319
- if self.count == self.nf:
320
- raise StopIteration
321
- path = self.files[self.count]
322
-
323
- if self.video_flag[self.count]:
324
- # Read video
325
- self.mode = "video"
326
- for _ in range(self.vid_stride):
327
- self.cap.grab()
328
- success, im0 = self.cap.retrieve()
329
- while not success:
330
- self.count += 1
331
- self.cap.release()
332
- if self.count == self.nf: # last video
321
+ """Returns the next batch of images or video frames along with their paths and metadata."""
322
+ paths, imgs, info = [], [], []
323
+ while len(imgs) < self.bs:
324
+ if self.count >= self.nf: # end of file list
325
+ if len(imgs) > 0:
326
+ return paths, imgs, info # return last partial batch
327
+ else:
333
328
  raise StopIteration
334
- path = self.files[self.count]
335
- self._new_video(path)
336
- success, im0 = self.cap.read()
337
-
338
- self.frame += 1
339
- # im0 = self._cv2_rotate(im0) # for use if cv2 autorotation is False
340
- s = f"video {self.count + 1}/{self.nf} ({self.frame}/{self.frames}) {path}: "
341
329
 
342
- else:
343
- # Read image
344
- self.count += 1
345
- im0 = cv2.imread(path) # BGR
346
- if im0 is None:
347
- raise FileNotFoundError(f"Image Not Found {path}")
348
- s = f"image {self.count}/{self.nf} {path}: "
330
+ path = self.files[self.count]
331
+ if self.video_flag[self.count]:
332
+ self.mode = "video"
333
+ if not self.cap or not self.cap.isOpened():
334
+ self._new_video(path)
349
335
 
350
- return [path], [im0], self.cap, s
336
+ for _ in range(self.vid_stride):
337
+ success = self.cap.grab()
338
+ if not success:
339
+ break # end of video or failure
340
+
341
+ if success:
342
+ success, im0 = self.cap.retrieve()
343
+ if success:
344
+ self.frame += 1
345
+ paths.append(path)
346
+ imgs.append(im0)
347
+ info.append(f"video {self.count + 1}/{self.nf} (frame {self.frame}/{self.frames}) {path}: ")
348
+ if self.frame == self.frames: # end of video
349
+ self.count += 1
350
+ self.cap.release()
351
+ else:
352
+ # Move to the next file if the current video ended or failed to open
353
+ self.count += 1
354
+ if self.cap:
355
+ self.cap.release()
356
+ if self.count < self.nf:
357
+ self._new_video(self.files[self.count])
358
+ else:
359
+ self.mode = "image"
360
+ im0 = cv2.imread(path) # BGR
361
+ if im0 is None:
362
+ raise FileNotFoundError(f"Image Not Found {path}")
363
+ paths.append(path)
364
+ imgs.append(im0)
365
+ info.append(f"image {self.count + 1}/{self.nf} {path}: ")
366
+ self.count += 1 # move to the next file
367
+ if self.count >= self.ni: # end of image list
368
+ break
369
+
370
+ return paths, imgs, info
351
371
 
352
372
  def _new_video(self, path):
353
- """Create a new video capture object."""
373
+ """Creates a new video capture object for the given path."""
354
374
  self.frame = 0
355
375
  self.cap = cv2.VideoCapture(path)
376
+ self.fps = int(self.cap.get(cv2.CAP_PROP_FPS))
377
+ if not self.cap.isOpened():
378
+ raise FileNotFoundError(f"Failed to open video {path}")
356
379
  self.frames = int(self.cap.get(cv2.CAP_PROP_FRAME_COUNT) / self.vid_stride)
357
380
 
358
381
  def __len__(self):
359
- """Returns the number of files in the object."""
360
- return self.nf # number of files
382
+ """Returns the number of batches in the object."""
383
+ return math.ceil(self.nf / self.bs) # number of files
361
384
 
362
385
 
363
386
  class LoadPilAndNumpy:
@@ -373,7 +396,6 @@ class LoadPilAndNumpy:
373
396
  im0 (list): List of images stored as Numpy arrays.
374
397
  mode (str): Type of data being processed, defaults to 'image'.
375
398
  bs (int): Batch size, equivalent to the length of `im0`.
376
- count (int): Counter for iteration, initialized at 0 during `__iter__()`.
377
399
 
378
400
  Methods:
379
401
  _single_check(im): Validate and format a single image to a Numpy array.
@@ -386,7 +408,6 @@ class LoadPilAndNumpy:
386
408
  self.paths = [getattr(im, "filename", f"image{i}.jpg") for i, im in enumerate(im0)]
387
409
  self.im0 = [self._single_check(im) for im in im0]
388
410
  self.mode = "image"
389
- # Generate fake paths
390
411
  self.bs = len(self.im0)
391
412
 
392
413
  @staticmethod
@@ -409,7 +430,7 @@ class LoadPilAndNumpy:
409
430
  if self.count == 1: # loop only once as it's batch inference
410
431
  raise StopIteration
411
432
  self.count += 1
412
- return self.paths, self.im0, None, ""
433
+ return self.paths, self.im0, [""] * self.bs
413
434
 
414
435
  def __iter__(self):
415
436
  """Enables iteration for class LoadPilAndNumpy."""
@@ -474,7 +495,7 @@ class LoadTensor:
474
495
  if self.count == 1:
475
496
  raise StopIteration
476
497
  self.count += 1
477
- return self.paths, self.im0, None, ""
498
+ return self.paths, self.im0, [""] * self.bs
478
499
 
479
500
  def __len__(self):
480
501
  """Returns the batch size."""
@@ -498,9 +519,6 @@ def autocast_list(source):
498
519
  return files
499
520
 
500
521
 
501
- LOADERS = LoadStreams, LoadPilAndNumpy, LoadImages, LoadScreenshots # tuple
502
-
503
-
504
522
  def get_best_youtube_url(url, use_pafy=True):
505
523
  """
506
524
  Retrieves the URL of the best quality MP4 video stream from a given YouTube video.
@@ -531,3 +549,7 @@ def get_best_youtube_url(url, use_pafy=True):
531
549
  good_size = (f.get("width") or 0) >= 1920 or (f.get("height") or 0) >= 1080
532
550
  if good_size and f["vcodec"] != "none" and f["acodec"] == "none" and f["ext"] == "mp4":
533
551
  return f.get("url")
552
+
553
+
554
+ # Define constants
555
+ LOADERS = (LoadStreams, LoadPilAndNumpy, LoadImagesAndVideos, LoadScreenshots)
@@ -423,7 +423,7 @@ class Model(nn.Module):
423
423
  x in sys.argv for x in ("predict", "track", "mode=predict", "mode=track")
424
424
  )
425
425
 
426
- custom = {"conf": 0.25, "save": is_cli, "mode": "predict"} # method defaults
426
+ custom = {"conf": 0.25, "batch": 1, "save": is_cli, "mode": "predict"} # method defaults
427
427
  args = {**self.overrides, **custom, **kwargs} # highest priority args on the right
428
428
  prompts = args.pop("prompts", None) # for SAM-type models
429
429
 
@@ -474,6 +474,7 @@ class Model(nn.Module):
474
474
 
475
475
  register_tracker(self, persist)
476
476
  kwargs["conf"] = kwargs.get("conf") or 0.1 # ByteTrack-based method needs low confidence predictions as input
477
+ kwargs["batch"] = kwargs.get("batch") or 1 # batch-size 1 for tracking in videos
477
478
  kwargs["mode"] = "track"
478
479
  return self.predict(source=source, stream=stream, **kwargs)
479
480