ultralytics-opencv-headless 8.3.242__tar.gz → 8.3.243__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.242 → ultralytics_opencv_headless-8.3.243}/PKG-INFO +2 -2
  2. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/pyproject.toml +1 -1
  3. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/__init__.py +1 -1
  4. ultralytics_opencv_headless-8.3.243/ultralytics/utils/callbacks/platform.py +290 -0
  5. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/utils/checks.py +5 -0
  6. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/utils/logger.py +131 -75
  7. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/utils/loss.py +2 -2
  8. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics_opencv_headless.egg-info/PKG-INFO +2 -2
  9. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics_opencv_headless.egg-info/requires.txt +1 -1
  10. ultralytics_opencv_headless-8.3.242/ultralytics/utils/callbacks/platform.py +0 -73
  11. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/LICENSE +0 -0
  12. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/README.md +0 -0
  13. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/setup.cfg +0 -0
  14. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/tests/__init__.py +0 -0
  15. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/tests/conftest.py +0 -0
  16. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/tests/test_cli.py +0 -0
  17. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/tests/test_cuda.py +0 -0
  18. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/tests/test_engine.py +0 -0
  19. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/tests/test_exports.py +0 -0
  20. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/tests/test_integrations.py +0 -0
  21. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/tests/test_python.py +0 -0
  22. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/tests/test_solutions.py +0 -0
  23. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/assets/bus.jpg +0 -0
  24. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/assets/zidane.jpg +0 -0
  25. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/__init__.py +0 -0
  26. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
  27. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
  28. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
  29. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
  30. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/datasets/HomeObjects-3K.yaml +0 -0
  31. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
  32. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
  33. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
  34. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/datasets/VOC.yaml +0 -0
  35. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
  36. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
  37. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
  38. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
  39. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
  40. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/datasets/coco.yaml +0 -0
  41. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
  42. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/datasets/coco128.yaml +0 -0
  43. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/datasets/coco8-grayscale.yaml +0 -0
  44. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/datasets/coco8-multispectral.yaml +0 -0
  45. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
  46. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
  47. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/datasets/coco8.yaml +0 -0
  48. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/datasets/construction-ppe.yaml +0 -0
  49. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
  50. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/datasets/dog-pose.yaml +0 -0
  51. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/datasets/dota8-multispectral.yaml +0 -0
  52. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/datasets/dota8.yaml +0 -0
  53. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/datasets/hand-keypoints.yaml +0 -0
  54. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/datasets/kitti.yaml +0 -0
  55. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/datasets/lvis.yaml +0 -0
  56. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/datasets/medical-pills.yaml +0 -0
  57. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
  58. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
  59. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/datasets/signature.yaml +0 -0
  60. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
  61. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/datasets/xView.yaml +0 -0
  62. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/default.yaml +0 -0
  63. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/11/yolo11-cls-resnet18.yaml +0 -0
  64. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/11/yolo11-cls.yaml +0 -0
  65. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/11/yolo11-obb.yaml +0 -0
  66. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/11/yolo11-pose.yaml +0 -0
  67. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/11/yolo11-seg.yaml +0 -0
  68. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/11/yolo11.yaml +0 -0
  69. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/11/yoloe-11-seg.yaml +0 -0
  70. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/11/yoloe-11.yaml +0 -0
  71. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/12/yolo12-cls.yaml +0 -0
  72. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/12/yolo12-obb.yaml +0 -0
  73. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/12/yolo12-pose.yaml +0 -0
  74. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/12/yolo12-seg.yaml +0 -0
  75. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/12/yolo12.yaml +0 -0
  76. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
  77. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
  78. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
  79. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
  80. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/v10/yolov10b.yaml +0 -0
  81. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/v10/yolov10l.yaml +0 -0
  82. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/v10/yolov10m.yaml +0 -0
  83. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/v10/yolov10n.yaml +0 -0
  84. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/v10/yolov10s.yaml +0 -0
  85. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/v10/yolov10x.yaml +0 -0
  86. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
  87. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
  88. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
  89. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
  90. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
  91. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
  92. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/v8/yoloe-v8-seg.yaml +0 -0
  93. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/v8/yoloe-v8.yaml +0 -0
  94. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
  95. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
  96. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
  97. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
  98. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
  99. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
  100. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
  101. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
  102. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
  103. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
  104. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
  105. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
  106. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
  107. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
  108. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
  109. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
  110. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
  111. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
  112. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
  113. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
  114. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
  115. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/v9/yolov9m.yaml +0 -0
  116. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/v9/yolov9s.yaml +0 -0
  117. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/models/v9/yolov9t.yaml +0 -0
  118. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/trackers/botsort.yaml +0 -0
  119. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
  120. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/data/__init__.py +0 -0
  121. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/data/annotator.py +0 -0
  122. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/data/augment.py +0 -0
  123. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/data/base.py +0 -0
  124. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/data/build.py +0 -0
  125. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/data/converter.py +0 -0
  126. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/data/dataset.py +0 -0
  127. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/data/loaders.py +0 -0
  128. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/data/scripts/download_weights.sh +0 -0
  129. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/data/scripts/get_coco.sh +0 -0
  130. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/data/scripts/get_coco128.sh +0 -0
  131. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/data/scripts/get_imagenet.sh +0 -0
  132. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/data/split.py +0 -0
  133. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/data/split_dota.py +0 -0
  134. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/data/utils.py +0 -0
  135. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/engine/__init__.py +0 -0
  136. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/engine/exporter.py +0 -0
  137. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/engine/model.py +0 -0
  138. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/engine/predictor.py +0 -0
  139. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/engine/results.py +0 -0
  140. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/engine/trainer.py +0 -0
  141. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/engine/tuner.py +0 -0
  142. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/engine/validator.py +0 -0
  143. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/hub/__init__.py +0 -0
  144. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/hub/auth.py +0 -0
  145. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/hub/google/__init__.py +0 -0
  146. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/hub/session.py +0 -0
  147. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/hub/utils.py +0 -0
  148. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/__init__.py +0 -0
  149. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/fastsam/__init__.py +0 -0
  150. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/fastsam/model.py +0 -0
  151. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/fastsam/predict.py +0 -0
  152. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/fastsam/utils.py +0 -0
  153. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/fastsam/val.py +0 -0
  154. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/nas/__init__.py +0 -0
  155. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/nas/model.py +0 -0
  156. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/nas/predict.py +0 -0
  157. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/nas/val.py +0 -0
  158. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/rtdetr/__init__.py +0 -0
  159. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/rtdetr/model.py +0 -0
  160. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/rtdetr/predict.py +0 -0
  161. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/rtdetr/train.py +0 -0
  162. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/rtdetr/val.py +0 -0
  163. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/sam/__init__.py +0 -0
  164. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/sam/amg.py +0 -0
  165. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/sam/build.py +0 -0
  166. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/sam/build_sam3.py +0 -0
  167. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/sam/model.py +0 -0
  168. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/sam/modules/__init__.py +0 -0
  169. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/sam/modules/blocks.py +0 -0
  170. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/sam/modules/decoders.py +0 -0
  171. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/sam/modules/encoders.py +0 -0
  172. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/sam/modules/memory_attention.py +0 -0
  173. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/sam/modules/sam.py +0 -0
  174. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
  175. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/sam/modules/transformer.py +0 -0
  176. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/sam/modules/utils.py +0 -0
  177. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/sam/predict.py +0 -0
  178. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/sam/sam3/__init__.py +0 -0
  179. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/sam/sam3/decoder.py +0 -0
  180. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/sam/sam3/encoder.py +0 -0
  181. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/sam/sam3/geometry_encoders.py +0 -0
  182. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/sam/sam3/maskformer_segmentation.py +0 -0
  183. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/sam/sam3/model_misc.py +0 -0
  184. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/sam/sam3/necks.py +0 -0
  185. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/sam/sam3/sam3_image.py +0 -0
  186. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/sam/sam3/text_encoder_ve.py +0 -0
  187. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/sam/sam3/vitdet.py +0 -0
  188. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/sam/sam3/vl_combiner.py +0 -0
  189. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/utils/__init__.py +0 -0
  190. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/utils/loss.py +0 -0
  191. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/utils/ops.py +0 -0
  192. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/yolo/__init__.py +0 -0
  193. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/yolo/classify/__init__.py +0 -0
  194. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/yolo/classify/predict.py +0 -0
  195. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/yolo/classify/train.py +0 -0
  196. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/yolo/classify/val.py +0 -0
  197. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/yolo/detect/__init__.py +0 -0
  198. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/yolo/detect/predict.py +0 -0
  199. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/yolo/detect/train.py +0 -0
  200. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/yolo/detect/val.py +0 -0
  201. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/yolo/model.py +0 -0
  202. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/yolo/obb/__init__.py +0 -0
  203. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/yolo/obb/predict.py +0 -0
  204. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/yolo/obb/train.py +0 -0
  205. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/yolo/obb/val.py +0 -0
  206. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/yolo/pose/__init__.py +0 -0
  207. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/yolo/pose/predict.py +0 -0
  208. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/yolo/pose/train.py +0 -0
  209. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/yolo/pose/val.py +0 -0
  210. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/yolo/segment/__init__.py +0 -0
  211. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/yolo/segment/predict.py +0 -0
  212. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/yolo/segment/train.py +0 -0
  213. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/yolo/segment/val.py +0 -0
  214. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/yolo/world/__init__.py +0 -0
  215. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/yolo/world/train.py +0 -0
  216. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/yolo/world/train_world.py +0 -0
  217. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/yolo/yoloe/__init__.py +0 -0
  218. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/yolo/yoloe/predict.py +0 -0
  219. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/yolo/yoloe/train.py +0 -0
  220. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/yolo/yoloe/train_seg.py +0 -0
  221. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/models/yolo/yoloe/val.py +0 -0
  222. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/nn/__init__.py +0 -0
  223. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/nn/autobackend.py +0 -0
  224. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/nn/modules/__init__.py +0 -0
  225. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/nn/modules/activation.py +0 -0
  226. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/nn/modules/block.py +0 -0
  227. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/nn/modules/conv.py +0 -0
  228. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/nn/modules/head.py +0 -0
  229. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/nn/modules/transformer.py +0 -0
  230. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/nn/modules/utils.py +0 -0
  231. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/nn/tasks.py +0 -0
  232. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/nn/text_model.py +0 -0
  233. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/py.typed +0 -0
  234. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/solutions/__init__.py +0 -0
  235. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/solutions/ai_gym.py +0 -0
  236. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/solutions/analytics.py +0 -0
  237. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/solutions/config.py +0 -0
  238. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/solutions/distance_calculation.py +0 -0
  239. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/solutions/heatmap.py +0 -0
  240. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/solutions/instance_segmentation.py +0 -0
  241. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/solutions/object_blurrer.py +0 -0
  242. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/solutions/object_counter.py +0 -0
  243. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/solutions/object_cropper.py +0 -0
  244. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/solutions/parking_management.py +0 -0
  245. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/solutions/queue_management.py +0 -0
  246. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/solutions/region_counter.py +0 -0
  247. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/solutions/security_alarm.py +0 -0
  248. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/solutions/similarity_search.py +0 -0
  249. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/solutions/solutions.py +0 -0
  250. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/solutions/speed_estimation.py +0 -0
  251. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/solutions/streamlit_inference.py +0 -0
  252. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/solutions/templates/similarity-search.html +0 -0
  253. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/solutions/trackzone.py +0 -0
  254. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/solutions/vision_eye.py +0 -0
  255. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/trackers/__init__.py +0 -0
  256. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/trackers/basetrack.py +0 -0
  257. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/trackers/bot_sort.py +0 -0
  258. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/trackers/byte_tracker.py +0 -0
  259. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/trackers/track.py +0 -0
  260. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/trackers/utils/__init__.py +0 -0
  261. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/trackers/utils/gmc.py +0 -0
  262. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/trackers/utils/kalman_filter.py +0 -0
  263. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/trackers/utils/matching.py +0 -0
  264. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/utils/__init__.py +0 -0
  265. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/utils/autobatch.py +0 -0
  266. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/utils/autodevice.py +0 -0
  267. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/utils/benchmarks.py +0 -0
  268. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/utils/callbacks/__init__.py +0 -0
  269. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/utils/callbacks/base.py +0 -0
  270. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/utils/callbacks/clearml.py +0 -0
  271. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/utils/callbacks/comet.py +0 -0
  272. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/utils/callbacks/dvc.py +0 -0
  273. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/utils/callbacks/hub.py +0 -0
  274. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/utils/callbacks/mlflow.py +0 -0
  275. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/utils/callbacks/neptune.py +0 -0
  276. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/utils/callbacks/raytune.py +0 -0
  277. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/utils/callbacks/tensorboard.py +0 -0
  278. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/utils/callbacks/wb.py +0 -0
  279. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/utils/cpu.py +0 -0
  280. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/utils/dist.py +0 -0
  281. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/utils/downloads.py +0 -0
  282. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/utils/errors.py +0 -0
  283. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/utils/events.py +0 -0
  284. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/utils/export/__init__.py +0 -0
  285. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/utils/export/engine.py +0 -0
  286. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/utils/export/imx.py +0 -0
  287. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/utils/export/tensorflow.py +0 -0
  288. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/utils/files.py +0 -0
  289. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/utils/git.py +0 -0
  290. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/utils/instance.py +0 -0
  291. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/utils/metrics.py +0 -0
  292. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/utils/nms.py +0 -0
  293. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/utils/ops.py +0 -0
  294. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/utils/patches.py +0 -0
  295. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/utils/plotting.py +0 -0
  296. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/utils/tal.py +0 -0
  297. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/utils/torch_utils.py +0 -0
  298. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/utils/tqdm.py +0 -0
  299. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/utils/triton.py +0 -0
  300. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics/utils/tuner.py +0 -0
  301. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics_opencv_headless.egg-info/SOURCES.txt +0 -0
  302. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics_opencv_headless.egg-info/dependency_links.txt +0 -0
  303. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/ultralytics_opencv_headless.egg-info/entry_points.txt +0 -0
  304. {ultralytics_opencv_headless-8.3.242 → ultralytics_opencv_headless-8.3.243}/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.242
