ultralytics 8.2.76__tar.gz → 8.2.78__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.

Potentially problematic release.


This version of ultralytics might be problematic. Click here for more details.

Files changed (238) hide show
  1. {ultralytics-8.2.76/ultralytics.egg-info → ultralytics-8.2.78}/PKG-INFO +3 -3
  2. {ultralytics-8.2.76 → ultralytics-8.2.78}/README.md +2 -2
  3. {ultralytics-8.2.76 → ultralytics-8.2.78}/tests/test_cli.py +1 -3
  4. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/__init__.py +1 -1
  5. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/__init__.py +1 -1
  6. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/data/augment.py +0 -2
  7. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/engine/model.py +1 -0
  8. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/engine/results.py +19 -5
  9. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/engine/trainer.py +3 -1
  10. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/yolo/detect/train.py +1 -1
  11. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/trackers/basetrack.py +31 -12
  12. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/trackers/bot_sort.py +58 -24
  13. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/trackers/byte_tracker.py +75 -42
  14. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/trackers/track.py +17 -2
  15. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/trackers/utils/gmc.py +52 -38
  16. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/trackers/utils/kalman_filter.py +162 -31
  17. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/trackers/utils/matching.py +38 -14
  18. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/utils/__init__.py +1 -1
  19. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/utils/files.py +69 -34
  20. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/utils/plotting.py +11 -3
  21. {ultralytics-8.2.76 → ultralytics-8.2.78/ultralytics.egg-info}/PKG-INFO +3 -3
  22. {ultralytics-8.2.76 → ultralytics-8.2.78}/LICENSE +0 -0
  23. {ultralytics-8.2.76 → ultralytics-8.2.78}/pyproject.toml +0 -0
  24. {ultralytics-8.2.76 → ultralytics-8.2.78}/setup.cfg +0 -0
  25. {ultralytics-8.2.76 → ultralytics-8.2.78}/tests/__init__.py +0 -0
  26. {ultralytics-8.2.76 → ultralytics-8.2.78}/tests/conftest.py +0 -0
  27. {ultralytics-8.2.76 → ultralytics-8.2.78}/tests/test_cuda.py +0 -0
  28. {ultralytics-8.2.76 → ultralytics-8.2.78}/tests/test_engine.py +0 -0
  29. {ultralytics-8.2.76 → ultralytics-8.2.78}/tests/test_explorer.py +0 -0
  30. {ultralytics-8.2.76 → ultralytics-8.2.78}/tests/test_exports.py +0 -0
  31. {ultralytics-8.2.76 → ultralytics-8.2.78}/tests/test_integrations.py +0 -0
  32. {ultralytics-8.2.76 → ultralytics-8.2.78}/tests/test_python.py +0 -0
  33. {ultralytics-8.2.76 → ultralytics-8.2.78}/tests/test_solutions.py +0 -0
  34. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/assets/bus.jpg +0 -0
  35. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/assets/zidane.jpg +0 -0
  36. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
  37. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
  38. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
  39. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
  40. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
  41. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
  42. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
  43. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/datasets/VOC.yaml +0 -0
  44. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
  45. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
  46. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
  47. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
  48. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
  49. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/datasets/coco.yaml +0 -0
  50. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
  51. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/datasets/coco128.yaml +0 -0
  52. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
  53. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
  54. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/datasets/coco8.yaml +0 -0
  55. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
  56. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/datasets/dota8.yaml +0 -0
  57. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/datasets/lvis.yaml +0 -0
  58. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
  59. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
  60. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/datasets/signature.yaml +0 -0
  61. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
  62. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/datasets/xView.yaml +0 -0
  63. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/default.yaml +0 -0
  64. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
  65. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
  66. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
  67. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
  68. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/models/v10/yolov10b.yaml +0 -0
  69. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/models/v10/yolov10l.yaml +0 -0
  70. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/models/v10/yolov10m.yaml +0 -0
  71. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/models/v10/yolov10n.yaml +0 -0
  72. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/models/v10/yolov10s.yaml +0 -0
  73. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/models/v10/yolov10x.yaml +0 -0
  74. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
  75. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
  76. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
  77. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
  78. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
  79. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
  80. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
  81. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
  82. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
  83. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
  84. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
  85. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
  86. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
  87. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
  88. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
  89. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
  90. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
  91. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
  92. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
  93. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
  94. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
  95. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
  96. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
  97. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
  98. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
  99. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
  100. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
  101. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/models/v9/yolov9m.yaml +0 -0
  102. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/models/v9/yolov9s.yaml +0 -0
  103. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/models/v9/yolov9t.yaml +0 -0
  104. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/trackers/botsort.yaml +0 -0
  105. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
  106. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/data/__init__.py +0 -0
  107. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/data/annotator.py +0 -0
  108. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/data/base.py +0 -0
  109. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/data/build.py +0 -0
  110. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/data/converter.py +0 -0
  111. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/data/dataset.py +0 -0
  112. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/data/explorer/__init__.py +0 -0
  113. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/data/explorer/explorer.py +0 -0
  114. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/data/explorer/gui/__init__.py +0 -0
  115. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/data/explorer/gui/dash.py +0 -0
  116. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/data/explorer/utils.py +0 -0
  117. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/data/loaders.py +0 -0
  118. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/data/split_dota.py +0 -0
  119. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/data/utils.py +0 -0
  120. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/engine/__init__.py +0 -0
  121. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/engine/exporter.py +0 -0
  122. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/engine/predictor.py +0 -0
  123. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/engine/tuner.py +0 -0
  124. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/engine/validator.py +0 -0
  125. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/hub/__init__.py +0 -0
  126. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/hub/auth.py +0 -0
  127. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/hub/google/__init__.py +0 -0
  128. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/hub/session.py +0 -0
  129. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/hub/utils.py +0 -0
  130. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/__init__.py +0 -0
  131. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/fastsam/__init__.py +0 -0
  132. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/fastsam/model.py +0 -0
  133. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/fastsam/predict.py +0 -0
  134. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/fastsam/utils.py +0 -0
  135. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/fastsam/val.py +0 -0
  136. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/nas/__init__.py +0 -0
  137. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/nas/model.py +0 -0
  138. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/nas/predict.py +0 -0
  139. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/nas/val.py +0 -0
  140. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/rtdetr/__init__.py +0 -0
  141. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/rtdetr/model.py +0 -0
  142. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/rtdetr/predict.py +0 -0
  143. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/rtdetr/train.py +0 -0
  144. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/rtdetr/val.py +0 -0
  145. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/sam/__init__.py +0 -0
  146. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/sam/amg.py +0 -0
  147. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/sam/build.py +0 -0
  148. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/sam/model.py +0 -0
  149. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/sam/modules/__init__.py +0 -0
  150. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/sam/modules/blocks.py +0 -0
  151. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/sam/modules/decoders.py +0 -0
  152. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/sam/modules/encoders.py +0 -0
  153. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/sam/modules/memory_attention.py +0 -0
  154. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/sam/modules/sam.py +0 -0
  155. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
  156. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/sam/modules/transformer.py +0 -0
  157. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/sam/modules/utils.py +0 -0
  158. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/sam/predict.py +0 -0
  159. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/utils/__init__.py +0 -0
  160. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/utils/loss.py +0 -0
  161. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/utils/ops.py +0 -0
  162. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/yolo/__init__.py +0 -0
  163. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/yolo/classify/__init__.py +0 -0
  164. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/yolo/classify/predict.py +0 -0
  165. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/yolo/classify/train.py +0 -0
  166. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/yolo/classify/val.py +0 -0
  167. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/yolo/detect/__init__.py +0 -0
  168. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/yolo/detect/predict.py +0 -0
  169. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/yolo/detect/val.py +0 -0
  170. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/yolo/model.py +0 -0
  171. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/yolo/obb/__init__.py +0 -0
  172. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/yolo/obb/predict.py +0 -0
  173. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/yolo/obb/train.py +0 -0
  174. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/yolo/obb/val.py +0 -0
  175. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/yolo/pose/__init__.py +0 -0
  176. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/yolo/pose/predict.py +0 -0
  177. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/yolo/pose/train.py +0 -0
  178. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/yolo/pose/val.py +0 -0
  179. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/yolo/segment/__init__.py +0 -0
  180. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/yolo/segment/predict.py +0 -0
  181. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/yolo/segment/train.py +0 -0
  182. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/yolo/segment/val.py +0 -0
  183. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/yolo/world/__init__.py +0 -0
  184. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/yolo/world/train.py +0 -0
  185. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/models/yolo/world/train_world.py +0 -0
  186. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/nn/__init__.py +0 -0
  187. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/nn/autobackend.py +0 -0
  188. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/nn/modules/__init__.py +0 -0
  189. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/nn/modules/activation.py +0 -0
  190. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/nn/modules/block.py +0 -0
  191. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/nn/modules/conv.py +0 -0
  192. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/nn/modules/head.py +0 -0
  193. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/nn/modules/transformer.py +0 -0
  194. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/nn/modules/utils.py +0 -0
  195. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/nn/tasks.py +0 -0
  196. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/solutions/__init__.py +0 -0
  197. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/solutions/ai_gym.py +0 -0
  198. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/solutions/analytics.py +0 -0
  199. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/solutions/distance_calculation.py +0 -0
  200. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/solutions/heatmap.py +0 -0
  201. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/solutions/object_counter.py +0 -0
  202. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/solutions/parking_management.py +0 -0
  203. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/solutions/queue_management.py +0 -0
  204. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/solutions/speed_estimation.py +0 -0
  205. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/solutions/streamlit_inference.py +0 -0
  206. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/trackers/__init__.py +0 -0
  207. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/trackers/utils/__init__.py +0 -0
  208. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/utils/autobatch.py +0 -0
  209. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/utils/benchmarks.py +0 -0
  210. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/utils/callbacks/__init__.py +0 -0
  211. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/utils/callbacks/base.py +0 -0
  212. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/utils/callbacks/clearml.py +0 -0
  213. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/utils/callbacks/comet.py +0 -0
  214. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/utils/callbacks/dvc.py +0 -0
  215. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/utils/callbacks/hub.py +0 -0
  216. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/utils/callbacks/mlflow.py +0 -0
  217. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/utils/callbacks/neptune.py +0 -0
  218. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/utils/callbacks/raytune.py +0 -0
  219. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/utils/callbacks/tensorboard.py +0 -0
  220. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/utils/callbacks/wb.py +0 -0
  221. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/utils/checks.py +0 -0
  222. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/utils/dist.py +0 -0
  223. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/utils/downloads.py +0 -0
  224. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/utils/errors.py +0 -0
  225. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/utils/instance.py +0 -0
  226. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/utils/loss.py +0 -0
  227. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/utils/metrics.py +0 -0
  228. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/utils/ops.py +0 -0
  229. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/utils/patches.py +0 -0
  230. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/utils/tal.py +0 -0
  231. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/utils/torch_utils.py +0 -0
  232. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/utils/triton.py +0 -0
  233. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics/utils/tuner.py +0 -0
  234. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics.egg-info/SOURCES.txt +0 -0
  235. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics.egg-info/dependency_links.txt +0 -0
  236. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics.egg-info/entry_points.txt +0 -0
  237. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics.egg-info/requires.txt +0 -0
  238. {ultralytics-8.2.76 → ultralytics-8.2.78}/ultralytics.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ultralytics
