ultralytics 8.2.96__py3-none-any.whl → 8.2.98__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
ultralytics/__init__.py CHANGED
@@ -1,6 +1,6 @@
1
1
  # Ultralytics YOLO 🚀, AGPL-3.0 license
2
2
 
3
- __version__ = "8.2.96"
3
+ __version__ = "8.2.98"
4
4
 
5
5
 
6
6
  import os
@@ -712,6 +712,7 @@ def entrypoint(debug=""):
712
712
  "cfg": lambda: yaml_print(DEFAULT_CFG_PATH),
713
713
  "hub": lambda: handle_yolo_hub(args[1:]),
714
714
  "login": lambda: handle_yolo_hub(args),
715
+ "logout": lambda: handle_yolo_hub(args),
715
716
  "copy-cfg": copy_default_cfg,
716
717
  "explorer": lambda: handle_explorer(args[1:]),
717
718
  "streamlit-predict": lambda: handle_streamlit_inference(),
@@ -95,9 +95,7 @@ from ultralytics.utils.torch_utils import TORCH_1_13, get_latest_opset, select_d
95
95
 
96
96
 
97
97
  def export_formats():
98
- """YOLOv8 export formats."""
99
- import pandas # scope for faster 'import ultralytics'
100
-
98
+ """Ultralytics YOLO export formats."""
101
99
  x = [
102
100
  ["PyTorch", "-", ".pt", True, True],
103
101
  ["TorchScript", "torchscript", ".torchscript", True, True],
@@ -113,7 +111,7 @@ def export_formats():
113
111
  ["PaddlePaddle", "paddle", "_paddle_model", True, True],
114
112
  ["NCNN", "ncnn", "_ncnn_model", True, True],
115
113
  ]
116
- return pandas.DataFrame(x, columns=["Format", "Argument", "Suffix", "CPU", "GPU"])
114
+ return dict(zip(["Format", "Argument", "Suffix", "CPU", "GPU"], zip(*x)))
117
115
 
118
116
 
119
117
  def gd_outputs(gd):
@@ -206,33 +206,21 @@ class Model(nn.Module):
206
206
  Check if the provided model is an Ultralytics HUB model.
207
207
 
208
208
  This static method determines whether the given model string represents a valid Ultralytics HUB model
209
- identifier. It checks for three possible formats: a full HUB URL, an API key and model ID combination,
210
- or a standalone model ID.
209
+ identifier.
211
210
 
212
211
  Args:
213
- model (str): The model identifier to check. This can be a URL, an API key and model ID
214
- combination, or a standalone model ID.
212
+ model (str): The model string to check.
215
213
 
216
214
  Returns:
217
215
  (bool): True if the model is a valid Ultralytics HUB model, False otherwise.
218
216
 
219
217
  Examples:
220
- >>> Model.is_hub_model("https://hub.ultralytics.com/models/example_model")
218
+ >>> Model.is_hub_model("https://hub.ultralytics.com/models/MODEL")
221
219
  True
222
- >>> Model.is_hub_model("api_key_example_model_id")
223
- True
224
- >>> Model.is_hub_model("example_model_id")
225
- True
226
- >>> Model.is_hub_model("not_a_hub_model.pt")
220
+ >>> Model.is_hub_model("yolov8n.pt")
227
221
  False
228
222
  """
229
- return any(
230
- (
231
- model.startswith(f"{HUB_WEB_ROOT}/models/"), # i.e. https://hub.ultralytics.com/models/MODEL_ID
232
- [len(x) for x in model.split("_")] == [42, 20], # APIKEY_MODEL
233
- len(model) == 20 and not Path(model).exists() and all(x not in model for x in "./\\"), # MODEL
234
- )
235
- )
223
+ return model.startswith(f"{HUB_WEB_ROOT}/models/")
236
224
 
237
225
  def _new(self, cfg: str, task=None, model=None, verbose=False) -> None:
238
226
  """
@@ -5,6 +5,7 @@ import threading
5
5
  import time
6
6
  from http import HTTPStatus
7
7
  from pathlib import Path
8
+ from urllib.parse import parse_qs, urlparse
8
9
 
9
10
  import requests
10
11
 
@@ -77,7 +78,6 @@ class HUBTrainingSession:
77
78
  if not session.client.authenticated:
78
79
  if identifier.startswith(f"{HUB_WEB_ROOT}/models/"):
