ultralytics 8.1.6__tar.gz → 8.1.7__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 (206) hide show
  1. {ultralytics-8.1.6/ultralytics.egg-info → ultralytics-8.1.7}/PKG-INFO +2 -2
  2. {ultralytics-8.1.6 → ultralytics-8.1.7}/pyproject.toml +1 -1
  3. {ultralytics-8.1.6 → ultralytics-8.1.7}/tests/test_cli.py +42 -40
  4. {ultralytics-8.1.6 → ultralytics-8.1.7}/tests/test_cuda.py +23 -23
  5. ultralytics-8.1.7/tests/test_engine.py +128 -0
  6. {ultralytics-8.1.6 → ultralytics-8.1.7}/tests/test_explorer.py +7 -7
  7. ultralytics-8.1.7/tests/test_integrations.py +117 -0
  8. {ultralytics-8.1.6 → ultralytics-8.1.7}/tests/test_python.py +129 -101
  9. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/__init__.py +1 -1
  10. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/__init__.py +1 -1
  11. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/data/dataset.py +9 -4
  12. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/data/explorer/explorer.py +5 -2
  13. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/engine/results.py +5 -2
  14. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/engine/trainer.py +6 -2
  15. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/hub/__init__.py +6 -3
  16. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/hub/auth.py +2 -2
  17. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/hub/session.py +2 -2
  18. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/sam/amg.py +4 -2
  19. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/yolo/segment/val.py +6 -2
  20. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/nn/autobackend.py +6 -6
  21. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/solutions/distance_calculation.py +5 -17
  22. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/solutions/object_counter.py +0 -1
  23. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/utils/__init__.py +78 -7
  24. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/utils/benchmarks.py +1 -2
  25. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/utils/checks.py +2 -2
  26. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/utils/loss.py +7 -2
  27. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/utils/metrics.py +1 -1
  28. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/utils/ops.py +0 -1
  29. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/utils/plotting.py +46 -0
  30. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/utils/triton.py +1 -1
  31. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/utils/tuner.py +1 -1
  32. {ultralytics-8.1.6 → ultralytics-8.1.7/ultralytics.egg-info}/PKG-INFO +2 -2
  33. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics.egg-info/requires.txt +1 -1
  34. ultralytics-8.1.6/tests/test_engine.py +0 -128
  35. ultralytics-8.1.6/tests/test_integrations.py +0 -117
  36. {ultralytics-8.1.6 → ultralytics-8.1.7}/LICENSE +0 -0
  37. {ultralytics-8.1.6 → ultralytics-8.1.7}/README.md +0 -0
  38. {ultralytics-8.1.6 → ultralytics-8.1.7}/setup.cfg +0 -0
  39. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/assets/bus.jpg +0 -0
  40. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/assets/zidane.jpg +0 -0
  41. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
  42. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
  43. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
  44. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
  45. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
  46. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
  47. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
  48. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/datasets/VOC.yaml +0 -0
  49. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
  50. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
  51. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
  52. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/datasets/coco.yaml +0 -0
  53. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
  54. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/datasets/coco128.yaml +0 -0
  55. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
  56. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
  57. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/datasets/coco8.yaml +0 -0
  58. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
  59. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/datasets/dota8.yaml +0 -0
  60. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
  61. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
  62. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
  63. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/datasets/xView.yaml +0 -0
  64. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/default.yaml +0 -0
  65. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
  66. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
  67. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
  68. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
  69. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
  70. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
  71. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
  72. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
  73. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
  74. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
  75. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
  76. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
  77. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
  78. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
  79. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
  80. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
  81. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
  82. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
  83. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
  84. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
  85. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
  86. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
  87. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
  88. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
  89. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
  90. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/trackers/botsort.yaml +0 -0
  91. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
  92. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/data/__init__.py +0 -0
  93. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/data/annotator.py +0 -0
  94. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/data/augment.py +0 -0
  95. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/data/base.py +0 -0
  96. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/data/build.py +0 -0
  97. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/data/converter.py +0 -0
  98. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/data/explorer/__init__.py +0 -0
  99. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/data/explorer/gui/__init__.py +0 -0
  100. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/data/explorer/gui/dash.py +0 -0
  101. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/data/explorer/utils.py +0 -0
  102. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/data/loaders.py +0 -0
  103. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/data/split_dota.py +0 -0
  104. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/data/utils.py +0 -0
  105. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/engine/__init__.py +0 -0
  106. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/engine/exporter.py +0 -0
  107. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/engine/model.py +0 -0
  108. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/engine/predictor.py +0 -0
  109. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/engine/tuner.py +0 -0
  110. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/engine/validator.py +0 -0
  111. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/hub/utils.py +0 -0
  112. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/__init__.py +0 -0
  113. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/fastsam/__init__.py +0 -0
  114. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/fastsam/model.py +0 -0
  115. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/fastsam/predict.py +0 -0
  116. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/fastsam/prompt.py +0 -0
  117. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/fastsam/utils.py +0 -0
  118. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/fastsam/val.py +0 -0
  119. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/nas/__init__.py +0 -0
  120. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/nas/model.py +0 -0
  121. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/nas/predict.py +0 -0
  122. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/nas/val.py +0 -0
  123. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/rtdetr/__init__.py +0 -0
  124. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/rtdetr/model.py +0 -0
  125. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/rtdetr/predict.py +0 -0
  126. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/rtdetr/train.py +0 -0
  127. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/rtdetr/val.py +0 -0
  128. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/sam/__init__.py +0 -0
  129. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/sam/build.py +0 -0
  130. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/sam/model.py +0 -0
  131. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/sam/modules/__init__.py +0 -0
  132. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/sam/modules/decoders.py +0 -0
  133. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/sam/modules/encoders.py +0 -0
  134. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/sam/modules/sam.py +0 -0
  135. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
  136. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/sam/modules/transformer.py +0 -0
  137. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/sam/predict.py +0 -0
  138. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/utils/__init__.py +0 -0
  139. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/utils/loss.py +0 -0
  140. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/utils/ops.py +0 -0
  141. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/yolo/__init__.py +0 -0
  142. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/yolo/classify/__init__.py +0 -0
  143. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/yolo/classify/predict.py +0 -0
  144. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/yolo/classify/train.py +0 -0
  145. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/yolo/classify/val.py +0 -0
  146. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/yolo/detect/__init__.py +0 -0
  147. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/yolo/detect/predict.py +0 -0
  148. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/yolo/detect/train.py +0 -0
  149. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/yolo/detect/val.py +0 -0
  150. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/yolo/model.py +0 -0
  151. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/yolo/obb/__init__.py +0 -0
  152. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/yolo/obb/predict.py +0 -0
  153. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/yolo/obb/train.py +0 -0
  154. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/yolo/obb/val.py +0 -0
  155. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/yolo/pose/__init__.py +0 -0
  156. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/yolo/pose/predict.py +0 -0
  157. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/yolo/pose/train.py +0 -0
  158. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/yolo/pose/val.py +0 -0
  159. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/yolo/segment/__init__.py +0 -0
  160. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/yolo/segment/predict.py +0 -0
  161. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/models/yolo/segment/train.py +0 -0
  162. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/nn/__init__.py +0 -0
  163. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/nn/modules/__init__.py +0 -0
  164. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/nn/modules/block.py +0 -0
  165. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/nn/modules/conv.py +0 -0
  166. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/nn/modules/head.py +0 -0
  167. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/nn/modules/transformer.py +0 -0
  168. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/nn/modules/utils.py +0 -0
  169. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/nn/tasks.py +0 -0
  170. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/solutions/__init__.py +0 -0
  171. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/solutions/ai_gym.py +0 -0
  172. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/solutions/heatmap.py +0 -0
  173. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/solutions/speed_estimation.py +0 -0
  174. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/trackers/__init__.py +0 -0
  175. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/trackers/basetrack.py +0 -0
  176. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/trackers/bot_sort.py +0 -0
  177. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/trackers/byte_tracker.py +0 -0
  178. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/trackers/track.py +0 -0
  179. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/trackers/utils/__init__.py +0 -0
  180. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/trackers/utils/gmc.py +0 -0
  181. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/trackers/utils/kalman_filter.py +0 -0
  182. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/trackers/utils/matching.py +0 -0
  183. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/utils/autobatch.py +0 -0
  184. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/utils/callbacks/__init__.py +0 -0
  185. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/utils/callbacks/base.py +0 -0
  186. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/utils/callbacks/clearml.py +0 -0
  187. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/utils/callbacks/comet.py +0 -0
  188. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/utils/callbacks/dvc.py +0 -0
  189. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/utils/callbacks/hub.py +0 -0
  190. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/utils/callbacks/mlflow.py +0 -0
  191. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/utils/callbacks/neptune.py +0 -0
  192. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/utils/callbacks/raytune.py +0 -0
  193. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/utils/callbacks/tensorboard.py +0 -0
  194. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/utils/callbacks/wb.py +0 -0
  195. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/utils/dist.py +0 -0
  196. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/utils/downloads.py +0 -0
  197. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/utils/errors.py +0 -0
  198. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/utils/files.py +0 -0
  199. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/utils/instance.py +0 -0
  200. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/utils/patches.py +0 -0
  201. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/utils/tal.py +0 -0
  202. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics/utils/torch_utils.py +0 -0
  203. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics.egg-info/SOURCES.txt +0 -0
  204. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics.egg-info/dependency_links.txt +0 -0
  205. {ultralytics-8.1.6 → ultralytics-8.1.7}/ultralytics.egg-info/entry_points.txt +0 -0
  206. {ultralytics-8.1.6 → ultralytics-8.1.7}/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.1.6
