ultralytics-opencv-headless 8.3.250__tar.gz → 8.3.251__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 (304) hide show
  1. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/PKG-INFO +1 -1
  2. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/__init__.py +1 -1
  3. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/__init__.py +3 -3
  4. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/TT100K.yaml +67 -77
  5. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/engine/model.py +4 -3
  6. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/engine/trainer.py +21 -22
  7. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/engine/tuner.py +1 -0
  8. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/benchmarks.py +1 -1
  9. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/callbacks/platform.py +65 -57
  10. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/checks.py +11 -4
  11. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/plotting.py +3 -0
  12. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/tuner.py +0 -3
  13. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics_opencv_headless.egg-info/PKG-INFO +1 -1
  14. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/LICENSE +0 -0
  15. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/README.md +0 -0
  16. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/pyproject.toml +0 -0
  17. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/setup.cfg +0 -0
  18. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/tests/__init__.py +0 -0
  19. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/tests/conftest.py +0 -0
  20. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/tests/test_cli.py +0 -0
  21. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/tests/test_cuda.py +0 -0
  22. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/tests/test_engine.py +0 -0
  23. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/tests/test_exports.py +0 -0
  24. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/tests/test_integrations.py +0 -0
  25. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/tests/test_python.py +0 -0
  26. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/tests/test_solutions.py +0 -0
  27. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/assets/bus.jpg +0 -0
  28. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/assets/zidane.jpg +0 -0
  29. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
  30. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
  31. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
  32. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
  33. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/HomeObjects-3K.yaml +0 -0
  34. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
  35. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
  36. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
  37. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/VOC.yaml +0 -0
  38. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
  39. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
  40. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
  41. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
  42. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
  43. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/coco.yaml +0 -0
  44. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
  45. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/coco128.yaml +0 -0
  46. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/coco8-grayscale.yaml +0 -0
  47. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/coco8-multispectral.yaml +0 -0
  48. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
  49. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
  50. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/coco8.yaml +0 -0
  51. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/construction-ppe.yaml +0 -0
  52. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
  53. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/dog-pose.yaml +0 -0
  54. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/dota8-multispectral.yaml +0 -0
  55. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/dota8.yaml +0 -0
  56. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/hand-keypoints.yaml +0 -0
  57. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/kitti.yaml +0 -0
  58. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/lvis.yaml +0 -0
  59. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/medical-pills.yaml +0 -0
  60. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
  61. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
  62. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/signature.yaml +0 -0
  63. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
  64. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/datasets/xView.yaml +0 -0
  65. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/default.yaml +0 -0
  66. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/11/yolo11-cls-resnet18.yaml +0 -0
  67. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/11/yolo11-cls.yaml +0 -0
  68. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/11/yolo11-obb.yaml +0 -0
  69. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/11/yolo11-pose.yaml +0 -0
  70. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/11/yolo11-seg.yaml +0 -0
  71. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/11/yolo11.yaml +0 -0
  72. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/11/yoloe-11-seg.yaml +0 -0
  73. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/11/yoloe-11.yaml +0 -0
  74. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/12/yolo12-cls.yaml +0 -0
  75. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/12/yolo12-obb.yaml +0 -0
  76. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/12/yolo12-pose.yaml +0 -0
  77. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/12/yolo12-seg.yaml +0 -0
  78. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/12/yolo12.yaml +0 -0
  79. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
  80. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
  81. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
  82. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
  83. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v10/yolov10b.yaml +0 -0
  84. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v10/yolov10l.yaml +0 -0
  85. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v10/yolov10m.yaml +0 -0
  86. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v10/yolov10n.yaml +0 -0
  87. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v10/yolov10s.yaml +0 -0
  88. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v10/yolov10x.yaml +0 -0
  89. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
  90. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
  91. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
  92. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
  93. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
  94. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
  95. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v8/yoloe-v8-seg.yaml +0 -0
  96. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v8/yoloe-v8.yaml +0 -0
  97. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
  98. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
  99. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
  100. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
  101. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
  102. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
  103. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
  104. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
  105. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
  106. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
  107. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
  108. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
  109. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
  110. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
  111. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
  112. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
  113. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
  114. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
  115. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
  116. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
  117. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
  118. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v9/yolov9m.yaml +0 -0
  119. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v9/yolov9s.yaml +0 -0
  120. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/models/v9/yolov9t.yaml +0 -0
  121. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/trackers/botsort.yaml +0 -0
  122. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
  123. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/data/__init__.py +0 -0
  124. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/data/annotator.py +0 -0
  125. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/data/augment.py +0 -0
  126. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/data/base.py +0 -0
  127. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/data/build.py +0 -0
  128. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/data/converter.py +0 -0
  129. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/data/dataset.py +0 -0
  130. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/data/loaders.py +0 -0
  131. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/data/scripts/download_weights.sh +0 -0
  132. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/data/scripts/get_coco.sh +0 -0
  133. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/data/scripts/get_coco128.sh +0 -0
  134. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/data/scripts/get_imagenet.sh +0 -0
  135. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/data/split.py +0 -0
  136. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/data/split_dota.py +0 -0
  137. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/data/utils.py +0 -0
  138. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/engine/__init__.py +0 -0
  139. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/engine/exporter.py +0 -0
  140. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/engine/predictor.py +0 -0
  141. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/engine/results.py +0 -0
  142. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/engine/validator.py +0 -0
  143. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/hub/__init__.py +0 -0
  144. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/hub/auth.py +0 -0
  145. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/hub/google/__init__.py +0 -0
  146. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/hub/session.py +0 -0
  147. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/hub/utils.py +0 -0
  148. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/__init__.py +0 -0
  149. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/fastsam/__init__.py +0 -0
  150. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/fastsam/model.py +0 -0
  151. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/fastsam/predict.py +0 -0
  152. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/fastsam/utils.py +0 -0
  153. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/fastsam/val.py +0 -0
  154. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/nas/__init__.py +0 -0
  155. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/nas/model.py +0 -0
  156. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/nas/predict.py +0 -0
  157. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/nas/val.py +0 -0
  158. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/rtdetr/__init__.py +0 -0
  159. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/rtdetr/model.py +0 -0
  160. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/rtdetr/predict.py +0 -0
  161. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/rtdetr/train.py +0 -0
  162. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/rtdetr/val.py +0 -0
  163. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/__init__.py +0 -0
  164. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/amg.py +0 -0
  165. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/build.py +0 -0
  166. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/build_sam3.py +0 -0
  167. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/model.py +0 -0
  168. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/modules/__init__.py +0 -0
  169. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/modules/blocks.py +0 -0
  170. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/modules/decoders.py +0 -0
  171. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/modules/encoders.py +0 -0
  172. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/modules/memory_attention.py +0 -0
  173. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/modules/sam.py +0 -0
  174. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
  175. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/modules/transformer.py +0 -0
  176. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/modules/utils.py +0 -0
  177. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/predict.py +0 -0
  178. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/sam3/__init__.py +0 -0
  179. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/sam3/decoder.py +0 -0
  180. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/sam3/encoder.py +0 -0
  181. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/sam3/geometry_encoders.py +0 -0
  182. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/sam3/maskformer_segmentation.py +0 -0
  183. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/sam3/model_misc.py +0 -0
  184. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/sam3/necks.py +0 -0
  185. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/sam3/sam3_image.py +0 -0
  186. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/sam3/text_encoder_ve.py +0 -0
  187. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/sam3/vitdet.py +0 -0
  188. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/sam/sam3/vl_combiner.py +0 -0
  189. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/utils/__init__.py +0 -0
  190. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/utils/loss.py +0 -0
  191. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/utils/ops.py +0 -0
  192. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/__init__.py +0 -0
  193. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/classify/__init__.py +0 -0
  194. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/classify/predict.py +0 -0
  195. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/classify/train.py +0 -0
  196. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/classify/val.py +0 -0
  197. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/detect/__init__.py +0 -0
  198. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/detect/predict.py +0 -0
  199. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/detect/train.py +0 -0
  200. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/detect/val.py +0 -0
  201. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/model.py +0 -0
  202. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/obb/__init__.py +0 -0
  203. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/obb/predict.py +0 -0
  204. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/obb/train.py +0 -0
  205. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/obb/val.py +0 -0
  206. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/pose/__init__.py +0 -0
  207. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/pose/predict.py +0 -0
  208. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/pose/train.py +0 -0
  209. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/pose/val.py +0 -0
  210. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/segment/__init__.py +0 -0
  211. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/segment/predict.py +0 -0
  212. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/segment/train.py +0 -0
  213. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/segment/val.py +0 -0
  214. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/world/__init__.py +0 -0
  215. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/world/train.py +0 -0
  216. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/world/train_world.py +0 -0
  217. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/yoloe/__init__.py +0 -0
  218. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/yoloe/predict.py +0 -0
  219. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/yoloe/train.py +0 -0
  220. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/yoloe/train_seg.py +0 -0
  221. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/models/yolo/yoloe/val.py +0 -0
  222. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/nn/__init__.py +0 -0
  223. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/nn/autobackend.py +0 -0
  224. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/nn/modules/__init__.py +0 -0
  225. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/nn/modules/activation.py +0 -0
  226. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/nn/modules/block.py +0 -0
  227. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/nn/modules/conv.py +0 -0
  228. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/nn/modules/head.py +0 -0
  229. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/nn/modules/transformer.py +0 -0
  230. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/nn/modules/utils.py +0 -0
  231. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/nn/tasks.py +0 -0
  232. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/nn/text_model.py +0 -0
  233. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/py.typed +0 -0
  234. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/solutions/__init__.py +0 -0
  235. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/solutions/ai_gym.py +0 -0
  236. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/solutions/analytics.py +0 -0
  237. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/solutions/config.py +0 -0
  238. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/solutions/distance_calculation.py +0 -0
  239. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/solutions/heatmap.py +0 -0
  240. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/solutions/instance_segmentation.py +0 -0
  241. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/solutions/object_blurrer.py +0 -0
  242. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/solutions/object_counter.py +0 -0
  243. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/solutions/object_cropper.py +0 -0
  244. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/solutions/parking_management.py +0 -0
  245. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/solutions/queue_management.py +0 -0
  246. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/solutions/region_counter.py +0 -0
  247. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/solutions/security_alarm.py +0 -0
  248. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/solutions/similarity_search.py +0 -0
  249. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/solutions/solutions.py +0 -0
  250. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/solutions/speed_estimation.py +0 -0
  251. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/solutions/streamlit_inference.py +0 -0
  252. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/solutions/templates/similarity-search.html +0 -0
  253. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/solutions/trackzone.py +0 -0
  254. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/solutions/vision_eye.py +0 -0
  255. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/trackers/__init__.py +0 -0
  256. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/trackers/basetrack.py +0 -0
  257. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/trackers/bot_sort.py +0 -0
  258. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/trackers/byte_tracker.py +0 -0
  259. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/trackers/track.py +0 -0
  260. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/trackers/utils/__init__.py +0 -0
  261. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/trackers/utils/gmc.py +0 -0
  262. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/trackers/utils/kalman_filter.py +0 -0
  263. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/trackers/utils/matching.py +0 -0
  264. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/__init__.py +0 -0
  265. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/autobatch.py +0 -0
  266. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/autodevice.py +0 -0
  267. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/callbacks/__init__.py +0 -0
  268. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/callbacks/base.py +0 -0
  269. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/callbacks/clearml.py +0 -0
  270. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/callbacks/comet.py +0 -0
  271. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/callbacks/dvc.py +0 -0
  272. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/callbacks/hub.py +0 -0
  273. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/callbacks/mlflow.py +0 -0
  274. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/callbacks/neptune.py +0 -0
  275. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/callbacks/raytune.py +0 -0
  276. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/callbacks/tensorboard.py +0 -0
  277. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/callbacks/wb.py +0 -0
  278. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/cpu.py +0 -0
  279. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/dist.py +0 -0
  280. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/downloads.py +0 -0
  281. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/errors.py +0 -0
  282. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/events.py +0 -0
  283. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/export/__init__.py +0 -0
  284. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/export/engine.py +0 -0
  285. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/export/imx.py +0 -0
  286. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/export/tensorflow.py +0 -0
  287. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/files.py +0 -0
  288. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/git.py +0 -0
  289. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/instance.py +0 -0
  290. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/logger.py +0 -0
  291. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/loss.py +0 -0
  292. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/metrics.py +0 -0
  293. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/nms.py +0 -0
  294. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/ops.py +0 -0
  295. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/patches.py +0 -0
  296. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/tal.py +0 -0
  297. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/torch_utils.py +0 -0
  298. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/tqdm.py +0 -0
  299. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics/utils/triton.py +0 -0
  300. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics_opencv_headless.egg-info/SOURCES.txt +0 -0
  301. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics_opencv_headless.egg-info/dependency_links.txt +0 -0
  302. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics_opencv_headless.egg-info/entry_points.txt +0 -0
  303. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics_opencv_headless.egg-info/requires.txt +0 -0
  304. {ultralytics_opencv_headless-8.3.250 → ultralytics_opencv_headless-8.3.251}/ultralytics_opencv_headless.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ultralytics-opencv-headless
