ultralytics 8.3.195__py3-none-any.whl → 8.3.196__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.
Files changed (35) hide show
  1. ultralytics/__init__.py +1 -1
  2. ultralytics/cfg/__init__.py +1 -0
  3. ultralytics/cfg/default.yaml +1 -0
  4. ultralytics/data/augment.py +1 -1
  5. ultralytics/data/build.py +5 -1
  6. ultralytics/engine/exporter.py +19 -31
  7. ultralytics/engine/predictor.py +3 -1
  8. ultralytics/engine/trainer.py +15 -4
  9. ultralytics/engine/validator.py +6 -2
  10. ultralytics/models/yolo/classify/train.py +1 -11
  11. ultralytics/models/yolo/detect/train.py +32 -6
  12. ultralytics/models/yolo/detect/val.py +6 -5
  13. ultralytics/models/yolo/obb/train.py +0 -9
  14. ultralytics/models/yolo/pose/train.py +1 -9
  15. ultralytics/models/yolo/pose/val.py +1 -1
  16. ultralytics/models/yolo/segment/train.py +1 -9
  17. ultralytics/models/yolo/segment/val.py +1 -1
  18. ultralytics/models/yolo/world/train.py +4 -4
  19. ultralytics/models/yolo/world/train_world.py +2 -2
  20. ultralytics/models/yolo/yoloe/train.py +3 -12
  21. ultralytics/models/yolo/yoloe/val.py +0 -7
  22. ultralytics/nn/modules/head.py +2 -1
  23. ultralytics/nn/tasks.py +4 -2
  24. ultralytics/utils/__init__.py +30 -19
  25. ultralytics/utils/callbacks/tensorboard.py +2 -2
  26. ultralytics/utils/checks.py +2 -0
  27. ultralytics/utils/loss.py +14 -8
  28. ultralytics/utils/plotting.py +1 -0
  29. ultralytics/utils/torch_utils.py +111 -9
  30. {ultralytics-8.3.195.dist-info → ultralytics-8.3.196.dist-info}/METADATA +1 -1
  31. {ultralytics-8.3.195.dist-info → ultralytics-8.3.196.dist-info}/RECORD +35 -35
  32. {ultralytics-8.3.195.dist-info → ultralytics-8.3.196.dist-info}/WHEEL +0 -0
  33. {ultralytics-8.3.195.dist-info → ultralytics-8.3.196.dist-info}/entry_points.txt +0 -0
  34. {ultralytics-8.3.195.dist-info → ultralytics-8.3.196.dist-info}/licenses/LICENSE +0 -0
  35. {ultralytics-8.3.195.dist-info → ultralytics-8.3.196.dist-info}/top_level.txt +0 -0
@@ -98,13 +98,6 @@ class YOLOEDetectValidator(DetectionValidator):
98
98
  visual_pe[cls_visual_num == 0] = 0
99
99
  return visual_pe.unsqueeze(0)
100
100
 
101
- def preprocess(self, batch: dict[str, Any]) -> dict[str, Any]:
102
- """Preprocess batch data, ensuring visuals are on the same device as images."""
103
- batch = super().preprocess(batch)
104
- if "visuals" in batch:
105
- batch["visuals"] = batch["visuals"].to(batch["img"].device, non_blocking=True)
106
- return batch
107
-
108
101
  def get_vpe_dataloader(self, data: dict[str, Any]) -> torch.utils.data.DataLoader:
109
102
  """
110
103
  Create a dataloader for LVIS training visual prompt samples.
@@ -13,7 +13,7 @@ from torch.nn.init import constant_, xavier_uniform_
13
13
 
14
14
  from ultralytics.utils import NOT_MACOS14
15
15
  from ultralytics.utils.tal import TORCH_1_10, dist2bbox, dist2rbox, make_anchors
16
- from ultralytics.utils.torch_utils import fuse_conv_and_bn, smart_inference_mode
16
+ from ultralytics.utils.torch_utils import disable_dynamo, fuse_conv_and_bn, smart_inference_mode
17
17
 
18
18
  from .block import DFL, SAVPE, BNContrastiveHead, ContrastiveHead, Proto, Residual, SwiGLUFFN
19
19
  from .conv import Conv, DWConv
@@ -149,6 +149,7 @@ class Detect(nn.Module):
149
149
  y = self.postprocess(y.permute(0, 2, 1), self.max_det, self.nc)
150
150
  return y if self.export else (y, {"one2many": x, "one2one": one2one})
151
151
 
152
+ @disable_dynamo
152
153
  def _inference(self, x: list[torch.Tensor]) -> torch.Tensor:
153
154
  """
154
155
  Decode predicted bounding boxes and class probabilities based on multiple-level feature maps.
ultralytics/nn/tasks.py CHANGED
@@ -334,7 +334,8 @@ class BaseModel(torch.nn.Module):
334
334
  if getattr(self, "criterion", None) is None:
335
335
  self.criterion = self.init_criterion()
336
336
 
337
- preds = self.forward(batch["img"]) if preds is None else preds
337
+ if preds is None:
338
+ preds = self.forward(batch["img"])
338
339
  return self.criterion(preds, batch)
339
340
 
340
341
  def init_criterion(self):
@@ -775,7 +776,8 @@ class RTDETRDetectionModel(DetectionModel):
775
776
  "gt_groups": gt_groups,
776
777
  }
777
778
 
778
- preds = self.predict(img, batch=targets) if preds is None else preds
779
+ if preds is None:
780
+ preds = self.predict(img, batch=targets)
779
781
  dec_bboxes, dec_scores, enc_bboxes, enc_scores, dn_meta = preds if self.training else preds[1]
780
782
  if dn_meta is None:
781
783
  dn_bboxes, dn_scores = None, None
@@ -857,7 +857,7 @@ def get_ubuntu_version():
857
857
 
858
858
  def get_user_config_dir(sub_dir="Ultralytics"):
859
859
  """
860
- Return the appropriate config directory based on the environment operating system.
860
+ Return a writable config dir, preferring YOLO_CONFIG_DIR and being OS-aware.
861
861
 
862
862
  Args:
863
863
  sub_dir (str): The name of the subdirectory to create.
@@ -865,27 +865,38 @@ def get_user_config_dir(sub_dir="Ultralytics"):
865
865
  Returns:
866
866
  (Path): The path to the user config directory.
867
867
  """
