ultralytics 8.1.45__py3-none-any.whl → 8.1.46__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of ultralytics might be problematic. Click here for more details.

ultralytics/__init__.py CHANGED
@@ -1,6 +1,6 @@
1
1
  # Ultralytics YOLO 🚀, AGPL-3.0 license
2
2
 
3
- __version__ = "8.1.45"
3
+ __version__ = "8.1.46"
4
4
 
5
5
  from ultralytics.data.explorer.explorer import Explorer
6
6
  from ultralytics.models import RTDETR, SAM, YOLO, YOLOWorld
@@ -975,17 +975,22 @@ class Format:
975
975
  1 if self.mask_overlap else nl, img.shape[0] // self.mask_ratio, img.shape[1] // self.mask_ratio
976
976
  )
977
977
  labels["masks"] = masks
978
- if self.normalize:
979
- instances.normalize(w, h)
980
978
  labels["img"] = self._format_img(img)
981
979
  labels["cls"] = torch.from_numpy(cls) if nl else torch.zeros(nl)
982
980
  labels["bboxes"] = torch.from_numpy(instances.bboxes) if nl else torch.zeros((nl, 4))
983
981
  if self.return_keypoint:
984
982
  labels["keypoints"] = torch.from_numpy(instances.keypoints)
983
+ if self.normalize:
984
+ labels["keypoints"][..., 0] /= w
985
+ labels["keypoints"][..., 1] /= h
985
986
  if self.return_obb:
986
987
  labels["bboxes"] = (
987
988
  xyxyxyxy2xywhr(torch.from_numpy(instances.segments)) if len(instances.segments) else torch.zeros((0, 5))
988
989
  )
990
+ # NOTE: need to normalize obb in xywhr format for width-height consistency
991
+ if self.normalize:
992
+ labels["bboxes"][:, [0, 2]] /= w
993
+ labels["bboxes"][:, [1, 3]] /= h
989
994
  # Then we can use collate_fn
990
995
  if self.batch_idx:
991
996
  labels["batch_idx"] = torch.zeros(nl)
@@ -529,12 +529,16 @@ class Exporter:
529
529
  f"or in {ROOT}. See PNNX repo for full installation instructions."
530
530
  )
531
531
  system = "macos" if MACOS else "windows" if WINDOWS else "linux-aarch64" if ARM64 else "linux"
532
- _, assets = get_github_assets(repo="pnnx/pnnx", retry=True)
533
- if assets:
534
- url = [x for x in assets if f"{system}.zip" in x][0]
535
- else:
536
- url = f"https://github.com/pnnx/pnnx/releases/download/20240226/pnnx-20240226-{system}.zip"
537
- LOGGER.warning(f"{prefix} WARNING ⚠️ PNNX GitHub assets not found, using default {url}")
532
+
533
+ # PNNX link fixed at 20240226 due to bug in 20240410
534
+ # try:
535
+ # _, assets = get_github_assets(repo="pnnx/pnnx", retry=True)
536
+ # url = [x for x in assets if f"{system}.zip" in x][0]
537
+ # except Exception as e:
538
+ # url = f"https://github.com/pnnx/pnnx/releases/download/20240226/pnnx-20240226-{system}.zip"
539
+ # LOGGER.warning(f"{prefix} WARNING ⚠️ PNNX GitHub assets not found: {e}, using default {url}")
540
+
541
+ url = f"https://github.com/pnnx/pnnx/releases/download/20240226/pnnx-20240226-{system}.zip"
538
542
  asset = attempt_download_asset(url, repo="pnnx/pnnx", release="latest")
539
543
  if check_is_path_safe(Path.cwd(), asset): # avoid path traversal security vulnerability
540
544
  unzip_dir = Path(asset).with_suffix("")
@@ -654,6 +658,7 @@ class Exporter:
654
658
  def export_engine(self, prefix=colorstr("TensorRT:")):
655
659
  """YOLOv8 TensorRT export https://developer.nvidia.com/tensorrt."""
656
660
  assert self.im.device.type != "cpu", "export running on CPU but must be on GPU, i.e. use 'device=0'"