3
- Version: 8.3.250
3
+ Version: 8.3.251
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>
@@ -1,6 +1,6 @@
1
1
  # Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
2
2
 
3
- __version__ = "8.3.250"
3
+ __version__ = "8.3.251"
4
4
 
5
5
  import importlib
6
6
  import os
@@ -414,7 +414,7 @@ def get_save_dir(args: SimpleNamespace, name: str | None = None) -> Path:
414
414
  nested = args.project and len(Path(args.project).parts) > 1 # e.g. "user/project" or "org\repo"
415
415
  project = runs / args.project if nested else args.project or runs
416
416
  name = name or args.name or f"{args.mode}"
417
- save_dir = increment_path(Path(project) / name, exist_ok=args.exist_ok if RANK in {-1, 0} else True)
417
+ save_dir = increment_path(Path(project) / name, exist_ok=args.exist_ok if RANK in {-1, 0} else True, mkdir=True)
418
418
 
419
419
  return Path(save_dir).resolve() # resolve to display full path in console
420
420
 
@@ -727,8 +727,8 @@ def handle_yolo_solutions(args: list[str]) -> None:
727
727
  )
728
728
  if solution_name == "analytics": # analytical graphs follow fixed shape for output i.e w=1920, h=1080
729
729
  w, h = 1280, 720