868
- if WINDOWS:
869
- path = Path.home() / "AppData" / "Roaming" / sub_dir
870
- elif MACOS: # macOS
871
- path = Path.home() / "Library" / "Application Support" / sub_dir
868
+ if env_dir := os.getenv("YOLO_CONFIG_DIR"):
869
+ p = Path(env_dir).expanduser() / sub_dir
872
870
  elif LINUX:
873
- path = Path.home() / ".config" / sub_dir
871
+ p = Path(os.getenv("XDG_CONFIG_HOME", Path.home() / ".config")) / sub_dir
872
+ elif WINDOWS:
873
+ p = Path.home() / "AppData" / "Roaming" / sub_dir
874
+ elif MACOS:
875
+ p = Path.home() / "Library" / "Application Support" / sub_dir
874
876
  else:
875
877
  raise ValueError(f"Unsupported operating system: {platform.system()}")
876
878
 
877
- # GCP and AWS lambda fix, only /tmp is writeable
878
- if not is_dir_writeable(path.parent):
879
- LOGGER.warning(
880
- f"user config directory '{path}' is not writeable, defaulting to '/tmp' or CWD. "
881
- "Alternatively you can define a YOLO_CONFIG_DIR environment variable for this path."
882
- )
883
- path = Path("/tmp") / sub_dir if is_dir_writeable("/tmp") else Path().cwd() / sub_dir
884
-
885
- # Create the subdirectory if it does not exist
886
- path.mkdir(parents=True, exist_ok=True)
879
+ if p.exists(): # already created trust it
880
+ return p
881
+ if is_dir_writeable(p.parent): # create if possible
882
+ p.mkdir(parents=True, exist_ok=True)
883
+ return p
884
+
885
+ # Fallbacks for Docker, GCP/AWS functions where only /tmp is writeable
886
+ for alt in [Path("/tmp") / sub_dir, Path.cwd() / sub_dir]:
887
+ if alt.exists():
888
+ return alt
889
+ if is_dir_writeable(alt.parent):
890
+ alt.mkdir(parents=True, exist_ok=True)
891
+ LOGGER.warning(
892
+ f"user config directory '{p}' is not writeable, using '{alt}'. Set YOLO_CONFIG_DIR to override."
893
+ )
894
+ return alt
887
895
 
888
- return path
896
+ # Last fallback → CWD
897
+ p = Path.cwd() / sub_dir
898
+ p.mkdir(parents=True, exist_ok=True)
899
+ return p
889
900
 
890
901
 
891
902
  # Define constants (required below)
@@ -899,7 +910,7 @@ IS_JUPYTER = is_jupyter()
899
910
  IS_PIP_PACKAGE = is_pip_package()
900
911
  IS_RASPBERRYPI = is_raspberrypi()
901
912
  GIT = GitRepo()
902
- USER_CONFIG_DIR = Path(os.getenv("YOLO_CONFIG_DIR") or get_user_config_dir()) # Ultralytics settings dir
913
+ USER_CONFIG_DIR = get_user_config_dir() # Ultralytics settings dir
903
914
  SETTINGS_FILE = USER_CONFIG_DIR / "settings.json"
904
915
 
905
916
 
@@ -1383,7 +1394,7 @@ class SettingsManager(JSONDict):
1383
1394
 
1384
1395
  def deprecation_warn(arg, new_arg=None):
1385
1396
  """Issue a deprecation warning when a deprecated argument is used, suggesting an updated argument."""
1386
- msg = f"'{arg}' is deprecated and will be removed in in the future."
1397
+ msg = f"'{arg}' is deprecated and will be removed in the future."
1387
1398
  if new_arg is not None:
1388
1399
  msg += f" Use '{new_arg}' instead."
1389
1400
  LOGGER.warning(msg)
@@ -70,14 +70,14 @@ def _log_tensorboard_graph(trainer) -> None:
70
70
  # Try simple method first (YOLO)
71
71
  try:
72
72
  trainer.model.eval() # place in .eval() mode to avoid BatchNorm statistics changes
73
- WRITER.add_graph(torch.jit.trace(torch_utils.de_parallel(trainer.model), im, strict=False), [])
73
+ WRITER.add_graph(torch.jit.trace(torch_utils.unwrap_model(trainer.model), im, strict=False), [])
74
74
  LOGGER.info(f"{PREFIX}model graph visualization added ✅")
75
75
  return
76
76
 
77
77
  except Exception:
78
78
  # Fallback to TorchScript export steps (RTDETR)
79
79
  try:
80
- model = deepcopy(torch_utils.de_parallel(trainer.model))
80
+ model = deepcopy(torch_utils.unwrap_model(trainer.model))
81
81
  model.eval()
82
82
  model = model.fuse(verbose=False)
83
83
  for m in model.modules():
@@ -452,6 +452,8 @@ def check_torchvision():
452
452
  to the compatibility table based on: https://github.com/pytorch/vision#installation.