3
- Version: 8.2.76
3
+ Version: 8.2.78
4
4
  Summary: Ultralytics YOLOv8 for SOTA object detection, multi-object tracking, instance segmentation, pose estimation and image classification.
5
5
  Author: Glenn Jocher, Ayush Chaurasia, Jing Qiu
6
6
  Maintainer: Glenn Jocher, Ayush Chaurasia, Jing Qiu
@@ -84,7 +84,7 @@ Requires-Dist: pycocotools>=2.0.7; extra == "extra"
84
84
 
85
85
  <div align="center">
86
86
  <p>
87
- <a href="https://github.com/ultralytics/assets/releases/tag/v8.2.0" target="_blank">
87
+ <a href="https://www.ultralytics.com/events/yolovision" target="_blank">
88
88
  <img width="100%" src="https://raw.githubusercontent.com/ultralytics/assets/main/yolov8/banner-yolov8.png" alt="YOLO Vision banner"></a>
89
89
  </p>
90
90
 
@@ -349,7 +349,7 @@ We love your input! YOLOv5 and YOLOv8 would not be possible without help from ou
349
349
 
350
350
  <!-- SVG image from https://opencollective.com/ultralytics/contributors.svg?width=990 -->
351
351
 
352
- <a href="https://github.com/ultralytics/yolov5/graphs/contributors">
352
+ <a href="https://github.com/ultralytics/ultralytics/graphs/contributors">
353
353
  <img width="100%" src="https://github.com/ultralytics/assets/raw/main/im/image-contributors.png" alt="Ultralytics open-source contributors"></a>