730
- save_dir = get_save_dir(SimpleNamespace(project="runs/solutions", name="exp", exist_ok=False))
731
- save_dir.mkdir(parents=True) # create the output directory i.e. runs/solutions/exp
730
+ save_dir = get_save_dir(SimpleNamespace(task="solutions", name="exp", exist_ok=False, project=None))
731
+ save_dir.mkdir(parents=True, exist_ok=True) # create the output directory i.e. runs/solutions/exp
732
732
  vw = cv2.VideoWriter(str(save_dir / f"{solution_name}.avi"), cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))
733
733
 
734
734
  try: # Process video frames
@@ -1,22 +1,22 @@
1
- # Ultralytics YOLO 🚀 AGPL-3.0 License - https://ultralytics.com/license
2
- # Tsinghua-Tencent 100K Traffic Sign Detection Dataset
3
- # Dataset: https://cg.cs.tsinghua.edu.cn/traffic-sign/
1
+ # Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
2
+
3
+ # Tsinghua-Tencent 100K (TT100K) dataset https://cg.cs.tsinghua.edu.cn/traffic-sign/ by Tsinghua University
4
+ # Documentation: https://cg.cs.tsinghua.edu.cn/traffic-sign/tutorial.html
4
5
  # Paper: Traffic-Sign Detection and Classification in the Wild (CVPR 2016)
5
- # Documentation: 100,000 images with 30,000+ traffic sign annotations
6
+ # License: CC BY-NC 2.0 license for non-commercial use only
6
7
  # Example usage: yolo train data=TT100K.yaml
7
8
  # parent
8
9
  # ├── ultralytics
9
10
  # └── datasets
10
- # └── TT100K ← downloads here (~30 GB with images)
11
+ # └── TT100K ← downloads here (~18 GB)
11
12
 
12
- # Train/val/test sets
13
+ # Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
13
14
  path: TT100K # dataset root dir
