ultralytics 8.3.113__tar.gz → 8.3.115__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 (271) hide show
  1. {ultralytics-8.3.113/ultralytics.egg-info → ultralytics-8.3.115}/PKG-INFO +1 -1
  2. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/__init__.py +1 -1
  3. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/dota8-multispectral.yaml +1 -1
  4. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/trackers/botsort.yaml +4 -3
  5. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/data/utils.py +3 -2
  6. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/engine/exporter.py +1 -1
  7. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/detect/predict.py +25 -1
  8. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/nn/autobackend.py +1 -1
  9. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/trackers/bot_sort.py +32 -8
  10. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/trackers/byte_tracker.py +3 -3
  11. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/trackers/track.py +20 -1
  12. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/__init__.py +1 -1
  13. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/ops.py +16 -6
  14. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/patches.py +2 -1
  15. {ultralytics-8.3.113 → ultralytics-8.3.115/ultralytics.egg-info}/PKG-INFO +1 -1
  16. {ultralytics-8.3.113 → ultralytics-8.3.115}/LICENSE +0 -0
  17. {ultralytics-8.3.113 → ultralytics-8.3.115}/README.md +0 -0
  18. {ultralytics-8.3.113 → ultralytics-8.3.115}/pyproject.toml +0 -0
  19. {ultralytics-8.3.113 → ultralytics-8.3.115}/setup.cfg +0 -0
  20. {ultralytics-8.3.113 → ultralytics-8.3.115}/tests/test_cli.py +0 -0
  21. {ultralytics-8.3.113 → ultralytics-8.3.115}/tests/test_cuda.py +0 -0
  22. {ultralytics-8.3.113 → ultralytics-8.3.115}/tests/test_engine.py +0 -0
  23. {ultralytics-8.3.113 → ultralytics-8.3.115}/tests/test_exports.py +0 -0
  24. {ultralytics-8.3.113 → ultralytics-8.3.115}/tests/test_integrations.py +0 -0
  25. {ultralytics-8.3.113 → ultralytics-8.3.115}/tests/test_python.py +0 -0
  26. {ultralytics-8.3.113 → ultralytics-8.3.115}/tests/test_solutions.py +0 -0
  27. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/assets/bus.jpg +0 -0
  28. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/assets/zidane.jpg +0 -0
  29. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/__init__.py +0 -0
  30. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
  31. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
  32. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
  33. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
  34. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
  35. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
  36. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
  37. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/VOC.yaml +0 -0
  38. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
  39. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
  40. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
  41. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
  42. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
  43. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/coco.yaml +0 -0
  44. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
  45. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/coco128.yaml +0 -0
  46. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/coco8-multispectral.yaml +0 -0
  47. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
  48. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
  49. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/coco8.yaml +0 -0
  50. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
  51. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/dog-pose.yaml +0 -0
  52. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/dota8.yaml +0 -0
  53. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/hand-keypoints.yaml +0 -0
  54. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/lvis.yaml +0 -0
  55. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/medical-pills.yaml +0 -0
  56. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
  57. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
  58. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/signature.yaml +0 -0
  59. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
  60. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/datasets/xView.yaml +0 -0
  61. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/default.yaml +0 -0
  62. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/11/yolo11-cls-resnet18.yaml +0 -0
  63. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/11/yolo11-cls.yaml +0 -0
  64. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/11/yolo11-obb.yaml +0 -0
  65. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/11/yolo11-pose.yaml +0 -0
  66. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/11/yolo11-seg.yaml +0 -0
  67. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/11/yolo11.yaml +0 -0
  68. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/11/yoloe-11-seg.yaml +0 -0
  69. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/11/yoloe-11.yaml +0 -0
  70. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/12/yolo12-cls.yaml +0 -0
  71. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/12/yolo12-obb.yaml +0 -0
  72. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/12/yolo12-pose.yaml +0 -0
  73. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/12/yolo12-seg.yaml +0 -0
  74. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/12/yolo12.yaml +0 -0
  75. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
  76. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
  77. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
  78. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
  79. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v10/yolov10b.yaml +0 -0
  80. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v10/yolov10l.yaml +0 -0
  81. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v10/yolov10m.yaml +0 -0
  82. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v10/yolov10n.yaml +0 -0
  83. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v10/yolov10s.yaml +0 -0
  84. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v10/yolov10x.yaml +0 -0
  85. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
  86. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
  87. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
  88. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
  89. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
  90. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
  91. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v8/yoloe-v8-seg.yaml +0 -0
  92. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v8/yoloe-v8.yaml +0 -0
  93. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
  94. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
  95. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
  96. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
  97. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
  98. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
  99. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
  100. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
  101. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
  102. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
  103. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
  104. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
  105. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
  106. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
  107. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
  108. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
  109. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
  110. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
  111. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
  112. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
  113. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
  114. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v9/yolov9m.yaml +0 -0
  115. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v9/yolov9s.yaml +0 -0
  116. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/models/v9/yolov9t.yaml +0 -0
  117. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/solutions/default.yaml +0 -0
  118. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
  119. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/data/__init__.py +0 -0
  120. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/data/annotator.py +0 -0
  121. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/data/augment.py +0 -0
  122. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/data/base.py +0 -0
  123. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/data/build.py +0 -0
  124. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/data/converter.py +0 -0
  125. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/data/dataset.py +0 -0
  126. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/data/loaders.py +0 -0
  127. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/data/scripts/download_weights.sh +0 -0
  128. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/data/scripts/get_coco.sh +0 -0
  129. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/data/scripts/get_coco128.sh +0 -0
  130. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/data/scripts/get_imagenet.sh +0 -0
  131. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/data/split.py +0 -0
  132. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/data/split_dota.py +0 -0
  133. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/engine/__init__.py +0 -0
  134. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/engine/model.py +0 -0
  135. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/engine/predictor.py +0 -0
  136. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/engine/results.py +0 -0
  137. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/engine/trainer.py +0 -0
  138. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/engine/tuner.py +0 -0
  139. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/engine/validator.py +0 -0
  140. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/hub/__init__.py +0 -0
  141. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/hub/auth.py +0 -0
  142. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/hub/google/__init__.py +0 -0
  143. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/hub/session.py +0 -0
  144. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/hub/utils.py +0 -0
  145. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/__init__.py +0 -0
  146. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/fastsam/__init__.py +0 -0
  147. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/fastsam/model.py +0 -0
  148. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/fastsam/predict.py +0 -0
  149. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/fastsam/utils.py +0 -0
  150. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/fastsam/val.py +0 -0
  151. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/nas/__init__.py +0 -0
  152. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/nas/model.py +0 -0
  153. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/nas/predict.py +0 -0
  154. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/nas/val.py +0 -0
  155. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/rtdetr/__init__.py +0 -0
  156. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/rtdetr/model.py +0 -0
  157. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/rtdetr/predict.py +0 -0
  158. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/rtdetr/train.py +0 -0
  159. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/rtdetr/val.py +0 -0
  160. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/sam/__init__.py +0 -0
  161. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/sam/amg.py +0 -0
  162. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/sam/build.py +0 -0
  163. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/sam/model.py +0 -0
  164. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/sam/modules/__init__.py +0 -0
  165. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/sam/modules/blocks.py +0 -0
  166. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/sam/modules/decoders.py +0 -0
  167. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/sam/modules/encoders.py +0 -0
  168. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/sam/modules/memory_attention.py +0 -0
  169. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/sam/modules/sam.py +0 -0
  170. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
  171. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/sam/modules/transformer.py +0 -0
  172. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/sam/modules/utils.py +0 -0
  173. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/sam/predict.py +0 -0
  174. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/utils/__init__.py +0 -0
  175. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/utils/loss.py +0 -0
  176. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/utils/ops.py +0 -0
  177. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/__init__.py +0 -0
  178. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/classify/__init__.py +0 -0
  179. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/classify/predict.py +0 -0
  180. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/classify/train.py +0 -0
  181. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/classify/val.py +0 -0
  182. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/detect/__init__.py +0 -0
  183. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/detect/train.py +0 -0
  184. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/detect/val.py +0 -0
  185. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/model.py +0 -0
  186. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/obb/__init__.py +0 -0
  187. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/obb/predict.py +0 -0
  188. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/obb/train.py +0 -0
  189. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/obb/val.py +0 -0
  190. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/pose/__init__.py +0 -0
  191. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/pose/predict.py +0 -0
  192. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/pose/train.py +0 -0
  193. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/pose/val.py +0 -0
  194. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/segment/__init__.py +0 -0
  195. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/segment/predict.py +0 -0
  196. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/segment/train.py +0 -0
  197. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/segment/val.py +0 -0
  198. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/world/__init__.py +0 -0
  199. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/world/train.py +0 -0
  200. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/world/train_world.py +0 -0
  201. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/yoloe/__init__.py +0 -0
  202. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/yoloe/predict.py +0 -0
  203. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/yoloe/train.py +0 -0
  204. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/yoloe/train_seg.py +0 -0
  205. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/models/yolo/yoloe/val.py +0 -0
  206. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/nn/__init__.py +0 -0
  207. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/nn/modules/__init__.py +0 -0
  208. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/nn/modules/activation.py +0 -0
  209. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/nn/modules/block.py +0 -0
  210. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/nn/modules/conv.py +0 -0
  211. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/nn/modules/head.py +0 -0
  212. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/nn/modules/transformer.py +0 -0
  213. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/nn/modules/utils.py +0 -0
  214. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/nn/tasks.py +0 -0
  215. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/nn/text_model.py +0 -0
  216. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/solutions/__init__.py +0 -0
  217. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/solutions/ai_gym.py +0 -0
  218. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/solutions/analytics.py +0 -0
  219. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/solutions/distance_calculation.py +0 -0
  220. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/solutions/heatmap.py +0 -0
  221. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/solutions/instance_segmentation.py +0 -0
  222. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/solutions/object_blurrer.py +0 -0
  223. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/solutions/object_counter.py +0 -0
  224. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/solutions/object_cropper.py +0 -0
  225. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/solutions/parking_management.py +0 -0
  226. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/solutions/queue_management.py +0 -0
  227. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/solutions/region_counter.py +0 -0
  228. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/solutions/security_alarm.py +0 -0
  229. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/solutions/solutions.py +0 -0
  230. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/solutions/speed_estimation.py +0 -0
  231. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/solutions/streamlit_inference.py +0 -0
  232. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/solutions/trackzone.py +0 -0
  233. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/solutions/vision_eye.py +0 -0
  234. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/trackers/__init__.py +0 -0
  235. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/trackers/basetrack.py +0 -0
  236. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/trackers/utils/__init__.py +0 -0
  237. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/trackers/utils/gmc.py +0 -0
  238. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/trackers/utils/kalman_filter.py +0 -0
  239. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/trackers/utils/matching.py +0 -0
  240. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/autobatch.py +0 -0
  241. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/benchmarks.py +0 -0
  242. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/callbacks/__init__.py +0 -0
  243. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/callbacks/base.py +0 -0
  244. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/callbacks/clearml.py +0 -0
  245. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/callbacks/comet.py +0 -0
  246. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/callbacks/dvc.py +0 -0
  247. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/callbacks/hub.py +0 -0
  248. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/callbacks/mlflow.py +0 -0
  249. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/callbacks/neptune.py +0 -0
  250. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/callbacks/raytune.py +0 -0
  251. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/callbacks/tensorboard.py +0 -0
  252. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/callbacks/wb.py +0 -0
  253. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/checks.py +0 -0
  254. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/dist.py +0 -0
  255. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/downloads.py +0 -0
  256. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/errors.py +0 -0
  257. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/export.py +0 -0
  258. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/files.py +0 -0
  259. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/instance.py +0 -0
  260. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/loss.py +0 -0
  261. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/metrics.py +0 -0
  262. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/plotting.py +0 -0
  263. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/tal.py +0 -0
  264. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/torch_utils.py +0 -0
  265. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/triton.py +0 -0
  266. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics/utils/tuner.py +0 -0
  267. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics.egg-info/SOURCES.txt +0 -0
  268. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics.egg-info/dependency_links.txt +0 -0
  269. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics.egg-info/entry_points.txt +0 -0
  270. {ultralytics-8.3.113 → ultralytics-8.3.115}/ultralytics.egg-info/requires.txt +0 -0
  271. {ultralytics-8.3.113 → ultralytics-8.3.115}/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.113
