ultralytics 8.3.207__py3-none-any.whl → 8.3.208__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_cuda.py CHANGED
@@ -104,7 +104,7 @@ def test_export_engine_matrix(task, dynamic, int8, half, batch):
104
104
  )
105
105
  YOLO(file)([SOURCE] * batch, imgsz=64 if dynamic else 32, device=DEVICES[0]) # exported model inference
106
106
  Path(file).unlink() # cleanup
107
- Path(file).with_suffix(".cache").unlink() if int8 else None # cleanup INT8 cache
107
+ Path(file).with_suffix(".cache").unlink(missing_ok=True) if int8 else None # cleanup INT8 cache
108
108
 
109
109
 
110
110
  @pytest.mark.skipif(not DEVICES, reason="No CUDA devices available")
tests/test_exports.py CHANGED
@@ -101,7 +101,7 @@ def test_export_onnx_matrix(task, dynamic, int8, half, batch, simplify, nms):
101
101
  [ # generate all combinations except for exclusion cases
102
102
  (task, dynamic, int8, half, batch, nms)
103
103
  for task, dynamic, int8, half, batch, nms in product(
104
- TASKS, [False, True], [False], [False], [1, 2], [True, False]
104
+ TASKS, [False, True], [False], [False, True], [1, 2], [True, False]
105
105
  )
106
106
  if not (task == "classify" and nms)
107
107
  ],
tests/test_python.py CHANGED
@@ -408,7 +408,7 @@ def test_utils_init():
408
408
  def test_utils_checks():
409
409
  """Test various utility checks for filenames, git status, requirements, image sizes, and versions."""
410
410
  checks.check_yolov5u_filename("yolov5n.pt")
411
- checks.check_requirements() # check requirements.txt
411
+ checks.check_requirements("numpy") # check requirements.txt
412
412
  checks.check_imgsz([600, 600], max_dim=1)
413
413
  checks.check_imshow(warn=True)
414
414
  checks.check_version("ultralytics", "8.0.0")
ultralytics/__init__.py CHANGED
@@ -1,6 +1,6 @@
1
1
  # Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
2
2
 
3
- __version__ = "8.3.207"
3
+ __version__ = "8.3.208"
4
4
 
5
5
  import importlib
6
6
  import os
@@ -360,8 +360,8 @@ class Exporter:
360
360
  if self.args.half and self.args.int8:
361
361
  LOGGER.warning("half=True and int8=True are mutually exclusive, setting half=False.")
362
362
  self.args.half = False
363
- if self.args.half and onnx and self.device.type == "cpu":
364
- LOGGER.warning("half=True only compatible with GPU export, i.e. use device=0")
363
+ if self.args.half and (onnx or jit) and self.device.type == "cpu":
364
+ LOGGER.warning("half=True only compatible with GPU export, i.e. use device=0, setting half=False.")
365
365
  self.args.half = False
366
366
  self.imgsz = check_imgsz(self.args.imgsz, stride=model.stride, min_dim=2) # check image size
367
367
  if self.args.optimize:
@@ -463,7 +463,7 @@ class Exporter:
463
463
  y = None
464
464
  for _ in range(2): # dry runs
465
465
  y = NMSModel(model, self.args)(im) if self.args.nms and not coreml and not imx else model(im)
466
- if self.args.half and onnx and self.device.type != "cpu":
466
+ if self.args.half and (onnx or jit) and self.device.type != "cpu":
467
467
  im, model = im.half(), model.half() # to FP16
468
468
 
469
469
  # Filter warnings
@@ -510,11 +510,11 @@ class Exporter:
510
510
  self.run_callbacks("on_export_start")
511
511
  # Exports
512
512
  f = [""] * len(fmts) # exported filenames
513
- if jit or ncnn: # TorchScript
513
+ if jit: # TorchScript
514
514
  f[0] = self.export_torchscript()
515
515
  if engine: # TensorRT required before ONNX
516
516
  f[1] = self.export_engine(dla=dla)
517
- if onnx: # ONNX
517
+ if onnx or ncnn: # ONNX
518
518
  f[2] = self.export_onnx()
519
519
  if xml: # OpenVINO
