dgenerate-ultralytics-headless 8.3.179__tar.gz → 8.3.181__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (278) hide show
  1. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/PKG-INFO +1 -1
  2. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/dgenerate_ultralytics_headless.egg-info/PKG-INFO +1 -1
  3. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/__init__.py +1 -1
  4. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/VOC.yaml +1 -1
  5. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/VisDrone.yaml +1 -1
  6. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/data/loaders.py +4 -3
  7. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/data/utils.py +1 -3
  8. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/sam/modules/blocks.py +7 -4
  9. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/sam/modules/decoders.py +1 -1
  10. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/sam/modules/encoders.py +8 -8
  11. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/sam/modules/sam.py +5 -8
  12. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/sam/modules/utils.py +1 -1
  13. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/sam/predict.py +156 -95
  14. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/detect/val.py +17 -9
  15. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/model.py +5 -3
  16. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/obb/val.py +9 -3
  17. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/pose/val.py +13 -6
  18. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/segment/val.py +12 -7
  19. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/yoloe/predict.py +3 -3
  20. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/nn/modules/block.py +1 -3
  21. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/solutions/streamlit_inference.py +10 -3
  22. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/downloads.py +5 -3
  23. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/LICENSE +0 -0
  24. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/README.md +0 -0
  25. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/dgenerate_ultralytics_headless.egg-info/SOURCES.txt +0 -0
  26. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/dgenerate_ultralytics_headless.egg-info/dependency_links.txt +0 -0
  27. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/dgenerate_ultralytics_headless.egg-info/entry_points.txt +0 -0
  28. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/dgenerate_ultralytics_headless.egg-info/requires.txt +0 -0
  29. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/dgenerate_ultralytics_headless.egg-info/top_level.txt +0 -0
  30. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/pyproject.toml +0 -0
  31. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/setup.cfg +0 -0
  32. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/tests/__init__.py +0 -0
  33. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/tests/conftest.py +0 -0
  34. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/tests/test_cli.py +0 -0
  35. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/tests/test_cuda.py +0 -0
  36. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/tests/test_engine.py +0 -0
  37. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/tests/test_exports.py +0 -0
  38. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/tests/test_integrations.py +0 -0
  39. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/tests/test_python.py +0 -0
  40. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/tests/test_solutions.py +0 -0
  41. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/assets/bus.jpg +0 -0
  42. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/assets/zidane.jpg +0 -0
  43. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/__init__.py +0 -0
  44. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
  45. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
  46. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
  47. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
  48. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/HomeObjects-3K.yaml +0 -0
  49. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
  50. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
  51. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
  52. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
  53. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
  54. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
  55. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
  56. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/coco.yaml +0 -0
  57. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
  58. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/coco128.yaml +0 -0
  59. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/coco8-grayscale.yaml +0 -0
  60. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/coco8-multispectral.yaml +0 -0
  61. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
  62. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
  63. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/coco8.yaml +0 -0
  64. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
  65. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/dog-pose.yaml +0 -0
  66. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/dota8-multispectral.yaml +0 -0
  67. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/dota8.yaml +0 -0
  68. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/hand-keypoints.yaml +0 -0
  69. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/lvis.yaml +0 -0
  70. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/medical-pills.yaml +0 -0
  71. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
  72. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
  73. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/signature.yaml +0 -0
  74. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
  75. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/datasets/xView.yaml +0 -0
  76. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/default.yaml +0 -0
  77. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/11/yolo11-cls-resnet18.yaml +0 -0
  78. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/11/yolo11-cls.yaml +0 -0
  79. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/11/yolo11-obb.yaml +0 -0
  80. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/11/yolo11-pose.yaml +0 -0
  81. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/11/yolo11-seg.yaml +0 -0
  82. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/11/yolo11.yaml +0 -0
  83. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/11/yoloe-11-seg.yaml +0 -0
  84. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/11/yoloe-11.yaml +0 -0
  85. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/12/yolo12-cls.yaml +0 -0
  86. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/12/yolo12-obb.yaml +0 -0
  87. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/12/yolo12-pose.yaml +0 -0
  88. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/12/yolo12-seg.yaml +0 -0
  89. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/12/yolo12.yaml +0 -0
  90. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
  91. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
  92. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
  93. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
  94. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v10/yolov10b.yaml +0 -0
  95. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v10/yolov10l.yaml +0 -0
  96. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v10/yolov10m.yaml +0 -0
  97. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v10/yolov10n.yaml +0 -0
  98. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v10/yolov10s.yaml +0 -0
  99. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v10/yolov10x.yaml +0 -0
  100. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
  101. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
  102. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
  103. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
  104. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
  105. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
  106. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v8/yoloe-v8-seg.yaml +0 -0
  107. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v8/yoloe-v8.yaml +0 -0
  108. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
  109. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
  110. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
  111. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
  112. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
  113. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
  114. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
  115. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
  116. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
  117. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
  118. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
  119. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
  120. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
  121. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
  122. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
  123. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
  124. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
  125. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
  126. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
  127. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
  128. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
  129. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v9/yolov9m.yaml +0 -0
  130. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v9/yolov9s.yaml +0 -0
  131. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/models/v9/yolov9t.yaml +0 -0
  132. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/trackers/botsort.yaml +0 -0
  133. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
  134. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/data/__init__.py +0 -0
  135. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/data/annotator.py +0 -0
  136. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/data/augment.py +0 -0
  137. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/data/base.py +0 -0
  138. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/data/build.py +0 -0
  139. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/data/converter.py +0 -0
  140. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/data/dataset.py +0 -0
  141. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/data/scripts/download_weights.sh +0 -0
  142. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/data/scripts/get_coco.sh +0 -0
  143. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/data/scripts/get_coco128.sh +0 -0
  144. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/data/scripts/get_imagenet.sh +0 -0
  145. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/data/split.py +0 -0
  146. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/data/split_dota.py +0 -0
  147. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/engine/__init__.py +0 -0
  148. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/engine/exporter.py +0 -0
  149. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/engine/model.py +0 -0
  150. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/engine/predictor.py +0 -0
  151. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/engine/results.py +0 -0
  152. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/engine/trainer.py +0 -0
  153. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/engine/tuner.py +0 -0
  154. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/engine/validator.py +0 -0
  155. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/hub/__init__.py +0 -0
  156. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/hub/auth.py +0 -0
  157. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/hub/google/__init__.py +0 -0
  158. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/hub/session.py +0 -0
  159. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/hub/utils.py +0 -0
  160. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/__init__.py +0 -0
  161. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/fastsam/__init__.py +0 -0
  162. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/fastsam/model.py +0 -0
  163. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/fastsam/predict.py +0 -0
  164. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/fastsam/utils.py +0 -0
  165. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/fastsam/val.py +0 -0
  166. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/nas/__init__.py +0 -0
  167. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/nas/model.py +0 -0
  168. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/nas/predict.py +0 -0
  169. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/nas/val.py +0 -0
  170. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/rtdetr/__init__.py +0 -0
  171. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/rtdetr/model.py +0 -0
  172. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/rtdetr/predict.py +0 -0
  173. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/rtdetr/train.py +0 -0
  174. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/rtdetr/val.py +0 -0
  175. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/sam/__init__.py +0 -0
  176. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/sam/amg.py +0 -0
  177. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/sam/build.py +0 -0
  178. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/sam/model.py +0 -0
  179. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/sam/modules/__init__.py +0 -0
  180. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/sam/modules/memory_attention.py +0 -0
  181. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
  182. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/sam/modules/transformer.py +0 -0
  183. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/utils/__init__.py +0 -0
  184. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/utils/loss.py +0 -0
  185. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/utils/ops.py +0 -0
  186. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/__init__.py +0 -0
  187. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/classify/__init__.py +0 -0
  188. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/classify/predict.py +0 -0
  189. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/classify/train.py +0 -0
  190. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/classify/val.py +0 -0
  191. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/detect/__init__.py +0 -0
  192. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/detect/predict.py +0 -0
  193. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/detect/train.py +0 -0
  194. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/obb/__init__.py +0 -0
  195. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/obb/predict.py +0 -0
  196. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/obb/train.py +0 -0
  197. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/pose/__init__.py +0 -0
  198. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/pose/predict.py +0 -0
  199. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/pose/train.py +0 -0
  200. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/segment/__init__.py +0 -0
  201. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/segment/predict.py +0 -0
  202. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/segment/train.py +0 -0
  203. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/world/__init__.py +0 -0
  204. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/world/train.py +0 -0
  205. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/world/train_world.py +0 -0
  206. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/yoloe/__init__.py +0 -0
  207. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/yoloe/train.py +0 -0
  208. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/yoloe/train_seg.py +0 -0
  209. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/models/yolo/yoloe/val.py +0 -0
  210. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/nn/__init__.py +0 -0
  211. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/nn/autobackend.py +0 -0
  212. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/nn/modules/__init__.py +0 -0
  213. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/nn/modules/activation.py +0 -0
  214. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/nn/modules/conv.py +0 -0
  215. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/nn/modules/head.py +0 -0
  216. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/nn/modules/transformer.py +0 -0
  217. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/nn/modules/utils.py +0 -0
  218. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/nn/tasks.py +0 -0
  219. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/nn/text_model.py +0 -0
  220. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/solutions/__init__.py +0 -0
  221. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/solutions/ai_gym.py +0 -0
  222. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/solutions/analytics.py +0 -0
  223. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/solutions/config.py +0 -0
  224. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/solutions/distance_calculation.py +0 -0
  225. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/solutions/heatmap.py +0 -0
  226. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/solutions/instance_segmentation.py +0 -0
  227. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/solutions/object_blurrer.py +0 -0
  228. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/solutions/object_counter.py +0 -0
  229. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/solutions/object_cropper.py +0 -0
  230. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/solutions/parking_management.py +0 -0
  231. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/solutions/queue_management.py +0 -0
  232. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/solutions/region_counter.py +0 -0
  233. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/solutions/security_alarm.py +0 -0
  234. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/solutions/similarity_search.py +0 -0
  235. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/solutions/solutions.py +0 -0
  236. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/solutions/speed_estimation.py +0 -0
  237. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/solutions/templates/similarity-search.html +0 -0
  238. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/solutions/trackzone.py +0 -0
  239. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/solutions/vision_eye.py +0 -0
  240. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/trackers/__init__.py +0 -0
  241. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/trackers/basetrack.py +0 -0
  242. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/trackers/bot_sort.py +0 -0
  243. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/trackers/byte_tracker.py +0 -0
  244. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/trackers/track.py +0 -0
  245. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/trackers/utils/__init__.py +0 -0
  246. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/trackers/utils/gmc.py +0 -0
  247. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/trackers/utils/kalman_filter.py +0 -0
  248. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/trackers/utils/matching.py +0 -0
  249. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/__init__.py +0 -0
  250. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/autobatch.py +0 -0
  251. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/autodevice.py +0 -0
  252. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/benchmarks.py +0 -0
  253. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/callbacks/__init__.py +0 -0
  254. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/callbacks/base.py +0 -0
  255. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/callbacks/clearml.py +0 -0
  256. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/callbacks/comet.py +0 -0
  257. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/callbacks/dvc.py +0 -0
  258. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/callbacks/hub.py +0 -0
  259. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/callbacks/mlflow.py +0 -0
  260. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/callbacks/neptune.py +0 -0
  261. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/callbacks/raytune.py +0 -0
  262. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/callbacks/tensorboard.py +0 -0
  263. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/callbacks/wb.py +0 -0
  264. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/checks.py +0 -0
  265. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/dist.py +0 -0
  266. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/errors.py +0 -0
  267. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/export.py +0 -0
  268. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/files.py +0 -0
  269. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/instance.py +0 -0
  270. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/loss.py +0 -0
  271. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/metrics.py +0 -0
  272. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/ops.py +0 -0
  273. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/patches.py +0 -0
  274. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/plotting.py +0 -0
  275. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/tal.py +0 -0
  276. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/torch_utils.py +0 -0
  277. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/triton.py +0 -0
  278. {dgenerate_ultralytics_headless-8.3.179 → dgenerate_ultralytics_headless-8.3.181}/ultralytics/utils/tuner.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dgenerate-ultralytics-headless