453
453
  """
454
454
  compatibility_table = {
455
+ "2.9": ["0.24"],
456
+ "2.8": ["0.23"],
455
457
  "2.7": ["0.22"],
456
458
  "2.6": ["0.21"],
457
459
  "2.5": ["0.20"],
ultralytics/utils/loss.py CHANGED
@@ -11,7 +11,7 @@ import torch.nn.functional as F
11
11
  from ultralytics.utils.metrics import OKS_SIGMA
12
12
  from ultralytics.utils.ops import crop_mask, xywh2xyxy, xyxy2xywh
13
13
  from ultralytics.utils.tal import RotatedTaskAlignedAssigner, TaskAlignedAssigner, dist2bbox, dist2rbox, make_anchors
14
- from ultralytics.utils.torch_utils import autocast
14
+ from ultralytics.utils.torch_utils import autocast, disable_dynamo
15
15
 
16
16
  from .metrics import bbox_iou, probiou
17
17
  from .tal import bbox2dist
@@ -215,6 +215,7 @@ class v8DetectionLoss:
215
215
  self.assigner = TaskAlignedAssigner(topk=tal_topk, num_classes=self.nc, alpha=0.5, beta=6.0)
216
216
  self.bbox_loss = BboxLoss(m.reg_max).to(device)
217
217
  self.proj = torch.arange(m.reg_max, dtype=torch.float, device=device)
218
+ disable_dynamo(self.__class__) # exclude from compile
218
219
 
219
220
  def preprocess(self, targets: torch.Tensor, batch_size: int, scale_tensor: torch.Tensor) -> torch.Tensor:
220
221
  """Preprocess targets by converting to tensor format and scaling coordinates."""
@@ -260,7 +261,7 @@ class v8DetectionLoss:
260
261
 
261
262
  # Targets
262
263
  targets = torch.cat((batch["batch_idx"].view(-1, 1), batch["cls"].view(-1, 1), batch["bboxes"]), 1)
263
- targets = self.preprocess(targets.to(self.device), batch_size, scale_tensor=imgsz[[1, 0, 1, 0]])
264
+ targets = self.preprocess(targets, batch_size, scale_tensor=imgsz[[1, 0, 1, 0]])
264
265
  gt_labels, gt_bboxes = targets.split((1, 4), 2) # cls, xyxy
265
266
  mask_gt = gt_bboxes.sum(2, keepdim=True).gt_(0.0)
266
267
 
@@ -287,9 +288,14 @@ class v8DetectionLoss:
287
288
 
288
289
  # Bbox loss
289
290
  if fg_mask.sum():
290
- target_bboxes /= stride_tensor
291
291
  loss[0], loss[2] = self.bbox_loss(
292
- pred_distri, pred_bboxes, anchor_points, target_bboxes, target_scores, target_scores_sum, fg_mask
292
+ pred_distri,
293
+ pred_bboxes,
294
+ anchor_points,
295
+ target_bboxes / stride_tensor,
296
+ target_scores,
297
+ target_scores_sum,
298
+ fg_mask,
293
299
  )
294
300
 
295
301
  loss[0] *= self.hyp.box # box gain
@@ -329,7 +335,7 @@ class v8SegmentationLoss(v8DetectionLoss):
329
335
  try:
330
336
  batch_idx = batch["batch_idx"].view(-1, 1)
331
337
  targets = torch.cat((batch_idx, batch["cls"].view(-1, 1), batch["bboxes"]), 1)
332
- targets = self.preprocess(targets.to(self.device), batch_size, scale_tensor=imgsz[[1, 0, 1, 0]])
338
+ targets = self.preprocess(targets, batch_size, scale_tensor=imgsz[[1, 0, 1, 0]])
333
339
  gt_labels, gt_bboxes = targets.split((1, 4), 2) # cls, xyxy
334
340
  mask_gt = gt_bboxes.sum(2, keepdim=True).gt_(0.0)
335
341
  except RuntimeError as e:
@@ -388,7 +394,7 @@ class v8SegmentationLoss(v8DetectionLoss):
388
394
  loss[2] *= self.hyp.cls # cls gain
389
395
  loss[3] *= self.hyp.dfl # dfl gain
390
396
 
391
- return loss * batch_size, loss.detach() # loss(box, cls, dfl)
397
+ return loss * batch_size, loss.detach() # loss(box, seg, cls, dfl)
392
398
 
393
399
  @staticmethod
394
400
  def single_mask_loss(
@@ -516,7 +522,7 @@ class v8PoseLoss(v8DetectionLoss):
516
522
  batch_size = pred_scores.shape[0]
517
523
  batch_idx = batch["batch_idx"].view(-1, 1)
518
524
  targets = torch.cat((batch_idx, batch["cls"].view(-1, 1), batch["bboxes"]), 1)
519
- targets = self.preprocess(targets.to(self.device), batch_size, scale_tensor=imgsz[[1, 0, 1, 0]])
525
+ targets = self.preprocess(targets, batch_size, scale_tensor=imgsz[[1, 0, 1, 0]])
520
526
  gt_labels, gt_bboxes = targets.split((1, 4), 2) # cls, xyxy
521
527
  mask_gt = gt_bboxes.sum(2, keepdim=True).gt_(0.0)
522
528
 
@@ -704,7 +710,7 @@ class v8OBBLoss(v8DetectionLoss):
704
710
  targets = torch.cat((batch_idx, batch["cls"].view(-1, 1), batch["bboxes"].view(-1, 5)), 1)
705
711
  rw, rh = targets[:, 4] * imgsz[0].item(), targets[:, 5] * imgsz[1].item()
706
712
  targets = targets[(rw >= 2) & (rh >= 2)] # filter rboxes of tiny size to stabilize training
707
- targets = self.preprocess(targets.to(self.device), batch_size, scale_tensor=imgsz[[1, 0, 1, 0]])
713
+ targets = self.preprocess(targets, batch_size, scale_tensor=imgsz[[1, 0, 1, 0]])
708
714
  gt_labels, gt_bboxes = targets.split((1, 5), 2) # cls, xywhr
709
715
  mask_gt = gt_bboxes.sum(2, keepdim=True).gt_(0.0)
710
716
  except RuntimeError as e:
@@ -1004,6 +1004,7 @@ def plot_tune_results(csv_file: str = "tune_results.csv"):
1004
1004
  _save_one_file(csv_file.with_name("tune_fitness.png"))
1005
1005
 
1006
1006
 
1007
+ @plt_settings()
1007
1008
  def feature_visualization(x, module_type: str, stage: int, n: int = 32, save_dir: Path = Path("runs/detect/exp")):
1008
1009
  """
1009
1010
  Visualize feature maps of a given model module during inference.
@@ -429,7 +429,7 @@ def get_flops(model, imgsz=640):
429
429
  return 0.0 # if not installed return 0.0 GFLOPs
430
430
 
431
431
  try:
432
- model = de_parallel(model)
432
+ model = unwrap_model(model)
433
433
  p = next(model.parameters())
434
434
  if not isinstance(imgsz, list):
435
435
  imgsz = [imgsz, imgsz] # expand if int/float
@@ -460,7 +460,7 @@ def get_flops_with_torch_profiler(model, imgsz=640):
460
460
  """
461
461
  if not TORCH_2_0: # torch profiler implemented in torch>=2.0
462
462
  return 0.0
463
- model = de_parallel(model)
463
+ model = unwrap_model(model)
464
464
  p = next(model.parameters())
465
465
  if not isinstance(imgsz, list):
466
466
  imgsz = [imgsz, imgsz] # expand if int/float
@@ -577,17 +577,24 @@ def is_parallel(model):
577
577
  return isinstance(model, (nn.parallel.DataParallel, nn.parallel.DistributedDataParallel))
578
578
 
579
579
 
580
- def de_parallel(model):
580
+ def unwrap_model(m: nn.Module) -> nn.Module:
581
581
  """
582
- De-parallelize a model: return single-GPU model if model is of type DP or DDP.
582
+ Unwrap compiled and parallel models to get the base model.
583
583
 
584
584
  Args:
585
- model (nn.Module): Model to de-parallelize.
585
+ m (nn.Module): A model that may be wrapped by torch.compile (._orig_mod) or parallel wrappers such as
586
+ DataParallel/DistributedDataParallel (.module).
586
587
 