79
80
  LOGGER.warning(f"{PREFIX}WARNING ⚠️ Login to Ultralytics HUB with 'yolo hub login API_KEY'.")
80
- exit()
81
81
  return None
82
82
  if args and not identifier.startswith(f"{HUB_WEB_ROOT}/models/"): # not a HUB model URL
83
83
  session.create_model(args)
@@ -96,7 +96,8 @@ class HUBTrainingSession:
96
96
  self.model_url = f"{HUB_WEB_ROOT}/models/{self.model.id}"
97
97
  if self.model.is_trained():
98
98
  print(emojis(f"Loading trained HUB model {self.model_url} 🚀"))
99
- self.model_file = self.model.get_weights_url("best")
99
+ url = self.model.get_weights_url("best") # download URL with auth
100
+ self.model_file = checks.check_file(url, download_dir=Path(SETTINGS["weights_dir"]) / "hub" / self.model.id)
100
101
  return
101
102
 
102
103
  # Set training args and start heartbeats for HUB to monitor agent
@@ -146,9 +147,8 @@ class HUBTrainingSession:
146
147
  Parses the given identifier to determine the type of identifier and extract relevant components.
147
148
 
148
149
  The method supports different identifier formats:
149
- - A HUB URL, which starts with HUB_WEB_ROOT followed by '/models/'
150
- - An identifier containing an API key and a model ID separated by an underscore
151
- - An identifier that is solely a model ID of a fixed length
150
+ - A HUB model URL https://hub.ultralytics.com/models/MODEL
151
+ - A HUB model URL with API Key https://hub.ultralytics.com/models/MODEL?api_key=APIKEY
152
152
  - A local filename that ends with '.pt' or '.yaml'
153
153
 
154
154
  Args:
@@ -160,32 +160,16 @@ class HUBTrainingSession:
160
160
  Raises:
161
161
  HUBModelError: If the identifier format is not recognized.
162
162
  """
163
- # Initialize variables
164
163
  api_key, model_id, filename = None, None, None
165
-
166
- # Check if identifier is a HUB URL
167
- if identifier.startswith(f"{HUB_WEB_ROOT}/models/"):
168
- # Extract the model_id after the HUB_WEB_ROOT URL
169
- model_id = identifier.split(f"{HUB_WEB_ROOT}/models/")[-1]
164
+ if Path(identifier).suffix in {".pt", ".yaml"}:
165
+ filename = identifier
166
+ elif identifier.startswith(f"{HUB_WEB_ROOT}/models/"):
167
+ parsed_url = urlparse(identifier)
168
+ model_id = Path(parsed_url.path).stem # handle possible final backslash robustly
169
+ query_params = parse_qs(parsed_url.query) # dictionary, i.e. {"api_key": ["API_KEY_HERE"]}
170
+ api_key = query_params.get("api_key", [None])[0]
170
171
  else:
171
- # Split the identifier based on underscores only if it's not a HUB URL
172
- parts = identifier.split("_")
173
-
174
- # Check if identifier is in the format of API key and model ID
175
- if len(parts) == 2 and len(parts[0]) == 42 and len(parts[1]) == 20:
176
- api_key, model_id = parts
177
- # Check if identifier is a single model ID
178
- elif len(parts) == 1 and len(parts[0]) == 20:
179
- model_id = parts[0]
180
- # Check if identifier is a local filename
181
- elif identifier.endswith(".pt") or identifier.endswith(".yaml"):
182
- filename = identifier
183
- else:
184
- raise HUBModelError(
185
- f"model='{identifier}' could not be parsed. Check format is correct. "
186
- f"Supported formats are Ultralytics HUB URL, apiKey_modelId, modelId, local pt or yaml file."
187
- )
188
-
172
+ raise HUBModelError(f"model='{identifier} invalid, correct format is {HUB_WEB_ROOT}/models/MODEL_ID")
189
173
  return api_key, model_id, filename
190
174
 
191
175
  def _set_train_args(self):
@@ -398,8 +398,8 @@ class AutoBackend(nn.Module):
398
398
  from ultralytics.engine.exporter import export_formats
399
399
 
400
400
  raise TypeError(
401
- f"model='{w}' is not a supported model format. "
402
- f"See https://docs.ultralytics.com/modes/predict for help.\n\n{export_formats()}"
401
+ f"model='{w}' is not a supported model format. Ultralytics supports: {export_formats()['Format']}\n"
402
+ f"See https://docs.ultralytics.com/modes/predict for help."
403
403
  )
404
404
 
405
405
  # Load external metadata YAML
@@ -653,7 +653,7 @@ class AutoBackend(nn.Module):
653
653
  """