520
520
  f[3] = self.export_openvino()
@@ -806,7 +806,7 @@ class Exporter:
806
806
 
807
807
  LOGGER.info(f"\n{prefix} starting export with NCNN {ncnn.__version__}...")
808
808
  f = Path(str(self.file).replace(self.file.suffix, f"_ncnn_model{os.sep}"))
809
- f_ts = self.file.with_suffix(".torchscript")
809
+ f_onnx = self.file.with_suffix(".onnx")
810
810
 
811
811
  name = Path("pnnx.exe" if WINDOWS else "pnnx") # PNNX filename
812
812
  pnnx = name if name.is_file() else (ROOT / name)
@@ -820,10 +820,10 @@ class Exporter:
820
820
  try:
821
821
  release, assets = get_github_assets(repo="pnnx/pnnx")
822
822
  asset = [x for x in assets if f"{system}.zip" in x][0]
823
- assert isinstance(asset, str), "Unable to retrieve PNNX repo assets" # i.e. pnnx-20240410-macos.zip
823
+ assert isinstance(asset, str), "Unable to retrieve PNNX repo assets" # i.e. pnnx-20250930-macos.zip
824
824
  LOGGER.info(f"{prefix} successfully found latest PNNX asset file {asset}")
825
825
  except Exception as e:
826
- release = "20240410"
826
+ release = "20250930"
827
827
  asset = f"pnnx-{release}-{system}.zip"
828
828
  LOGGER.warning(f"{prefix} PNNX GitHub assets not found: {e}, using default {asset}")
829
829
  unzip_dir = safe_download(f"https://github.com/pnnx/pnnx/releases/download/{release}/{asset}", delete=True)
@@ -847,7 +847,7 @@ class Exporter:
847
847
 