3
+ Version: 8.1.7
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
@@ -55,7 +55,7 @@ Requires-Dist: mkdocs-material; extra == "dev"
55
55
  Requires-Dist: mkdocstrings[python]; extra == "dev"
56
56
  Requires-Dist: mkdocs-jupyter; extra == "dev"
57
57
  Requires-Dist: mkdocs-redirects; extra == "dev"
58
- Requires-Dist: mkdocs-ultralytics-plugin>=0.0.40; extra == "dev"
58
+ Requires-Dist: mkdocs-ultralytics-plugin>=0.0.42; extra == "dev"
59
59
  Provides-Extra: export
60
60
  Requires-Dist: onnx>=1.12.0; extra == "export"
61
61
  Requires-Dist: coremltools>=7.0; platform_system != "Windows" and extra == "export"
@@ -93,7 +93,7 @@ dev = [
93
93
  "mkdocstrings[python]",
94
94
  "mkdocs-jupyter", # for notebooks
95
95
  "mkdocs-redirects", # for 301 redirects
96
- "mkdocs-ultralytics-plugin>=0.0.40", # for meta descriptions and images, dates and authors
96
+ "mkdocs-ultralytics-plugin>=0.0.42", # for meta descriptions and images, dates and authors
97
97
  ]
98
98
  export = [
99
99
  "onnx>=1.12.0", # ONNX export
@@ -10,17 +10,19 @@ from ultralytics.utils.checks import cuda_device_count, cuda_is_available
10
10
  CUDA_IS_AVAILABLE = cuda_is_available()
11
11
  CUDA_DEVICE_COUNT = cuda_device_count()
12
12
  TASK_ARGS = [
13
- ('detect', 'yolov8n', 'coco8.yaml'),
14
- ('segment', 'yolov8n-seg', 'coco8-seg.yaml'),
15
- ('classify', 'yolov8n-cls', 'imagenet10'),
16
- ('pose', 'yolov8n-pose', 'coco8-pose.yaml'),
17
- ('obb', 'yolov8n-obb', 'dota8.yaml'), ] # (task, model, data)
13
+ ("detect", "yolov8n", "coco8.yaml"),
14
+ ("segment", "yolov8n-seg", "coco8-seg.yaml"),
15
+ ("classify", "yolov8n-cls", "imagenet10"),
16
+ ("pose", "yolov8n-pose", "coco8-pose.yaml"),
17
+ ("obb", "yolov8n-obb", "dota8.yaml"),
18
+ ] # (task, model, data)
18
19
  EXPORT_ARGS = [
19
- ('yolov8n', 'torchscript'),
20
- ('yolov8n-seg', 'torchscript'),
21
- ('yolov8n-cls', 'torchscript'),
22
- ('yolov8n-pose', 'torchscript'),
23
- ('yolov8n-obb', 'torchscript'), ] # (model, format)
20
+ ("yolov8n", "torchscript"),
21
+ ("yolov8n-seg", "torchscript"),
22
+ ("yolov8n-cls", "torchscript"),
23
+ ("yolov8n-pose", "torchscript"),
24
+ ("yolov8n-obb", "torchscript"),
25
+ ] # (model, format)
24
26
 