3
- Version: 8.3.179
3
+ Version: 8.3.181
4
4
  Summary: Automatically built Ultralytics package with python-opencv-headless dependency instead of python-opencv
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
  Metadata-Version: 2.4
2
2
  Name: dgenerate-ultralytics-headless
3
- Version: 8.3.179
3
+ Version: 8.3.181
4
4
  Summary: Automatically built Ultralytics package with python-opencv-headless dependency instead of python-opencv
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.179"
3
+ __version__ = "8.3.181"
4
4
 
5
5
  import os
6
6
 
@@ -87,7 +87,7 @@ download: |
87
87
  f"{url}VOCtest_06-Nov-2007.zip", # 438MB, 4953 images
88
88
  f"{url}VOCtrainval_11-May-2012.zip", # 1.95GB, 17126 images
89
89
  ]
90
- download(urls, dir=dir / "images", curl=True, threads=3, exist_ok=True) # download and unzip over existing (required)
90
+ download(urls, dir=dir / "images", threads=3, exist_ok=True) # download and unzip over existing (required)
91
91
 
92
92
  # Convert
93
93
  path = dir / "images/VOCdevkit"
@@ -78,7 +78,7 @@ download: |
78
78
  "https://github.com/ultralytics/assets/releases/download/v0.0.0/VisDrone2019-DET-test-dev.zip",