354
354
 
355
355
  ## <div align="center">License</div>
@@ -1,6 +1,6 @@
1
1
  <div align="center">
2
2
  <p>
3
- <a href="https://github.com/ultralytics/assets/releases/tag/v8.2.0" target="_blank">
3
+ <a href="https://www.ultralytics.com/events/yolovision" target="_blank">
4
4
  <img width="100%" src="https://raw.githubusercontent.com/ultralytics/assets/main/yolov8/banner-yolov8.png" alt="YOLO Vision banner"></a>
5
5
  </p>
6
6
 
@@ -265,7 +265,7 @@ We love your input! YOLOv5 and YOLOv8 would not be possible without help from ou
265
265
 
266
266
  <!-- SVG image from https://opencollective.com/ultralytics/contributors.svg?width=990 -->
267
267
 
268
- <a href="https://github.com/ultralytics/yolov5/graphs/contributors">
268
+ <a href="https://github.com/ultralytics/ultralytics/graphs/contributors">
269
269
  <img width="100%" src="https://github.com/ultralytics/assets/raw/main/im/image-contributors.png" alt="Ultralytics open-source contributors"></a>
270
270
 
271
271
  ## <div align="center">License</div>
@@ -84,9 +84,7 @@ def test_fastsam(task="segment", model=WEIGHTS_DIR / "FastSAM-s.pt", data="coco8
84
84
  new_masks, _ = Predictor.remove_small_regions(everything_results[0].masks.data, min_area=20)
85
85
 
86
86
  # Run inference with bboxes and points and texts prompt at the same time
87
- results = sam_model(
88
- source, bboxes=[439, 437, 524, 709], points=[[200, 200]], labels=[1], texts="a photo of a dog"
89
- )
87
+ sam_model(source, bboxes=[439, 437, 524, 709], points=[[200, 200]], labels=[1], texts="a photo of a dog")
90
88
 
91
89
 
92
90
  def test_mobilesam():
@@ -1,6 +1,6 @@
1
1
  # Ultralytics YOLO 🚀, AGPL-3.0 license
2
2
 
3
- __version__ = "8.2.76"
3
+ __version__ = "8.2.78"
4
4
 
5
5
  import os
6
6
 
@@ -81,7 +81,7 @@ CLI_HELP_MSG = f"""
81
81
  5. Explore your datasets using semantic search and SQL with a simple GUI powered by Ultralytics Explorer API
82
82
  yolo explorer data=data.yaml model=yolov8n.pt
83
83
 
84
- 6. Streamlit real-time object detection on your webcam with Ultralytics YOLOv8
84
+ 6. Streamlit real-time webcam inference GUI
85
85
  yolo streamlit-predict
86
86
 
87
87
  7. Run special commands:
@@ -539,7 +539,6 @@ class Mosaic(BaseMixTransform):
539
539
  assert 0 <= p <= 1.0, f"The probability should be in range [0, 1], but got {p}."
540
540
  assert n in {4, 9}, "grid must be equal to 4 or 9."
541
541
  super().__init__(dataset=dataset, p=p)
542
- self.dataset = dataset
543
542
  self.imgsz = imgsz
544
543
  self.border = (-imgsz // 2, -imgsz // 2) # width, height
545
544
  self.n = n
@@ -1692,7 +1691,6 @@ class CopyPaste:
1692
1691
  instances.convert_bbox(format="xyxy")
1693
1692
  instances.denormalize(w, h)
1694
1693
  if self.p and len(instances.segments):
1695
- n = len(instances)
1696
1694
  _, w, _ = im.shape # height, width, channels
1697
1695
  im_new = np.zeros(im.shape, np.uint8)
1698
1696
 
@@ -381,6 +381,7 @@ class Model(nn.Module):
381
381
  """
382
382
  self._check_is_pytorch_model()
383
383
  if isinstance(weights, (str, Path)):
384
+ self.overrides["pretrained"] = weights # remember the weights for DDP training
384
385
  weights, self.ckpt = attempt_load_one_weight(weights)
385
386
  self.model.load(weights)
386
387
  return self
@@ -460,6 +460,7 @@ class Results(SimpleClass):
460
460
  show=False,
461
461
  save=False,
462
462
  filename=None,
463
+ color_mode="class",
463
464
  ):