25
27
 
26
28
  def run(cmd):
@@ -30,50 +32,50 @@ def run(cmd):
30
32
 
31
33
  def test_special_modes():
32
34
  """Test various special command modes of YOLO."""
33
- run('yolo help')
34
- run('yolo checks')
35
- run('yolo version')
36
- run('yolo settings reset')
37
- run('yolo cfg')
35
+ run("yolo help")
36
+ run("yolo checks")
37
+ run("yolo version")
38
+ run("yolo settings reset")
39
+ run("yolo cfg")
38
40
 
39
41
 
40
- @pytest.mark.parametrize('task,model,data', TASK_ARGS)
42
+ @pytest.mark.parametrize("task,model,data", TASK_ARGS)
41
43
  def test_train(task, model, data):
42
44
  """Test YOLO training for a given task, model, and data."""
43
- run(f'yolo train {task} model={model}.yaml data={data} imgsz=32 epochs=1 cache=disk')
45
+ run(f"yolo train {task} model={model}.yaml data={data} imgsz=32 epochs=1 cache=disk")
44
46
 
45
47
 
46
- @pytest.mark.parametrize('task,model,data', TASK_ARGS)
48
+ @pytest.mark.parametrize("task,model,data", TASK_ARGS)
47
49
  def test_val(task, model, data):
48
50
  """Test YOLO validation for a given task, model, and data."""
49
- run(f'yolo val {task} model={WEIGHTS_DIR / model}.pt data={data} imgsz=32 save_txt save_json')
51
+ run(f"yolo val {task} model={WEIGHTS_DIR / model}.pt data={data} imgsz=32 save_txt save_json")
50
52
 
51
53
 
52
- @pytest.mark.parametrize('task,model,data', TASK_ARGS)
54
+ @pytest.mark.parametrize("task,model,data", TASK_ARGS)
53
55
  def test_predict(task, model, data):
54
56
  """Test YOLO prediction on sample assets for a given task and model."""
55
- run(f'yolo predict model={WEIGHTS_DIR / model}.pt source={ASSETS} imgsz=32 save save_crop save_txt')
57
+ run(f"yolo predict model={WEIGHTS_DIR / model}.pt source={ASSETS} imgsz=32 save save_crop save_txt")
56
58
 
57
59
 
58
- @pytest.mark.parametrize('model,format', EXPORT_ARGS)
60
+ @pytest.mark.parametrize("model,format", EXPORT_ARGS)
59
61
  def test_export(model, format):
60
62
  """Test exporting a YOLO model to different formats."""
61
- run(f'yolo export model={WEIGHTS_DIR / model}.pt format={format} imgsz=32')
63
+ run(f"yolo export model={WEIGHTS_DIR / model}.pt format={format} imgsz=32")
62
64
 
63
65
 
64
- def test_rtdetr(task='detect', model='yolov8n-rtdetr.yaml', data='coco8.yaml'):
66
+ def test_rtdetr(task="detect", model="yolov8n-rtdetr.yaml", data="coco8.yaml"):
65
67
  """Test the RTDETR functionality with the Ultralytics framework."""