587
588
  Returns:
588
- (nn.Module): De-parallelized model.
589
+ m (nn.Module): The unwrapped base model without compile or parallel wrappers.
589
590
  """
590
- return model.module if is_parallel(model) else model
591
+ while True:
592
+ if hasattr(m, "_orig_mod") and isinstance(m._orig_mod, nn.Module):
593
+ m = m._orig_mod
594
+ elif hasattr(m, "module") and isinstance(m.module, nn.Module):
595
+ m = m.module
596
+ else:
597
+ return m
591
598
 
592
599
 
593
600
  def one_cycle(y1=0.0, y2=1.0, steps=100):
@@ -669,7 +676,7 @@ class ModelEMA:
669
676
  tau (int, optional): EMA decay time constant.
670
677
  updates (int, optional): Initial number of updates.
671
678
  """
672
- self.ema = deepcopy(de_parallel(model)).eval() # FP32 EMA
679
+ self.ema = deepcopy(unwrap_model(model)).eval() # FP32 EMA
673
680
  self.updates = updates # number of EMA updates
674
681
  self.decay = lambda x: decay * (1 - math.exp(-x / tau)) # decay exponential ramp (to help early epochs)
675
682
  for p in self.ema.parameters():
@@ -687,7 +694,7 @@ class ModelEMA:
687
694
  self.updates += 1
688
695
  d = self.decay(self.updates)
689
696
 
690
- msd = de_parallel(model).state_dict() # model state_dict
697
+ msd = unwrap_model(model).state_dict() # model state_dict
691
698
  for k, v in self.ema.state_dict().items():
692
699
  if v.dtype.is_floating_point: # true for FP16 and FP32
693
700
  v *= d
@@ -997,3 +1004,98 @@ class FXModel(nn.Module):
997
1004
  x = m(x) # run
998
1005
  y.append(x) # save output
999
1006
  return x
1007
+
1008
+
1009
+ def disable_dynamo(func: Any) -> Any:
1010
+ """
1011
+ Disable torch.compile/dynamo for a callable when available.
1012
+
1013
+ Args:
1014
+ func (Any): Callable object to wrap. Could be a function, method, or class.
1015
+
1016
+ Returns:
1017
+ func (Any): Same callable, wrapped by torch._dynamo.disable when available, otherwise unchanged.
1018
+
1019
+ Examples:
1020
+ >>> @disable_dynamo
1021
+ ... def fn(x):
1022
+ ... return x + 1
1023
+ >>> # Works even if torch._dynamo is not available
1024
+ >>> _ = fn(1)
1025
+ """
1026
+ if hasattr(torch, "_dynamo"):
1027
+ return torch._dynamo.disable(func)
1028
+ return func
1029
+
1030
+
1031
+ def attempt_compile(
1032
+ model: torch.nn.Module,
1033
+ device: torch.device,
1034
+ imgsz: int = 640,
1035
+ use_autocast: bool = False,
1036
+ warmup: bool = False,
1037
+ prefix: str = colorstr("compile:"),
1038
+ ) -> torch.nn.Module:
1039
+ """
1040
+ Compile a model with torch.compile and optionally warm up the graph to reduce first-iteration latency.
1041
+
1042
+ This utility attempts to compile the provided model using the inductor backend with dynamic shapes enabled and an
1043
+ autotuning mode. If compilation is unavailable or fails, the original model is returned unchanged. An optional
1044
+ warmup performs a single forward pass on a dummy input to prime the compiled graph and measure compile/warmup time.
1045
+
1046
+ Args:
1047
+ model (torch.nn.Module): Model to compile.
1048
+ device (torch.device): Inference device used for warmup and autocast decisions.
1049
+ imgsz (int, optional): Square input size to create a dummy tensor with shape (1, 3, imgsz, imgsz) for warmup.
1050
+ use_autocast (bool, optional): Whether to run warmup under autocast on CUDA or MPS devices.
1051
+ warmup (bool, optional): Whether to execute a single dummy forward pass to warm up the compiled model.
1052
+ prefix (str, optional): Message prefix for logger output.
1053
+
1054
+ Returns:
1055
+ model (torch.nn.Module): Compiled model if compilation succeeds, otherwise the original unmodified model.
1056
+
1057
+ Notes:
1058
+ - If the current PyTorch build does not provide torch.compile, the function returns the input model immediately.
1059
+ - Warmup runs under torch.inference_mode and may use torch.autocast for CUDA/MPS to align compute precision.
1060
+ - CUDA devices are synchronized after warmup to account for asynchronous kernel execution.
1061
+
1062
+ Examples:
1063
+ >>> device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
1064
+ >>> # Try to compile and warm up a model with a 640x640 input
1065
+ >>> model = attempt_compile(model, device=device, imgsz=640, use_autocast=True, warmup=True)
1066
+ """
1067
+ if not hasattr(torch, "compile"):
1068
+ return model
1069
+
1070
+ LOGGER.info(f"{prefix} starting torch.compile...")
1071
+ t0 = time.perf_counter()
1072
+ try:
1073
+ model = torch.compile(model, mode="max-autotune", backend="inductor")
1074
+ except Exception as e:
1075
+ LOGGER.warning(f"{prefix} torch.compile failed, continuing uncompiled: {e}")
1076
+ return model
1077
+ t_compile = time.perf_counter() - t0
1078
+
1079
+ t_warm = 0.0
1080
+ if warmup:
1081
+ # Use a single dummy tensor to build the graph shape state and reduce first-iteration latency
1082
+ dummy = torch.zeros(1, 3, imgsz, imgsz, device=device)
1083
+ if use_autocast and device.type == "cuda":
1084
+ dummy = dummy.half()
1085
+ t1 = time.perf_counter()
1086
+ with torch.inference_mode():
1087
+ if use_autocast and device.type in {"cuda", "mps"}:
1088
+ with torch.autocast(device.type):
1089
+ _ = model(dummy)
1090
+ else:
1091
+ _ = model(dummy)
1092
+ if device.type == "cuda":
1093
+ torch.cuda.synchronize(device)
1094
+ t_warm = time.perf_counter() - t1
1095
+
1096
+ total = t_compile + t_warm
1097
+ if warmup:
1098
+ LOGGER.info(f"{prefix} complete in {total:.1f}s (compile {t_compile:.1f}s + warmup {t_warm:.1f}s)")
1099
+ else:
1100
+ LOGGER.info(f"{prefix} compile complete in {t_compile:.1f}s (no warmup)")
1101
+ return model
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ultralytics
3
- Version: 8.3.195
3
+ Version: 8.3.196
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,12 +7,12 @@ tests/test_exports.py,sha256=dWuroSyqXnrc0lE-RNTf7pZoXXXEkOs31u7nhOiEHS0,10994
7
7
  tests/test_integrations.py,sha256=kl_AKmE_Qs1GB0_91iVwbzNxofm_hFTt0zzU6JF-pg4,6323
