ultralytics 8.3.75__py3-none-any.whl → 8.3.76__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.
ultralytics/__init__.py CHANGED
@@ -1,6 +1,6 @@
1
1
  # Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
2
2
 
3
- __version__ = "8.3.75"
3
+ __version__ = "8.3.76"
4
4
 
5
5
  import os
6
6
 
@@ -1560,20 +1560,20 @@ class NMSModel(torch.nn.Module):
1560
1560
 
1561
1561
  preds = self.model(x)
1562
1562
  pred = preds[0] if isinstance(preds, tuple) else preds
1563
+ kwargs = dict(device=pred.device, dtype=pred.dtype)
1564
+ bs = pred.shape[0]
1563
1565
  pred = pred.transpose(-1, -2) # shape(1,84,6300) to shape(1,6300,84)
1564
1566
  extra_shape = pred.shape[-1] - (4 + len(self.model.names)) # extras from Segment, OBB, Pose
1567
+ if self.args.dynamic and self.args.batch > 1: # batch size needs to always be same due to loop unroll
1568
+ pad = torch.zeros(torch.max(torch.tensor(self.args.batch - bs), torch.tensor(0)), *pred.shape[1:], **kwargs)
1569
+ pred = torch.cat((pred, pad))
1565
1570
  boxes, scores, extras = pred.split([4, len(self.model.names), extra_shape], dim=2)
1566
1571
  scores, classes = scores.max(dim=-1)
1567
1572
  self.args.max_det = min(pred.shape[1], self.args.max_det) # in case num_anchors < max_det
1568
1573
  # (N, max_det, 4 coords + 1 class score + 1 class label + extra_shape).
1569
- out = torch.zeros(
1570
- boxes.shape[0],
1571
- self.args.max_det,
1572
- boxes.shape[-1] + 2 + extra_shape,
1573
- device=boxes.device,
1574
- dtype=boxes.dtype,
1575
- )
1576
- for i, (box, cls, score, extra) in enumerate(zip(boxes, classes, scores, extras)):
1574
+ out = torch.zeros(bs, self.args.max_det, boxes.shape[-1] + 2 + extra_shape, **kwargs)
1575
+ for i in range(bs):
1576
+ box, cls, score, extra = boxes[i], classes[i], scores[i], extras[i]
1577
1577
  mask = score > self.args.conf
1578
1578
  if self.is_tf:
1579
1579
  # TFLite GatherND error if mask is empty
@@ -1593,7 +1593,7 @@ class NMSModel(torch.nn.Module):
1593
1593
  if self.args.format == "tflite": # TFLite is already normalized
1594
1594
  nmsbox *= multiplier
1595
1595
  else:
1596
- nmsbox = multiplier * nmsbox / torch.tensor(x.shape[2:], device=box.device, dtype=box.dtype).max()
1596
+ nmsbox = multiplier * nmsbox / torch.tensor(x.shape[2:], **kwargs).max()
1597
1597
  if not self.args.agnostic_nms: # class-specific NMS
1598
1598
  end = 2 if self.obb else 4
1599
1599
  # fully explicit expansion otherwise reshape error
@@ -1624,4 +1624,4 @@ class NMSModel(torch.nn.Module):
1624
1624
  # Zero-pad to max_det size to avoid reshape error
1625
1625
  pad = (0, 0, 0, self.args.max_det - dets.shape[0])
1626
1626
  out[i] = torch.nn.functional.pad(dets, pad)
1627
- return (out, preds[1]) if self.model.task == "segment" else out
1627
+ return (out[:bs], preds[1]) if self.model.task == "segment" else out[:bs]
@@ -122,6 +122,7 @@ class Model(torch.nn.Module):
122
122
  self.metrics = None # validation/training metrics
123
123
  self.session = None # HUB session
124
124
  self.task = task # task type
125
+ self.model_name = None # model name
125
126
  model = str(model).strip()
126
127
 
127
128
  # Check if Ultralytics HUB model from https://hub.ultralytics.com
@@ -1016,7 +1016,7 @@ class Boxes(BaseTensor):
1016
1016
  xyxy (torch.Tensor | numpy.ndarray): Boxes in [x1, y1, x2, y2] format.
1017
1017
  conf (torch.Tensor | numpy.ndarray): Confidence scores for each box.
1018
1018
  cls (torch.Tensor | numpy.ndarray): Class labels for each box.
1019
- id (torch.Tensor | numpy.ndarray): Tracking IDs for each box (if available).
1019
+ id (torch.Tensor | None): Tracking IDs for each box (if available).
1020
1020
  xywh (torch.Tensor | numpy.ndarray): Boxes in [x, y, width, height] format.
1021
1021
  xyxyn (torch.Tensor | numpy.ndarray): Normalized [x1, y1, x2, y2] boxes relative to orig_shape.
