ultralytics 8.3.74__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.74"
3
+ __version__ = "8.3.76"
4
4
 
5
5
  import os
6
6
 
ultralytics/data/utils.py CHANGED
@@ -714,8 +714,8 @@ def save_dataset_cache_file(prefix, path, x, version):
714
714
  if is_dir_writeable(path.parent):
715
715
  if path.exists():
716
716
  path.unlink() # remove *.cache file if exists
717
- np.save(str(path), x) # save cache for next time
718
- path.with_suffix(".cache.npy").rename(path) # remove .npy suffix
717
+ with open(str(path), "wb") as file: # context manager here fixes windows async np.save bug
718
+ np.save(file, x)
719
719
  LOGGER.info(f"{prefix}New cache created: {path}")
720
720
  else:
721
721
  LOGGER.warning(f"{prefix}WARNING ⚠️ Cache directory {path.parent} is not writeable, cache not saved.")
@@ -288,8 +288,10 @@ class Exporter:
288
288
  self.args.nms = False
289
289
  self.args.conf = self.args.conf or 0.25 # set conf default value for nms export
290
290
  if edgetpu:
291
- if not LINUX:
292
- raise SystemError("Edge TPU export only supported on Linux. See https://coral.ai/docs/edgetpu/compiler")
291
+ if ARM64 and not LINUX:
292
+ raise SystemError(
293
+ "Edge TPU export only supported on non-aarch64 Linux. See https://coral.ai/docs/edgetpu/compiler"
294
+ )
293
295
  elif self.args.batch != 1: # see github.com/ultralytics/ultralytics/pull/13420
294
296
  LOGGER.warning("WARNING ⚠️ Edge TPU export requires batch size 1, setting batch=1.")
295
297
  self.args.batch = 1
@@ -307,6 +309,9 @@ class Exporter:
307
309
  "WARNING ⚠️ INT8 export requires a missing 'data' arg for calibration. "
308
310
  f"Using default 'data={self.args.data}'."
309
311
  )
312
+ if tfjs:
313
+ if ARM64 and LINUX:
314
+ raise SystemError("TensorFlow.js export not supported on ARM64 Linux")
310
315
 
311
316
  # Input
312
317
  im = torch.zeros(self.args.batch, 3, *self.imgsz).to(self.device)
@@ -986,6 +991,7 @@ class Exporter:
986
991
  "tflite_support<=0.4.3" if IS_JETSON else "tflite_support", # fix ImportError 'GLIBCXX_3.4.29'
987
992
  "flatbuffers>=23.5.26,<100", # update old 'flatbuffers' included inside tensorflow package
988
993
  "onnxruntime-gpu" if cuda else "onnxruntime",
994
+ "protobuf>=5", # tflite_support pins <=4 but >=5 works
989
995
  ),
990
996
  cmds="--extra-index-url https://pypi.ngc.nvidia.com", # onnx_graphsurgeon only on NVIDIA
991
997
  )
@@ -1127,9 +1133,6 @@ class Exporter:
1127
1133
  def export_tfjs(self, prefix=colorstr("TensorFlow.js:")):
1128
1134
  """YOLO TensorFlow.js export."""
1129
1135
  check_requirements("tensorflowjs")
1130
- if ARM64:
1131
- # Fix error: `np.object` was a deprecated alias for the builtin `object` when exporting to TF.js on ARM64
1132
- check_requirements("numpy==1.23.5")
1133
1136
  import tensorflow as tf
1134
1137
  import tensorflowjs as tfjs # noqa
1135
1138
 
@@ -1557,20 +1560,20 @@ class NMSModel(torch.nn.Module):
1557
1560
 
1558
1561
  preds = self.model(x)
1559
1562
  pred = preds[0] if isinstance(preds, tuple) else preds
1563
+ kwargs = dict(device=pred.device, dtype=pred.dtype)
1564
+ bs = pred.shape[0]
1560
1565
  pred = pred.transpose(-1, -2) # shape(1,84,6300) to shape(1,6300,84)
