dgenerate-ultralytics-headless 8.3.214__py3-none-any.whl → 8.4.7__py3-none-any.whl

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 (249) hide show
  1. {dgenerate_ultralytics_headless-8.3.214.dist-info → dgenerate_ultralytics_headless-8.4.7.dist-info}/METADATA +64 -74
  2. dgenerate_ultralytics_headless-8.4.7.dist-info/RECORD +311 -0
  3. {dgenerate_ultralytics_headless-8.3.214.dist-info → dgenerate_ultralytics_headless-8.4.7.dist-info}/WHEEL +1 -1
  4. tests/__init__.py +7 -9
  5. tests/conftest.py +8 -15
  6. tests/test_cli.py +1 -1
  7. tests/test_cuda.py +13 -10
  8. tests/test_engine.py +9 -9
  9. tests/test_exports.py +65 -13
  10. tests/test_integrations.py +13 -13
  11. tests/test_python.py +125 -69
  12. tests/test_solutions.py +161 -152
  13. ultralytics/__init__.py +1 -1
  14. ultralytics/cfg/__init__.py +86 -92
  15. ultralytics/cfg/datasets/Argoverse.yaml +7 -6
  16. ultralytics/cfg/datasets/DOTAv1.5.yaml +1 -1
  17. ultralytics/cfg/datasets/DOTAv1.yaml +1 -1
  18. ultralytics/cfg/datasets/ImageNet.yaml +1 -1
  19. ultralytics/cfg/datasets/TT100K.yaml +346 -0
  20. ultralytics/cfg/datasets/VOC.yaml +15 -16
  21. ultralytics/cfg/datasets/african-wildlife.yaml +1 -1
  22. ultralytics/cfg/datasets/coco-pose.yaml +21 -0
  23. ultralytics/cfg/datasets/coco12-formats.yaml +101 -0
  24. ultralytics/cfg/datasets/coco128-seg.yaml +1 -1
  25. ultralytics/cfg/datasets/coco8-pose.yaml +21 -0
  26. ultralytics/cfg/datasets/dog-pose.yaml +28 -0
  27. ultralytics/cfg/datasets/dota8-multispectral.yaml +1 -1
  28. ultralytics/cfg/datasets/dota8.yaml +2 -2
  29. ultralytics/cfg/datasets/hand-keypoints.yaml +26 -2
  30. ultralytics/cfg/datasets/kitti.yaml +27 -0
  31. ultralytics/cfg/datasets/lvis.yaml +5 -5
  32. ultralytics/cfg/datasets/open-images-v7.yaml +1 -1
  33. ultralytics/cfg/datasets/tiger-pose.yaml +16 -0
  34. ultralytics/cfg/datasets/xView.yaml +16 -16
  35. ultralytics/cfg/default.yaml +4 -2
  36. ultralytics/cfg/models/11/yolo11-pose.yaml +1 -1
  37. ultralytics/cfg/models/11/yoloe-11-seg.yaml +2 -2
  38. ultralytics/cfg/models/11/yoloe-11.yaml +2 -2
  39. ultralytics/cfg/models/26/yolo26-cls.yaml +33 -0
  40. ultralytics/cfg/models/26/yolo26-obb.yaml +52 -0
  41. ultralytics/cfg/models/26/yolo26-p2.yaml +60 -0
  42. ultralytics/cfg/models/26/yolo26-p6.yaml +62 -0
  43. ultralytics/cfg/models/26/yolo26-pose.yaml +53 -0
  44. ultralytics/cfg/models/26/yolo26-seg.yaml +52 -0
  45. ultralytics/cfg/models/26/yolo26.yaml +52 -0
  46. ultralytics/cfg/models/26/yoloe-26-seg.yaml +53 -0
  47. ultralytics/cfg/models/26/yoloe-26.yaml +53 -0
  48. ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +1 -1
  49. ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +1 -1
  50. ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +1 -1
  51. ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +1 -1
  52. ultralytics/cfg/models/v10/yolov10b.yaml +2 -2
  53. ultralytics/cfg/models/v10/yolov10l.yaml +2 -2
  54. ultralytics/cfg/models/v10/yolov10m.yaml +2 -2
  55. ultralytics/cfg/models/v10/yolov10n.yaml +2 -2
  56. ultralytics/cfg/models/v10/yolov10s.yaml +2 -2
  57. ultralytics/cfg/models/v10/yolov10x.yaml +2 -2
  58. ultralytics/cfg/models/v3/yolov3-tiny.yaml +1 -1
  59. ultralytics/cfg/models/v6/yolov6.yaml +1 -1
  60. ultralytics/cfg/models/v8/yoloe-v8-seg.yaml +9 -6
  61. ultralytics/cfg/models/v8/yoloe-v8.yaml +9 -6
  62. ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +1 -1
  63. ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +1 -1
  64. ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +2 -2
  65. ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +2 -2
  66. ultralytics/cfg/models/v8/yolov8-ghost.yaml +2 -2
  67. ultralytics/cfg/models/v8/yolov8-obb.yaml +1 -1
  68. ultralytics/cfg/models/v8/yolov8-p2.yaml +1 -1
  69. ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +1 -1
  70. ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +1 -1
  71. ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +1 -1
  72. ultralytics/cfg/models/v8/yolov8-world.yaml +1 -1
  73. ultralytics/cfg/models/v8/yolov8-worldv2.yaml +6 -6
  74. ultralytics/cfg/models/v9/yolov9s.yaml +1 -1
  75. ultralytics/data/__init__.py +4 -4
  76. ultralytics/data/annotator.py +5 -6
  77. ultralytics/data/augment.py +300 -475
  78. ultralytics/data/base.py +18 -26
  79. ultralytics/data/build.py +147 -25
  80. ultralytics/data/converter.py +108 -87
  81. ultralytics/data/dataset.py +47 -75
  82. ultralytics/data/loaders.py +42 -49
  83. ultralytics/data/split.py +5 -6
  84. ultralytics/data/split_dota.py +8 -15
  85. ultralytics/data/utils.py +36 -45
  86. ultralytics/engine/exporter.py +351 -263
  87. ultralytics/engine/model.py +186 -225
  88. ultralytics/engine/predictor.py +45 -54
  89. ultralytics/engine/results.py +198 -325
  90. ultralytics/engine/trainer.py +165 -106
  91. ultralytics/engine/tuner.py +41 -43
  92. ultralytics/engine/validator.py +55 -38
  93. ultralytics/hub/__init__.py +16 -19
  94. ultralytics/hub/auth.py +6 -12
  95. ultralytics/hub/google/__init__.py +7 -10
  96. ultralytics/hub/session.py +15 -25
  97. ultralytics/hub/utils.py +5 -8
  98. ultralytics/models/__init__.py +1 -1
  99. ultralytics/models/fastsam/__init__.py +1 -1
  100. ultralytics/models/fastsam/model.py +8 -10
  101. ultralytics/models/fastsam/predict.py +18 -30
  102. ultralytics/models/fastsam/utils.py +1 -2
  103. ultralytics/models/fastsam/val.py +5 -7
  104. ultralytics/models/nas/__init__.py +1 -1
  105. ultralytics/models/nas/model.py +5 -8
  106. ultralytics/models/nas/predict.py +7 -9
  107. ultralytics/models/nas/val.py +1 -2
  108. ultralytics/models/rtdetr/__init__.py +1 -1
  109. ultralytics/models/rtdetr/model.py +5 -8
  110. ultralytics/models/rtdetr/predict.py +15 -19
  111. ultralytics/models/rtdetr/train.py +10 -13
  112. ultralytics/models/rtdetr/val.py +21 -23
  113. ultralytics/models/sam/__init__.py +15 -2
  114. ultralytics/models/sam/amg.py +14 -20
  115. ultralytics/models/sam/build.py +26 -19
  116. ultralytics/models/sam/build_sam3.py +377 -0
  117. ultralytics/models/sam/model.py +29 -32
  118. ultralytics/models/sam/modules/blocks.py +83 -144
  119. ultralytics/models/sam/modules/decoders.py +19 -37
  120. ultralytics/models/sam/modules/encoders.py +44 -101
  121. ultralytics/models/sam/modules/memory_attention.py +16 -30
  122. ultralytics/models/sam/modules/sam.py +200 -73
  123. ultralytics/models/sam/modules/tiny_encoder.py +64 -83
  124. ultralytics/models/sam/modules/transformer.py +18 -28
  125. ultralytics/models/sam/modules/utils.py +174 -50
  126. ultralytics/models/sam/predict.py +2248 -350
  127. ultralytics/models/sam/sam3/__init__.py +3 -0
  128. ultralytics/models/sam/sam3/decoder.py +546 -0
  129. ultralytics/models/sam/sam3/encoder.py +529 -0
  130. ultralytics/models/sam/sam3/geometry_encoders.py +415 -0
  131. ultralytics/models/sam/sam3/maskformer_segmentation.py +286 -0
  132. ultralytics/models/sam/sam3/model_misc.py +199 -0
  133. ultralytics/models/sam/sam3/necks.py +129 -0
  134. ultralytics/models/sam/sam3/sam3_image.py +339 -0
  135. ultralytics/models/sam/sam3/text_encoder_ve.py +307 -0
  136. ultralytics/models/sam/sam3/vitdet.py +547 -0
  137. ultralytics/models/sam/sam3/vl_combiner.py +160 -0
  138. ultralytics/models/utils/loss.py +14 -26
  139. ultralytics/models/utils/ops.py +13 -17
  140. ultralytics/models/yolo/__init__.py +1 -1
  141. ultralytics/models/yolo/classify/predict.py +10 -13
  142. ultralytics/models/yolo/classify/train.py +12 -33
  143. ultralytics/models/yolo/classify/val.py +30 -29
  144. ultralytics/models/yolo/detect/predict.py +9 -12
  145. ultralytics/models/yolo/detect/train.py +17 -23
  146. ultralytics/models/yolo/detect/val.py +77 -59
  147. ultralytics/models/yolo/model.py +43 -60
  148. ultralytics/models/yolo/obb/predict.py +7 -16
  149. ultralytics/models/yolo/obb/train.py +14 -17
  150. ultralytics/models/yolo/obb/val.py +40 -37
  151. ultralytics/models/yolo/pose/__init__.py +1 -1
  152. ultralytics/models/yolo/pose/predict.py +7 -22
  153. ultralytics/models/yolo/pose/train.py +13 -16
  154. ultralytics/models/yolo/pose/val.py +39 -58
  155. ultralytics/models/yolo/segment/predict.py +17 -21
  156. ultralytics/models/yolo/segment/train.py +7 -10
  157. ultralytics/models/yolo/segment/val.py +95 -47
  158. ultralytics/models/yolo/world/train.py +8 -14
  159. ultralytics/models/yolo/world/train_world.py +11 -34
  160. ultralytics/models/yolo/yoloe/__init__.py +7 -7
  161. ultralytics/models/yolo/yoloe/predict.py +16 -23
  162. ultralytics/models/yolo/yoloe/train.py +36 -44
  163. ultralytics/models/yolo/yoloe/train_seg.py +11 -11
  164. ultralytics/models/yolo/yoloe/val.py +15 -20
  165. ultralytics/nn/__init__.py +7 -7
  166. ultralytics/nn/autobackend.py +159 -85
  167. ultralytics/nn/modules/__init__.py +68 -60
  168. ultralytics/nn/modules/activation.py +4 -6
  169. ultralytics/nn/modules/block.py +260 -224
  170. ultralytics/nn/modules/conv.py +52 -97
  171. ultralytics/nn/modules/head.py +831 -299
  172. ultralytics/nn/modules/transformer.py +76 -88
  173. ultralytics/nn/modules/utils.py +16 -21
  174. ultralytics/nn/tasks.py +180 -195
  175. ultralytics/nn/text_model.py +45 -69
  176. ultralytics/optim/__init__.py +5 -0
  177. ultralytics/optim/muon.py +338 -0
  178. ultralytics/solutions/__init__.py +12 -12
  179. ultralytics/solutions/ai_gym.py +13 -19
  180. ultralytics/solutions/analytics.py +15 -16
  181. ultralytics/solutions/config.py +6 -7
  182. ultralytics/solutions/distance_calculation.py +10 -13
  183. ultralytics/solutions/heatmap.py +8 -14
  184. ultralytics/solutions/instance_segmentation.py +6 -9
  185. ultralytics/solutions/object_blurrer.py +7 -10
  186. ultralytics/solutions/object_counter.py +12 -19
  187. ultralytics/solutions/object_cropper.py +8 -14
  188. ultralytics/solutions/parking_management.py +34 -32
  189. ultralytics/solutions/queue_management.py +10 -12
  190. ultralytics/solutions/region_counter.py +9 -12
  191. ultralytics/solutions/security_alarm.py +15 -20
  192. ultralytics/solutions/similarity_search.py +10 -15
  193. ultralytics/solutions/solutions.py +77 -76
  194. ultralytics/solutions/speed_estimation.py +7 -10
  195. ultralytics/solutions/streamlit_inference.py +2 -4
  196. ultralytics/solutions/templates/similarity-search.html +7 -18
  197. ultralytics/solutions/trackzone.py +7 -10
  198. ultralytics/solutions/vision_eye.py +5 -8
  199. ultralytics/trackers/__init__.py +1 -1
  200. ultralytics/trackers/basetrack.py +3 -5
  201. ultralytics/trackers/bot_sort.py +10 -27
  202. ultralytics/trackers/byte_tracker.py +21 -37
  203. ultralytics/trackers/track.py +4 -7
  204. ultralytics/trackers/utils/gmc.py +11 -22
  205. ultralytics/trackers/utils/kalman_filter.py +37 -48
  206. ultralytics/trackers/utils/matching.py +12 -15
  207. ultralytics/utils/__init__.py +124 -124
  208. ultralytics/utils/autobatch.py +2 -4
  209. ultralytics/utils/autodevice.py +17 -18
  210. ultralytics/utils/benchmarks.py +57 -71
  211. ultralytics/utils/callbacks/base.py +8 -10
  212. ultralytics/utils/callbacks/clearml.py +5 -13
  213. ultralytics/utils/callbacks/comet.py +32 -46
  214. ultralytics/utils/callbacks/dvc.py +13 -18
  215. ultralytics/utils/callbacks/mlflow.py +4 -5
  216. ultralytics/utils/callbacks/neptune.py +7 -15
  217. ultralytics/utils/callbacks/platform.py +423 -38
  218. ultralytics/utils/callbacks/raytune.py +3 -4
  219. ultralytics/utils/callbacks/tensorboard.py +25 -31
  220. ultralytics/utils/callbacks/wb.py +16 -14
  221. ultralytics/utils/checks.py +127 -85
  222. ultralytics/utils/cpu.py +3 -8
  223. ultralytics/utils/dist.py +9 -12
  224. ultralytics/utils/downloads.py +25 -33
  225. ultralytics/utils/errors.py +6 -14
  226. ultralytics/utils/events.py +2 -4
  227. ultralytics/utils/export/__init__.py +4 -236
  228. ultralytics/utils/export/engine.py +246 -0
  229. ultralytics/utils/export/imx.py +117 -63
  230. ultralytics/utils/export/tensorflow.py +231 -0
  231. ultralytics/utils/files.py +26 -30
  232. ultralytics/utils/git.py +9 -11
  233. ultralytics/utils/instance.py +30 -51
  234. ultralytics/utils/logger.py +212 -114
  235. ultralytics/utils/loss.py +601 -215
  236. ultralytics/utils/metrics.py +128 -156
  237. ultralytics/utils/nms.py +13 -16
  238. ultralytics/utils/ops.py +117 -166
  239. ultralytics/utils/patches.py +75 -21
  240. ultralytics/utils/plotting.py +75 -80
  241. ultralytics/utils/tal.py +125 -59
  242. ultralytics/utils/torch_utils.py +53 -79
  243. ultralytics/utils/tqdm.py +24 -21
  244. ultralytics/utils/triton.py +13 -19
  245. ultralytics/utils/tuner.py +19 -10
  246. dgenerate_ultralytics_headless-8.3.214.dist-info/RECORD +0 -283
  247. {dgenerate_ultralytics_headless-8.3.214.dist-info → dgenerate_ultralytics_headless-8.4.7.dist-info}/entry_points.txt +0 -0
  248. {dgenerate_ultralytics_headless-8.3.214.dist-info → dgenerate_ultralytics_headless-8.4.7.dist-info}/licenses/LICENSE +0 -0
  249. {dgenerate_ultralytics_headless-8.3.214.dist-info → dgenerate_ultralytics_headless-8.4.7.dist-info}/top_level.txt +0 -0