8
8
  tests/test_python.py,sha256=2V23f2-JQsO-K4p1kj0IkCRxHykGwgd0edKJzRsBgdI,27911
9
9
  tests/test_solutions.py,sha256=6wJ9-lhyWSAm7zaR4D9L_DrUA3iJU1NgqmbQO6PIuvo,13211
10
- ultralytics/__init__.py,sha256=sx80eyCXBZDlBTb_btxCtaotNjo9Cvl-UrsPQFxMcUg,730
10
+ ultralytics/__init__.py,sha256=APj9NfEx0ZIorMTCYwzpAWb-sLPKJBI99dE1cPUC-ms,730
11
11
  ultralytics/py.typed,sha256=la67KBlbjXN-_-DfGNcdOcjYumVpKG_Tkw-8n5dnGB4,8
12
12
  ultralytics/assets/bus.jpg,sha256=wCAZxJecGR63Od3ZRERe9Aja1Weayrb9Ug751DS_vGM,137419
13
13
  ultralytics/assets/zidane.jpg,sha256=Ftc4aeMmen1O0A3o6GCDO9FlfBslLpTAw0gnetx7bts,50427
14
- ultralytics/cfg/__init__.py,sha256=xX7qUxdcDgcjCKoQFEVQgzrwZodeKTF88CTKZe05d0Y,39955
15
- ultralytics/cfg/default.yaml,sha256=1SspGAK_K_DT7DBfEScJh4jsJUTOxahehZYj92xmj7o,8347
14
+ ultralytics/cfg/__init__.py,sha256=oR-uubaBOEIetwoKr9C9WeXP7fLwVygDE_Cppoe2ho0,39974
15
+ ultralytics/cfg/default.yaml,sha256=jnt-5OmGalqd_SSEa1cf4HkBaJy0IswpoW5gdkoF5Vc,8429
16
16
  ultralytics/cfg/datasets/Argoverse.yaml,sha256=J4ItoUlE_EiYTmp1DFKYHfbqHkj8j4wUtRJQhaMIlBM,3275
17
17
  ultralytics/cfg/datasets/DOTAv1.5.yaml,sha256=VZ_KKFX0H2YvlFVJ8JHcLWYBZ2xiQ6Z-ROSTiKWpS7c,1211
18
18
  ultralytics/cfg/datasets/DOTAv1.yaml,sha256=JrDuYcQ0JU9lJlCA-dCkMNko_jaj6MAVGHjsfjeZ_u0,1181
@@ -106,9 +106,9 @@ ultralytics/cfg/trackers/botsort.yaml,sha256=TpRaK5kH_-QbjCQ7ekM4s_7j8I8ti3q8Hs7
106
106
  ultralytics/cfg/trackers/bytetrack.yaml,sha256=6u-tiZlk16EqEwkNXaMrza6PAQmWj_ypgv26LGCtPDg,886
107
107
  ultralytics/data/__init__.py,sha256=nAXaL1puCc7z_NjzQNlJnhbVhT9Fla2u7Dsqo7q1dAc,644
108
108
  ultralytics/data/annotator.py,sha256=f15TCDEM8SuuzHiFB8oyhTy9vfywKmPTLSPAgsZQP9I,2990
109
- ultralytics/data/augment.py,sha256=zyO8fjeiOlwF_xi3ATTforsV66KYzWYENFd71HC8oAA,132890
109
+ ultralytics/data/augment.py,sha256=3ArOOP1dSnCfQRHIQ6og-XFsaLnSqrXYtx-tpbE4Kag,132893
110
110
  ultralytics/data/base.py,sha256=gWoGFifyNe1TCwtGdGp5jzKOQ9sh4b-XrfyN0PPvRaY,19661
111
- ultralytics/data/build.py,sha256=9Qytj451Ml7lFbGNFpslrh4Jt9EucAqL0ic_6veySnk,11511
111
+ ultralytics/data/build.py,sha256=Bhu8E-FNSkTbz6YpNXeUBmQtN91ZtZxOCUiKYXgzV-c,11778
112
112
  ultralytics/data/converter.py,sha256=N1YFD0mG7uwL12wMcuVtF2zbISBIzTsGiy1QioDTDGs,32049
113
113
  ultralytics/data/dataset.py,sha256=AfWOLsLKjTDHRtSqODKk5OsD3ViETZTKxY4PKP2Jo5Q,36751
114
114
  ultralytics/data/loaders.py,sha256=sfQ0C86uBg9QQbN3aU0W8FIjGQmMdJTQAMK4DA1bjk8,31748
@@ -120,13 +120,13 @@ ultralytics/data/scripts/get_coco.sh,sha256=UuJpJeo3qQpTHVINeOpmP0NYmg8PhEFE3A8J
120
120
  ultralytics/data/scripts/get_coco128.sh,sha256=qmRQl_hOKrsdHrTrnyQuFIH01oDz3lfaz138OgGfLt8,650
121
121
  ultralytics/data/scripts/get_imagenet.sh,sha256=hr42H16bM47iT27rgS7MpEo-GeOZAYUQXgr0B2cwn48,1705
122
122
  ultralytics/engine/__init__.py,sha256=lm6MckFYCPTbqIoX7w0s_daxdjNeBeKW6DXppv1-QUM,70
123
- ultralytics/engine/exporter.py,sha256=c7OXFm9qBliL9zVL5g8_hVp8dVwZd3L-MnwSZDPLVrw,75428
123
+ ultralytics/engine/exporter.py,sha256=d_2ADzklNXhVpwfAmJlp6PVuT0sLXf7O2SP486jpBy4,74966
124
124
  ultralytics/engine/model.py,sha256=1n5oqCDJYzRWPU0-79hc6txCIGpXmZVTnB-ae9nahRc,53488