14
- train: images/train # train images (relative to 'path')
15
- val: images/val # val images (relative to 'path')
16
- test: images/test # test images (relative to 'path')
15
+ train: images/train # train images (relative to 'path') 6105 images
16
+ val: images/val # val images (relative to 'path') 7641 images (original 'other' split)
17
+ test: images/test # test images (relative to 'path') 3071 images
17
18
 
18
- # Classes
19
- nc: 221
19
+ # Classes (221 traffic sign categories, 45 with sufficient training instances)
20
20
  names:
21
21
  0: pl5
22
22
  1: pl10
@@ -242,57 +242,52 @@ names:
242
242
 
243
243
  # Download script/URL (optional) ---------------------------------------------------------------------------------------
244
244
  download: |
245
- import os
246
245
  import json
247
246
  import shutil
248
247
  from pathlib import Path
249
- from ultralytics.utils.downloads import download
248
+
249
+ from PIL import Image
250
+
250
251
  from ultralytics.utils import TQDM
252
+ from ultralytics.utils.downloads import download
253
+
251
254
 
252
255
  def tt100k2yolo(dir):
253
- """Convert TT100K annotations to YOLO format."""
254
- from PIL import Image
255
-
256
+ """Convert TT100K annotations to YOLO format with images/{split} and labels/{split} structure."""
256
257
  data_dir = dir / "data"
257
258
  anno_file = data_dir / "annotations.json"
258
-
259
+
259
260
  print("Loading annotations...")
260
- with open(anno_file, 'r', encoding='utf-8') as f:
261
+ with open(anno_file, encoding="utf-8") as f:
261
262
  data = json.load(f)
262
-
263
- # Get all unique classes
264
- classes = set()
265
- for img_id, img_data in data['imgs'].items():
266
- for obj in img_data.get('objects', []):
267
- classes.add(obj['category'])
268
- class_to_idx = {cls: idx for idx, cls in enumerate(yaml["names"]) if cls in classes}
269
- class_to_idx = {cls: idx for idx, cls in enumerate(classes)}
270
-
271
- print(f"Found {len(classes)} traffic sign classes")
272
-
263
+
264
+ # Build class name to index mapping from yaml
265
+ names = yaml["names"]
266
+ class_to_idx = {v: k for k, v in names.items()}
267
+
273
268
  # Create directories
274
- for split in ['train', 'val', 'test']:
275
- (dir / 'images' / split).mkdir(parents=True, exist_ok=True)
276
- (dir / 'labels' / split).mkdir(parents=True, exist_ok=True)
277
-
269
+ for split in ["train", "val", "test"]:
270
+ (dir / "images" / split).mkdir(parents=True, exist_ok=True)
271
+ (dir / "labels" / split).mkdir(parents=True, exist_ok=True)
272
+
278
273
  print("Converting annotations to YOLO format...")
279
- for img_id, img_data in TQDM(data['imgs'].items(), desc="Processing"):
280
- img_path_str = img_data['path']
281
- if 'train' in img_path_str:
282
- split = 'train'
283
- elif 'test' in img_path_str:
284
- split = 'test'
274
+ skipped = 0
275
+ for img_id, img_data in TQDM(data["imgs"].items(), desc="Processing"):
276
+ img_path_str = img_data["path"]
277
+ if "train" in img_path_str:
278
+ split = "train"
279
+ elif "test" in img_path_str:
280
+ split = "test"
285
281
  else:
286
- split = 'val'
287
-
282
+ split = "val"
283
+
288
284
  # Source and destination paths
289
285
  src_img = data_dir / img_path_str
290
286
  if not src_img.exists():
291
287
  continue
292
-
293
- img_name = src_img.name
294
- dst_img = dir / 'images' / split / img_name
295
-
288
+
289
+ dst_img = dir / "images" / split / src_img.name
290
+
296
291
  # Get image dimensions
297
292
  try:
298
293
  with Image.open(src_img) as img:
@@ -300,57 +295,52 @@ download: |
300
295
  except Exception as e:
301
296
  print(f"Error reading {src_img}: {e}")
302
297
  continue
298
+
299
+ # Copy image to destination
303
300
  shutil.copy2(src_img, dst_img)
304
- label_file = dir / 'labels' / split / f"{src_img.stem}.txt"
301
+
302
+ # Convert annotations
303
+ label_file = dir / "labels" / split / f"{src_img.stem}.txt"
305
304
  lines = []
306
-
307
- for obj in img_data.get('objects', []):
308
- category = obj['category']
305
+
306
+ for obj in img_data.get("objects", []):
307
+ category = obj["category"]
309
308
  if category not in class_to_idx:
309
+ skipped += 1
310
310
  continue
311
-
312
- bbox = obj['bbox']
313
- xmin, ymin = bbox['xmin'], bbox['ymin']
314
- xmax, ymax = bbox['xmax'], bbox['ymax']
315
-
311
+
312
+ bbox = obj["bbox"]
313
+ xmin, ymin = bbox["xmin"], bbox["ymin"]
314
+ xmax, ymax = bbox["xmax"], bbox["ymax"]
315
+
316
316
  # Convert to YOLO format (normalized center coordinates and dimensions)
317
317
  x_center = ((xmin + xmax) / 2.0) / img_width
318
318
  y_center = ((ymin + ymax) / 2.0) / img_height
319
319
  width = (xmax - xmin) / img_width
320
320
  height = (ymax - ymin) / img_height
321
-
322
- # Ensure valid coordinates
321
+
322
+ # Clip to valid range
323
323
  x_center = max(0, min(1, x_center))