464
465
  """
465
466
  Plots detection results on an input RGB image.
@@ -481,6 +482,7 @@ class Results(SimpleClass):
481
482
  show (bool): Whether to display the annotated image.
482
483
  save (bool): Whether to save the annotated image.
483
484
  filename (str | None): Filename to save image if save is True.
485
+ color_mode (bool): Specify the color mode, e.g., 'instance' or 'class'. Default to 'class'.
484
486
 
485
487
  Returns:
486
488
  (np.ndarray): Annotated image as a numpy array.
@@ -491,6 +493,7 @@ class Results(SimpleClass):
491
493
  ... im = result.plot()
492
494
  ... im.show()
493
495
  """
496
+ assert color_mode in {"instance", "class"}, f"Expected color_mode='instance' or 'class', not {color_mode}."
494
497
  if img is None and isinstance(self.orig_img, torch.Tensor):
495
498
  img = (self.orig_img[0].detach().permute(1, 2, 0).contiguous() * 255).to(torch.uint8).cpu().numpy()
496
499
 
@@ -519,17 +522,22 @@ class Results(SimpleClass):
519
522
  .contiguous()
520
523
  / 255
521
524
  )
522
- idx = pred_boxes.cls if pred_boxes else range(len(pred_masks))
525
+ idx = pred_boxes.cls if pred_boxes and color_mode == "class" else reversed(range(len(pred_masks)))
523
526
  annotator.masks(pred_masks.data, colors=[colors(x, True) for x in idx], im_gpu=im_gpu)