125
- ultralytics/engine/predictor.py,sha256=PPDwvw-pVhLCefRJL7bcu4kYOCmcZBoYVHF8vfEemAo,22625
125
+ ultralytics/engine/predictor.py,sha256=510VPYcYmEYPJmBiApQLGaFFAL4gd79rVzPCwisH7LE,22745
126
126
  ultralytics/engine/results.py,sha256=BmhePCaaTBfYrJT12t6bywZuZ_7h3tIc4IsRFuyNTdk,71499
127
- ultralytics/engine/trainer.py,sha256=_mTG-z6xnOdFUmB6uOF8HQkFb_uMwP0MrJHlt7X3zVw,40457
127
+ ultralytics/engine/trainer.py,sha256=XeXZ8BAvH5ZtU7zW44Jsf7SOxtkAG8RL9NO_nhpfkZo,40898
128
128
  ultralytics/engine/tuner.py,sha256=XuqcjyGpD79pUVn-PXlJJGKXgH1yblPdYBH_R2kHWSU,20586
129
- ultralytics/engine/validator.py,sha256=8ky0lcMCYDY7RGYRUowDAKxEMfsPBLpT7LlgfHA-IsY,16681
129
+ ultralytics/engine/validator.py,sha256=7tADPOXRZz0Yi7F-Z5SxcUnwytaa2MfbtuSdO8pp_l4,16966
130
130
  ultralytics/hub/__init__.py,sha256=xCF02lzlPKbdmGfO3NxLuXl5Kb0MaBZp_-fAWDHZ8zw,6698
131
131
  ultralytics/hub/auth.py,sha256=RIwZDWfW6vS2yGpZKR0xVl0-38itJYEFtmqY_M70bl8,6304
132
132
  ultralytics/hub/session.py,sha256=1o9vdd_fvPUHQ5oZgljtPePuPMUalIoXqOvE7Sdmd2o,18450
@@ -168,41 +168,41 @@ ultralytics/models/yolo/__init__.py,sha256=or0j5xvcM0usMlsFTYhNAOcQUri7reD0cD9JR
168
168
  ultralytics/models/yolo/model.py,sha256=b_F1AeBUgiSssRxZ-rGQVdB0a37rDG92h_03o0N29B8,18761
169
169
  ultralytics/models/yolo/classify/__init__.py,sha256=9--HVaNOfI1K7rn_rRqclL8FUAnpfeBrRqEQIaQw2xM,383
170
170
  ultralytics/models/yolo/classify/predict.py,sha256=o7pDE8xwjkHUUIIOph7ZVQZyGZyob24dYDQ460v_7R0,4149
171
- ultralytics/models/yolo/classify/train.py,sha256=DzwXQII2qf5KvSoEi03onppQpLPR1EcHowrjS5pnbVQ,10296
171
+ ultralytics/models/yolo/classify/train.py,sha256=CXi8ZrVqYtqlzRbg3UP5kOyMYXAM4Wex8Ii0fDyv-iA,9840
172
172
  ultralytics/models/yolo/classify/val.py,sha256=6_-pbnb0skASJCqsar6_i3FyvfKNJwZ7Y8AK7wzySIU,10039
173
173
  ultralytics/models/yolo/detect/__init__.py,sha256=GIRsLYR-kT4JJx7lh4ZZAFGBZj0aebokuU0A7JbjDVA,257
174
174
  ultralytics/models/yolo/detect/predict.py,sha256=v4u3azp2zQxJKJ4L198gGIgkL7CN-6qGg1B7ypBxxbM,5390
175
- ultralytics/models/yolo/detect/train.py,sha256=JSEG_UDd1U3a_QqdEd1KBK228beco41O99TGBKlVH-U,9909
176
- ultralytics/models/yolo/detect/val.py,sha256=7lzU71_V57DG4FNcRT2f--ebLfHZcVRTsHENN9GsCAc,21324
175
+ ultralytics/models/yolo/detect/train.py,sha256=y6qVw9az7hOMo5eXQ4a9i29wIvvwnpVfzZJJC7V7YC8,10947
176
+ ultralytics/models/yolo/detect/val.py,sha256=OG38-x3LyCAeH3UY9jOG4axK7mfnVnTwaKpjMzQi07I,21309
177
177
  ultralytics/models/yolo/obb/__init__.py,sha256=tQmpG8wVHsajWkZdmD6cjGohJ4ki64iSXQT8JY_dydo,221
178
178
  ultralytics/models/yolo/obb/predict.py,sha256=4r1eSld6TNJlk9JG56e-DX6oPL8uBBqiuztyBpxWlHE,2888
179
- ultralytics/models/yolo/obb/train.py,sha256=y-9c6jNLXVx6qxE1PGVFzG1N1LYg4wFeXD94FsjJ1CE,3910
179
+ ultralytics/models/yolo/obb/train.py,sha256=BbehrsKP0lHRV3v7rrw8wAeiDdc-szbhHAmDy0OdhoM,3461
180
180
  ultralytics/models/yolo/obb/val.py,sha256=ZNjdI5dF-igZCqJadAUb5VPTevI5i47G-bPTG8wV-CY,14171
181
181
  ultralytics/models/yolo/pose/__init__.py,sha256=63xmuHZLNzV8I76HhVXAq4f2W0KTk8Oi9eL-Y204LyQ,227
182
182
  ultralytics/models/yolo/pose/predict.py,sha256=M0C7ZfVXx4QXgv-szjnaXYEPas76ZLGAgDNNh1GG0vI,3743
183
- ultralytics/models/yolo/pose/train.py,sha256=MXYh-Fw7fcp3dPqKAdjcorUACIj-vfaNXqHt9GToSKY,5450
184
- ultralytics/models/yolo/pose/val.py,sha256=W20lg1fJzZ7nlgtBtaUhG7ftgjJ_BzjBZnShwhvNJO8,12673
183
+ ultralytics/models/yolo/pose/train.py,sha256=laAn8ej3nihl119agEr0P8TxP8c8itI8E0I0lov4VE0,5079
184
+ ultralytics/models/yolo/pose/val.py,sha256=U4tMWbHpCjspJ6i5DbNUav05RFCvwvfD1mjejqJIJ1c,12638
185
185
  ultralytics/models/yolo/segment/__init__.py,sha256=3IThhZ1wlkY9FvmWm9cE-5-ZyE6F1FgzAtQ6jOOFzzw,275
186
186
  ultralytics/models/yolo/segment/predict.py,sha256=zxMc1QvsQoJxm6VSbbZQ3pChvq1VbYSf7p8RX3RbPNg,5377