654
654
  from ultralytics.engine.exporter import export_formats
655
655
 
656
- sf = list(export_formats().Suffix) # export suffixes
656
+ sf = export_formats()["Suffix"] # export suffixes
657
657
  if not is_url(p) and not isinstance(p, str):
658
658
  check_suffix(p, sf) # checks
659
659
  name = Path(p).name
@@ -3,6 +3,7 @@
3
3
  import contextlib
4
4
  import importlib.metadata
5
5
  import inspect
6
+ import json
6
7
  import logging.config
7
8
  import os
8
9
  import platform
@@ -14,6 +15,7 @@ import time
14
15
  import urllib
15
16
  import uuid
16
17
  from pathlib import Path
18
+ from threading import Lock
17
19
  from types import SimpleNamespace
18
20
  from typing import Union
19
21
 
@@ -1136,6 +1138,61 @@ class SettingsManager(dict):
1136
1138
  self.save()
1137
1139
 
1138
1140
 
1141
+ class PersistentCacheDict(dict):
1142
+ """A thread-safe dictionary that persists data to a JSON file for caching purposes."""
1143
+
1144
+ def __init__(self, file_path=USER_CONFIG_DIR / "persistent_cache.json"):
1145
+ """Initializes a thread-safe persistent cache dictionary with a specified file path for storage."""
1146
+ super().__init__()
1147
+ self.file_path = Path(file_path)
1148
+ self.lock = Lock()
1149
+ self._load()
1150
+
1151
+ def _load(self):
1152
+ """Load the persistent cache from a JSON file into the dictionary, handling errors gracefully."""
1153
+ try:
1154
+ if self.file_path.exists():
1155
+ with open(self.file_path) as f:
1156
+ self.update(json.load(f))
1157
+ except json.JSONDecodeError:
1158
+ print(f"Error decoding JSON from {self.file_path}. Starting with an empty cache.")
1159
+ except Exception as e:
1160
+ print(f"Error reading from {self.file_path}: {e}")
1161
+
1162
+ def _save(self):
1163
+ """Save the current state of the cache dictionary to a JSON file, ensuring thread safety."""
1164
+ try:
1165
+ self.file_path.parent.mkdir(parents=True, exist_ok=True)
1166
+ with open(self.file_path, "w") as f:
1167
+ json.dump(dict(self), f, indent=2)
1168
+ except Exception as e:
1169
+ print(f"Error writing to {self.file_path}: {e}")
1170
+
1171
+ def __setitem__(self, key, value):
1172
+ """Store a key-value pair in the cache and persist the updated cache to disk."""
1173
+ with self.lock:
1174
+ super().__setitem__(key, value)
1175
+ self._save()
1176
+
1177
+ def __delitem__(self, key):
1178
+ """Remove an item from the PersistentCacheDict and update the persistent storage."""
1179
+ with self.lock:
1180
+ super().__delitem__(key)
1181
+ self._save()
1182
+
1183
+ def update(self, *args, **kwargs):
1184
+ """Update the dictionary with key-value pairs from other mappings or iterables, ensuring thread safety."""
1185
+ with self.lock:
1186
+ super().update(*args, **kwargs)
1187
+ self._save()
1188
+
1189
+ def clear(self):
1190
+ """Clears all entries from the persistent cache dictionary, ensuring thread safety."""
1191
+ with self.lock:
1192
+ super().clear()
1193
+ self._save()
1194
+
1195
+
1139
1196
  def deprecation_warn(arg, new_arg):
1140
1197
  """Issue a deprecation warning when a deprecated argument is used, suggesting an updated argument."""