79
79
  # "https://github.com/ultralytics/assets/releases/download/v0.0.0/VisDrone2019-DET-test-challenge.zip",
80
80
  ]
81
- download(urls, dir=dir, curl=True, threads=4)
81
+ download(urls, dir=dir, threads=4)
82
82
 
83
83
  # Convert
84
84
  splits = {"VisDrone2019-DET-train": "train", "VisDrone2019-DET-val": "val", "VisDrone2019-DET-test-dev": "test"}
@@ -355,9 +355,10 @@ class LoadImagesAndVideos:
355
355
  channels (int): Number of image channels (1 for grayscale, 3 for RGB).
356
356
  """
357
357
  parent = None
358
- if isinstance(path, str) and Path(path).suffix == ".txt": # *.txt file with img/vid/dir on each line
359
- parent = Path(path).parent
360
- path = Path(path).read_text().splitlines() # list of sources
358
+ if isinstance(path, str) and Path(path).suffix in {".txt", ".csv"}: # txt/csv file with source paths
359
+ parent, content = Path(path).parent, Path(path).read_text()
360
+ path = content.splitlines() if Path(path).suffix == ".txt" else content.split(",") # list of sources
361
+ path = [p.strip() for p in path]
361
362
  files = []
362
363
  for p in sorted(path) if isinstance(path, (list, tuple)) else [path]:
363
364
  a = str(Path(p).absolute()) # do not use .resolve() https://github.com/ultralytics/ultralytics/issues/2912
@@ -219,9 +219,7 @@ def verify_image_label(args: Tuple) -> List:
219
219
  assert lb.min() >= -0.01, f"negative class labels {lb[lb < -0.01]}"
220
220
 
221
221
  # All labels
222
- if single_cls:
223
- lb[:, 0] = 0
224
- max_cls = lb[:, 0].max() # max label count
222
+ max_cls = 0 if single_cls else lb[:, 0].max() # max label count
225
223
  assert max_cls < num_cls, (
226
224
  f"Label class {int(max_cls)} exceeds dataset class count {num_cls}. "
227
225
  f"Possible class labels are 0-{num_cls - 1}"
@@ -3,7 +3,7 @@
3
3
  import copy
4
4
  import math
5
5
  from functools import partial
6
- from typing import Any, Optional, Tuple, Type, Union
6
+ from typing import Optional, Tuple, Type, Union
7
7
 
8
8
  import numpy as np
9
9
  import torch
@@ -856,8 +856,11 @@ class PositionEmbeddingRandom(nn.Module):
856
856
  def forward(self, size: Tuple[int, int]) -> torch.Tensor:
857
857
  """Generate positional encoding for a grid using random spatial frequencies."""
858
858
  h, w = size
859
- device: Any = self.positional_encoding_gaussian_matrix.device
860
- grid = torch.ones((h, w), device=device, dtype=torch.float32)
859
+ grid = torch.ones(
860
+ (h, w),
861
+ device=self.positional_encoding_gaussian_matrix.device,
862
+ dtype=self.positional_encoding_gaussian_matrix.dtype,
863
+ )
861
864
  y_embed = grid.cumsum(dim=0) - 0.5
862
865
  x_embed = grid.cumsum(dim=1) - 0.5
863
866
  y_embed = y_embed / h
@@ -871,7 +874,7 @@ class PositionEmbeddingRandom(nn.Module):
871
874
  coords = coords_input.clone()
872
875
  coords[:, :, 0] = coords[:, :, 0] / image_size[1]
873
876
  coords[:, :, 1] = coords[:, :, 1] / image_size[0]
874
- return self._pe_encoding(coords.to(torch.float)) # B x N x C
877
+ return self._pe_encoding(coords) # B x N x C
875
878
 
876
879
 
877
880
  class Block(nn.Module):
@@ -423,7 +423,7 @@ class SAM2MaskDecoder(nn.Module):
423
423
 
424
424
  # Upscale mask embeddings and predict masks using the mask tokens
425
425
  src = src.transpose(1, 2).view(b, c, h, w)
426
- if not self.use_high_res_features:
426
+ if not self.use_high_res_features or high_res_features is None:
427
427
  upscaled_embedding = self.output_upscaling(src)
428
428
  else:
429
429
  dc1, ln1, act1, dc2, act2 = self.output_upscaling
@@ -258,8 +258,8 @@ class PromptEncoder(nn.Module):
258
258
  """Embed point prompts by applying positional encoding and label-specific embeddings."""
259
259
  points = points + 0.5 # Shift to center of pixel
260
260
  if pad:
261
- padding_point = torch.zeros((points.shape[0], 1, 2), device=points.device)
262
- padding_label = -torch.ones((labels.shape[0], 1), device=labels.device)
261
+ padding_point = torch.zeros((points.shape[0], 1, 2), dtype=points.dtype, device=points.device)
262
+ padding_label = -torch.ones((labels.shape[0], 1), dtype=labels.dtype, device=labels.device)
263
263
  points = torch.cat([points, padding_point], dim=1)
264
264
  labels = torch.cat([labels, padding_label], dim=1)
265
265
  point_embedding = self.pe_layer.forward_with_coords(points, self.input_image_size)
@@ -300,10 +300,6 @@ class PromptEncoder(nn.Module):
300
300
  else:
301
301
  return 1
302
302
 
303
- def _get_device(self) -> torch.device:
304
- """Return the device of the first point embedding's weight tensor."""
305
- return self.point_embeddings[0].weight.device
306
-
307
303
  def forward(
308
304
  self,
309
305
  points: Optional[Tuple[torch.Tensor, torch.Tensor]],
@@ -334,7 +330,11 @@ class PromptEncoder(nn.Module):
334
330
  torch.Size([1, 7, 256]) torch.Size([1, 256, 64, 64])
335
331
  """
336
332
  bs = self._get_batch_size(points, boxes, masks)
337
- sparse_embeddings = torch.empty((bs, 0, self.embed_dim), device=self._get_device())
333
+ sparse_embeddings = torch.empty(
334
+ (bs, 0, self.embed_dim),
335
+ dtype=self.point_embeddings[0].weight.dtype,
336
+ device=self.point_embeddings[0].weight.device,
337
+ )
338
338
  if points is not None:
339
339
  coords, labels = points
340
340
  point_embeddings = self._embed_points(coords, labels, pad=(boxes is None))
@@ -637,7 +637,7 @@ class FpnNeck(nn.Module):
637
637
  lateral_features = self.convs[n - i](x)
638
638
  if i in self.fpn_top_down_levels and prev_features is not None:
639
639
  top_down_features = F.interpolate(
640
- prev_features.to(dtype=torch.float32),
640
+ prev_features.to(dtype=x.dtype),
641
641
  scale_factor=2.0,
642
642
  mode=self.fpn_interp_model,
643
643
  align_corners=(None if self.fpn_interp_model == "nearest" else False),
@@ -488,7 +488,7 @@ class SAM2Model(torch.nn.Module):
488
488
  assert sam_point_coords.size(0) == B and sam_point_labels.size(0) == B
489
489
  else:
490
490
  # If no points are provide, pad with an empty point (with label -1)
491
- sam_point_coords = torch.zeros(B, 1, 2, device=device)
491
+ sam_point_coords = torch.zeros(B, 1, 2, device=device, dtype=backbone_features.dtype)
492
492
  sam_point_labels = -torch.ones(B, 1, dtype=torch.int32, device=device)
493
493
 
494
494
  # b) Handle mask prompts
@@ -533,7 +533,6 @@ class SAM2Model(torch.nn.Module):
533
533
 
534
534
  # convert masks from possibly bfloat16 (or float16) to float32
535
535
  # (older PyTorch versions before 2.1 don't support `interpolate` on bf16)
536
- low_res_multimasks = low_res_multimasks.float()
537
536
  high_res_multimasks = F.interpolate(
538
537
  low_res_multimasks,
539
538
  size=(self.image_size, self.image_size),
@@ -560,12 +559,11 @@ class SAM2Model(torch.nn.Module):
560
559
  if self.soft_no_obj_ptr:
561
560
  lambda_is_obj_appearing = object_score_logits.sigmoid()
562
561
  else:
563
- lambda_is_obj_appearing = is_obj_appearing.float()
562
+ lambda_is_obj_appearing = is_obj_appearing.to(obj_ptr.dtype)
564
563
 
565
564
  if self.fixed_no_obj_ptr:
566
565
  obj_ptr = lambda_is_obj_appearing * obj_ptr
567
566
  obj_ptr = obj_ptr + (1 - lambda_is_obj_appearing) * self.no_obj_ptr
568
-
569
567
  return (
570
568
  low_res_multimasks,
571
569
  high_res_multimasks,
@@ -769,7 +767,7 @@ class SAM2Model(torch.nn.Module):
769
767
  if self.add_tpos_enc_to_obj_ptrs:
770
768
  t_diff_max = max_obj_ptrs_in_encoder - 1
771
769
  tpos_dim = C if self.proj_tpos_enc_in_obj_ptrs else self.mem_dim
772
- obj_pos = torch.tensor(pos_list, device=device)
770
+ obj_pos = torch.tensor(pos_list, device=device, dtype=current_vision_feats[-1].dtype)
773
771
  obj_pos = get_1d_sine_pe(obj_pos / t_diff_max, dim=tpos_dim)
774
772
  obj_pos = self.obj_ptr_tpos_proj(obj_pos)
775
773
  obj_pos = obj_pos.unsqueeze(1).expand(-1, B, self.mem_dim)
@@ -834,7 +832,7 @@ class SAM2Model(torch.nn.Module):
834
832
  # scale the raw mask logits with a temperature before applying sigmoid
835
833
  binarize = self.binarize_mask_from_pts_for_mem_enc and is_mask_from_pts
836
834
  if binarize and not self.training:
837
- mask_for_mem = (pred_masks_high_res > 0).float()
835
+ mask_for_mem = (pred_masks_high_res > 0).to(pix_feat.dtype)
838
836
  else:
839
837
  # apply sigmoid on the raw mask logits to turn them into range (0, 1)
840
838
  mask_for_mem = torch.sigmoid(pred_masks_high_res)
@@ -927,11 +925,10 @@ class SAM2Model(torch.nn.Module):
927
925
  ):
928
926
  """Run memory encoder on predicted mask to encode it into a new memory feature for future frames."""
929
927
  if run_mem_encoder and self.num_maskmem > 0:
930
- high_res_masks_for_mem_enc = high_res_masks
931
928
  maskmem_features, maskmem_pos_enc = self._encode_new_memory(
932
929
  current_vision_feats=current_vision_feats,
933
930
  feat_sizes=feat_sizes,
934
- pred_masks_high_res=high_res_masks_for_mem_enc,
931
+ pred_masks_high_res=high_res_masks,
935
932
  object_score_logits=object_score_logits,
936
933
  is_mask_from_pts=(point_inputs is not None),
937
934
  )
@@ -78,7 +78,7 @@ def get_1d_sine_pe(pos_inds: torch.Tensor, dim: int, temperature: float = 10000)
78
78
  torch.Size([4, 128])
79
79
  """
80
80
  pe_dim = dim // 2
81
- dim_t = torch.arange(pe_dim, dtype=torch.float32, device=pos_inds.device)
81
+ dim_t = torch.arange(pe_dim, dtype=pos_inds.dtype, device=pos_inds.device)
82
82
  dim_t = temperature ** (2 * (dim_t // 2) / pe_dim)
83
83
 
84
84
  pos_embed = pos_inds.unsqueeze(-1) / dim_t
@@ -132,9 +132,9 @@ class Predictor(BasePredictor):
132
132
  im = torch.from_numpy(im)
133
133
 
134
134
  im = im.to(self.device)
135
- im = im.half() if self.model.fp16 else im.float()
136
135
  if not_tensor:
137
136
  im = (im - self.mean) / self.std
137
+ im = im.half() if self.model.fp16 else im.float()
138
138
  return im
139
139
 
140
140
  def pre_transform(self, im):
@@ -182,9 +182,8 @@ class Predictor(BasePredictor):
182
182
  **kwargs (Any): Additional keyword arguments.
183
183
 
184
184
  Returns:
185
- pred_masks (np.ndarray): The output masks in shape (C, H, W), where C is the number of generated masks.
186
- pred_scores (np.ndarray): An array of length C containing quality scores predicted by the model for each mask.
187
- pred_logits (np.ndarray): Low-resolution logits of shape (C, H, W) for subsequent inference, where H=W=256.
185
+ pred_masks (torch.Tensor): The output masks in shape (C, H, W), where C is the number of generated masks.
186
+ pred_scores (torch.Tensor): An array of length C containing quality scores predicted by the model for each mask.
188
187
 
189
188
  Examples:
190
189
  >>> predictor = Predictor()
@@ -219,8 +218,8 @@ class Predictor(BasePredictor):
219
218
  multimask_output (bool): Flag to return multiple masks for ambiguous prompts.
220
219
 
221
220
  Returns:
222
- pred_masks (np.ndarray): Output masks with shape (C, H, W), where C is the number of generated masks.
223
- pred_scores (np.ndarray): Quality scores predicted by the model for each mask, with length C.
221
+ pred_masks (torch.Tensor): Output masks with shape (C, H, W), where C is the number of generated masks.
222
+ pred_scores (torch.Tensor): Quality scores predicted by the model for each mask, with length C.
224
223
 
225
224
  Examples:
226
225
  >>> predictor = Predictor()
@@ -230,7 +229,33 @@ class Predictor(BasePredictor):
230
229
  """
231
230
  features = self.get_im_features(im) if self.features is None else self.features
232
231
 
233
- bboxes, points, labels, masks = self._prepare_prompts(im.shape[2:], bboxes, points, labels, masks)
232
+ prompts = self._prepare_prompts(im.shape[2:], self.batch[1][0].shape[:2], bboxes, points, labels, masks)
233
+ return self._inference_features(features, *prompts, multimask_output)
234
+
235
+ def _inference_features(
236
+ self,
237
+ features,
238
+ bboxes=None,
239
+ points=None,
240
+ labels=None,
241
+ masks=None,
242
+ multimask_output=False,
243
+ ):
244
+ """
245
+ Perform inference on image features using the SAM model.
246
+
247
+ Args:
248
+ features (torch.Tensor): Extracted image features with shape (B, C, H, W) from the SAM model image encoder.
249
+ bboxes (np.ndarray | List[List[float]] | None): Bounding boxes in XYXY format with shape (N, 4).
250
+ points (np.ndarray | List[List[float]] | None): Object location points with shape (N, 2), in pixels.
251
+ labels (np.ndarray | List[int] | None): Point prompt labels with shape (N,). 1 = foreground, 0 = background.
252
+ masks (List[np.ndarray] | np.ndarray | None): Masks for the objects, where each mask is a 2D array.
253
+ multimask_output (bool): Flag to return multiple masks for ambiguous prompts.
254
+
255
+ Returns:
256
+ pred_masks (torch.Tensor): Output masks with shape (C, H, W), where C is the number of generated masks.
257
+ pred_scores (torch.Tensor): Quality scores for each mask, with length C.
258
+ """
234
259
  points = (points, labels) if points is not None else None
235
260
  # Embed prompts
236
261
  sparse_embeddings, dense_embeddings = self.model.prompt_encoder(points=points, boxes=bboxes, masks=masks)
@@ -248,12 +273,13 @@ class Predictor(BasePredictor):
248
273
  # `d` could be 1 or 3 depends on `multimask_output`.
249
274
  return pred_masks.flatten(0, 1), pred_scores.flatten(0, 1)
250
275
 
251
- def _prepare_prompts(self, dst_shape, bboxes=None, points=None, labels=None, masks=None):
276
+ def _prepare_prompts(self, dst_shape, src_shape, bboxes=None, points=None, labels=None, masks=None):
252
277
  """
253
278
  Prepare and transform the input prompts for processing based on the destination shape.
254
279
 
255
280
  Args:
256
- dst_shape (tuple): The target shape (height, width) for the prompts.
281
+ dst_shape (Tuple[int, int]): The target shape (height, width) for the prompts.
282
+ src_shape (Tuple[int, int]): The source shape (height, width) of the input image.
257
283
  bboxes (np.ndarray | List | None): Bounding boxes in XYXY format with shape (N, 4).
258
284
  points (np.ndarray | List | None): Points indicating object locations with shape (N, 2) or (N, num_points, 2), in pixels.
259
285
  labels (np.ndarray | List | None): Point prompt labels with shape (N) or (N, num_points). 1 for foreground, 0 for background.
@@ -268,11 +294,10 @@ class Predictor(BasePredictor):
268
294
  Raises:
269
295
  AssertionError: If the number of points don't match the number of labels, in case labels were passed.
270
296
  """
271
- src_shape = self.batch[1][0].shape[:2]
272
297
  r = 1.0 if self.segment_all else min(dst_shape[0] / src_shape[0], dst_shape[1] / src_shape[1])
273
298
  # Transform input prompts
274
299
  if points is not None:
275
- points = torch.as_tensor(points, dtype=torch.float32, device=self.device)
300
+ points = torch.as_tensor(points, dtype=self.torch_dtype, device=self.device)
276
301
  points = points[None] if points.ndim == 1 else points
277
302
  # Assuming labels are all positive if users don't pass labels.
278
303
  if labels is None:
@@ -286,11 +311,11 @@ class Predictor(BasePredictor):
286
311
  # (N, 2) --> (N, 1, 2), (N, ) --> (N, 1)
287
312
  points, labels = points[:, None, :], labels[:, None]
288
313
  if bboxes is not None:
289
- bboxes = torch.as_tensor(bboxes, dtype=torch.float32, device=self.device)
314
+ bboxes = torch.as_tensor(bboxes, dtype=self.torch_dtype, device=self.device)
290
315
  bboxes = bboxes[None] if bboxes.ndim == 1 else bboxes
291
316
  bboxes *= r
292
317
  if masks is not None:
293
- masks = torch.as_tensor(masks, dtype=torch.float32, device=self.device).unsqueeze(1)
318
+ masks = torch.as_tensor(masks, dtype=self.torch_dtype, device=self.device).unsqueeze(1)
294
319
  return bboxes, points, labels, masks
295
320
 
296
321
  def generate(
@@ -424,7 +449,8 @@ class Predictor(BasePredictor):
424
449
  if model is None:
425
450
  model = self.get_model()
426
451
  model.eval()
427
- self.model = model.to(device)
452
+ model = model.to(device)
453
+ self.model = model.half() if self.args.half else model.float()
428
454
  self.device = device
429
455
  self.mean = torch.tensor([123.675, 116.28, 103.53]).view(-1, 1, 1).to(device)
430
456
  self.std = torch.tensor([58.395, 57.12, 57.375]).view(-1, 1, 1).to(device)
@@ -433,8 +459,9 @@ class Predictor(BasePredictor):
433
459
  self.model.pt = False
434
460
  self.model.triton = False
435
461
  self.model.stride = 32
436
- self.model.fp16 = False
462
+ self.model.fp16 = self.args.half
437
463
  self.done_warmup = True
464
+ self.torch_dtype = torch.float16 if self.model.fp16 else torch.float32
438
465
 
439
466
  def get_model(self):
440
467
  """Retrieve or build the Segment Anything Model (SAM) for image segmentation tasks."""
@@ -543,7 +570,7 @@ class Predictor(BasePredictor):
543
570
  - The extracted features are stored in the `self.features` attribute for later use.
544
571
  """
545
572
  if self.model is None:
546
- self.setup_model(model=None)
573
+ self.setup_model()
547
574
  self.setup_source(image)
548
575
  assert len(self.dataset) == 1, "`set_image` only supports setting one image!"
549
576
  for batch in self.dataset:
@@ -620,6 +647,53 @@ class Predictor(BasePredictor):
620
647
 
621
648
  return new_masks[keep].to(device=masks.device, dtype=masks.dtype), keep
622
649
 
650
+ @smart_inference_mode()
651
+ def inference_features(
652
+ self,
653
+ features,
654
+ src_shape,
655
+ dst_shape=None,
656
+ bboxes=None,
657
+ points=None,
658
+ labels=None,
659
+ masks=None,
660
+ multimask_output=False,
661
+ ):
662
+ """
663
+ Perform prompts preprocessing and inference on provided image features using the SAM model.
664
+
665
+ Args:
666
+ features (torch.Tensor | Dict[str, Any]): Extracted image features from the SAM/SAM2 model image encoder.
667
+ src_shape (Tuple[int, int]): The source shape (height, width) of the input image.
668
+ dst_shape (Tuple[int, int] | None): The target shape (height, width) for the prompts. If None, defaults to (imgsz, imgsz).
669
+ bboxes (np.ndarray | List[List[float]] | None): Bounding boxes in xyxy format with shape (N, 4).
670
+ points (np.ndarray | List[List[float]] | None): Points indicating object locations with shape (N, 2), in pixels.
671
+ labels (np.ndarray | List[int] | None): Point prompt labels with shape (N, ).
672
+ masks (List[np.ndarray] | np.ndarray | None): Masks for the objects, where each mask is a 2D array.
673
+ multimask_output (bool): Flag to return multiple masks for ambiguous prompts.
674
+
675
+ Returns:
676
+ pred_masks (torch.Tensor): The output masks in shape (C, H, W), where C is the number of generated masks.
677
+ pred_bboxes (torch.Tensor): Bounding boxes for each mask with shape (N, 6), where N is the number of boxes.
678
+ Each box is in xyxy format with additional columns for score and class.
679
+
680
+ Notes:
681
+ - The input features is a torch.Tensor of shape (B, C, H, W) if performing on SAM, or a Dict[str, Any] if performing on SAM2.
682
+ """
683
+ dst_shape = dst_shape or (self.args.imgsz, self.args.imgsz)
684
+ prompts = self._prepare_prompts(dst_shape, src_shape, bboxes, points, labels, masks)
685
+ pred_masks, pred_scores = self._inference_features(features, *prompts, multimask_output)
686
+ if len(pred_masks) == 0:
687
+ pred_masks, pred_bboxes = None, torch.zeros((0, 6), device=pred_masks.device)
688
+ else:
689
+ pred_masks = ops.scale_masks(pred_masks[None].float(), src_shape, padding=False)[0]
690
+ pred_masks = pred_masks > self.model.mask_threshold # to bool
691
+ pred_bboxes = batched_mask_to_box(pred_masks)
692
+ # NOTE: SAM models do not return cls info. This `cls` here is just a placeholder for consistency.
693
+ cls = torch.arange(len(pred_masks), dtype=torch.int32, device=pred_masks.device)
694
+ pred_bboxes = torch.cat([pred_bboxes, pred_scores[:, None], cls[:, None]], dim=-1)
695
+ return pred_masks, pred_bboxes
696
+
623
697
 
624
698
  class SAM2Predictor(Predictor):
625
699
  """
@@ -663,80 +737,13 @@ class SAM2Predictor(Predictor):
663
737
 
664
738
  return build_sam(self.args.model)
665
739
 
666
- def prompt_inference(
667
- self,
668
- im,
669
- bboxes=None,
670
- points=None,
671
- labels=None,
672
- masks=None,
673
- multimask_output=False,
674
- img_idx=-1,
675
- ):
676
- """
677
- Perform image segmentation inference based on various prompts using SAM2 architecture.
678
-
679
- This method leverages the Segment Anything Model 2 (SAM2) to generate segmentation masks for input images
680
- based on provided prompts such as bounding boxes, points, or existing masks. It supports both single and
681
- multi-object prediction scenarios.
682
-
683
- Args:
684
- im (torch.Tensor): Preprocessed input image tensor with shape (N, C, H, W).
685
- bboxes (np.ndarray | List[List[float]] | None): Bounding boxes in XYXY format with shape (N, 4).
686
- points (np.ndarray | List[List[float]] | None): Object location points with shape (N, 2), in pixels.
687
- labels (np.ndarray | List[int] | None): Point prompt labels with shape (N,). 1 = foreground, 0 = background.
688
- masks (np.ndarray | None): Low-resolution masks from previous predictions with shape (N, H, W).
689
- multimask_output (bool): Flag to return multiple masks for ambiguous prompts.
690
- img_idx (int): Index of the image in the batch to process.
691
-
692
- Returns:
693
- pred_masks (np.ndarray): Output masks with shape (C, H, W), where C is the number of generated masks.
694
- pred_scores (np.ndarray): Quality scores for each mask, with length C.
695
-
696
- Examples:
697
- >>> predictor = SAM2Predictor(cfg)
698
- >>> image = torch.rand(1, 3, 640, 640)
699
- >>> bboxes = [[100, 100, 200, 200]]
700
- >>> result = predictor(image, bboxes=bboxes)[0]
701
- >>> print(f"Generated {result.masks.shape[0]} masks with average score {result.boxes.conf.mean():.2f}")
702
-
703
- Notes:
704
- - The method supports batched inference for multiple objects when points or bboxes are provided.
705
- - Input prompts (bboxes, points) are automatically scaled to match the input image dimensions.
706
- - When both bboxes and points are provided, they are merged into a single 'points' input for the model.
707
- """
708
- features = self.get_im_features(im) if self.features is None else self.features
709
-
710
- points, labels, masks = self._prepare_prompts(im.shape[2:], bboxes, points, labels, masks)
711
- points = (points, labels) if points is not None else None
712
-
713
- sparse_embeddings, dense_embeddings = self.model.sam_prompt_encoder(
714
- points=points,
715
- boxes=None,
716
- masks=masks,
717
- )
718
- # Predict masks
719
- batched_mode = points is not None and points[0].shape[0] > 1 # multi object prediction
720
- high_res_features = [feat_level[img_idx].unsqueeze(0) for feat_level in features["high_res_feats"]]
721
- pred_masks, pred_scores, _, _ = self.model.sam_mask_decoder(
722
- image_embeddings=features["image_embed"][img_idx].unsqueeze(0),
723
- image_pe=self.model.sam_prompt_encoder.get_dense_pe(),
724
- sparse_prompt_embeddings=sparse_embeddings,
725
- dense_prompt_embeddings=dense_embeddings,
726
- multimask_output=multimask_output,
727
- repeat_image=batched_mode,
728
- high_res_features=high_res_features,
729
- )
730
- # (N, d, H, W) --> (N*d, H, W), (N, d) --> (N*d, )
731
- # `d` could be 1 or 3 depends on `multimask_output`.
732
- return pred_masks.flatten(0, 1), pred_scores.flatten(0, 1)
733
-
734
- def _prepare_prompts(self, dst_shape, bboxes=None, points=None, labels=None, masks=None):
740
+ def _prepare_prompts(self, dst_shape, src_shape, bboxes=None, points=None, labels=None, masks=None):
735
741
  """
736
742
  Prepare and transform the input prompts for processing based on the destination shape.
737
743
 
738
744
  Args:
739
- dst_shape (tuple): The target shape (height, width) for the prompts.
745
+ dst_shape (Tuple[int, int]): The target shape (height, width) for the prompts.
746
+ src_shape (Tuple[int, int]): The source shape (height, width) of the input image.
740
747
  bboxes (np.ndarray | List | None): Bounding boxes in XYXY format with shape (N, 4).
741
748
  points (np.ndarray | List | None): Points indicating object locations with shape (N, 2) or (N, num_points, 2), in pixels.
742
749
  labels (np.ndarray | List | None): Point prompt labels with shape (N,) or (N, num_points). 1 for foreground, 0 for background.
@@ -750,7 +757,7 @@ class SAM2Predictor(Predictor):
750
757
  Raises:
751
758
  AssertionError: If the number of points don't match the number of labels, in case labels were passed.
752
759
  """
753
- bboxes, points, labels, masks = super()._prepare_prompts(dst_shape, bboxes, points, labels, masks)
760
+ bboxes, points, labels, masks = super()._prepare_prompts(dst_shape, src_shape, bboxes, points, labels, masks)
754
761
  if bboxes is not None:
755
762
  bboxes = bboxes.view(-1, 2, 2)
756
763
  bbox_labels = torch.tensor([[2, 3]], dtype=torch.int32, device=bboxes.device).expand(len(bboxes), -1)
@@ -813,6 +820,58 @@ class SAM2Predictor(Predictor):
813
820
  ][::-1]
814
821
  return {"image_embed": feats[-1], "high_res_feats": feats[:-1]}
815
822
 
823
+ def _inference_features(
824
+ self,
825
+ features,
826
+ points=None,
827
+ labels=None,
828
+ masks=None,
829
+ multimask_output=False,
830
+ img_idx=-1,
831
+ ):
832
+ """
833
+ Perform inference on image features using the SAM2 model.
834
+
835
+ Args:
836
+ features (torch.Tensor | Dict[str, Any]): Extracted image features with shape (B, C, H, W) from the SAM2 model image encoder, it
837
+ could also be a dictionary including:
838
+ - image_embed (torch.Tensor): Image embedding with shape (B, C, H, W).
839
+ - high_res_feats (List[torch.Tensor]): List of high-resolution feature maps from the backbone, each with shape (B, C, H, W).
840
+ points (np.ndarray | List[List[float]] | None): Object location points with shape (N, 2), in pixels.
841
+ labels (np.ndarray | List[int] | None): Point prompt labels with shape (N,). 1 = foreground, 0 = background.
842
+ masks (List[np.ndarray] | np.ndarray | None): Masks for the objects, where each mask is a 2D array.
843
+ multimask_output (bool): Flag to return multiple masks for ambiguous prompts.
844
+ img_idx (int): Index of the image in the batch to process.
845
+
846
+ Returns:
847
+ pred_masks (torch.Tensor): Output masks with shape (C, H, W), where C is the number of generated masks.
848
+ pred_scores (torch.Tensor): Quality scores for each mask, with length C.
849
+ """
850
+ points = (points, labels) if points is not None else None
851
+ sparse_embeddings, dense_embeddings = self.model.sam_prompt_encoder(
852
+ points=points,
853
+ boxes=None,
854
+ masks=masks,
855
+ )
856
+ # Predict masks
857
+ batched_mode = points is not None and points[0].shape[0] > 1 # multi object prediction
858
+ high_res_features = None
859
+ if isinstance(features, dict):
860
+ high_res_features = [feat_level[img_idx].unsqueeze(0) for feat_level in features["high_res_feats"]]
861
+ features = features["image_embed"][[img_idx]]
862
+ pred_masks, pred_scores, _, _ = self.model.sam_mask_decoder(
863
+ image_embeddings=features,
864
+ image_pe=self.model.sam_prompt_encoder.get_dense_pe(),
865
+ sparse_prompt_embeddings=sparse_embeddings,
866
+ dense_prompt_embeddings=dense_embeddings,
867
+ multimask_output=multimask_output,
868
+ repeat_image=batched_mode,
869
+ high_res_features=high_res_features,
870
+ )
871
+ # (N, d, H, W) --> (N*d, H, W), (N, d) --> (N*d, )
872
+ # `d` could be 1 or 3 depends on `multimask_output`.
873
+ return pred_masks.flatten(0, 1), pred_scores.flatten(0, 1)
874
+
816
875
 
817
876
  class SAM2VideoPredictor(SAM2Predictor):
818
877
  """
@@ -900,8 +959,8 @@ class SAM2VideoPredictor(SAM2Predictor):
900
959
  masks (np.ndarray, optional): Low-resolution masks from previous predictions shape (N,H,W). For SAM H=W=256.
901
960
 
902
961
  Returns:
903
- pred_masks (np.ndarray): The output masks in shape CxHxW, where C is the number of generated masks.
904
- pred_scores (np.ndarray): An array of length C containing quality scores predicted by the model for each mask.
962
+ pred_masks (torch.Tensor): The output masks in shape CxHxW, where C is the number of generated masks.
963
+ pred_scores (torch.Tensor): An array of length C containing quality scores predicted by the model for each mask.
905
964
  """
906
965
  # Override prompts if any stored in self.prompts
907
966
  bboxes = self.prompts.pop("bboxes", bboxes)
@@ -912,7 +971,9 @@ class SAM2VideoPredictor(SAM2Predictor):
912
971
  self.inference_state["im"] = im
913
972
  output_dict = self.inference_state["output_dict"]
914
973
  if len(output_dict["cond_frame_outputs"]) == 0: # initialize prompts
915
- points, labels, masks = self._prepare_prompts(im.shape[2:], bboxes, points, labels, masks)
974
+ points, labels, masks = self._prepare_prompts(
975
+ im.shape[2:], self.batch[1][0].shape[:2], bboxes, points, labels, masks
976
+ )
916
977
  if points is not None:
917
978
  for i in range(len(points)):
918
979
  self.add_new_prompts(obj_id=i, points=points[[i]], labels=labels[[i]], frame_idx=frame)
@@ -966,7 +1027,7 @@ class SAM2VideoPredictor(SAM2Predictor):
966
1027
  the masks do not overlap, which can be useful for certain applications.
967
1028
 
968
1029
  Args:
969
- preds (tuple): The predictions from the model.
1030
+ preds (Tuple[torch.Tensor, torch.Tensor]): The predicted masks and scores from the model.
970
1031
  img (torch.Tensor): The processed image tensor.
971
1032
  orig_imgs (List[np.ndarray]): The original images before processing.
972
1033
 
@@ -1441,13 +1502,13 @@ class SAM2VideoPredictor(SAM2Predictor):
1441
1502
  "pred_masks": torch.full(
1442
1503
  size=(batch_size, 1, self.imgsz[0] // 4, self.imgsz[1] // 4),
1443
1504
  fill_value=-1024.0,
1444
- dtype=torch.float32,
1505
+ dtype=self.torch_dtype,
1445
1506
  device=self.device,
1446
1507
  ),
1447
1508
  "obj_ptr": torch.full(
1448
1509
  size=(batch_size, self.model.hidden_dim),
1449
1510
  fill_value=-1024.0,
1450
- dtype=torch.float32,
1511
+ dtype=self.torch_dtype,
1451
1512
  device=self.device,
1452
1513
  ),
1453
1514
  "object_score_logits": torch.full(
@@ -1455,7 +1516,7 @@ class SAM2VideoPredictor(SAM2Predictor):
1455
1516
  # default to 10.0 for object_score_logits, i.e. assuming the object is
1456
1517
  # present as sigmoid(10)=1, same as in `predict_masks` of `MaskDecoder`
1457
1518
  fill_value=10.0,
1458
- dtype=torch.float32,
1519
+ dtype=self.torch_dtype,
1459
1520
  device=self.device,
1460
1521
  ),
1461
1522
  }
@@ -1527,7 +1588,7 @@ class SAM2VideoPredictor(SAM2Predictor):
1527
1588
  feat_sizes=feat_sizes,
1528
1589
  point_inputs=None,
1529
1590
  # A dummy (empty) mask with a single object
1530
- mask_inputs=torch.zeros((1, 1, *self.imgsz), dtype=torch.float32, device=self.device),
1591
+ mask_inputs=torch.zeros((1, 1, *self.imgsz), dtype=self.torch_dtype, device=self.device),
1531
1592
  output_dict={},
1532
1593
  num_frames=self.inference_state["num_frames"],
1533
1594
  track_in_reverse=False,