3
+ Version: 8.3.115
4
4
  Summary: Ultralytics YOLO 🚀 for SOTA object detection, multi-object tracking, instance segmentation, pose estimation and image classification.
5
5
  Author-email: Glenn Jocher <glenn.jocher@ultralytics.com>, Jing Qiu <jing.qiu@ultralytics.com>
6
6
  Maintainer-email: Ultralytics <hello@ultralytics.com>
@@ -1,6 +1,6 @@
1
1
  # Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
2
2
 
3
- __version__ = "8.3.113"
3
+ __version__ = "8.3.115"
4
4
 
5
5
  import os
6
6
 
@@ -6,7 +6,7 @@
6
6
  # parent
7
7
  # ├── ultralytics
8
8
  # └── datasets
9
- # └── dota8-multispectral ← downloads here (1MB)
9
+ # └── dota8-multispectral ← downloads here (37.3MB)
10
10
 
11
11
  # Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
12
12
  path: ../datasets/dota8-multispectral # dataset root dir
@@ -15,7 +15,8 @@ fuse_score: True # Whether to fuse confidence scores with the iou distances befo
15
15
 
16
16
  # BoT-SORT settings
17
17
  gmc_method: sparseOptFlow # method of global motion compensation
18
- # ReID model related thresh (not supported yet)
19
- proximity_thresh: 0.5
20
- appearance_thresh: 0.25
18
+ # ReID model related thresh
19
+ proximity_thresh: 0.5 # minimum IoU for valid match with ReID
20
+ appearance_thresh: 0.25 # minimum appearance similarity for ReID
21
21
  with_reid: False