524
527
 
525
528
  # Plot Detect results
526
529
  if pred_boxes is not None and show_boxes:
527
- for d in reversed(pred_boxes):
530
+ for i, d in enumerate(reversed(pred_boxes)):
528
531
  c, conf, id = int(d.cls), float(d.conf) if conf else None, None if d.id is None else int(d.id.item())
529
532
  name = ("" if id is None else f"id:{id} ") + names[c]
530
533
  label = (f"{name} {conf:.2f}" if conf else name) if labels else None
531
534
  box = d.xyxyxyxy.reshape(-1, 4, 2).squeeze() if is_obb else d.xyxy.squeeze()
532
- annotator.box_label(box, label, color=colors(c, True), rotated=is_obb)
535
+ annotator.box_label(
536
+ box,
537
+ label,
538
+ color=colors(i if color_mode == "instance" else c, True),
539
+ rotated=is_obb,
540
+ )
533
541
 
534
542
  # Plot Classify results
535
543
  if pred_probs is not None and show_probs:
@@ -539,8 +547,14 @@ class Results(SimpleClass):
539
547
 
540
548
  # Plot Pose results
541
549
  if self.keypoints is not None:
542
- for k in reversed(self.keypoints.data):
543
- annotator.kpts(k, self.orig_shape, radius=kpt_radius, kpt_line=kpt_line)
550
+ for i, k in enumerate(reversed(self.keypoints.data)):
551
+ annotator.kpts(
552
+ k,
553
+ self.orig_shape,
554
+ radius=kpt_radius,
555
+ kpt_line=kpt_line,
556
+ kpt_color=colors(i, True) if color_mode == "instance" else None,
557
+ )
544
558
 
545
559
  # Show results
546
560
  if show:
@@ -174,9 +174,11 @@ class BaseTrainer:
174
174
  world_size = len(self.args.device.split(","))
175
175
  elif isinstance(self.args.device, (tuple, list)): # i.e. device=[0, 1, 2, 3] (multi-GPU from CLI is list)
176
176
  world_size = len(self.args.device)
177
+ elif self.args.device in {"cpu", "mps"}: # i.e. device='cpu' or 'mps'
178
+ world_size = 0
177
179
  elif torch.cuda.is_available(): # i.e. device=None or device='' or device=number
178
180
  world_size = 1 # default to device 0
179
- else: # i.e. device='cpu' or 'mps'
181
+ else: # i.e. device=None or device=''
180
182
  world_size = 0
181
183
 
182
184
  # Run subprocess if DDP training, else train normally
@@ -60,7 +60,7 @@ class DetectionTrainer(BaseTrainer):
60
60
  if self.args.multi_scale:
61
61
  imgs = batch["img"]
62
62
  sz = (
63
- random.randrange(self.args.imgsz * 0.5, self.args.imgsz * 1.5 + self.stride)
63
+ random.randrange(int(self.args.imgsz * 0.5), int(self.args.imgsz * 1.5 + self.stride))
64
64
  // self.stride
65
65
  * self.stride
66
66
  ) # size
@@ -15,6 +15,11 @@ class TrackState:
15
15
  Tracked (int): State when the object is successfully tracked in subsequent frames.
16
16
  Lost (int): State when the object is no longer tracked.
17
17
  Removed (int): State when the object is removed from tracking.
