ultralytics 8.3.126__tar.gz → 8.3.127__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 (275) hide show
  1. {ultralytics-8.3.126/ultralytics.egg-info → ultralytics-8.3.127}/PKG-INFO +2 -1
  2. {ultralytics-8.3.126 → ultralytics-8.3.127}/pyproject.toml +1 -0
  3. {ultralytics-8.3.126 → ultralytics-8.3.127}/tests/test_solutions.py +11 -0
  4. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/__init__.py +1 -1
  5. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/solutions/__init__.py +3 -0
  6. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/solutions/config.py +2 -0
  7. ultralytics-8.3.127/ultralytics/solutions/similarity_search.py +176 -0
  8. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/solutions/solutions.py +49 -48
  9. {ultralytics-8.3.126 → ultralytics-8.3.127/ultralytics.egg-info}/PKG-INFO +2 -1
  10. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics.egg-info/SOURCES.txt +1 -0
  11. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics.egg-info/requires.txt +1 -0
  12. {ultralytics-8.3.126 → ultralytics-8.3.127}/LICENSE +0 -0
  13. {ultralytics-8.3.126 → ultralytics-8.3.127}/README.md +0 -0
  14. {ultralytics-8.3.126 → ultralytics-8.3.127}/setup.cfg +0 -0
  15. {ultralytics-8.3.126 → ultralytics-8.3.127}/tests/__init__.py +0 -0
  16. {ultralytics-8.3.126 → ultralytics-8.3.127}/tests/conftest.py +0 -0
  17. {ultralytics-8.3.126 → ultralytics-8.3.127}/tests/test_cli.py +0 -0
  18. {ultralytics-8.3.126 → ultralytics-8.3.127}/tests/test_cuda.py +0 -0
  19. {ultralytics-8.3.126 → ultralytics-8.3.127}/tests/test_engine.py +0 -0
  20. {ultralytics-8.3.126 → ultralytics-8.3.127}/tests/test_exports.py +0 -0
  21. {ultralytics-8.3.126 → ultralytics-8.3.127}/tests/test_integrations.py +0 -0
  22. {ultralytics-8.3.126 → ultralytics-8.3.127}/tests/test_python.py +0 -0
  23. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/assets/bus.jpg +0 -0
  24. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/assets/zidane.jpg +0 -0
  25. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/__init__.py +0 -0
  26. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
  27. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
  28. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
  29. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
  30. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
  31. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
  32. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
  33. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/datasets/VOC.yaml +0 -0
  34. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
  35. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
  36. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
  37. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
  38. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
  39. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/datasets/coco.yaml +0 -0
  40. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
  41. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/datasets/coco128.yaml +0 -0
  42. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/datasets/coco8-multispectral.yaml +0 -0
  43. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
  44. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
  45. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/datasets/coco8.yaml +0 -0
  46. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
  47. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/datasets/dog-pose.yaml +0 -0
  48. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/datasets/dota8-multispectral.yaml +0 -0
  49. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/datasets/dota8.yaml +0 -0
  50. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/datasets/hand-keypoints.yaml +0 -0
  51. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/datasets/lvis.yaml +0 -0
  52. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/datasets/medical-pills.yaml +0 -0
  53. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
  54. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
  55. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/datasets/signature.yaml +0 -0
  56. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
  57. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/datasets/xView.yaml +0 -0
  58. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/default.yaml +0 -0
  59. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/11/yolo11-cls-resnet18.yaml +0 -0
  60. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/11/yolo11-cls.yaml +0 -0
  61. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/11/yolo11-obb.yaml +0 -0
  62. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/11/yolo11-pose.yaml +0 -0
  63. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/11/yolo11-seg.yaml +0 -0
  64. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/11/yolo11.yaml +0 -0
  65. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/11/yoloe-11-seg.yaml +0 -0
  66. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/11/yoloe-11.yaml +0 -0
  67. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/12/yolo12-cls.yaml +0 -0
  68. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/12/yolo12-obb.yaml +0 -0
  69. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/12/yolo12-pose.yaml +0 -0
  70. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/12/yolo12-seg.yaml +0 -0
  71. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/12/yolo12.yaml +0 -0
  72. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
  73. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
  74. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
  75. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
  76. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/v10/yolov10b.yaml +0 -0
  77. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/v10/yolov10l.yaml +0 -0
  78. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/v10/yolov10m.yaml +0 -0
  79. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/v10/yolov10n.yaml +0 -0
  80. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/v10/yolov10s.yaml +0 -0
  81. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/v10/yolov10x.yaml +0 -0
  82. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
  83. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
  84. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
  85. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
  86. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
  87. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
  88. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/v8/yoloe-v8-seg.yaml +0 -0
  89. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/v8/yoloe-v8.yaml +0 -0
  90. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
  91. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
  92. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
  93. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
  94. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
  95. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
  96. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
  97. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
  98. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
  99. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
  100. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
  101. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
  102. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
  103. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
  104. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
  105. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
  106. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
  107. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
  108. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
  109. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
  110. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
  111. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/v9/yolov9m.yaml +0 -0
  112. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/v9/yolov9s.yaml +0 -0
  113. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/models/v9/yolov9t.yaml +0 -0
  114. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/trackers/botsort.yaml +0 -0
  115. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
  116. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/data/__init__.py +0 -0
  117. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/data/annotator.py +0 -0
  118. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/data/augment.py +0 -0
  119. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/data/base.py +0 -0
  120. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/data/build.py +0 -0
  121. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/data/converter.py +0 -0
  122. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/data/dataset.py +0 -0
  123. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/data/loaders.py +0 -0
  124. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/data/scripts/download_weights.sh +0 -0
  125. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/data/scripts/get_coco.sh +0 -0
  126. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/data/scripts/get_coco128.sh +0 -0
  127. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/data/scripts/get_imagenet.sh +0 -0
  128. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/data/split.py +0 -0
  129. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/data/split_dota.py +0 -0
  130. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/data/utils.py +0 -0
  131. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/engine/__init__.py +0 -0
  132. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/engine/exporter.py +0 -0
  133. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/engine/model.py +0 -0
  134. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/engine/predictor.py +0 -0
  135. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/engine/results.py +0 -0
  136. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/engine/trainer.py +0 -0
  137. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/engine/tuner.py +0 -0
  138. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/engine/validator.py +0 -0
  139. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/hub/__init__.py +0 -0
  140. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/hub/auth.py +0 -0
  141. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/hub/google/__init__.py +0 -0
  142. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/hub/session.py +0 -0
  143. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/hub/utils.py +0 -0
  144. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/__init__.py +0 -0
  145. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/fastsam/__init__.py +0 -0
  146. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/fastsam/model.py +0 -0
  147. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/fastsam/predict.py +0 -0
  148. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/fastsam/utils.py +0 -0
  149. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/fastsam/val.py +0 -0
  150. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/nas/__init__.py +0 -0
  151. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/nas/model.py +0 -0
  152. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/nas/predict.py +0 -0
  153. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/nas/val.py +0 -0
  154. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/rtdetr/__init__.py +0 -0
  155. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/rtdetr/model.py +0 -0
  156. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/rtdetr/predict.py +0 -0
  157. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/rtdetr/train.py +0 -0
  158. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/rtdetr/val.py +0 -0
  159. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/sam/__init__.py +0 -0
  160. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/sam/amg.py +0 -0
  161. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/sam/build.py +0 -0
  162. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/sam/model.py +0 -0
  163. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/sam/modules/__init__.py +0 -0
  164. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/sam/modules/blocks.py +0 -0
  165. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/sam/modules/decoders.py +0 -0
  166. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/sam/modules/encoders.py +0 -0
  167. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/sam/modules/memory_attention.py +0 -0
  168. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/sam/modules/sam.py +0 -0
  169. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
  170. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/sam/modules/transformer.py +0 -0
  171. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/sam/modules/utils.py +0 -0
  172. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/sam/predict.py +0 -0
  173. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/utils/__init__.py +0 -0
  174. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/utils/loss.py +0 -0
  175. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/utils/ops.py +0 -0
  176. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/yolo/__init__.py +0 -0
  177. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/yolo/classify/__init__.py +0 -0
  178. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/yolo/classify/predict.py +0 -0
  179. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/yolo/classify/train.py +0 -0
  180. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/yolo/classify/val.py +0 -0
  181. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/yolo/detect/__init__.py +0 -0
  182. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/yolo/detect/predict.py +0 -0
  183. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/yolo/detect/train.py +0 -0
  184. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/yolo/detect/val.py +0 -0
  185. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/yolo/model.py +0 -0
  186. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/yolo/obb/__init__.py +0 -0
  187. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/yolo/obb/predict.py +0 -0
  188. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/yolo/obb/train.py +0 -0
  189. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/yolo/obb/val.py +0 -0
  190. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/yolo/pose/__init__.py +0 -0
  191. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/yolo/pose/predict.py +0 -0
  192. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/yolo/pose/train.py +0 -0
  193. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/yolo/pose/val.py +0 -0
  194. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/yolo/segment/__init__.py +0 -0
  195. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/yolo/segment/predict.py +0 -0
  196. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/yolo/segment/train.py +0 -0
  197. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/yolo/segment/val.py +0 -0
  198. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/yolo/world/__init__.py +0 -0
  199. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/yolo/world/train.py +0 -0
  200. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/yolo/world/train_world.py +0 -0
  201. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/yolo/yoloe/__init__.py +0 -0
  202. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/yolo/yoloe/predict.py +0 -0
  203. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/yolo/yoloe/train.py +0 -0
  204. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/yolo/yoloe/train_seg.py +0 -0
  205. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/models/yolo/yoloe/val.py +0 -0
  206. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/nn/__init__.py +0 -0
  207. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/nn/autobackend.py +0 -0
  208. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/nn/modules/__init__.py +0 -0
  209. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/nn/modules/activation.py +0 -0
  210. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/nn/modules/block.py +0 -0
  211. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/nn/modules/conv.py +0 -0
  212. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/nn/modules/head.py +0 -0
  213. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/nn/modules/transformer.py +0 -0
  214. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/nn/modules/utils.py +0 -0
  215. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/nn/tasks.py +0 -0
  216. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/nn/text_model.py +0 -0
  217. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/solutions/ai_gym.py +0 -0
  218. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/solutions/analytics.py +0 -0
  219. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/solutions/distance_calculation.py +0 -0
  220. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/solutions/heatmap.py +0 -0
  221. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/solutions/instance_segmentation.py +0 -0
  222. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/solutions/object_blurrer.py +0 -0
  223. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/solutions/object_counter.py +0 -0
  224. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/solutions/object_cropper.py +0 -0
  225. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/solutions/parking_management.py +0 -0
  226. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/solutions/queue_management.py +0 -0
  227. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/solutions/region_counter.py +0 -0
  228. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/solutions/security_alarm.py +0 -0
  229. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/solutions/speed_estimation.py +0 -0
  230. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/solutions/streamlit_inference.py +0 -0
  231. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/solutions/trackzone.py +0 -0
  232. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/solutions/vision_eye.py +0 -0
  233. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/trackers/__init__.py +0 -0
  234. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/trackers/basetrack.py +0 -0
  235. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/trackers/bot_sort.py +0 -0
  236. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/trackers/byte_tracker.py +0 -0
  237. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/trackers/track.py +0 -0
  238. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/trackers/utils/__init__.py +0 -0
  239. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/trackers/utils/gmc.py +0 -0
  240. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/trackers/utils/kalman_filter.py +0 -0
  241. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/trackers/utils/matching.py +0 -0
  242. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/utils/__init__.py +0 -0
  243. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/utils/autobatch.py +0 -0
  244. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/utils/autodevice.py +0 -0
  245. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/utils/benchmarks.py +0 -0
  246. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/utils/callbacks/__init__.py +0 -0
  247. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/utils/callbacks/base.py +0 -0
  248. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/utils/callbacks/clearml.py +0 -0
  249. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/utils/callbacks/comet.py +0 -0
  250. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/utils/callbacks/dvc.py +0 -0
  251. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/utils/callbacks/hub.py +0 -0
  252. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/utils/callbacks/mlflow.py +0 -0
  253. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/utils/callbacks/neptune.py +0 -0
  254. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/utils/callbacks/raytune.py +0 -0
  255. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/utils/callbacks/tensorboard.py +0 -0
  256. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/utils/callbacks/wb.py +0 -0
  257. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/utils/checks.py +0 -0
  258. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/utils/dist.py +0 -0
  259. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/utils/downloads.py +0 -0
  260. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/utils/errors.py +0 -0
  261. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/utils/export.py +0 -0
  262. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/utils/files.py +0 -0
  263. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/utils/instance.py +0 -0
  264. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/utils/loss.py +0 -0
  265. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/utils/metrics.py +0 -0
  266. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/utils/ops.py +0 -0
  267. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/utils/patches.py +0 -0
  268. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/utils/plotting.py +0 -0
  269. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/utils/tal.py +0 -0
  270. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/utils/torch_utils.py +0 -0
  271. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/utils/triton.py +0 -0
  272. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics/utils/tuner.py +0 -0
  273. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics.egg-info/dependency_links.txt +0 -0
  274. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics.egg-info/entry_points.txt +0 -0
  275. {ultralytics-8.3.126 → ultralytics-8.3.127}/ultralytics.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ultralytics