324
324
  y_center = max(0, min(1, y_center))
325
325
  width = max(0, min(1, width))
326
326
  height = max(0, min(1, height))
327
-
327
+
328
328
  cls_idx = class_to_idx[category]
329
329
  lines.append(f"{cls_idx} {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}\n")
330
-
330
+
331
331
  # Write label file
332
332
  if lines:
333
333
  label_file.write_text("".join(lines), encoding="utf-8")
334
-
335
- print(f"Conversion complete!")
336
- print(f"Found {len(classes)} classes: {classes[:10]}..." if len(classes) > 10 else f"Classes: {classes}")
337
-
338
- return classes
339
-
340
- # Download dataset
341
- dir = Path(yaml['path']) # dataset root dir
342
334
 
343
- # TT100K dataset URLs
344
- urls = [
345
- 'https://cg.cs.tsinghua.edu.cn/traffic-sign/data_model_code/data.zip', # Main dataset with annotations
346
- ]
335
+ if skipped:
336
+ print(f"Skipped {skipped} annotations with unknown categories")
337
+ print("Conversion complete!")
347
338
 
348
- print("Downloading TT100K dataset...")
349
- print("Note: This dataset is large (~30GB). Download may take some time.")
350
- print("Dataset is under CC-BY-NC license for non-commercial use only.")
351
339
 
352
- # Download and extract
353
- download(urls, dir=dir, unzip=True, delete=False, curl=False, threads=1)
340
+ # Download
341
+ dir = Path(yaml["path"]) # dataset root dir
342
+ urls = ["https://cg.cs.tsinghua.edu.cn/traffic-sign/data_model_code/data.zip"]
343
+ download(urls, dir=dir, curl=True, threads=1)
354
344
 
355
- # Convert dataset in YOLO format
356
- classes = tt100k2yolo(dir)
345
+ # Convert
346
+ tt100k2yolo(dir)
@@ -275,7 +275,7 @@ class Model(torch.nn.Module):
275
275
  >>> model._load("yolo11n.pt")
276
276
  >>> model._load("path/to/weights.pth", task="detect")
277
277
  """
278
- if weights.lower().startswith(("https://", "http://", "rtsp://", "rtmp://", "tcp://")):
278
+ if weights.lower().startswith(("https://", "http://", "rtsp://", "rtmp://", "tcp://", "ul://")):
279
279
  weights = checks.check_file(weights, download_dir=SETTINGS["weights_dir"]) # download and return local file
280
280
  weights = checks.check_model_file_from_stem(weights) # add suffix, i.e. yolo11n -> yolo11n.pt
281
281
 
@@ -403,7 +403,7 @@ class Model(torch.nn.Module):
403
403
  }
404
404
  torch.save({**self.ckpt, **updates}, filename)
405
405
 
406
- def info(self, detailed: bool = False, verbose: bool = True):
406
+ def info(self, detailed: bool = False, verbose: bool = True, imgsz: int | list[int, int] = 640):
407
407
  """Display model information.
408
408
 
409
409
  This method provides an overview or detailed information about the model, depending on the arguments
@@ -412,6 +412,7 @@ class Model(torch.nn.Module):
412
412
  Args:
413
413
  detailed (bool): If True, shows detailed information about the model layers and parameters.
414
414
  verbose (bool): If True, prints the information. If False, returns the information as a list.
415
+ imgsz (int | list[int, int]): Input image size used for FLOPs calculation.
415
416
 
416
417
  Returns:
417
418
  (list[str]): A list of strings containing various types of information about the model, including model
@@ -423,7 +424,7 @@ class Model(torch.nn.Module):
423
424
  >>> info_list = model.info(detailed=True, verbose=False) # Returns detailed info as a list
424
425
  """
425
426
  self._check_is_pytorch_model()
426
- return self.model.info(detailed=detailed, verbose=verbose)
427
+ return self.model.info(detailed=detailed, verbose=verbose, imgsz=imgsz)
427
428
 
428
429
  def fuse(self) -> None:
429
430
  """Fuse Conv2d and BatchNorm2d layers in the model for optimized inference.
@@ -157,6 +157,27 @@ class BaseTrainer:
157
157
  if self.device.type in {"cpu", "mps"}:
158
158
  self.args.workers = 0 # faster CPU training as time dominated by inference, not dataloading
159
159
 
160
+ # Callbacks - initialize early so on_pretrain_routine_start can capture original args.data
161
+ self.callbacks = _callbacks or callbacks.get_default_callbacks()
162
+
163
+ if isinstance(self.args.device, str) and len(self.args.device): # i.e. device='0' or device='0,1,2,3'
164
+ world_size = len(self.args.device.split(","))
165
+ elif isinstance(self.args.device, (tuple, list)): # i.e. device=[0, 1, 2, 3] (multi-GPU from CLI is list)
166
+ world_size = len(self.args.device)
167
+ elif self.args.device in {"cpu", "mps"}: # i.e. device='cpu' or 'mps'
168
+ world_size = 0
169
+ elif torch.cuda.is_available(): # i.e. device=None or device='' or device=number
170
+ world_size = 1 # default to device 0
171
+ else: # i.e. device=None or device=''
172
+ world_size = 0
173
+
174
+ self.ddp = world_size > 1 and "LOCAL_RANK" not in os.environ
175
+ self.world_size = world_size
176
+ # Run on_pretrain_routine_start before get_dataset() to capture original args.data (e.g., ul:// URIs)
177
+ if RANK in {-1, 0} and not self.ddp:
178
+ callbacks.add_integration_callbacks(self)
179
+ self.run_callbacks("on_pretrain_routine_start")
180
+
160
181
  # Model and Dataset