18
+
19
+ Examples:
20
+ >>> state = TrackState.New
21
+ >>> if state == TrackState.New:
22
+ >>> print("Object is newly detected.")
18
23
  """
19
24
 
20
25
  New = 0
@@ -33,13 +38,13 @@ class BaseTrack:
33
38
  is_activated (bool): Flag indicating whether the track is currently active.
34
39
  state (TrackState): Current state of the track.
35
40
  history (OrderedDict): Ordered history of the track's states.
36
- features (list): List of features extracted from the object for tracking.
37
- curr_feature (any): The current feature of the object being tracked.
41
+ features (List): List of features extracted from the object for tracking.
42
+ curr_feature (Any): The current feature of the object being tracked.
38
43
  score (float): The confidence score of the tracking.
39
44
  start_frame (int): The frame number where tracking started.
40
45
  frame_id (int): The most recent frame ID processed by the track.
41
46
  time_since_update (int): Frames passed since the last update.
42
- location (tuple): The location of the object in the context of multi-camera tracking.
47
+ location (Tuple): The location of the object in the context of multi-camera tracking.
43
48
 
44
49
  Methods:
45
50
  end_frame: Returns the ID of the last frame where the object was tracked.
@@ -50,12 +55,26 @@ class BaseTrack:
50
55
  mark_lost: Marks the track as lost.
51
56
  mark_removed: Marks the track as removed.
52
57
  reset_id: Resets the global track ID counter.
58
+
59
+ Examples:
60
+ Initialize a new track and mark it as lost:
61
+ >>> track = BaseTrack()
62
+ >>> track.mark_lost()
63
+ >>> print(track.state) # Output: 2 (TrackState.Lost)
53
64
  """
54
65
 
55
66
  _count = 0
56
67
 
57
68
  def __init__(self):
58
- """Initializes a new track with unique ID and foundational tracking attributes."""
69
+ """
70
+ Initializes a new track with a unique ID and foundational tracking attributes.
71
+
72
+ Examples:
73
+ Initialize a new track
74
+ >>> track = BaseTrack()
75
+ >>> print(track.track_id)
76
+ 0
77
+ """
59
78
  self.track_id = 0
60
79
  self.is_activated = False
61
80
  self.state = TrackState.New
@@ -70,36 +89,36 @@ class BaseTrack:
70
89
 
71
90
  @property
72
91
  def end_frame(self):
73
- """Return the last frame ID of the track."""
92
+ """Returns the ID of the most recent frame where the object was tracked."""
74
93
  return self.frame_id
75
94
 
76
95
  @staticmethod
77
96
  def next_id():
78
- """Increment and return the global track ID counter."""
97
+ """Increment and return the next unique global track ID for object tracking."""
79
98
  BaseTrack._count += 1
80
99
  return BaseTrack._count
81
100
 
82
101
  def activate(self, *args):
83
- """Abstract method to activate the track with provided arguments."""
102
+ """Activates the track with provided arguments, initializing necessary attributes for tracking."""
84
103
  raise NotImplementedError
85
104
 
86
105
  def predict(self):
87
- """Abstract method to predict the next state of the track."""
106
+ """Predicts the next state of the track based on the current state and tracking model."""
88
107
  raise NotImplementedError
89
108
 
90
109
  def update(self, *args, **kwargs):
91
- """Abstract method to update the track with new observations."""
110
+ """Updates the track with new observations and data, modifying its state and attributes accordingly."""
92
111
  raise NotImplementedError
93
112
 
94
113
  def mark_lost(self):
95
- """Mark the track as lost."""
114
+ """Marks the track as lost by updating its state to TrackState.Lost."""
96
115
  self.state = TrackState.Lost
97
116
 
98
117
  def mark_removed(self):
99
- """Mark the track as removed."""
118
+ """Marks the track as removed by setting its state to TrackState.Removed."""
100
119
  self.state = TrackState.Removed
101
120
 
102
121
  @staticmethod
103
122
  def reset_id():
104
- """Reset the global track ID counter."""
123
+ """Reset the global track ID counter to its initial value."""
105
124
  BaseTrack._count = 0
@@ -15,6 +15,9 @@ class BOTrack(STrack):
15
15
  """
16
16
  An extended version of the STrack class for YOLOv8, adding object tracking features.
17
17
 
18
+ This class extends the STrack class to include additional functionalities for object tracking, such as feature
19
+ smoothing, Kalman filter prediction, and reactivation of tracks.
20
+
18
21
  Attributes:
19
22
  shared_kalman (KalmanFilterXYWH): A shared Kalman filter for all instances of BOTrack.
20
23
  smooth_feat (np.ndarray): Smoothed feature vector.
@@ -34,16 +37,35 @@ class BOTrack(STrack):
34
37
  convert_coords(tlwh): Converts tlwh bounding box coordinates to xywh format.
35
38
  tlwh_to_xywh(tlwh): Convert bounding box to xywh format `(center x, center y, width, height)`.
36
39
 
37
- Usage:
38
- bo_track = BOTrack(tlwh, score, cls, feat)
39
- bo_track.predict()
40
- bo_track.update(new_track, frame_id)
40
+ Examples:
41
+ Create a BOTrack instance and update its features
42
+ >>> bo_track = BOTrack(tlwh=[100, 50, 80, 40], score=0.9, cls=1, feat=np.random.rand(128))
43
+ >>> bo_track.predict()
44
+ >>> new_track = BOTrack(tlwh=[110, 60, 80, 40], score=0.85, cls=1, feat=np.random.rand(128))
45
+ >>> bo_track.update(new_track, frame_id=2)
41
46
  """