187
- ultralytics/models/yolo/segment/train.py,sha256=JfmrrKatqlbgKzbKx1rvP0juvsJn1I8OGYvctPR8Fb4,3762
188
- ultralytics/models/yolo/segment/val.py,sha256=mSM6e5PLeHn5PwSdrgP_7tcZ5ZoaFlIIhoykqmlVkvE,11147
187
+ ultralytics/models/yolo/segment/train.py,sha256=MWnJ593xaEhlV0EirEMZtlz0Zj6wz6EGUFfH2dHcBIA,3324
188
+ ultralytics/models/yolo/segment/val.py,sha256=LnRCVa1uQTmDN5qLWHpVwBL2ieF_d7ly9hSkQ7k3GwE,11112
189
189
  ultralytics/models/yolo/world/__init__.py,sha256=nlh8I6t8hMGz_vZg8QSlsUW1R-2eKvn9CGUoPPQEGhA,131
190
- ultralytics/models/yolo/world/train.py,sha256=X0pa5D0-vTMZa24LfR1ncm1ucWqOcFitRQ0_pVtKQP0,7866
191
- ultralytics/models/yolo/world/train_world.py,sha256=25ZJHDYRCf2hWNYGQPlTICkFHXBTdet24XgWQ33AGh0,9551
190
+ ultralytics/models/yolo/world/train.py,sha256=zVPtVoBedberGkth3tPuIH665HjGNJvTMLw_wLZQM84,7870
191
+ ultralytics/models/yolo/world/train_world.py,sha256=9p9YIckrATaJjGOrpmuC8MbZX9qdoCPCEV9EGZ0sExg,9553
192
192
  ultralytics/models/yolo/yoloe/__init__.py,sha256=6SLytdJtwu37qewf7CobG7C7Wl1m-xtNdvCXEasfPDE,760
193
193
  ultralytics/models/yolo/yoloe/predict.py,sha256=pcbAUbosr1Xc436MfQi6ah3MQ6kkPzjOcltmdA3VMDE,7124
194
- ultralytics/models/yolo/yoloe/train.py,sha256=h11Hw-XnHfg_GPf6DrR3nMqGgQJg14rafiRZe5gVFdM,14067
194
+ ultralytics/models/yolo/yoloe/train.py,sha256=jcXqGm8CReOCVMFLk-1bNe0Aw5PWaaQa8xBWxtrt5TY,13571
195
195
  ultralytics/models/yolo/yoloe/train_seg.py,sha256=aCV7M8oQOvODFnU4piZdJh3tIrBJYAzZfRVRx1vRgxo,4956
196
- ultralytics/models/yolo/yoloe/val.py,sha256=MnS2YwhRxdqXPRlExHt-9HRp8KKIHuFdmiNH1z6LedI,9795
196
+ ultralytics/models/yolo/yoloe/val.py,sha256=Dn6CKpfcopDVxr-WY13ATDVb_RIzQ-wsXSxxy_mpndA,9454
197
197
  ultralytics/nn/__init__.py,sha256=PJgOn2phQTTBR2P3s_JWvGeGXQpvw1znsumKow4tCuE,545
198
198
  ultralytics/nn/autobackend.py,sha256=WWHIFvCI47Wpe3NCDkoUg3esjOTJ0XGEzG3luA_uG-8,41063
199
- ultralytics/nn/tasks.py,sha256=9EMkmdmYLEbQVAjin2joZfqc3UfgKrrADJZKOX6Ukjw,70400
199
+ ultralytics/nn/tasks.py,sha256=2MnuL8plr4oE_gpSIeSbCYrbkdMXdludQWWj_liWsv8,70404
200
200
  ultralytics/nn/text_model.py,sha256=pHqnKe8UueR1MuwJcIE_IvrnYIlt68QL796xjcRJs2A,15275
201
201
  ultralytics/nn/modules/__init__.py,sha256=BPMbEm1daI7Tuds3zph2_afAX7Gq1uAqK8BfiCfKTZs,3198
202
202
  ultralytics/nn/modules/activation.py,sha256=75JcIMH2Cu9GTC2Uf55r_5YLpxcrXQDaVoeGQ0hlUAU,2233
203
203
  ultralytics/nn/modules/block.py,sha256=nIIOTEuikiVWELuOt2VyfXPpvof9p4qNSdaQzq5WlCg,70618
204
204
  ultralytics/nn/modules/conv.py,sha256=U6P1ZuzQmIf09noKwp7syuWn-M98Tly2wMWOsDT3kOI,21457
205
- ultralytics/nn/modules/head.py,sha256=7-WuatR32jpuqR5IhwHuheAwAn_izX7e7cPOHEg7MmI,53556
205
+ ultralytics/nn/modules/head.py,sha256=NNSrnYBDMlKssyePyK5T-WWaadfELCD_Fdn_IIbtIXs,53592
206
206
  ultralytics/nn/modules/transformer.py,sha256=l6NuuFF7j_bogcNULHBBdj5l6sf7MwiVEGz8XcRyTUM,31366
207
207
  ultralytics/nn/modules/utils.py,sha256=rn8yTObZGkQoqVzjbZWLaHiytppG4ffjMME4Lw60glM,6092
208
208
  ultralytics/solutions/__init__.py,sha256=ZoeAQavTLp8aClnhZ9tbl6lxy86GxofyGvZWTx2aWkI,1209
@@ -235,11 +235,11 @@ ultralytics/trackers/utils/__init__.py,sha256=lm6MckFYCPTbqIoX7w0s_daxdjNeBeKW6D
235
235
  ultralytics/trackers/utils/gmc.py,sha256=1cCmlbk5Z6Pd-rFCaiJML7o_cUm_IktMuCocTDOMGFQ,14028
236
236
  ultralytics/trackers/utils/kalman_filter.py,sha256=PPmM0lwBMdT_hGojvfLoUsBUFMBBMNRAxKbMcQa3wJ0,21619
237
237
  ultralytics/trackers/utils/matching.py,sha256=I8SX0sBaBgr4GBJ9uDGOy5LnotgNZHpB2p5RNF1sy-s,7160
238
- ultralytics/utils/__init__.py,sha256=8vYownbjAVDmRc2cafLetRjcq-YsUcy1LPKmSrz5yuM,53204
238
+ ultralytics/utils/__init__.py,sha256=whSIuj-0lV0SAp4YjOeBJZ2emP1Qa8pqLnrhRiwl2Qs,53503
239
239
  ultralytics/utils/autobatch.py,sha256=i6KYLLSItKP1Q2IUlTPHrZhjcxl7UOjs0Seb8bF8pvM,5124
