ultralytics 8.1.33__py3-none-any.whl → 8.1.35__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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # Ultralytics YOLO 🚀, AGPL-3.0 license
2
2
 
3
- __version__ = "8.1.33"
3
+ __version__ = "8.1.35"
4
4
 
5
5
  from ultralytics.data.explorer.explorer import Explorer
6
6
  from ultralytics.models import RTDETR, SAM, YOLO, YOLOWorld
@@ -459,7 +459,7 @@ class Exporter:
459
459
  # Generate calibration data for integer quantization
460
460
  LOGGER.info(f"{prefix} collecting INT8 calibration images from 'data={self.args.data}'")
461
461
  data = check_det_dataset(self.args.data)
462
- dataset = YOLODataset(data["val"], data=data, imgsz=self.imgsz[0], augment=False)
462
+ dataset = YOLODataset(data["val"], data=data, task=self.model.task, imgsz=self.imgsz[0], augment=False)
463
463
  n = len(dataset)
464
464
  if n < 300:
465
465
  LOGGER.warning(f"{prefix} WARNING ⚠️ >300 images recommended for INT8 calibration, found {n} images.")
@@ -385,10 +385,10 @@ class Results(SimpleClass):
385
385
  BGR=True,
386
386
  )
387
387
 
388
- def summary(self, normalize=False):
388
+ def summary(self, normalize=False, decimals=5):
389
389
  """Convert the results to a summarized format."""
390
390
  if self.probs is not None:
391
- LOGGER.warning("Warning: Classify task do not support `summary` and `tojson` yet.")
391
+ LOGGER.warning("Warning: Classify results do not support the `summary()` method yet.")
392
392
  return
393
393
 
394
394
  # Create list of detection dictionaries
@@ -396,28 +396,38 @@ class Results(SimpleClass):
396
396
  data = self.boxes.data.cpu().tolist()
397
397
  h, w = self.orig_shape if normalize else (1, 1)
398
398
  for i, row in enumerate(data): # xyxy, track_id if tracking, conf, class_id
399
- box = {"x1": row[0] / w, "y1": row[1] / h, "x2": row[2] / w, "y2": row[3] / h}
400
- conf = row[-2]
399
+ box = {
400
+ "x1": round(row[0] / w, decimals),
401
+ "y1": round(row[1] / h, decimals),
402
+ "x2": round(row[2] / w, decimals),
403
+ "y2": round(row[3] / h, decimals),
404
+ }
405
+ conf = round(row[-2], decimals)
401
406
  class_id = int(row[-1])
402
- name = self.names[class_id]
403
- result = {"name": name, "class": class_id, "confidence": conf, "box": box}
407
+ result = {"name": self.names[class_id], "class": class_id, "confidence": conf, "box": box}
404
408
  if self.boxes.is_track:
405
409
  result["track_id"] = int(row[-3]) # track ID
406
410
  if self.masks:
407
- x, y = self.masks.xy[i][:, 0], self.masks.xy[i][:, 1] # numpy array
408
- result["segments"] = {"x": (x / w).tolist(), "y": (y / h).tolist()}
411
+ result["segments"] = {
412
+ "x": (self.masks.xy[i][:, 0] / w).round(decimals).tolist(),
413
+ "y": (self.masks.xy[i][:, 1] / h).round(decimals).tolist(),
414
+ }
409
415
  if self.keypoints is not None:
410
416
  x, y, visible = self.keypoints[i].data[0].cpu().unbind(dim=1) # torch Tensor
411
- result["keypoints"] = {"x": (x / w).tolist(), "y": (y / h).tolist(), "visible": visible.tolist()}
417
+ result["keypoints"] = {
418
+ "x": (x / w).numpy().round(decimals).tolist(), # decimals named argument required
419
+ "y": (y / h).numpy().round(decimals).tolist(),
420
+ "visible": visible.numpy().round(decimals).tolist(),
421
+ }
412
422
  results.append(result)
413
423
 
414
424
  return results
415
425
 
416
- def tojson(self, normalize=False):
426
+ def tojson(self, normalize=False, decimals=5):
417
427
  """Convert the results to JSON format."""
418
428
  import json
419
429
 
420
- return json.dumps(self.summary(normalize=normalize), indent=2)
430
+ return json.dumps(self.summary(normalize=normalize, decimals=decimals), indent=2)
421
431
 
422
432
 
423
433
  class Boxes(BaseTensor):
@@ -171,10 +171,9 @@ class SPPF(nn.Module):
171
171
 
