ultralytics 8.3.192__py3-none-any.whl → 8.3.194__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.
- tests/test_exports.py +8 -5
- tests/test_python.py +1 -1
- ultralytics/__init__.py +1 -1
- ultralytics/cfg/__init__.py +7 -5
- ultralytics/cfg/datasets/xView.yaml +1 -1
- ultralytics/data/utils.py +1 -1
- ultralytics/engine/exporter.py +7 -6
- ultralytics/engine/model.py +4 -4
- ultralytics/engine/predictor.py +7 -3
- ultralytics/engine/trainer.py +4 -4
- ultralytics/hub/__init__.py +1 -2
- ultralytics/hub/utils.py +0 -101
- ultralytics/models/sam/predict.py +3 -3
- ultralytics/models/yolo/segment/val.py +13 -13
- ultralytics/models/yolo/yoloe/val.py +2 -2
- ultralytics/nn/__init__.py +2 -4
- ultralytics/nn/autobackend.py +10 -13
- ultralytics/nn/tasks.py +2 -51
- ultralytics/utils/__init__.py +6 -3
- ultralytics/utils/callbacks/hub.py +2 -1
- ultralytics/utils/checks.py +2 -1
- ultralytics/utils/events.py +115 -0
- ultralytics/utils/ops.py +3 -1
- ultralytics/utils/tal.py +2 -2
- ultralytics/utils/torch_utils.py +7 -6
- ultralytics/utils/tqdm.py +49 -74
- ultralytics/utils/tuner.py +1 -1
- {ultralytics-8.3.192.dist-info → ultralytics-8.3.194.dist-info}/METADATA +1 -1
- {ultralytics-8.3.192.dist-info → ultralytics-8.3.194.dist-info}/RECORD +33 -32
- {ultralytics-8.3.192.dist-info → ultralytics-8.3.194.dist-info}/WHEEL +0 -0
- {ultralytics-8.3.192.dist-info → ultralytics-8.3.194.dist-info}/entry_points.txt +0 -0
- {ultralytics-8.3.192.dist-info → ultralytics-8.3.194.dist-info}/licenses/LICENSE +0 -0
- {ultralytics-8.3.192.dist-info → ultralytics-8.3.194.dist-info}/top_level.txt +0 -0
@@ -3,8 +3,9 @@
|
|
3
3
|
import json
|
4
4
|
from time import time
|
5
5
|
|
6
|
-
from ultralytics.hub import HUB_WEB_ROOT, PREFIX, HUBTrainingSession
|
6
|
+
from ultralytics.hub import HUB_WEB_ROOT, PREFIX, HUBTrainingSession
|
7
7
|
from ultralytics.utils import LOGGER, RANK, SETTINGS
|
8
|
+
from ultralytics.utils.events import events
|
8
9
|
|
9
10
|
|
10
11
|
def on_pretrain_routine_start(trainer):
|
ultralytics/utils/checks.py
CHANGED
@@ -36,6 +36,7 @@ from ultralytics.utils import (
|
|
36
36
|
PYTHON_VERSION,
|
37
37
|
RKNN_CHIPS,
|
38
38
|
ROOT,
|
39
|
+
TORCH_VERSION,
|
39
40
|
TORCHVISION_VERSION,
|
40
41
|
USER_CONFIG_DIR,
|
41
42
|
WINDOWS,
|
@@ -464,7 +465,7 @@ def check_torchvision():
|
|
464
465
|
}
|
465
466
|
|
466
467
|
# Check major and minor versions
|
467
|
-
v_torch = ".".join(
|
468
|
+
v_torch = ".".join(TORCH_VERSION.split("+", 1)[0].split(".")[:2])
|
468
469
|
if v_torch in compatibility_table:
|
469
470
|
compatible_versions = compatibility_table[v_torch]
|
470
471
|
v_torchvision = ".".join(TORCHVISION_VERSION.split("+", 1)[0].split(".")[:2])
|
@@ -0,0 +1,115 @@
|
|
1
|
+
# Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
|
2
|
+
|
3
|
+
import json
|
4
|
+
import random
|
5
|
+
import time
|
6
|
+
from pathlib import Path
|
7
|
+
from threading import Thread
|
8
|
+
from urllib.request import Request, urlopen
|
9
|
+
|
10
|
+
from ultralytics import SETTINGS, __version__
|
11
|
+
from ultralytics.utils import ARGV, ENVIRONMENT, GIT, IS_PIP_PACKAGE, ONLINE, PYTHON_VERSION, RANK, TESTS_RUNNING
|
12
|
+
from ultralytics.utils.downloads import GITHUB_ASSETS_NAMES
|
13
|
+
from ultralytics.utils.torch_utils import get_cpu_info
|
14
|
+
|
15
|
+
|
16
|
+
def _post(url: str, data: dict, timeout: float = 5.0) -> None:
|
17
|
+
"""Send a one-shot JSON POST request."""
|
18
|
+
try:
|
19
|
+
body = json.dumps(data, separators=(",", ":")).encode() # compact JSON
|
20
|
+
req = Request(url, data=body, headers={"Content-Type": "application/json"})
|
21
|
+
urlopen(req, timeout=timeout).close()
|
22
|
+
except Exception:
|
23
|
+
pass
|
24
|
+
|
25
|
+
|
26
|
+
class Events:
|
27
|
+
"""
|
28
|
+
Collect and send anonymous usage analytics with rate-limiting.
|
29
|
+
|
30
|
+
Event collection and transmission are enabled when sync is enabled in settings, the current process is rank -1 or 0,
|
31
|
+
tests are not running, the environment is online, and the installation source is either pip or the official
|
32
|
+
Ultralytics GitHub repository.
|
33
|
+
|
34
|
+
Attributes:
|
35
|
+
url (str): Measurement Protocol endpoint for receiving anonymous events.
|
36
|
+
events (list[dict]): In-memory queue of event payloads awaiting transmission.
|
37
|
+
rate_limit (float): Minimum time in seconds between POST requests.
|
38
|
+
t (float): Timestamp of the last transmission in seconds since the epoch.
|
39
|
+
metadata (dict): Static metadata describing runtime, installation source, and environment.
|
40
|
+
enabled (bool): Flag indicating whether analytics collection is active.
|
41
|
+
|
42
|
+
Methods:
|
43
|
+
__init__: Initialize the event queue, rate limiter, and runtime metadata.
|
44
|
+
__call__: Queue an event and trigger a non-blocking send when the rate limit elapses.
|
45
|
+
"""
|
46
|
+
|
47
|
+
url = "https://www.google-analytics.com/mp/collect?measurement_id=G-X8NCJYTQXM&api_secret=QLQrATrNSwGRFRLE-cbHJw"
|
48
|
+
|
49
|
+
def __init__(self) -> None:
|
50
|
+
"""Initialize the Events instance with queue, rate limiter, and environment metadata."""
|
51
|
+
self.events = [] # pending events
|
52
|
+
self.rate_limit = 30.0 # rate limit (seconds)
|
53
|
+
self.t = 0.0 # last send timestamp (seconds)
|
54
|
+
self.metadata = {
|
55
|
+
"cli": Path(ARGV[0]).name == "yolo",
|
56
|
+
"install": "git" if GIT.is_repo else "pip" if IS_PIP_PACKAGE else "other",
|
57
|
+
"python": PYTHON_VERSION.rsplit(".", 1)[0], # i.e. 3.13
|
58
|
+
"CPU": get_cpu_info(),
|
59
|
+
# "GPU": get_gpu_info(index=0) if cuda else None,
|
60
|
+
"version": __version__,
|
61
|
+
"env": ENVIRONMENT,
|
62
|
+
"session_id": round(random.random() * 1e15),
|
63
|
+
"engagement_time_msec": 1000,
|
64
|
+
}
|
65
|
+
self.enabled = (
|
66
|
+
SETTINGS["sync"]
|
67
|
+
and RANK in {-1, 0}
|
68
|
+
and not TESTS_RUNNING
|
69
|
+
and ONLINE
|
70
|
+
and (IS_PIP_PACKAGE or GIT.origin == "https://github.com/ultralytics/ultralytics.git")
|
71
|
+
)
|
72
|
+
|
73
|
+
def __call__(self, cfg, device=None) -> None:
|
74
|
+
"""
|
75
|
+
Queue an event and flush the queue asynchronously when the rate limit elapses.
|
76
|
+
|
77
|
+
Args:
|
78
|
+
cfg (IterableSimpleNamespace): The configuration object containing mode and task information.
|
79
|
+
device (torch.device | str, optional): The device type (e.g., 'cpu', 'cuda').
|
80
|
+
"""
|
81
|
+
if not self.enabled:
|
82
|
+
# Events disabled, do nothing
|
83
|
+
return
|
84
|
+
|
85
|
+
# Attempt to enqueue a new event
|
86
|
+
if len(self.events) < 25: # Queue limited to 25 events to bound memory and traffic
|
87
|
+
params = {
|
88
|
+
**self.metadata,
|
89
|
+
"task": cfg.task,
|
90
|
+
"model": cfg.model if cfg.model in GITHUB_ASSETS_NAMES else "custom",
|
91
|
+
"device": str(device),
|
92
|
+
}
|
93
|
+
if cfg.mode == "export":
|
94
|
+
params["format"] = cfg.format
|
95
|
+
self.events.append({"name": cfg.mode, "params": params})
|
96
|
+
|
97
|
+
# Check rate limit and return early if under limit
|
98
|
+
t = time.time()
|
99
|
+
if (t - self.t) < self.rate_limit:
|
100
|
+
return
|
101
|
+
|
102
|
+
# Overrate limit: send a snapshot of queued events in a background thread
|
103
|
+
payload_events = list(self.events) # snapshot to avoid race with queue reset
|
104
|
+
Thread(
|
105
|
+
target=_post,
|
106
|
+
args=(self.url, {"client_id": SETTINGS["uuid"], "events": payload_events}), # SHA-256 anonymized
|
107
|
+
daemon=True,
|
108
|
+
).start()
|
109
|
+
|
110
|
+
# Reset queue and rate limit timer
|
111
|
+
self.events = []
|
112
|
+
self.t = t
|
113
|
+
|
114
|
+
|
115
|
+
events = Events()
|
ultralytics/utils/ops.py
CHANGED
@@ -244,7 +244,9 @@ def scale_image(masks, im0_shape, ratio_pad=None):
|
|
244
244
|
if len(masks.shape) < 2:
|
245
245
|
raise ValueError(f'"len of masks shape" should be 2 or 3, but got {len(masks.shape)}')
|
246
246
|
masks = masks[top:bottom, left:right]
|
247
|
-
|
247
|
+
# handle the cv2.resize 512 channels limitation: https://github.com/ultralytics/ultralytics/pull/21947
|
248
|
+
masks = [cv2.resize(array, (im0_w, im0_h)) for array in np.array_split(masks, masks.shape[-1] // 512 + 1, axis=-1)]
|
249
|
+
masks = np.concatenate(masks, axis=-1) if len(masks) > 1 else masks[0]
|
248
250
|
if len(masks.shape) == 2:
|
249
251
|
masks = masks[:, :, None]
|
250
252
|
|
ultralytics/utils/tal.py
CHANGED
@@ -3,12 +3,12 @@
|
|
3
3
|
import torch
|
4
4
|
import torch.nn as nn
|
5
5
|
|
6
|
-
from . import LOGGER
|
6
|
+
from . import LOGGER, TORCH_VERSION
|
7
7
|
from .checks import check_version
|
8
8
|
from .metrics import bbox_iou, probiou
|
9
9
|
from .ops import xywhr2xyxyxyxy
|
10
10
|
|
11
|
-
TORCH_1_10 = check_version(
|
11
|
+
TORCH_1_10 = check_version(TORCH_VERSION, "1.10.0")
|
12
12
|
|
13
13
|
|
14
14
|
class TaskAlignedAssigner(nn.Module):
|
ultralytics/utils/torch_utils.py
CHANGED
@@ -27,6 +27,7 @@ from ultralytics.utils import (
|
|
27
27
|
LOGGER,
|
28
28
|
NUM_THREADS,
|
29
29
|
PYTHON_VERSION,
|
30
|
+
TORCH_VERSION,
|
30
31
|
TORCHVISION_VERSION,
|
31
32
|
WINDOWS,
|
32
33
|
colorstr,
|
@@ -35,15 +36,15 @@ from ultralytics.utils.checks import check_version
|
|
35
36
|
from ultralytics.utils.patches import torch_load
|
36
37
|
|
37
38
|
# Version checks (all default to version>=min_version)
|
38
|
-
TORCH_1_9 = check_version(
|
39
|
-
TORCH_1_13 = check_version(
|
40
|
-
TORCH_2_0 = check_version(
|
41
|
-
TORCH_2_4 = check_version(
|
39
|
+
TORCH_1_9 = check_version(TORCH_VERSION, "1.9.0")
|
40
|
+
TORCH_1_13 = check_version(TORCH_VERSION, "1.13.0")
|
41
|
+
TORCH_2_0 = check_version(TORCH_VERSION, "2.0.0")
|
42
|
+
TORCH_2_4 = check_version(TORCH_VERSION, "2.4.0")
|
42
43
|
TORCHVISION_0_10 = check_version(TORCHVISION_VERSION, "0.10.0")
|
43
44
|
TORCHVISION_0_11 = check_version(TORCHVISION_VERSION, "0.11.0")
|
44
45
|
TORCHVISION_0_13 = check_version(TORCHVISION_VERSION, "0.13.0")
|
45
46
|
TORCHVISION_0_18 = check_version(TORCHVISION_VERSION, "0.18.0")
|
46
|
-
if WINDOWS and check_version(
|
47
|
+
if WINDOWS and check_version(TORCH_VERSION, "==2.4.0"): # reject version 2.4.0 on Windows
|
47
48
|
LOGGER.warning(
|
48
49
|
"Known issue with torch==2.4.0 on Windows with CPU, recommend upgrading to torch>=2.4.1 to resolve "
|
49
50
|
"https://github.com/ultralytics/ultralytics/issues/15049"
|
@@ -165,7 +166,7 @@ def select_device(device="", batch=0, newline=False, verbose=True):
|
|
165
166
|
if isinstance(device, torch.device) or str(device).startswith(("tpu", "intel")):
|
166
167
|
return device
|
167
168
|
|
168
|
-
s = f"Ultralytics {__version__} 🚀 Python-{PYTHON_VERSION} torch-{
|
169
|
+
s = f"Ultralytics {__version__} 🚀 Python-{PYTHON_VERSION} torch-{TORCH_VERSION} "
|
169
170
|
device = str(device).lower()
|
170
171
|
for remove in "cuda:", "none", "(", ")", "[", "]", "'", " ":
|
171
172
|
device = device.replace(remove, "") # to string, 'cuda:0' -> '0' and '(0, 1)' -> '0,1'
|
ultralytics/utils/tqdm.py
CHANGED
@@ -88,11 +88,11 @@ class TQDM:
|
|
88
88
|
mininterval: float = 0.1,
|
89
89
|
disable: bool | None = None,
|
90
90
|
unit: str = "it",
|
91
|
-
unit_scale: bool =
|
91
|
+
unit_scale: bool = True,
|
92
92
|
unit_divisor: int = 1000,
|
93
|
-
bar_format: str | None = None,
|
93
|
+
bar_format: str | None = None, # kept for API compatibility; not used for formatting
|
94
94
|
initial: int = 0,
|
95
|
-
**kwargs,
|
95
|
+
**kwargs,
|
96
96
|
) -> None:
|
97
97
|
"""
|
98
98
|
Initialize the TQDM progress bar with specified configuration options.
|
@@ -138,11 +138,8 @@ class TQDM:
|
|
138
138
|
self.mininterval = max(mininterval, self.NONINTERACTIVE_MIN_INTERVAL) if self.noninteractive else mininterval
|
139
139
|
self.initial = initial
|
140
140
|
|
141
|
-
#
|
142
|
-
|
143
|
-
self.bar_format = bar_format or "{desc}: {percent:.0f}% {bar} {n}/{total} {rate} {elapsed}<{remaining}"
|
144
|
-
else:
|
145
|
-
self.bar_format = bar_format or "{desc}: {bar} {n} {rate} {elapsed}"
|
141
|
+
# Kept for API compatibility (unused for f-string formatting)
|
142
|
+
self.bar_format = bar_format
|
146
143
|
|
147
144
|
self.file = file or sys.stdout
|
148
145
|
|
@@ -151,48 +148,31 @@ class TQDM:
|
|
151
148
|
self.last_print_n = self.initial
|
152
149
|
self.last_print_t = time.time()
|
153
150
|
self.start_t = time.time()
|
154
|
-
self.last_rate = 0
|
151
|
+
self.last_rate = 0.0
|
155
152
|
self.closed = False
|
153
|
+
self.is_bytes = unit_scale and unit in ("B", "bytes")
|
154
|
+
self.scales = (
|
155
|
+
[(1073741824, "GB/s"), (1048576, "MB/s"), (1024, "KB/s")]
|
156
|
+
if self.is_bytes
|
157
|
+
else [(1e9, f"G{self.unit}/s"), (1e6, f"M{self.unit}/s"), (1e3, f"K{self.unit}/s")]
|
158
|
+
)
|
156
159
|
|
157
|
-
# Display initial bar if we have total and not disabled
|
158
160
|
if not self.disable and self.total and not self.noninteractive:
|
159
161
|
self._display()
|
160
162
|
|
161
163
|
def _format_rate(self, rate: float) -> str:
|
162
|
-
"""Format rate with
|
164
|
+
"""Format rate with units."""
|
163
165
|
if rate <= 0:
|
164
166
|
return ""
|
167
|
+
fallback = f"{rate:.1f}B/s" if self.is_bytes else f"{rate:.1f}{self.unit}/s"
|
168
|
+
return next((f"{rate / t:.1f}{u}" for t, u in self.scales if rate >= t), fallback)
|
165
169
|
|
166
|
-
|
167
|
-
if self.unit in ("B", "bytes") and self.unit_scale:
|
168
|
-
return next(
|
169
|
-
(
|
170
|
-
f"{rate / threshold:.1f}{unit}"
|
171
|
-
for threshold, unit in [
|
172
|
-
(1073741824, "GB/s"),
|
173
|
-
(1048576, "MB/s"),
|
174
|
-
(1024, "KB/s"),
|
175
|
-
]
|
176
|
-
if rate >= threshold
|
177
|
-
),
|
178
|
-
f"{rate:.1f}B/s",
|
179
|
-
)
|
180
|
-
# For other scalable units, use decimal units
|
181
|
-
if self.unit_scale and self.unit in ("it", "items", ""):
|
182
|
-
for threshold, prefix in [(1000000, "M"), (1000, "K")]:
|
183
|
-
if rate >= threshold:
|
184
|
-
return f"{rate / threshold:.1f}{prefix}{self.unit}/s"
|
185
|
-
|
186
|
-
# Default formatting
|
187
|
-
precision = ".1f" if rate >= 1 else ".2f"
|
188
|
-
return f"{rate:{precision}}{self.unit}/s"
|
189
|
-
|
190
|
-
def _format_num(self, num: int) -> str:
|
170
|
+
def _format_num(self, num: int | float) -> str:
|
191
171
|
"""Format number with optional unit scaling."""
|
192
|
-
if not self.unit_scale or self.
|
172
|
+
if not self.unit_scale or not self.is_bytes:
|
193
173
|
return str(num)
|
194
174
|
|
195
|
-
for unit in
|
175
|
+
for unit in ("", "K", "M", "G", "T"):
|
196
176
|
if abs(num) < self.unit_divisor:
|
197
177
|
return f"{num:3.1f}{unit}B" if unit else f"{num:.0f}B"
|
198
178
|
num /= self.unit_divisor
|
@@ -224,8 +204,7 @@ class TQDM:
|
|
224
204
|
"""Check if display should update."""
|
225
205
|
if self.noninteractive:
|
226
206
|
return False
|
227
|
-
|
228
|
-
return True if self.total and self.n >= self.total else dt >= self.mininterval
|
207
|
+
return (self.total is not None and self.n >= self.total) or (dt >= self.mininterval)
|
229
208
|
|
230
209
|
def _display(self, final: bool = False) -> None:
|
231
210
|
"""Display progress bar."""
|
@@ -240,8 +219,8 @@ class TQDM:
|
|
240
219
|
return
|
241
220
|
|
242
221
|
# Calculate rate (avoid crazy numbers)
|
243
|
-
if dt > self.MIN_RATE_CALC_INTERVAL:
|
244
|
-
rate = dn / dt
|
222
|
+
if dt > self.MIN_RATE_CALC_INTERVAL:
|
223
|
+
rate = dn / dt if dt else 0.0
|
245
224
|
# Smooth rate for reasonable values, use raw rate for very high values
|
246
225
|
if rate < self.MAX_SMOOTHED_RATE:
|
247
226
|
self.last_rate = self.RATE_SMOOTHING_FACTOR * rate + (1 - self.RATE_SMOOTHING_FACTOR) * self.last_rate
|
@@ -249,8 +228,8 @@ class TQDM:
|
|
249
228
|
else:
|
250
229
|
rate = self.last_rate
|
251
230
|
|
252
|
-
# At completion, use
|
253
|
-
if self.
|
231
|
+
# At completion, use overall rate
|
232
|
+
if self.total and self.n >= self.total:
|
254
233
|
overall_elapsed = current_time - self.start_t
|
255
234
|
if overall_elapsed > 0:
|
256
235
|
rate = self.n / overall_elapsed
|
@@ -260,45 +239,41 @@ class TQDM:
|
|
260
239
|
self.last_print_t = current_time
|
261
240
|
elapsed = current_time - self.start_t
|
262
241
|
|
263
|
-
#
|
242
|
+
# Remaining time
|
264
243
|
remaining_str = ""
|
265
244
|
if self.total and 0 < self.n < self.total and elapsed > 0:
|
266
|
-
est_rate = rate or self.n / elapsed
|
267
|
-
remaining_str = self._format_time((self.total - self.n) / est_rate)
|
245
|
+
est_rate = rate or (self.n / elapsed)
|
246
|
+
remaining_str = f"<{self._format_time((self.total - self.n) / est_rate)}"
|
268
247
|
|
269
|
-
#
|
248
|
+
# Numbers and percent
|
270
249
|
if self.total:
|
271
250
|
percent = (self.n / self.total) * 100
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
251
|
+
n_str = self._format_num(self.n)
|
252
|
+
t_str = self._format_num(self.total)
|
253
|
+
if self.is_bytes:
|
254
|
+
# Collapse suffix only when identical (e.g. "5.4/5.4MB")
|
255
|
+
if n_str[-2] == t_str[-2]:
|
256
|
+
n_str = n_str.rstrip("KMGTPB") # Remove unit suffix from current if different than total
|
277
257
|
else:
|
278
|
-
percent = 0
|
279
|
-
|
280
|
-
total = "?"
|
258
|
+
percent = 0.0
|
259
|
+
n_str, t_str = self._format_num(self.n), "?"
|
281
260
|
|
282
261
|
elapsed_str = self._format_time(elapsed)
|
262
|
+
rate_str = self._format_rate(rate) or (self._format_rate(self.n / elapsed) if elapsed > 0 else "")
|
283
263
|
|
284
|
-
|
285
|
-
|
286
|
-
|
264
|
+
bar = self._generate_bar()
|
265
|
+
|
266
|
+
# Compose progress line via f-strings (two shapes: with/without total)
|
267
|
+
if self.total:
|
268
|
+
if self.is_bytes and self.n >= self.total:
|
269
|
+
# Completed bytes: show only final size
|
270
|
+
progress_str = f"{self.desc}: {percent:.0f}% {bar} {t_str} {rate_str} {elapsed_str}"
|
271
|
+
else:
|
272
|
+
progress_str = (
|
273
|
+
f"{self.desc}: {percent:.0f}% {bar} {n_str}/{t_str} {rate_str} {elapsed_str}{remaining_str}"
|
274
|
+
)
|
287
275
|
else:
|
288
|
-
|
289
|
-
|
290
|
-
# Format progress string
|
291
|
-
progress_str = format_str.format(
|
292
|
-
desc=self.desc,
|
293
|
-
percent=percent,
|
294
|
-
bar=self._generate_bar(),
|
295
|
-
n=n,
|
296
|
-
total=total,
|
297
|
-
rate=self._format_rate(rate) or (self._format_rate(self.n / elapsed) if elapsed > 0 else ""),
|
298
|
-
remaining=remaining_str,
|
299
|
-
elapsed=elapsed_str,
|
300
|
-
unit=self.unit,
|
301
|
-
)
|
276
|
+
progress_str = f"{self.desc}: {bar} {n_str} {rate_str} {elapsed_str}"
|
302
277
|
|
303
278
|
# Write to output
|
304
279
|
try:
|
@@ -336,7 +311,7 @@ class TQDM:
|
|
336
311
|
if self.closed:
|
337
312
|
return
|
338
313
|
|
339
|
-
self.closed = True
|
314
|
+
self.closed = True
|
340
315
|
|
341
316
|
if not self.disable:
|
342
317
|
# Final display
|
ultralytics/utils/tuner.py
CHANGED
@@ -129,7 +129,7 @@ def run_ray_tune(
|
|
129
129
|
{**train_args, **{"exist_ok": train_args.pop("resume", False)}}, # resume w/ same tune_dir
|
130
130
|
),
|
131
131
|
name=train_args.pop("name", "tune"), # runs/{task}/{tune_dir}
|
132
|
-
)
|
132
|
+
) # must be absolute dir
|
133
133
|
tune_dir.mkdir(parents=True, exist_ok=True)
|
134
134
|
if tune.Tuner.can_restore(tune_dir):
|
135
135
|
LOGGER.info(f"{colorstr('Tuner: ')} Resuming tuning run {tune_dir}...")
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: ultralytics
|
3
|
-
Version: 8.3.
|
3
|
+
Version: 8.3.194
|
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>
|
@@ -3,15 +3,15 @@ tests/conftest.py,sha256=LXtQJcFNWPGuzauTGkiXgsvVC3llJKfg22WcmhRzuQc,2593
|
|
3
3
|
tests/test_cli.py,sha256=EMf5gTAopOnIz8VvzaM-Qb044o7D0flnUHYQ-2ffOM4,5670
|
4
4
|
tests/test_cuda.py,sha256=Z-MX1aIBQyt_fAAgKxBEznE0Mj7caSwrctW9z__NGzU,8240
|
5
5
|
tests/test_engine.py,sha256=Jpt2KVrltrEgh2-3Ykouz-2Z_2fza0eymL5ectRXadM,4922
|
6
|
-
tests/test_exports.py,sha256=
|
6
|
+
tests/test_exports.py,sha256=dWuroSyqXnrc0lE-RNTf7pZoXXXEkOs31u7nhOiEHS0,10994
|
7
7
|
tests/test_integrations.py,sha256=kl_AKmE_Qs1GB0_91iVwbzNxofm_hFTt0zzU6JF-pg4,6323
|
8
|
-
tests/test_python.py,sha256=
|
8
|
+
tests/test_python.py,sha256=FGZ2XabwLmXLcKTmsQHBBbxoVTCmk0B1ACcTWUBIUIo,27911
|
9
9
|
tests/test_solutions.py,sha256=6wJ9-lhyWSAm7zaR4D9L_DrUA3iJU1NgqmbQO6PIuvo,13211
|
10
|
-
ultralytics/__init__.py,sha256=
|
10
|
+
ultralytics/__init__.py,sha256=UXztbDjWj3KFSfHZL_6SgEbd4QY_ofQJ2YQxENZsaJA,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=
|
14
|
+
ultralytics/cfg/__init__.py,sha256=oi3unUYklhdf-uF_0v9dSBOj5EyPRKQbgVVKHrztKns,39955
|
15
15
|
ultralytics/cfg/default.yaml,sha256=1SspGAK_K_DT7DBfEScJh4jsJUTOxahehZYj92xmj7o,8347
|
16
16
|
ultralytics/cfg/datasets/Argoverse.yaml,sha256=J4ItoUlE_EiYTmp1DFKYHfbqHkj8j4wUtRJQhaMIlBM,3275
|
17
17
|
ultralytics/cfg/datasets/DOTAv1.5.yaml,sha256=VZ_KKFX0H2YvlFVJ8JHcLWYBZ2xiQ6Z-ROSTiKWpS7c,1211
|
@@ -46,7 +46,7 @@ ultralytics/cfg/datasets/open-images-v7.yaml,sha256=wK9v3OAGdHORkFdqoBi0hS0fa1b7
|
|
46
46
|
ultralytics/cfg/datasets/package-seg.yaml,sha256=V4uyTDWWzgft24y9HJWuELKuZ5AndAHXbanxMI6T8GU,849
|
47
47
|
ultralytics/cfg/datasets/signature.yaml,sha256=gBvU3715gVxVAafI_yaYczGX3kfEfA4BttbiMkgOXNk,774
|
48
48
|
ultralytics/cfg/datasets/tiger-pose.yaml,sha256=Y_8htA4--6hmpqHTW-Ix4t9SdaWenSSyl_FUtI2A7n8,926
|
49
|
-
ultralytics/cfg/datasets/xView.yaml,sha256=
|
49
|
+
ultralytics/cfg/datasets/xView.yaml,sha256=eaQ7bYDRrOMRdaxN_wzlH_fN0wdIlT_GQDtPzrHS2-s,5353
|
50
50
|
ultralytics/cfg/models/11/yolo11-cls-resnet18.yaml,sha256=1Ycp9qMrwpb8rq7cqht3Q-1gMN0R87U35nm2j_isdro,524
|
51
51
|
ultralytics/cfg/models/11/yolo11-cls.yaml,sha256=17l5GdN-Vst4LvafsK2-q6Li9VX9UlUcT5ClCtikweE,1412
|
52
52
|
ultralytics/cfg/models/11/yolo11-obb.yaml,sha256=3M_c06B-y8da4tunHVxQQ-iFUNLKUfofqCZTpnH5FEU,2034
|
@@ -114,23 +114,23 @@ ultralytics/data/dataset.py,sha256=JC3sHsKva65sSptdAJHfh90yyag8WrqGXcXNpD9C-f0,3
|
|
114
114
|
ultralytics/data/loaders.py,sha256=Mt6ogS2SUq8SE6oJajX7xSyzIxvwjKUhxFbIynhBlGk,31748
|
115
115
|
ultralytics/data/split.py,sha256=5ubnL_wsEutFQOj4I4K01L9UpZrrO_vO3HrydSLJyIY,5107
|
116
116
|
ultralytics/data/split_dota.py,sha256=gSGHRWZFQOofMkb8GcTtkUb5gV5jtOV7bzVMovTW0ak,12910
|
117
|
-
ultralytics/data/utils.py,sha256=
|
117
|
+
ultralytics/data/utils.py,sha256=1YF_-v-laBG41WGmnLo4xsfOhCNNN1og8b2yo11FJos,36716
|
118
118
|
ultralytics/data/scripts/download_weights.sh,sha256=0y8XtZxOru7dVThXDFUXLHBuICgOIqZNUwpyL4Rh6lg,595
|
119
119
|
ultralytics/data/scripts/get_coco.sh,sha256=UuJpJeo3qQpTHVINeOpmP0NYmg8PhEFE3A8J3jKrnPw,1768
|
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=
|
124
|
-
ultralytics/engine/model.py,sha256=
|
125
|
-
ultralytics/engine/predictor.py,sha256=
|
123
|
+
ultralytics/engine/exporter.py,sha256=c7OXFm9qBliL9zVL5g8_hVp8dVwZd3L-MnwSZDPLVrw,75428
|
124
|
+
ultralytics/engine/model.py,sha256=q3rj1QmJoR4uYXb6dvn2dVRheEY8TzJhm9KznD_VDso,53488
|
125
|
+
ultralytics/engine/predictor.py,sha256=EzFcRzihNTYgdayviLwEk7pUOotNoEVbQtVFI18jNpM,22625
|
126
126
|
ultralytics/engine/results.py,sha256=115lVbiqzyho1fXm-YpqQBtKiv-Wo2FPNhz6ExYHtCk,71499
|
127
|
-
ultralytics/engine/trainer.py,sha256=
|
127
|
+
ultralytics/engine/trainer.py,sha256=_mTG-z6xnOdFUmB6uOF8HQkFb_uMwP0MrJHlt7X3zVw,40457
|
128
128
|
ultralytics/engine/tuner.py,sha256=XuqcjyGpD79pUVn-PXlJJGKXgH1yblPdYBH_R2kHWSU,20586
|
129
129
|
ultralytics/engine/validator.py,sha256=8ky0lcMCYDY7RGYRUowDAKxEMfsPBLpT7LlgfHA-IsY,16681
|
130
|
-
ultralytics/hub/__init__.py,sha256=
|
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=iz7HbxU63OHr-7bNm1QIKPVRQc-3lnXMbWH19bgFVfQ,18450
|
133
|
-
ultralytics/hub/utils.py,sha256=
|
133
|
+
ultralytics/hub/utils.py,sha256=19ZbwQuIumEb9JwdpUwDxmCZq1Ftm-7whU5yvGABvhY,6384
|
134
134
|
ultralytics/hub/google/__init__.py,sha256=-Hh4rUoQBdUFkPqnj7UeQUMdejVbbL8nFFrKAT5OxhE,8468
|
135
135
|
ultralytics/models/__init__.py,sha256=DqQFFYJ4IQlqIDb61H1HzcnZU7SuHN-43bw94-l-YAQ,309
|
136
136
|
ultralytics/models/fastsam/__init__.py,sha256=HGJ8EKlBAsdF-e2aIwQLjSDAFI_r0yHR0A1gzrp4vqE,231
|
@@ -151,7 +151,7 @@ ultralytics/models/sam/__init__.py,sha256=4VtjxrbrSsqBvteaD_CwA4Nj3DdSUG1MknymtW
|
|
151
151
|
ultralytics/models/sam/amg.py,sha256=07UkNkcbOUj3tc9L2H9rAuH5s1WDJLqX81kt2zbzDsw,11821
|
152
152
|
ultralytics/models/sam/build.py,sha256=J6n-_QOYLa63jldEZmhRe9D3Is_AJE8xyZLUjzfRyTY,12629
|
153
153
|
ultralytics/models/sam/model.py,sha256=rTBCWYoYDKvF34FY5RXhdTTSNa_fO4LjkJbIPgYh-L8,7237
|
154
|
-
ultralytics/models/sam/predict.py,sha256=
|
154
|
+
ultralytics/models/sam/predict.py,sha256=E6BrWPJw26ZS6Cv0IhdMhXllnx6XiNvTHfQlBJGrEr4,104963
|
155
155
|
ultralytics/models/sam/modules/__init__.py,sha256=lm6MckFYCPTbqIoX7w0s_daxdjNeBeKW6DXppv1-QUM,70
|
156
156
|
ultralytics/models/sam/modules/blocks.py,sha256=Wc6ThlZ5G3S8XJrH6WclbyzI3vIqWHKAWYb7n3A6Fdk,46055
|
157
157
|
ultralytics/models/sam/modules/decoders.py,sha256=Vc0nDC1Ex8RBxJX6j-RWRdkYQif0A4-0vtE13aeF8eA,25620
|
@@ -185,7 +185,7 @@ ultralytics/models/yolo/pose/val.py,sha256=A4Cvzmqyu0oW5UC9mqNL731ngAwqQBic6tdMc
|
|
185
185
|
ultralytics/models/yolo/segment/__init__.py,sha256=3IThhZ1wlkY9FvmWm9cE-5-ZyE6F1FgzAtQ6jOOFzzw,275
|
186
186
|
ultralytics/models/yolo/segment/predict.py,sha256=qlprQCZn4_bpjpI08U0MU9Q9_1gpHrw_7MXwtXE1l1Y,5377
|
187
187
|
ultralytics/models/yolo/segment/train.py,sha256=bBEnEUHqN3QlbreD5Fy-h1X5Ps-dONH2r9EnoLc72x4,3762
|
188
|
-
ultralytics/models/yolo/segment/val.py,sha256=
|
188
|
+
ultralytics/models/yolo/segment/val.py,sha256=Xy2T-Y4IjjuR5GqWGJjHmCLGL9FxEWfMXDoCoP_ZBBM,11147
|
189
189
|
ultralytics/models/yolo/world/__init__.py,sha256=nlh8I6t8hMGz_vZg8QSlsUW1R-2eKvn9CGUoPPQEGhA,131
|
190
190
|
ultralytics/models/yolo/world/train.py,sha256=9tSDba3X9VA2y-2oJJUMdXUBi-IdgRmqLW18UqfukvI,7866
|
191
191
|
ultralytics/models/yolo/world/train_world.py,sha256=lk9z_INGPSTP_W7Rjh3qrWSmjHaxOJtGngonh1cj2SM,9551
|
@@ -193,10 +193,10 @@ ultralytics/models/yolo/yoloe/__init__.py,sha256=6SLytdJtwu37qewf7CobG7C7Wl1m-xt
|
|
193
193
|
ultralytics/models/yolo/yoloe/predict.py,sha256=GmQxCQe7sLomAujde53jQzquzryNn6fEjS4Oalf3mPs,7124
|
194
194
|
ultralytics/models/yolo/yoloe/train.py,sha256=lAb-5TgYA_Z6rwEYCMdPcfjJmCGYQqXE5I40n25CTRk,14067
|
195
195
|
ultralytics/models/yolo/yoloe/train_seg.py,sha256=aCV7M8oQOvODFnU4piZdJh3tIrBJYAzZfRVRx1vRgxo,4956
|
196
|
-
ultralytics/models/yolo/yoloe/val.py,sha256=
|
197
|
-
ultralytics/nn/__init__.py,sha256=
|
198
|
-
ultralytics/nn/autobackend.py,sha256=
|
199
|
-
ultralytics/nn/tasks.py,sha256=
|
196
|
+
ultralytics/models/yolo/yoloe/val.py,sha256=MnS2YwhRxdqXPRlExHt-9HRp8KKIHuFdmiNH1z6LedI,9795
|
197
|
+
ultralytics/nn/__init__.py,sha256=PJgOn2phQTTBR2P3s_JWvGeGXQpvw1znsumKow4tCuE,545
|
198
|
+
ultralytics/nn/autobackend.py,sha256=MJtvfT9tiJtlLQIp88wnSImMGxwCAqS6fNMZtMJe1ZA,41063
|
199
|
+
ultralytics/nn/tasks.py,sha256=tvoVVqVoMZuylLmUJNDs9eX4bdFbDibQKd3lJed5fYY,70470
|
200
200
|
ultralytics/nn/text_model.py,sha256=lserJWlXNzP31jB4xA-7gkbhB0VsMBGiE9G8wYpztvE,15275
|
201
201
|
ultralytics/nn/modules/__init__.py,sha256=BPMbEm1daI7Tuds3zph2_afAX7Gq1uAqK8BfiCfKTZs,3198
|
202
202
|
ultralytics/nn/modules/activation.py,sha256=75JcIMH2Cu9GTC2Uf55r_5YLpxcrXQDaVoeGQ0hlUAU,2233
|
@@ -235,14 +235,15 @@ ultralytics/trackers/utils/__init__.py,sha256=lm6MckFYCPTbqIoX7w0s_daxdjNeBeKW6D
|
|
235
235
|
ultralytics/trackers/utils/gmc.py,sha256=a4WuIh976_GYogvlQEPKTNE59JNNtSNlT_IPrz4wmrM,14028
|
236
236
|
ultralytics/trackers/utils/kalman_filter.py,sha256=PPmM0lwBMdT_hGojvfLoUsBUFMBBMNRAxKbMcQa3wJ0,21619
|
237
237
|
ultralytics/trackers/utils/matching.py,sha256=uSYtywqi1lE_uNN1FwuBFPyISfDQXHMu8K5KH69nrRI,7160
|
238
|
-
ultralytics/utils/__init__.py,sha256=
|
238
|
+
ultralytics/utils/__init__.py,sha256=8vYownbjAVDmRc2cafLetRjcq-YsUcy1LPKmSrz5yuM,53204
|
239
239
|
ultralytics/utils/autobatch.py,sha256=i6KYLLSItKP1Q2IUlTPHrZhjcxl7UOjs0Seb8bF8pvM,5124
|
240
240
|
ultralytics/utils/autodevice.py,sha256=Od9SGx6xAQoX-3L62PS7I6xOxbbqjYLR4Wipgn5WoDc,8843
|
241
241
|
ultralytics/utils/benchmarks.py,sha256=zKI-DxEqaVmqlE2pg9p6j1kI7Efo1OyM1NnKubYpDU8,31458
|
242
|
-
ultralytics/utils/checks.py,sha256=
|
242
|
+
ultralytics/utils/checks.py,sha256=WBuJKFiXGqf-5n0S_QNwRet3ZxVIFMdG0VPZSoOJwYM,34468
|
243
243
|
ultralytics/utils/dist.py,sha256=A9lDGtGefTjSVvVS38w86GOdbtLzNBDZuDGK0MT4PRI,4170
|
244
244
|
ultralytics/utils/downloads.py,sha256=mLOLonKQsePC15sLVZJzGyLmD_TZPkL1T_qd0gUb4lA,23029
|
245
245
|
ultralytics/utils/errors.py,sha256=XT9Ru7ivoBgofK6PlnyigGoa7Fmf5nEhyHtnD-8TRXI,1584
|
246
|
+
ultralytics/utils/events.py,sha256=v2RmLlx78_K6xQfOAuUTJMOexAgNdiuiOvvnsH65oDA,4679
|
246
247
|
ultralytics/utils/export.py,sha256=xHBBDyI0hGQ1hbUi-uWnCgnFBES77nXqZFtgSrX0VXA,9838
|
247
248
|
ultralytics/utils/files.py,sha256=kxE2rkBuZL288nSN7jxLljmDnBgc16rekEXeRjhbUoo,8213
|
248
249
|
ultralytics/utils/git.py,sha256=DcaxKNQfCiG3cxdzuw7M6l_VXgaSVqkERQt_vl8UyXM,5512
|
@@ -251,29 +252,29 @@ ultralytics/utils/logger.py,sha256=o_vH4CCgQat6_Sbmwm1sUAJ4muAgVcsUed-WqpGNQZw,1
|
|
251
252
|
ultralytics/utils/loss.py,sha256=sC2efov3Uwg2eT5oOzMHRfnQLZvtGXSdMuWBTKxyxPw,39816
|
252
253
|
ultralytics/utils/metrics.py,sha256=9nykBkIy6soJebhc31UpaQghC4kz8e0qUpGpnr4yaGs,68809
|
253
254
|
ultralytics/utils/nms.py,sha256=wCRQ7O7shv5ccEWHgtF9Ky_vUeyumxFLWBFEj1h0U54,14199
|
254
|
-
ultralytics/utils/ops.py,sha256=
|
255
|
+
ultralytics/utils/ops.py,sha256=_qd_MY6IJQbhdihNvJCRe4Ws22awGrS2QUuRFdkk-EI,26886
|
255
256
|
ultralytics/utils/patches.py,sha256=j0fXwX3YqKrON7yrmSVkXsn__tsvs4qVuysH-hzcxOE,6541
|
256
257
|
ultralytics/utils/plotting.py,sha256=6iPtxQJ7JFTv2vWpSzP90plkksXhvql1EVQaKomkuiQ,47515
|
257
|
-
ultralytics/utils/tal.py,sha256=
|
258
|
-
ultralytics/utils/torch_utils.py,sha256=
|
259
|
-
ultralytics/utils/tqdm.py,sha256=
|
258
|
+
ultralytics/utils/tal.py,sha256=LrziY_ZHz4wln3oOnqAzgyPaXKoup17Sa103BpuaQFU,20935
|
259
|
+
ultralytics/utils/torch_utils.py,sha256=SKgOEaa2_7k7tGI4VfNWcQV4wvjLWVUusJreEc4bPmI,39488
|
260
|
+
ultralytics/utils/tqdm.py,sha256=ny5RIg2OTkWQ7gdaXfYaoIgR0Xn2_hNGB6tUpO2Unns,16137
|
260
261
|
ultralytics/utils/triton.py,sha256=-qG-ZP5uotcD8FZyaAcEGHX7Cv9_yBG8UHvmmXpYZkM,5422
|
261
|
-
ultralytics/utils/tuner.py,sha256=
|
262
|
+
ultralytics/utils/tuner.py,sha256=9D4dSIvwwxcNSJcH2QJ92qiIVi9zu-1L7_PBZ8okDyE,6816
|
262
263
|
ultralytics/utils/callbacks/__init__.py,sha256=hzL63Rce6VkZhP4Lcim9LKjadixaQG86nKqPhk7IkS0,242
|
263
264
|
ultralytics/utils/callbacks/base.py,sha256=dGir0vkJY4jjprW63e23Qy4kHUT5dOINPii6HnwJuPg,6893
|
264
265
|
ultralytics/utils/callbacks/clearml.py,sha256=xr5mZT_cY6AY_drbdCXFt-Dp2fOjRELxLDhDoRhNPg8,6067
|
265
266
|
ultralytics/utils/callbacks/comet.py,sha256=t-O4Kc57wLFFEclyl6XJWAixrNle0mpZK5IEM__WoTY,25393
|
266
267
|
ultralytics/utils/callbacks/dvc.py,sha256=NV0DXMQ1B5Sk5fmh60QFUGkifrAz-vwit5qhdfsyqXc,7511
|
267
|
-
ultralytics/utils/callbacks/hub.py,sha256=
|
268
|
+
ultralytics/utils/callbacks/hub.py,sha256=fVLqqr3ZM6hoYFlVMEeejfq1MWDrkWCskPFOG3HGILQ,4159
|
268
269
|
ultralytics/utils/callbacks/mlflow.py,sha256=6K8I5zij1yq3TUW9c5BBQNqdzz3IXugQjwKoBOvV6ag,5344
|
269
270
|
ultralytics/utils/callbacks/neptune.py,sha256=j8pecmlcsM8FGzLKWoBw5xUsi5t8E5HuxY7TR5Um_O8,4612
|
270
271
|
ultralytics/utils/callbacks/platform.py,sha256=a7T_8htoBB0uX1WIc392UJnhDjxkRyQMvhPYKR6wUTU,2008
|
271
272
|
ultralytics/utils/callbacks/raytune.py,sha256=S6Bq16oQDQ8BQgnZzA0zJHGN_BBr8iAM_WtGoLiEcwg,1283
|
272
273
|
ultralytics/utils/callbacks/tensorboard.py,sha256=MDPBW7aDes-66OE6YqKXXvqA_EocjzEMHWGM-8z9vUQ,5281
|
273
274
|
ultralytics/utils/callbacks/wb.py,sha256=ngQO8EJ1kxJDF1YajScVtzBbm26jGuejA0uWeOyvf5A,7685
|
274
|
-
ultralytics-8.3.
|
275
|
-
ultralytics-8.3.
|
276
|
-
ultralytics-8.3.
|
277
|
-
ultralytics-8.3.
|
278
|
-
ultralytics-8.3.
|
279
|
-
ultralytics-8.3.
|
275
|
+
ultralytics-8.3.194.dist-info/licenses/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
|
276
|
+
ultralytics-8.3.194.dist-info/METADATA,sha256=cV5XQUxd31Y4JxnDdpSznTtc6OnYMXIURwy9Fg11emw,37693
|
277
|
+
ultralytics-8.3.194.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
278
|
+
ultralytics-8.3.194.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
|
279
|
+
ultralytics-8.3.194.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
|
280
|
+
ultralytics-8.3.194.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|