161
182
  self.model = check_model_file_from_stem(self.args.model) # add suffix, i.e. yolo11n -> yolo11n.pt
162
183
  with torch_distributed_zero_first(LOCAL_RANK): # avoid auto-downloading dataset multiple times
@@ -180,28 +201,6 @@ class BaseTrainer:
180
201
  self.plot_idx = [0, 1, 2]
181
202
  self.nan_recovery_attempts = 0
182
203
 
183
- # Callbacks
184
- self.callbacks = _callbacks or callbacks.get_default_callbacks()
185
-
186
- if isinstance(self.args.device, str) and len(self.args.device): # i.e. device='0' or device='0,1,2,3'
187
- world_size = len(self.args.device.split(","))
188
- elif isinstance(self.args.device, (tuple, list)): # i.e. device=[0, 1, 2, 3] (multi-GPU from CLI is list)
189
- world_size = len(self.args.device)
190
- elif self.args.device in {"cpu", "mps"}: # i.e. device='cpu' or 'mps'
191
- world_size = 0
192
- elif torch.cuda.is_available(): # i.e. device=None or device='' or device=number
193
- world_size = 1 # default to device 0
194
- else: # i.e. device=None or device=''
195
- world_size = 0
196
-
197
- self.ddp = world_size > 1 and "LOCAL_RANK" not in os.environ
198
- self.world_size = world_size
199
- # Run subprocess if DDP training, else train normally
200
- if RANK in {-1, 0} and not self.ddp:
201
- callbacks.add_integration_callbacks(self)
202
- # Start console logging immediately at trainer initialization
203
- self.run_callbacks("on_pretrain_routine_start")
204
-
205
204
  def add_callback(self, event: str, callback):
206
205
  """Append the given callback to the event's callback list."""
207
206
  self.callbacks[event].append(callback)
@@ -378,6 +378,7 @@ class Tuner:
378
378
  metrics = {}
379
379
  train_args = {**vars(self.args), **mutated_hyp}
380
380
  save_dir = get_save_dir(get_cfg(train_args))
381
+ train_args["save_dir"] = str(save_dir) # pass save_dir to subprocess to ensure same path is used
381
382
  weights_dir = save_dir / "weights"
382
383
  try:
383
384
  # Train YOLO model with mutated hyperparameters (run in subprocess to avoid dataloader hang)
@@ -460,7 +460,7 @@ class ProfileModels:
460
460
  if file.suffix in {".pt", ".yaml", ".yml"}:
461
461
  model = YOLO(str(file))
462
462
  model.fuse() # to report correct params and GFLOPs in model.info()
463
- model_info = model.info()
463
+ model_info = model.info(imgsz=self.imgsz)
464
464
  if self.trt and self.device.type != "cpu" and not engine_file.is_file():
