ultralytics 8.3.195__py3-none-any.whl → 8.3.197__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 (37) hide show
  1. ultralytics/__init__.py +1 -1
  2. ultralytics/cfg/__init__.py +1 -0
  3. ultralytics/cfg/datasets/construction-ppe.yaml +32 -0
  4. ultralytics/cfg/default.yaml +1 -0
  5. ultralytics/data/augment.py +1 -1
  6. ultralytics/data/build.py +5 -1
  7. ultralytics/engine/exporter.py +20 -31
  8. ultralytics/engine/model.py +1 -2
  9. ultralytics/engine/predictor.py +3 -1
  10. ultralytics/engine/trainer.py +17 -8
  11. ultralytics/engine/validator.py +6 -2
  12. ultralytics/models/yolo/classify/train.py +1 -11
  13. ultralytics/models/yolo/detect/train.py +27 -6
  14. ultralytics/models/yolo/detect/val.py +6 -5
  15. ultralytics/models/yolo/obb/train.py +0 -9
  16. ultralytics/models/yolo/pose/train.py +0 -9
  17. ultralytics/models/yolo/pose/val.py +1 -1
  18. ultralytics/models/yolo/segment/train.py +0 -9
  19. ultralytics/models/yolo/segment/val.py +5 -5
  20. ultralytics/models/yolo/world/train.py +4 -4
  21. ultralytics/models/yolo/world/train_world.py +2 -2
  22. ultralytics/models/yolo/yoloe/train.py +3 -12
  23. ultralytics/models/yolo/yoloe/val.py +0 -7
  24. ultralytics/nn/tasks.py +4 -2
  25. ultralytics/utils/__init__.py +30 -19
  26. ultralytics/utils/callbacks/tensorboard.py +2 -2
  27. ultralytics/utils/checks.py +2 -0
  28. ultralytics/utils/loss.py +12 -7
  29. ultralytics/utils/nms.py +3 -1
  30. ultralytics/utils/plotting.py +1 -0
  31. ultralytics/utils/torch_utils.py +89 -9
  32. {ultralytics-8.3.195.dist-info → ultralytics-8.3.197.dist-info}/METADATA +1 -1
  33. {ultralytics-8.3.195.dist-info → ultralytics-8.3.197.dist-info}/RECORD +37 -36
  34. {ultralytics-8.3.195.dist-info → ultralytics-8.3.197.dist-info}/WHEEL +0 -0
  35. {ultralytics-8.3.195.dist-info → ultralytics-8.3.197.dist-info}/entry_points.txt +0 -0
  36. {ultralytics-8.3.195.dist-info → ultralytics-8.3.197.dist-info}/licenses/LICENSE +0 -0
  37. {ultralytics-8.3.195.dist-info → ultralytics-8.3.197.dist-info}/top_level.txt +0 -0
@@ -6,7 +6,7 @@ from ultralytics.data import YOLOConcatDataset, build_grounding, build_yolo_data
6
6
  from ultralytics.data.utils import check_det_dataset
7
7
  from ultralytics.models.yolo.world import WorldTrainer
8
8
  from ultralytics.utils import DATASETS_DIR, DEFAULT_CFG, LOGGER
9
- from ultralytics.utils.torch_utils import de_parallel
9
+ from ultralytics.utils.torch_utils import unwrap_model
10
10
 
11
11
 
12
12
  class WorldTrainerFromScratch(WorldTrainer):
@@ -101,7 +101,7 @@ class WorldTrainerFromScratch(WorldTrainer):
101
101
  Returns:
102
102
  (YOLOConcatDataset | Dataset): The constructed dataset for training or validation.
103
103
  """
104
- gs = max(int(de_parallel(self.model).stride.max() if self.model else 0), 32)
104
+ gs = max(int(unwrap_model(self.model).stride.max() if self.model else 0), 32)
105
105
  if mode != "train":
106
106
  return build_yolo_dataset(self.args, img_path, batch, self.data, mode=mode, rect=False, stride=gs)
107
107
  datasets = [
@@ -13,7 +13,7 @@ from ultralytics.data.augment import LoadVisualPrompt
13
13
  from ultralytics.models.yolo.detect import DetectionTrainer, DetectionValidator
14
14
  from ultralytics.nn.tasks import YOLOEModel
15
15
  from ultralytics.utils import DEFAULT_CFG, LOGGER, RANK
16
- from ultralytics.utils.torch_utils import de_parallel
16
+ from ultralytics.utils.torch_utils import unwrap_model
17
17
 
18
18
  from ..world.train_world import WorldTrainerFromScratch
19
19
  from .val import YOLOEDetectValidator
@@ -39,9 +39,6 @@ class YOLOETrainer(DetectionTrainer):
39
39
  """