1141
1198
  LOGGER.warning(
@@ -1171,6 +1228,7 @@ def vscode_msg(ext="ultralytics.ultralytics-snippets") -> str:
1171
1228
  # Check first-install steps
1172
1229
  PREFIX = colorstr("Ultralytics: ")
1173
1230
  SETTINGS = SettingsManager() # initialize settings
1231
+ PERSISTENT_CACHE = PersistentCacheDict() # initialize persistent cache
1174
1232
  DATASETS_DIR = Path(SETTINGS["datasets_dir"]) # global datasets directory
1175
1233
  WEIGHTS_DIR = Path(SETTINGS["weights_dir"]) # global weights directory
1176
1234
  RUNS_DIR = Path(SETTINGS["runs_dir"]) # global runs directory
@@ -85,7 +85,7 @@ def benchmark(
85
85
 
86
86
  y = []
87
87
  t0 = time.time()
88
- for i, (name, format, suffix, cpu, gpu) in export_formats().iterrows(): # index, (name, format, suffix, CPU, GPU)
88
+ for i, (name, format, suffix, cpu, gpu) in enumerate(zip(*export_formats().values())):
89
89
  emoji, filename = "❌", None # export defaults
90
90
  try:
91
91
  # Checks
@@ -419,7 +419,7 @@ class Annotator:
419
419
  # Convert im back to PIL and update draw
420
420
  self.fromarray(self.im)
421
421
 
422
- def kpts(self, kpts, shape=(640, 640), radius=5, kpt_line=True, conf_thres=0.25, kpt_color=None):
422
+ def kpts(self, kpts, shape=(640, 640), radius=None, kpt_line=True, conf_thres=0.25, kpt_color=None):
423
423
  """
424
424
  Plot keypoints on the image.
425
425
 
@@ -436,6 +436,7 @@ class Annotator:
436
436
  - Modifies self.im in-place.
437
437
  - If self.pil is True, converts image to numpy array and back to PIL.
438
438
  """
439
+ radius = radius if radius is not None else self.lw
439
440
  if self.pil:
440
441
  # Convert to numpy first
441
442
  self.im = np.asarray(self.im).copy()
@@ -471,7 +472,7 @@ class Annotator:
471
472
  pos1,
472
473
  pos2,
473
474
  kpt_color or self.limb_color[i].tolist(),
474
- thickness=2,
475
+ thickness=int(np.ceil(self.lw / 2)),
475
476
  lineType=cv2.LINE_AA,
476
477
  )
477
478
  if self.pil:
@@ -110,13 +110,17 @@ def autocast(enabled: bool, device: str = "cuda"):
110
110
 
111
111
  def get_cpu_info():
112
112
  """Return a string with system CPU information, i.e. 'Apple M2'."""
113
- with contextlib.suppress(Exception):
114
- import cpuinfo # pip install py-cpuinfo
113
+ from ultralytics.utils import PERSISTENT_CACHE # avoid circular import error
115
114
 
116
- k = "brand_raw", "hardware_raw", "arch_string_raw" # keys sorted by preference (not all keys always available)
117
- info = cpuinfo.get_cpu_info() # info dict
118
- string = info.get(k[0] if k[0] in info else k[1] if k[1] in info else k[2], "unknown")
119
- return string.replace("(R)", "").replace("CPU ", "").replace("@ ", "")
115
+ if "cpu_info" not in PERSISTENT_CACHE:
116
+ with contextlib.suppress(Exception):
117
+ import cpuinfo # pip install py-cpuinfo
118
+
119
+ k = "brand_raw", "hardware_raw", "arch_string_raw" # keys sorted by preference
120
+ info = cpuinfo.get_cpu_info() # info dict
121
+ string = info.get(k[0] if k[0] in info else k[1] if k[1] in info else k[2], "unknown")
122
+ PERSISTENT_CACHE["cpu_info"] = string.replace("(R)", "").replace("CPU ", "").replace("@ ", "")
123
+ return PERSISTENT_CACHE.get("cpu_info", "unknown")
120
124
 
121
125
  return "unknown"
122
126
 
@@ -247,7 +251,7 @@ def fuse_conv_and_bn(conv, bn):
247
251
  )
248
252
 
249
253
  # Prepare filters
250
- w_conv = conv.weight.clone().view(conv.out_channels, -1)
254
+ w_conv = conv.weight.view(conv.out_channels, -1)
251
255
  w_bn = torch.diag(bn.weight.div(torch.sqrt(bn.eps + bn.running_var)))
252
256
  fusedconv.weight.copy_(torch.mm(w_bn, w_conv).view(fusedconv.weight.shape))
253
257
 
@@ -278,7 +282,7 @@ def fuse_deconv_and_bn(deconv, bn):
278
282
  )
279
283
 
280
284
  # Prepare filters