42
47
 
43
48
  shared_kalman = KalmanFilterXYWH()
44
49
 
45
50
  def __init__(self, tlwh, score, cls, feat=None, feat_history=50):
46
- """Initialize YOLOv8 object with temporal parameters, such as feature history, alpha and current features."""
51
+ """
52
+ Initialize a BOTrack object with temporal parameters, such as feature history, alpha, and current features.
53
+
54
+ Args:
55
+ tlwh (np.ndarray): Bounding box coordinates in tlwh format (top left x, top left y, width, height).
56
+ score (float): Confidence score of the detection.
57
+ cls (int): Class ID of the detected object.
58
+ feat (np.ndarray | None): Feature vector associated with the detection.
59
+ feat_history (int): Maximum length of the feature history deque.
60
+
61
+ Examples:
62
+ Initialize a BOTrack object with bounding box, score, class ID, and feature vector
63
+ >>> tlwh = np.array([100, 50, 80, 120])
64
+ >>> score = 0.9
65
+ >>> cls = 1
66
+ >>> feat = np.random.rand(128)
67
+ >>> bo_track = BOTrack(tlwh, score, cls, feat)
68
+ """
47
69
  super().__init__(tlwh, score, cls)
48
70
 
49
71
  self.smooth_feat = None
@@ -54,7 +76,7 @@ class BOTrack(STrack):
54
76
  self.alpha = 0.9
55
77
 
56
78
  def update_features(self, feat):
57
- """Update features vector and smooth it using exponential moving average."""
79
+ """Update the feature vector and apply exponential moving average smoothing."""
58
80
  feat /= np.linalg.norm(feat)
59
81
  self.curr_feat = feat
60
82
  if self.smooth_feat is None:
@@ -65,7 +87,7 @@ class BOTrack(STrack):
65
87
  self.smooth_feat /= np.linalg.norm(self.smooth_feat)
66
88
 
67
89
  def predict(self):
68
- """Predicts the mean and covariance using Kalman filter."""
90
+ """Predicts the object's future state using the Kalman filter to update its mean and covariance."""
69
91
  mean_state = self.mean.copy()
70
92
  if self.state != TrackState.Tracked:
71
93
  mean_state[6] = 0
@@ -80,14 +102,14 @@ class BOTrack(STrack):
80
102
  super().re_activate(new_track, frame_id, new_id)
81
103
 
82
104
  def update(self, new_track, frame_id):
83
- """Update the YOLOv8 instance with new track and frame ID."""
105
+ """Updates the YOLOv8 instance with new track information and the current frame ID."""
84
106
  if new_track.curr_feat is not None:
85
107
  self.update_features(new_track.curr_feat)
86
108
  super().update(new_track, frame_id)
87
109
 
88
110
  @property
89
111
  def tlwh(self):
90
- """Get current position in bounding box format `(top left x, top left y, width, height)`."""
112
+ """Returns the current bounding box position in `(top left x, top left y, width, height)` format."""
91
113
  if self.mean is None:
92
114
  return self._tlwh.copy()
93
115
  ret = self.mean[:4].copy()
@@ -96,7 +118,7 @@ class BOTrack(STrack):
96
118
 
97
119
  @staticmethod
98
120
  def multi_predict(stracks):
99
- """Predicts the mean and covariance of multiple object tracks using shared Kalman filter."""
121
+ """Predicts the mean and covariance for multiple object tracks using a shared Kalman filter."""
100
122
  if len(stracks) <= 0:
101
123
  return
102
124
  multi_mean = np.asarray([st.mean.copy() for st in stracks])
@@ -111,12 +133,12 @@ class BOTrack(STrack):
111
133
  stracks[i].covariance = cov
112
134
 
113
135
  def convert_coords(self, tlwh):
114
- """Converts Top-Left-Width-Height bounding box coordinates to X-Y-Width-Height format."""
136
+ """Converts tlwh bounding box coordinates to xywh format."""
115
137
  return self.tlwh_to_xywh(tlwh)
116
138
 
117
139
  @staticmethod
118
140
  def tlwh_to_xywh(tlwh):
119
- """Convert bounding box to format `(center x, center y, width, height)`."""
141
+ """Convert bounding box from tlwh (top-left-width-height) to xywh (center-x-center-y-width-height) format."""
120
142
  ret = np.asarray(tlwh).copy()
121
143
  ret[:2] += ret[2:] / 2
122
144
  return ret
