ultralytics 8.0.159__py3-none-any.whl → 8.0.161__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.

Potentially problematic release.


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

Files changed (30) hide show
  1. ultralytics/__init__.py +2 -3
  2. ultralytics/data/dataset.py +74 -20
  3. ultralytics/data/utils.py +39 -5
  4. ultralytics/engine/trainer.py +4 -1
  5. ultralytics/hub/__init__.py +2 -25
  6. ultralytics/hub/auth.py +2 -22
  7. ultralytics/models/fastsam/predict.py +8 -11
  8. ultralytics/models/nas/predict.py +5 -5
  9. ultralytics/models/rtdetr/predict.py +5 -5
  10. ultralytics/models/sam/modules/sam.py +21 -35
  11. ultralytics/models/sam/predict.py +4 -4
  12. ultralytics/models/yolo/classify/predict.py +4 -5
  13. ultralytics/models/yolo/classify/train.py +1 -1
  14. ultralytics/models/yolo/classify/val.py +1 -1
  15. ultralytics/models/yolo/detect/predict.py +5 -7
  16. ultralytics/models/yolo/pose/predict.py +6 -11
  17. ultralytics/models/yolo/segment/predict.py +8 -13
  18. ultralytics/nn/modules/conv.py +6 -1
  19. ultralytics/trackers/utils/kalman_filter.py +71 -95
  20. ultralytics/utils/callbacks/tensorboard.py +3 -3
  21. ultralytics/utils/checks.py +6 -5
  22. ultralytics/utils/downloads.py +12 -13
  23. ultralytics/utils/metrics.py +0 -11
  24. ultralytics/utils/ops.py +84 -117
  25. {ultralytics-8.0.159.dist-info → ultralytics-8.0.161.dist-info}/METADATA +1 -1
  26. {ultralytics-8.0.159.dist-info → ultralytics-8.0.161.dist-info}/RECORD +30 -30
  27. {ultralytics-8.0.159.dist-info → ultralytics-8.0.161.dist-info}/WHEEL +1 -1
  28. {ultralytics-8.0.159.dist-info → ultralytics-8.0.161.dist-info}/LICENSE +0 -0
  29. {ultralytics-8.0.159.dist-info → ultralytics-8.0.161.dist-info}/entry_points.txt +0 -0
  30. {ultralytics-8.0.159.dist-info → ultralytics-8.0.161.dist-info}/top_level.txt +0 -0
ultralytics/utils/ops.py CHANGED
@@ -13,8 +13,6 @@ import torchvision
13
13
 
14
14
  from ultralytics.utils import LOGGER
15
15
 
16
- from .metrics import box_iou
17
-
18
16
 
19
17
  class Profile(contextlib.ContextDecorator):
20
18
  """
@@ -32,23 +30,17 @@ class Profile(contextlib.ContextDecorator):
32
30
  self.cuda = torch.cuda.is_available()
33
31
 
34
32
  def __enter__(self):
35
- """
36
- Start timing.
37
- """
33
+ """Start timing."""
38
34
  self.start = self.time()
39
35
  return self
40
36
 
41
37
  def __exit__(self, type, value, traceback): # noqa
42
- """
43
- Stop timing.
44
- """
38
+ """Stop timing."""
45
39
  self.dt = self.time() - self.start # delta-time
46
40
  self.t += self.dt # accumulate dt
47
41
 
48
42
  def time(self):
49
- """
50
- Get current time.
51
- """
43
+ """Get current time."""
52
44
  if self.cuda:
53
45
  torch.cuda.synchronize()
54
46
  return time.time()
@@ -56,15 +48,15 @@ class Profile(contextlib.ContextDecorator):
56
48
 
57
49
  def segment2box(segment, width=640, height=640):
58
50
  """
59
- Convert 1 segment label to 1 box label, applying inside-image constraint, i.e. (xy1, xy2, ...) to (xyxy)
51
+ Convert 1 segment label to 1 box label, applying inside-image constraint, i.e. (xy1, xy2, ...) to (xyxy).
60
52
 
61
53
  Args:
62
- segment (torch.Tensor): the segment label
63
- width (int): the width of the image. Defaults to 640
64
- height (int): The height of the image. Defaults to 640
54
+ segment (torch.Tensor): the segment label
55
+ width (int): the width of the image. Defaults to 640
56
+ height (int): The height of the image. Defaults to 640
65
57
 
66
58
  Returns:
67
- (np.ndarray): the minimum and maximum x and y values of the segment.
59
+ (np.ndarray): the minimum and maximum x and y values of the segment.
68
60
  """
69
61
  # Convert 1 segment label to 1 box label, applying inside-image constraint, i.e. (xy1, xy2, ...) to (xyxy)
70
62
  x, y = segment.T # segment xy
@@ -80,16 +72,16 @@ def scale_boxes(img1_shape, boxes, img0_shape, ratio_pad=None, padding=True):
80
72
  (img1_shape) to the shape of a different image (img0_shape).
81
73
 
82
74
  Args:
83
- img1_shape (tuple): The shape of the image that the bounding boxes are for, in the format of (height, width).
84
- boxes (torch.Tensor): the bounding boxes of the objects in the image, in the format of (x1, y1, x2, y2)
85
- img0_shape (tuple): the shape of the target image, in the format of (height, width).
86
- ratio_pad (tuple): a tuple of (ratio, pad) for scaling the boxes. If not provided, the ratio and pad will be
87
- calculated based on the size difference between the two images.
88
- padding (bool): If True, assuming the boxes is based on image augmented by yolo style. If False then do regular
89
- rescaling.
75
+ img1_shape (tuple): The shape of the image that the bounding boxes are for, in the format of (height, width).
76
+ boxes (torch.Tensor): the bounding boxes of the objects in the image, in the format of (x1, y1, x2, y2)
77
+ img0_shape (tuple): the shape of the target image, in the format of (height, width).
78
+ ratio_pad (tuple): a tuple of (ratio, pad) for scaling the boxes. If not provided, the ratio and pad will be
79
+ calculated based on the size difference between the two images.
80
+ padding (bool): If True, assuming the boxes is based on image augmented by yolo style. If False then do regular
81
+ rescaling.
90
82
 
91
83
  Returns:
92
- boxes (torch.Tensor): The scaled bounding boxes, in the format of (x1, y1, x2, y2)
84
+ boxes (torch.Tensor): The scaled bounding boxes, in the format of (x1, y1, x2, y2)
93
85
  """