1561
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))
1562
1570
  boxes, scores, extras = pred.split([4, len(self.model.names), extra_shape], dim=2)
1563
1571
  scores, classes = scores.max(dim=-1)
1564
1572
  self.args.max_det = min(pred.shape[1], self.args.max_det) # in case num_anchors < max_det
1565
1573
  # (N, max_det, 4 coords + 1 class score + 1 class label + extra_shape).
1566
- out = torch.zeros(
1567
- boxes.shape[0],
1568
- self.args.max_det,
1569
- boxes.shape[-1] + 2 + extra_shape,
1570
- device=boxes.device,
1571
- dtype=boxes.dtype,
1572
- )
1573
- 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]
1574
1577
  mask = score > self.args.conf
1575
1578
  if self.is_tf:
1576
1579
  # TFLite GatherND error if mask is empty
@@ -1590,7 +1593,7 @@ class NMSModel(torch.nn.Module):
1590
1593
  if self.args.format == "tflite": # TFLite is already normalized
1591
1594
  nmsbox *= multiplier
1592
1595
  else:
1593
- 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()
1594
1597
  if not self.args.agnostic_nms: # class-specific NMS
1595
1598
  end = 2 if self.obb else 4
1596
1599
  # fully explicit expansion otherwise reshape error
@@ -1621,4 +1624,4 @@ class NMSModel(torch.nn.Module):
1621
1624
  # Zero-pad to max_det size to avoid reshape error
1622
1625
  pad = (0, 0, 0, self.args.max_det - dets.shape[0])
1623
1626
  out[i] = torch.nn.functional.pad(dets, pad)
1624
- 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)
@@ -1,5 +1,7 @@
1
1
  # Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
2
2
 
3
+ from types import SimpleNamespace
4
+
3
5
  from ultralytics.utils import LOGGER, RANK, SETTINGS, TESTS_RUNNING, ops
4
6
  from ultralytics.utils.metrics import ClassifyMetrics, DetMetrics, OBBMetrics, PoseMetrics, SegmentMetrics
5
7
 
@@ -29,9 +31,19 @@ except (ImportError, AssertionError):
29
31
  comet_ml = None
30
32
 
31
33
 
32
- def _get_comet_mode():
34
+ def _get_comet_mode() -> str:
33
35
  """Returns the mode of comet set in the environment variables, defaults to 'online' if not set."""
34
- return os.getenv("COMET_MODE", "online")
36
+ comet_mode = os.getenv("COMET_MODE")
37
+ if comet_mode is not None:
38
+ LOGGER.warning(
39
+ "WARNING ⚠️ The COMET_MODE environment variable is deprecated. "
40
+ "Please use COMET_START_ONLINE to set the Comet experiment mode. "
41
+ "To start an offline Comet experiment, use 'export COMET_START_ONLINE=0'. "
42
+ "If COMET_START_ONLINE is not set or is set to '1', an online Comet experiment will be created."
43
+ )
44
+ return comet_mode
45
+
46
+ return "online"
35
47
 
36
48
 
37
49
  def _get_comet_model_name():
@@ -65,22 +77,24 @@ def _should_log_image_predictions():
65
77
  return os.getenv("COMET_EVAL_LOG_IMAGE_PREDICTIONS", "true").lower() == "true"
66
78
 
67
79
 
68
- def _get_experiment_type(mode, project_name):
69
- """Return an experiment based on mode and project name."""
70
- if mode == "offline":
71
- return comet_ml.OfflineExperiment(project_name=project_name)
72
-
73
- return comet_ml.Experiment(project_name=project_name)
74
-
80
+ def _resume_or_create_experiment(args: SimpleNamespace) -> None:
81
+ """
82
+ Resumes CometML experiment or creates a new experiment based on args.
75
83
 
76
- def _create_experiment(args):
77
- """Ensures that the experiment object is only created in a single process during distributed training."""
84
+ Ensures that the experiment object is only created in a single process during distributed training.
85
+ """
78
86
  if RANK not in {-1, 0}:
79
87
  return