281
- w_deconv = deconv.weight.clone().view(deconv.out_channels, -1)
285
+ w_deconv = deconv.weight.view(deconv.out_channels, -1)
282
286
  w_bn = torch.diag(bn.weight.div(torch.sqrt(bn.eps + bn.running_var)))
283
287
  fuseddconv.weight.copy_(torch.mm(w_bn, w_deconv).view(fuseddconv.weight.shape))
284
288
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ultralytics
3
- Version: 8.2.96
3
+ Version: 8.2.98
4
4
  Summary: Ultralytics YOLO 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
@@ -8,10 +8,10 @@ tests/test_exports.py,sha256=Uezf3OatpPHlo5qoPw-2kqkZxuMCF9L4XF2riD4vmII,8225
8
8
  tests/test_integrations.py,sha256=xglcfMPjfVh346PV8WTpk6tBxraCXEFJEQyyJMr5tyU,6064
9
9
  tests/test_python.py,sha256=vkA0F9XgOSpU1BxI2Lzq69f6g-vi8PtOfmb_7P96ZUk,23560
10
10
  tests/test_solutions.py,sha256=p_2edhl96Ty3jwzSf02Q2m2mTu9skc0Z-eMcUuuXfLg,3300
11
- ultralytics/__init__.py,sha256=lwq1oD-BHTsuvQhJupzGRvRWeuEv9C4c8j-G4SsFupE,695
11
+ ultralytics/__init__.py,sha256=97VvSWQKGYuM4GfzWMo_UmDtaN8fZpboLas7y9pPuzA,695
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=pkB7wk0pHOA3xzKzMbS-hA0iJoPOWVNnwZJh0LuWh-w,33089
14
+ ultralytics/cfg/__init__.py,sha256=7FFk0HG4AvAre9CV70QMTtx1h74pSiNSJaxKSiuFkSo,33138
15
15
  ultralytics/cfg/default.yaml,sha256=xRKVF-Z9E3imXTU9OCK94kj3jGgYoo67VJQwuYlHiUU,8228
16
16
  ultralytics/cfg/datasets/Argoverse.yaml,sha256=FyeuJT5CHq_9d4hlfAf0kpZlnbUMO0S--UJ1yIqcdKk,3134
17
17
  ultralytics/cfg/datasets/DOTAv1.5.yaml,sha256=QVfp_Qp-4rukuicaB4qx86NxSHM8Mrzym8l_fIDo8gw,1195
@@ -98,8 +98,8 @@ ultralytics/data/explorer/utils.py,sha256=EvvukQiQUTBrsZznmMnyEX2EqTuwZo_Geyc8yf
98
98
  ultralytics/data/explorer/gui/__init__.py,sha256=mHtJuK4hwF8cuV-VHDc7tp6u6D1gHz2Z7JI8grmQDTs,42
99
99
  ultralytics/data/explorer/gui/dash.py,sha256=vZ476NaUH4FKU08rAJ1K9WNyKtg0soMyJJxqg176yWc,10498
100
100
  ultralytics/engine/__init__.py,sha256=mHtJuK4hwF8cuV-VHDc7tp6u6D1gHz2Z7JI8grmQDTs,42
101
- ultralytics/engine/exporter.py,sha256=MtBFbJp3ifhn9sQXuQb7vxxOmtS_SOw7lnQhrq4H42c,57078
102
- ultralytics/engine/model.py,sha256=AB9tu7kJW-QiTAp0F_J8KQJ4FijsHXcYBTaVHb7aMrg,52281
101
+ ultralytics/engine/exporter.py,sha256=BFYvv763kbEm5q0-AYIh979vL0ccU4RNvON2w8qtm1s,57019
102
+ ultralytics/engine/model.py,sha256=1sWOBvLL2JIH8JuHoxwvr1MPfKFww0ORyLESx3Fs2c8,51582
103
103
  ultralytics/engine/predictor.py,sha256=MgMWHUJdRcVCaVmOyvdy2Gjk_EyRHv-ar0SSGxQe8F4,17471
104
104
  ultralytics/engine/results.py,sha256=8RJlN8J-_9w-mrDZm9wC-DZJTPBS7v1c_r_R173QyRM,75043
105
105
  ultralytics/engine/trainer.py,sha256=VOuR9WpDgYILevpWnWAtKLEIcJ4iFG41HxOCSbOy0YA,36657