3
+ Version: 8.3.243
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>
@@ -50,7 +50,7 @@ Requires-Dist: ipython; extra == "dev"
50
50
  Requires-Dist: pytest; extra == "dev"
51
51
  Requires-Dist: pytest-cov; extra == "dev"
52
52
  Requires-Dist: coverage[toml]; extra == "dev"
53
- Requires-Dist: zensical>=0.0.9; python_version >= "3.10" and extra == "dev"
53
+ Requires-Dist: zensical>=0.0.15; python_version >= "3.10" and extra == "dev"
54
54
  Requires-Dist: mkdocs-ultralytics-plugin>=0.2.4; extra == "dev"
55
55
  Requires-Dist: minijinja>=2.0.0; extra == "dev"
56
56
  Provides-Extra: export
@@ -83,7 +83,7 @@ dev = [
83
83
  "pytest",
84
84
  "pytest-cov",
85
85
  "coverage[toml]",
86
- "zensical>=0.0.9; python_version >= '3.10'",
86
+ "zensical>=0.0.15; python_version >= '3.10'",
87
87
  "mkdocs-ultralytics-plugin>=0.2.4", # for meta descriptions and images, dates and authors
88
88
  "minijinja>=2.0.0", # render docs macros without mkdocs-macros-plugin
89
89
  ]
