ultralytics 8.3.85__tar.gz → 8.3.87__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 (251) hide show
  1. {ultralytics-8.3.85/ultralytics.egg-info → ultralytics-8.3.87}/PKG-INFO +8 -8
  2. {ultralytics-8.3.85 → ultralytics-8.3.87}/README.md +6 -6
  3. {ultralytics-8.3.85 → ultralytics-8.3.87}/pyproject.toml +1 -1
  4. {ultralytics-8.3.85 → ultralytics-8.3.87}/tests/test_solutions.py +21 -2
  5. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/__init__.py +1 -1
  6. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/__init__.py +17 -25
  7. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/datasets/Argoverse.yaml +15 -13
  8. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +24 -10
  9. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/datasets/ImageNet.yaml +1 -1
  10. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/datasets/Objects365.yaml +21 -21
  11. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/datasets/SKU-110K.yaml +11 -11
  12. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/datasets/VOC.yaml +34 -28
  13. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/datasets/VisDrone.yaml +19 -15
  14. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/datasets/coco-pose.yaml +11 -8
  15. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/datasets/coco.yaml +11 -8
  16. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/datasets/lvis.yaml +12 -8
  17. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/datasets/open-images-v7.yaml +25 -20
  18. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/datasets/xView.yaml +28 -26
  19. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/11/yolo11-cls-resnet18.yaml +1 -1
  20. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/11/yolo11-cls.yaml +6 -6
  21. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/data/annotator.py +1 -1
  22. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/data/base.py +1 -1
  23. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/data/converter.py +6 -6
  24. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/data/loaders.py +1 -1
  25. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/data/split_dota.py +2 -2
  26. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/data/utils.py +4 -4
  27. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/engine/exporter.py +3 -3
  28. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/engine/results.py +77 -42
  29. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/engine/trainer.py +12 -6
  30. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/engine/tuner.py +4 -3
  31. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/engine/validator.py +1 -1
  32. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/yolo/obb/val.py +2 -2
  33. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/nn/autobackend.py +3 -2
  34. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/nn/tasks.py +1 -1
  35. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/solutions/parking_management.py +19 -4
  36. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/utils/__init__.py +3 -4
  37. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/utils/benchmarks.py +5 -5
  38. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/utils/callbacks/comet.py +37 -5
  39. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/utils/loss.py +1 -1
  40. {ultralytics-8.3.85 → ultralytics-8.3.87/ultralytics.egg-info}/PKG-INFO +8 -8
  41. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics.egg-info/requires.txt +1 -1
  42. {ultralytics-8.3.85 → ultralytics-8.3.87}/LICENSE +0 -0
  43. {ultralytics-8.3.85 → ultralytics-8.3.87}/setup.cfg +0 -0
  44. {ultralytics-8.3.85 → ultralytics-8.3.87}/tests/__init__.py +0 -0
  45. {ultralytics-8.3.85 → ultralytics-8.3.87}/tests/conftest.py +0 -0
  46. {ultralytics-8.3.85 → ultralytics-8.3.87}/tests/test_cli.py +0 -0
  47. {ultralytics-8.3.85 → ultralytics-8.3.87}/tests/test_cuda.py +0 -0
  48. {ultralytics-8.3.85 → ultralytics-8.3.87}/tests/test_engine.py +0 -0
  49. {ultralytics-8.3.85 → ultralytics-8.3.87}/tests/test_exports.py +0 -0
  50. {ultralytics-8.3.85 → ultralytics-8.3.87}/tests/test_integrations.py +0 -0
  51. {ultralytics-8.3.85 → ultralytics-8.3.87}/tests/test_python.py +0 -0
  52. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/assets/bus.jpg +0 -0
  53. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/assets/zidane.jpg +0 -0
  54. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
  55. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
  56. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
  57. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
  58. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
  59. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
  60. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/datasets/coco128.yaml +0 -0
  61. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
  62. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
  63. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/datasets/coco8.yaml +0 -0
  64. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
  65. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/datasets/dog-pose.yaml +0 -0
  66. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/datasets/dota8.yaml +0 -0
  67. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/datasets/hand-keypoints.yaml +0 -0
  68. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/datasets/medical-pills.yaml +0 -0
  69. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
  70. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/datasets/signature.yaml +0 -0
  71. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
  72. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/default.yaml +0 -0
  73. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/11/yolo11-obb.yaml +0 -0
  74. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/11/yolo11-pose.yaml +0 -0
  75. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/11/yolo11-seg.yaml +0 -0
  76. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/11/yolo11.yaml +0 -0
  77. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/12/yolo12-cls.yaml +0 -0
  78. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/12/yolo12-obb.yaml +0 -0
  79. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/12/yolo12-pose.yaml +0 -0
  80. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/12/yolo12-seg.yaml +0 -0
  81. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/12/yolo12.yaml +0 -0
  82. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
  83. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
  84. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
  85. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
  86. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/v10/yolov10b.yaml +0 -0
  87. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/v10/yolov10l.yaml +0 -0
  88. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/v10/yolov10m.yaml +0 -0
  89. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/v10/yolov10n.yaml +0 -0
  90. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/v10/yolov10s.yaml +0 -0
  91. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/v10/yolov10x.yaml +0 -0
  92. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
  93. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
  94. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
  95. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
  96. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
  97. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
  98. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
  99. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
  100. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
  101. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
  102. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
  103. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
  104. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
  105. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
  106. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
  107. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
  108. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
  109. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
  110. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
  111. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
  112. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
  113. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
  114. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
  115. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
  116. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
  117. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
  118. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
  119. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/v9/yolov9m.yaml +0 -0
  120. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/v9/yolov9s.yaml +0 -0
  121. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/models/v9/yolov9t.yaml +0 -0
  122. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/solutions/default.yaml +0 -0
  123. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/trackers/botsort.yaml +0 -0
  124. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
  125. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/data/__init__.py +0 -0
  126. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/data/augment.py +0 -0
  127. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/data/build.py +0 -0
  128. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/data/dataset.py +0 -0
  129. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/engine/__init__.py +0 -0
  130. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/engine/model.py +0 -0
  131. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/engine/predictor.py +0 -0
  132. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/hub/__init__.py +0 -0
  133. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/hub/auth.py +0 -0
  134. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/hub/google/__init__.py +0 -0
  135. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/hub/session.py +0 -0
  136. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/hub/utils.py +0 -0
  137. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/__init__.py +0 -0
  138. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/fastsam/__init__.py +0 -0
  139. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/fastsam/model.py +0 -0
  140. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/fastsam/predict.py +0 -0
  141. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/fastsam/utils.py +0 -0
  142. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/fastsam/val.py +0 -0
  143. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/nas/__init__.py +0 -0
  144. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/nas/model.py +0 -0
  145. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/nas/predict.py +0 -0
  146. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/nas/val.py +0 -0
  147. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/rtdetr/__init__.py +0 -0
  148. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/rtdetr/model.py +0 -0
  149. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/rtdetr/predict.py +0 -0
  150. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/rtdetr/train.py +0 -0
  151. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/rtdetr/val.py +0 -0
  152. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/sam/__init__.py +0 -0
  153. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/sam/amg.py +0 -0
  154. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/sam/build.py +0 -0
  155. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/sam/model.py +0 -0
  156. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/sam/modules/__init__.py +0 -0
  157. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/sam/modules/blocks.py +0 -0
  158. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/sam/modules/decoders.py +0 -0
  159. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/sam/modules/encoders.py +0 -0
  160. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/sam/modules/memory_attention.py +0 -0
  161. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/sam/modules/sam.py +0 -0
  162. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
  163. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/sam/modules/transformer.py +0 -0
  164. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/sam/modules/utils.py +0 -0
  165. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/sam/predict.py +0 -0
  166. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/utils/__init__.py +0 -0
  167. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/utils/loss.py +0 -0
  168. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/utils/ops.py +0 -0
  169. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/yolo/__init__.py +0 -0
  170. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/yolo/classify/__init__.py +0 -0
  171. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/yolo/classify/predict.py +0 -0
  172. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/yolo/classify/train.py +0 -0
  173. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/yolo/classify/val.py +0 -0
  174. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/yolo/detect/__init__.py +0 -0
  175. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/yolo/detect/predict.py +0 -0
  176. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/yolo/detect/train.py +0 -0
  177. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/yolo/detect/val.py +0 -0
  178. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/yolo/model.py +0 -0
  179. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/yolo/obb/__init__.py +0 -0
  180. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/yolo/obb/predict.py +0 -0
  181. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/yolo/obb/train.py +0 -0
  182. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/yolo/pose/__init__.py +0 -0
  183. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/yolo/pose/predict.py +0 -0
  184. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/yolo/pose/train.py +0 -0
  185. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/yolo/pose/val.py +0 -0
  186. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/yolo/segment/__init__.py +0 -0
  187. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/yolo/segment/predict.py +0 -0
  188. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/yolo/segment/train.py +0 -0
  189. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/yolo/segment/val.py +0 -0
  190. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/yolo/world/__init__.py +0 -0
  191. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/yolo/world/train.py +0 -0
  192. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/models/yolo/world/train_world.py +0 -0
  193. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/nn/__init__.py +0 -0
  194. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/nn/modules/__init__.py +0 -0
  195. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/nn/modules/activation.py +0 -0
  196. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/nn/modules/block.py +0 -0
  197. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/nn/modules/conv.py +0 -0
  198. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/nn/modules/head.py +0 -0
  199. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/nn/modules/transformer.py +0 -0
  200. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/nn/modules/utils.py +0 -0
  201. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/solutions/__init__.py +0 -0
  202. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/solutions/ai_gym.py +0 -0
  203. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/solutions/analytics.py +0 -0
  204. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/solutions/distance_calculation.py +0 -0
  205. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/solutions/heatmap.py +0 -0
  206. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/solutions/object_counter.py +0 -0
  207. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/solutions/queue_management.py +0 -0
  208. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/solutions/region_counter.py +0 -0
  209. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/solutions/security_alarm.py +0 -0
  210. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/solutions/solutions.py +0 -0
  211. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/solutions/speed_estimation.py +0 -0
  212. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/solutions/streamlit_inference.py +0 -0
  213. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/solutions/trackzone.py +0 -0
  214. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/trackers/__init__.py +0 -0
  215. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/trackers/basetrack.py +0 -0
  216. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/trackers/bot_sort.py +0 -0
  217. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/trackers/byte_tracker.py +0 -0
  218. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/trackers/track.py +0 -0
  219. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/trackers/utils/__init__.py +0 -0
  220. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/trackers/utils/gmc.py +0 -0
  221. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/trackers/utils/kalman_filter.py +0 -0
  222. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/trackers/utils/matching.py +0 -0
  223. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/utils/autobatch.py +0 -0
  224. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/utils/callbacks/__init__.py +0 -0
  225. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/utils/callbacks/base.py +0 -0
  226. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/utils/callbacks/clearml.py +0 -0
  227. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/utils/callbacks/dvc.py +0 -0
  228. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/utils/callbacks/hub.py +0 -0
  229. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/utils/callbacks/mlflow.py +0 -0
  230. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/utils/callbacks/neptune.py +0 -0
  231. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/utils/callbacks/raytune.py +0 -0
  232. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/utils/callbacks/tensorboard.py +0 -0
  233. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/utils/callbacks/wb.py +0 -0
  234. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/utils/checks.py +0 -0
  235. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/utils/dist.py +0 -0
  236. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/utils/downloads.py +0 -0
  237. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/utils/errors.py +0 -0
  238. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/utils/files.py +0 -0
  239. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/utils/instance.py +0 -0
  240. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/utils/metrics.py +0 -0
  241. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/utils/ops.py +0 -0
  242. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/utils/patches.py +0 -0
  243. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/utils/plotting.py +0 -0
  244. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/utils/tal.py +0 -0
  245. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/utils/torch_utils.py +0 -0
  246. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/utils/triton.py +0 -0
  247. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics/utils/tuner.py +0 -0
  248. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics.egg-info/SOURCES.txt +0 -0
  249. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics.egg-info/dependency_links.txt +0 -0
  250. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics.egg-info/entry_points.txt +0 -0
  251. {ultralytics-8.3.85 → ultralytics-8.3.87}/ultralytics.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: ultralytics