@@ -129,9 +151,9 @@ class BOTSORT(BYTETracker):
129
151
  Attributes:
130
152
  proximity_thresh (float): Threshold for spatial proximity (IoU) between tracks and detections.
131
153
  appearance_thresh (float): Threshold for appearance similarity (ReID embeddings) between tracks and detections.
132
- encoder (object): Object to handle ReID embeddings, set to None if ReID is not enabled.
154
+ encoder (Any): Object to handle ReID embeddings, set to None if ReID is not enabled.
133
155
  gmc (GMC): An instance of the GMC algorithm for data association.
134
- args (object): Parsed command-line arguments containing tracking parameters.
156
+ args (Any): Parsed command-line arguments containing tracking parameters.
135
157
 
136
158
  Methods:
137
159
  get_kalmanfilter(): Returns an instance of KalmanFilterXYWH for object tracking.
@@ -139,17 +161,29 @@ class BOTSORT(BYTETracker):
139
161
  get_dists(tracks, detections): Get distances between tracks and detections using IoU and (optionally) ReID.
140
162
  multi_predict(tracks): Predict and track multiple objects with YOLOv8 model.
141
163
 
142
- Usage:
143
- bot_sort = BOTSORT(args, frame_rate)
144
- bot_sort.init_track(dets, scores, cls, img)
145
- bot_sort.multi_predict(tracks)
164
+ Examples:
165
+ Initialize BOTSORT and process detections
166
+ >>> bot_sort = BOTSORT(args, frame_rate=30)
167
+ >>> bot_sort.init_track(dets, scores, cls, img)
168
+ >>> bot_sort.multi_predict(tracks)
146
169
 
147
170
  Note:
148
171
  The class is designed to work with the YOLOv8 object detection model and supports ReID only if enabled via args.
149
172
  """
150
173
 
151
174
  def __init__(self, args, frame_rate=30):
152
- """Initialize YOLOv8 object with ReID module and GMC algorithm."""
175
+ """
176
+ Initialize YOLOv8 object with ReID module and GMC algorithm.
177
+
178
+ Args:
179
+ args (object): Parsed command-line arguments containing tracking parameters.
180
+ frame_rate (int): Frame rate of the video being processed.
181
+
182
+ Examples:
183
+ Initialize BOTSORT with command-line arguments and a specified frame rate:
184
+ >>> args = parse_args()
185
+ >>> bot_sort = BOTSORT(args, frame_rate=30)
186
+ """
153
187
  super().__init__(args, frame_rate)
154
188
  # ReID module
155
189
  self.proximity_thresh = args.proximity_thresh
@@ -161,11 +195,11 @@ class BOTSORT(BYTETracker):
161
195
  self.gmc = GMC(method=args.gmc_method)
162
196
 
163
197
  def get_kalmanfilter(self):
164
- """Returns an instance of KalmanFilterXYWH for object tracking."""
198
+ """Returns an instance of KalmanFilterXYWH for predicting and updating object states in the tracking process."""
165
199
  return KalmanFilterXYWH()
166
200
 
167
201
  def init_track(self, dets, scores, cls, img=None):
168
- """Initialize track with detections, scores, and classes."""
202
+ """Initialize object tracks using detection bounding boxes, scores, class labels, and optional ReID features."""
169
203
  if len(dets) == 0:
170
204
  return []
171
205
  if self.args.with_reid and self.encoder is not None:
@@ -175,7 +209,7 @@ class BOTSORT(BYTETracker):
175
209
  return [BOTrack(xyxy, s, c) for (xyxy, s, c) in zip(dets, scores, cls)] # detections
176
210
 
177
211
  def get_dists(self, tracks, detections):
178
- """Get distances between tracks and detections using IoU and (optionally) ReID embeddings."""
212
+ """Calculates distances between tracks and detections using IoU and optionally ReID embeddings."""
179
213
  dists = matching.iou_distance(tracks, detections)
180
214
  dists_mask = dists > self.proximity_thresh
181
215
 
@@ -190,10 +224,10 @@ class BOTSORT(BYTETracker):
190
224
  return dists
191
225
 
192
226
  def multi_predict(self, tracks):
193
- """Predict and track multiple objects with YOLOv8 model."""
227
+ """Predicts the mean and covariance of multiple object tracks using a shared Kalman filter."""
194
228
  BOTrack.multi_predict(tracks)
195
229
 
196
230
  def reset(self):
197
- """Reset tracker."""
231
+ """Resets the BOTSORT tracker to its initial state, clearing all tracked objects and internal states."""
198
232
  super().reset()
199
233
  self.gmc.reset_params()