22
+ model: auto # uses native features if detector is YOLO else yolo11n-cls.pt
@@ -47,7 +47,7 @@ def img2label_paths(img_paths):
47
47
  return [sb.join(x.rsplit(sa, 1)).rsplit(".", 1)[0] + ".txt" for x in img_paths]
48
48
 
49
49
 
50
- def check_file_speeds(files, threshold_ms=10, max_files=5, prefix=""):
50
+ def check_file_speeds(files, threshold_ms=10, threshold_mb=50, max_files=5, prefix=""):
51
51
  """
52
52
  Check dataset file access speed and provide performance feedback.
53
53
 
@@ -57,6 +57,7 @@ def check_file_speeds(files, threshold_ms=10, max_files=5, prefix=""):
57
57
  Args:
58
58
  files (list): List of file paths to check for access speed.
59
59
  threshold_ms (float, optional): Threshold in milliseconds for ping time warnings.
60
+ threshold_mb (float, optional): Threshold in megabytes per second for read speed warnings.
60
61
  max_files (int, optional): The maximum number of files to check.
61
62
  prefix (str, optional): Prefix string to add to log messages.
62
63
 
@@ -112,7 +113,7 @@ def check_file_speeds(files, threshold_ms=10, max_files=5, prefix=""):
112
113
  else:
113
114
  speed_msg = ""
114
115
 
115
- if avg_ping < threshold_ms:
116
+ if avg_ping < threshold_ms or avg_speed < threshold_mb:
116
117
  LOGGER.info(f"{prefix}Fast image access ✅ ({ping_msg}{speed_msg}{size_msg})")
117
118
  else:
118
119
  LOGGER.warning(
@@ -351,7 +351,7 @@ class Exporter:
351
351
  if self.args.int8 and not self.args.data:
352
352
  self.args.data = DEFAULT_CFG.data or TASK2DATA[getattr(model, "task", "detect")] # assign default data
353
353
  LOGGER.warning(
354
- "INT8 export requires a missing 'data' arg for calibration. Using default 'data={self.args.data}'."
354
+ f"INT8 export requires a missing 'data' arg for calibration. Using default 'data={self.args.data}'."
355
355
  )
356
356
  if tfjs and (ARM64 and LINUX):
357
357
  raise SystemError("TF.js exports are not currently supported on ARM64 Linux")
@@ -51,6 +51,7 @@ class DetectionPredictor(BasePredictor):
51
51
  >>> results = predictor.predict("path/to/image.jpg")
52
52
  >>> processed_results = predictor.postprocess(preds, img, orig_imgs)
53
53
  """