66
68
  # Warning: MUST use imgsz=640
67
- run(f'yolo train {task} model={model} data={data} --imgsz= 640 epochs =1, cache = disk') # add coma, spaces to args
69
+ run(f"yolo train {task} model={model} data={data} --imgsz= 640 epochs =1, cache = disk") # add coma, spaces to args
68
70
  run(f"yolo predict {task} model={model} source={ASSETS / 'bus.jpg'} imgsz=640 save save_crop save_txt")
69
71
 
70
72
 
71
- def test_fastsam(task='segment', model=WEIGHTS_DIR / 'FastSAM-s.pt', data='coco8-seg.yaml'):
73
+ def test_fastsam(task="segment", model=WEIGHTS_DIR / "FastSAM-s.pt", data="coco8-seg.yaml"):
72
74
  """Test FastSAM segmentation functionality within Ultralytics."""
73
- source = ASSETS / 'bus.jpg'
75
+ source = ASSETS / "bus.jpg"
74
76
 
75
- run(f'yolo segment val {task} model={model} data={data} imgsz=32')
76
- run(f'yolo segment predict model={model} source={source} imgsz=32 save save_crop save_txt')
77
+ run(f"yolo segment val {task} model={model} data={data} imgsz=32")
78
+ run(f"yolo segment predict model={model} source={source} imgsz=32 save save_crop save_txt")
77
79
 
78
80
  from ultralytics import FastSAM
79
81
  from ultralytics.models.fastsam import FastSAMPrompt
