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.
- ultralytics/__init__.py +2 -3
- ultralytics/data/dataset.py +74 -20
- ultralytics/data/utils.py +39 -5
- ultralytics/engine/trainer.py +4 -1
- ultralytics/hub/__init__.py +2 -25
- ultralytics/hub/auth.py +2 -22
- ultralytics/models/fastsam/predict.py +8 -11
- ultralytics/models/nas/predict.py +5 -5
- ultralytics/models/rtdetr/predict.py +5 -5
- ultralytics/models/sam/modules/sam.py +21 -35
- ultralytics/models/sam/predict.py +4 -4
- ultralytics/models/yolo/classify/predict.py +4 -5
- ultralytics/models/yolo/classify/train.py +1 -1
- ultralytics/models/yolo/classify/val.py +1 -1
- ultralytics/models/yolo/detect/predict.py +5 -7
- ultralytics/models/yolo/pose/predict.py +6 -11
- ultralytics/models/yolo/segment/predict.py +8 -13
- ultralytics/nn/modules/conv.py +6 -1
- ultralytics/trackers/utils/kalman_filter.py +71 -95
- ultralytics/utils/callbacks/tensorboard.py +3 -3
- ultralytics/utils/checks.py +6 -5
- ultralytics/utils/downloads.py +12 -13
- ultralytics/utils/metrics.py +0 -11
- ultralytics/utils/ops.py +84 -117
- {ultralytics-8.0.159.dist-info → ultralytics-8.0.161.dist-info}/METADATA +1 -1
- {ultralytics-8.0.159.dist-info → ultralytics-8.0.161.dist-info}/RECORD +30 -30
- {ultralytics-8.0.159.dist-info → ultralytics-8.0.161.dist-info}/WHEEL +1 -1
- {ultralytics-8.0.159.dist-info → ultralytics-8.0.161.dist-info}/LICENSE +0 -0
- {ultralytics-8.0.159.dist-info → ultralytics-8.0.161.dist-info}/entry_points.txt +0 -0
- {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
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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
|
-
|
|
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
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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
|
-
|
|
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
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
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
|
-
|
|
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
|
-
|
|
307
|
-
|
|
308
|
-
|
|
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
|
-
|
|
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
|
-
|
|
438
|
+
x (np.ndarray | torch.Tensor): The input tensor with the bounding boxes coordinates in the xyxy format
|
|
439
|
+
|
|
464
440
|
Returns:
|
|
465
|
-
|
|
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
|
-
|
|
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
|
-
|
|
497
|
-
|
|
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
|
-
|
|
531
|
-
|
|
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
|
-
|
|
537
|
+
x (np.ndarray | torch.Tensor): the input image
|
|
571
538
|
|
|
572
539
|
Returns:
|
|
573
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
604
|
-
|
|
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
|
-
|
|
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
|
-
|
|
624
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
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
|
-
|
|
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
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
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
|
-
|
|
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 (
|
|
703
|
+
Rescale segment coordinates (xy) from img1_shape to img0_shape
|
|
737
704
|
|
|
738
705
|
Args:
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
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
|
-
|
|
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
|
-
|
|
775
|
-
|
|
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
|
-
|
|
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
|
-
|
|
766
|
+
s (str): a string needing special characters replaced
|
|
800
767
|
|
|
801
768
|
Returns:
|
|
802
|
-
|
|
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.
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
58
|
-
ultralytics/hub/auth.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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
|
|
95
|
-
ultralytics/models/yolo/classify/train.py,sha256=
|
|
96
|
-
ultralytics/models/yolo/classify/val.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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
|
|
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=
|
|
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=
|
|
138
|
-
ultralytics/utils/ops.py,sha256=
|
|
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=
|
|
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.
|
|
162
|
-
ultralytics-8.0.
|
|
163
|
-
ultralytics-8.0.
|
|
164
|
-
ultralytics-8.0.
|
|
165
|
-
ultralytics-8.0.
|
|
166
|
-
ultralytics-8.0.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|