54
+ save_feats = getattr(self, "save_feats", False)
54
55
  preds = ops.non_max_suppression(
55
56
  preds,
56
57
  self.args.conf,
@@ -61,12 +62,35 @@ class DetectionPredictor(BasePredictor):
61
62
  nc=len(self.model.names),
62
63
  end2end=getattr(self.model, "end2end", False),
63
64
  rotated=self.args.task == "obb",
65
+ return_idxs=save_feats,
64
66
  )
65
67
 
66
68
  if not isinstance(orig_imgs, list): # input images are a torch.Tensor, not a list
67
69
  orig_imgs = ops.convert_torch2numpy_batch(orig_imgs)
68
70
 
69
- return self.construct_results(preds, img, orig_imgs, **kwargs)
71
+ if save_feats:
72
+ obj_feats = self.get_obj_feats(self._feats, preds[1])
73
+ preds = preds[0]
74
+
75
+ results = self.construct_results(preds, img, orig_imgs, **kwargs)
76
+
77
+ if save_feats:
78
+ for r, f in zip(results, obj_feats):
79
+ r.feats = f # add object features to results
80
+
81
+ return results
82
+
83
+ def get_obj_feats(self, feat_maps, idxs):
84
+ """Extract object features from the feature maps."""
85
+ from math import gcd
86
+
87
+ import torch
88
+
89
+ s = gcd(*[x.shape[1] for x in feat_maps]) # find smallest vector length
90
+ obj_feats = torch.cat(
91
+ [x.permute(0, 2, 3, 1).reshape(x.shape[0], -1, s, x.shape[1] // s).mean(dim=-1) for x in feat_maps], dim=1
92
+ ) # mean reduce all vectors to same length
93
+ return [feats[idx] for feats, idx in zip(obj_feats, idxs)] # for each image in batch, indexed separately
70
94
 
71
95
  def construct_results(self, preds, img, orig_imgs):
72
96
  """
@@ -538,7 +538,7 @@ class AutoBackend(nn.Module):
538
538
  metadata = yaml_load(metadata)
539
539
  if metadata and isinstance(metadata, dict):
540
540
  for k, v in metadata.items():
541
- if k in {"stride", "batch"}:
541
+ if k in {"stride", "batch", "channels"}:
542
542
  metadata[k] = int(v)
543
543
  elif k in {"imgsz", "names", "kpt_shape", "args"} and isinstance(v, str):
544
544
  metadata[k] = eval(v)
@@ -3,6 +3,10 @@
3
3
  from collections import deque
4
4
 
5
5
  import numpy as np
6
+ import torch
7
+
8
+ from ultralytics.utils.ops import xywh2xyxy
9
+ from ultralytics.utils.plotting import save_one_box
6
10
 
7
11
  from .basetrack import TrackState
8
12
  from .byte_tracker import BYTETracker, STrack
@@ -186,14 +190,18 @@ class BOTSORT(BYTETracker):
186
190
  >>> bot_sort = BOTSORT(args, frame_rate=30)
187
191
  """
188
192
  super().__init__(args, frame_rate)
193
+ self.gmc = GMC(method=args.gmc_method)
194
+
189
195
  # ReID module
190
196
  self.proximity_thresh = args.proximity_thresh
191
197
  self.appearance_thresh = args.appearance_thresh
192
-
193
- if args.with_reid:
194
- # Haven't supported BoT-SORT(reid) yet
195
- self.encoder = None
196
- self.gmc = GMC(method=args.gmc_method)
198
+ self.encoder = (
199
+ (lambda feats, s: [f.cpu().numpy() for f in feats]) # native features do not require any model
200
+ if self.args.model == "auto"
201
+ else ReID(args.model)
202
+ if args.with_reid
203
+ else None
204
+ )
197
205
 
198
206
  def get_kalmanfilter(self):
199
207
  """Return an instance of KalmanFilterXYWH for predicting and updating object states in the tracking process."""
@@ -204,7 +212,7 @@ class BOTSORT(BYTETracker):
204
212
  if len(dets) == 0:
205
213
  return []
206
214
  if self.args.with_reid and self.encoder is not None:
207
- features_keep = self.encoder.inference(img, dets)
215
+ features_keep = self.encoder(img, dets)
208
216
  return [BOTrack(xyxy, s, c, f) for (xyxy, s, c, f) in zip(dets, scores, cls, features_keep)] # detections
209
217
  else:
210
218
  return [BOTrack(xyxy, s, c) for (xyxy, s, c) in zip(dets, scores, cls)] # detections
@@ -212,14 +220,14 @@ class BOTSORT(BYTETracker):
212
220
  def get_dists(self, tracks, detections):
213
221
  """Calculate distances between tracks and detections using IoU and optionally ReID embeddings."""
214
222
  dists = matching.iou_distance(tracks, detections)
215
- dists_mask = dists > self.proximity_thresh
223
+ dists_mask = dists > (1 - self.proximity_thresh)
216
224
 
217
225
  if self.args.fuse_score:
218
226
  dists = matching.fuse_score(dists, detections)
219
227
 
220
228
  if self.args.with_reid and self.encoder is not None:
221
229
  emb_dists = matching.embedding_distance(tracks, detections) / 2.0
222
- emb_dists[emb_dists > self.appearance_thresh] = 1.0
230
+ emb_dists[emb_dists > (1 - self.appearance_thresh)] = 1.0
223
231
  emb_dists[dists_mask] = 1.0
224
232
  dists = np.minimum(dists, emb_dists)
225
233
  return dists
@@ -232,3 +240,19 @@ class BOTSORT(BYTETracker):
232
240
  """Reset the BOTSORT tracker to its initial state, clearing all tracked objects and internal states."""
233
241
  super().reset()
234
242
  self.gmc.reset_params()
243
+
244
+
245
+ class ReID:
246
+ """YOLO model as encoder for re-identification."""
247
+
248
+ def __init__(self, model):
249
+ """Initialize encoder for re-identification."""
250
+ from ultralytics import YOLO
251
+
252
+ self.model = YOLO(model)
253
+ self.model(embed=[len(self.model.model.model) - 2 if ".pt" in model else -1], verbose=False) # initialize
254
+
255
+ def __call__(self, img, dets):
256
+ """Extract embeddings for detected objects."""
257
+ feats = self.model([save_one_box(det, img, save=False) for det in xywh2xyxy(torch.from_numpy(dets[:, :4]))])
258
+ return [f.cpu().numpy() for f in feats]
@@ -290,7 +290,7 @@ class BYTETracker:
290
290
  self.kalman_filter = self.get_kalmanfilter()
291
291
  self.reset_id()
292
292
 
293
- def update(self, results, img=None):
293
+ def update(self, results, img=None, feats=None):
294
294
  """Updates the tracker with new detections and returns the current list of tracked objects."""
295
295
  self.frame_id += 1
296
296
  activated_stracks = []
@@ -316,7 +316,7 @@ class BYTETracker:
316
316
  cls_keep = cls[remain_inds]
317
317
  cls_second = cls[inds_second]
318
318
 
319
- detections = self.init_track(dets, scores_keep, cls_keep, img)
319
+ detections = self.init_track(dets, scores_keep, cls_keep, img if feats is None else feats)
320
320
  # Add newly detected tracklets to tracked_stracks
321
321
  unconfirmed = []
322
322
  tracked_stracks = [] # type: list[STrack]
@@ -347,7 +347,7 @@ class BYTETracker:
347
347
  track.re_activate(det, self.frame_id, new_id=False)
348
348
  refind_stracks.append(track)
349
349
  # Step 3: Second association, with low score detection boxes association the untrack to the low score detections
350
- detections_second = self.init_track(dets_second, scores_second, cls_second, img)
350
+ detections_second = self.init_track(dets_second, scores_second, cls_second, img if feats is None else feats)
351
351
  r_tracked_stracks = [strack_pool[i] for i in u_track if strack_pool[i].state == TrackState.Tracked]
352
352
  # TODO
353
353
  dists = matching.iou_distance(r_tracked_stracks, detections_second)
@@ -44,6 +44,25 @@ def on_predict_start(predictor: object, persist: bool = False) -> None:
44
44
  if cfg.tracker_type not in {"bytetrack", "botsort"}:
45
45
  raise AssertionError(f"Only 'bytetrack' and 'botsort' are supported for now, but got '{cfg.tracker_type}'")
46
46
 
47
+ if cfg.tracker_type == "botsort" and cfg.with_reid and cfg.model == "auto":
48
+ from ultralytics.nn.modules.head import Detect
49
+
50
+ if not (
51
+ isinstance(predictor.model.model, torch.nn.Module)
52
+ and isinstance(predictor.model.model.model[-1], Detect)
53
+ and not predictor.model.model.model[-1].end2end
54
+ ):
55
+ cfg.model = "yolo11n-cls.pt"
56
+ else:
57
+ predictor.save_feats = True
58
+ predictor._feats = None
59
+
60
+ # Register hook to extract input of Detect layer
61
+ def capture_io(module, input, output):
62
+ predictor._feats = input[0]
63
+
64
+ predictor.model.model.model[-1].register_forward_hook(capture_io)
65
+
47
66
  trackers = []
48
67
  for _ in range(predictor.dataset.bs):
49
68
  tracker = TRACKER_MAP[cfg.tracker_type](args=cfg, frame_rate=30)
@@ -79,7 +98,7 @@ def on_predict_postprocess_end(predictor: object, persist: bool = False) -> None
79
98
  det = (result.obb if is_obb else result.boxes).cpu().numpy()
80
99
  if len(det) == 0:
81
100
  continue
82
- tracks = tracker.update(det, result.orig_img)
101
+ tracks = tracker.update(det, result.orig_img, getattr(result, "feats", None))
83
102
  if len(tracks) == 0:
84
103
  continue
85
104
  idx = tracks[:, -1].astype(int)
@@ -1261,7 +1261,7 @@ class SettingsManager(JSONDict):
1261
1261
  "For help see https://docs.ultralytics.com/quickstart/#ultralytics-settings."
1262
1262
  )
1263
1263
 
1264
- with torch_distributed_zero_first(RANK):
1264
+ with torch_distributed_zero_first(LOCAL_RANK):
1265
1265
  super().__init__(self.file)
1266
1266
 
1267
1267
  if not self.file.exists() or not self: # Check if file doesn't exist or is empty
@@ -194,6 +194,7 @@ def non_max_suppression(
194
194
  in_place=True,
195
195
  rotated=False,
196
196
  end2end=False,
197
+ return_idxs=False,
197
198
  ):
198
199
  """
199
200
  Perform non-maximum suppression (NMS) on a set of boxes, with support for masks and multiple labels per box.
@@ -221,6 +222,7 @@ def non_max_suppression(
221
222
  in_place (bool): If True, the input prediction tensor will be modified in place.
222
223
  rotated (bool): If Oriented Bounding Boxes (OBB) are being passed for NMS.
223
224
  end2end (bool): If the model doesn't require NMS.
225
+ return_idxs (bool): Return the indices of the detections that were kept.
224
226
 
225
227
  Returns:
226
228
  (List[torch.Tensor]): A list of length batch_size, where each element is a tensor of
@@ -248,6 +250,7 @@ def non_max_suppression(
248
250
  nm = prediction.shape[1] - nc - 4 # number of masks
249
251
  mi = 4 + nc # mask start index
250
252
  xc = prediction[:, 4:mi].amax(1) > conf_thres # candidates
253
+ xinds = torch.stack([torch.arange(len(i), device=prediction.device) for i in xc])[..., None] # to track idxs
251
254
 
252
255
  # Settings
253
256
  # min_wh = 2 # (pixels) minimum box width and height
@@ -263,10 +266,12 @@ def non_max_suppression(
263
266
 
264
267
  t = time.time()
265
268
  output = [torch.zeros((0, 6 + nm), device=prediction.device)] * bs
266
- for xi, x in enumerate(prediction): # image index, image inference
269
+ keepi = [torch.zeros((0, 1), device=prediction.device)] * bs # to store the kept idxs
270
+ for xi, (x, xk) in enumerate(zip(prediction, xinds)): # image index, (preds, preds indices)
267
271
  # Apply constraints
268
272
  # x[((x[:, 2:4] < min_wh) | (x[:, 2:4] > max_wh)).any(1), 4] = 0 # width-height
269
- x = x[xc[xi]] # confidence
273
+ filt = xc[xi] # confidence
274
+ x, xk = x[filt], xk[filt]
270
275
 
271
276
  # Cat apriori labels if autolabelling
272
277
  if labels and len(labels[xi]) and not rotated:
@@ -286,20 +291,25 @@ def non_max_suppression(
286
291
  if multi_label:
287
292
  i, j = torch.where(cls > conf_thres)
288
293
  x = torch.cat((box[i], x[i, 4 + j, None], j[:, None].float(), mask[i]), 1)
294
+ xk = xk[i]
289
295
  else: # best class only
290
296
  conf, j = cls.max(1, keepdim=True)
291
- x = torch.cat((box, conf, j.float(), mask), 1)[conf.view(-1) > conf_thres]
297
+ filt = conf.view(-1) > conf_thres
298
+ x = torch.cat((box, conf, j.float(), mask), 1)[filt]
299
+ xk = xk[filt]
292
300
 
293
301
  # Filter by class
294
302
  if classes is not None:
295
303
  x = x[(x[:, 5:6] == classes).any(1)]
304
+ x, xk = x[filt], xk[filt]
296
305
 
297
306
  # Check shape
298
307
  n = x.shape[0] # number of boxes
299
308
  if not n: # no boxes
300
309
  continue
301
310
  if n > max_nms: # excess boxes
302
- x = x[x[:, 4].argsort(descending=True)[:max_nms]] # sort by confidence and remove excess boxes
311
+ filt = x[:, 4].argsort(descending=True)[:max_nms] # sort by confidence and remove excess boxes
312
+ x, xk = x[filt], xk[filt]
303
313
 
304
314
  # Batched NMS
305
315
  c = x[:, 5:6] * (0 if agnostic else max_wh) # classes
@@ -324,12 +334,12 @@ def non_max_suppression(
324
334
  # if redundant:
325
335
  # i = i[iou.sum(1) > 1] # require redundancy
326
336
 
327
- output[xi] = x[i]
337
+ output[xi], keepi[xi] = x[i], xk[i].reshape(-1)
328
338
  if (time.time() - t) > time_limit:
329
339
  LOGGER.warning(f"NMS time limit {time_limit:.3f}s exceeded")
330
340
  break # time limit exceeded
331
341
 
332
- return output
342
+ return (output, keepi) if return_idxs else output
333
343
 
334
344
 
335
345
  def clip_boxes(boxes, shape):
@@ -31,7 +31,8 @@ def imread(filename: str, flags: int = cv2.IMREAD_COLOR):
31
31
  if filename.endswith((".tiff", ".tif")):
32
32
  success, frames = cv2.imdecodemulti(file_bytes, cv2.IMREAD_UNCHANGED)
33
33
  if success:
34
- return np.stack(frames, axis=2) # or np.asarray(frames).transpose(1,2,0)
34
+ # handle RGB images in tif/tiff format
35
+ return frames[0] if len(frames) == 1 and frames[0].ndim == 3 else np.stack(frames, axis=2)
35
36
  return None
36
37
  else:
37
38
  return cv2.imdecode(file_bytes, flags)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ultralytics
3
- Version: 8.3.113
3
+ Version: 8.3.115
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>
File without changes
File without changes
File without changes