40
40
  Initialize the YOLOE Trainer with specified configurations.
41
41
 
42
- This method sets up the YOLOE trainer with the provided configuration and overrides, initializing
43
- the training environment, model, and callbacks for YOLOE object detection training.
44
-
45
42
  Args:
46
43
  cfg (dict): Configuration dictionary with default training settings from DEFAULT_CFG.
47
44
  overrides (dict, optional): Dictionary of parameter overrides for the default configuration.
@@ -102,7 +99,7 @@ class YOLOETrainer(DetectionTrainer):
102
99
  Returns:
103
100
  (Dataset): YOLO dataset configured for training or validation.
104
101
  """
105
- gs = max(int(de_parallel(self.model).stride.max() if self.model else 0), 32)
102
+ gs = max(int(unwrap_model(self.model).stride.max() if self.model else 0), 32)
106
103
  return build_yolo_dataset(
107
104
  self.args, img_path, batch, self.data, mode=mode, rect=mode == "val", stride=gs, multi_modal=mode == "train"
108
105
  )
@@ -223,7 +220,7 @@ class YOLOETrainerFromScratch(YOLOETrainer, WorldTrainerFromScratch):
223
220
  return txt_map
224
221
  LOGGER.info(f"Caching text embeddings to '{cache_path}'")
225
222
  assert self.model is not None
226
- txt_feats = de_parallel(self.model).get_text_pe(texts, batch, without_reprta=True, cache_clip_model=False)
223
+ txt_feats = unwrap_model(self.model).get_text_pe(texts, batch, without_reprta=True, cache_clip_model=False)
227
224
  txt_map = dict(zip(texts, txt_feats.squeeze(0)))
228
225
  torch.save(txt_map, cache_path)
229
226
  return txt_map
@@ -313,9 +310,3 @@ class YOLOEVPTrainer(YOLOETrainerFromScratch):
313
310
  d.transforms.append(LoadVisualPrompt())
314
311
  else:
315
312
  self.train_loader.dataset.transforms.append(LoadVisualPrompt())
316
-
317
- def preprocess_batch(self, batch):
318
- """Preprocess a batch of images for YOLOE training, moving visual prompts to the appropriate device."""
319
- batch = super().preprocess_batch(batch)
320
- batch["visuals"] = batch["visuals"].to(self.device, non_blocking=True)
321
- return batch
@@ -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.
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
@@ -260,7 +260,7 @@ class v8DetectionLoss:
260
260
 
261
261
  # Targets
262
262
  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]])
263
+ targets = self.preprocess(targets, batch_size, scale_tensor=imgsz[[1, 0, 1, 0]])
264
264
  gt_labels, gt_bboxes = targets.split((1, 4), 2) # cls, xyxy
265
265
  mask_gt = gt_bboxes.sum(2, keepdim=True).gt_(0.0)
266
266
 
@@ -287,9 +287,14 @@ class v8DetectionLoss:
287
287
 
288
288
  # Bbox loss
289
289
  if fg_mask.sum():
290
- target_bboxes /= stride_tensor
291
290
  loss[0], loss[2] = self.bbox_loss(
292
- pred_distri, pred_bboxes, anchor_points, target_bboxes, target_scores, target_scores_sum, fg_mask
291
+ pred_distri,
292
+ pred_bboxes,
293
+ anchor_points,
294
+ target_bboxes / stride_tensor,
295
+ target_scores,
296
+ target_scores_sum,
297
+ fg_mask,
293
298
  )
294
299
 
295
300
  loss[0] *= self.hyp.box # box gain
@@ -329,7 +334,7 @@ class v8SegmentationLoss(v8DetectionLoss):
329
334
  try:
330
335
  batch_idx = batch["batch_idx"].view(-1, 1)
331
336
  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]])
337
+ targets = self.preprocess(targets, batch_size, scale_tensor=imgsz[[1, 0, 1, 0]])
333
338
  gt_labels, gt_bboxes = targets.split((1, 4), 2) # cls, xyxy
334
339
  mask_gt = gt_bboxes.sum(2, keepdim=True).gt_(0.0)
335
340
  except RuntimeError as e:
@@ -388,7 +393,7 @@ class v8SegmentationLoss(v8DetectionLoss):
388
393
  loss[2] *= self.hyp.cls # cls gain
389
394
  loss[3] *= self.hyp.dfl # dfl gain
390
395
 
391
- return loss * batch_size, loss.detach() # loss(box, cls, dfl)
396
+ return loss * batch_size, loss.detach() # loss(box, seg, cls, dfl)
392
397
 
393
398
  @staticmethod
394
399
  def single_mask_loss(
@@ -516,7 +521,7 @@ class v8PoseLoss(v8DetectionLoss):
516
521
  batch_size = pred_scores.shape[0]
517
522
  batch_idx = batch["batch_idx"].view(-1, 1)
518
523
  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]])
524
+ targets = self.preprocess(targets, batch_size, scale_tensor=imgsz[[1, 0, 1, 0]])
520
525
  gt_labels, gt_bboxes = targets.split((1, 4), 2) # cls, xyxy
521
526
  mask_gt = gt_bboxes.sum(2, keepdim=True).gt_(0.0)
522
527
 
@@ -704,7 +709,7 @@ class v8OBBLoss(v8DetectionLoss):
704
709
  targets = torch.cat((batch_idx, batch["cls"].view(-1, 1), batch["bboxes"].view(-1, 5)), 1)
705
710
  rw, rh = targets[:, 4] * imgsz[0].item(), targets[:, 5] * imgsz[1].item()
706
711
  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]])
712
+ targets = self.preprocess(targets, batch_size, scale_tensor=imgsz[[1, 0, 1, 0]])
708
713
  gt_labels, gt_bboxes = targets.split((1, 5), 2) # cls, xywhr
709
714
  mask_gt = gt_bboxes.sum(2, keepdim=True).gt_(0.0)
710
715
  except RuntimeError as e:
ultralytics/utils/nms.py CHANGED
@@ -192,6 +192,7 @@ class TorchNMS:
192
192
  iou_threshold: float,
193
193
  use_triu: bool = True,
194
194
  iou_func=box_iou,
195
+ exit_early: bool = True,
195
196
  ) -> torch.Tensor:
196
197
  """