3
- Version: 8.3.126
3
+ Version: 8.3.127
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>
@@ -70,6 +70,7 @@ Requires-Dist: h5py!=3.11.0; platform_machine == "aarch64" and extra == "export"
70
70
  Provides-Extra: solutions
71
71
  Requires-Dist: shapely>=2.0.0; extra == "solutions"
72
72
  Requires-Dist: streamlit>=1.29.0; extra == "solutions"
73
+ Requires-Dist: flask; extra == "solutions"
73
74
  Provides-Extra: logging
74
75
  Requires-Dist: wandb; extra == "logging"
75
76
  Requires-Dist: tensorboard; extra == "logging"
@@ -105,6 +105,7 @@ export = [
105
105
  solutions = [
106
106
  "shapely>=2.0.0", # shapely for point and polygon data matching
107
107
  "streamlit>=1.29.0", # for live inference on web browser, i.e `yolo streamlit-predict`
108
+ "flask", # for similarity search solution
108
109
  ]
109
110
  logging = [
110
111
  "wandb", # https://docs.ultralytics.com/integrations/weights-biases/
@@ -174,3 +174,14 @@ def test_solution(name, solution_class, needs_frame_count, video, kwargs):
174
174
  video_path=str(TMP / video),
175
175
  needs_frame_count=needs_frame_count,
176
176
  )
177
+
178
+
179
+ @pytest.mark.slow
180
+ @pytest.mark.skipif(checks.IS_PYTHON_3_8, reason="Disabled due to unsupported CLIP dependencies.")
181
+ @pytest.mark.skipif(IS_RASPBERRYPI, reason="Disabled due to slow performance on Raspberry Pi.")
182
+ def test_similarity_search():
183
+ """Test similarity search solution."""
184
+ from ultralytics import solutions
185
+
186
+ searcher = solutions.VisualAISearch()
187
+ _ = searcher("a dog sitting on a bench") # Returns the results in format "- img name | similarity score"
@@ -1,6 +1,6 @@
1
1
  # Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
2
2
 
3
- __version__ = "8.3.126"
3
+ __version__ = "8.3.127"
4
4
 
5
5
  import os
6
6
 
@@ -12,6 +12,7 @@ from .parking_management import ParkingManagement, ParkingPtsSelection
12
12
  from .queue_management import QueueManager
13
13
  from .region_counter import RegionCounter
14
14
  from .security_alarm import SecurityAlarm
15
+ from .similarity_search import SearchApp, VisualAISearch
15
16
  from .speed_estimation import SpeedEstimator
16
17
  from .streamlit_inference import Inference
17
18
  from .trackzone import TrackZone
@@ -35,4 +36,6 @@ __all__ = (
35
36
  "Analytics",
36
37
  "Inference",
37
38
  "TrackZone",
39
+ "SearchApp",
40
+ "VisualAISearch",
38
41
  )
@@ -48,6 +48,7 @@ class SolutionConfig:
48
48
  half (bool): Whether to use FP16 precision (requires a supported CUDA device).
49
49
  tracker (str): Path to tracking configuration YAML file (e.g., 'botsort.yaml').
50
50
  verbose (bool): Enable verbose logging output for debugging or diagnostics.
51
+ data (str): Path to image directory used for similarity search.
51
52
 
52
53
  Methods:
53
54
  update: Update the configuration with user-defined keyword arguments and raise error on invalid keys.
@@ -91,6 +92,7 @@ class SolutionConfig:
91
92
  half: bool = False
92
93
  tracker: str = "botsort.yaml"
93
94
  verbose: bool = True
95
+ data: str = "images"
94
96
 
95
97
  def update(self, **kwargs):
96
98
  """Update configuration parameters with new values provided as keyword arguments."""
@@ -0,0 +1,176 @@
1
+ # Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
2
+
3
+ import os
4
+ from pathlib import Path
5
+
6
+ import numpy as np
7
+ import torch
8
+ from PIL import Image
9
+
10
+ from ultralytics.data.utils import IMG_FORMATS
11
+ from ultralytics.solutions.solutions import BaseSolution
12
+ from ultralytics.utils.checks import check_requirements
13
+ from ultralytics.utils.torch_utils import select_device
14
+
15
+ os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE" # Avoid OpenMP conflict on some systems
16
+
17
+
18
+ class VisualAISearch(BaseSolution):
19
+ """
20
+ VisualAISearch leverages OpenCLIP to generate high-quality image and text embeddings, aligning them in a shared
21
+ semantic space. It then uses FAISS to perform fast and scalable similarity-based retrieval, allowing users to search
22
+ large collections of images using natural language queries with high accuracy and speed.
23
+
24
+ Attributes:
25
+ data (str): Directory containing images.
26
+ device (str): Computation device, e.g., 'cpu' or 'cuda'.
27
+ """
28
+
29
+ def __init__(self, **kwargs):
30
+ """Initializes the VisualAISearch class with the FAISS index file and CLIP model."""
31
+ super().__init__(**kwargs)
32
+ check_requirements(["open-clip-torch", "faiss-cpu"])
33
+ import faiss
34
+ import open_clip
35
+
36
+ self.faiss = faiss
37
+ self.open_clip = open_clip
38
+
39
+ self.faiss_index = "faiss.index"
40
+ self.data_path_npy = "paths.npy"
41
+ self.model_name = "ViT-B-32-quickgelu"
42
+ self.data_dir = Path(self.CFG["data"])
43
+ self.device = select_device(self.CFG["device"])
44
+
45
+ if not self.data_dir.exists():
46
+ from ultralytics.utils import ASSETS_URL
47
+
48
+ self.LOGGER.warning(f"{self.data_dir} not found. Downloading images.zip from {ASSETS_URL}/images.zip")
49
+ from ultralytics.utils.downloads import safe_download
50
+
51
+ safe_download(url=f"{ASSETS_URL}/images.zip", unzip=True, retry=3)
52
+ self.data_dir = Path("images")
53
+
54
+ self.clip_model, _, self.preprocess = self.open_clip.create_model_and_transforms(
55
+ self.model_name, pretrained="openai"
56
+ )
57
+ self.clip_model = self.clip_model.to(self.device).eval()
58
+ self.tokenizer = self.open_clip.get_tokenizer(self.model_name)
59
+
60
+ self.index = None
61
+ self.image_paths = []
62
+
63
+ self.load_or_build_index()
64
+
65
+ def extract_image_feature(self, path):
66
+ """Extract CLIP image embedding."""
67
+ image = Image.open(path)
68
+ tensor = self.preprocess(image).unsqueeze(0).to(self.device)
69
+ with torch.no_grad():
70
+ return self.clip_model.encode_image(tensor).cpu().numpy()
71
+
72
+ def extract_text_feature(self, text):
73
+ """Extract CLIP text embedding."""
74
+ tokens = self.tokenizer([text]).to(self.device)
75
+ with torch.no_grad():
76
+ return self.clip_model.encode_text(tokens).cpu().numpy()
77
+
78
+ def load_or_build_index(self):
79
+ """Loads FAISS index or builds a new one from image features."""
80
+ # Check if the FAISS index and corresponding image paths already exist
81
+ if Path(self.faiss_index).exists() and Path(self.data_path_npy).exists():
82
+ self.LOGGER.info("Loading existing FAISS index...")
83
+ self.index = self.faiss.read_index(self.faiss_index) # Load the FAISS index from disk
84
+ self.image_paths = np.load(self.data_path_npy) # Load the saved image path list
85
+ return # Exit the function as the index is successfully loaded
86
+
87
+ # If the index doesn't exist, start building it from scratch
88
+ self.LOGGER.info("Building FAISS index from images...")
89
+ vectors = [] # List to store feature vectors of images
90
+
91
+ # Iterate over all image files in the data directory
92
+ for file in self.data_dir.iterdir():
93
+ # Skip files that are not valid image formats
94
+ if file.suffix.lower().lstrip(".") not in IMG_FORMATS:
95
+ continue
96
+ try:
97
+ # Extract feature vector for the image and add to the list
98
+ vectors.append(self.extract_image_feature(file))
99
+ self.image_paths.append(file.name) # Store the corresponding image name
100
+ except Exception as e:
101
+ self.LOGGER.warning(f"Skipping {file.name}: {e}")
102
+
103
+ # If no vectors were successfully created, raise an error
104
+ if not vectors:
105
+ raise RuntimeError("No image embeddings could be generated.")
106
+
107
+ vectors = np.vstack(vectors).astype("float32") # Stack all vectors into a NumPy array and convert to float32
108
+ self.faiss.normalize_L2(vectors) # Normalize vectors to unit length for cosine similarity
109
+
110
+ self.index = self.faiss.IndexFlatIP(vectors.shape[1]) # Create a new FAISS index using inner product
111
+ self.index.add(vectors) # Add the normalized vectors to the FAISS index
112
+ self.faiss.write_index(self.index, self.faiss_index) # Save the newly built FAISS index to disk
113
+ np.save(self.data_path_npy, np.array(self.image_paths)) # Save the list of image paths to disk
114
+
115
+ self.LOGGER.info(f"Indexed {len(self.image_paths)} images.")
116
+
117
+ def search(self, query, k=30, similarity_thresh=0.1):
118
+ """Returns top-k semantically similar images to the given query."""
119
+ text_feat = self.extract_text_feature(query).astype("float32")
120
+ self.faiss.normalize_L2(text_feat)
121
+
122
+ D, index = self.index.search(text_feat, k)
123
+ results = [
124
+ (self.image_paths[i], float(D[0][idx])) for idx, i in enumerate(index[0]) if D[0][idx] >= similarity_thresh
125
+ ]
126
+ results.sort(key=lambda x: x[1], reverse=True)
127
+
128
+ self.LOGGER.info("\nRanked Results:")
129
+ for name, score in results:
130
+ self.LOGGER.info(f" - {name} | Similarity: {score:.4f}")
131
+
132
+ return [r[0] for r in results]
133
+
134
+ def __call__(self, query):
135
+ """Direct call for search function."""
136
+ return self.search(query)
137
+
138
+
139
+ class SearchApp:
140
+ """
141
+ A Flask-based web interface powers the semantic image search experience, enabling users to input natural language
142
+ queries and instantly view the most relevant images retrieved from the indexed database—all through a clean,
143
+ responsive, and easily customizable frontend.
144
+
145
+ Args:
146
+ data (str): Path to images to index and search.
147
+ device (str): Device to run inference on (e.g. 'cpu', 'cuda').
148
+ """
149
+
150
+ def __init__(self, data="images", device=None):
151
+ """Initialization of the VisualAISearch class for performing semantic image search."""
152
+ check_requirements("flask")
153
+ from flask import Flask, render_template, request
154
+
155
+ self.render_template = render_template
156
+ self.request = request
157
+ self.searcher = VisualAISearch(data=data, device=device)
158
+ self.app = Flask(
159
+ __name__,
160
+ template_folder="templates",
161
+ static_folder=Path(data).resolve(), # Absolute path to serve images
162
+ static_url_path="/images", # URL prefix for images
163
+ )
164
+ self.app.add_url_rule("/", view_func=self.index, methods=["GET", "POST"])
165
+
166
+ def index(self):
167
+ """Function to process the user query and display output."""
168
+ results = []
169
+ if self.request.method == "POST":
170
+ query = self.request.form.get("query", "").strip()
171
+ results = self.searcher(query)
172
+ return self.render_template("similarity-search.html", results=results)
173
+
174
+ def run(self, debug=False):
175
+ """Runs the Flask web app."""
176
+ self.app.run(debug=debug)
@@ -54,55 +54,56 @@ class BaseSolution:
54
54
  is_cli (bool): Enables CLI mode if set to True.
55
55
  **kwargs (Any): Additional configuration parameters that override defaults.
56
56
  """
57
- check_requirements("shapely>=2.0.0")
58
- from shapely.geometry import LineString, Point, Polygon
59
- from shapely.prepared import prep
60
-
61
- self.LineString = LineString
62
- self.Polygon = Polygon
63
- self.Point = Point
64
- self.prep = prep
65
- self.annotator = None # Initialize annotator
66
- self.tracks = None
67
- self.track_data = None
68
- self.boxes = []
69
- self.clss = []
70
- self.track_ids = []
71
- self.track_line = None
72
- self.masks = None
73
- self.r_s = None
74
-
75
- self.LOGGER = LOGGER # Store logger object to be used in multiple solution classes
76
57
  self.CFG = vars(SolutionConfig().update(**kwargs))
77
- self.LOGGER.info(f"Ultralytics Solutions: {self.CFG}")
78
-
79
- self.region = self.CFG["region"] # Store region data for other classes usage
80
- self.line_width = self.CFG["line_width"]
81
-
82
- # Load Model and store additional information (classes, show_conf, show_label)
83
- if self.CFG["model"] is None:
84
- self.CFG["model"] = "yolo11n.pt"
85
- self.model = YOLO(self.CFG["model"])
86
- self.names = self.model.names
87
- self.classes = self.CFG["classes"]
88
- self.show_conf = self.CFG["show_conf"]
89
- self.show_labels = self.CFG["show_labels"]
90
-
91
- self.track_add_args = { # Tracker additional arguments for advance configuration
92
- k: self.CFG[k] for k in ["iou", "conf", "device", "max_det", "half", "tracker", "device", "verbose"]
93
- } # verbose must be passed to track method; setting it False in YOLO still logs the track information.
94
-
95
- if is_cli and self.CFG["source"] is None:
96
- d_s = "solutions_ci_demo.mp4" if "-pose" not in self.CFG["model"] else "solution_ci_pose_demo.mp4"
97
- self.LOGGER.warning(f"source not provided. using default source {ASSETS_URL}/{d_s}")
98
- from ultralytics.utils.downloads import safe_download
99
-
100
- safe_download(f"{ASSETS_URL}/{d_s}") # download source from ultralytics assets
101
- self.CFG["source"] = d_s # set default source
102
-
103
- # Initialize environment and region setup
104
- self.env_check = check_imshow(warn=True)
105
- self.track_history = defaultdict(list)
58
+ self.LOGGER = LOGGER # Store logger object to be used in multiple solution classes
59
+
60
+ if self.__class__.__name__ != "VisualAISearch":
61
+ check_requirements("shapely>=2.0.0")
62
+ from shapely.geometry import LineString, Point, Polygon
63
+ from shapely.prepared import prep
64
+
65
+ self.LineString = LineString
66
+ self.Polygon = Polygon
67
+ self.Point = Point
68
+ self.prep = prep
69
+ self.annotator = None # Initialize annotator
70
+ self.tracks = None
71
+ self.track_data = None
72
+ self.boxes = []
73
+ self.clss = []
74
+ self.track_ids = []
75
+ self.track_line = None
76
+ self.masks = None
77
+ self.r_s = None
78
+
79
+ self.LOGGER.info(f"Ultralytics Solutions: ✅ {self.CFG}")
80
+ self.region = self.CFG["region"] # Store region data for other classes usage
81
+ self.line_width = self.CFG["line_width"]
82
+
83
+ # Load Model and store additional information (classes, show_conf, show_label)
84
+ if self.CFG["model"] is None:
85
+ self.CFG["model"] = "yolo11n.pt"
86
+ self.model = YOLO(self.CFG["model"])
87
+ self.names = self.model.names
88
+ self.classes = self.CFG["classes"]
89
+ self.show_conf = self.CFG["show_conf"]
90
+ self.show_labels = self.CFG["show_labels"]
91
+
92
+ self.track_add_args = { # Tracker additional arguments for advance configuration
93
+ k: self.CFG[k] for k in ["iou", "conf", "device", "max_det", "half", "tracker", "device", "verbose"]
94
+ } # verbose must be passed to track method; setting it False in YOLO still logs the track information.
95
+
96
+ if is_cli and self.CFG["source"] is None:
97
+ d_s = "solutions_ci_demo.mp4" if "-pose" not in self.CFG["model"] else "solution_ci_pose_demo.mp4"
98
+ self.LOGGER.warning(f"source not provided. using default source {ASSETS_URL}/{d_s}")
99
+ from ultralytics.utils.downloads import safe_download
100
+
101
+ safe_download(f"{ASSETS_URL}/{d_s}") # download source from ultralytics assets
102
+ self.CFG["source"] = d_s # set default source
103
+
104
+ # Initialize environment and region setup
105
+ self.env_check = check_imshow(warn=True)
106
+ self.track_history = defaultdict(list)
106
107
 
107
108
  def adjust_box_label(self, cls, conf, track_id=None):
108
109
  """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ultralytics
3
- Version: 8.3.126
3
+ Version: 8.3.127
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>
@@ -70,6 +70,7 @@ Requires-Dist: h5py!=3.11.0; platform_machine == "aarch64" and extra == "export"
70
70
  Provides-Extra: solutions
71
71
  Requires-Dist: shapely>=2.0.0; extra == "solutions"
72
72
  Requires-Dist: streamlit>=1.29.0; extra == "solutions"
73
+ Requires-Dist: flask; extra == "solutions"
73
74
  Provides-Extra: logging
74
75
  Requires-Dist: wandb; extra == "logging"
75
76
  Requires-Dist: tensorboard; extra == "logging"
@@ -232,6 +232,7 @@ ultralytics/solutions/parking_management.py
232
232
  ultralytics/solutions/queue_management.py
233
233
  ultralytics/solutions/region_counter.py
234
234
  ultralytics/solutions/security_alarm.py
235
+ ultralytics/solutions/similarity_search.py
235
236
  ultralytics/solutions/solutions.py
236
237
  ultralytics/solutions/speed_estimation.py
237
238
  ultralytics/solutions/streamlit_inference.py
@@ -58,3 +58,4 @@ mlflow
58
58
  [solutions]
59
59
  shapely>=2.0.0
60
60
  streamlit>=1.29.0
61
+ flask
File without changes
File without changes
File without changes