@@ -107,7 +107,7 @@ ultralytics/engine/tuner.py,sha256=gPqDTHH7vRB2O3YyH26m1BjVKbXxuA2XAlPRzTKFZsc,1
107
107
  ultralytics/engine/validator.py,sha256=483Ad87Irk7IBlJNLu2SQAJsb7YriALTX9GIgriCmRg,14650
108
108
  ultralytics/hub/__init__.py,sha256=AM_twjV9ouUmyxh3opoPgTqDpMOd8xIOHsAKdWS2L18,5663
109
109
  ultralytics/hub/auth.py,sha256=kDLakGa2NbzvMAeXc2UdzZ65r0AH-XeM_JfsDY97WGk,5545
110
- ultralytics/hub/session.py,sha256=UXKHwidZxjiz0AMATsuUAS7nP584afN0S2pLGA4EOjI,16888
110
+ ultralytics/hub/session.py,sha256=xD4oBiWfeIMReNxSIPE-VK5xVdUHEjS8WrpBvjlRfnU,16350
111
111
  ultralytics/hub/utils.py,sha256=I7NATG6O_QRw7EU7EHkdTVvbCkwKCyUe54BP60To_so,9715
112
112
  ultralytics/hub/google/__init__.py,sha256=uclNs-_5vAzQMgQKgl8eBvml1cx6IZYXRUhrF57v6_k,7504
113
113
  ultralytics/models/__init__.py,sha256=TT9iLCL_n9Y80dcUq0Fo-p-GRZCSU2vrWXM3CoMwqqE,265
@@ -168,7 +168,7 @@ ultralytics/models/yolo/world/__init__.py,sha256=3VTH0q4NOt2EWRom15yCymvmvm0Etp2
168
168
  ultralytics/models/yolo/world/train.py,sha256=gaDrAmLJpg9qDtmL5evA5HsV2yb4RTRSfk2EDYrHdRg,3686
169
169
  ultralytics/models/yolo/world/train_world.py,sha256=IsnCEVt6DcM9lUskCKmIN-M8MM79xLpwTRqRoAHUnZ4,4857
170
170
  ultralytics/nn/__init__.py,sha256=4BPLHY89xEM_al5uK0aOmFgiML6CMGEZbezxOvTjOEs,587
171
- ultralytics/nn/autobackend.py,sha256=DZTIHsp2PLs8H2-oQR9LqA-uPj8DARGonCXzRv2Pkdc,31546
171
+ ultralytics/nn/autobackend.py,sha256=95FVDv_l5fax5f8gmhYAIIS2e_8u6HYxNd4Saxh7E10,31573
172
172
  ultralytics/nn/tasks.py,sha256=5ESFTm1CYt7uSCyWkW7rsLAdMLPHSBla95GWj439SrA,47894
173
173
  ultralytics/nn/modules/__init__.py,sha256=m8x-XRHVLWMECPeysVlv1TQenV-n8oAbK1gxnoXzLpk,2553
174
174
  ultralytics/nn/modules/activation.py,sha256=chhn469wnRHEs5BMGNBYXwPYZc_7-urspTT8fnBd-xA,895
@@ -196,9 +196,9 @@ ultralytics/trackers/utils/__init__.py,sha256=mHtJuK4hwF8cuV-VHDc7tp6u6D1gHz2Z7J
196
196
  ultralytics/trackers/utils/gmc.py,sha256=VcURuY041qGCeWUGMxHZBr10T16LtcMqyv7AmTfE1MY,14557
197
197
  ultralytics/trackers/utils/kalman_filter.py,sha256=cH9zD3fwkuezP97H9mw8cSBN7a8hHKx_Sx1j7t3oYGs,21349
198
198
  ultralytics/trackers/utils/matching.py,sha256=3Ie1WNNRZ4_q3365F03XD7Nr9juZB_08mw4yUKC3w74,7162
199
- ultralytics/utils/__init__.py,sha256=BRqC6AE9epuZJy4XcGzGfuR2zNiXx-mfot2JQomterw,44097
199
+ ultralytics/utils/__init__.py,sha256=dfNCZcBDqDOjJdIx1W_fVXSDEqKRq-CYRZOucOOQJ_0,46410
200
200
  ultralytics/utils/autobatch.py,sha256=AXboYfNSnTGsYj5FmgGYPQd0crfkeleyms6QXQfZGQ4,4194