197
198
  Fast-NMS implementation from https://arxiv.org/pdf/1904.02689 using upper triangular matrix operations.
@@ -202,6 +203,7 @@ class TorchNMS:
202
203
  iou_threshold (float): IoU threshold for suppression.
203
204
  use_triu (bool): Whether to use torch.triu operator for upper triangular matrix operations.
204
205
  iou_func (callable): Function to compute IoU between boxes.
206
+ exit_early (bool): Whether to exit early if there are no boxes.
205
207
 
206
208
  Returns:
207
209
  (torch.Tensor): Indices of boxes to keep after NMS.
@@ -212,7 +214,7 @@ class TorchNMS:
212
214
  >>> scores = torch.tensor([0.9, 0.8])
213
215
  >>> keep = TorchNMS.nms(boxes, scores, 0.5)
214
216
  """
215
- if boxes.numel() == 0:
217
+ if boxes.numel() == 0 and exit_early:
216
218
  return torch.empty((0,), dtype=torch.int64, device=boxes.device)
217
219
 
218
220
  sorted_idx = torch.argsort(scores, descending=True)
@@ -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,76 @@ 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 attempt_compile(
1010
+ model: torch.nn.Module,
1011
+ device: torch.device,
1012
+ imgsz: int = 640,
1013
+ use_autocast: bool = False,
1014
+ warmup: bool = False,
1015
+ prefix: str = colorstr("compile:"),
1016
+ ) -> torch.nn.Module:
1017
+ """
1018
+ Compile a model with torch.compile and optionally warm up the graph to reduce first-iteration latency.
1019
+
1020
+ This utility attempts to compile the provided model using the inductor backend with dynamic shapes enabled and an
1021
+ autotuning mode. If compilation is unavailable or fails, the original model is returned unchanged. An optional
1022
+ warmup performs a single forward pass on a dummy input to prime the compiled graph and measure compile/warmup time.
1023
+
1024
+ Args:
1025
+ model (torch.nn.Module): Model to compile.
1026
+ device (torch.device): Inference device used for warmup and autocast decisions.
1027
+ imgsz (int, optional): Square input size to create a dummy tensor with shape (1, 3, imgsz, imgsz) for warmup.
1028
+ use_autocast (bool, optional): Whether to run warmup under autocast on CUDA or MPS devices.
1029
+ warmup (bool, optional): Whether to execute a single dummy forward pass to warm up the compiled model.
1030
+ prefix (str, optional): Message prefix for logger output.
1031
+
1032
+ Returns:
1033
+ model (torch.nn.Module): Compiled model if compilation succeeds, otherwise the original unmodified model.
1034
+
1035
+ Notes:
1036
+ - If the current PyTorch build does not provide torch.compile, the function returns the input model immediately.
1037
+ - Warmup runs under torch.inference_mode and may use torch.autocast for CUDA/MPS to align compute precision.
1038
+ - CUDA devices are synchronized after warmup to account for asynchronous kernel execution.
1039
+
1040
+ Examples:
1041
+ >>> device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
1042
+ >>> # Try to compile and warm up a model with a 640x640 input
1043
+ >>> model = attempt_compile(model, device=device, imgsz=640, use_autocast=True, warmup=True)
1044
+ """
1045
+ if not hasattr(torch, "compile"):
1046
+ return model
1047
+
1048
+ LOGGER.info(f"{prefix} starting torch.compile...")
1049
+ t0 = time.perf_counter()
1050
+ try:
1051
+ model = torch.compile(model, mode="max-autotune", backend="inductor")
1052
+ except Exception as e:
1053
+ LOGGER.warning(f"{prefix} torch.compile failed, continuing uncompiled: {e}")
1054
+ return model
1055
+ t_compile = time.perf_counter() - t0
1056
+
1057
+ t_warm = 0.0
1058
+ if warmup:
1059
+ # Use a single dummy tensor to build the graph shape state and reduce first-iteration latency
1060
+ dummy = torch.zeros(1, 3, imgsz, imgsz, device=device)
1061
+ if use_autocast and device.type == "cuda":
1062
+ dummy = dummy.half()
1063
+ t1 = time.perf_counter()
1064
+ with torch.inference_mode():
1065
+ if use_autocast and device.type in {"cuda", "mps"}:
1066
+ with torch.autocast(device.type):
1067
+ _ = model(dummy)
1068
+ else:
1069
+ _ = model(dummy)
1070
+ if device.type == "cuda":
1071
+ torch.cuda.synchronize(device)
1072
+ t_warm = time.perf_counter() - t1
1073
+
1074
+ total = t_compile + t_warm
1075
+ if warmup:
1076
+ LOGGER.info(f"{prefix} complete in {total:.1f}s (compile {t_compile:.1f}s + warmup {t_warm:.1f}s)")
1077
+ else:
1078
+ LOGGER.info(f"{prefix} compile complete in {t_compile:.1f}s (no warmup)")
1079
+ 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.197
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=z_P4EQKfcjM3hGCrxHHRLjWiIR1SU0oCaCjU9htTGDE,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
@@ -35,6 +35,7 @@ ultralytics/cfg/datasets/coco8-multispectral.yaml,sha256=nlU4W0d8rl1cVChthOk0NIm
35
35
  ultralytics/cfg/datasets/coco8-pose.yaml,sha256=GfSONSl-Oh4QErto91E_ws3im9ZTEYmDMaPOaSLLdV8,1009
36
36
  ultralytics/cfg/datasets/coco8-seg.yaml,sha256=Ez42ZE6xHlj8lcjtMBJJP2Y460q2BuiwRfk090XnBgE,1913
37
37
  ultralytics/cfg/datasets/coco8.yaml,sha256=tzrDY1KW82AHsgpCxte_yPkgMIIpNY6Pb4F46TDPxkk,1888
38
+ ultralytics/cfg/datasets/construction-ppe.yaml,sha256=pSU9yaAXV369EYQJymNtFQbS_XH4V369gPKKjDrb4ho,1008
38
39
  ultralytics/cfg/datasets/crack-seg.yaml,sha256=fqvSIq1fRXO55V_g2T92hcYAVoKBHZsSZQR7CokoPUI,837
39
40
  ultralytics/cfg/datasets/dog-pose.yaml,sha256=sRU1JDtEC4nLVf2vkn7lxbp4ILWNcgE-ok96rxZv2lc,908
40
41
  ultralytics/cfg/datasets/dota8-multispectral.yaml,sha256=2lMBi1Q3_pc0auK00yX80oF7oUMo0bUlwjkOrp33hvs,1216
@@ -106,9 +107,9 @@ ultralytics/cfg/trackers/botsort.yaml,sha256=TpRaK5kH_-QbjCQ7ekM4s_7j8I8ti3q8Hs7
106
107
  ultralytics/cfg/trackers/bytetrack.yaml,sha256=6u-tiZlk16EqEwkNXaMrza6PAQmWj_ypgv26LGCtPDg,886
107
108
  ultralytics/data/__init__.py,sha256=nAXaL1puCc7z_NjzQNlJnhbVhT9Fla2u7Dsqo7q1dAc,644
108
109
  ultralytics/data/annotator.py,sha256=f15TCDEM8SuuzHiFB8oyhTy9vfywKmPTLSPAgsZQP9I,2990
109
- ultralytics/data/augment.py,sha256=zyO8fjeiOlwF_xi3ATTforsV66KYzWYENFd71HC8oAA,132890
110
+ ultralytics/data/augment.py,sha256=3ArOOP1dSnCfQRHIQ6og-XFsaLnSqrXYtx-tpbE4Kag,132893
110
111
  ultralytics/data/base.py,sha256=gWoGFifyNe1TCwtGdGp5jzKOQ9sh4b-XrfyN0PPvRaY,19661
111
- ultralytics/data/build.py,sha256=9Qytj451Ml7lFbGNFpslrh4Jt9EucAqL0ic_6veySnk,11511
112
+ ultralytics/data/build.py,sha256=Bhu8E-FNSkTbz6YpNXeUBmQtN91ZtZxOCUiKYXgzV-c,11778
112
113
  ultralytics/data/converter.py,sha256=N1YFD0mG7uwL12wMcuVtF2zbISBIzTsGiy1QioDTDGs,32049
113
114
  ultralytics/data/dataset.py,sha256=AfWOLsLKjTDHRtSqODKk5OsD3ViETZTKxY4PKP2Jo5Q,36751
114
115
  ultralytics/data/loaders.py,sha256=sfQ0C86uBg9QQbN3aU0W8FIjGQmMdJTQAMK4DA1bjk8,31748
@@ -120,13 +121,13 @@ ultralytics/data/scripts/get_coco.sh,sha256=UuJpJeo3qQpTHVINeOpmP0NYmg8PhEFE3A8J
120
121
  ultralytics/data/scripts/get_coco128.sh,sha256=qmRQl_hOKrsdHrTrnyQuFIH01oDz3lfaz138OgGfLt8,650
121
122
  ultralytics/data/scripts/get_imagenet.sh,sha256=hr42H16bM47iT27rgS7MpEo-GeOZAYUQXgr0B2cwn48,1705
122
123
  ultralytics/engine/__init__.py,sha256=lm6MckFYCPTbqIoX7w0s_daxdjNeBeKW6DXppv1-QUM,70
123
- ultralytics/engine/exporter.py,sha256=c7OXFm9qBliL9zVL5g8_hVp8dVwZd3L-MnwSZDPLVrw,75428
124
- ultralytics/engine/model.py,sha256=1n5oqCDJYzRWPU0-79hc6txCIGpXmZVTnB-ae9nahRc,53488
125
- ultralytics/engine/predictor.py,sha256=PPDwvw-pVhLCefRJL7bcu4kYOCmcZBoYVHF8vfEemAo,22625
124
+ ultralytics/engine/exporter.py,sha256=K4Ga3CSt7mFEgbnOAIe0fvztfJDkDOFrROC21WqMGN8,75004
125
+ ultralytics/engine/model.py,sha256=iwwaL2NR5NSwQ7R3juHzS3ds9W-CfhC_CjUcwMvcgsk,53426
126
+ ultralytics/engine/predictor.py,sha256=510VPYcYmEYPJmBiApQLGaFFAL4gd79rVzPCwisH7LE,22745
126
127
  ultralytics/engine/results.py,sha256=BmhePCaaTBfYrJT12t6bywZuZ_7h3tIc4IsRFuyNTdk,71499
127
- ultralytics/engine/trainer.py,sha256=_mTG-z6xnOdFUmB6uOF8HQkFb_uMwP0MrJHlt7X3zVw,40457
128
+ ultralytics/engine/trainer.py,sha256=4DFtGOS6II6vD7tUPNgSK45DgzFjUSkPRvpnXijs4Ew,40914
128
129
  ultralytics/engine/tuner.py,sha256=XuqcjyGpD79pUVn-PXlJJGKXgH1yblPdYBH_R2kHWSU,20586
129
- ultralytics/engine/validator.py,sha256=8ky0lcMCYDY7RGYRUowDAKxEMfsPBLpT7LlgfHA-IsY,16681
130
+ ultralytics/engine/validator.py,sha256=7tADPOXRZz0Yi7F-Z5SxcUnwytaa2MfbtuSdO8pp_l4,16966
130
131
  ultralytics/hub/__init__.py,sha256=xCF02lzlPKbdmGfO3NxLuXl5Kb0MaBZp_-fAWDHZ8zw,6698
131
132
  ultralytics/hub/auth.py,sha256=RIwZDWfW6vS2yGpZKR0xVl0-38itJYEFtmqY_M70bl8,6304
132
133
  ultralytics/hub/session.py,sha256=1o9vdd_fvPUHQ5oZgljtPePuPMUalIoXqOvE7Sdmd2o,18450
@@ -168,35 +169,35 @@ ultralytics/models/yolo/__init__.py,sha256=or0j5xvcM0usMlsFTYhNAOcQUri7reD0cD9JR
168
169
  ultralytics/models/yolo/model.py,sha256=b_F1AeBUgiSssRxZ-rGQVdB0a37rDG92h_03o0N29B8,18761
169
170
  ultralytics/models/yolo/classify/__init__.py,sha256=9--HVaNOfI1K7rn_rRqclL8FUAnpfeBrRqEQIaQw2xM,383
170
171
  ultralytics/models/yolo/classify/predict.py,sha256=o7pDE8xwjkHUUIIOph7ZVQZyGZyob24dYDQ460v_7R0,4149
171
- ultralytics/models/yolo/classify/train.py,sha256=DzwXQII2qf5KvSoEi03onppQpLPR1EcHowrjS5pnbVQ,10296
172
+ ultralytics/models/yolo/classify/train.py,sha256=CXi8ZrVqYtqlzRbg3UP5kOyMYXAM4Wex8Ii0fDyv-iA,9840
172
173
  ultralytics/models/yolo/classify/val.py,sha256=6_-pbnb0skASJCqsar6_i3FyvfKNJwZ7Y8AK7wzySIU,10039
173
174
  ultralytics/models/yolo/detect/__init__.py,sha256=GIRsLYR-kT4JJx7lh4ZZAFGBZj0aebokuU0A7JbjDVA,257
174
175
  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
176
+ ultralytics/models/yolo/detect/train.py,sha256=8t_dou6LKE_Td71cDdRUzEVaXMipOYUv1mcnfspDqyI,10749
177
+ ultralytics/models/yolo/detect/val.py,sha256=OG38-x3LyCAeH3UY9jOG4axK7mfnVnTwaKpjMzQi07I,21309
177
178
  ultralytics/models/yolo/obb/__init__.py,sha256=tQmpG8wVHsajWkZdmD6cjGohJ4ki64iSXQT8JY_dydo,221
178
179
  ultralytics/models/yolo/obb/predict.py,sha256=4r1eSld6TNJlk9JG56e-DX6oPL8uBBqiuztyBpxWlHE,2888
179
- ultralytics/models/yolo/obb/train.py,sha256=y-9c6jNLXVx6qxE1PGVFzG1N1LYg4wFeXD94FsjJ1CE,3910
180
+ ultralytics/models/yolo/obb/train.py,sha256=BbehrsKP0lHRV3v7rrw8wAeiDdc-szbhHAmDy0OdhoM,3461
180
181
  ultralytics/models/yolo/obb/val.py,sha256=ZNjdI5dF-igZCqJadAUb5VPTevI5i47G-bPTG8wV-CY,14171
181
182
  ultralytics/models/yolo/pose/__init__.py,sha256=63xmuHZLNzV8I76HhVXAq4f2W0KTk8Oi9eL-Y204LyQ,227
182
183
  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
184
+ ultralytics/models/yolo/pose/train.py,sha256=WdCEgbdxKvPEH-81tF-pNjrXHck7uTlqUONyKVxq_n4,5004
185
+ ultralytics/models/yolo/pose/val.py,sha256=U4tMWbHpCjspJ6i5DbNUav05RFCvwvfD1mjejqJIJ1c,12638
185
186
  ultralytics/models/yolo/segment/__init__.py,sha256=3IThhZ1wlkY9FvmWm9cE-5-ZyE6F1FgzAtQ6jOOFzzw,275
186
187
  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
188
+ ultralytics/models/yolo/segment/train.py,sha256=Om8snA0fOvddFVZNHrUYfu4admJXxmsVlMQAKOnkwpk,3253
189
+ ultralytics/models/yolo/segment/val.py,sha256=oyiscSgMWdfmbdNJrumnPoSX6-gZXMx4XnfbX5Hc-RY,11158
189
190
  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
191
+ ultralytics/models/yolo/world/train.py,sha256=zVPtVoBedberGkth3tPuIH665HjGNJvTMLw_wLZQM84,7870
192
+ ultralytics/models/yolo/world/train_world.py,sha256=9p9YIckrATaJjGOrpmuC8MbZX9qdoCPCEV9EGZ0sExg,9553
192
193
  ultralytics/models/yolo/yoloe/__init__.py,sha256=6SLytdJtwu37qewf7CobG7C7Wl1m-xtNdvCXEasfPDE,760
193
194
  ultralytics/models/yolo/yoloe/predict.py,sha256=pcbAUbosr1Xc436MfQi6ah3MQ6kkPzjOcltmdA3VMDE,7124
194
- ultralytics/models/yolo/yoloe/train.py,sha256=h11Hw-XnHfg_GPf6DrR3nMqGgQJg14rafiRZe5gVFdM,14067
195
+ ultralytics/models/yolo/yoloe/train.py,sha256=jcXqGm8CReOCVMFLk-1bNe0Aw5PWaaQa8xBWxtrt5TY,13571
195
196
  ultralytics/models/yolo/yoloe/train_seg.py,sha256=aCV7M8oQOvODFnU4piZdJh3tIrBJYAzZfRVRx1vRgxo,4956
196
- ultralytics/models/yolo/yoloe/val.py,sha256=MnS2YwhRxdqXPRlExHt-9HRp8KKIHuFdmiNH1z6LedI,9795
197
+ ultralytics/models/yolo/yoloe/val.py,sha256=Dn6CKpfcopDVxr-WY13ATDVb_RIzQ-wsXSxxy_mpndA,9454
197
198
  ultralytics/nn/__init__.py,sha256=PJgOn2phQTTBR2P3s_JWvGeGXQpvw1znsumKow4tCuE,545
198
199
  ultralytics/nn/autobackend.py,sha256=WWHIFvCI47Wpe3NCDkoUg3esjOTJ0XGEzG3luA_uG-8,41063
199
- ultralytics/nn/tasks.py,sha256=9EMkmdmYLEbQVAjin2joZfqc3UfgKrrADJZKOX6Ukjw,70400
200
+ ultralytics/nn/tasks.py,sha256=2MnuL8plr4oE_gpSIeSbCYrbkdMXdludQWWj_liWsv8,70404
200
201
  ultralytics/nn/text_model.py,sha256=pHqnKe8UueR1MuwJcIE_IvrnYIlt68QL796xjcRJs2A,15275
201
202
  ultralytics/nn/modules/__init__.py,sha256=BPMbEm1daI7Tuds3zph2_afAX7Gq1uAqK8BfiCfKTZs,3198
202
203
  ultralytics/nn/modules/activation.py,sha256=75JcIMH2Cu9GTC2Uf55r_5YLpxcrXQDaVoeGQ0hlUAU,2233
@@ -235,11 +236,11 @@ ultralytics/trackers/utils/__init__.py,sha256=lm6MckFYCPTbqIoX7w0s_daxdjNeBeKW6D
235
236
  ultralytics/trackers/utils/gmc.py,sha256=1cCmlbk5Z6Pd-rFCaiJML7o_cUm_IktMuCocTDOMGFQ,14028
236
237
  ultralytics/trackers/utils/kalman_filter.py,sha256=PPmM0lwBMdT_hGojvfLoUsBUFMBBMNRAxKbMcQa3wJ0,21619
237
238
  ultralytics/trackers/utils/matching.py,sha256=I8SX0sBaBgr4GBJ9uDGOy5LnotgNZHpB2p5RNF1sy-s,7160
238
- ultralytics/utils/__init__.py,sha256=8vYownbjAVDmRc2cafLetRjcq-YsUcy1LPKmSrz5yuM,53204
239
+ ultralytics/utils/__init__.py,sha256=whSIuj-0lV0SAp4YjOeBJZ2emP1Qa8pqLnrhRiwl2Qs,53503
239
240
  ultralytics/utils/autobatch.py,sha256=i6KYLLSItKP1Q2IUlTPHrZhjcxl7UOjs0Seb8bF8pvM,5124
240
241
  ultralytics/utils/autodevice.py,sha256=d9yq6eEn05fdfzfpxeSECd0YEO61er5f7T-0kjLdofg,8843
241
242
  ultralytics/utils/benchmarks.py,sha256=lcIr--oKK0TCjUVbvrm-NtYrnszrEMuHJC9__ziM7y8,31458
242
- ultralytics/utils/checks.py,sha256=nKb8qnqhEZKoLPdsQ4oBcKFU9Ngw6u0pdOOjxNhy46E,34468
243
+ ultralytics/utils/checks.py,sha256=Jw5pwREBnlyrq3zbiHEwiQXir2-f7dGpXeqY_PgoNpw,34518
243
244
  ultralytics/utils/cpu.py,sha256=OPlVxROWhQp-kEa9EkeNRKRQ-jz0KwySu5a-h91JZjk,3634
244
245
  ultralytics/utils/dist.py,sha256=g7OKPrSgjIB2wgcncSFYtFuR-uW6J0-Y1z76k4gDSz0,4170
245
246
  ultralytics/utils/downloads.py,sha256=JIlHfUg-qna5aOHRJupH7d5zob2qGZtRrs86Cp3zOJs,23029
@@ -250,14 +251,14 @@ ultralytics/utils/files.py,sha256=kxE2rkBuZL288nSN7jxLljmDnBgc16rekEXeRjhbUoo,82
250
251
  ultralytics/utils/git.py,sha256=DcaxKNQfCiG3cxdzuw7M6l_VXgaSVqkERQt_vl8UyXM,5512
251
252
  ultralytics/utils/instance.py,sha256=_b_jMTECWJGzncCiTg7FtTDSSeXGnbiAhaJhIsqbn9k,19043
252
253
  ultralytics/utils/logger.py,sha256=o_vH4CCgQat6_Sbmwm1sUAJ4muAgVcsUed-WqpGNQZw,15129
253
- ultralytics/utils/loss.py,sha256=sC2efov3Uwg2eT5oOzMHRfnQLZvtGXSdMuWBTKxyxPw,39816
254
+ ultralytics/utils/loss.py,sha256=wJ0F2DpRTI9-e9adxIm2io0zcXRa0RTWFTOc7WmS1-A,39827
254
255
  ultralytics/utils/metrics.py,sha256=xFlSqx_su96LAUpxfGP7ShEG50Qo5p5OtwR3hx4_Llc,68809
255
- ultralytics/utils/nms.py,sha256=pcAaKIMssVGX3jlFmEEm6P_SL9PrXsTgu0rpx-_TDi8,14199
256
+ ultralytics/utils/nms.py,sha256=4EdGNSkl8-AjMkghnuPQZR0lsZOW416bYfVsA9ZUOeU,14323
256
257
  ultralytics/utils/ops.py,sha256=PW3fgw1d18CA2ZNQZVJqUy054cJ_9tIcxd1XnA0FPgU,26905
257
258
  ultralytics/utils/patches.py,sha256=0-2G4jXCIPnMonlft-cPcjfFcOXQS6ODwUDNUwanfg4,6541
258
- ultralytics/utils/plotting.py,sha256=8ze3RFly61sA-qg22B7m7Jraac5LEIpI0MtJ4CZSjlc,47515
259
+ ultralytics/utils/plotting.py,sha256=rumZLvfLX1bE9xQS7Gk13kVM7AmIxQOmQ5CAmhsdxCE,47531
259
260
  ultralytics/utils/tal.py,sha256=LrziY_ZHz4wln3oOnqAzgyPaXKoup17Sa103BpuaQFU,20935
260
- ultralytics/utils/torch_utils.py,sha256=4TCiWXepEdUdR-WPVVScS7lhMAEWCInNwfoX0XXdmo8,39181
261
+ ultralytics/utils/torch_utils.py,sha256=tEhRGVPaKKtVeDpN1K171up585DNe19un8y1ri70Zn8,42869
261
262
  ultralytics/utils/tqdm.py,sha256=ny5RIg2OTkWQ7gdaXfYaoIgR0Xn2_hNGB6tUpO2Unns,16137
262
263
  ultralytics/utils/triton.py,sha256=fbMfTAUyoGiyslWtySzLZw53XmZJa7rF31CYFot0Wjs,5422
263
264
  ultralytics/utils/tuner.py,sha256=9D4dSIvwwxcNSJcH2QJ92qiIVi9zu-1L7_PBZ8okDyE,6816
@@ -271,11 +272,11 @@ ultralytics/utils/callbacks/mlflow.py,sha256=6K8I5zij1yq3TUW9c5BBQNqdzz3IXugQjwK
271
272
  ultralytics/utils/callbacks/neptune.py,sha256=j8pecmlcsM8FGzLKWoBw5xUsi5t8E5HuxY7TR5Um_O8,4612
272
273
  ultralytics/utils/callbacks/platform.py,sha256=a7T_8htoBB0uX1WIc392UJnhDjxkRyQMvhPYKR6wUTU,2008
273
274
  ultralytics/utils/callbacks/raytune.py,sha256=S6Bq16oQDQ8BQgnZzA0zJHGN_BBr8iAM_WtGoLiEcwg,1283
274
- ultralytics/utils/callbacks/tensorboard.py,sha256=MDPBW7aDes-66OE6YqKXXvqA_EocjzEMHWGM-8z9vUQ,5281
275
+ ultralytics/utils/callbacks/tensorboard.py,sha256=_4nfGK1dDLn6ijpvphBDhc-AS8qhS3jjY2CAWB7SNF0,5283
275
276
  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,,
277
+ ultralytics-8.3.197.dist-info/licenses/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
278
+ ultralytics-8.3.197.dist-info/METADATA,sha256=UBxGQHTpx_vAFHAuScNN-uFzFLJdy1GSXOQV6wvLGjM,37667
279
+ ultralytics-8.3.197.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
280
+ ultralytics-8.3.197.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
281
+ ultralytics-8.3.197.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
282
+ ultralytics-8.3.197.dist-info/RECORD,,