3
- Version: 8.3.85
3
+ Version: 8.3.87
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>
@@ -63,7 +63,7 @@ Provides-Extra: export
63
63
  Requires-Dist: onnx>=1.12.0; extra == "export"
64
64
  Requires-Dist: coremltools>=7.0; (platform_system != "Windows" and python_version <= "3.11") and extra == "export"
65
65
  Requires-Dist: scikit-learn>=1.3.2; (platform_system != "Windows" and python_version <= "3.11") and extra == "export"
66
- Requires-Dist: openvino<2025.0.0,>=2024.0.0; extra == "export"
66
+ Requires-Dist: openvino!=2025.0.0,>=2024.0.0; extra == "export"
67
67
  Requires-Dist: tensorflow>=2.0.0; extra == "export"
68
68
  Requires-Dist: tensorflowjs>=3.9.0; extra == "export"
69
69
  Requires-Dist: tensorstore>=0.1.63; (platform_machine == "aarch64" and python_version >= "3.9") and extra == "export"
@@ -248,13 +248,13 @@ See [Segmentation Docs](https://docs.ultralytics.com/tasks/segment/) for usage e
248
248
 
249
249
  See [Classification Docs](https://docs.ultralytics.com/tasks/classify/) for usage examples with these models trained on [ImageNet](https://docs.ultralytics.com/datasets/classify/imagenet/), which include 1000 pretrained classes.
250
250
 
251
- | Model | size<br><sup>(pixels) | acc<br><sup>top1 | acc<br><sup>top5 | Speed<br><sup>CPU ONNX<br>(ms) | Speed<br><sup>T4 TensorRT10<br>(ms) | params<br><sup>(M) | FLOPs<br><sup>(B) at 640 |
251
+ | Model | size<br><sup>(pixels) | acc<br><sup>top1 | acc<br><sup>top5 | Speed<br><sup>CPU ONNX<br>(ms) | Speed<br><sup>T4 TensorRT10<br>(ms) | params<br><sup>(M) | FLOPs<br><sup>(B) at 224 |
252
252
  | -------------------------------------------------------------------------------------------- | --------------------- | ---------------- | ---------------- | ------------------------------ | ----------------------------------- | ------------------ | ------------------------ |
253
- | [YOLO11n-cls](https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11n-cls.pt) | 224 | 70.0 | 89.4 | 5.0 ± 0.3 | 1.1 ± 0.0 | 1.6 | 3.3 |
254
- | [YOLO11s-cls](https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11s-cls.pt) | 224 | 75.4 | 92.7 | 7.9 ± 0.2 | 1.3 ± 0.0 | 5.5 | 12.1 |
255
- | [YOLO11m-cls](https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11m-cls.pt) | 224 | 77.3 | 93.9 | 17.2 ± 0.4 | 2.0 ± 0.0 | 10.4 | 39.3 |
256
- | [YOLO11l-cls](https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11l-cls.pt) | 224 | 78.3 | 94.3 | 23.2 ± 0.3 | 2.8 ± 0.0 | 12.9 | 49.4 |
257
- | [YOLO11x-cls](https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11x-cls.pt) | 224 | 79.5 | 94.9 | 41.4 ± 0.9 | 3.8 ± 0.0 | 28.4 | 110.4 |
253
+ | [YOLO11n-cls](https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11n-cls.pt) | 224 | 70.0 | 89.4 | 5.0 ± 0.3 | 1.1 ± 0.0 | 1.6 | 0.5 |
254
+ | [YOLO11s-cls](https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11s-cls.pt) | 224 | 75.4 | 92.7 | 7.9 ± 0.2 | 1.3 ± 0.0 | 5.5 | 1.6 |
255
+ | [YOLO11m-cls](https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11m-cls.pt) | 224 | 77.3 | 93.9 | 17.2 ± 0.4 | 2.0 ± 0.0 | 10.4 | 5.0 |
256
+ | [YOLO11l-cls](https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11l-cls.pt) | 224 | 78.3 | 94.3 | 23.2 ± 0.3 | 2.8 ± 0.0 | 12.9 | 6.2 |
257
+ | [YOLO11x-cls](https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11x-cls.pt) | 224 | 79.5 | 94.9 | 41.4 ± 0.9 | 3.8 ± 0.0 | 28.4 | 13.7 |
258
258
 
259
259
  - **acc** values are model accuracies on the [ImageNet](https://www.image-net.org/) dataset validation set. <br>Reproduce by `yolo val classify data=path/to/ImageNet device=0`
260
260
  - **Speed** averaged over ImageNet val images using an [Amazon EC2 P4d](https://aws.amazon.com/ec2/instance-types/p4/) instance. <br>Reproduce by `yolo val classify data=path/to/ImageNet batch=1 device=0|cpu`
@@ -163,13 +163,13 @@ See [Segmentation Docs](https://docs.ultralytics.com/tasks/segment/) for usage e
163
163
 
164
164
  See [Classification Docs](https://docs.ultralytics.com/tasks/classify/) for usage examples with these models trained on [ImageNet](https://docs.ultralytics.com/datasets/classify/imagenet/), which include 1000 pretrained classes.
165
165
 
166
- | Model | size<br><sup>(pixels) | acc<br><sup>top1 | acc<br><sup>top5 | Speed<br><sup>CPU ONNX<br>(ms) | Speed<br><sup>T4 TensorRT10<br>(ms) | params<br><sup>(M) | FLOPs<br><sup>(B) at 640 |
166
+ | Model | size<br><sup>(pixels) | acc<br><sup>top1 | acc<br><sup>top5 | Speed<br><sup>CPU ONNX<br>(ms) | Speed<br><sup>T4 TensorRT10<br>(ms) | params<br><sup>(M) | FLOPs<br><sup>(B) at 224 |
167
167
  | -------------------------------------------------------------------------------------------- | --------------------- | ---------------- | ---------------- | ------------------------------ | ----------------------------------- | ------------------ | ------------------------ |
168
- | [YOLO11n-cls](https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11n-cls.pt) | 224 | 70.0 | 89.4 | 5.0 ± 0.3 | 1.1 ± 0.0 | 1.6 | 3.3 |
169
- | [YOLO11s-cls](https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11s-cls.pt) | 224 | 75.4 | 92.7 | 7.9 ± 0.2 | 1.3 ± 0.0 | 5.5 | 12.1 |
170
- | [YOLO11m-cls](https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11m-cls.pt) | 224 | 77.3 | 93.9 | 17.2 ± 0.4 | 2.0 ± 0.0 | 10.4 | 39.3 |
171
- | [YOLO11l-cls](https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11l-cls.pt) | 224 | 78.3 | 94.3 | 23.2 ± 0.3 | 2.8 ± 0.0 | 12.9 | 49.4 |
172
- | [YOLO11x-cls](https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11x-cls.pt) | 224 | 79.5 | 94.9 | 41.4 ± 0.9 | 3.8 ± 0.0 | 28.4 | 110.4 |
168
+ | [YOLO11n-cls](https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11n-cls.pt) | 224 | 70.0 | 89.4 | 5.0 ± 0.3 | 1.1 ± 0.0 | 1.6 | 0.5 |
169
+ | [YOLO11s-cls](https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11s-cls.pt) | 224 | 75.4 | 92.7 | 7.9 ± 0.2 | 1.3 ± 0.0 | 5.5 | 1.6 |
170
+ | [YOLO11m-cls](https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11m-cls.pt) | 224 | 77.3 | 93.9 | 17.2 ± 0.4 | 2.0 ± 0.0 | 10.4 | 5.0 |
171
+ | [YOLO11l-cls](https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11l-cls.pt) | 224 | 78.3 | 94.3 | 23.2 ± 0.3 | 2.8 ± 0.0 | 12.9 | 6.2 |
172
+ | [YOLO11x-cls](https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11x-cls.pt) | 224 | 79.5 | 94.9 | 41.4 ± 0.9 | 3.8 ± 0.0 | 28.4 | 13.7 |
173
173
 
174
174
  - **acc** values are model accuracies on the [ImageNet](https://www.image-net.org/) dataset validation set. <br>Reproduce by `yolo val classify data=path/to/ImageNet device=0`
175
175
  - **Speed** averaged over ImageNet val images using an [Amazon EC2 P4d](https://aws.amazon.com/ec2/instance-types/p4/) instance. <br>Reproduce by `yolo val classify data=path/to/ImageNet batch=1 device=0|cpu`
@@ -97,7 +97,7 @@ export = [
97
97
  "onnx>=1.12.0", # ONNX export
98
98
  "coremltools>=7.0; platform_system != 'Windows' and python_version <= '3.11'", # CoreML supported on macOS and Linux
99
99
  "scikit-learn>=1.3.2; platform_system != 'Windows' and python_version <= '3.11'", # CoreML k-means quantization
100
- "openvino>=2024.0.0,<2025.0.0", # OpenVINO export
100
+ "openvino>=2024.0.0,!=2025.0.0", # OpenVINO export
101
101
  "tensorflow>=2.0.0", # TF bug https://github.com/ultralytics/ultralytics/issues/5161
102
102
  "tensorflowjs>=3.9.0", # TF.js export, automatically installs tensorflow
103
103
  "tensorstore>=0.1.63; platform_machine == 'aarch64' and python_version >= '3.9'", # for TF Raspberry Pi exports
@@ -8,8 +8,11 @@ from ultralytics import YOLO, solutions
8
8
  from ultralytics.utils import ASSETS_URL, WEIGHTS_DIR
9
9
  from ultralytics.utils.downloads import safe_download
10
10
 
11
- DEMO_VIDEO = "solutions_ci_demo.mp4"
12
- POSE_VIDEO = "solution_ci_pose_demo.mp4"
11
+ DEMO_VIDEO = "solutions_ci_demo.mp4" # for all the solutions, except workout and parking
12
+ POSE_VIDEO = "solution_ci_pose_demo.mp4" # only for workouts monitoring solution
13
+ PARKING_VIDEO = "solution_ci_parking_demo.mp4" # only for parking management solution
14
+ PARKING_AREAS_JSON = "solution_ci_parking_areas.json" # only for parking management solution
15
+ PARKING_MODEL = "solutions_ci_parking_model.pt" # only for parking management solution
13
16
 
14
17
 
15
18
  @pytest.mark.slow
@@ -62,6 +65,22 @@ def test_major_solutions():
62
65
  _ = gym.monitor(im0)
63
66
  cap.release()
64
67
 
68
+ # Test parking management
69
+ safe_download(url=f"{ASSETS_URL}/{PARKING_VIDEO}", dir=TMP)
70
+ safe_download(url=f"{ASSETS_URL}/{PARKING_AREAS_JSON}", dir=TMP)
71
+ safe_download(url=f"{ASSETS_URL}/{PARKING_MODEL}", dir=TMP)
72
+ cap = cv2.VideoCapture(str(TMP / PARKING_VIDEO))
73
+ assert cap.isOpened(), "Error reading video file"
74
+ parkingmanager = solutions.ParkingManagement(
75
+ json_file=str(TMP / PARKING_AREAS_JSON), model=str(TMP / PARKING_MODEL), show=False
76
+ )
77
+ while cap.isOpened():
78
+ success, im0 = cap.read()
79
+ if not success:
80
+ break
81
+ _ = parkingmanager.process_data(im0)
82
+ cap.release()
83
+
65
84
 
66
85
  @pytest.mark.slow
67
86
  def test_instance_segmentation():
@@ -1,6 +1,6 @@
1
1
  # Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
2
2
 
3
- __version__ = "8.3.85"
3
+ __version__ = "8.3.87"
4
4
 
5
5
  import os
6
6
 
@@ -656,7 +656,7 @@ def handle_yolo_solutions(args: List[str]) -> None:
656
656
  - For 'analytics' solution, frame numbers are tracked for generating analytical graphs
657
657
  - Video processing can be interrupted by pressing 'q'
658
658
  - Processes video frames sequentially and saves output in .avi format
659
- - If no source is specified, downloads and uses a default sample video\
659
+ - If no source is specified, downloads and uses a default sample video
660
660
  - The inference solution will be launched using the 'streamlit run' command.
661
661
  - The Streamlit app file is located in the Ultralytics package directory.
662
662
  """
@@ -677,21 +677,19 @@ def handle_yolo_solutions(args: List[str]) -> None:
677
677
  check_dict_alignment(full_args_dict, overrides) # dict alignment
678
678
 
679
679
  # Get solution name
680
- if args and args[0] in SOLUTION_MAP:
681
- if args[0] != "help":
682
- s_n = args.pop(0) # Extract the solution name directly
683
- else:
684
- LOGGER.info(SOLUTIONS_HELP_MSG)
680
+ if args[0] == "help":
681
+ LOGGER.info(SOLUTIONS_HELP_MSG)
682
+ return # Early return for 'help' case
683
+ elif args[0] in SOLUTION_MAP:
684
+ solution_name = args.pop(0) # Extract the solution name directly
685
685
  else:
686
686
  LOGGER.warning(
687
- f"⚠️ No valid solution provided. Using default 'count'. Available: {', '.join(SOLUTION_MAP.keys())}"
687
+ f" '{args[0]}' is not a valid solution. 💡 Defaulting to 'count'.\n"
688
+ f"🚀 Available solutions: {', '.join(list(SOLUTION_MAP.keys())[:-1])}\n"
688
689
  )
689
- s_n = "count" # Default solution if none provided
690
-
691
- if args and args[0] == "help": # Add check for return if user call `yolo solutions help`
692
- return
690
+ solution_name = "count" # Default for invalid solution
693
691
 
694
- if s_n == "inference":
692
+ if solution_name == "inference":
695
693
  checks.check_requirements("streamlit>=1.29.0")
696
694
  LOGGER.info("💡 Loading Ultralytics live inference app...")
697
695
  subprocess.run(
@@ -705,10 +703,9 @@ def handle_yolo_solutions(args: List[str]) -> None:
705
703
  ]
706
704
  )
707
705
  else:
708
- cls, method = SOLUTION_MAP[s_n] # solution class name, method name and default source
709
-
710
- from ultralytics import solutions # import ultralytics solutions
706
+ from ultralytics import solutions
711
707
 
708
+ cls, method = SOLUTION_MAP[solution_name] # solution class name, method name and default source
712
709
  solution = getattr(solutions, cls)(IS_CLI=True, **overrides) # get solution class i.e ObjectCounter
713
710
  process = getattr(
714
711
  solution, method
@@ -717,17 +714,12 @@ def handle_yolo_solutions(args: List[str]) -> None:
717
714
  cap = cv2.VideoCapture(solution.CFG["source"]) # read the video file
718
715
 
719
716
  # extract width, height and fps of the video file, create save directory and initialize video writer
720
- import os # for directory creation
721
- from pathlib import Path
722
-
723
- from ultralytics.utils.files import increment_path # for output directory path update
724
-
725
717
  w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))
726
- if s_n == "analytics": # analytical graphs follow fixed shape for output i.e w=1920, h=1080
718
+ if solution_name == "analytics": # analytical graphs follow fixed shape for output i.e w=1920, h=1080
727
719
  w, h = 1920, 1080
728
- save_dir = increment_path(Path("runs") / "solutions" / "exp", exist_ok=False)
729
- save_dir.mkdir(parents=True, exist_ok=True) # create the output directory
730
- vw = cv2.VideoWriter(os.path.join(save_dir, "solution.avi"), cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))
720
+ save_dir = get_save_dir(SimpleNamespace(project="runs/solutions", name="exp", exist_ok=False))
721
+ save_dir.mkdir(parents=True) # create the output directory i.e. runs/solutions/exp
722
+ vw = cv2.VideoWriter(str(save_dir / f"{solution_name}.avi"), cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))
731
723
 
732
724
  try: # Process video frames
733
725
  f_n = 0 # frame number, required for analytical graphs
@@ -735,7 +727,7 @@ def handle_yolo_solutions(args: List[str]) -> None:
735
727
  success, frame = cap.read()
736
728
  if not success:
737
729
  break
738
- frame = process(frame, f_n := f_n + 1) if s_n == "analytics" else process(frame)
730
+ frame = process(frame, f_n := f_n + 1) if solution_name == "analytics" else process(frame)
739
731
  vw.write(frame)
740
732
  if cv2.waitKey(1) & 0xFF == ord("q"):
741
733
  break
@@ -28,26 +28,28 @@ names:
28
28
  # Download script/URL (optional) ---------------------------------------------------------------------------------------
29
29
  download: |
30
30
  import json
31
+ from pathlib import Path
32
+
31
33
  from tqdm import tqdm
32
34
  from ultralytics.utils.downloads import download
33
- from pathlib import Path
34
35
 
35
36
  def argoverse2yolo(set):
37
+ """Convert Argoverse dataset annotations to YOLO format for object detection tasks."""
36
38
  labels = {}
37
39
  a = json.load(open(set, "rb"))
38
- for annot in tqdm(a['annotations'], desc=f"Converting {set} to YOLOv5 format..."):
39
- img_id = annot['image_id']
40
- img_name = a['images'][img_id]['name']
41
- img_label_name = f'{img_name[:-3]}txt'
40
+ for annot in tqdm(a["annotations"], desc=f"Converting {set} to YOLOv5 format..."):
41
+ img_id = annot["image_id"]
42
+ img_name = a["images"][img_id]["name"]
43
+ img_label_name = f"{img_name[:-3]}txt"
42
44
 
43
- cls = annot['category_id'] # instance class id
44
- x_center, y_center, width, height = annot['bbox']
45
+ cls = annot["category_id"] # instance class id
46
+ x_center, y_center, width, height = annot["bbox"]
45
47
  x_center = (x_center + width / 2) / 1920.0 # offset and scale
46
48
  y_center = (y_center + height / 2) / 1200.0 # offset and scale
47
49
  width /= 1920.0 # scale
48
50
  height /= 1200.0 # scale
49
51
 
50
- img_dir = set.parents[2] / 'Argoverse-1.1' / 'labels' / a['seq_dirs'][a['images'][annot['image_id']]['sid']]
52
+ img_dir = set.parents[2] / "Argoverse-1.1" / "labels" / a["seq_dirs"][a["images"][annot["image_id"]]["sid"]]
51
53
  if not img_dir.exists():
52
54
  img_dir.mkdir(parents=True, exist_ok=True)
53
55
 
@@ -57,19 +59,19 @@ download: |
57
59
  labels[k].append(f"{cls} {x_center} {y_center} {width} {height}\n")
58
60
 
59
61
  for k in labels:
60
- with open(k, "w") as f:
62
+ with open(k, "w", encoding="utf-8") as f:
61
63
  f.writelines(labels[k])
62
64
 
63
65
 
64
66
  # Download 'https://argoverse-hd.s3.us-east-2.amazonaws.com/Argoverse-HD-Full.zip' (deprecated S3 link)
65
- dir = Path(yaml['path']) # dataset root dir
66
- urls = ['https://drive.google.com/file/d/1st9qW3BeIwQsnR0t8mRpvbsSWIo16ACi/view?usp=drive_link']
67
+ dir = Path(yaml["path"]) # dataset root dir
68
+ urls = ["https://drive.google.com/file/d/1st9qW3BeIwQsnR0t8mRpvbsSWIo16ACi/view?usp=drive_link"]
67
69
  print("\n\nWARNING: Argoverse dataset MUST be downloaded manually, autodownload will NOT work.")
68
70
  print(f"WARNING: Manually download Argoverse dataset '{urls[0]}' to '{dir}' and re-run your command.\n\n")
69
71
  # download(urls, dir=dir)
70
72
 
71
73
  # Convert
72
- annotations_dir = 'Argoverse-HD/annotations/'
73
- (dir / 'Argoverse-1.1' / 'tracking').rename(dir / 'Argoverse-1.1' / 'images') # rename 'tracking' to 'images'
74
+ annotations_dir = "Argoverse-HD/annotations/"
75
+ (dir / "Argoverse-1.1" / "tracking").rename(dir / "Argoverse-1.1" / "images") # rename 'tracking' to 'images'
74
76
  for d in "train.json", "val.json":
75
77
  argoverse2yolo(dir / annotations_dir / d) # convert Argoverse annotations to YOLO labels
@@ -32,23 +32,37 @@ names:
32
32
 
33
33
  # Download script/URL (optional) ---------------------------------------------------------------------------------------
34
34
  download: |
35
- from ultralytics.utils.downloads import download
36
35
  from pathlib import Path
37
36
 
37
+ from ultralytics.utils.downloads import download
38
+
38
39
  # Download
39
- dir = Path(yaml['path']) # dataset root dir
40
- urls = ['https://zenodo.org/record/4298502/files/global-wheat-codalab-official.zip',
41
- 'https://github.com/ultralytics/assets/releases/download/v0.0.0/GlobalWheat2020_labels.zip']
40
+ dir = Path(yaml["path"]) # dataset root dir
41
+ urls = [
42
+ "https://zenodo.org/record/4298502/files/global-wheat-codalab-official.zip",
43
+ "https://github.com/ultralytics/assets/releases/download/v0.0.0/GlobalWheat2020_labels.zip",
44
+ ]
42
45
  download(urls, dir=dir)
43
46
 
44
47
  # Make Directories
45
- for p in 'annotations', 'images', 'labels':
48
+ for p in "annotations", "images", "labels":
46
49
  (dir / p).mkdir(parents=True, exist_ok=True)
47
50
 
48
51
  # Move
49
- for p in 'arvalis_1', 'arvalis_2', 'arvalis_3', 'ethz_1', 'rres_1', 'inrae_1', 'usask_1', \
50
- 'utokyo_1', 'utokyo_2', 'nau_1', 'uq_1':
51
- (dir / 'global-wheat-codalab-official' / p).rename(dir / 'images' / p) # move to /images
52
- f = (dir / 'global-wheat-codalab-official' / p).with_suffix('.json') # json file
52
+ for p in (
53
+ "arvalis_1",
54
+ "arvalis_2",
55
+ "arvalis_3",
56
+ "ethz_1",
57
+ "rres_1",
58
+ "inrae_1",
59
+ "usask_1",
60
+ "utokyo_1",
61
+ "utokyo_2",
62
+ "nau_1",
63
+ "uq_1",
64
+ ):
65
+ (dir / "global-wheat-codalab-official" / p).rename(dir / "images" / p) # move to /images
66
+ f = (dir / "global-wheat-codalab-official" / p).with_suffix(".json") # json file
53
67
  if f.exists():
54
- f.rename((dir / 'annotations' / p).with_suffix('.json')) # move to /annotations
68
+ f.rename((dir / "annotations" / p).with_suffix(".json")) # move to /annotations
@@ -2022,4 +2022,4 @@ map:
2022
2022
  n15075141: toilet_tissue
2023
2023
 
2024
2024
  # Download script/URL (optional)
2025
- download: yolo/data/scripts/get_imagenet.sh
2025
+ download: ultralytics/data/scripts/get_imagenet.sh
@@ -384,58 +384,58 @@ names:
384
384
 
385
385
  # Download script/URL (optional) ---------------------------------------------------------------------------------------
386
386
  download: |
387
+ from pathlib import Path
388
+
389
+ import numpy as np
387
390
  from tqdm import tqdm
388
391
 
389
392
  from ultralytics.utils.checks import check_requirements
390
393
  from ultralytics.utils.downloads import download
391
394
  from ultralytics.utils.ops import xyxy2xywhn
392
395
 
393
- import numpy as np
394
- from pathlib import Path
395
-
396
- check_requirements(('pycocotools>=2.0',))
396
+ check_requirements(("pycocotools>=2.0",))
397
397
  from pycocotools.coco import COCO
398
398
 
399
399
  # Make Directories
400
- dir = Path(yaml['path']) # dataset root dir
401
- for p in 'images', 'labels':
400
+ dir = Path(yaml["path"]) # dataset root dir
401
+ for p in "images", "labels":
402
402
  (dir / p).mkdir(parents=True, exist_ok=True)
403
- for q in 'train', 'val':
403
+ for q in "train", "val":
404
404
  (dir / p / q).mkdir(parents=True, exist_ok=True)
405
405
 
406
406
  # Train, Val Splits
407
- for split, patches in [('train', 50 + 1), ('val', 43 + 1)]:
407
+ for split, patches in [("train", 50 + 1), ("val", 43 + 1)]:
408
408
  print(f"Processing {split} in {patches} patches ...")
409
- images, labels = dir / 'images' / split, dir / 'labels' / split
409
+ images, labels = dir / "images" / split, dir / "labels" / split
410
410
 
411
411
  # Download
412
412
  url = f"https://dorc.ks3-cn-beijing.ksyun.com/data-set/2020Objects365%E6%95%B0%E6%8D%AE%E9%9B%86/{split}/"
413
- if split == 'train':
414
- download([f'{url}zhiyuan_objv2_{split}.tar.gz'], dir=dir) # annotations json
415
- download([f'{url}patch{i}.tar.gz' for i in range(patches)], dir=images, curl=True, threads=8)
416
- elif split == 'val':
417
- download([f'{url}zhiyuan_objv2_{split}.json'], dir=dir) # annotations json
418
- download([f'{url}images/v1/patch{i}.tar.gz' for i in range(15 + 1)], dir=images, curl=True, threads=8)
419
- download([f'{url}images/v2/patch{i}.tar.gz' for i in range(16, patches)], dir=images, curl=True, threads=8)
413
+ if split == "train":
414
+ download([f"{url}zhiyuan_objv2_{split}.tar.gz"], dir=dir) # annotations json
415
+ download([f"{url}patch{i}.tar.gz" for i in range(patches)], dir=images, curl=True, threads=8)
416
+ elif split == "val":
417
+ download([f"{url}zhiyuan_objv2_{split}.json"], dir=dir) # annotations json
418
+ download([f"{url}images/v1/patch{i}.tar.gz" for i in range(15 + 1)], dir=images, curl=True, threads=8)
419
+ download([f"{url}images/v2/patch{i}.tar.gz" for i in range(16, patches)], dir=images, curl=True, threads=8)
420
420
 
421
421
  # Move
422
- for f in tqdm(images.rglob('*.jpg'), desc=f'Moving {split} images'):
422
+ for f in tqdm(images.rglob("*.jpg"), desc=f"Moving {split} images"):
423
423
  f.rename(images / f.name) # move to /images/{split}
424
424
 
425
425
  # Labels
426
- coco = COCO(dir / f'zhiyuan_objv2_{split}.json')
426
+ coco = COCO(dir / f"zhiyuan_objv2_{split}.json")
427
427
  names = [x["name"] for x in coco.loadCats(coco.getCatIds())]
428
428
  for cid, cat in enumerate(names):
429
429
  catIds = coco.getCatIds(catNms=[cat])
430
430
  imgIds = coco.getImgIds(catIds=catIds)
431
- for im in tqdm(coco.loadImgs(imgIds), desc=f'Class {cid + 1}/{len(names)} {cat}'):
431
+ for im in tqdm(coco.loadImgs(imgIds), desc=f"Class {cid + 1}/{len(names)} {cat}"):
432
432
  width, height = im["width"], im["height"]
433
433
  path = Path(im["file_name"]) # image filename
434
434
  try:
435
- with open(labels / path.with_suffix('.txt').name, 'a') as file:
435
+ with open(labels / path.with_suffix(".txt").name, "a", encoding="utf-8") as file:
436
436
  annIds = coco.getAnnIds(imgIds=im["id"], catIds=catIds, iscrowd=None)
437
437
  for a in coco.loadAnns(annIds):
438
- x, y, w, h = a['bbox'] # bounding box in xywh (xy top-left corner)
438
+ x, y, w, h = a["bbox"] # bounding box in xywh (xy top-left corner)
439
439
  xyxy = np.array([x, y, x + w, y + h])[None] # pixels(1,4)
440
440
  x, y, w, h = xyxy2xywhn(xyxy, w=width, h=height, clip=True)[0] # normalized and clipped
441
441
  file.write(f"{cid} {x:.5f} {y:.5f} {w:.5f} {h:.5f}\n")
@@ -31,27 +31,27 @@ download: |
31
31
  from ultralytics.utils.ops import xyxy2xywh
32
32
 
33
33
  # Download
34
- dir = Path(yaml['path']) # dataset root dir
34
+ dir = Path(yaml["path"]) # dataset root dir
35
35
  parent = Path(dir.parent) # download dir
36
- urls = ['http://trax-geometry.s3.amazonaws.com/cvpr_challenge/SKU110K_fixed.tar.gz']
36
+ urls = ["http://trax-geometry.s3.amazonaws.com/cvpr_challenge/SKU110K_fixed.tar.gz"]
37
37
  download(urls, dir=parent)
38
38
 
39
39
  # Rename directories
40
40
  if dir.exists():
41
41
  shutil.rmtree(dir)
42
- (parent / 'SKU110K_fixed').rename(dir) # rename dir
43
- (dir / 'labels').mkdir(parents=True, exist_ok=True) # create labels dir
42
+ (parent / "SKU110K_fixed").rename(dir) # rename dir
43
+ (dir / "labels").mkdir(parents=True, exist_ok=True) # create labels dir
44
44
 
45
45
  # Convert labels
46
- names = 'image', 'x1', 'y1', 'x2', 'y2', 'class', 'image_width', 'image_height' # column names
47
- for d in 'annotations_train.csv', 'annotations_val.csv', 'annotations_test.csv':
48
- x = pd.read_csv(dir / 'annotations' / d, names=names).values # annotations
46
+ names = "image", "x1", "y1", "x2", "y2", "class", "image_width", "image_height" # column names
47
+ for d in "annotations_train.csv", "annotations_val.csv", "annotations_test.csv":
48
+ x = pd.read_csv(dir / "annotations" / d, names=names).values # annotations
49
49
  images, unique_images = x[:, 0], np.unique(x[:, 0])
50
- with open((dir / d).with_suffix('.txt').__str__().replace('annotations_', ''), 'w') as f:
51
- f.writelines(f'./images/{s}\n' for s in unique_images)
52
- for im in tqdm(unique_images, desc=f'Converting {dir / d}'):
50
+ with open((dir / d).with_suffix(".txt").__str__().replace("annotations_", ""), "w", encoding="utf-8") as f:
51
+ f.writelines(f"./images/{s}\n" for s in unique_images)
52
+ for im in tqdm(unique_images, desc=f"Converting {dir / d}"):
53
53
  cls = 0 # single-class dataset
54
- with open((dir / 'labels' / im).with_suffix('.txt'), 'a') as f:
54
+ with open((dir / "labels" / im).with_suffix(".txt"), "a", encoding="utf-8") as f:
55
55
  for r in x[images == im]:
56
56
  w, h = r[6], r[7] # image width, height
57
57
  xywh = xyxy2xywh(np.array([[r[1] / w, r[2] / h, r[3] / w, r[4] / h]]))[0] # instance
@@ -46,55 +46,61 @@ names:
46
46
  # Download script/URL (optional) ---------------------------------------------------------------------------------------
47
47
  download: |
48
48
  import xml.etree.ElementTree as ET
49
+ from pathlib import Path
49
50
 
50
51
  from tqdm import tqdm
52
+
51
53
  from ultralytics.utils.downloads import download
52
- from pathlib import Path
54
+
53
55
 
54
56
  def convert_label(path, lb_path, year, image_id):
57
+ """Converts XML annotations from VOC format to YOLO format by extracting bounding boxes and class IDs."""
58
+
55
59
  def convert_box(size, box):
56
- dw, dh = 1. / size[0], 1. / size[1]
60
+ dw, dh = 1.0 / size[0], 1.0 / size[1]
57
61
  x, y, w, h = (box[0] + box[1]) / 2.0 - 1, (box[2] + box[3]) / 2.0 - 1, box[1] - box[0], box[3] - box[2]
58
62
  return x * dw, y * dh, w * dw, h * dh
59
63
 
60
- in_file = open(path / f'VOC{year}/Annotations/{image_id}.xml')
61
- out_file = open(lb_path, 'w')
64
+ in_file = open(path / f"VOC{year}/Annotations/{image_id}.xml")
65
+ out_file = open(lb_path, "w")
62
66
  tree = ET.parse(in_file)
63
67
  root = tree.getroot()
64
- size = root.find('size')
65
- w = int(size.find('width').text)
66
- h = int(size.find('height').text)
68
+ size = root.find("size")
69
+ w = int(size.find("width").text)
70
+ h = int(size.find("height").text)
67
71
 
68
- names = list(yaml['names'].values()) # names list
69
- for obj in root.iter('object'):
70
- cls = obj.find('name').text
71
- if cls in names and int(obj.find('difficult').text) != 1:
72
- xmlbox = obj.find('bndbox')
73
- bb = convert_box((w, h), [float(xmlbox.find(x).text) for x in ('xmin', 'xmax', 'ymin', 'ymax')])
72
+ names = list(yaml["names"].values()) # names list
73
+ for obj in root.iter("object"):
74
+ cls = obj.find("name").text
75
+ if cls in names and int(obj.find("difficult").text) != 1:
76
+ xmlbox = obj.find("bndbox")
77
+ bb = convert_box((w, h), [float(xmlbox.find(x).text) for x in ("xmin", "xmax", "ymin", "ymax")])
74
78
  cls_id = names.index(cls) # class id
75
- out_file.write(" ".join(str(a) for a in (cls_id, *bb)) + '\n')
79
+ out_file.write(" ".join(str(a) for a in (cls_id, *bb)) + "\n")
76
80
 
77
81
 
78
82
  # Download
79
- dir = Path(yaml['path']) # dataset root dir
80
- url = 'https://github.com/ultralytics/assets/releases/download/v0.0.0/'
81
- urls = [f'{url}VOCtrainval_06-Nov-2007.zip', # 446MB, 5012 images
82
- f'{url}VOCtest_06-Nov-2007.zip', # 438MB, 4953 images
83
- f'{url}VOCtrainval_11-May-2012.zip'] # 1.95GB, 17126 images
84
- download(urls, dir=dir / 'images', curl=True, threads=3, exist_ok=True) # download and unzip over existing paths (required)
83
+ dir = Path(yaml["path"]) # dataset root dir
84
+ url = "https://github.com/ultralytics/assets/releases/download/v0.0.0/"
85
+ urls = [
86
+ f"{url}VOCtrainval_06-Nov-2007.zip", # 446MB, 5012 images
87
+ f"{url}VOCtest_06-Nov-2007.zip", # 438MB, 4953 images
88
+ f"{url}VOCtrainval_11-May-2012.zip", # 1.95GB, 17126 images
89
+ ]
90
+ download(urls, dir=dir / "images", curl=True, threads=3, exist_ok=True) # download and unzip over existing (required)
85
91
 
86
92
  # Convert
87
- path = dir / 'images/VOCdevkit'
88
- for year, image_set in ('2012', 'train'), ('2012', 'val'), ('2007', 'train'), ('2007', 'val'), ('2007', 'test'):
89
- imgs_path = dir / 'images' / f'{image_set}{year}'
90
- lbs_path = dir / 'labels' / f'{image_set}{year}'
93
+ path = dir / "images/VOCdevkit"
94
+ for year, image_set in ("2012", "train"), ("2012", "val"), ("2007", "train"), ("2007", "val"), ("2007", "test"):
95
+ imgs_path = dir / "images" / f"{image_set}{year}"
96
+ lbs_path = dir / "labels" / f"{image_set}{year}"
91
97
  imgs_path.mkdir(exist_ok=True, parents=True)
92
98
  lbs_path.mkdir(exist_ok=True, parents=True)
93
99
 
94
- with open(path / f'VOC{year}/ImageSets/Main/{image_set}.txt') as f:
100
+ with open(path / f"VOC{year}/ImageSets/Main/{image_set}.txt") as f:
95
101
  image_ids = f.read().strip().split()
96
- for id in tqdm(image_ids, desc=f'{image_set}{year}'):
97
- f = path / f'VOC{year}/JPEGImages/{id}.jpg' # old img path
98
- lb_path = (lbs_path / f.name).with_suffix('.txt') # new label path
102
+ for id in tqdm(image_ids, desc=f"{image_set}{year}"):
103
+ f = path / f"VOC{year}/JPEGImages/{id}.jpg" # old img path
104
+ lb_path = (lbs_path / f.name).with_suffix(".txt") # new label path
99
105
  f.rename(imgs_path / f.name) # move image
100
106
  convert_label(path, lb_path, year, id) # convert labels to YOLO format
@@ -34,40 +34,44 @@ download: |
34
34
 
35
35
  from ultralytics.utils.downloads import download
36
36
 
37
+
37
38
  def visdrone2yolo(dir):
39
+ """Convert VisDrone annotations to YOLO format, creating label files with normalized bounding box coordinates."""
38
40
  from PIL import Image
39
41
  from tqdm import tqdm
40
42
 
41
43
  def convert_box(size, box):
42
44
  # Convert VisDrone box to YOLO xywh box
43
- dw = 1. / size[0]
44
- dh = 1. / size[1]
45
+ dw = 1.0 / size[0]
46
+ dh = 1.0 / size[1]
45
47
  return (box[0] + box[2] / 2) * dw, (box[1] + box[3] / 2) * dh, box[2] * dw, box[3] * dh
46
48
 
47
- (dir / 'labels').mkdir(parents=True, exist_ok=True) # make labels directory
48
- pbar = tqdm((dir / 'annotations').glob('*.txt'), desc=f'Converting {dir}')
49
+ (dir / "labels").mkdir(parents=True, exist_ok=True) # make labels directory
50
+ pbar = tqdm((dir / "annotations").glob("*.txt"), desc=f"Converting {dir}")
49
51
  for f in pbar:
50
- img_size = Image.open((dir / 'images' / f.name).with_suffix('.jpg')).size
52
+ img_size = Image.open((dir / "images" / f.name).with_suffix(".jpg")).size
51
53
  lines = []
52
- with open(f, 'r') as file: # read annotation.txt
53
- for row in [x.split(',') for x in file.read().strip().splitlines()]:
54
- if row[4] == '0': # VisDrone 'ignored regions' class 0
54
+ with open(f, encoding="utf-8") as file: # read annotation.txt
55
+ for row in [x.split(",") for x in file.read().strip().splitlines()]:
56
+ if row[4] == "0": # VisDrone 'ignored regions' class 0
55
57
  continue
56
58
  cls = int(row[5]) - 1
57
59
  box = convert_box(img_size, tuple(map(int, row[:4])))
58
60
  lines.append(f"{cls} {' '.join(f'{x:.6f}' for x in box)}\n")
59
- with open(str(f).replace(f'{os.sep}annotations{os.sep}', f'{os.sep}labels{os.sep}'), 'w') as fl:
61
+ with open(str(f).replace(f"{os.sep}annotations{os.sep}", f"{os.sep}labels{os.sep}"), "w", encoding="utf-8") as fl:
60
62
  fl.writelines(lines) # write label.txt
61
63
 
62
64
 
63
65
  # Download
64
- dir = Path(yaml['path']) # dataset root dir
65
- urls = ['https://github.com/ultralytics/assets/releases/download/v0.0.0/VisDrone2019-DET-train.zip',
66
- 'https://github.com/ultralytics/assets/releases/download/v0.0.0/VisDrone2019-DET-val.zip',
67
- 'https://github.com/ultralytics/assets/releases/download/v0.0.0/VisDrone2019-DET-test-dev.zip',
68
- 'https://github.com/ultralytics/assets/releases/download/v0.0.0/VisDrone2019-DET-test-challenge.zip']
66
+ dir = Path(yaml["path"]) # dataset root dir
67
+ urls = [
68
+ "https://github.com/ultralytics/assets/releases/download/v0.0.0/VisDrone2019-DET-train.zip",
69
+ "https://github.com/ultralytics/assets/releases/download/v0.0.0/VisDrone2019-DET-val.zip",
70
+ "https://github.com/ultralytics/assets/releases/download/v0.0.0/VisDrone2019-DET-test-dev.zip",
71
+ "https://github.com/ultralytics/assets/releases/download/v0.0.0/VisDrone2019-DET-test-challenge.zip",
72
+ ]
69
73
  download(urls, dir=dir, curl=True, threads=4)
70
74
 
71
75
  # Convert
72
- for d in 'VisDrone2019-DET-train', 'VisDrone2019-DET-val', 'VisDrone2019-DET-test-dev':
76
+ for d in "VisDrone2019-DET-train", "VisDrone2019-DET-val", "VisDrone2019-DET-test-dev":
73
77
  visdrone2yolo(dir / d) # convert VisDrone annotations to YOLO labels