@@ -83,26 +85,26 @@ def test_fastsam(task='segment', model=WEIGHTS_DIR / 'FastSAM-s.pt', data='coco8
83
85
  sam_model = FastSAM(model) # or FastSAM-x.pt
84
86
 
85
87
  # Run inference on an image
86
- everything_results = sam_model(source, device='cpu', retina_masks=True, imgsz=1024, conf=0.4, iou=0.9)
88
+ everything_results = sam_model(source, device="cpu", retina_masks=True, imgsz=1024, conf=0.4, iou=0.9)
87
89
 
88
90
  # Remove small regions
89
91
  new_masks, _ = Predictor.remove_small_regions(everything_results[0].masks.data, min_area=20)
90
92
 
91
93
  # Everything prompt
92
- prompt_process = FastSAMPrompt(source, everything_results, device='cpu')
94
+ prompt_process = FastSAMPrompt(source, everything_results, device="cpu")
93
95
  ann = prompt_process.everything_prompt()
94
96
 
95
97
  # Bbox default shape [0,0,0,0] -> [x1,y1,x2,y2]
96
98
  ann = prompt_process.box_prompt(bbox=[200, 200, 300, 300])
97
99
 
98
100
  # Text prompt
99
- ann = prompt_process.text_prompt(text='a photo of a dog')
101
+ ann = prompt_process.text_prompt(text="a photo of a dog")
100
102
 
101
103
  # Point prompt
102
104
  # Points default [[0,0]] [[x1,y1],[x2,y2]]
103
105
  # Point_label default [0] [1,0] 0:background, 1:foreground
104
106
  ann = prompt_process.point_prompt(points=[[200, 200]], pointlabel=[1])
105
- prompt_process.plot(annotations=ann, output='./')
107
+ prompt_process.plot(annotations=ann, output="./")
106
108
 
107
109
 
108
110
  def test_mobilesam():
@@ -110,10 +112,10 @@ def test_mobilesam():
110
112
  from ultralytics import SAM
111
113
 
112
114
  # Load the model
113
- model = SAM(WEIGHTS_DIR / 'mobile_sam.pt')
115
+ model = SAM(WEIGHTS_DIR / "mobile_sam.pt")
114
116
 
115
117
  # Source
116
- source = ASSETS / 'zidane.jpg'
118
+ source = ASSETS / "zidane.jpg"
117
119
 
118
120
  # Predict a segment based on a point prompt
119
121
  model.predict(source, points=[900, 370], labels=[1])
@@ -127,10 +129,10 @@ def test_mobilesam():
127
129
 
128
130
  # Slow Tests -----------------------------------------------------------------------------------------------------------
129
131
  @pytest.mark.slow
130
- @pytest.mark.parametrize('task,model,data', TASK_ARGS)
131
- @pytest.mark.skipif(not CUDA_IS_AVAILABLE, reason='CUDA is not available')
132
- @pytest.mark.skipif(CUDA_DEVICE_COUNT < 2, reason='DDP is not available')
132
+ @pytest.mark.parametrize("task,model,data", TASK_ARGS)
133
+ @pytest.mark.skipif(not CUDA_IS_AVAILABLE, reason="CUDA is not available")
134
+ @pytest.mark.skipif(CUDA_DEVICE_COUNT < 2, reason="DDP is not available")
133
135
  def test_train_gpu(task, model, data):
134
136
  """Test YOLO training on GPU(s) for various tasks and models."""
135
- run(f'yolo train {task} model={model}.yaml data={data} imgsz=32 epochs=1 device=0') # single GPU
136
- run(f'yolo train {task} model={model}.pt data={data} imgsz=32 epochs=1 device=0,1') # multi GPU
137
+ run(f"yolo train {task} model={model}.yaml data={data} imgsz=32 epochs=1 device=0") # single GPU
138
+ run(f"yolo train {task} model={model}.pt data={data} imgsz=32 epochs=1 device=0,1") # multi GPU
@@ -9,9 +9,9 @@ from ultralytics.utils import ASSETS, WEIGHTS_DIR, checks
9
9
  CUDA_IS_AVAILABLE = checks.cuda_is_available()
10
10
  CUDA_DEVICE_COUNT = checks.cuda_device_count()
11
11
 
12
- MODEL = WEIGHTS_DIR / 'path with spaces' / 'yolov8n.pt' # test spaces in path
13
- DATA = 'coco8.yaml'
14
- BUS = ASSETS / 'bus.jpg'
12
+ MODEL = WEIGHTS_DIR / "path with spaces" / "yolov8n.pt" # test spaces in path
13
+ DATA = "coco8.yaml"
14
+ BUS = ASSETS / "bus.jpg"
15
15
 
16
16
 
17
17
  def test_checks():
@@ -20,7 +20,7 @@ def test_checks():
20
20
  assert torch.cuda.device_count() == CUDA_DEVICE_COUNT
21
21
 
22
22
 
23
- @pytest.mark.skipif(not CUDA_IS_AVAILABLE, reason='CUDA is not available')
23
+ @pytest.mark.skipif(not CUDA_IS_AVAILABLE, reason="CUDA is not available")
24
24
  def test_train():
25
25
  """Test model training on a minimal dataset."""
26
26
  device = 0 if CUDA_DEVICE_COUNT == 1 else [0, 1]
@@ -28,32 +28,32 @@ def test_train():
28
28
 
29
29
 
30
30
  @pytest.mark.slow
31
- @pytest.mark.skipif(not CUDA_IS_AVAILABLE, reason='CUDA is not available')
31
+ @pytest.mark.skipif(not CUDA_IS_AVAILABLE, reason="CUDA is not available")
32
32
  def test_predict_multiple_devices():
33
33
  """Validate model prediction on multiple devices."""
34
- model = YOLO('yolov8n.pt')
34
+ model = YOLO("yolov8n.pt")
35
35
  model = model.cpu()
36
- assert str(model.device) == 'cpu'
36
+ assert str(model.device) == "cpu"
37
37
  _ = model(BUS) # CPU inference
38
- assert str(model.device) == 'cpu'
38
+ assert str(model.device) == "cpu"
39
39
 
40
- model = model.to('cuda:0')
41
- assert str(model.device) == 'cuda:0'
40
+ model = model.to("cuda:0")
41
+ assert str(model.device) == "cuda:0"
42
42
  _ = model(BUS) # CUDA inference
43
- assert str(model.device) == 'cuda:0'
43
+ assert str(model.device) == "cuda:0"
44
44
 
45
45
  model = model.cpu()
46
- assert str(model.device) == 'cpu'
46
+ assert str(model.device) == "cpu"
47
47
  _ = model(BUS) # CPU inference
48
- assert str(model.device) == 'cpu'
48
+ assert str(model.device) == "cpu"
49
49
 
50
50
  model = model.cuda()
51
- assert str(model.device) == 'cuda:0'
51
+ assert str(model.device) == "cuda:0"
52
52
  _ = model(BUS) # CUDA inference
53
- assert str(model.device) == 'cuda:0'
53
+ assert str(model.device) == "cuda:0"
54
54
 
55
55
 
56
- @pytest.mark.skipif(not CUDA_IS_AVAILABLE, reason='CUDA is not available')
56
+ @pytest.mark.skipif(not CUDA_IS_AVAILABLE, reason="CUDA is not available")
57
57
  def test_autobatch():
58
58
  """Check batch size for YOLO model using autobatch."""
59
59
  from ultralytics.utils.autobatch import check_train_batch_size
@@ -62,24 +62,24 @@ def test_autobatch():
62
62
 
63
63
 
64
64
  @pytest.mark.slow
65
- @pytest.mark.skipif(not CUDA_IS_AVAILABLE, reason='CUDA is not available')
65
+ @pytest.mark.skipif(not CUDA_IS_AVAILABLE, reason="CUDA is not available")
66
66
  def test_utils_benchmarks():
67
67
  """Profile YOLO models for performance benchmarks."""
68
68
  from ultralytics.utils.benchmarks import ProfileModels
69
69
 
70
70
  # Pre-export a dynamic engine model to use dynamic inference
71
- YOLO(MODEL).export(format='engine', imgsz=32, dynamic=True, batch=1)
71
+ YOLO(MODEL).export(format="engine", imgsz=32, dynamic=True, batch=1)
72
72
  ProfileModels([MODEL], imgsz=32, half=False, min_time=1, num_timed_runs=3, num_warmup_runs=1).profile()
73
73
 
74
74
 
75
- @pytest.mark.skipif(not CUDA_IS_AVAILABLE, reason='CUDA is not available')
75
+ @pytest.mark.skipif(not CUDA_IS_AVAILABLE, reason="CUDA is not available")
76
76
  def test_predict_sam():
77
77
  """Test SAM model prediction with various prompts."""
78
78
  from ultralytics import SAM
79
79
  from ultralytics.models.sam import Predictor as SAMPredictor
80
80
 
81
81
  # Load a model
82
- model = SAM(WEIGHTS_DIR / 'sam_b.pt')
82
+ model = SAM(WEIGHTS_DIR / "sam_b.pt")
83
83
 
84
84
  # Display model information (optional)
85
85
  model.info()
@@ -91,14 +91,14 @@ def test_predict_sam():
91
91
  model(BUS, bboxes=[439, 437, 524, 709], device=0)
92
92
 
93
93
  # Run inference with points prompt
94
- model(ASSETS / 'zidane.jpg', points=[900, 370], labels=[1], device=0)
94
+ model(ASSETS / "zidane.jpg", points=[900, 370], labels=[1], device=0)
95
95
 
96
96
  # Create SAMPredictor
97
- overrides = dict(conf=0.25, task='segment', mode='predict', imgsz=1024, model=WEIGHTS_DIR / 'mobile_sam.pt')
97
+ overrides = dict(conf=0.25, task="segment", mode="predict", imgsz=1024, model=WEIGHTS_DIR / "mobile_sam.pt")
98
98
  predictor = SAMPredictor(overrides=overrides)
99
99
 
100
100
  # Set image
101
- predictor.set_image(ASSETS / 'zidane.jpg') # set with image file
101
+ predictor.set_image(ASSETS / "zidane.jpg") # set with image file
102
102
  # predictor(bboxes=[439, 437, 524, 709])
103
103
  # predictor(points=[900, 370], labels=[1])
104
104
 
@@ -0,0 +1,128 @@
1
+ # Ultralytics YOLO 🚀, AGPL-3.0 license
2
+
3
+ from ultralytics import YOLO
4
+ from ultralytics.cfg import get_cfg
5
+ from ultralytics.engine.exporter import Exporter
6
+ from ultralytics.models.yolo import classify, detect, segment
7
+ from ultralytics.utils import ASSETS, DEFAULT_CFG, WEIGHTS_DIR
8
+
9
+ CFG_DET = "yolov8n.yaml"
10
+ CFG_SEG = "yolov8n-seg.yaml"
11
+ CFG_CLS = "yolov8n-cls.yaml" # or 'squeezenet1_0'
12
+ CFG = get_cfg(DEFAULT_CFG)
13
+ MODEL = WEIGHTS_DIR / "yolov8n"
14
+
15
+
16
+ def test_func(*args): # noqa
17
+ """Test function callback."""
18
+ print("callback test passed")
19
+
20
+
21
+ def test_export():
22
+ """Test model exporting functionality."""
23
+ exporter = Exporter()
24
+ exporter.add_callback("on_export_start", test_func)
25
+ assert test_func in exporter.callbacks["on_export_start"], "callback test failed"
26
+ f = exporter(model=YOLO(CFG_DET).model)
27
+ YOLO(f)(ASSETS) # exported model inference
28
+
29
+
30
+ def test_detect():
31
+ """Test object detection functionality."""
32
+ overrides = {"data": "coco8.yaml", "model": CFG_DET, "imgsz": 32, "epochs": 1, "save": False}
33
+ CFG.data = "coco8.yaml"
34
+ CFG.imgsz = 32
35
+
36
+ # Trainer
37
+ trainer = detect.DetectionTrainer(overrides=overrides)
38
+ trainer.add_callback("on_train_start", test_func)
39
+ assert test_func in trainer.callbacks["on_train_start"], "callback test failed"
40
+ trainer.train()
41
+
42
+ # Validator
43
+ val = detect.DetectionValidator(args=CFG)
44
+ val.add_callback("on_val_start", test_func)
45
+ assert test_func in val.callbacks["on_val_start"], "callback test failed"
46
+ val(model=trainer.best) # validate best.pt
47
+
48
+ # Predictor
49
+ pred = detect.DetectionPredictor(overrides={"imgsz": [64, 64]})
50
+ pred.add_callback("on_predict_start", test_func)
51
+ assert test_func in pred.callbacks["on_predict_start"], "callback test failed"
52
+ result = pred(source=ASSETS, model=f"{MODEL}.pt")
53
+ assert len(result), "predictor test failed"
54
+
55
+ overrides["resume"] = trainer.last
56
+ trainer = detect.DetectionTrainer(overrides=overrides)
57
+ try:
58
+ trainer.train()
59
+ except Exception as e:
60
+ print(f"Expected exception caught: {e}")
61
+ return
62
+
63
+ Exception("Resume test failed!")
64
+
65
+
66
+ def test_segment():
67
+ """Test image segmentation functionality."""
68
+ overrides = {"data": "coco8-seg.yaml", "model": CFG_SEG, "imgsz": 32, "epochs": 1, "save": False}
69
+ CFG.data = "coco8-seg.yaml"
70
+ CFG.imgsz = 32
71
+ # YOLO(CFG_SEG).train(**overrides) # works
72
+
73
+ # Trainer
74
+ trainer = segment.SegmentationTrainer(overrides=overrides)
75
+ trainer.add_callback("on_train_start", test_func)
76
+ assert test_func in trainer.callbacks["on_train_start"], "callback test failed"
77
+ trainer.train()
78
+
79
+ # Validator
80
+ val = segment.SegmentationValidator(args=CFG)
81
+ val.add_callback("on_val_start", test_func)
82
+ assert test_func in val.callbacks["on_val_start"], "callback test failed"
83
+ val(model=trainer.best) # validate best.pt
84
+
85
+ # Predictor
86
+ pred = segment.SegmentationPredictor(overrides={"imgsz": [64, 64]})
87
+ pred.add_callback("on_predict_start", test_func)
88
+ assert test_func in pred.callbacks["on_predict_start"], "callback test failed"
89
+ result = pred(source=ASSETS, model=f"{MODEL}-seg.pt")
90
+ assert len(result), "predictor test failed"
91
+
92
+ # Test resume
93
+ overrides["resume"] = trainer.last
94
+ trainer = segment.SegmentationTrainer(overrides=overrides)
95
+ try:
96
+ trainer.train()
97
+ except Exception as e:
98
+ print(f"Expected exception caught: {e}")
99
+ return
100
+
101
+ Exception("Resume test failed!")
102
+
103
+
104
+ def test_classify():
105
+ """Test image classification functionality."""
106
+ overrides = {"data": "imagenet10", "model": CFG_CLS, "imgsz": 32, "epochs": 1, "save": False}
107
+ CFG.data = "imagenet10"
108
+ CFG.imgsz = 32
109
+ # YOLO(CFG_SEG).train(**overrides) # works
110
+
111
+ # Trainer
112
+ trainer = classify.ClassificationTrainer(overrides=overrides)
113
+ trainer.add_callback("on_train_start", test_func)
114
+ assert test_func in trainer.callbacks["on_train_start"], "callback test failed"
115
+ trainer.train()
116
+
117
+ # Validator
118
+ val = classify.ClassificationValidator(args=CFG)
119
+ val.add_callback("on_val_start", test_func)
120
+ assert test_func in val.callbacks["on_val_start"], "callback test failed"
121
+ val(model=trainer.best)
122
+
123
+ # Predictor
124
+ pred = classify.ClassificationPredictor(overrides={"imgsz": [64, 64]})
125
+ pred.add_callback("on_predict_start", test_func)
126
+ assert test_func in pred.callbacks["on_predict_start"], "callback test failed"
127
+ result = pred(source=ASSETS, model=trainer.best)
128
+ assert len(result), "predictor test failed"
@@ -12,7 +12,7 @@ def test_similarity():
12
12
  exp.create_embeddings_table()
13
13
  similar = exp.get_similar(idx=1)
14
14
  assert len(similar) == 25
15
- similar = exp.get_similar(img=ASSETS / 'zidane.jpg')
15
+ similar = exp.get_similar(img=ASSETS / "zidane.jpg")
16
16
  assert len(similar) == 25
17
17
  similar = exp.get_similar(idx=[1, 2], limit=10)
18
18
  assert len(similar) == 10
@@ -24,9 +24,9 @@ def test_similarity():
24
24
 
25
25
  def test_det():
26
26
  """Test detection functionalities and ensure the embedding table has bounding boxes."""
27
- exp = Explorer(data='coco8.yaml', model='yolov8n.pt')
27
+ exp = Explorer(data="coco8.yaml", model="yolov8n.pt")
28
28
  exp.create_embeddings_table(force=True)
29
- assert len(exp.table.head()['bboxes']) > 0
29
+ assert len(exp.table.head()["bboxes"]) > 0
30
30
  similar = exp.get_similar(idx=[1, 2], limit=10)
31
31
  assert len(similar) > 0
32
32
  # This is a loose test, just checks errors not correctness
@@ -36,9 +36,9 @@ def test_det():
36
36
 
37
37
  def test_seg():
38
38
  """Test segmentation functionalities and verify the embedding table includes masks."""
39
- exp = Explorer(data='coco8-seg.yaml', model='yolov8n-seg.pt')
39
+ exp = Explorer(data="coco8-seg.yaml", model="yolov8n-seg.pt")
40
40
  exp.create_embeddings_table(force=True)
41
- assert len(exp.table.head()['masks']) > 0
41
+ assert len(exp.table.head()["masks"]) > 0
42
42
  similar = exp.get_similar(idx=[1, 2], limit=10)
43
43
  assert len(similar) > 0
44
44
  similar = exp.plot_similar(idx=[1, 2], limit=10)
@@ -47,9 +47,9 @@ def test_seg():
47
47
 
48
48
  def test_pose():
49
49
  """Test pose estimation functionalities and check the embedding table for keypoints."""
50
- exp = Explorer(data='coco8-pose.yaml', model='yolov8n-pose.pt')
50
+ exp = Explorer(data="coco8-pose.yaml", model="yolov8n-pose.pt")
51
51
  exp.create_embeddings_table(force=True)
52
- assert len(exp.table.head()['keypoints']) > 0
52
+ assert len(exp.table.head()["keypoints"]) > 0
53
53
  similar = exp.get_similar(idx=[1, 2], limit=10)
54
54
  assert len(similar) > 0
55
55
  similar = exp.plot_similar(idx=[1, 2], limit=10)
@@ -0,0 +1,117 @@
1
+ # Ultralytics YOLO 🚀, AGPL-3.0 license
2
+
3
+ import contextlib
4
+ from pathlib import Path
5
+
6
+ import pytest
7
+
8
+ from ultralytics import YOLO, download
9
+ from ultralytics.utils import ASSETS, DATASETS_DIR, ROOT, SETTINGS, WEIGHTS_DIR
10
+ from ultralytics.utils.checks import check_requirements
11
+
12
+ MODEL = WEIGHTS_DIR / "path with spaces" / "yolov8n.pt" # test spaces in path
13
+ CFG = "yolov8n.yaml"
14
+ SOURCE = ASSETS / "bus.jpg"
15
+ TMP = (ROOT / "../tests/tmp").resolve() # temp directory for test files
16
+
17
+
18
+ @pytest.mark.skipif(not check_requirements("ray", install=False), reason="ray[tune] not installed")
19
+ def test_model_ray_tune():
20
+ """Tune YOLO model with Ray optimization library."""
21
+ YOLO("yolov8n-cls.yaml").tune(
22
+ use_ray=True, data="imagenet10", grace_period=1, iterations=1, imgsz=32, epochs=1, plots=False, device="cpu"
23
+ )
24
+
25
+
26
+ @pytest.mark.skipif(not check_requirements("mlflow", install=False), reason="mlflow not installed")
27
+ def test_mlflow():
28
+ """Test training with MLflow tracking enabled."""
29
+ SETTINGS["mlflow"] = True
30
+ YOLO("yolov8n-cls.yaml").train(data="imagenet10", imgsz=32, epochs=3, plots=False, device="cpu")
31
+
32
+
33
+ @pytest.mark.skipif(not check_requirements("tritonclient", install=False), reason="tritonclient[all] not installed")
34
+ def test_triton():
35
+ """Test NVIDIA Triton Server functionalities."""
36
+ check_requirements("tritonclient[all]")
37
+ import subprocess
38
+ import time
39
+
40
+ from tritonclient.http import InferenceServerClient # noqa
41
+
42
+ # Create variables
43
+ model_name = "yolo"
44
+ triton_repo_path = TMP / "triton_repo"
45
+ triton_model_path = triton_repo_path / model_name
46
+
47
+ # Export model to ONNX
48
+ f = YOLO(MODEL).export(format="onnx", dynamic=True)
49
+
50
+ # Prepare Triton repo
51
+ (triton_model_path / "1").mkdir(parents=True, exist_ok=True)
52
+ Path(f).rename(triton_model_path / "1" / "model.onnx")
53
+ (triton_model_path / "config.pbtxt").touch()
54
+
55
+ # Define image https://catalog.ngc.nvidia.com/orgs/nvidia/containers/tritonserver
56
+ tag = "nvcr.io/nvidia/tritonserver:23.09-py3" # 6.4 GB
57
+
58
+ # Pull the image
59
+ subprocess.call(f"docker pull {tag}", shell=True)
60
+
61
+ # Run the Triton server and capture the container ID
62
+ container_id = (
63
+ subprocess.check_output(
64
+ f"docker run -d --rm -v {triton_repo_path}:/models -p 8000:8000 {tag} tritonserver --model-repository=/models",
65
+ shell=True,
66
+ )
67
+ .decode("utf-8")
68
+ .strip()
69
+ )
70
+
71
+ # Wait for the Triton server to start
72
+ triton_client = InferenceServerClient(url="localhost:8000", verbose=False, ssl=False)
73
+
74
+ # Wait until model is ready
75
+ for _ in range(10):
76
+ with contextlib.suppress(Exception):
77
+ assert triton_client.is_model_ready(model_name)
78
+ break
79
+ time.sleep(1)
80
+
81
+ # Check Triton inference
82
+ YOLO(f"http://localhost:8000/{model_name}", "detect")(SOURCE) # exported model inference
83
+
84
+ # Kill and remove the container at the end of the test
85
+ subprocess.call(f"docker kill {container_id}", shell=True)
86
+
87
+
88
+ @pytest.mark.skipif(not check_requirements("pycocotools", install=False), reason="pycocotools not installed")
89
+ def test_pycocotools():
90
+ """Validate model predictions using pycocotools."""
91
+ from ultralytics.models.yolo.detect import DetectionValidator
92
+ from ultralytics.models.yolo.pose import PoseValidator
93
+ from ultralytics.models.yolo.segment import SegmentationValidator
94
+
95
+ # Download annotations after each dataset downloads first
96
+ url = "https://github.com/ultralytics/assets/releases/download/v8.1.0/"
97
+
98
+ args = {"model": "yolov8n.pt", "data": "coco8.yaml", "save_json": True, "imgsz": 64}
99
+ validator = DetectionValidator(args=args)
100
+ validator()
101
+ validator.is_coco = True
102
+ download(f"{url}instances_val2017.json", dir=DATASETS_DIR / "coco8/annotations")
103
+ _ = validator.eval_json(validator.stats)
104
+
105
+ args = {"model": "yolov8n-seg.pt", "data": "coco8-seg.yaml", "save_json": True, "imgsz": 64}
106
+ validator = SegmentationValidator(args=args)
107
+ validator()
108
+ validator.is_coco = True
109
+ download(f"{url}instances_val2017.json", dir=DATASETS_DIR / "coco8-seg/annotations")
110
+ _ = validator.eval_json(validator.stats)
111
+
112
+ args = {"model": "yolov8n-pose.pt", "data": "coco8-pose.yaml", "save_json": True, "imgsz": 64}
113
+ validator = PoseValidator(args=args)
114
+ validator()
115
+ validator.is_coco = True
116
+ download(f"{url}person_keypoints_val2017.json", dir=DATASETS_DIR / "coco8-pose/annotations")
117
+ _ = validator.eval_json(validator.stats)