@@ -1,6 +1,6 @@
1
1
  # Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
2
2
 
3
- __version__ = "8.3.242"
3
+ __version__ = "8.3.243"
4
4
 
5
5
  import importlib
6
6
  import os
@@ -0,0 +1,290 @@
1
+ # Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
2
+
3
+ import os
4
+ import platform
5
+ import socket
6
+ import sys
7
+ from concurrent.futures import ThreadPoolExecutor
8
+ from pathlib import Path
9
+ from time import time
10
+
11
+ from ultralytics.utils import ENVIRONMENT, GIT, LOGGER, PYTHON_VERSION, RANK, SETTINGS, TESTS_RUNNING
12
+
13
+ _last_upload = 0 # Rate limit model uploads
14
+ _console_logger = None # Global console logger instance
15
+ _system_logger = None # Cached system logger instance
16
+
17
+ try:
18
+ assert not TESTS_RUNNING # do not log pytest
19
+ assert SETTINGS.get("platform", False) is True or os.getenv("ULTRALYTICS_API_KEY") or SETTINGS.get("api_key")
20
+ _api_key = os.getenv("ULTRALYTICS_API_KEY") or SETTINGS.get("api_key")
21
+ assert _api_key # verify API key is present
22
+
23
+ import requests
24
+
25
+ from ultralytics.utils.logger import ConsoleLogger, SystemLogger
26
+ from ultralytics.utils.torch_utils import model_info_for_loggers
27
+
28
+ _executor = ThreadPoolExecutor(max_workers=10) # Bounded thread pool for async operations
29
+
30
+ except (AssertionError, ImportError):
31
+ _api_key = None
32
+
33
+
34
+ def _send(event, data, project, name):
35
+ """Send event to Platform endpoint."""
36
+ try:
37
+ requests.post(
38
+ "https://alpha.ultralytics.com/api/webhooks/training/metrics",
39
+ json={"event": event, "project": project, "name": name, "data": data},
40
+ headers={"Authorization": f"Bearer {_api_key}"},
41
+ timeout=10,
42
+ ).raise_for_status()
43
+ except Exception as e:
44
+ LOGGER.debug(f"Platform: Failed to send {event}: {e}")
45
+
46
+
47
+ def _send_async(event, data, project, name):
48
+ """Send event asynchronously using bounded thread pool."""
49
+ _executor.submit(_send, event, data, project, name)
50
+
51
+
52
+ def _upload_model(model_path, project, name):
53
+ """Upload model checkpoint to Platform via signed URL."""
54
+ try:
55
+ model_path = Path(model_path)
56
+ if not model_path.exists():
57
+ return None
58
+
59
+ # Get signed upload URL
60
+ response = requests.post(
61
+ "https://alpha.ultralytics.com/api/webhooks/models/upload",
62
+ json={"project": project, "name": name, "filename": model_path.name},
63
+ headers={"Authorization": f"Bearer {_api_key}"},
64
+ timeout=10,
65
+ )
66
+ response.raise_for_status()
67
+ data = response.json()
68
+
69
+ # Upload to GCS
70
+ with open(model_path, "rb") as f:
71
+ requests.put(
72
+ data["uploadUrl"],
73
+ data=f,
74
+ headers={"Content-Type": "application/octet-stream"},
75
+ timeout=600, # 10 min timeout for large models
76
+ ).raise_for_status()
77
+
78
+ LOGGER.info(f"Platform: Model uploaded to '{project}'")
79
+ return data.get("gcsPath")
80
+
81
+ except Exception as e:
82
+ LOGGER.debug(f"Platform: Failed to upload model: {e}")
83
+ return None
84
+
85
+
86
+ def _upload_model_async(model_path, project, name):
87
+ """Upload model asynchronously using bounded thread pool."""
88
+ _executor.submit(_upload_model, model_path, project, name)
89
+
90
+
91
+ def _get_environment_info():
92
+ """Collect comprehensive environment info using existing ultralytics utilities."""
93
+ import torch
94
+
95
+ from ultralytics import __version__
96
+ from ultralytics.utils.torch_utils import get_cpu_info, get_gpu_info
97
+
98
+ env = {
99
+ "ultralyticsVersion": __version__,
100
+ "hostname": socket.gethostname(),
101
+ "os": platform.platform(),
102
+ "environment": ENVIRONMENT,
103
+ "pythonVersion": PYTHON_VERSION,
104
+ "pythonExecutable": sys.executable,
105
+ "cpuCount": os.cpu_count() or 0,
106
+ "cpu": get_cpu_info(),
107
+ "command": " ".join(sys.argv),
108
+ }
109
+
110
+ # Git info using cached GIT singleton (no subprocess calls)
111
+ try:
112
+ if GIT.is_repo:
113
+ if GIT.origin:
114
+ env["gitRepository"] = GIT.origin
115
+ if GIT.branch:
116
+ env["gitBranch"] = GIT.branch
117
+ if GIT.commit:
118
+ env["gitCommit"] = GIT.commit[:12] # Short hash
119
+ except Exception:
120
+ pass
121
+
122
+ # GPU info
123
+ try:
124
+ if torch.cuda.is_available():
125
+ env["gpuCount"] = torch.cuda.device_count()
126
+ env["gpuType"] = get_gpu_info(0) if torch.cuda.device_count() > 0 else None
127
+ except Exception:
128
+ pass
129
+
130
+ return env
131
+
132
+
133
+ def on_pretrain_routine_start(trainer):
134
+ """Initialize Platform logging at training start."""
135
+ global _console_logger, _last_upload
136
+
137
+ if RANK not in {-1, 0} or not trainer.args.project:
138
+ return
139
+
140
+ # Initialize upload timer to now so first checkpoint waits 15 min from training start
141
+ _last_upload = time()
142
+
143
+ project, name = str(trainer.args.project), str(trainer.args.name or "train")
144
+ LOGGER.info(f"Platform: Streaming to project '{project}' as '{name}'")
145
+
146
+ # Create callback to send console output to Platform
147
+ def send_console_output(content, line_count, chunk_id):
148
+ """Send batched console output to Platform webhook."""
149
+ _send_async("console_output", {"chunkId": chunk_id, "content": content, "lineCount": line_count}, project, name)
150
+
151
+ # Start console capture with batching (5 lines or 5 seconds)
152
+ _console_logger = ConsoleLogger(batch_size=5, flush_interval=5.0, on_flush=send_console_output)
153
+ _console_logger.start_capture()
154
+
155
+ # Gather model info for richer metadata
156
+ model_info = {}
157
+ try:
158
+ info = model_info_for_loggers(trainer)
159
+ model_info = {
160
+ "parameters": info.get("model/parameters", 0),
161
+ "gflops": info.get("model/GFLOPs", 0),
162
+ "classes": getattr(trainer.model, "yaml", {}).get("nc", 0), # number of classes
163
+ }
164
+ except Exception:
165
+ pass
166
+
167
+ # Collect environment info (W&B-style metadata)
168
+ environment = _get_environment_info()
169
+
170
+ _send_async(
171
+ "training_started",
172
+ {
173
+ "trainArgs": {k: str(v) for k, v in vars(trainer.args).items()},
174
+ "epochs": trainer.epochs,
175
+ "device": str(trainer.device),
176
+ "modelInfo": model_info,
177
+ "environment": environment,
178
+ },
179
+ project,
180
+ name,
181
+ )
182
+
183
+
184
+ def on_fit_epoch_end(trainer):
185
+ """Log training and system metrics at epoch end."""
186
+ global _system_logger
187
+
188
+ if RANK not in {-1, 0} or not trainer.args.project:
189
+ return
190
+
191
+ project, name = str(trainer.args.project), str(trainer.args.name or "train")
192
+ metrics = {**trainer.label_loss_items(trainer.tloss, prefix="train"), **trainer.metrics}
193
+
194
+ if trainer.optimizer and trainer.optimizer.param_groups:
195
+ metrics["lr"] = trainer.optimizer.param_groups[0]["lr"]
196
+ if trainer.epoch == 0:
197
+ try:
198
+ metrics.update(model_info_for_loggers(trainer))
199
+ except Exception:
200
+ pass
201
+
202
+ # Get system metrics (cache SystemLogger for efficiency)
203
+ system = {}
204
+ try:
205
+ if _system_logger is None:
206
+ _system_logger = SystemLogger()
207
+ system = _system_logger.get_metrics(rates=True)
208
+ except Exception:
209
+ pass
210
+
211
+ _send_async(
212
+ "epoch_end",
213
+ {
214
+ "epoch": trainer.epoch,
215
+ "metrics": metrics,
216
+ "system": system,
217
+ "fitness": trainer.fitness,
218
+ "best_fitness": trainer.best_fitness,
219
+ },
220
+ project,
221
+ name,
222
+ )
223
+
224
+
225
+ def on_model_save(trainer):
226
+ """Upload model checkpoint (rate limited to every 15 min)."""
227
+ global _last_upload
228
+
229
+ if RANK not in {-1, 0} or not trainer.args.project:
230
+ return
231
+
232
+ # Rate limit to every 15 minutes (900 seconds)
233
+ if time() - _last_upload < 900:
234
+ return
235
+
236
+ model_path = trainer.best if trainer.best and Path(trainer.best).exists() else trainer.last
237
+ if not model_path:
238
+ return
239
+
240
+ project, name = str(trainer.args.project), str(trainer.args.name or "train")
241
+ _upload_model_async(model_path, project, name)
242
+ _last_upload = time()
243
+
244
+
245
+ def on_train_end(trainer):
246
+ """Log final results and upload best model."""
247
+ global _console_logger
248
+
249
+ if RANK not in {-1, 0} or not trainer.args.project:
250
+ return
251
+
252
+ project, name = str(trainer.args.project), str(trainer.args.name or "train")
253
+
254
+ # Stop console capture and flush remaining output
255
+ if _console_logger:
256
+ _console_logger.stop_capture()
257
+ _console_logger = None
258
+
259
+ # Upload best model (blocking to ensure it completes)
260
+ model_path = None
261
+ if trainer.best and Path(trainer.best).exists():
262
+ model_path = _upload_model(trainer.best, project, name)
263
+
264
+ # Send training complete
265
+ _send(
266
+ "training_complete",
267
+ {
268
+ "results": {
269
+ "metrics": {**trainer.metrics, "fitness": trainer.fitness},
270
+ "bestEpoch": getattr(trainer, "best_epoch", trainer.epoch),
271
+ "bestFitness": trainer.best_fitness,
272
+ "modelPath": model_path or str(trainer.best) if trainer.best else None,
273
+ }
274
+ },
275
+ project,
276
+ name,
277
+ )
278
+ LOGGER.info(f"Platform: Training complete, results uploaded to '{project}'")
279
+
280
+
281
+ callbacks = (
282
+ {
283
+ "on_pretrain_routine_start": on_pretrain_routine_start,
284
+ "on_fit_epoch_end": on_fit_epoch_end,
285
+ "on_model_save": on_model_save,
286
+ "on_train_end": on_train_end,
287
+ }
288
+ if _api_key
289
+ else {}
290
+ )
@@ -418,6 +418,11 @@ def check_requirements(requirements=ROOT.parent / "requirements.txt", exclude=()
418
418
  >>> check_requirements([("onnxruntime", "onnxruntime-gpu"), "numpy"])
419
419
  """
420
420
  prefix = colorstr("red", "bold", "requirements:")
421
+
422
+ if os.environ.get("ULTRALYTICS_SKIP_REQUIREMENTS_CHECKS", "0") == "1":
423
+ LOGGER.info(f"{prefix} ULTRALYTICS_SKIP_REQUIREMENTS_CHECKS=1 detected, skipping requirements check.")
424
+ return True
425
+
421
426
  if isinstance(requirements, Path): # requirements.txt file
422
427
  file = requirements.resolve()
423
428
  assert file.exists(), f"{prefix} {file} not found, check failed."
@@ -1,7 +1,6 @@
1
1
  # Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
2
2
 
3
3
  import logging
4
- import queue
5
4
  import shutil
6
5
  import sys
7
6
  import threading
@@ -12,72 +11,81 @@ from pathlib import Path
12
11
  from ultralytics.utils import MACOS, RANK
13
12
  from ultralytics.utils.checks import check_requirements
14
13
 
15
- # Initialize default log file
16
- DEFAULT_LOG_PATH = Path("train.log")
17
- if RANK in {-1, 0} and DEFAULT_LOG_PATH.exists():
18
- DEFAULT_LOG_PATH.unlink(missing_ok=True)
19
-
20
14
 
21
15
  class ConsoleLogger:
22
- """Console output capture with API/file streaming and deduplication.
16
+ """Console output capture with batched streaming to file, API, or custom callback.
23
17
 
24
- Captures stdout/stderr output and streams it to either an API endpoint or local file, with intelligent deduplication
25
- to reduce noise from repetitive console output.
18
+ Captures stdout/stderr output and streams it with intelligent deduplication and configurable batching.
26
19
 
27
20
  Attributes:
28
- destination (str | Path): Target destination for streaming (URL or Path object).
29
- is_api (bool): Whether destination is an API endpoint (True) or local file (False).
30
- original_stdout: Reference to original sys.stdout for restoration.
31
- original_stderr: Reference to original sys.stderr for restoration.
32
- log_queue (queue.Queue): Thread-safe queue for buffering log messages.
21
+ destination (str | Path | None): Target destination for streaming (URL, Path, or None for callback-only).
22
+ batch_size (int): Number of lines to batch before flushing (default: 1 for immediate).
23
+ flush_interval (float): Seconds between automatic flushes (default: 5.0).
24
+ on_flush (callable | None): Optional callback function called with batched content on flush.
33
25
  active (bool): Whether console capture is currently active.
34
- worker_thread (threading.Thread): Background thread for processing log queue.
35
- last_line (str): Last processed line for deduplication.
36
- last_time (float): Timestamp of last processed line.
37
- last_progress_line (str): Last progress bar line for progress deduplication.
38
- last_was_progress (bool): Whether the last line was a progress bar.
39
26
 
40
27
  Examples:
41
- Basic file logging:
28
+ File logging (immediate):
42
29
  >>> logger = ConsoleLogger("training.log")
43
30
  >>> logger.start_capture()
44
31
  >>> print("This will be logged")
45
32
  >>> logger.stop_capture()
46
33
 
47
- API streaming:
48
- >>> logger = ConsoleLogger("https://api.example.com/logs")
34
+ API streaming with batching:
35
+ >>> logger = ConsoleLogger("https://api.example.com/logs", batch_size=10)
36
+ >>> logger.start_capture()
37
+
38
+ Custom callback with batching:
39
+ >>> def my_handler(content, line_count, chunk_id):
40
+ ... print(f"Received {line_count} lines")
41
+ >>> logger = ConsoleLogger(on_flush=my_handler, batch_size=5)
49
42
  >>> logger.start_capture()
50
- >>> # All output streams to API
51
- >>> logger.stop_capture()
52
43
  """
53
44
 
54
- def __init__(self, destination):
55
- """Initialize with API endpoint or local file path.
45
+ def __init__(self, destination=None, batch_size=1, flush_interval=5.0, on_flush=None):
46
+ """Initialize console logger with optional batching.
56
47
 
57
48
  Args:
58
- destination (str | Path): API endpoint URL (http/https) or local file path for streaming output.
49
+ destination (str | Path | None): API endpoint URL (http/https), local file path, or None.
50
+ batch_size (int): Lines to accumulate before flush (1 = immediate, higher = batched).
51
+ flush_interval (float): Max seconds between flushes when batching.
52
+ on_flush (callable | None): Callback(content: str, line_count: int, chunk_id: int) for custom handling.
59
53
  """
60
54
  self.destination = destination
61
55
  self.is_api = isinstance(destination, str) and destination.startswith(("http://", "https://"))
62
- if not self.is_api:
56
+ if destination is not None and not self.is_api:
63
57
  self.destination = Path(destination)
64
58
 
65
- # Console capture
59
+ # Batching configuration
60
+ self.batch_size = max(1, batch_size)
61
+ self.flush_interval = flush_interval
62
+ self.on_flush = on_flush
63
+
64
+ # Console capture state
66
65
  self.original_stdout = sys.stdout
67
66
  self.original_stderr = sys.stderr
68
- self.log_queue = queue.Queue(maxsize=1000)
69
67
  self.active = False
70
- self.worker_thread = None
68
+ self._log_handler = None # Track handler for cleanup
69
+
70
+ # Buffer for batching
71
+ self.buffer = []
72
+ self.buffer_lock = threading.Lock()
73
+ self.flush_thread = None
74
+ self.chunk_id = 0
71
75
 
72
- # State tracking
76
+ # Deduplication state
73
77
  self.last_line = ""
74
78
  self.last_time = 0.0
75
- self.last_progress_line = "" # Track last progress line for deduplication
79
+ self.last_progress_line = "" # Track progress sequence key for deduplication
76
80
  self.last_was_progress = False # Track if last line was a progress bar
77
81
 
78
82
  def start_capture(self):
79
- """Start capturing console output and redirect stdout/stderr to custom capture objects."""
80
- if self.active:
83
+ """Start capturing console output and redirect stdout/stderr.
84
+
85
+ Notes:
86
+ In DDP training, only activates on rank 0/-1 to prevent duplicate logging.
87
+ """
88
+ if self.active or RANK not in {-1, 0}:
81
89
  return
82
90
 
83
91
  self.active = True
@@ -86,23 +94,35 @@ class ConsoleLogger:
86
94
 
87
95
  # Hook Ultralytics logger
88
96
  try:
89
- handler = self._LogHandler(self._queue_log)
90
- logging.getLogger("ultralytics").addHandler(handler)
97
+ self._log_handler = self._LogHandler(self._queue_log)
98
+ logging.getLogger("ultralytics").addHandler(self._log_handler)
91
99
  except Exception:
92
100
  pass
93
101
 
94
- self.worker_thread = threading.Thread(target=self._stream_worker, daemon=True)
95
- self.worker_thread.start()
102
+ # Start background flush thread for batched mode
103
+ if self.batch_size > 1:
104
+ self.flush_thread = threading.Thread(target=self._flush_worker, daemon=True)
105
+ self.flush_thread.start()
96
106
 
97
107
  def stop_capture(self):
98
- """Stop capturing console output and restore original stdout/stderr."""
108
+ """Stop capturing console output and flush remaining buffer."""
99
109
  if not self.active:
100
110
  return
101
111
 
102
112
  self.active = False
103
113
  sys.stdout = self.original_stdout
104
114
  sys.stderr = self.original_stderr
105
- self.log_queue.put(None)
115
+
116
+ # Remove logging handler to prevent memory leak
117
+ if self._log_handler:
118
+ try:
119
+ logging.getLogger("ultralytics").removeHandler(self._log_handler)
120
+ except Exception:
121
+ pass
122
+ self._log_handler = None
123
+
124
+ # Final flush
125
+ self._flush_buffer()
106
126
 
107
127
  def _queue_log(self, text):
108
128
  """Queue console text with deduplication and timestamp processing."""
@@ -126,12 +146,34 @@ class ConsoleLogger:
126
146
  if "─" in line: # Has thin lines but no thick lines
127
147
  continue
128
148
 
129
- # Deduplicate completed progress bars only if they match the previous progress line
149
+ # Only show 100% completion lines for progress bars
130
150
  if " ━━" in line:
131
- progress_core = line.split(" ━━")[0].strip()
132
- if progress_core == self.last_progress_line and self.last_was_progress:
151
+ is_complete = "100%" in line
152
+
153
+ # Skip ALL non-complete progress lines
154
+ if not is_complete:
155
+ continue
156
+
157
+ # Extract sequence key to deduplicate multiple 100% lines for same sequence
158
+ parts = line.split()
159
+ seq_key = ""
160
+ if parts:
161
+ # Check for epoch pattern (X/Y at start)
162
+ if "/" in parts[0] and parts[0].replace("/", "").isdigit():
163
+ seq_key = parts[0] # e.g., "1/3"
164
+ elif parts[0] == "Class" and len(parts) > 1:
165
+ seq_key = f"{parts[0]}_{parts[1]}" # e.g., "Class_train:" or "Class_val:"
166
+ elif parts[0] in ("train:", "val:"):
167
+ seq_key = parts[0] # Phase identifier
168
+
169
+ # Skip if we already showed 100% for this sequence
170
+ if seq_key and self.last_progress_line == f"{seq_key}:done":
133
171
  continue
134
- self.last_progress_line = progress_core
172
+
173
+ # Mark this sequence as done
174
+ if seq_key:
175
+ self.last_progress_line = f"{seq_key}:done"
176
+
135
177
  self.last_was_progress = True
136
178
  else:
137
179
  # Skip empty line after progress bar
@@ -152,48 +194,62 @@ class ConsoleLogger:
152
194
  timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
153
195
  line = f"[{timestamp}] {line}"
154
196
 
155
- # Queue with overflow protection
156
- if not self._safe_put(f"{line}\n"):
157
- continue # Skip if queue handling fails
197
+ # Add to buffer and check if flush needed
198
+ should_flush = False
199
+ with self.buffer_lock:
200
+ self.buffer.append(line)
201
+ if len(self.buffer) >= self.batch_size:
202
+ should_flush = True
158
203
 
159
- def _safe_put(self, item):
160
- """Safely put item in queue with overflow handling."""
161
- try:
162
- self.log_queue.put_nowait(item)
163
- return True
164
- except queue.Full:
165
- try:
166
- self.log_queue.get_nowait() # Drop oldest
167
- self.log_queue.put_nowait(item)
168
- return True
169
- except queue.Empty:
170
- return False
171
-
172
- def _stream_worker(self):
173
- """Background worker for streaming logs to destination."""
204
+ # Flush outside lock to avoid deadlock
205
+ if should_flush:
206
+ self._flush_buffer()
207
+
208
+ def _flush_worker(self):
209
+ """Background worker that flushes buffer periodically."""
174
210
  while self.active:
211
+ time.sleep(self.flush_interval)
212
+ if self.active:
213
+ self._flush_buffer()
214
+
215
+ def _flush_buffer(self):
216
+ """Flush buffered lines to destination and/or callback."""
217
+ with self.buffer_lock:
218
+ if not self.buffer:
219
+ return
220
+ lines = self.buffer.copy()
221
+ self.buffer.clear()
222
+ self.chunk_id += 1
223
+ chunk_id = self.chunk_id # Capture under lock to avoid race
224
+
225
+ content = "\n".join(lines)
226
+ line_count = len(lines)
227
+
228
+ # Call custom callback if provided
229
+ if self.on_flush:
175
230
  try:
176
- log_text = self.log_queue.get(timeout=1)
177
- if log_text is None:
178
- break
179
- self._write_log(log_text)
180
- except queue.Empty:
181
- continue
231
+ self.on_flush(content, line_count, chunk_id)
232
+ except Exception:
233
+ pass # Silently ignore callback errors to avoid flooding stderr
234
+
235
+ # Write to destination (file or API)
236
+ if self.destination is not None:
237
+ self._write_destination(content)
182
238
 
183
- def _write_log(self, text):
184
- """Write log to API endpoint or local file destination."""
239
+ def _write_destination(self, content):
240
+ """Write content to file or API destination."""
185
241
  try:
186
242
  if self.is_api:
187
- import requests # scoped as slow import
243
+ import requests
188
244
 
189
- payload = {"timestamp": datetime.now().isoformat(), "message": text.strip()}
245
+ payload = {"timestamp": datetime.now().isoformat(), "message": content}
190
246
  requests.post(str(self.destination), json=payload, timeout=5)
191
247
  else:
192
248
  self.destination.parent.mkdir(parents=True, exist_ok=True)
193
249
  with self.destination.open("a", encoding="utf-8") as f:
194
- f.write(text)
250
+ f.write(content + "\n")
195
251
  except Exception as e:
196
- print(f"Platform logging error: {e}", file=self.original_stderr)
252
+ print(f"Console logger write error: {e}", file=self.original_stderr)
197
253
 
198
254
  class _ConsoleCapture:
199
255
  """Lightweight stdout/stderr capture."""
@@ -498,7 +498,7 @@ class v8PoseLoss(v8DetectionLoss):
498
498
 
499
499
  def __call__(self, preds: Any, batch: dict[str, torch.Tensor]) -> tuple[torch.Tensor, torch.Tensor]:
500
500
  """Calculate the total loss and detach it for pose estimation."""
501
- loss = torch.zeros(5, device=self.device) # box, cls, dfl, kpt_location, kpt_visibility
501
+ loss = torch.zeros(5, device=self.device) # box, pose, kobj, cls, dfl
502
502
  feats, pred_kpts = preds if isinstance(preds[0], list) else preds[1]
503
503
  pred_distri, pred_scores = torch.cat([xi.view(feats[0].shape[0], self.no, -1) for xi in feats], 2).split(
504
504
  (self.reg_max * 4, self.nc), 1
@@ -560,7 +560,7 @@ class v8PoseLoss(v8DetectionLoss):
560
560
  loss[3] *= self.hyp.cls # cls gain
561
561
  loss[4] *= self.hyp.dfl # dfl gain
562
562
 
563
- return loss * batch_size, loss.detach() # loss(box, cls, dfl)
563
+ return loss * batch_size, loss.detach() # loss(box, pose, kobj, cls, dfl)
564
564
 
565
565
  @staticmethod
566
566
  def kpts_decode(anchor_points: torch.Tensor, pred_kpts: torch.Tensor) -> torch.Tensor:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ultralytics-opencv-headless
3
- Version: 8.3.242
3
+ Version: 8.3.243
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>
@@ -50,7 +50,7 @@ Requires-Dist: ipython; extra == "dev"
50
50
  Requires-Dist: pytest; extra == "dev"
51
51
  Requires-Dist: pytest-cov; extra == "dev"
52
52
  Requires-Dist: coverage[toml]; extra == "dev"
53
- Requires-Dist: zensical>=0.0.9; python_version >= "3.10" and extra == "dev"
53
+ Requires-Dist: zensical>=0.0.15; python_version >= "3.10" and extra == "dev"
54
54
  Requires-Dist: mkdocs-ultralytics-plugin>=0.2.4; extra == "dev"
55
55
  Requires-Dist: minijinja>=2.0.0; extra == "dev"
56
56
  Provides-Extra: export