201
- ultralytics/utils/benchmarks.py,sha256=UsVJXTgB6xQ8QBjlNghN3WuZQwXShQjuqv2RcGBLHDY,23640
201
+ ultralytics/utils/benchmarks.py,sha256=gFs-YCzNEvgggpYchVNw2PKbk9XEC_8TVy70JbP30u8,23612
202
202
  ultralytics/utils/checks.py,sha256=PmdN42XJ7IIUNbeiY8zjPIfJceaxAO04nc780EoYxTc,28910
203
203
  ultralytics/utils/dist.py,sha256=NDFga-uKxkBX2zLxFHSene_cCiGQJoyOeCXcN9JIOIk,2358
204
204
  ultralytics/utils/downloads.py,sha256=uLsYFN2G4g2joTNrsZsfc8ytvfNNRXDPkI20qgkZ2B8,21897
@@ -209,9 +209,9 @@ ultralytics/utils/loss.py,sha256=mDHGmF-gjggAUVhI1dkCm7TtfZHCwz25XKm4M2xJKLs,339
209
209
  ultralytics/utils/metrics.py,sha256=UgLGudWp57uXDMlMUJy4gsz6cfVjcq7tYmHeto3TqvM,53927
210
210
  ultralytics/utils/ops.py,sha256=dsXNdyrYx_p6io6zezig9p84dxS7U-10vceHNVu2IL0,32888
211
211
  ultralytics/utils/patches.py,sha256=Oo3DkP7MbXnNGvPfoFSocAkVvaPh9kwMT_9RQUfjVhI,3594
212
- ultralytics/utils/plotting.py,sha256=bud5mAvFxQ2JD29dReaO4c7Z00k6jIaPJJCznIoyy2w,61543
212
+ ultralytics/utils/plotting.py,sha256=lCx9i3USQK2KGsgD-l2cbdbv33c396gIwMFsZ9iOa1w,61629
213
213
  ultralytics/utils/tal.py,sha256=ECsu95xEqOItmxMDN4YTD3FsUiIsQNWy0pZC3TfvFfk,16877
214
- ultralytics/utils/torch_utils.py,sha256=lTTbFD8SlnXT11O9E8NKTQnrXEOsRmayywQP6niUZMc,29535
214
+ ultralytics/utils/torch_utils.py,sha256=yxm5JAM21RtFjSDI6F22GcovDUzL4raAqaQKLIxZ2v8,29716
215
215
  ultralytics/utils/triton.py,sha256=gg1finxno_tY2Ge9PMhmu7PI9wvoFZoiicdT4Bhqv3w,3936
216
216
  ultralytics/utils/tuner.py,sha256=AtEtK6pOt9xVTyx864OpNRVxNdAxz5aKHzveiXwkD1A,6250
217
217
  ultralytics/utils/callbacks/__init__.py,sha256=YrWqC3BVVaTLob4iCPR6I36mUxIUOpPJW7B_LjT78Qw,214
@@ -225,9 +225,9 @@ ultralytics/utils/callbacks/neptune.py,sha256=5Z3ua5YBTUS56FH8VQKQG1aaIo9fH8GEyz
225
225
  ultralytics/utils/callbacks/raytune.py,sha256=ODVYzy-CoM4Uge0zjkh3Hnh9nF2M0vhDrSenXnvcizw,705
226
226
  ultralytics/utils/callbacks/tensorboard.py,sha256=0kn4IR10no99UCIheojWRujgybmUHSx5fPI6Vsq6l_g,4135
227
227
  ultralytics/utils/callbacks/wb.py,sha256=9-fjQIdLjr3b73DTE3rHO171KvbH1VweJ-bmbv-rqTw,6747
228
- ultralytics-8.2.96.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
229
- ultralytics-8.2.96.dist-info/METADATA,sha256=bZUZH71HHVFy1f_7FP0i3Tlu-kJJLZ2ODLbd2tqmUPY,39504
230
- ultralytics-8.2.96.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
231
- ultralytics-8.2.96.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
232
- ultralytics-8.2.96.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
233
- ultralytics-8.2.96.dist-info/RECORD,,
228
+ ultralytics-8.2.98.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
229
+ ultralytics-8.2.98.dist-info/METADATA,sha256=bTjpqsyHKIXo5Bm9Jef6DufhkW_gG4Bc5rpHnE-bBP0,39504
230
+ ultralytics-8.2.98.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
231
+ ultralytics-8.2.98.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
232
+ ultralytics-8.2.98.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
233
+ ultralytics-8.2.98.dist-info/RECORD,,