172
172
  def forward(self, x):
173
173
  """Forward pass through Ghost Convolution block."""
174
- x = self.cv1(x)
175
- y1 = self.m(x)
176
- y2 = self.m(y1)
177
- return self.cv2(torch.cat((x, y1, y2, self.m(y2)), 1))
174
+ y = [self.cv1(x)]
175
+ y.extend(self.m(y[-1]) for _ in range(3))
176
+ return self.cv2(torch.cat(y, 1))
178
177
 
179
178
 
180
179
  class C1(nn.Module):
@@ -555,40 +554,27 @@ class BNContrastiveHead(nn.Module):
555
554
  return x * self.logit_scale.exp() + self.bias
556
555
 
557
556
 
558
- class RepBottleneck(nn.Module):
557
+ class RepBottleneck(Bottleneck):
559
558
  """Rep bottleneck."""
560
559
 
561
560
  def __init__(self, c1, c2, shortcut=True, g=1, k=(3, 3), e=0.5):
562
561
  """Initializes a RepBottleneck module with customizable in/out channels, shortcut option, groups and expansion
563
562
  ratio.
564
563
  """
565
- super().__init__()
564
+ super().__init__(c1, c2, shortcut, g, k, e)
566
565
  c_ = int(c2 * e) # hidden channels
567
566
  self.cv1 = RepConv(c1, c_, k[0], 1)
568
- self.cv2 = Conv(c_, c2, k[1], 1, g=g)
569
- self.add = shortcut and c1 == c2
570
-
571
- def forward(self, x):
572
- """Forward pass through RepBottleneck layer."""
573
- return x + self.cv2(self.cv1(x)) if self.add else self.cv2(self.cv1(x))
574
567
 
575
568
 
576
- class RepCSP(nn.Module):
569
+ class RepCSP(C3):
577
570
  """Rep CSP Bottleneck with 3 convolutions."""
578
571
 
579
572
  def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):
580
573
  """Initializes RepCSP layer with given channels, repetitions, shortcut, groups and expansion ratio."""
581
- super().__init__()
574
+ super().__init__(c1, c2, n, shortcut, g, e)
582
575
  c_ = int(c2 * e) # hidden channels
583
- self.cv1 = Conv(c1, c_, 1, 1)
584
- self.cv2 = Conv(c1, c_, 1, 1)
585
- self.cv3 = Conv(2 * c_, c2, 1) # optional act=FReLU(c2)
586
576
  self.m = nn.Sequential(*(RepBottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)))
587
577
 
588
- def forward(self, x):
589
- """Forward pass through RepCSP layer."""
590
- return self.cv3(torch.cat((self.m(self.cv1(x)), self.cv2(x)), 1))
591
-
592
578
 
593
579
  class RepNCSPELAN4(nn.Module):
594
580
  """CSP-ELAN."""
@@ -80,14 +80,6 @@ class AIGym:
80
80
  self.keypoints = results[0].keypoints.data
81
81
  self.annotator = Annotator(im0, line_width=2)
82
82
 
83
- num_keypoints = len(results[0])
84
-
85
- # Resize self.angle, self.count, and self.stage if the number of keypoints has changed
86
- if len(self.angle) != num_keypoints:
87
- self.angle = [0] * num_keypoints
88
- self.count = [0] * num_keypoints
89
- self.stage = ["-" for _ in range(num_keypoints)]
90
-
91
83
  for ind, k in enumerate(reversed(self.keypoints)):
92
84
  if self.pose_type in ["pushup", "pullup"]:
93
85
  self.angle[ind] = self.annotator.estimate_pose_angle(
@@ -171,7 +171,7 @@ class ObjectCounter:
171
171
  # Extract tracks
172
172
  for box, track_id, cls in zip(boxes, track_ids, clss):
173
173
  # Draw bounding box
174
- self.annotator.box_label(box, label=f"{track_id}:{self.names[cls]}", color=colors(int(cls), True))
174
+ self.annotator.box_label(box, label=f"{track_id}:{self.names[cls]}", color=colors(int(track_id), True))
175
175
 
176
176
  # Draw Tracks
177
177
  track_line = self.track_history[track_id]
@@ -142,6 +142,8 @@ def check_imgsz(imgsz, stride=32, min_dim=1, max_dim=2, floor=0):
142
142
  imgsz = [imgsz]
143
143
  elif isinstance(imgsz, (list, tuple)):
144
144
  imgsz = list(imgsz)
145
+ elif isinstance(imgsz, str): # i.e. '640' or '[640,640]'
146
+ imgsz = [int(imgsz)] if imgsz.isnumeric() else eval(imgsz)
145
147
  else:
146
148
  raise TypeError(
147
149
  f"'imgsz={imgsz}' is of invalid type {type(imgsz).__name__}. "
@@ -167,7 +167,7 @@ def kpt_iou(kpt1, kpt2, area, sigma, eps=1e-7):
167
167
  d = (kpt1[:, None, :, 0] - kpt2[..., 0]).pow(2) + (kpt1[:, None, :, 1] - kpt2[..., 1]).pow(2) # (N, M, 17)
168
168
  sigma = torch.tensor(sigma, device=kpt1.device, dtype=kpt1.dtype) # (17, )
169
169
  kpt_mask = kpt1[..., 2] != 0 # (N, 17)
170
- e = d / (2 * sigma).pow(2) / (area[:, None, None] + eps) / 2 # from cocoeval
170
+ e = d / ((2 * sigma).pow(2) * (area[:, None, None] + eps) * 2) # from cocoeval
171
171
  # e = d / ((area[None, :, None] + eps) * sigma) ** 2 / 2 # from formula
172
172
  return ((-e).exp() * kpt_mask[:, None]).sum(-1) / (kpt_mask.sum(-1)[:, None] + eps)
173
173
 
@@ -402,7 +402,7 @@ class ConfusionMatrix:
402
402
 
403
403
  fig, ax = plt.subplots(1, 1, figsize=(12, 9), tight_layout=True)
404
404
  nc, nn = self.nc, len(names) # number of classes, names
405
- sn.set(font_scale=1.0 if nc < 50 else 0.8) # for label size
405
+ sn.set_theme(font_scale=1.0 if nc < 50 else 0.8) # for label size
406
406
  labels = (0 < nn < 99) and (nn == nc) # apply names to ticklabels
407
407
  ticklabels = (list(names) + ["background"]) if labels else "auto"
408
408
  with warnings.catch_warnings():
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ultralytics
3
- Version: 8.1.33
3
+ Version: 8.1.35
4
4
  Summary: Ultralytics YOLOv8 for SOTA object detection, multi-object tracking, instance segmentation, pose estimation and image classification.
5
5
  Author: Glenn Jocher, Ayush Chaurasia, Jing Qiu
6
6
  Maintainer: Glenn Jocher, Ayush Chaurasia, Jing Qiu
@@ -1,4 +1,4 @@
1
- ultralytics/__init__.py,sha256=nSJaKs51Mt6vlyRUP0OTpfUYjkjmRpOu1eukiArzyqo,625
1
+ ultralytics/__init__.py,sha256=-tV3T5buzggdIE9J0ptwDT85T4ju4s8OZPWMs622CdY,625
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=4DFeQcRmsOUUJtP49MezHhWKlE52mUSHI7bKFglOq4k,21273
@@ -75,10 +75,10 @@ ultralytics/data/explorer/utils.py,sha256=a6ugY8rKpFM8dIRcUwRyjRkRJ-zXEwe-NiJr6C
75
75
  ultralytics/data/explorer/gui/__init__.py,sha256=mHtJuK4hwF8cuV-VHDc7tp6u6D1gHz2Z7JI8grmQDTs,42
76
76
  ultralytics/data/explorer/gui/dash.py,sha256=a2s8oJKI8kqnWEcIyqCCzvIyvM_uZmfMaxrOdwmiq7k,10044
77
77
  ultralytics/engine/__init__.py,sha256=mHtJuK4hwF8cuV-VHDc7tp6u6D1gHz2Z7JI8grmQDTs,42
78
- ultralytics/engine/exporter.py,sha256=pwTQCo88Sd41NqYKx5Jp15fSqhFgaY3Z5gfLm8uzLR0,53882
78
+ ultralytics/engine/exporter.py,sha256=l7CJdjLDPbAhAXPO7VLHQ9J0DZDxB1b-EYF_wfsbPXo,53904
79
79
  ultralytics/engine/model.py,sha256=uemH3-CTwKTMbbiJnIqtReCNy-5TEK9VD737v3VIqxg,39435
80
80
  ultralytics/engine/predictor.py,sha256=wQRKdWGDTP5A6CS0gTC6U3RPDMhP3QkEzWSPm6eqCkU,17022
81
- ultralytics/engine/results.py,sha256=njylLUuhZQE0ry9IPH0uN8zXV_q89ZfRqghNEF5PQw0,30246
81
+ ultralytics/engine/results.py,sha256=D4wZ9OsmBrEQWCkfOeUn_oagXLqu3SxRZYlpYkDDLH8,30667
82
82
  ultralytics/engine/trainer.py,sha256=C04cEN9v-kvR2dIIjgAN8dBAx8XSTChlQkDxAxfwTlU,34527
83
83
  ultralytics/engine/tuner.py,sha256=zttHrQkvXuUVTB7jmM4Z85GgIsQ2hjpW9YrMccrQ4wo,11829
84
84
  ultralytics/engine/validator.py,sha256=rcmJSGrsAfj-ryQktv6-fe0hAT7Z8CLNhUUUf0VsPYI,14645
@@ -142,16 +142,16 @@ ultralytics/nn/__init__.py,sha256=4BPLHY89xEM_al5uK0aOmFgiML6CMGEZbezxOvTjOEs,58
142
142
  ultralytics/nn/autobackend.py,sha256=Z9sDchChAqJ-sSQlUNwoGHTFxFRay1-i76MNUz0qZU8,28678
143
143
  ultralytics/nn/tasks.py,sha256=k6cl1H1hWtQXLxO_s5D6fa_DYyFzIekAMigh3lD36_A,42894
144
144
  ultralytics/nn/modules/__init__.py,sha256=Ga3MDpwX6DeI7VSH8joti5uleP4mgkQGolbe8RLZ2T8,2326
145
- ultralytics/nn/modules/block.py,sha256=n0ilrK3Vjdoc9-OwvY_Bp8Hw5N2BMHwgt-jfH4CzxFQ,25589
145
+ ultralytics/nn/modules/block.py,sha256=KTv0HG4mTqnwVxfnu4aKBcGpS5c_gLP-wlz3iAIfIrk,25075
146
146
  ultralytics/nn/modules/conv.py,sha256=ndUYNL2f9DK41y1vVbtEusMByXy-LMMsBKlcWjRQ9Z8,12722
147
147
  ultralytics/nn/modules/head.py,sha256=LonV2b7TrLx-zKhHQ2fCpKg7BfC-tUBtPlS5NNcfT_w,21728
148
148
  ultralytics/nn/modules/transformer.py,sha256=AxD9uURpCl-EqvXe3DiG6JW-pBzB16G-AahLdZ7yayo,17909
149
149
  ultralytics/nn/modules/utils.py,sha256=779QnnKp9v8jv251ESduTXJ0ol8HkIOLbGQWwEGQjhU,3196
150
150
  ultralytics/solutions/__init__.py,sha256=mHtJuK4hwF8cuV-VHDc7tp6u6D1gHz2Z7JI8grmQDTs,42
151
- ultralytics/solutions/ai_gym.py,sha256=AZruOCqBEuAZLG1Mg-OelbD_HgJIAmBkPGwHKs-DqwE,6029
151
+ ultralytics/solutions/ai_gym.py,sha256=LqOg7XKxuDlBAXFhSLQAIVTMxsQxoj7BumiHeVrjLMc,5696
152
152
  ultralytics/solutions/distance_calculation.py,sha256=N1QB5uDG_6sp8jD5uSwp_NTPmyP4UCqJm9G2lNrgpr8,6334
153
153
  ultralytics/solutions/heatmap.py,sha256=nOoAcXkJd1bhw8SNbqVTweVwIKrgdrZeUhMrvkNPhes,10928
154
- ultralytics/solutions/object_counter.py,sha256=yJzdLarrdnTMSJdpBf8mCVOJUvN-C_zzvkgTH23Fi3o,11262
154
+ ultralytics/solutions/object_counter.py,sha256=GGerPvjZ3Bzd53rUTWKwZ-GB8UX9DlW_Rki1PMUwVEc,11267
155
155
  ultralytics/solutions/speed_estimation.py,sha256=lvaU-F8f3V4KFVKFaNS7isIdYtMSFjh_zF9gl0Mals8,6714
156
156
  ultralytics/trackers/__init__.py,sha256=j72IgH2dZHQArMPK4YwcV5ieIw94fYvlGdQjB9cOQKw,227
157
157
  ultralytics/trackers/basetrack.py,sha256=-vBDD-Q9lsxfTMK2w9kuqWGrYbRMmaBCCEbGGyR53gE,3675
@@ -165,14 +165,14 @@ ultralytics/trackers/utils/matching.py,sha256=c_pthBfu9sWeMVYe-dSecdWcQxUey-mQT2
165
165
  ultralytics/utils/__init__.py,sha256=SN7wyoJP8zaDzqUoDIHTyV3tqprIgCTfT738kge0EPI,37500
166
166
  ultralytics/utils/autobatch.py,sha256=ygZ3f2ByIkcujB89ENcTnGWWnAQw5Pbg6nBuShg-5t4,3863
167
167
  ultralytics/utils/benchmarks.py,sha256=cj_sztcI-hzfvRX8vzfXo4wmQe2CuQUcDHBO9THBbco,18285
168
- ultralytics/utils/checks.py,sha256=ENayYz6TIb7Uuf6fLYoPuZC5ITLcbCabbpwpLBoT89c,27811
168
+ ultralytics/utils/checks.py,sha256=nzWNEfNci6rKC9x9ZYXRPJtK2vvvI7YKKZHROMUSsb0,27940
169
169
  ultralytics/utils/dist.py,sha256=3HeNbY2gp7vYhcvVhsrvTrQXpQmgT8tpmnzApf3eQRA,2267
170
170
  ultralytics/utils/downloads.py,sha256=IVuwBodagj7GOGnzy868TBq4TC8O2d9TlV94_Uzi_KA,21496
171
171
  ultralytics/utils/errors.py,sha256=GqP_Jgj_n0paxn8OMhn3DTCgoNkB2WjUcUaqs-M6SQk,816
172
172
  ultralytics/utils/files.py,sha256=TVfY0Wi5IsUc4YdsDzC0dAg-jAP5exYvwqB3VmXhDLY,6761
173
173
  ultralytics/utils/instance.py,sha256=fPClvPPtTk8VeXWiRv90DrFk1j1lTUKdYJtpZKUDDtA,15575
174
174
  ultralytics/utils/loss.py,sha256=po6fmQzz1JxfGpte6hHkwOC7ECynsceqtgbUWLXVfxw,32700
175
- ultralytics/utils/metrics.py,sha256=_9ZxwK0H6pm_LsZXyC3tY1Dm_57YGDdP3sKSMZStqU0,53465
175
+ ultralytics/utils/metrics.py,sha256=eb_3cTHyTk65nJRIb30Mr-9Q1RZ2OdKDusFPpPr4sHM,53473
176
176
  ultralytics/utils/ops.py,sha256=GFe_tx8MVKT56xelbAuQjiJ28ohpzARpD6BzGyJ1yMk,33264
177
177
  ultralytics/utils/patches.py,sha256=SgMqeMsq2K6JoBJP1NplXMl9C6rK0JeJUChjBrJOneo,2750
178
178
  ultralytics/utils/plotting.py,sha256=YVJvEDozm1vm_Yf39jLPQ24Qst_f_lzEm-NeDjMElfQ,44705
@@ -191,9 +191,9 @@ ultralytics/utils/callbacks/neptune.py,sha256=5Z3ua5YBTUS56FH8VQKQG1aaIo9fH8GEyz
191
191
  ultralytics/utils/callbacks/raytune.py,sha256=6OgGNuC35F29lw8Dl_d0lue4-iBR6dqrBVQnIRQDx4E,632
192
192
  ultralytics/utils/callbacks/tensorboard.py,sha256=hRmWjbqdA4RNaLuSZznuDcpOBW-_-_Ga0u-B8UU-7ZI,4134
193
193
  ultralytics/utils/callbacks/wb.py,sha256=4QI81nHdzgwhXHlmTiRxLqunvkKakLXYUhHTUY1ZeHA,6635
194
- ultralytics-8.1.33.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
195
- ultralytics-8.1.33.dist-info/METADATA,sha256=dmv1kbJLjGfIZXm0bAPxZVYRC0NZa9KZhO0Pn2HK9Zc,40330
196
- ultralytics-8.1.33.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
197
- ultralytics-8.1.33.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
198
- ultralytics-8.1.33.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
199
- ultralytics-8.1.33.dist-info/RECORD,,
194
+ ultralytics-8.1.35.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
195
+ ultralytics-8.1.35.dist-info/METADATA,sha256=mmB9YldpAODA-Z-djJN22odastPBfiRw-d-GNuYQ2oU,40330
196
+ ultralytics-8.1.35.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
197
+ ultralytics-8.1.35.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
198
+ ultralytics-8.1.35.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
199
+ ultralytics-8.1.35.dist-info/RECORD,,