465
465
  engine_file = model.export(
466
466
  format="engine",
@@ -11,9 +11,6 @@ from time import time
11
11
  from ultralytics.utils import ENVIRONMENT, GIT, LOGGER, PYTHON_VERSION, RANK, SETTINGS, TESTS_RUNNING, colorstr
12
12
 
13
13
  PREFIX = colorstr("Platform: ")
14
- _last_upload = 0 # Rate limit model uploads
15
- _console_logger = None # Global console logger instance
16
- _system_logger = None # Cached system logger instance
17
14
 
18
15
  try:
19
16
  assert not TESTS_RUNNING # do not log pytest
@@ -78,8 +75,6 @@ def resolve_platform_uri(uri, hard=True):
78
75
  else:
79
76
  raise ValueError(f"Invalid platform URI: {uri}. Use ul://user/datasets/name or ul://user/project/model")
80
77
 
81
- LOGGER.info(f"Resolving {uri} from Ultralytics Platform...")
82
-
83
78
  try:
84
79
  r = requests.head(url, headers=headers, allow_redirects=False, timeout=30)
85
80
 
@@ -139,22 +134,28 @@ def _interp_plot(plot, n=101):
139
134
  return result
140
135
 
141
136
 
142
- def _send(event, data, project, name):
143
- """Send event to Platform endpoint."""
137
+ def _send(event, data, project, name, model_id=None):
138
+ """Send event to Platform endpoint. Returns response JSON on success."""
144
139
  try:
145
- requests.post(
140
+ payload = {"event": event, "project": project, "name": name, "data": data}
141
+ if model_id:
142
+ payload["modelId"] = model_id
143
+ r = requests.post(
146
144
  "https://alpha.ultralytics.com/api/webhooks/training/metrics",
147
- json={"event": event, "project": project, "name": name, "data": data},
145
+ json=payload,
148
146
  headers={"Authorization": f"Bearer {_api_key}"},
149
147
  timeout=10,
150
- ).raise_for_status()
148
+ )
149
+ r.raise_for_status()
150
+ return r.json()
151
151
  except Exception as e:
152
152
  LOGGER.debug(f"Platform: Failed to send {event}: {e}")
153
+ return None
153
154
 
154
155
 
155
- def _send_async(event, data, project, name):
156
+ def _send_async(event, data, project, name, model_id=None):
156
157
  """Send event asynchronously using bounded thread pool."""
157
- _executor.submit(_send, event, data, project, name)
158
+ _executor.submit(_send, event, data, project, name, model_id)
158
159
 
159
160
 
160
161
  def _upload_model(model_path, project, name):
@@ -250,13 +251,12 @@ def _get_environment_info():
250
251
 
251
252
  def on_pretrain_routine_start(trainer):
252
253
  """Initialize Platform logging at training start."""
253
- global _console_logger, _last_upload
254
-
255
254
  if RANK not in {-1, 0} or not trainer.args.project:
256
255
  return
257
256
 
258
- # Initialize upload timer to now so first checkpoint waits 15 min from training start
259
- _last_upload = time()
257
+ # Per-trainer state to isolate concurrent training runs
258
+ trainer._platform_model_id = None
259
+ trainer._platform_last_upload = time()
260
260
 
261
261
  project, name = str(trainer.args.project), str(trainer.args.name or "train")
262
262
  url = f"https://alpha.ultralytics.com/{project}/{name}"
@@ -265,45 +265,43 @@ def on_pretrain_routine_start(trainer):
265
265
  # Create callback to send console output to Platform
266
266
  def send_console_output(content, line_count, chunk_id):
267
267
  """Send batched console output to Platform webhook."""
268
- _send_async("console_output", {"chunkId": chunk_id, "content": content, "lineCount": line_count}, project, name)
268
+ _send_async(
269
+ "console_output",
270
+ {"chunkId": chunk_id, "content": content, "lineCount": line_count},
271
+ project,
272
+ name,
273
+ getattr(trainer, "_platform_model_id", None),
274
+ )
269
275
 
270
276
  # Start console capture with batching (5 lines or 5 seconds)
271
- _console_logger = ConsoleLogger(batch_size=5, flush_interval=5.0, on_flush=send_console_output)
272
- _console_logger.start_capture()
273
-
274
- # Gather model info for richer metadata
275
- model_info = {}
276
- try:
277
- info = model_info_for_loggers(trainer)
278
- model_info = {
279
- "parameters": info.get("model/parameters", 0),
280
- "gflops": info.get("model/GFLOPs", 0),
281
- "classes": getattr(trainer.model, "yaml", {}).get("nc", 0), # number of classes
282
- }
283
- except Exception:
284
- pass
277
+ trainer._platform_console_logger = ConsoleLogger(batch_size=5, flush_interval=5.0, on_flush=send_console_output)
278
+ trainer._platform_console_logger.start_capture()
285
279
 
286
280
  # Collect environment info (W&B-style metadata)
287
281
  environment = _get_environment_info()
288
282
 
289
- _send_async(
283
+ # Build trainArgs - callback runs before get_dataset() so args.data is still original (e.g., ul:// URIs)
284
+ # Note: model_info is sent later in on_fit_epoch_end (epoch 0) when the model is actually loaded
285
+ train_args = {k: str(v) for k, v in vars(trainer.args).items()}
286
+
287
+ # Send synchronously to get modelId for subsequent webhooks
288
+ response = _send(
290
289
  "training_started",
291
290
  {
292
- "trainArgs": {k: str(v) for k, v in vars(trainer.args).items()},
291
+ "trainArgs": train_args,
293
292
  "epochs": trainer.epochs,
294
293
  "device": str(trainer.device),
295
- "modelInfo": model_info,
296
294
  "environment": environment,
297
295
  },
298
296
  project,
299
297
  name,
300
298
  )
299
+ if response and response.get("modelId"):
300
+ trainer._platform_model_id = response["modelId"]
301
301
 
302
302
 
303
303
  def on_fit_epoch_end(trainer):
304
304
  """Log training and system metrics at epoch end."""
305
- global _system_logger
306
-
307
305
  if RANK not in {-1, 0} or not trainer.args.project:
308
306
  return
309
307
 
@@ -312,44 +310,55 @@ def on_fit_epoch_end(trainer):
312
310
 
313
311
  if trainer.optimizer and trainer.optimizer.param_groups:
314
312
  metrics["lr"] = trainer.optimizer.param_groups[0]["lr"]
313
+
314
+ # Extract model info at epoch 0 (sent as separate field, not in metrics)
315
+ model_info = None
315
316
  if trainer.epoch == 0:
316
317
  try:
317
- metrics.update(model_info_for_loggers(trainer))
318
+ info = model_info_for_loggers(trainer)
319
+ model_info = {
320
+ "parameters": info.get("model/parameters", 0),
321
+ "gflops": info.get("model/GFLOPs", 0),
322
+ "speedMs": info.get("model/speed_PyTorch(ms)", 0),
323
+ }
318
324
  except Exception:
319
325
  pass
320
326
 
321
- # Get system metrics (cache SystemLogger for efficiency)
327
+ # Get system metrics (cache SystemLogger on trainer for efficiency)
322
328
  system = {}
323
329
  try:
324
- if _system_logger is None:
325
- _system_logger = SystemLogger()
326
- system = _system_logger.get_metrics(rates=True)
330
+ if not hasattr(trainer, "_platform_system_logger"):
331
+ trainer._platform_system_logger = SystemLogger()
332
+ system = trainer._platform_system_logger.get_metrics(rates=True)
327
333
  except Exception:
328
334
  pass
329
335
 
336
+ payload = {
337
+ "epoch": trainer.epoch,
338
+ "metrics": metrics,
339
+ "system": system,
340
+ "fitness": trainer.fitness,
341
+ "best_fitness": trainer.best_fitness,
342
+ }
343
+ if model_info:
344
+ payload["modelInfo"] = model_info
345
+
330
346
  _send_async(
331
347
  "epoch_end",
332
- {
333
- "epoch": trainer.epoch,
334
- "metrics": metrics,
335
- "system": system,
336
- "fitness": trainer.fitness,
337
- "best_fitness": trainer.best_fitness,
338
- },
348
+ payload,
339
349
  project,
340
350
  name,
351
+ getattr(trainer, "_platform_model_id", None),
341
352
  )
342
353
 
343
354
 
344
355
  def on_model_save(trainer):
345
356
  """Upload model checkpoint (rate limited to every 15 min)."""
346
- global _last_upload
347
-
348
357
  if RANK not in {-1, 0} or not trainer.args.project:
349
358
  return
350
359
 
351
360
  # Rate limit to every 15 minutes (900 seconds)
352
- if time() - _last_upload < 900:
361
+ if time() - getattr(trainer, "_platform_last_upload", 0) < 900:
353
362
  return
354
363
 
355
364
  model_path = trainer.best if trainer.best and Path(trainer.best).exists() else trainer.last
@@ -358,22 +367,20 @@ def on_model_save(trainer):
358
367
 
359
368
  project, name = str(trainer.args.project), str(trainer.args.name or "train")
360
369
  _upload_model_async(model_path, project, name)
361
- _last_upload = time()
370
+ trainer._platform_last_upload = time()
362
371
 
363
372
 
364
373
  def on_train_end(trainer):
365
374
  """Log final results, upload best model, and send validation plot data."""
366
- global _console_logger
367
-
368
375
  if RANK not in {-1, 0} or not trainer.args.project:
369
376
  return
370
377
 
371
378
  project, name = str(trainer.args.project), str(trainer.args.name or "train")
372
379
 
373
380
  # Stop console capture
374
- if _console_logger:
375
- _console_logger.stop_capture()
376
- _console_logger = None
381
+ if hasattr(trainer, "_platform_console_logger") and trainer._platform_console_logger:
382
+ trainer._platform_console_logger.stop_capture()
383
+ trainer._platform_console_logger = None
377
384
 
378
385
  # Upload best model (blocking to ensure it completes)
379
386
  model_path = None
@@ -411,6 +418,7 @@ def on_train_end(trainer):
411
418
  },
412
419
  project,
413
420
  name,
421
+ getattr(trainer, "_platform_model_id", None),
414
422
  )