1022
1022
  xywhn (torch.Tensor | numpy.ndarray): Normalized [x, y, width, height] boxes relative to orig_shape.
@@ -493,7 +493,7 @@ class BaseTrainer:
493
493
  memory = 0
494
494
  else:
495
495
  memory = torch.cuda.memory_reserved()
496
- return memory / 1e9
496
+ return memory / (2**30)
497
497
 
498
498
  def _clear_memory(self):
499
499
  """Clear accelerator memory on different platforms."""
@@ -66,25 +66,23 @@ def on_predict_postprocess_end(predictor: object, persist: bool = False) -> None
66
66
  >>> predictor = YourPredictorClass()
67
67
  >>> on_predict_postprocess_end(predictor, persist=True)
68
68
  """
69
- path, im0s = predictor.batch[:2]
70
-
71
69
  is_obb = predictor.args.task == "obb"
72
70
  is_stream = predictor.dataset.mode == "stream"
73
- for i in range(len(im0s)):
71
+ for i, result in enumerate(predictor.results):
74
72
  tracker = predictor.trackers[i if is_stream else 0]
75
- vid_path = predictor.save_dir / Path(path[i]).name
73
+ vid_path = predictor.save_dir / Path(result.path).name
76
74
  if not persist and predictor.vid_path[i if is_stream else 0] != vid_path:
77
75
  tracker.reset()
78
76
  predictor.vid_path[i if is_stream else 0] = vid_path
79
77
 
80
- det = (predictor.results[i].obb if is_obb else predictor.results[i].boxes).cpu().numpy()
78
+ det = (result.obb if is_obb else result.boxes).cpu().numpy()
81
79
  if len(det) == 0:
82
80
  continue
83
- tracks = tracker.update(det, im0s[i])
81
+ tracks = tracker.update(det, result.orig_img)
84
82
  if len(tracks) == 0:
85
83
  continue
86
84
  idx = tracks[:, -1].astype(int)
87
- predictor.results[i] = predictor.results[i][idx]
85
+ predictor.results[i] = result[idx]
88
86
 
89
87
  update_args = {"obb" if is_obb else "boxes": torch.as_tensor(tracks[:, :-1])}
90
88
  predictor.results[i].update(**update_args)
@@ -302,15 +302,22 @@ def model_info(model, detailed=False, verbose=True, imgsz=640):
302
302
  return
303
303
  n_p = get_num_params(model) # number of parameters
304
304
  n_g = get_num_gradients(model) # number of gradients
305
- n_l = len(list(model.modules())) # number of layers
305
+ layers = __import__("collections").OrderedDict((n, m) for n, m in model.named_modules() if len(m._modules) == 0)
306
+ n_l = len(layers) # number of layers
306
307
  if detailed:
307
- LOGGER.info(f"{'layer':>5}{'name':>40}{'gradient':>10}{'parameters':>12}{'shape':>20}{'mu':>10}{'sigma':>10}")
308
- for i, (name, p) in enumerate(model.named_parameters()):
309
- name = name.replace("module_list.", "")
310
- LOGGER.info(
311
- f"{i:>5g}{name:>40s}{p.requires_grad!r:>10}{p.numel():>12g}{str(list(p.shape)):>20s}"
312
- f"{p.mean():>10.3g}{p.std():>10.3g}{str(p.dtype):>15s}"
313
- )
308
+ h = f"{'layer':>5}{'name':>40}{'type':>20}{'gradient':>10}{'parameters':>12}{'shape':>20}{'mu':>10}{'sigma':>10}"
309
+ LOGGER.info(h)
310
+ for i, (mn, m) in enumerate(layers.items()):
311
+ mn = mn.replace("module_list.", "")
312
+ mt = m.__class__.__name__
313
+ if len(m._parameters):
314
+ for pn, p in m.named_parameters():
315
+ LOGGER.info(
316
+ f"{i:>5g}{mn + '.' + pn:>40}{mt:>20}{p.requires_grad!r:>10}{p.numel():>12g}"
317
+ f"{str(list(p.shape)):>20}{p.mean():>10.3g}{p.std():>10.3g}{str(p.dtype).replace('torch.', ''):>15}"
318
+ )
319
+ else: # layers with no learnable params
320
+ LOGGER.info(f"{i:>5g}{mn:>40}{mt:>20}{False!r:>10}{0:>12g}{str([]):>20}{'-':>10}{'-':>10}{'-':>15}")
314
321
 
315
322
  flops = get_flops(model, imgsz) # imgsz may be int or list, i.e. imgsz=640 or imgsz=[640, 320]
316
323
  fused = " (fused)" if getattr(model, "is_fused", lambda: False)() else ""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: ultralytics
3
- Version: 8.3.75
3
+ Version: 8.3.76
4
4
  Summary: Ultralytics YOLO 🚀 for SOTA object detection, multi-object tracking, instance segmentation, pose estimation and image classification.
5
5
  Author-email: Glenn Jocher <glenn.jocher@ultralytics.com>, Jing Qiu <jing.qiu@ultralytics.com>
6
6
  Maintainer-email: Ultralytics <hello@ultralytics.com>
@@ -7,7 +7,7 @@ tests/test_exports.py,sha256=T_z_NUS9URQXv83k5XNLHTuksJ8srtzbZnWuiiQWM98,9260
7
7
  tests/test_integrations.py,sha256=p3DMnnPMKsV0Qm82JVJUIY1UZ67xRgF9E8AaL76TEHE,6154
8
8
  tests/test_python.py,sha256=tW-EFJC2rjl_DvAa8khXGWYdypseQjrLjGHhe2p9r9A,23238
9
9
  tests/test_solutions.py,sha256=aY0G3vNzXGCENG9FD76MfUp7jgzeESPsUvbvQYBUvH0,4205
10
- ultralytics/__init__.py,sha256=V35DQdcyQzSsLZd4nWJc6HD71QYZmWTkqcv_BkpwpW4,709
10
+ ultralytics/__init__.py,sha256=EJlzPDNmMx9lP1HbgFSshFYdnHAVry65hDNaGnuXWqU,709
11
11
  ultralytics/assets/bus.jpg,sha256=wCAZxJecGR63Od3ZRERe9Aja1Weayrb9Ug751DS_vGM,137419
12
12
  ultralytics/assets/zidane.jpg,sha256=Ftc4aeMmen1O0A3o6GCDO9FlfBslLpTAw0gnetx7bts,50427
13
13
  ultralytics/cfg/__init__.py,sha256=qP44HnFP4QcC5FQz29A-EGTuwdtxXAzPvw_IvCVmiqA,39771
@@ -102,11 +102,11 @@ ultralytics/data/loaders.py,sha256=JOwXbz-dxgG2bx0_cQHp-olz5FleoCX8EzrUvZ77vvg,2
102
102
  ultralytics/data/split_dota.py,sha256=YI-i2MqdiBt06W67TJnBXQHJrqTnkJDJ3zzoL0UZVro,10733
103
103
  ultralytics/data/utils.py,sha256=5YMU5396oAFPwTy2y0MCU2WipF6Rt-7xNtmHKRCA4fI,33838
104
104
  ultralytics/engine/__init__.py,sha256=lm6MckFYCPTbqIoX7w0s_daxdjNeBeKW6DXppv1-QUM,70
105
- ultralytics/engine/exporter.py,sha256=P2kMamiLXaVUCEjYzvHx4xF7WdcnjHyripCCo1poKoA,76864
106
- ultralytics/engine/model.py,sha256=8CnLnd_c8Ecey4q2JZFJBbUPOYflr5cgjJnw4sH3Vyo,53382
105
+ ultralytics/engine/exporter.py,sha256=nrO0UdRMzhb_hp-IXAstBmMHJoax-P7Fqe7a8u2954A,77113
106
+ ultralytics/engine/model.py,sha256=s8HsSBvdRgSbnKGULr7YW-ZWJKJsQpOoHd9Aih_nMt0,53427
107
107
  ultralytics/engine/predictor.py,sha256=jiYDAjupOlRUpPvw9tu7or9PjXtLm-YCRiawANtWxj0,17881
108
- ultralytics/engine/results.py,sha256=8iHooY3IpBsARBo9LsQJYUfJHlcXk7T7urB3gP6rViU,78120
109
- ultralytics/engine/trainer.py,sha256=6LTw_52KBLuaQf6rAn-VQ8702cibBkGoaom-aKMbQrw,37417
108
+ ultralytics/engine/results.py,sha256=hWlO2e58BPUJ5R4Jl4iirBPaZ8BypcNu_cNQ2NHpUqM,78111
109
+ ultralytics/engine/trainer.py,sha256=hrqaO3cgf0VPVLHKv0tHk4W3gcasgqq_KF-DkgnIjus,37421
110
110
  ultralytics/engine/tuner.py,sha256=EUlTs7KJQ2RVABm8pihr_14M_Z2kGSzJaWH-Y9TJYDw,11976
111
111
  ultralytics/engine/validator.py,sha256=r27X8HGeDEwq7V5sFjEQH_3EnP1CyG-HcOLpFABUisU,15034
112
112
  ultralytics/hub/__init__.py,sha256=1ifzSYV0PIT4ZWOm2V7HnpGyY3G3hCz0malw3AXHFlY,5660
@@ -199,7 +199,7 @@ ultralytics/trackers/__init__.py,sha256=Zlu_Ig5osn7hqch_g5Be_e4pwZUkeeTQiesJCi0p
199
199
  ultralytics/trackers/basetrack.py,sha256=h0fcxzCdZf_56H1NG_mCIATaz_cWj0e9aJKE1xgmtFQ,4451
200
200
  ultralytics/trackers/bot_sort.py,sha256=xUmlj0agS0PGjy97N3C0jLMV07yvsurE5QcnuoV_Ecw,10522
201
201
  ultralytics/trackers/byte_tracker.py,sha256=CT_Yjw2ahHoprEfNcTM0hBMoGss5qcqt6Paxk956lYU,20846
202
- ultralytics/trackers/track.py,sha256=RWG2sc2HkGaajwLMZp7A_5HusxYKNR8gky4igvZpzug,4021
202
+ ultralytics/trackers/track.py,sha256=PtGB4CTMdylvccrzho37nysMvVS8gSINGFgZY0n-AuU,3973
203
203
  ultralytics/trackers/utils/__init__.py,sha256=lm6MckFYCPTbqIoX7w0s_daxdjNeBeKW6DXppv1-QUM,70
204
204
  ultralytics/trackers/utils/gmc.py,sha256=kU54RozuGJcAVlyb5_HjXiNIUIX5VuH613AMc6Gdnwg,14597
205
205
  ultralytics/trackers/utils/kalman_filter.py,sha256=OBvemZXptgn9v1sgBLvFomCqOWwjIB3-8wBbc8nakHo,21377
@@ -219,7 +219,7 @@ ultralytics/utils/ops.py,sha256=izQr5GvgzmaD-GXaqxIjLE525JnvgLetOtuq_EOaxM8,3458
219
219
  ultralytics/utils/patches.py,sha256=ARR89dP4YKq7Dd3g2eU-ukbnc2lo3BELukL_1c_d854,3298
220
220
  ultralytics/utils/plotting.py,sha256=hKji4TyxAmCXdSL264VX6dsC2AZYiL9StShI02dcAOM,62990
221
221
  ultralytics/utils/tal.py,sha256=DO-c006HEI62pcrNRpmt4lpqJPC5yu3veRDOvUuExno,18498
222
- ultralytics/utils/torch_utils.py,sha256=AsdLP_MADVY9sq4mF3u4GMCDvx9Z32flQZKmiVy4LcA,33404
222
+ ultralytics/utils/torch_utils.py,sha256=Q7B84IsAs29pehadJJ25jQOxuCTGVMj1x8TJNYLsijs,33878
223
223
  ultralytics/utils/triton.py,sha256=2L1_rZ8xCJEjexRVj75g9YU-u4tQln_DJ5N1Yr_0bSs,4071
224
224
  ultralytics/utils/tuner.py,sha256=gySDBzTlq_klTOq6CGEyUN58HXzPCulObaMBHacXzHo,6294
225
225
  ultralytics/utils/callbacks/__init__.py,sha256=hzL63Rce6VkZhP4Lcim9LKjadixaQG86nKqPhk7IkS0,242
@@ -233,9 +233,9 @@ ultralytics/utils/callbacks/neptune.py,sha256=waZ_bRu0-qBKujTLuqonC2gx2DkgBuVnfq
233
233
  ultralytics/utils/callbacks/raytune.py,sha256=A_NVWjyPNf2m6iB-mbW7SMpyqM9QBvpbPa-MCMFMtdk,727
234
234
  ultralytics/utils/callbacks/tensorboard.py,sha256=JHOEVlNQ5dYJPd4Z-EvqbXowuK5uA0p8wPgyyaIUQs0,4194
235
235
  ultralytics/utils/callbacks/wb.py,sha256=ayhT2y62AcSOacnawshATU0rWrlSFQ77mrGgBdRl3W4,7086
236
- ultralytics-8.3.75.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
237
- ultralytics-8.3.75.dist-info/METADATA,sha256=7kTsfctoPrVnBtozBr7k4N8h1W8aFqHg-7_CmpIVo4w,35158
238
- ultralytics-8.3.75.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
239
- ultralytics-8.3.75.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
240
- ultralytics-8.3.75.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
241
- ultralytics-8.3.75.dist-info/RECORD,,
236
+ ultralytics-8.3.76.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
237
+ ultralytics-8.3.76.dist-info/METADATA,sha256=8w-KvGSLIOXISAZ524SnU3jgFOca5sxJY9NGByF7T-0,35158
238
+ ultralytics-8.3.76.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
239
+ ultralytics-8.3.76.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
240
+ ultralytics-8.3.76.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
241
+ ultralytics-8.3.76.dist-info/RECORD,,