94
86
  if ratio_pad is None: # calculate from img0_shape
95
87
  gain = min(img1_shape[0] / img0_shape[0], img1_shape[1] / img0_shape[1]) # gain = old / new
@@ -186,9 +178,7 @@ def non_max_suppression(
186
178
  # Settings
187
179
  # min_wh = 2 # (pixels) minimum box width and height
188
180
  time_limit = 0.5 + max_time_img * bs # seconds to quit after
189
- redundant = True # require redundant detections
190
181
  multi_label &= nc > 1 # multiple labels per box (adds 0.5ms/img)
191
- merge = False # use merge-NMS
192
182
 
193
183
  prediction = prediction.transpose(-1, -2) # shape(1,84,6300) to shape(1,6300,84)
194
184
  prediction[..., :4] = xywh2xyxy(prediction[..., :4]) # xywh to xyxy
@@ -226,10 +216,6 @@ def non_max_suppression(
226
216
  if classes is not None:
227
217
  x = x[(x[:, 5:6] == torch.tensor(classes, device=x.device)).any(1)]
228
218
 
229
- # Apply finite constraint
230
- # if not torch.isfinite(x).all():
231
- # x = x[torch.isfinite(x).all(1)]
232
-
233
219
  # Check shape
234
220
  n = x.shape[0] # number of boxes
235
221
  if not n: # no boxes
@@ -242,13 +228,18 @@ def non_max_suppression(
242
228
  boxes, scores = x[:, :4] + c, x[:, 4] # boxes (offset by class), scores
243
229
  i = torchvision.ops.nms(boxes, scores, iou_thres) # NMS
244
230
  i = i[:max_det] # limit detections
245
- if merge and (1 < n < 3E3): # Merge NMS (boxes merged using weighted mean)
246
- # Update boxes as boxes(i,4) = weights(i,n) * boxes(n,4)
247
- iou = box_iou(boxes[i], boxes) > iou_thres # iou matrix
248
- weights = iou * scores[None] # box weights
249
- x[i, :4] = torch.mm(weights, x[:, :4]).float() / weights.sum(1, keepdim=True) # merged boxes
250
- if redundant:
251
- i = i[iou.sum(1) > 1] # require redundancy
231
+
232
+ # # Experimental
233
+ # merge = False # use merge-NMS
234
+ # if merge and (1 < n < 3E3): # Merge NMS (boxes merged using weighted mean)
235
+ # # Update boxes as boxes(i,4) = weights(i,n) * boxes(n,4)
236
+ # from .metrics import box_iou
237
+ # iou = box_iou(boxes[i], boxes) > iou_thres # iou matrix
238
+ # weights = iou * scores[None] # box weights
239
+ # x[i, :4] = torch.mm(weights, x[:, :4]).float() / weights.sum(1, keepdim=True) # merged boxes
240
+ # redundant = True # require redundant detections
241
+ # if redundant:
242
+ # i = i[iou.sum(1) > 1] # require redundancy
252
243
 
253
244
  output[xi] = x[i]
254
245
  if mps:
@@ -262,8 +253,7 @@ def non_max_suppression(
262
253
 
263
254
  def clip_boxes(boxes, shape):
264
255
  """
265
- It takes a list of bounding boxes and a shape (height, width) and clips the bounding boxes to the
266
- shape
256
+ Takes a list of bounding boxes and a shape (height, width) and clips the bounding boxes to the shape.
267
257
 
268
258
  Args:
269
259
  boxes (torch.Tensor): the bounding boxes to clip
@@ -303,12 +293,12 @@ def scale_image(masks, im0_shape, ratio_pad=None):
303
293
  Takes a mask, and resizes it to the original image size
304
294
 
305
295
  Args:
306
- masks (np.ndarray): resized and padded masks/images, [h, w, num]/[h, w, 3].
307
- im0_shape (tuple): the original image shape
308
- ratio_pad (tuple): the ratio of the padding to the original image.
296
+ masks (np.ndarray): resized and padded masks/images, [h, w, num]/[h, w, 3].
297
+ im0_shape (tuple): the original image shape
298
+ ratio_pad (tuple): the ratio of the padding to the original image.
309
299
 
310
300
  Returns:
311
- masks (torch.Tensor): The masks that are being returned.
301
+ masks (torch.Tensor): The masks that are being returned.
312
302
  """
313
303
  # Rescale coordinates (xyxy) from im1_shape to im0_shape
314
304
  im1_shape = masks.shape
@@ -340,6 +330,7 @@ def xyxy2xywh(x):
340
330
 
341
331
  Args:
342
332
  x (np.ndarray | torch.Tensor): The input bounding box coordinates in (x1, y1, x2, y2) format.
333
+
343
334
  Returns:
344
335
  y (np.ndarray | torch.Tensor): The bounding box coordinates in (x, y, width, height) format.
345
336
  """
@@ -359,6 +350,7 @@ def xywh2xyxy(x):
359
350
 
360
351
  Args:
361
352
  x (np.ndarray | torch.Tensor): The input bounding box coordinates in (x, y, width, height) format.
353
+
362
354
  Returns:
363
355
  y (np.ndarray | torch.Tensor): The bounding box coordinates in (x1, y1, x2, y2) format.
364
356
  """
@@ -407,6 +399,7 @@ def xyxy2xywhn(x, w=640, h=640, clip=False, eps=0.0):
407
399
  h (int): The height of the image. Defaults to 640
408
400
  clip (bool): If True, the boxes will be clipped to the image boundaries. Defaults to False
409
401
  eps (float): The minimum value of the box's width and height. Defaults to 0.0
402
+
410
403
  Returns:
411
404
  y (np.ndarray | torch.Tensor): The bounding box coordinates in (x, y, width, height, normalized) format
412
405
  """
@@ -421,31 +414,13 @@ def xyxy2xywhn(x, w=640, h=640, clip=False, eps=0.0):
421
414
  return y
422
415
 
423
416
 
424
- def xyn2xy(x, w=640, h=640, padw=0, padh=0):
425
- """
426
- Convert normalized coordinates to pixel coordinates of shape (n,2)
427
-
428
- Args:
429
- x (np.ndarray | torch.Tensor): The input tensor of normalized bounding box coordinates
430
- w (int): The width of the image. Defaults to 640
431
- h (int): The height of the image. Defaults to 640
432
- padw (int): The width of the padding. Defaults to 0
433
- padh (int): The height of the padding. Defaults to 0
434
- Returns:
435
- y (np.ndarray | torch.Tensor): The x and y coordinates of the top left corner of the bounding box
436
- """
437
- y = x.clone() if isinstance(x, torch.Tensor) else np.copy(x)
438
- y[..., 0] = w * x[..., 0] + padw # top left x
439
- y[..., 1] = h * x[..., 1] + padh # top left y
440
- return y
441
-
442
-
443
417
  def xywh2ltwh(x):
444
418
  """
445
419
  Convert the bounding box format from [x, y, w, h] to [x1, y1, w, h], where x1, y1 are the top-left coordinates.
446
420
 
447
421
  Args:
448
422
  x (np.ndarray | torch.Tensor): The input tensor with the bounding box coordinates in the xywh format
423
+
449
424
  Returns:
450
425
  y (np.ndarray | torch.Tensor): The bounding box coordinates in the xyltwh format
451
426
  """
@@ -460,9 +435,10 @@ def xyxy2ltwh(x):
460
435
  Convert nx4 bounding boxes from [x1, y1, x2, y2] to [x1, y1, w, h], where xy1=top-left, xy2=bottom-right
461
436
 
462
437
  Args:
463
- x (np.ndarray | torch.Tensor): The input tensor with the bounding boxes coordinates in the xyxy format
438
+ x (np.ndarray | torch.Tensor): The input tensor with the bounding boxes coordinates in the xyxy format
439
+
464
440
  Returns:
465
- y (np.ndarray | torch.Tensor): The bounding box coordinates in the xyltwh format.
441
+ y (np.ndarray | torch.Tensor): The bounding box coordinates in the xyltwh format.
466
442
  """
467
443
  y = x.clone() if isinstance(x, torch.Tensor) else np.copy(x)
468
444
  y[..., 2] = x[..., 2] - x[..., 0] # width
@@ -475,7 +451,10 @@ def ltwh2xywh(x):
475
451
  Convert nx4 boxes from [x1, y1, w, h] to [x, y, w, h] where xy1=top-left, xy=center
476
452
 
477
453
  Args:
478
- x (torch.Tensor): the input tensor
454
+ x (torch.Tensor): the input tensor
455
+
456
+ Returns:
457
+ y (np.ndarray | torch.Tensor): The bounding box coordinates in the xywh format.
479
458
  """
480
459
  y = x.clone() if isinstance(x, torch.Tensor) else np.copy(x)
481
460
  y[..., 0] = x[..., 0] + x[..., 2] / 2 # center x
@@ -493,14 +472,8 @@ def xyxyxyxy2xywhr(corners):
493
472
  Returns:
494
473
  (numpy.ndarray | torch.Tensor): Converted data in [cx, cy, w, h, rotation] format of shape (n, 5).
495
474
  """
496
- if isinstance(corners, torch.Tensor):
497
- is_numpy = False
498
- atan2 = torch.atan2
499
- sqrt = torch.sqrt
500
- else:
501
- is_numpy = True
502
- atan2 = np.arctan2
503
- sqrt = np.sqrt
475
+ is_numpy = isinstance(corners, np.ndarray)
476
+ atan2, sqrt = (np.arctan2, np.sqrt) if is_numpy else (torch.atan2, torch.sqrt)
504
477
 
505
478
  x1, y1, x2, y2, x3, y3, x4, y4 = corners.T
506
479
  cx = (x1 + x3) / 2
@@ -527,14 +500,8 @@ def xywhr2xyxyxyxy(center):
527
500
  Returns:
528
501
  (numpy.ndarray | torch.Tensor): Converted corner points of shape (n, 8).
529
502
  """
530
- if isinstance(center, torch.Tensor):
531
- is_numpy = False
532
- cos = torch.cos
533
- sin = torch.sin
534
- else:
535
- is_numpy = True
536
- cos = np.cos
537
- sin = np.sin
503
+ is_numpy = isinstance(center, np.ndarray)
504
+ cos, sin = (np.cos, np.sin) if is_numpy else (torch.cos, torch.sin)
538
505
 
539
506
  cx, cy, w, h, rotation = center.T
540
507
  rotation *= math.pi / 180.0 # degrees to radians
@@ -567,10 +534,10 @@ def ltwh2xyxy(x):
567
534
  It converts the bounding box from [x1, y1, w, h] to [x1, y1, x2, y2] where xy1=top-left, xy2=bottom-right
568
535
 
569
536
  Args:
570
- x (np.ndarray | torch.Tensor): the input image
537
+ x (np.ndarray | torch.Tensor): the input image
571
538
 
572
539
  Returns:
573
- y (np.ndarray | torch.Tensor): the xyxy coordinates of the bounding boxes.
540
+ y (np.ndarray | torch.Tensor): the xyxy coordinates of the bounding boxes.
574
541
  """
575
542
  y = x.clone() if isinstance(x, torch.Tensor) else np.copy(x)
576
543
  y[..., 2] = x[..., 2] + x[..., 0] # width
@@ -583,10 +550,10 @@ def segments2boxes(segments):
583
550
  It converts segment labels to box labels, i.e. (cls, xy1, xy2, ...) to (cls, xywh)
584
551
 
585
552
  Args:
586
- segments (list): list of segments, each segment is a list of points, each point is a list of x, y coordinates
553
+ segments (list): list of segments, each segment is a list of points, each point is a list of x, y coordinates
587
554
 
588
555
  Returns:
589
- (np.ndarray): the xywh coordinates of the bounding boxes.
556
+ (np.ndarray): the xywh coordinates of the bounding boxes.
590
557
  """
591
558
  boxes = []
592
559
  for s in segments:
@@ -600,11 +567,11 @@ def resample_segments(segments, n=1000):
600
567
  Inputs a list of segments (n,2) and returns a list of segments (n,2) up-sampled to n points each.
601
568
 
602
569
  Args:
603
- segments (list): a list of (n,2) arrays, where n is the number of points in the segment.
604
- n (int): number of points to resample the segment to. Defaults to 1000
570
+ segments (list): a list of (n,2) arrays, where n is the number of points in the segment.
571
+ n (int): number of points to resample the segment to. Defaults to 1000
605
572
 
606
573
  Returns:
607
- segments (list): the resampled segments.
574
+ segments (list): the resampled segments.
608
575
  """
609
576
  for i, s in enumerate(segments):
610
577
  s = np.concatenate((s, s[0:1, :]), axis=0)
@@ -617,14 +584,14 @@ def resample_segments(segments, n=1000):
617
584
 
618
585
  def crop_mask(masks, boxes):
619
586
  """
620
- It takes a mask and a bounding box, and returns a mask that is cropped to the bounding box
587
+ It takes a mask and a bounding box, and returns a mask that is cropped to the bounding box.
621
588
 
622
589
  Args:
623
- masks (torch.Tensor): [n, h, w] tensor of masks
624
- boxes (torch.Tensor): [n, 4] tensor of bbox coordinates in relative point form
590
+ masks (torch.Tensor): [n, h, w] tensor of masks
591
+ boxes (torch.Tensor): [n, 4] tensor of bbox coordinates in relative point form
625
592
 
626
593
  Returns:
627
- (torch.Tensor): The masks are being cropped to the bounding box.
594
+ (torch.Tensor): The masks are being cropped to the bounding box.
628
595
  """
629
596
  n, h, w = masks.shape
630
597
  x1, y1, x2, y2 = torch.chunk(boxes[:, :, None], 4, 1) # x1 shape(n,1,1)
@@ -636,17 +603,17 @@ def crop_mask(masks, boxes):
636
603
 
637
604
  def process_mask_upsample(protos, masks_in, bboxes, shape):
638
605
  """
639
- It takes the output of the mask head, and applies the mask to the bounding boxes. This produces masks of higher
606
+ Takes the output of the mask head, and applies the mask to the bounding boxes. This produces masks of higher
640
607
  quality but is slower.
641
608
 
642
609
  Args:
643
- protos (torch.Tensor): [mask_dim, mask_h, mask_w]
644
- masks_in (torch.Tensor): [n, mask_dim], n is number of masks after nms
645
- bboxes (torch.Tensor): [n, 4], n is number of masks after nms
646
- shape (tuple): the size of the input image (h,w)
610
+ protos (torch.Tensor): [mask_dim, mask_h, mask_w]
611
+ masks_in (torch.Tensor): [n, mask_dim], n is number of masks after nms
612
+ bboxes (torch.Tensor): [n, 4], n is number of masks after nms
613
+ shape (tuple): the size of the input image (h,w)
647
614
 
648
615
  Returns:
649
- (torch.Tensor): The upsampled masks.
616
+ (torch.Tensor): The upsampled masks.
650
617
  """
651
618
  c, mh, mw = protos.shape # CHW
652
619
  masks = (masks_in @ protos.float().view(c, -1)).sigmoid().view(-1, mh, mw)
@@ -692,13 +659,13 @@ def process_mask_native(protos, masks_in, bboxes, shape):
692
659
  It takes the output of the mask head, and crops it after upsampling to the bounding boxes.
693
660
 
694
661
  Args:
695
- protos (torch.Tensor): [mask_dim, mask_h, mask_w]
696
- masks_in (torch.Tensor): [n, mask_dim], n is number of masks after nms
697
- bboxes (torch.Tensor): [n, 4], n is number of masks after nms
698
- shape (tuple): the size of the input image (h,w)
662
+ protos (torch.Tensor): [mask_dim, mask_h, mask_w]
663
+ masks_in (torch.Tensor): [n, mask_dim], n is number of masks after nms
664
+ bboxes (torch.Tensor): [n, 4], n is number of masks after nms
665
+ shape (tuple): the size of the input image (h,w)
699
666
 
700
667
  Returns:
701
- masks (torch.Tensor): The returned masks with dimensions [h, w, n]
668
+ masks (torch.Tensor): The returned masks with dimensions [h, w, n]
702
669
  """
703
670
  c, mh, mw = protos.shape # CHW
704
671
  masks = (masks_in @ protos.float().view(c, -1)).sigmoid().view(-1, mh, mw)
@@ -733,19 +700,19 @@ def scale_masks(masks, shape, padding=True):
733
700
 
734
701
  def scale_coords(img1_shape, coords, img0_shape, ratio_pad=None, normalize=False, padding=True):
735
702
  """
736
- Rescale segment coordinates (xyxy) from img1_shape to img0_shape
703
+ Rescale segment coordinates (xy) from img1_shape to img0_shape
737
704
 
738
705
  Args:
739
- img1_shape (tuple): The shape of the image that the coords are from.
740
- coords (torch.Tensor): the coords to be scaled
741
- img0_shape (tuple): the shape of the image that the segmentation is being applied to
742
- ratio_pad (tuple): the ratio of the image size to the padded image size.
743
- normalize (bool): If True, the coordinates will be normalized to the range [0, 1]. Defaults to False
744
- padding (bool): If True, assuming the boxes is based on image augmented by yolo style. If False then do regular
745
- rescaling.
706
+ img1_shape (tuple): The shape of the image that the coords are from.
707
+ coords (torch.Tensor): the coords to be scaled of shape n,2.
708
+ img0_shape (tuple): the shape of the image that the segmentation is being applied to.
709
+ ratio_pad (tuple): the ratio of the image size to the padded image size.
710
+ normalize (bool): If True, the coordinates will be normalized to the range [0, 1]. Defaults to False.
711
+ padding (bool): If True, assuming the boxes is based on image augmented by yolo style. If False then do regular
712
+ rescaling.
746
713
 
747
714
  Returns:
748
- coords (torch.Tensor): the segmented image.
715
+ coords (torch.Tensor): The scaled coordinates.
749
716
  """
750
717
  if ratio_pad is None: # calculate from img0_shape
751
718
  gain = min(img1_shape[0] / img0_shape[0], img1_shape[1] / img0_shape[1]) # gain = old / new
@@ -771,11 +738,11 @@ def masks2segments(masks, strategy='largest'):
771
738
  It takes a list of masks(n,h,w) and returns a list of segments(n,xy)
772
739
 
773
740
  Args:
774
- masks (torch.Tensor): the output of the model, which is a tensor of shape (batch_size, 160, 160)
775
- strategy (str): 'concat' or 'largest'. Defaults to largest
741
+ masks (torch.Tensor): the output of the model, which is a tensor of shape (batch_size, 160, 160)
742
+ strategy (str): 'concat' or 'largest'. Defaults to largest
776
743
 
777
744
  Returns:
778
- segments (List): list of segment masks
745
+ segments (List): list of segment masks
779
746
  """
780
747
  segments = []
781
748
  for x in masks.int().cpu().numpy().astype('uint8'):
@@ -796,9 +763,9 @@ def clean_str(s):
796
763
  Cleans a string by replacing special characters with underscore _
797
764
 
798
765
  Args:
799
- s (str): a string needing special characters replaced
766
+ s (str): a string needing special characters replaced
800
767
 
801
768
  Returns:
802
- (str): a string with special characters replaced by an underscore _
769
+ (str): a string with special characters replaced by an underscore _
803
770
  """
804
771
  return re.sub(pattern='[|@#!¡·$€%&()=?¿^*;:,¨´><+]', repl='_', string=s)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ultralytics
3
- Version: 8.0.159
3
+ Version: 8.0.161
4
4
  Summary: Ultralytics YOLOv8 for SOTA object detection, multi-object tracking, instance segmentation, pose estimation and image classification.
5
5
  Home-page: https://github.com/ultralytics/ultralytics
6
6
  Author: Ultralytics
@@ -1,4 +1,4 @@
1
- ultralytics/__init__.py,sha256=9063bFRVvKmWbeWhdUk2eyw3FEasRfkwlJAWGUnpoIU,530
1
+ ultralytics/__init__.py,sha256=rfLyUoGOkuRVu2zigzSYbcfPUfBlFghuOwf48jpzr_g,487
2
2
  ultralytics/assets/bus.jpg,sha256=wCAZxJecGR63Od3ZRERe9Aja1Weayrb9Ug751DS_vGM,137419
3
3
  ultralytics/assets/zidane.jpg,sha256=Ftc4aeMmen1O0A3o6GCDO9FlfBslLpTAw0gnetx7bts,50427
4
4
  ultralytics/cfg/__init__.py,sha256=wtVSs8iBBPUL-iGdXxHN9XeKX6y5coke3cLOSFd8BvQ,19135
@@ -44,45 +44,45 @@ ultralytics/data/augment.py,sha256=O0ppBjR_V5QNPu5e2Tt1U4WHfmCDm3iifuh3X-XnDXs,3
44
44
  ultralytics/data/base.py,sha256=_UyL9oT89BWnqAebRRtQmzy29PXrS6LFAW9QeqyXNQA,12660
45
45
  ultralytics/data/build.py,sha256=n-i5_ZkbzlACjbkKNcFLxjvDgMDu-Xfir5QVcY_Tec8,6524
46
46
  ultralytics/data/converter.py,sha256=H4MjqiUskHhz0z10zWF5YIPKvxmOnGGS0tTstnd6USI,13099
47
- ultralytics/data/dataset.py,sha256=0erUU2XqfnSAg91A6meDCsJoct0GSa5u6LaBTVB6Iv4,13353
47
+ ultralytics/data/dataset.py,sha256=RkqvDm2OdHtHz8uV9SaBv1iHtE2JffrKKqz0FyR-t1U,15754
48
48
  ultralytics/data/loaders.py,sha256=TemzC5Tl_BsdHFYfKIdcZpS_sg9DbWpimZ-1lT13RkI,16631
49
- ultralytics/data/utils.py,sha256=W_cgMLAvEfdsF9RN8n72bvokFQ3CYix4rmBEj09vg14,25306
49
+ ultralytics/data/utils.py,sha256=SJe4vzS9TCbSaCe7cC0pANIwinOSKDErPf1wkeBld9I,26830
50
50
  ultralytics/engine/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
51
51
  ultralytics/engine/exporter.py,sha256=xrlVLftYcEqQ9u6PxWEqYdCRgDJC35BflALu9HV1bIE,47953
52
52
  ultralytics/engine/model.py,sha256=CGu0avI07n2wazZpY2qI5KNh6xz6XLGkGwtBjZ2IOVo,20196
53
53
  ultralytics/engine/predictor.py,sha256=ZMV7YuH8HZPRjLZ5P4uFd_fwJ0ATXUZYsXk3_ZtCsDs,16664
54
54
  ultralytics/engine/results.py,sha256=1X7Fa_GwJ68n-qWIdRTs1k-kUQkFmSnw4XzP4C4YdoQ,24471
55
- ultralytics/engine/trainer.py,sha256=iSUfS1QGPjwwRwLl9Z1cIgHCJWkdSnK8W_ppWUIACiw,32435
55
+ ultralytics/engine/trainer.py,sha256=pMZnqTmqEunFi06eraFYhOIF11HLWBoq0id_BNzpQkA,32614
56
56
  ultralytics/engine/validator.py,sha256=HN8-ASVfTNKMcsOQA0MeJKvuQydbPDVCKGVM9sqwekU,14114
57
- ultralytics/hub/__init__.py,sha256=4okejTnd1ApXjgvRnEzXUo69SQURrEsTZdHeQAkUS34,4421
58
- ultralytics/hub/auth.py,sha256=3xWB_GlmLf85jAMUYepmUnjTsiS7k2UqZbaLEUimQdc,5195
57
+ ultralytics/hub/__init__.py,sha256=cp1neJrWZz4CbSjcx80ifKENwvxkH8lab8TzHnTqMnw,3685
58
+ ultralytics/hub/auth.py,sha256=ngA1RjwgB1DE3tGpkEtEi40c3uSGh-UNtJcVWZBeyI0,4739
59
59
  ultralytics/hub/session.py,sha256=l4OyKD6EkvQmgCqaUh7aJgajEfQ4cpGyxIUXoVqcafk,8434
60
60
  ultralytics/hub/utils.py,sha256=5s5VaCV8Ec14J6_EVnGOQr1XQ1z9HX0uYQTeYUsiVmw,9509
61
61
  ultralytics/models/__init__.py,sha256=RRIwQXcNlY3adevQs6mzD00OqejzASHro9TCSLNkwac,173
62
62
  ultralytics/models/fastsam/__init__.py,sha256=c3N-XQAJ9Mkw1WGw5gev4xXCUNiOp-_IgxonvqeYSVM,254
63
63
  ultralytics/models/fastsam/model.py,sha256=xDaWGScfZjgv63QBRWfvsW9XcqyXIjYXN_2KGOcYvxQ,948
64
- ultralytics/models/fastsam/predict.py,sha256=wwbcIHjRka9qNzdV5nRTQzbSSF7MPKoR0CMxjB8P_04,2797
64
+ ultralytics/models/fastsam/predict.py,sha256=lnfZLuTsy4DW5Sul__hA-YuiR65rrLfKyUI0STCzRhk,2570
65
65
  ultralytics/models/fastsam/prompt.py,sha256=EOjJhFmOuUjJKoOK4j1d-n5hjYC3fWep3LqAYTUmoMY,12916
66
66
  ultralytics/models/fastsam/utils.py,sha256=hOi9wM03iLsT_sMQUxHPWdkdjIQK1G0WzC3p5l0EFLQ,2157
67
67
  ultralytics/models/fastsam/val.py,sha256=0YLM_YXCbMBs7lhYlhC-6ozmUCXQAq19_SCD1T0Q2dk,689
68
68
  ultralytics/models/nas/__init__.py,sha256=O7qvgqJqoLB1NXwjTNHMJHJRhDwNHS2P_oyUV_b1qq8,179
69
69
  ultralytics/models/nas/model.py,sha256=WZ4UGyyYYMy2vy7bHmYzfxdaCs5y57PnFnVsGxU2pAc,1910
70
- ultralytics/models/nas/predict.py,sha256=UJEimiJrscmTz0KZGE9S_zpjsQtrnTfveqpRZLyvQXY,1403
70
+ ultralytics/models/nas/predict.py,sha256=lZhc74hhqNDCS8eg_mlzcghZfz9yUuSoUk-WF6L5H8Q,1375
71
71
  ultralytics/models/nas/val.py,sha256=1VVl13iXvJgOXfitcJnPsnTKv9_kMpYX8wtV2vs-oMk,907
72
72
  ultralytics/models/rtdetr/__init__.py,sha256=1Zpc6ZcizFO0EMhP8X4m3DG27vDBX4aM4RX0rMSeo6E,197
73
73
  ultralytics/models/rtdetr/model.py,sha256=Tk6V8O2yNFVv87lR2isHk1K38htIKY5DyJ-2rpdaIxY,886
74
- ultralytics/models/rtdetr/predict.py,sha256=eKcGduzIdGuprtyH8XE5Igto24Kkkz8FWbuCgqKxS-c,2272
74
+ ultralytics/models/rtdetr/predict.py,sha256=OVSl1Pkc3P6HdBLMy7xusYJWbamkpma8MQ-bqLoca18,2244
75
75
  ultralytics/models/rtdetr/train.py,sha256=vIfb6dzdclogXHKsXHlgKqSFId5_2O1pYPDhlBQo4fw,2714
76
76
  ultralytics/models/rtdetr/val.py,sha256=jZYGE43SrNhGuwPVr0DS-aAI0EHV6IakR-EVoLXNVKE,6926
77
77
  ultralytics/models/sam/__init__.py,sha256=CrrWvUKwxqzRp48rpXQo-1Fb9qDxAzNlh9hPdsGuDno,176
78
78
  ultralytics/models/sam/amg.py,sha256=yAr5KqsFnLs2l7eNdtfFI1BBTkLaEOE70xE9gFDCmRA,8090
79
79
  ultralytics/models/sam/build.py,sha256=C1yj4l7Ec6guzK4Y0Vy43Vbg8CrG_MMYOpb73m6WCG4,4822
80
80
  ultralytics/models/sam/model.py,sha256=ahZwyLavMR2D2SA19cF5cCg0ysepjfvfnYyr-8ncxGk,1775
81
- ultralytics/models/sam/predict.py,sha256=8kXILb5bx-xRWx3SXxaJmDTEN1aP3iNEz45iVwfUckQ,19360
81
+ ultralytics/models/sam/predict.py,sha256=1fxD5IO6MA9aZwp5kgU_Re0HLvjcB7mhtKBguGnTLB8,19364
82
82
  ultralytics/models/sam/modules/__init__.py,sha256=mHtJuK4hwF8cuV-VHDc7tp6u6D1gHz2Z7JI8grmQDTs,42
83
83
  ultralytics/models/sam/modules/decoders.py,sha256=lRho0OMj5t4Z5IBcp2EefKGqwERZBK57T4fiPyUTvE0,6362
84
84
  ultralytics/models/sam/modules/encoders.py,sha256=qwiRXROfcw7OIH9pC6_ysin23Vcc-kt-UzAI39Gh2_E,22397
85
- ultralytics/models/sam/modules/sam.py,sha256=GduDQJPdNa4IUdJjUieE94awGmgwNtcM7_c2cDp-4kA,7238
85
+ ultralytics/models/sam/modules/sam.py,sha256=NwW_2JlroLSD9f1tZwLbblGmF1CrXZ5zpcBr4cJfCTc,7017
86
86
  ultralytics/models/sam/modules/tiny_encoder.py,sha256=9eApzDqG1HRTCvkcjeqnA7K7bsFkvHUvK2zDqHw-d9Q,21214
87
87
  ultralytics/models/sam/modules/transformer.py,sha256=W9NxAcqxjYfi9MIMxtvSutV9DTi5o4L9DZ49XXyGJ4E,8476
88
88
  ultralytics/models/utils/__init__.py,sha256=mHtJuK4hwF8cuV-VHDc7tp6u6D1gHz2Z7JI8grmQDTs,42
@@ -91,19 +91,19 @@ ultralytics/models/utils/ops.py,sha256=lJTOueDD_TfPbdhLvp5feGrLX6hqYf7yocG5RlYTS
91
91
  ultralytics/models/yolo/__init__.py,sha256=aVqT_-JOt9_oAhr9cVgV0ZDF5X3j_QyonO2oVIzoPfs,195
92
92
  ultralytics/models/yolo/model.py,sha256=q2amvMhViwdJSZsGBIhm3YpwHQplyY0j8mFtK7nqOak,1457
93
93
  ultralytics/models/yolo/classify/__init__.py,sha256=377bRZtp3zOFJKZKiAME8K_OJ_IuDlkR2CawJ1CM3t0,355
94
- ultralytics/models/yolo/classify/predict.py,sha256=h2eyd9t6I6HodSXX9ERENXvdogW0O5FPepAI1sbKHZM,1859
95
- ultralytics/models/yolo/classify/train.py,sha256=DSQ8l5aQEKo_sVmCwuPM34kShavHcbiGPlY-hoEXxwY,6624
96
- ultralytics/models/yolo/classify/val.py,sha256=419XVaNt8FPCEvDU4IQMcX7bjmNWMLDAOZ7_2puwC8s,4754
94
+ ultralytics/models/yolo/classify/predict.py,sha256=-xCZVv22UU9LUVni8PMLALFaOWH-K7v3rKjMp9Gr0v0,1862
95
+ ultralytics/models/yolo/classify/train.py,sha256=PO0PBT76CZIOrteytD-_NzKWTBMnrQNyW2pKiMf0oD4,6637
96
+ ultralytics/models/yolo/classify/val.py,sha256=pNsyGojA8TsnIlMLF0EUTKfrbNYO-sVoNgB71_ijGG4,4778
97
97
  ultralytics/models/yolo/detect/__init__.py,sha256=XaRS_yfJHZ1UdeaTSve1d7eGYSYwXBJRp6PXM0fZgyQ,229
98
- ultralytics/models/yolo/detect/predict.py,sha256=uDq-lynJZDIIiM8XiF_MqsckJBFWvVWzcgTuS2bx6MI,1659
98
+ ultralytics/models/yolo/detect/predict.py,sha256=8GxlOnnp8Lj9TdxA0gk5FlJh0NC5f5RVGB6cW2S6iAI,1617
99
99
  ultralytics/models/yolo/detect/train.py,sha256=RExcywaB4ipIQYDZ9w99NRMASW0fxVhGH1nIQoqKoRk,5530
100
100
  ultralytics/models/yolo/detect/val.py,sha256=qIewm335wk-Z1IwwyStPOlzRoIv2nmXYUrNn_ltWuD8,13067
101
101
  ultralytics/models/yolo/pose/__init__.py,sha256=zzdVWRgbHSvJF2xTeGB62VhHZM5y-7Yq9YwVGczvB_o,199
102
- ultralytics/models/yolo/pose/predict.py,sha256=f_Fry2eP_EuA4XTqSxV4iMSx7fPSuAuUNPnd14Ikx5g,2481
102
+ ultralytics/models/yolo/pose/predict.py,sha256=u27TL7GsmjVfX9UXTxmOc-ffV1jMxIE2gcZ_8G3jn7g,2372
103
103
  ultralytics/models/yolo/pose/train.py,sha256=ax1Co9M1m8iJLVL6YJuO6elUh1TsFdmGPsrhUwBQTok,2891
104
104
  ultralytics/models/yolo/pose/val.py,sha256=wBGnB1FcQBXB2jY6PRKLkx14GXLWHmwRwH_jQU6QLa0,10656
105
105
  ultralytics/models/yolo/segment/__init__.py,sha256=2-fAGrEWcnOZDlspSWOfsyYfIAcDE3sUgbv8QTUgnRM,247
106
- ultralytics/models/yolo/segment/predict.py,sha256=3hHmDUnJvD6a0mdYacNQCfuhVI0ab2NuOrofM2kNlDU,2666
106
+ ultralytics/models/yolo/segment/predict.py,sha256=3kqFCg3X2ssixVRO_w56Bo8Yl6-AODROklhrNTVfj6g,2425
107
107
  ultralytics/models/yolo/segment/train.py,sha256=o1q4ZTmZlSwUbFIFaT_T7LvYaKOLq_QXxB-z61YwHx8,2276
108
108
  ultralytics/models/yolo/segment/val.py,sha256=IBW8Zt7uJiPj3xT94d4061RrekG9l88v09sQBxGJOFs,11955
109
109
  ultralytics/nn/__init__.py,sha256=7T_GW3YsPg1kA-74UklF2UcabcRyttRZYrCOXiNnJqU,555
@@ -111,7 +111,7 @@ ultralytics/nn/autobackend.py,sha256=ZzdNK6se2iLjCEWLjCBMVgdOiwWZmsyGnCiSLLM40P4
111
111
  ultralytics/nn/tasks.py,sha256=uBeHE8xNKrB1B1aGmwm9xcgxgt1NGOSFGseJsnBZym8,35439
112
112
  ultralytics/nn/modules/__init__.py,sha256=cOPs3TyJ14E_hTMrj6Jt2anRmz7h-kAn7J6o4wJH2dM,1587
113
113
  ultralytics/nn/modules/block.py,sha256=RR5EQzEdb2UKCYqRh-73GuKAmaIgTSMgMP6KbvOzxPI,11841
114
- ultralytics/nn/modules/conv.py,sha256=Qr9ZaE1GiqOQtWmCQU2gsP-fBnuGhLjiNM2tdludeu4,11311
114
+ ultralytics/nn/modules/conv.py,sha256=WUd0HwcLjLIbzzxnaByAzxQWDAxivFc1vPWBeG3jJv4,11531
115
115
  ultralytics/nn/modules/head.py,sha256=38-MMnPKaLwfCiQ9yyextqlT0iI3A1cUrX2ESr_sK6o,15996
116
116
  ultralytics/nn/modules/transformer.py,sha256=U-U_nrbA15vPaGesVmVULYpGZYDMEQrr7UU7QHsPfNk,16132
117
117
  ultralytics/nn/modules/utils.py,sha256=PfcEhPt3O2NUHCHQEADD-WxdS1IDtLeNOBpgflLCDmM,3244
@@ -122,20 +122,20 @@ ultralytics/trackers/byte_tracker.py,sha256=_2elPbLtR_muGDqmN6hUOdj82m88PFCBAj7v
122
122
  ultralytics/trackers/track.py,sha256=NhoNZxEv8cN-myRo17PrKhoR2nFM8lWN3Ne8qrC1zJQ,2324
123
123
  ultralytics/trackers/utils/__init__.py,sha256=mHtJuK4hwF8cuV-VHDc7tp6u6D1gHz2Z7JI8grmQDTs,42
124
124
  ultralytics/trackers/utils/gmc.py,sha256=6wCcMRoNMxmzEmjtFvjw0NHIlTRnr4-Rt5eYdpXtg74,10559
125
- ultralytics/trackers/utils/kalman_filter.py,sha256=9kc1y7thr0fgho--eZ_soqXKJSzk0AaspZRSx_FsfSg,15015
125
+ ultralytics/trackers/utils/kalman_filter.py,sha256=QJtD1QSfq8-8ArNmSaiv2Y46k0ZW2hhsJUSOEPfW7GY,14850
126
126
  ultralytics/trackers/utils/matching.py,sha256=U8tfb8tfOYs_QtHQ-rGT4ZhthUcSAYh6X_LE31olOag,4841
127
127
  ultralytics/utils/__init__.py,sha256=azRE1Ky8b8YSr43qRLtpzpDUL5rd2bnpQDR2_amaRsU,30357
128
128
  ultralytics/utils/autobatch.py,sha256=gX1mFbPhKhGYzqLqmvMJVRHRRMIit9tbEkA5bcUY-PA,3864
129
129
  ultralytics/utils/benchmarks.py,sha256=uQ8L4L1MHIOkRvyWAqdsMCpKaM3KeWHRRRRIa3slIKY,16067
130
- ultralytics/utils/checks.py,sha256=-QHQlrs-msipV4sojKIsXcf-aZuVJ4IGhtqcozh4vO4,20898
130
+ ultralytics/utils/checks.py,sha256=jTIv9nlDJRtClGFJWOMVg9coLuu2hlJDEN4d3aqw2nY,21008
131
131
  ultralytics/utils/dist.py,sha256=C-C6eTOFuFV391juWMx-8ldFDty0dOS7W7eS-6vdOjU,2591
132
- ultralytics/utils/downloads.py,sha256=1_4rBzTBjv1FJAxWUTETX381Ru23jrVY7JNL6vKxSCQ,17646
132
+ ultralytics/utils/downloads.py,sha256=tuIjYhSZrgIBfTBgNrkwbgFPTt6p9alohUryVQy3UyE,17678
133
133
  ultralytics/utils/errors.py,sha256=cfSux6tp3fVLtkv4bShfHyZHPncbo3jbQsRR-zUDcoU,312
134
134
  ultralytics/utils/files.py,sha256=oIrd5Z7c9TcGKMWyMmgshBEA_EpBbiMrv_G7SrzPCrc,5280
135
135
  ultralytics/utils/instance.py,sha256=d1bcPuirdlTljPupe6GedOylknpLKWBOQpj_1_asueM,13857
136
136
  ultralytics/utils/loss.py,sha256=yfQ0cE35lY5GF7V-0bP4QPOqzGWIjJBBnoF-AweBQak,19144
137
- ultralytics/utils/metrics.py,sha256=Y9RnPns_idbsXjtWUZ1NVDFqsm95xSBppxNL_fdt2VU,42532
138
- ultralytics/utils/ops.py,sha256=2hqstsahYP31c95hQLt5_8xcI__Rr65x0PXz1vofSWU,31099
137
+ ultralytics/utils/metrics.py,sha256=0RMOFZ7_9pkWBaXjldQiw-DO16-XQP0rs99Swul_uRI,42128
138
+ ultralytics/utils/ops.py,sha256=rfmHAZ8RKIqNPYa2g4OxmSex6xMwB20w4AYNilrRAI4,30279
139
139
  ultralytics/utils/patches.py,sha256=L0Bm8ma7BVyuO8hW-XDTBzL06GBJ9tl2ov4cAfGOh60,1246
140
140
  ultralytics/utils/plotting.py,sha256=h_9LuZkXrZjkI5wN6s059ZQ1o-DWDdhhq3dgfZ-4IWI,27483
141
141
  ultralytics/utils/tal.py,sha256=71qSXEco_FfJ9MPgODXr_wAoamHb0CLjpq53wiVEjGk,13652
@@ -150,7 +150,7 @@ ultralytics/utils/callbacks/hub.py,sha256=eeP1rjCCguKL_ge-QM8B935AcuWjsjYzNDoCUL
150
150
  ultralytics/utils/callbacks/mlflow.py,sha256=_-nCrRG8Us7fm1BHwgSKJnskDmRksgJv7uD_AMzNIks,2665
151
151
  ultralytics/utils/callbacks/neptune.py,sha256=fr5vf9kXLTwcL41Ag9B_Paxf9SZsWTm4u6ninvKCQxY,3751
152
152
  ultralytics/utils/callbacks/raytune.py,sha256=ckLwRlgkmwoEieNDoL3TFCf-4by5hWNHj5AiJ5v9GGg,608
153
- ultralytics/utils/callbacks/tensorboard.py,sha256=LHdnFdmRZIoZtGNt5IaRL9pE5E1pg4jVSDjRY5HYsSg,2569
153
+ ultralytics/utils/callbacks/tensorboard.py,sha256=N3_CdINLBn44NfuN8wGbqq295_c0p737zwcet_U3ruo,2568
154
154
  ultralytics/utils/callbacks/wb.py,sha256=JCIfgvKwFRNwiqF9wi_4VinvXF4bWLxuJ12bnTD1dPU,2253
155
155
  ultralytics/yolo/__init__.py,sha256=iPyUTxLglm5hj3cN6AvcZDLESMExho7eV8jD7pMYEDE,94
156
156
  ultralytics/yolo/cfg/__init__.py,sha256=i2_j4OZ1-IaQqAWkFJgf4uDH18cMs8t-J6T-fQGnP7Q,373
@@ -158,9 +158,9 @@ ultralytics/yolo/data/__init__.py,sha256=yf8vCgHeoINeZBjKOT_SmCJozgAcoUEUHsKfVNH
158
158
  ultralytics/yolo/engine/__init__.py,sha256=TAHs06pR9q32XhqRfnS7bk_n7JCZMoJD9LlcySx-7M8,385
159
159
  ultralytics/yolo/utils/__init__.py,sha256=GK4bnt8wEbsJPJ5MTQGwR_6W4Nr8OdAaFHimCQ4YcSQ,647
160
160
  ultralytics/yolo/v8/__init__.py,sha256=cPnEgfUp79LakWJRJhwMMWSMba31TpiNXUDe2dugHCI,387
161
- ultralytics-8.0.159.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
162
- ultralytics-8.0.159.dist-info/METADATA,sha256=G6whLbD8JAGIIg81BJWBznI9ijzsO1-WoJa88aZcRiQ,28554
163
- ultralytics-8.0.159.dist-info/WHEEL,sha256=5sUXSg9e4bi7lTLOHcm6QEYwO5TIF1TNbTSVFVjcJcc,92
164
- ultralytics-8.0.159.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
165
- ultralytics-8.0.159.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
166
- ultralytics-8.0.159.dist-info/RECORD,,
161
+ ultralytics-8.0.161.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
162
+ ultralytics-8.0.161.dist-info/METADATA,sha256=tIWBzMLaFsJ4Bwkb78ZBFoIhcMICmpxn7aT3rKH41uM,28554
163
+ ultralytics-8.0.161.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
164
+ ultralytics-8.0.161.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
165
+ ultralytics-8.0.161.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
166
+ ultralytics-8.0.161.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.41.1)
2
+ Generator: bdist_wheel (0.41.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5