240
240
  ultralytics/utils/autodevice.py,sha256=d9yq6eEn05fdfzfpxeSECd0YEO61er5f7T-0kjLdofg,8843
241
241
  ultralytics/utils/benchmarks.py,sha256=lcIr--oKK0TCjUVbvrm-NtYrnszrEMuHJC9__ziM7y8,31458
242
- ultralytics/utils/checks.py,sha256=nKb8qnqhEZKoLPdsQ4oBcKFU9Ngw6u0pdOOjxNhy46E,34468
242
+ ultralytics/utils/checks.py,sha256=Jw5pwREBnlyrq3zbiHEwiQXir2-f7dGpXeqY_PgoNpw,34518
243
243
  ultralytics/utils/cpu.py,sha256=OPlVxROWhQp-kEa9EkeNRKRQ-jz0KwySu5a-h91JZjk,3634
244
244
  ultralytics/utils/dist.py,sha256=g7OKPrSgjIB2wgcncSFYtFuR-uW6J0-Y1z76k4gDSz0,4170
245
245
  ultralytics/utils/downloads.py,sha256=JIlHfUg-qna5aOHRJupH7d5zob2qGZtRrs86Cp3zOJs,23029
@@ -250,14 +250,14 @@ ultralytics/utils/files.py,sha256=kxE2rkBuZL288nSN7jxLljmDnBgc16rekEXeRjhbUoo,82
250
250
  ultralytics/utils/git.py,sha256=DcaxKNQfCiG3cxdzuw7M6l_VXgaSVqkERQt_vl8UyXM,5512
251
251
  ultralytics/utils/instance.py,sha256=_b_jMTECWJGzncCiTg7FtTDSSeXGnbiAhaJhIsqbn9k,19043
252
252
  ultralytics/utils/logger.py,sha256=o_vH4CCgQat6_Sbmwm1sUAJ4muAgVcsUed-WqpGNQZw,15129
253
- ultralytics/utils/loss.py,sha256=sC2efov3Uwg2eT5oOzMHRfnQLZvtGXSdMuWBTKxyxPw,39816
253
+ ultralytics/utils/loss.py,sha256=S1mzVkIPjoNUxSQjZHfTdzuMEuYvdRmwfZoMg_fMMeE,39906
254
254
  ultralytics/utils/metrics.py,sha256=xFlSqx_su96LAUpxfGP7ShEG50Qo5p5OtwR3hx4_Llc,68809
255
255
  ultralytics/utils/nms.py,sha256=pcAaKIMssVGX3jlFmEEm6P_SL9PrXsTgu0rpx-_TDi8,14199
256
256
  ultralytics/utils/ops.py,sha256=PW3fgw1d18CA2ZNQZVJqUy054cJ_9tIcxd1XnA0FPgU,26905
257
257
  ultralytics/utils/patches.py,sha256=0-2G4jXCIPnMonlft-cPcjfFcOXQS6ODwUDNUwanfg4,6541
258
- ultralytics/utils/plotting.py,sha256=8ze3RFly61sA-qg22B7m7Jraac5LEIpI0MtJ4CZSjlc,47515
258
+ ultralytics/utils/plotting.py,sha256=rumZLvfLX1bE9xQS7Gk13kVM7AmIxQOmQ5CAmhsdxCE,47531
259
259
  ultralytics/utils/tal.py,sha256=LrziY_ZHz4wln3oOnqAzgyPaXKoup17Sa103BpuaQFU,20935
260
- ultralytics/utils/torch_utils.py,sha256=4TCiWXepEdUdR-WPVVScS7lhMAEWCInNwfoX0XXdmo8,39181
260
+ ultralytics/utils/torch_utils.py,sha256=i_IgmGhb5UuNlFgg4TZJrm2NSjAe_YfhGIY7Sn7cSSk,43472
261
261
  ultralytics/utils/tqdm.py,sha256=ny5RIg2OTkWQ7gdaXfYaoIgR0Xn2_hNGB6tUpO2Unns,16137
262
262
  ultralytics/utils/triton.py,sha256=fbMfTAUyoGiyslWtySzLZw53XmZJa7rF31CYFot0Wjs,5422
263
263
  ultralytics/utils/tuner.py,sha256=9D4dSIvwwxcNSJcH2QJ92qiIVi9zu-1L7_PBZ8okDyE,6816
@@ -271,11 +271,11 @@ ultralytics/utils/callbacks/mlflow.py,sha256=6K8I5zij1yq3TUW9c5BBQNqdzz3IXugQjwK
271
271
  ultralytics/utils/callbacks/neptune.py,sha256=j8pecmlcsM8FGzLKWoBw5xUsi5t8E5HuxY7TR5Um_O8,4612
272
272
  ultralytics/utils/callbacks/platform.py,sha256=a7T_8htoBB0uX1WIc392UJnhDjxkRyQMvhPYKR6wUTU,2008
273
273
  ultralytics/utils/callbacks/raytune.py,sha256=S6Bq16oQDQ8BQgnZzA0zJHGN_BBr8iAM_WtGoLiEcwg,1283
274
- ultralytics/utils/callbacks/tensorboard.py,sha256=MDPBW7aDes-66OE6YqKXXvqA_EocjzEMHWGM-8z9vUQ,5281
274
+ ultralytics/utils/callbacks/tensorboard.py,sha256=_4nfGK1dDLn6ijpvphBDhc-AS8qhS3jjY2CAWB7SNF0,5283
275
275
  ultralytics/utils/callbacks/wb.py,sha256=ngQO8EJ1kxJDF1YajScVtzBbm26jGuejA0uWeOyvf5A,7685
276
- ultralytics-8.3.195.dist-info/licenses/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
277
- ultralytics-8.3.195.dist-info/METADATA,sha256=lJa__c-le2j98HWyk_CNODxPEZVhdOOm-juC4hpZ5OU,37667
278
- ultralytics-8.3.195.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
279
- ultralytics-8.3.195.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
280
- ultralytics-8.3.195.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
281
- ultralytics-8.3.195.dist-info/RECORD,,
276
+ ultralytics-8.3.196.dist-info/licenses/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
277
+ ultralytics-8.3.196.dist-info/METADATA,sha256=3pZe7aM3MEicB69j31gpgBhB6rVtF7-_zwaPKINQ7us,37667
278
+ ultralytics-8.3.196.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
279
+ ultralytics-8.3.196.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
280
+ ultralytics-8.3.196.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
281
+ ultralytics-8.3.196.dist-info/RECORD,,