661
+ self.args.simplify = True
657
662
  f_onnx, _ = self.export_onnx() # run before trt import https://github.com/ultralytics/ultralytics/issues/7016
658
663
 
659
664
  try:
@@ -662,12 +667,10 @@ class Exporter:
662
667
  if LINUX:
663
668
  check_requirements("nvidia-tensorrt", cmds="-U --index-url https://pypi.ngc.nvidia.com")
664
669
  import tensorrt as trt # noqa
665
-
666
670
  check_version(trt.__version__, "7.0.0", hard=True) # require tensorrt>=7.0.0
667
671
 
668
- self.args.simplify = True
669
-
670
672
  LOGGER.info(f"\n{prefix} starting export with TensorRT {trt.__version__}...")
673
+ is_trt10 = int(trt.__version__.split(".")[0]) >= 10 # is TensorRT >= 10
671
674
  assert Path(f_onnx).exists(), f"failed to export ONNX file: {f_onnx}"
672
675
  f = self.file.with_suffix(".engine") # TensorRT engine file
673
676
  logger = trt.Logger(trt.Logger.INFO)
@@ -676,7 +679,11 @@ class Exporter:
676
679
 
677
680
  builder = trt.Builder(logger)
678
681
  config = builder.create_builder_config()
679
- config.max_workspace_size = int(self.args.workspace * (1 << 30))
682
+ workspace = int(self.args.workspace * (1 << 30))
683
+ if is_trt10:
684
+ config.set_memory_pool_limit(trt.MemoryPoolType.WORKSPACE, workspace)
685
+ else: # TensorRT versions 7, 8
686
+ config.max_workspace_size = workspace
680
687
  flag = 1 << int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH)
681
688
  network = builder.create_network(flag)
682
689
  parser = trt.OnnxParser(network, logger)
@@ -695,27 +702,31 @@ class Exporter:
695
702
  if shape[0] <= 1:
696
703
  LOGGER.warning(f"{prefix} WARNING ⚠️ 'dynamic=True' model requires max batch size, i.e. 'batch=16'")
697
704
  profile = builder.create_optimization_profile()