@@ -18,8 +18,7 @@ from ultralytics.utils.checks import check_requirements
18
18
 
19
19
 
20
20
  def bbox_iof(polygon1: np.ndarray, bbox2: np.ndarray, eps: float = 1e-6) -> np.ndarray:
21
- """
22
- Calculate Intersection over Foreground (IoF) between polygons and bounding boxes.
21
+ """Calculate Intersection over Foreground (IoF) between polygons and bounding boxes.
23
22
 
24
23
  Args:
25
24
  polygon1 (np.ndarray): Polygon coordinates with shape (N, 8).
@@ -65,8 +64,7 @@ def bbox_iof(polygon1: np.ndarray, bbox2: np.ndarray, eps: float = 1e-6) -> np.n
65
64
 
66
65
 
67
66
  def load_yolo_dota(data_root: str, split: str = "train") -> list[dict[str, Any]]:
68
- """
69
- Load DOTA dataset annotations and image information.
67
+ """Load DOTA dataset annotations and image information.
70
68
 
71
69
  Args:
72
70
  data_root (str): Data root directory.
@@ -107,8 +105,7 @@ def get_windows(
107
105
  im_rate_thr: float = 0.6,
108
106
  eps: float = 0.01,
109
107
  ) -> np.ndarray:
110
- """
111
- Get the coordinates of sliding windows for image cropping.
108
+ """Get the coordinates of sliding windows for image cropping.
112
109
 