80
- try:
88
+
89
+ # Set environment variable (if not set by the user) to configure the Comet experiment's online mode under the hood.
90
+ # IF COMET_START_ONLINE is set by the user it will override COMET_MODE value.
91
+ if os.getenv("COMET_START_ONLINE") is None:
81
92
  comet_mode = _get_comet_mode()
93
+ os.environ["COMET_START_ONLINE"] = "1" if comet_mode != "offline" else "0"
94
+
95
+ try:
82
96
  _project_name = os.getenv("COMET_PROJECT_NAME", args.project)
83
- experiment = _get_experiment_type(comet_mode, _project_name)
97
+ experiment = comet_ml.start(project_name=_project_name)
84
98
  experiment.log_parameters(vars(args))
85
99
  experiment.log_others(
86
100
  {
@@ -313,15 +327,12 @@ def _log_model(experiment, trainer):
313
327
 
314
328
  def on_pretrain_routine_start(trainer):
315
329
  """Creates or resumes a CometML experiment at the start of a YOLO pre-training routine."""
316
- experiment = comet_ml.get_global_experiment()
317
- is_alive = getattr(experiment, "alive", False)
318
- if not experiment or not is_alive:
319
- _create_experiment(trainer.args)
330
+ _resume_or_create_experiment(trainer.args)
320
331
 
321
332
 
322
333
  def on_train_epoch_end(trainer):
323
334
  """Log metrics and save batch images at the end of training epochs."""
324
- experiment = comet_ml.get_global_experiment()
335
+ experiment = comet_ml.get_running_experiment()
325
336
  if not experiment:
326
337
  return
327
338
 
@@ -334,7 +345,7 @@ def on_train_epoch_end(trainer):
334
345
 
335
346
  def on_fit_epoch_end(trainer):
336
347
  """Logs model assets at the end of each epoch."""
337
- experiment = comet_ml.get_global_experiment()
348
+ experiment = comet_ml.get_running_experiment()
338
349
  if not experiment:
339
350
  return
340
351
 
@@ -362,7 +373,7 @@ def on_fit_epoch_end(trainer):
362
373
 
363
374
  def on_train_end(trainer):
364
375
  """Perform operations at the end of training."""
365
- experiment = comet_ml.get_global_experiment()
376
+ experiment = comet_ml.get_running_experiment()
366
377
  if not experiment:
367
378
  return
368
379
 
@@ -440,7 +440,7 @@ class ConfusionMatrix:
440
440
 
441
441
  def print(self):
442
442
  """Print the confusion matrix to the console."""
443
- for i in range(self.nc + 1):
443
+ for i in range(self.matrix.shape[0]):
444
444
  LOGGER.info(" ".join(map(str, self.matrix[i])))
445
445
 
446
446
 
ultralytics/utils/ops.py CHANGED
@@ -59,7 +59,7 @@ class Profile(contextlib.ContextDecorator):
59
59
  """Get current time."""
60
60
  if self.cuda:
61
61
  torch.cuda.synchronize(self.device)
62
- return time.time()
62
+ return time.perf_counter()
63
63
 
64
64
 
65
65
  def segment2box(segment, width=640, height=640):
@@ -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 ""
@@ -746,7 +753,7 @@ class EarlyStopping:
746
753
  if fitness is None: # check if fitness=None (happens when val=False)
747
754
  return False
748
755
 
749
- if fitness >= self.best_fitness: # >= 0 to allow for early zero-fitness stage of training
756
+ if fitness > self.best_fitness or self.best_fitness == 0: # allow for early zero-fitness stage of training
750
757
  self.best_epoch = epoch
751
758
  self.best_fitness = fitness
752
759
  delta = epoch - self.best_epoch # epochs without improvement
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: ultralytics
3
- Version: 8.3.74
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=Qxmv1s_8OG3hItE_vx1c3R_I-L9FUUwE5AKzDsn7d1E,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
@@ -100,13 +100,13 @@ ultralytics/data/converter.py,sha256=89E44LBCpbn5hMF03Kdts6DaTP8Oei5iCra5enFCt5I
100
100
  ultralytics/data/dataset.py,sha256=lxtH3JytNu6nsiPAIhe0uGuGGpkZ4ZRqvXM6eJw9rXU,23244
101
101
  ultralytics/data/loaders.py,sha256=JOwXbz-dxgG2bx0_cQHp-olz5FleoCX8EzrUvZ77vvg,28534
102
102
  ultralytics/data/split_dota.py,sha256=YI-i2MqdiBt06W67TJnBXQHJrqTnkJDJ3zzoL0UZVro,10733
103
- ultralytics/data/utils.py,sha256=K8xyA1xHLpaeluUbqOl5fy6AWZ6nDciCBZJofjxzOuw,33841
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=14zD5klVbAqv1jh2QPmpDcGflBUlLurRhYGM-wH9hFI,76780
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
@@ -214,18 +214,18 @@ ultralytics/utils/errors.py,sha256=sXKDEd8ws3L-yIfG_-P_h86axbm37sJNha7kFBJbQMQ,8
214
214
  ultralytics/utils/files.py,sha256=c85NRofjGPMcpkV-yUo1Cwk8ZVquBGCEKlzbSVtXkQA,8252
215
215
  ultralytics/utils/instance.py,sha256=z1oyyvz7wnCSUW_bvi0TbgAL0VxJtAWWXV9KWCoyJ_k,16887
216
216
  ultralytics/utils/loss.py,sha256=paRY8K7R4pcUGJfApVzZx-m_iFzzMbHm5GgiaixfDuU,34179
217
- ultralytics/utils/metrics.py,sha256=onGJkd4DW8DUofFFtHm9xoUCt8gcNlcCxxU-Q39IN7k,54175
218
- ultralytics/utils/ops.py,sha256=HJ33Z9U1_Fl2MJyiv1JKLb2hTmvQqbeNemqR0lbCZgQ,34576
217
+ ultralytics/utils/metrics.py,sha256=6RBMTBbTYa-5nRwTPlbPBX8w9xhpqryZ9tjXsvlRmmM,54184
218
+ ultralytics/utils/ops.py,sha256=izQr5GvgzmaD-GXaqxIjLE525JnvgLetOtuq_EOaxM8,34584
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=mhDD-usOKazv5h44ggJ3A2BX3E2ka-N8Sgo4zcsj2f0,33387
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
226
226
  ultralytics/utils/callbacks/base.py,sha256=nbeSPjPCOb0M6FsFQ5-uFxXVzUYwmFyE4wFoA66Jpug,5803
227
227
  ultralytics/utils/callbacks/clearml.py,sha256=JH70T1OLPd9GSvC6HnaKkZHTr8fyE9RRcz3ukL62QPw,5961
228
- ultralytics/utils/callbacks/comet.py,sha256=LojWjGacHNwxV7EdbHkheDkK0sFX_6AGKKQF9bEP7EU,15046
228
+ ultralytics/utils/callbacks/comet.py,sha256=RfijX3oKLdI3zXyleATLmkGfaV--3sBU-V-zyX8-TWU,15607
229
229
  ultralytics/utils/callbacks/dvc.py,sha256=4ln4wqU3ZZTK5JfvUmbKfQuIdO6QohDSnFVV4v5Pl8E,5073
230
230
  ultralytics/utils/callbacks/hub.py,sha256=bqU83kBnNZ0U9qjm0I9xvM4DWA0VMxSLxQDgjuTZbKM,3977
231
231
  ultralytics/utils/callbacks/mlflow.py,sha256=3y4xOPLZe1bES0ETWGJYywulTEUGv8I849e2TNms8yI,5420
@@ -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.74.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
237
- ultralytics-8.3.74.dist-info/METADATA,sha256=60GpYqC0yL9xkMk7UnjahV3HtaXxBPRWcJAhKkTt3GM,35158
238
- ultralytics-8.3.74.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
239
- ultralytics-8.3.74.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
240
- ultralytics-8.3.74.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
241
- ultralytics-8.3.74.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,,