705
+ min_shape = (1, shape[1], 32, 32) # minimum input shape
706
+ opt_shape = (max(1, shape[0] // 2), *shape[1:]) # optimal input shape
707
+ max_shape = (*shape[:2], *(max(1, self.args.workspace) * d for d in shape[2:])) # max input shape
698
708
  for inp in inputs:
699
- profile.set_shape(inp.name, (1, *shape[1:]), (max(1, shape[0] // 2), *shape[1:]), shape)
709
+ profile.set_shape(inp.name, min_shape, opt_shape, max_shape)
700
710
  config.add_optimization_profile(profile)
701
711
 
702
- LOGGER.info(
703
- f"{prefix} building FP{16 if builder.platform_has_fast_fp16 and self.args.half else 32} engine as {f}"
704
- )
705
- if builder.platform_has_fast_fp16 and self.args.half:
712
+ half = builder.platform_has_fast_fp16 and self.args.half
713
+ LOGGER.info(f"{prefix} building FP{16 if half else 32} engine as {f}")
714
+ if half:
706
715
  config.set_flag(trt.BuilderFlag.FP16)
707
716
 
717
+ # Free CUDA memory
708
718
  del self.model
709
719
  torch.cuda.empty_cache()
710
720
 
711
721
  # Write file
712
- with builder.build_engine(network, config) as engine, open(f, "wb") as t:
722
+ build = builder.build_serialized_network if is_trt10 else builder.build_engine
723
+ with build(network, config) as engine, open(f, "wb") as t:
713
724
  # Metadata
714
725
  meta = json.dumps(self.metadata)
715
726
  t.write(len(meta).to_bytes(4, byteorder="little", signed=True))
716
727
  t.write(meta.encode())
717
728
  # Model
718
- t.write(engine.serialize())
729
+ t.write(engine if is_trt10 else engine.serialize())
719
730
 
720
731
  return f, None
721
732
 
@@ -234,23 +234,47 @@ class AutoBackend(nn.Module):
234
234
  meta_len = int.from_bytes(f.read(4), byteorder="little") # read metadata length
235
235
  metadata = json.loads(f.read(meta_len).decode("utf-8")) # read metadata
236
236
  model = runtime.deserialize_cuda_engine(f.read()) # read engine
237
- context = model.create_execution_context()
237
+
238
+ # Model context
239
+ try:
240
+ context = model.create_execution_context()
241
+ except Exception as e: # model is None
242
+ LOGGER.error(f"ERROR: TensorRT model exported with a different version than {trt.__version__}\n")
243
+ raise e
244
+
238
245
  bindings = OrderedDict()
239
246
  output_names = []
240
247
  fp16 = False # default updated below
241
248
  dynamic = False
242
- for i in range(model.num_bindings):
243
- name = model.get_binding_name(i)
244
- dtype = trt.nptype(model.get_binding_dtype(i))
245
- if model.binding_is_input(i):
246
- if -1 in tuple(model.get_binding_shape(i)): # dynamic
247
- dynamic = True
248
- context.set_binding_shape(i, tuple(model.get_profile_shape(0, i)[2]))
249
- if dtype == np.float16:
250
- fp16 = True
251
- else: # output
252
- output_names.append(name)
253
- shape = tuple(context.get_binding_shape(i))
249
+ is_trt10 = not hasattr(model, "num_bindings")
250
+ num = range(model.num_io_tensors) if is_trt10 else range(model.num_bindings)
251
+ for i in num:
252
+ if is_trt10:
253
+ name = model.get_tensor_name(i)
254
+ dtype = trt.nptype(model.get_tensor_dtype(name))
255
+ is_input = model.get_tensor_mode(name) == trt.TensorIOMode.INPUT
256
+ if is_input:
257
+ if -1 in tuple(model.get_tensor_shape(name)):
258
+ dynamic = True
259
+ context.set_input_shape(name, tuple(model.get_tensor_profile_shape(name, 0)[1]))
260
+ if dtype == np.float16:
261
+ fp16 = True
262
+ else:
263
+ output_names.append(name)
264
+ shape = tuple(context.get_tensor_shape(name))
265
+ else: # TensorRT < 10.0
266
+ name = model.get_binding_name(i)
267
+ dtype = trt.nptype(model.get_binding_dtype(i))
268
+ is_input = model.binding_is_input(i)
269
+ if model.binding_is_input(i):
270
+ if -1 in tuple(model.get_binding_shape(i)): # dynamic
271
+ dynamic = True
272
+ context.set_binding_shape(i, tuple(model.get_profile_shape(0, i)[1]))
273
+ if dtype == np.float16:
274
+ fp16 = True
275
+ else:
276
+ output_names.append(name)
277
+ shape = tuple(context.get_binding_shape(i))
254
278
  im = torch.from_numpy(np.empty(shape, dtype=dtype)).to(device)
255
279
  bindings[name] = Binding(name, dtype, shape, im, int(im.data_ptr()))
256
280
  binding_addrs = OrderedDict((n, d.ptr) for n, d in bindings.items())
@@ -463,13 +487,20 @@ class AutoBackend(nn.Module):
463
487
 
464
488
  # TensorRT
465
489
  elif self.engine:
466
- if self.dynamic and im.shape != self.bindings["images"].shape:
467
- i = self.model.get_binding_index("images")
468
- self.context.set_binding_shape(i, im.shape) # reshape if dynamic
469
- self.bindings["images"] = self.bindings["images"]._replace(shape=im.shape)
470
- for name in self.output_names:
471
- i = self.model.get_binding_index(name)
472
- self.bindings[name].data.resize_(tuple(self.context.get_binding_shape(i)))
490
+ if self.dynamic or im.shape != self.bindings["images"].shape:
491
+ if self.is_trt10:
492
+ self.context.set_input_shape("images", im.shape)
493
+ self.bindings["images"] = self.bindings["images"]._replace(shape=im.shape)
494
+ for name in self.output_names:
495
+ self.bindings[name].data.resize_(tuple(self.context.get_tensor_shape(name)))
496
+ else:
497
+ i = self.model.get_binding_index("images")
498
+ self.context.set_binding_shape(i, im.shape)
499
+ self.bindings["images"] = self.bindings["images"]._replace(shape=im.shape)
500
+ for name in self.output_names:
501
+ i = self.model.get_binding_index(name)
502
+ self.bindings[name].data.resize_(tuple(self.context.get_binding_shape(i)))
503
+
473
504
  s = self.bindings["images"].shape
474
505
  assert im.shape == s, f"input size {im.shape} {'>' if self.dynamic else 'not equal to'} max model size {s}"
475
506
  self.binding_addrs["images"] = int(im.data_ptr())
@@ -406,6 +406,20 @@ DEFAULT_CFG_KEYS = DEFAULT_CFG_DICT.keys()
406
406
  DEFAULT_CFG = IterableSimpleNamespace(**DEFAULT_CFG_DICT)
407
407
 
408
408
 
409
+ def read_device_model() -> str:
410
+ """
411
+ Reads the device model information from the system and caches it for quick access. Used by is_jetson() and
412
+ is_raspberrypi().
413
+
414
+ Returns:
415
+ (str): Model file contents if read successfully or empty string otherwise.
416
+ """
417
+ with contextlib.suppress(Exception):
418
+ with open("/proc/device-tree/model") as f:
419
+ return f.read()
420
+ return ""
421
+
422
+
409
423
  def is_ubuntu() -> bool:
410
424
  """
411
425
  Check if the OS is Ubuntu.
@@ -473,10 +487,18 @@ def is_raspberrypi() -> bool:
473
487
  Returns:
474
488
  (bool): True if running on a Raspberry Pi, False otherwise.
475
489
  """
476
- with contextlib.suppress(Exception):
477
- with open("/proc/device-tree/model") as f:
478
- return "Raspberry Pi" in f.read()
479
- return False
490
+ return "Raspberry Pi" in PROC_DEVICE_MODEL
491
+
492
+
493
+ def is_jetson() -> bool:
494
+ """
495
+ Determines if the Python environment is running on a Jetson Nano or Jetson Orin device by checking the device model
496
+ information.
497
+
498
+ Returns:
499
+ (bool): True if running on a Jetson Nano or Jetson Orin, False otherwise.
500
+ """
501
+ return "NVIDIA" in PROC_DEVICE_MODEL # i.e. "NVIDIA Jetson Nano" or "NVIDIA Orin NX"
480
502
 
481
503
 
482
504
  def is_online() -> bool:
@@ -658,9 +680,11 @@ def get_user_config_dir(sub_dir="Ultralytics"):
658
680
 
659
681
 
660
682
  # Define constants (required below)
683
+ PROC_DEVICE_MODEL = read_device_model() # is_jetson() and is_raspberrypi() depend on this constant
661
684
  ONLINE = is_online()
662
685
  IS_COLAB = is_colab()
663
686
  IS_DOCKER = is_docker()
687
+ IS_JETSON = is_jetson()
664
688
  IS_JUPYTER = is_jupyter()
665
689
  IS_KAGGLE = is_kaggle()
666
690
  IS_PIP_PACKAGE = is_pip_package()
@@ -696,8 +720,8 @@ def colorstr(*input):
696
720
  (str): The input string wrapped with ANSI escape codes for the specified color and style.
697
721
 
698
722
  Examples:
699
- >>> colorstr('blue', 'bold', 'hello world')
700
- >>> '\033[34m\033[1mhello world\033[0m'
723
+ >>> colorstr("blue", "bold", "hello world")
724
+ >>> "\033[34m\033[1mhello world\033[0m"
701
725
  """
702
726
  *args, string = input if len(input) > 1 else ("blue", "bold", input[0]) # color arguments, string
703
727
  colors = {
@@ -838,16 +838,16 @@ def plot_images(
838
838
  if len(bboxes):
839
839
  boxes = bboxes[idx]
840
840
  conf = confs[idx] if confs is not None else None # check for confidence presence (label vs pred)
841
- is_obb = boxes.shape[-1] == 5 # xywhr
842
- boxes = ops.xywhr2xyxyxyxy(boxes) if is_obb else ops.xywh2xyxy(boxes)
843
841
  if len(boxes):
844
842
  if boxes[:, :4].max() <= 1.1: # if normalized with tolerance 0.1
845
- boxes[..., 0::2] *= w # scale to pixels
846
- boxes[..., 1::2] *= h
843
+ boxes[..., [0, 2]] *= w # scale to pixels
844
+ boxes[..., [1, 3]] *= h
847
845
  elif scale < 1: # absolute coords need scale if image scales
848
846
  boxes[..., :4] *= scale
849
- boxes[..., 0::2] += x
850
- boxes[..., 1::2] += y
847
+ boxes[..., 0] += x
848
+ boxes[..., 1] += y
849
+ is_obb = boxes.shape[-1] == 5 # xywhr
850
+ boxes = ops.xywhr2xyxyxyxy(boxes) if is_obb else ops.xywh2xyxy(boxes)
851
851
  for j, box in enumerate(boxes.astype(np.int64).tolist()):
852
852
  c = classes[j]
853
853
  color = colors(c)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ultralytics
3
- Version: 8.1.45
3
+ Version: 8.1.46
4
4
  Summary: Ultralytics YOLOv8 for SOTA object detection, multi-object tracking, instance segmentation, pose estimation and image classification.
5
5
  Author: Glenn Jocher, Ayush Chaurasia, Jing Qiu
6
6
  Maintainer: Glenn Jocher, Ayush Chaurasia, Jing Qiu
@@ -1,4 +1,4 @@
1
- ultralytics/__init__.py,sha256=woyBAPoocn695Wx62yPcQtYwJzPlTyYdUxF6Xea4FIY,633
1
+ ultralytics/__init__.py,sha256=i5cjHS2lih5Cyjb9oi_FJ2xiNF4JWREpg0Kty0F48Gk,633
2
2
  ultralytics/assets/bus.jpg,sha256=wCAZxJecGR63Od3ZRERe9Aja1Weayrb9Ug751DS_vGM,137419
3
3
  ultralytics/assets/zidane.jpg,sha256=Ftc4aeMmen1O0A3o6GCDO9FlfBslLpTAw0gnetx7bts,50427
4
4
  ultralytics/cfg/__init__.py,sha256=ugSQqHCg31bAE9rwhVrnLMNzKLShr9JxDFcN6kBTbUk,21316
@@ -64,7 +64,7 @@ ultralytics/cfg/trackers/botsort.yaml,sha256=YrPmj18p1UU40kJH5NRdL_4S8f7knggkk_q
64
64
  ultralytics/cfg/trackers/bytetrack.yaml,sha256=QvHmtuwulK4X6j3T5VEqtCm0sbWWBUVmWPcCcM20qe0,688
65
65
  ultralytics/data/__init__.py,sha256=VGe-ATG7j35F4A4r8Jmzffjlhve4JAJPgRa5ahKTU18,616
66
66
  ultralytics/data/annotator.py,sha256=evXQzARVerc0hb9ol-n_GrrHf-dlXO4lCMMWEZoJ2UM,2117
67
- ultralytics/data/augment.py,sha256=M9ixb4z2N0acBH8euunz6pgHg14gwznxRHO6HZhbghs,57476
67
+ ultralytics/data/augment.py,sha256=8xJ5YKr5CWvrg5u0BMOsn-HxlIfAYUO2xi8hcyg6fLo,57740
68
68
  ultralytics/data/base.py,sha256=x7OEYorkCbPuymvZoCHXXaK9Y65DBs73ugMxSJJdUtE,13480
69
69
  ultralytics/data/build.py,sha256=Bq6hh3GgmvBx9LSMYUEj0t6COu3Xmc45zmF9QZbTkpM,7265
70
70
  ultralytics/data/converter.py,sha256=NLDiV67RshbKQnMJUiQQF11boVzEqgi2Hz39nKVAI4U,17528
@@ -78,7 +78,7 @@ ultralytics/data/explorer/utils.py,sha256=EvvukQiQUTBrsZznmMnyEX2EqTuwZo_Geyc8yf
78
78
  ultralytics/data/explorer/gui/__init__.py,sha256=mHtJuK4hwF8cuV-VHDc7tp6u6D1gHz2Z7JI8grmQDTs,42
79
79
  ultralytics/data/explorer/gui/dash.py,sha256=2oAbNroR2lfS45v53M1sRqZklLXbbj6qXqNxvplulC0,10087
80
80
  ultralytics/engine/__init__.py,sha256=mHtJuK4hwF8cuV-VHDc7tp6u6D1gHz2Z7JI8grmQDTs,42
81
- ultralytics/engine/exporter.py,sha256=NeJEldYo37wMlhMQGQxn8qRhYN1ZYOmuEnbFwCk_LNM,53835
81
+ ultralytics/engine/exporter.py,sha256=eRd_CNnNjgwmCn6JPCqr70VOEsWQ2yiBOmTdBUGLNt8,54605
82
82
  ultralytics/engine/model.py,sha256=QkNRSxYkmr3wM9iFgsfszmenHMdu2KTuT_yrSL-BA7o,39830
83
83
  ultralytics/engine/predictor.py,sha256=wQRKdWGDTP5A6CS0gTC6U3RPDMhP3QkEzWSPm6eqCkU,17022
84
84
  ultralytics/engine/results.py,sha256=MvrOBrBlRF7kbL-QwysMf9mIDy_lwQBTTYvy1x1FMME,30667
@@ -145,7 +145,7 @@ ultralytics/models/yolo/world/__init__.py,sha256=3VTH0q4NOt2EWRom15yCymvmvm0Etp2
145
145
  ultralytics/models/yolo/world/train.py,sha256=acYN2-onL69LrL4av6_hY2r5AY0urC0WViDstn7npfI,3686
146
146
  ultralytics/models/yolo/world/train_world.py,sha256=ICPsYNbuPkq_qf3FHl2YJ-q3g7ik0pI-zhMpLmHa5-4,4805
147
147
  ultralytics/nn/__init__.py,sha256=4BPLHY89xEM_al5uK0aOmFgiML6CMGEZbezxOvTjOEs,587
148
- ultralytics/nn/autobackend.py,sha256=QtPDtQfUNnTGiW6yJnWGNWR_aqkYDFIevyx22uC2bdI,28716
148
+ ultralytics/nn/autobackend.py,sha256=tDTeUUA86fqgbUzJ5yvQVNHb8aG3KCyLhraDT1VJ-1U,30316
149
149
  ultralytics/nn/tasks.py,sha256=a3FSkIUErlE7qI506ye5vGggqzMxqXWDkIbbLD4AGyI,43623
150
150
  ultralytics/nn/modules/__init__.py,sha256=KzLoyn2ldfReiQL8H8xsMC49Xvtb8Kv9ikE5Q3OBoAs,2326
151
151
  ultralytics/nn/modules/block.py,sha256=smIz3oNTDA7UKrAH5FfSMh08C12-avgWTeIkbgZIv18,25251
@@ -169,7 +169,7 @@ ultralytics/trackers/utils/__init__.py,sha256=mHtJuK4hwF8cuV-VHDc7tp6u6D1gHz2Z7J
169
169
  ultralytics/trackers/utils/gmc.py,sha256=vwcPA1n5zjPaBGhCDt8ItN7rq_6Sczsjn4gsXJfRylU,13688
170
170
  ultralytics/trackers/utils/kalman_filter.py,sha256=0oqhk59NKEiwcJ2FXnw6_sT4bIFC6Wu5IY2B-TGxJKU,15168
171
171
  ultralytics/trackers/utils/matching.py,sha256=UxhSGa5pN6WoYwYSBAkkt-O7xMxUR47VuUB6PfVNkb4,5404
172
- ultralytics/utils/__init__.py,sha256=ggkaKah5WaPsfC8zD4dPk9syQgpOymClZW9U-8QCAUo,38440
172
+ ultralytics/utils/__init__.py,sha256=clmzQt-uxAlT4qrUoJSlCB3o40q2P5WTE-FM7YhGR4I,39236
173
173
  ultralytics/utils/autobatch.py,sha256=ygZ3f2ByIkcujB89ENcTnGWWnAQw5Pbg6nBuShg-5t4,3863
174
174
  ultralytics/utils/benchmarks.py,sha256=BNG0sO34_mu3fIEfMn8j-QzQ9Da6K1KujO-CxDkvsOM,18325
175
175
  ultralytics/utils/checks.py,sha256=UDrcHiTMjSHSyUZflTRGuyYRj0uz9-RQ-xfDq_lsXZo,27971
@@ -182,7 +182,7 @@ ultralytics/utils/loss.py,sha256=lOFBx-lKn-aGHUIPTb1NQefXiNot07egNx7qKErChpU,327
182
182
  ultralytics/utils/metrics.py,sha256=XPD-xP0fchR8KgCuTcihV2-n0EK1cWi3-53BWN_pLuA,53518
183
183
  ultralytics/utils/ops.py,sha256=wZCWx7dm5GJNIJHyZaFJRetGcQ7prdv-anplqq9figQ,33309
184
184
  ultralytics/utils/patches.py,sha256=SgMqeMsq2K6JoBJP1NplXMl9C6rK0JeJUChjBrJOneo,2750
185
- ultralytics/utils/plotting.py,sha256=hifiLd0mz2EM9Z4qPHkWbzBaIvUgI1w0ynMdD5-eYoY,47441
185
+ ultralytics/utils/plotting.py,sha256=KbV6rx5LCyjG4lBY9ZuSM6Da8L8S6Qt5FQ8uIQ8N0yY,47439
186
186
  ultralytics/utils/tal.py,sha256=xuIyryUjaaYHkHPG9GvBwh1xxN2Hq4y3hXOtuERehwY,16017
187
187
  ultralytics/utils/torch_utils.py,sha256=-lXdJenpUfKM932ipvGfzup8FjNzX6g16hibwW5wPIU,25848
188
188
  ultralytics/utils/triton.py,sha256=gg1finxno_tY2Ge9PMhmu7PI9wvoFZoiicdT4Bhqv3w,3936
@@ -198,9 +198,9 @@ ultralytics/utils/callbacks/neptune.py,sha256=5Z3ua5YBTUS56FH8VQKQG1aaIo9fH8GEyz
198
198
  ultralytics/utils/callbacks/raytune.py,sha256=ODVYzy-CoM4Uge0zjkh3Hnh9nF2M0vhDrSenXnvcizw,705
199
199
  ultralytics/utils/callbacks/tensorboard.py,sha256=Z1veCVcn9THPhdplWuIzwlsW2yF7y-On9IZIk3khM0Y,4135
200
200
  ultralytics/utils/callbacks/wb.py,sha256=woCQVuZzqtM5KnwxIibcfM3sFBYojeMPnv11jrRaIQA,6674
201
- ultralytics-8.1.45.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
202
- ultralytics-8.1.45.dist-info/METADATA,sha256=Gmkmhjv04-HB9IObUIKO6RxdJ-ilHIzHsMeX0dbelmk,40416
203
- ultralytics-8.1.45.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
204
- ultralytics-8.1.45.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
205
- ultralytics-8.1.45.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
206
- ultralytics-8.1.45.dist-info/RECORD,,
201
+ ultralytics-8.1.46.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
202
+ ultralytics-8.1.46.dist-info/METADATA,sha256=tbSxwlUsVrE2EMwEmmMO7WGusSYBSugNmeC87Q9Nqxw,40416
203
+ ultralytics-8.1.46.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
204
+ ultralytics-8.1.46.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
205
+ ultralytics-8.1.46.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
206
+ ultralytics-8.1.46.dist-info/RECORD,,