113
110
  Args:
114
111
  im_size (tuple[int, int]): Original image size, (H, W).
@@ -118,7 +115,7 @@ def get_windows(
118
115
  eps (float, optional): Epsilon value for math operations.
119
116
 
120
117
  Returns:
121
- (np.ndarray): Array of window coordinates with shape (N, 4) where each row is [x_start, y_start, x_stop, y_stop].
118
+ (np.ndarray): Array of window coordinates of shape (N, 4) where each row is [x_start, y_start, x_stop, y_stop].
122
119
  """
123
120
  h, w = im_size
124
121
  windows = []
@@ -175,8 +172,7 @@ def crop_and_save(
175
172
  lb_dir: str,
176
173
  allow_background_images: bool = True,
177
174
  ) -> None:
178
- """
179
- Crop images and save new labels for each window.
175
+ """Crop images and save new labels for each window.
180
176
 
181
177
  Args:
182
178
  anno (dict[str, Any]): Annotation dict, including 'filepath', 'label', 'ori_size' as its keys.
@@ -226,8 +222,7 @@ def split_images_and_labels(
226
222
  crop_sizes: tuple[int, ...] = (1024,),
227
223
  gaps: tuple[int, ...] = (200,),
228
224
  ) -> None:
229
- """
230
- Split both images and labels for a given dataset split.
225
+ """Split both images and labels for a given dataset split.
231
226
 
232
227
  Args:
233
228
  data_root (str): Root directory of the dataset.
@@ -265,8 +260,7 @@ def split_images_and_labels(
265
260
  def split_trainval(
266
261
  data_root: str, save_dir: str, crop_size: int = 1024, gap: int = 200, rates: tuple[float, ...] = (1.0,)
267
262
  ) -> None:
268
- """
269
- Split train and val sets of DOTA dataset with multiple scaling rates.
263
+ """Split train and val sets of DOTA dataset with multiple scaling rates.
270
264
 
271
265
  Args:
272
266
  data_root (str): Root directory of the dataset.
@@ -304,8 +298,7 @@ def split_trainval(
304
298
  def split_test(
305
299
  data_root: str, save_dir: str, crop_size: int = 1024, gap: int = 200, rates: tuple[float, ...] = (1.0,)
306
300
  ) -> None:
307
- """
308
- Split test set of DOTA dataset, labels are not included within this set.
301
+ """Split test set of DOTA dataset, labels are not included within this set.
309
302
 
310
303
  Args:
311
304
  data_root (str): Root directory of the dataset.
ultralytics/data/utils.py CHANGED
@@ -37,8 +37,8 @@ from ultralytics.utils.downloads import download, safe_download, unzip_file
37
37
  from ultralytics.utils.ops import segments2boxes
38
38
 
39
39
  HELP_URL = "See https://docs.ultralytics.com/datasets for dataset formatting guidance."
40
- IMG_FORMATS = {"bmp", "dng", "jpeg", "jpg", "mpo", "png", "tif", "tiff", "webp", "pfm", "heic"} # image suffixes
41
- VID_FORMATS = {"asf", "avi", "gif", "m4v", "mkv", "mov", "mp4", "mpeg", "mpg", "ts", "wmv", "webm"} # video suffixes
40
+ IMG_FORMATS = {"avif", "bmp", "dng", "heic", "jp2", "jpeg", "jpeg2000", "jpg", "mpo", "png", "tif", "tiff", "webp"}
41
+ VID_FORMATS = {"asf", "avi", "gif", "m4v", "mkv", "mov", "mp4", "mpeg", "mpg", "ts", "wmv", "webm"} # videos
42
42
  FORMATS_HELP_MSG = f"Supported formats are:\nimages: {IMG_FORMATS}\nvideos: {VID_FORMATS}"
43
43
 
44
44
 
@@ -51,11 +51,10 @@ def img2label_paths(img_paths: list[str]) -> list[str]:
51
51
  def check_file_speeds(
52
52
  files: list[str], threshold_ms: float = 10, threshold_mb: float = 50, max_files: int = 5, prefix: str = ""
53
53
  ):
54
- """
55
- Check dataset file access speed and provide performance feedback.
54
+ """Check dataset file access speed and provide performance feedback.
56
55
 
57
- This function tests the access speed of dataset files by measuring ping (stat call) time and read speed.
58
- It samples up to 5 files from the provided list and warns if access times exceed the threshold.
56
+ This function tests the access speed of dataset files by measuring ping (stat call) time and read speed. It samples
57
+ up to 5 files from the provided list and warns if access times exceed the threshold.
59
58
 
60
59
  Args:
61
60
  files (list[str]): List of file paths to check for access speed.
@@ -251,21 +250,20 @@ def verify_image_label(args: tuple) -> list:
251
250
 
252
251
 
253
252
  def visualize_image_annotations(image_path: str, txt_path: str, label_map: dict[int, str]):
254
- """
255
- Visualize YOLO annotations (bounding boxes and class labels) on an image.
253
+ """Visualize YOLO annotations (bounding boxes and class labels) on an image.
256
254
 
257
- This function reads an image and its corresponding annotation file in YOLO format, then
258
- draws bounding boxes around detected objects and labels them with their respective class names.
259
- The bounding box colors are assigned based on the class ID, and the text color is dynamically
260
- adjusted for readability, depending on the background color's luminance.
255
+ This function reads an image and its corresponding annotation file in YOLO format, then draws bounding boxes around
256
+ detected objects and labels them with their respective class names. The bounding box colors are assigned based on
257
+ the class ID, and the text color is dynamically adjusted for readability, depending on the background color's
258
+ luminance.
261
259
 
262
260
  Args:
263
- image_path (str): The path to the image file to annotate, and it can be in formats supported by PIL.
264
- txt_path (str): The path to the annotation file in YOLO format, that should contain one line per object.
261
+ image_path (str): Path to the image file to annotate. The file must be readable by PIL.
262
+ txt_path (str): Path to the annotation file in YOLO format, which should contain one line per object.
265
263
  label_map (dict[int, str]): A dictionary that maps class IDs (integers) to class labels (strings).
266
264
 
267
265
  Examples:
268
- >>> label_map = {0: "cat", 1: "dog", 2: "bird"} # It should include all annotated classes details
266
+ >>> label_map = {0: "cat", 1: "dog", 2: "bird"} # Should include all annotated classes
269
267
  >>> visualize_image_annotations("path/to/image.jpg", "path/to/annotations.txt", label_map)
270
268
  """
271
269
  import matplotlib.pyplot as plt
@@ -285,7 +283,7 @@ def visualize_image_annotations(image_path: str, txt_path: str, label_map: dict[
285
283
  annotations.append((x, y, w, h, int(class_id)))
286
284
  _, ax = plt.subplots(1) # Plot the image and annotations
287
285
  for x, y, w, h, label in annotations:
288
- color = tuple(c / 255 for c in colors(label, True)) # Get and normalize the RGB color
286
+ color = tuple(c / 255 for c in colors(label, False)) # Get and normalize an RGB color for Matplotlib
289
287
  rect = plt.Rectangle((x, y), w, h, linewidth=2, edgecolor=color, facecolor="none") # Create a rectangle
290
288
  ax.add_patch(rect)
291
289
  luminance = 0.2126 * color[0] + 0.7152 * color[1] + 0.0722 * color[2] # Formula for luminance
@@ -297,13 +295,12 @@ def visualize_image_annotations(image_path: str, txt_path: str, label_map: dict[
297
295
  def polygon2mask(
298
296
  imgsz: tuple[int, int], polygons: list[np.ndarray], color: int = 1, downsample_ratio: int = 1
299
297
  ) -> np.ndarray:
300
- """
301
- Convert a list of polygons to a binary mask of the specified image size.
298
+ """Convert a list of polygons to a binary mask of the specified image size.
302
299
 
303
300
  Args:
304
301
  imgsz (tuple[int, int]): The size of the image as (height, width).
305
- polygons (list[np.ndarray]): A list of polygons. Each polygon is an array with shape (N, M), where
306
- N is the number of polygons, and M is the number of points such that M % 2 = 0.
302
+ polygons (list[np.ndarray]): A list of polygons. Each polygon is an array with shape (N, M), where N is the
303
+ number of polygons, and M is the number of points such that M % 2 = 0.
307
304
  color (int, optional): The color value to fill in the polygons on the mask.
308
305
  downsample_ratio (int, optional): Factor by which to downsample the mask.
309
306
 
@@ -322,13 +319,12 @@ def polygon2mask(
322
319
  def polygons2masks(
323
320
  imgsz: tuple[int, int], polygons: list[np.ndarray], color: int, downsample_ratio: int = 1
324
321
  ) -> np.ndarray:
325
- """
326
- Convert a list of polygons to a set of binary masks of the specified image size.
322
+ """Convert a list of polygons to a set of binary masks of the specified image size.
327
323
 
328
324
  Args:
329
325
  imgsz (tuple[int, int]): The size of the image as (height, width).
330
- polygons (list[np.ndarray]): A list of polygons. Each polygon is an array with shape (N, M), where
331
- N is the number of polygons, and M is the number of points such that M % 2 = 0.
326
+ polygons (list[np.ndarray]): A list of polygons. Each polygon is an array with shape (N, M), where N is the
327
+ number of polygons, and M is the number of points such that M % 2 = 0.
332
328
  color (int): The color value to fill in the polygons on the masks.
333
329
  downsample_ratio (int, optional): Factor by which to downsample each mask.
334
330
 
@@ -368,8 +364,7 @@ def polygons2masks_overlap(
368
364
 
369
365
 
370
366
  def find_dataset_yaml(path: Path) -> Path:
371
- """
372
- Find and return the YAML file associated with a Detect, Segment or Pose dataset.
367
+ """Find and return the YAML file associated with a Detect, Segment or Pose dataset.
373
368
 
374
369
  This function searches for a YAML file at the root level of the provided directory first, and if not found, it
375
370
  performs a recursive search. It prefers YAML files that have the same stem as the provided path.
@@ -389,8 +384,7 @@ def find_dataset_yaml(path: Path) -> Path:
389
384
 
390
385
 
391
386
  def check_det_dataset(dataset: str, autodownload: bool = True) -> dict[str, Any]:
392
- """
393
- Download, verify, and/or unzip a dataset if not found locally.
387
+ """Download, verify, and/or unzip a dataset if not found locally.
394
388
 
395
389
  This function checks the availability of a specified dataset, and if not found, it has the option to download and
396
390
  unzip the dataset. It then reads and parses the accompanying YAML data, ensuring key requirements are met and also
@@ -460,7 +454,7 @@ def check_det_dataset(dataset: str, autodownload: bool = True) -> dict[str, Any]
460
454
  if not all(x.exists() for x in val):
461
455
  name = clean_url(dataset) # dataset name with URL auth stripped
462
456
  LOGGER.info("")
463
- m = f"Dataset '{name}' images not found, missing path '{[x for x in val if not x.exists()][0]}'"
457
+ m = f"Dataset '{name}' images not found, missing path '{next(x for x in val if not x.exists())}'"
464
458
  if s and autodownload:
465
459
  LOGGER.warning(m)
466
460
  else:
@@ -484,11 +478,10 @@ def check_det_dataset(dataset: str, autodownload: bool = True) -> dict[str, Any]
484
478
 
485
479
 
486
480
  def check_cls_dataset(dataset: str | Path, split: str = "") -> dict[str, Any]:
487
- """
488
- Check a classification dataset such as Imagenet.
481
+ """Check a classification dataset such as Imagenet.
489
482
 
490
- This function accepts a `dataset` name and attempts to retrieve the corresponding dataset information.
491
- If the dataset is not found locally, it attempts to download the dataset from the internet and save it locally.
483
+ This function accepts a `dataset` name and attempts to retrieve the corresponding dataset information. If the
484
+ dataset is not found locally, it attempts to download the dataset from the internet and save it locally.
492
485
 
493
486
  Args:
494
487
  dataset (str | Path): The name of the dataset.
@@ -581,8 +574,7 @@ def check_cls_dataset(dataset: str | Path, split: str = "") -> dict[str, Any]:
581
574
 
582
575
 
583
576
  class HUBDatasetStats:
584
- """
585
- A class for generating HUB dataset JSON and `-hub` dataset directory.
577
+ """A class for generating HUB dataset JSON and `-hub` dataset directory.
586
578
 
587
579
  Args:
588
580
  path (str): Path to data.yaml or data.zip (with data.yaml inside data.zip).
@@ -600,10 +592,6 @@ class HUBDatasetStats:
600
592
  get_json: Return dataset JSON for Ultralytics HUB.
601
593
  process_images: Compress images for Ultralytics HUB.
602
594
 
603
- Note:
604
- Download *.zip files from https://github.com/ultralytics/hub/tree/main/example_datasets
605
- i.e. https://github.com/ultralytics/hub/raw/main/example_datasets/coco8.zip for coco8.zip.
606
-
607
595
  Examples:
608
596
  >>> from ultralytics.data.utils import HUBDatasetStats
609
597
  >>> stats = HUBDatasetStats("path/to/coco8.zip", task="detect") # detect dataset
@@ -613,6 +601,10 @@ class HUBDatasetStats:
613
601
  >>> stats = HUBDatasetStats("path/to/imagenet10.zip", task="classify") # classification dataset
614
602
  >>> stats.get_json(save=True)
615
603
  >>> stats.process_images()
604
+
605
+ Notes:
606
+ Download *.zip files from https://github.com/ultralytics/hub/tree/main/example_datasets
607
+ i.e. https://github.com/ultralytics/hub/raw/main/example_datasets/coco8.zip for coco8.zip.
616
608
  """
617
609
 
618
610
  def __init__(self, path: str = "coco8.yaml", task: str = "detect", autodownload: bool = False):
@@ -747,11 +739,10 @@ class HUBDatasetStats:
747
739
  return self.im_dir
748
740
 
749
741
 
750
- def compress_one_image(f: str, f_new: str = None, max_dim: int = 1920, quality: int = 50):
751
- """
752
- Compress a single image file to reduced size while preserving its aspect ratio and quality using either the Python
753
- Imaging Library (PIL) or OpenCV library. If the input image is smaller than the maximum dimension, it will not be
754
- resized.
742
+ def compress_one_image(f: str, f_new: str | None = None, max_dim: int = 1920, quality: int = 50):
743
+ """Compress a single image file to reduced size while preserving its aspect ratio and quality using either the
744
+ Python Imaging Library (PIL) or OpenCV library. If the input image is smaller than the maximum dimension, it
745
+ will not be resized.
755
746
 
756
747
  Args:
757
748
  f (str): The path to the input image file.
@@ -804,4 +795,4 @@ def save_dataset_cache_file(prefix: str, path: Path, x: dict, version: str):
804
795
  np.save(file, x)
805
796
  LOGGER.info(f"{prefix}New cache created: {path}")
806
797
  else:
807
- LOGGER.warning(f"{prefix}Cache directory {path.parent} is not writeable, cache not saved.")
798
+ LOGGER.warning(f"{prefix}Cache directory {path.parent} is not writable, cache not saved.")