415
423
  url = f"https://alpha.ultralytics.com/{project}/{name}"
416
424
  LOGGER.info(f"{PREFIX}View results at {url}")
@@ -592,7 +592,7 @@ def check_file(file, suffix="", download=True, download_dir=".", hard=True):
592
592
  """Search/download file (if necessary), check suffix (if provided), and return path.
593
593
 
594
594
  Args:
595
- file (str): File name or path, or platform URI (ul://username/datasets/name).
595
+ file (str): File name or path, URL, platform URI (ul://), or GCS path (gs://).
596
596
  suffix (str | tuple): Acceptable suffix or tuple of suffixes to validate against the file.
597
597
  download (bool): Whether to download the file if it doesn't exist locally.
598
598
  download_dir (str): Directory to download the file to.
@@ -616,13 +616,20 @@ def check_file(file, suffix="", download=True, download_dir=".", hard=True):
616
616
  url = resolve_platform_uri(file, hard=hard) # Convert to signed HTTPS URL
617
617
  if url is None:
618
618
  return [] # Not found, soft fail (consistent with file search behavior)
619
- local_file = Path(download_dir) / url2file(url)
619
+ # Use URI path for unique directory structure: ul://user/project/model -> user/project/model/filename.pt
620
+ uri_path = file[5:] # Remove "ul://"
621
+ local_file = Path(download_dir) / uri_path / url2file(url)
620
622
  if local_file.exists():
621
623
  LOGGER.info(f"Found {clean_url(url)} locally at {local_file}")
622
624
  else:
625
+ local_file.parent.mkdir(parents=True, exist_ok=True)
623
626
  downloads.safe_download(url=url, file=local_file, unzip=False)
624
627
  return str(local_file)
625
- elif download and file.lower().startswith(("https://", "http://", "rtsp://", "rtmp://", "tcp://")): # download
628
+ elif download and file.lower().startswith(
629
+ ("https://", "http://", "rtsp://", "rtmp://", "tcp://", "gs://")
630
+ ): # download
631
+ if file.startswith("gs://"):
632
+ file = "https://storage.googleapis.com/" + file[5:] # convert gs:// to public HTTPS URL
626
633
  url = file # warning: Pathlib turns :// -> :/
627
634
  file = Path(download_dir) / url2file(file) # '%2F' to '/', split https://url.com/file.txt?auth
628
635
  if file.exists():
@@ -957,7 +964,7 @@ def is_rockchip():
957
964
  with open("/proc/device-tree/compatible") as f:
958
965
  dev_str = f.read()
959
966
  *_, soc = dev_str.split(",")
960
- if soc.replace("\x00", "") in RKNN_CHIPS:
967
+ if soc.replace("\x00", "").split("-", 1)[0] in RKNN_CHIPS:
961
968
  return True
962
969
  except OSError:
963
970
  return False
@@ -972,6 +972,9 @@ def plot_tune_results(csv_file: str = "tune_results.csv", exclude_zero_fitness_p
972
972
  if exclude_zero_fitness_points:
973
973
  mask = fitness > 0 # exclude zero-fitness points
974
974
  x, fitness = x[mask], fitness[mask]
975
+ if len(fitness) == 0:
976
+ LOGGER.warning("No valid fitness values to plot (all iterations may have failed)")
977
+ return
975
978
  # Iterative sigma rejection on lower bound only
976
979
  for _ in range(3): # max 3 iterations
977
980
  mean, std = fitness.mean(), fitness.std()