848
848
  cmd = [
849
849
  str(pnnx),
850
- str(f_ts),
850
+ str(f_onnx),
851
851
  *ncnn_args,
852
852
  *pnnx_args,
853
853
  f"fp16={int(self.args.half)}",
@@ -254,7 +254,7 @@ class AutoBackend(nn.Module):
254
254
  session = onnxruntime.InferenceSession(w, providers=providers)
255
255
  else:
256
256
  check_requirements(
257
- ["model-compression-toolkit>=2.4.1", "sony-custom-layers[torch]>=0.3.0", "onnxruntime-extensions"]
257
+ ("model-compression-toolkit>=2.4.1", "sony-custom-layers[torch]>=0.3.0", "onnxruntime-extensions")
258
258
  )
259
259
  w = next(Path(w).glob("*.onnx"))
260
260
  LOGGER.info(f"Loading {w} for ONNX IMX inference...")
@@ -896,6 +896,10 @@ class RTDETRDecoder(nn.Module):
896
896
  """
897
897
 
898
898
  export = False # export mode
899
+ shapes = []
900
+ anchors = torch.empty(0)
901
+ valid_mask = torch.empty(0)
902
+ dynamic = False
899
903
 
900
904
  def __init__(
901
905
  self,
@@ -1116,10 +1120,12 @@ class RTDETRDecoder(nn.Module):
1116
1120
  enc_scores (torch.Tensor): Encoded scores.
1117
1121
  """
1118
1122
  bs = feats.shape[0]
1119
- # Prepare input for decoder
1120
- anchors, valid_mask = self._generate_anchors(shapes, dtype=feats.dtype, device=feats.device)
1121
- features = self.enc_output(valid_mask * feats) # bs, h*w, 256
1123
+ if self.dynamic or self.shapes != shapes:
1124
+ self.anchors, self.valid_mask = self._generate_anchors(shapes, dtype=feats.dtype, device=feats.device)
1125
+ self.shapes = shapes
1122
1126
 
1127
+ # Prepare input for decoder
1128
+ features = self.enc_output(self.valid_mask * feats) # bs, h*w, 256
1123
1129
  enc_outputs_scores = self.enc_score_head(features) # (bs, h*w, nc)
1124
1130
 
1125
1131
  # Query selection
@@ -1131,7 +1137,7 @@ class RTDETRDecoder(nn.Module):
1131
1137
  # (bs, num_queries, 256)
1132
1138
  top_k_features = features[batch_ind, topk_ind].view(bs, self.num_queries, -1)
1133
1139
  # (bs, num_queries, 4)
1134
- top_k_anchors = anchors[:, topk_ind].view(bs, self.num_queries, -1)
1140
+ top_k_anchors = self.anchors[:, topk_ind].view(bs, self.num_queries, -1)
1135
1141
 
1136
1142
  # Dynamic anchors + static content
1137
1143
  refer_bbox = self.enc_bbox_head(top_k_features) + top_k_anchors
@@ -595,7 +595,7 @@ class ProfileModels:
595
595
  mean_time (float): Mean inference time in milliseconds.
596
596
  std_time (float): Standard deviation of inference time in milliseconds.
597
597
  """
598
- check_requirements("onnxruntime")
598
+ check_requirements([("onnxruntime", "onnxruntime-gpu")]) # either package meets requirements
599
599
  import onnxruntime as ort
600
600
 
601
601
  # Session with either 'TensorrtExecutionProvider', 'CUDAExecutionProvider', 'CPUExecutionProvider'
@@ -363,8 +363,9 @@ def check_requirements(requirements=ROOT.parent / "requirements.txt", exclude=()
363
363
  Check if installed dependencies meet Ultralytics YOLO models requirements and attempt to auto-update if needed.
364
364
 
365
365
  Args:
366
- requirements (Path | str | list[str] | tuple[str]): Path to a requirements.txt file, a single package
367
- requirement as a string, or a list of package requirements as strings.
366
+ requirements (Path | str | list[str|tuple] | tuple[str]): Path to a requirements.txt file, a single package
367
+ requirement as a string, a list of package requirements as strings, or a list containing strings and
368
+ tuples of interchangeable packages.
368
369
  exclude (tuple): Tuple of package names to exclude from checking.
369
370
  install (bool): If True, attempt to auto-update packages that don't meet requirements.
370
371
  cmds (str): Additional commands to pass to the pip install command when auto-updating.
@@ -376,10 +377,13 @@ def check_requirements(requirements=ROOT.parent / "requirements.txt", exclude=()
376
377
  >>> check_requirements("path/to/requirements.txt")
377
378
 
378
379
  Check a single package
379
- >>> check_requirements("ultralytics>=8.0.0")
380
+ >>> check_requirements("ultralytics>=8.3.200", cmds="--index-url https://download.pytorch.org/whl/cpu")
380
381
 
381
382
  Check multiple packages
382
- >>> check_requirements(["numpy", "ultralytics>=8.0.0"])
383
+ >>> check_requirements(["numpy", "ultralytics"])
384
+
385
+ Check with interchangeable packages
386
+ >>> check_requirements([("onnxruntime", "onnxruntime-gpu"), "numpy"])
383
387
  """
384
388
  prefix = colorstr("red", "bold", "requirements:")
385
389
  if isinstance(requirements, Path): # requirements.txt file
@@ -391,13 +395,22 @@ def check_requirements(requirements=ROOT.parent / "requirements.txt", exclude=()
391
395
 
392
396
  pkgs = []
393
397
  for r in requirements:
394
- r_stripped = r.rpartition("/")[-1].replace(".git", "") # replace git+https://org/repo.git -> 'repo'
395
- match = re.match(r"([a-zA-Z0-9-_]+)([<>!=~]+.*)?", r_stripped)
396
- name, required = match[1], match[2].strip() if match[2] else ""
397
- try:
398
- assert check_version(metadata.version(name), required) # exception if requirements not met
399
- except (AssertionError, metadata.PackageNotFoundError):
400
- pkgs.append(r)
398
+ candidates = r if isinstance(r, (list, tuple)) else [r]
399
+ satisfied = False
400
+
401
+ for candidate in candidates:
402
+ r_stripped = candidate.rpartition("/")[-1].replace(".git", "") # replace git+https://org/repo.git -> 'repo'
403
+ match = re.match(r"([a-zA-Z0-9-_]+)([<>!=~]+.*)?", r_stripped)
404
+ name, required = match[1], match[2].strip() if match[2] else ""
405
+ try:
406
+ if check_version(metadata.version(name), required):
407
+ satisfied = True
408
+ break
409
+ except (AssertionError, metadata.PackageNotFoundError):
410
+ continue
411
+
412
+ if not satisfied:
413
+ pkgs.append(candidates[0])
401
414
 
402
415
  @Retry(times=2, delay=1)
403
416
  def attempt_install(packages, commands, use_uv):
@@ -374,7 +374,7 @@ def safe_download(
374
374
  raise # Re-raise immediately - no point retrying if insufficient disk space
375
375
  except Exception as e:
376
376
  if i == 0 and not is_online():
377
- raise ConnectionError(emojis(f"❌ Download failure for {uri}. Environment is not online.")) from e
377
+ raise ConnectionError(emojis(f"❌ Download failure for {uri}. Environment may be offline.")) from e
378
378
  elif i >= retry:
379
379
  raise ConnectionError(emojis(f"❌ Download failure for {uri}. Retry limit reached. {e}")) from e
380
380
  LOGGER.warning(f"Download failure, retrying {i + 1}/{retry} {uri}... {e}")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ultralytics
3
- Version: 8.3.207
3
+ Version: 8.3.208
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>
@@ -1,13 +1,13 @@
1
1
  tests/__init__.py,sha256=b4KP5_q-2IO8Br8YHOSLYnn7IwZS81l_vfEF2YPa2lM,894
2
2
  tests/conftest.py,sha256=LXtQJcFNWPGuzauTGkiXgsvVC3llJKfg22WcmhRzuQc,2593
3
3
  tests/test_cli.py,sha256=0jqS6RfzmJeqgjozUqfT4AoP2d_IhUR0Ej-5ToQBK7A,5463
4
- tests/test_cuda.py,sha256=L2CAdEIXCwrhWtOAhBLTmaQZ9dnLmSEy5jEsxXjK4-0,8127
4
+ tests/test_cuda.py,sha256=6zUSwu3xaYiO3RRNyDkNsuyeq47b1e9f6JNhPZVeDL4,8142
5
5
  tests/test_engine.py,sha256=8W4_D48ZBUp-DsUlRYxHTXzougycY8yggvpbVwQDLPg,5025
6
- tests/test_exports.py,sha256=L_Q0RRCIX80Czx-E4f4ktiAMobNXicVvrnxtv2wndBE,11093
6
+ tests/test_exports.py,sha256=3o-qqPrPqjD1a_U6KBvwAusZ_Wy6S1WzmuvgRRUXmcA,11099
7
7
  tests/test_integrations.py,sha256=kl_AKmE_Qs1GB0_91iVwbzNxofm_hFTt0zzU6JF-pg4,6323
8
- tests/test_python.py,sha256=2W1f15r9B1TQ8HEf2yXcJ3s3_Dn7S5SCBY8DIBM373k,28203
8
+ tests/test_python.py,sha256=0D0VVzIk8Bdc-0qRUv5Wq3ASGOWl7fwWUtYzT9kyZ1I,28210
9
9
  tests/test_solutions.py,sha256=oaTz5BttPDIeHkQh9oEaw-O73L4iYDP3Lfe82V7DeKM,13416
10
- ultralytics/__init__.py,sha256=wysRg41fuY_fmhPnOqmgi2rqp4vTzb875cKgN3lDfmM,1302
10
+ ultralytics/__init__.py,sha256=nqfnPtnAhClIjwIAQhPnP6rGlkCNiP0S5OAC50FWNQk,1302
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
@@ -121,7 +121,7 @@ ultralytics/data/scripts/get_coco.sh,sha256=UuJpJeo3qQpTHVINeOpmP0NYmg8PhEFE3A8J
121
121
  ultralytics/data/scripts/get_coco128.sh,sha256=qmRQl_hOKrsdHrTrnyQuFIH01oDz3lfaz138OgGfLt8,650
122
122
  ultralytics/data/scripts/get_imagenet.sh,sha256=hr42H16bM47iT27rgS7MpEo-GeOZAYUQXgr0B2cwn48,1705
123
123
  ultralytics/engine/__init__.py,sha256=lm6MckFYCPTbqIoX7w0s_daxdjNeBeKW6DXppv1-QUM,70
124
- ultralytics/engine/exporter.py,sha256=TPi9kG0X7u8RchiVu-Y9WvsEfOHJkH9SOxvKv-o_JXs,71197
124
+ ultralytics/engine/exporter.py,sha256=O367yF058mSaoIZdkxKfHcAD-W_lWJpNyfV43w4joA8,71233
125
125
  ultralytics/engine/model.py,sha256=uX6cTFdlLllGRbz8Lr90IZGb4OrtMDIHQEg7DxUqwe8,53449
126
126
  ultralytics/engine/predictor.py,sha256=4lfw2RbBDE7939011FcSCuznscrcnMuabZtc8GXaKO4,22735
127
127
  ultralytics/engine/results.py,sha256=uQ_tgvdxKAg28pRgb5WCHiqx9Ktu7wYiVbwZy_IJ5bo,71499
@@ -196,14 +196,14 @@ ultralytics/models/yolo/yoloe/train.py,sha256=qefvNNXDTOK1tO3va0kNHr8lE5QJkOlV8G
196
196
  ultralytics/models/yolo/yoloe/train_seg.py,sha256=aCV7M8oQOvODFnU4piZdJh3tIrBJYAzZfRVRx1vRgxo,4956
197
197
  ultralytics/models/yolo/yoloe/val.py,sha256=5Gd9EoFH0FmKKvWXBl4J7gBe9DVxIczN-s3ceHwdUDo,9458
198
198
  ultralytics/nn/__init__.py,sha256=PJgOn2phQTTBR2P3s_JWvGeGXQpvw1znsumKow4tCuE,545
199
- ultralytics/nn/autobackend.py,sha256=2M_iz8PdDFEK1muPjserSOrsPRDg7zWb0qOEAJ0eG_A,41270
199
+ ultralytics/nn/autobackend.py,sha256=Fs4gjgfCzR9mSpvZpnNXh1V1WWaUEap6oEZeSg5R4Hw,41270
200
200
  ultralytics/nn/tasks.py,sha256=1hz7w60SNYk7T5TRWBOPup-mbAqCJDgZ91rv9cheqdc,70379
201
201
  ultralytics/nn/text_model.py,sha256=pHqnKe8UueR1MuwJcIE_IvrnYIlt68QL796xjcRJs2A,15275
202
202
  ultralytics/nn/modules/__init__.py,sha256=BPMbEm1daI7Tuds3zph2_afAX7Gq1uAqK8BfiCfKTZs,3198
203
203
  ultralytics/nn/modules/activation.py,sha256=75JcIMH2Cu9GTC2Uf55r_5YLpxcrXQDaVoeGQ0hlUAU,2233
204
204
  ultralytics/nn/modules/block.py,sha256=-5RfsA_ljekL8_bQPGupSn9dVcZ8V_lVsOGlhzIW1kg,70622
205
205
  ultralytics/nn/modules/conv.py,sha256=U6P1ZuzQmIf09noKwp7syuWn-M98Tly2wMWOsDT3kOI,21457
206
- ultralytics/nn/modules/head.py,sha256=FWpgbS8d1My62pyyQH89nbFgHhHIZ-sgSp3YyRet_oY,53308
206
+ ultralytics/nn/modules/head.py,sha256=zNK05iZDGCG-sRxVaykW_jDfZVDse7q9sCSMtAi1sfc,53512
207
207
  ultralytics/nn/modules/transformer.py,sha256=AkWqDGPtk5AgEaAZgP3TObu1nDr4_B_2fzOr3xqq6EY,31470
208
208
  ultralytics/nn/modules/utils.py,sha256=rn8yTObZGkQoqVzjbZWLaHiytppG4ffjMME4Lw60glM,6092
209
209
  ultralytics/solutions/__init__.py,sha256=ZoeAQavTLp8aClnhZ9tbl6lxy86GxofyGvZWTx2aWkI,1209
@@ -239,11 +239,11 @@ ultralytics/trackers/utils/matching.py,sha256=I8SX0sBaBgr4GBJ9uDGOy5LnotgNZHpB2p
239
239
  ultralytics/utils/__init__.py,sha256=whSIuj-0lV0SAp4YjOeBJZ2emP1Qa8pqLnrhRiwl2Qs,53503
240
240
  ultralytics/utils/autobatch.py,sha256=i6KYLLSItKP1Q2IUlTPHrZhjcxl7UOjs0Seb8bF8pvM,5124
241
241
  ultralytics/utils/autodevice.py,sha256=d9yq6eEn05fdfzfpxeSECd0YEO61er5f7T-0kjLdofg,8843
242
- ultralytics/utils/benchmarks.py,sha256=wBsDrwtc6NRM9rIDmqeGQ_9yxOTetnchXXHwZSUhp18,31444
243
- ultralytics/utils/checks.py,sha256=EaZh6gmv8vk9dnmSLNusKBHMh-ZSD4NxA3wXVjVMa_o,35798
242
+ ultralytics/utils/benchmarks.py,sha256=L0EAWMTYmH-vvPp-mGkxaMXzKghmuWW766DSipm7wJM,31504
243
+ ultralytics/utils/checks.py,sha256=R3Fm3N3B5k4a_ATWMnOVuwFAFeSYaWmQm2yoNYh3MvU,36304
244
244
  ultralytics/utils/cpu.py,sha256=OPlVxROWhQp-kEa9EkeNRKRQ-jz0KwySu5a-h91JZjk,3634
245
245
  ultralytics/utils/dist.py,sha256=5xQhWK0OLORvseAL08UmG1LYdkiDVLquxmaGSnqiSqo,4151
246
- ultralytics/utils/downloads.py,sha256=RrM_Uw3A62vFJBqxlYcQslGZHrCQXHnmloSuxag6MTE,23037
246
+ ultralytics/utils/downloads.py,sha256=mlebo09sFXKp1s_BsPza3bQXIj07pV2VnAeEdj4SX0k,23038
247
247
  ultralytics/utils/errors.py,sha256=XT9Ru7ivoBgofK6PlnyigGoa7Fmf5nEhyHtnD-8TRXI,1584
248
248
  ultralytics/utils/events.py,sha256=v2RmLlx78_K6xQfOAuUTJMOexAgNdiuiOvvnsH65oDA,4679
249
249
  ultralytics/utils/files.py,sha256=kxE2rkBuZL288nSN7jxLljmDnBgc16rekEXeRjhbUoo,8213
@@ -275,9 +275,9 @@ ultralytics/utils/callbacks/tensorboard.py,sha256=_4nfGK1dDLn6ijpvphBDhc-AS8qhS3
275
275
  ultralytics/utils/callbacks/wb.py,sha256=ngQO8EJ1kxJDF1YajScVtzBbm26jGuejA0uWeOyvf5A,7685
276
276
  ultralytics/utils/export/__init__.py,sha256=jQtf716PP0jt7bMoY9FkqmjG26KbvDzuR84jGhaBi2U,9901
277
277
  ultralytics/utils/export/imx.py,sha256=Jl5nuNxqaP_bY5yrV2NypmoJSrexHE71TxR72SDdjcg,11394
278
- ultralytics-8.3.207.dist-info/licenses/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
279
- ultralytics-8.3.207.dist-info/METADATA,sha256=dlpTOBive_4cYtIN0aV482aCEmTRk6QCbogW0O1Flgo,37667
280
- ultralytics-8.3.207.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
281
- ultralytics-8.3.207.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
282
- ultralytics-8.3.207.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
283
- ultralytics-8.3.207.dist-info/RECORD,,
278
+ ultralytics-8.3.208.dist-info/licenses/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
279
+ ultralytics-8.3.208.dist-info/METADATA,sha256=gqk4EPrrKV0rxtvGakdOHYUlAAdRF3tGdLPo5-tDmUA,37667
280
+ ultralytics-8.3.208.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
281
+ ultralytics-8.3.208.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
282
+ ultralytics-8.3.208.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
283
+ ultralytics-8.3.208.dist-info/RECORD,,