ultralytics 8.3.166__py3-none-any.whl → 8.3.167__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 🚀 AGPL-3.0 License - https://ultralytics.com/license
2
2
 
3
- __version__ = "8.3.166"
3
+ __version__ = "8.3.167"
4
4
 
5
5
  import os
6
6
 
@@ -142,7 +142,7 @@ def export_formats():
142
142
  ["PaddlePaddle", "paddle", "_paddle_model", True, True, ["batch"]],
143
143
  ["MNN", "mnn", ".mnn", True, True, ["batch", "half", "int8"]],
144
144
  ["NCNN", "ncnn", "_ncnn_model", True, True, ["batch", "half"]],
145
- ["IMX", "imx", "_imx_model", True, True, ["int8", "fraction"]],
145
+ ["IMX", "imx", "_imx_model", True, True, ["int8", "fraction", "nms"]],
146
146
  ["RKNN", "rknn", "_rknn_model", False, False, ["batch", "name"]],
147
147
  ]
148
148
  return dict(zip(["Format", "Argument", "Suffix", "CPU", "GPU", "Arguments"], zip(*x)))
@@ -313,8 +313,11 @@ class Exporter:
313
313
  if not self.args.int8:
314
314
  LOGGER.warning("IMX export requires int8=True, setting int8=True.")
315
315
  self.args.int8 = True
316
- if model.task != "detect":
317
- raise ValueError("IMX export only supported for detection models.")
316
+ if not self.args.nms:
317
+ LOGGER.warning("IMX export requires nms=True, setting nms=True.")
318
+ self.args.nms = True
319
+ if model.task not in {"detect", "pose"}:
320
+ raise ValueError("IMX export only supported for detection and pose estimation models.")
318
321
  if not hasattr(model, "names"):
319
322
  model.names = default_class_names()
320
323
  model.names = check_class_names(model.names)
@@ -428,7 +431,7 @@ class Exporter:
428
431
 
429
432
  y = None
430
433
  for _ in range(2): # dry runs
431
- y = NMSModel(model, self.args)(im) if self.args.nms and not coreml else model(im)
434
+ y = NMSModel(model, self.args)(im) if self.args.nms and not (coreml or imx) else model(im)
432
435
  if self.args.half and onnx and self.device.type != "cpu":
433
436
  im, model = im.half(), model.half() # to FP16
434
437
 
@@ -1166,15 +1169,14 @@ class Exporter:
1166
1169
  )
1167
1170
  if getattr(self.model, "end2end", False):
1168
1171
  raise ValueError("IMX export is not supported for end2end models.")
1169
- check_requirements(
1170
- ("model-compression-toolkit>=2.3.0,<2.4.1", "sony-custom-layers>=0.3.0", "edge-mdt-tpc>=1.1.0")
1171
- )
1172
+ check_requirements(("model-compression-toolkit>=2.4.1", "sony-custom-layers>=0.3.0", "edge-mdt-tpc>=1.1.0"))
1172
1173
  check_requirements("imx500-converter[pt]>=3.16.1") # Separate requirements for imx500-converter
1174
+ check_requirements("mct-quantizers>=1.6.0") # Separate for compatibility with model-compression-toolkit
1173
1175
 
1174
1176
  import model_compression_toolkit as mct
1175
1177
  import onnx
1176
1178
  from edgemdt_tpc import get_target_platform_capabilities
1177
- from sony_custom_layers.pytorch import multiclass_nms
1179
+ from sony_custom_layers.pytorch import multiclass_nms_with_indices
1178
1180
 
1179
1181
  LOGGER.info(f"\n{prefix} starting export with model_compression_toolkit {mct.__version__}...")
1180
1182
 
@@ -1198,13 +1200,23 @@ class Exporter:
1198
1200
 
1199
1201
  bit_cfg = mct.core.BitWidthConfig()
1200
1202
  if "C2PSA" in self.model.__str__(): # YOLO11
1201
- layer_names = ["sub", "mul_2", "add_14", "cat_21"]
1202
- weights_memory = 2585350.2439
1203
- n_layers = 238 # 238 layers for fused YOLO11n
1203
+ if self.model.task == "detect":
1204
+ layer_names = ["sub", "mul_2", "add_14", "cat_21"]
1205
+ weights_memory = 2585350.2439
1206
+ n_layers = 238 # 238 layers for fused YOLO11n
1207
+ elif self.model.task == "pose":
1208
+ layer_names = ["sub", "mul_2", "add_14", "cat_22", "cat_23", "mul_4", "add_15"]
1209
+ weights_memory = 2437771.67
1210
+ n_layers = 257 # 257 layers for fused YOLO11n-pose
1204
1211
  else: # YOLOv8
1205
- layer_names = ["sub", "mul", "add_6", "cat_17"]
1206
- weights_memory = 2550540.8
1207
- n_layers = 168 # 168 layers for fused YOLOv8n
1212
+ if self.model.task == "detect":
1213
+ layer_names = ["sub", "mul", "add_6", "cat_17"]
1214
+ weights_memory = 2550540.8
1215
+ n_layers = 168 # 168 layers for fused YOLOv8n
1216
+ elif self.model.task == "pose":
1217
+ layer_names = ["add_7", "mul_2", "cat_19", "mul", "sub", "add_6", "cat_18"]
1218
+ weights_memory = 2482451.85
1219
+ n_layers = 187 # 187 layers for fused YOLO11n-pose
1208
1220
 
1209
1221
  # Check if the model has the expected number of layers
1210
1222
  if len(list(self.model.modules())) != n_layers:
@@ -1251,6 +1263,7 @@ class Exporter:
1251
1263
  score_threshold: float = 0.001,
1252
1264
  iou_threshold: float = 0.7,
1253
1265
  max_detections: int = 300,
1266
+ task: str = "detect",
1254
1267
  ):
1255
1268
  """
1256
1269
  Initialize NMSWrapper with PyTorch Module and NMS parameters.
@@ -1260,34 +1273,40 @@ class Exporter:
1260
1273
  score_threshold (float): Score threshold for non-maximum suppression.
1261
1274
  iou_threshold (float): Intersection over union threshold for non-maximum suppression.
1262
1275
  max_detections (int): The number of detections to return.
1276
+ task (str): Task type, either 'detect' or 'pose'.
1263
1277
  """
1264
1278
  super().__init__()
1265
1279
  self.model = model
1266
1280
  self.score_threshold = score_threshold
1267
1281
  self.iou_threshold = iou_threshold
1268
1282
  self.max_detections = max_detections
1283
+ self.task = task
1269
1284
 
1270
1285
  def forward(self, images):
1271
1286
  """Forward pass with model inference and NMS post-processing."""
1272
1287
  # model inference
1273
1288
  outputs = self.model(images)
1274
1289
 
1275
- boxes = outputs[0]
1276
- scores = outputs[1]
1277
- nms = multiclass_nms(
1290
+ boxes, scores = outputs[0], outputs[1]
1291
+ nms_outputs = multiclass_nms_with_indices(
1278
1292
  boxes=boxes,
1279
1293
  scores=scores,
1280
1294
  score_threshold=self.score_threshold,
1281
1295
  iou_threshold=self.iou_threshold,
1282
1296
  max_detections=self.max_detections,
1283
1297
  )
1284
- return nms
1298
+ if self.task == "pose":
1299
+ kpts = outputs[2] # (bs, max_detections, kpts 17*3)
1300
+ out_kpts = torch.gather(kpts, 1, nms_outputs.indices.unsqueeze(-1).expand(-1, -1, kpts.size(-1)))
1301
+ return nms_outputs.boxes, nms_outputs.scores, nms_outputs.labels, out_kpts
1302
+ return nms_outputs
1285
1303
 
1286
1304
  quant_model = NMSWrapper(
1287
1305
  model=quant_model,
1288
1306
  score_threshold=self.args.conf or 0.001,
1289
1307
  iou_threshold=self.args.iou,
1290
1308
  max_detections=self.args.max_det,
1309
+ task=self.model.task,
1291
1310
  ).to(self.device)
1292
1311
 
1293
1312
  f = Path(str(self.file).replace(self.file.suffix, "_imx_model"))
@@ -243,10 +243,6 @@ class YOLOE(Model):
243
243
  """
244
244
  super().__init__(model=model, task=task, verbose=verbose)
245
245
 
246
- # Assign default COCO class names when there are no custom names
247
- if not hasattr(self.model, "names"):
248
- self.model.names = YAML.load(ROOT / "cfg/datasets/coco8.yaml").get("names")
249
-
250
246
  @property
251
247
  def task_map(self) -> Dict[str, Dict[str, Any]]:
252
248
  """Map head to model, validator, and predictor classes."""
@@ -287,7 +283,7 @@ class YOLOE(Model):
287
283
  Examples:
288
284
  >>> model = YOLOE("yoloe-11s-seg.pt")
289
285
  >>> img = torch.rand(1, 3, 640, 640)
290
- >>> visual_features = model.model.backbone(img)
286
+ >>> visual_features = torch.rand(1, 1, 80, 80)
291
287
  >>> pe = model.get_visual_pe(img, visual_features)
292
288
  """
293
289
  assert isinstance(self.model, YOLOEModel)
@@ -259,11 +259,7 @@ class AutoBackend(nn.Module):
259
259
  session = onnxruntime.InferenceSession(w, providers=providers)
260
260
  else:
261
261
  check_requirements(
262
- [
263
- "model-compression-toolkit>=2.3.0,<2.4.1",
264
- "sony-custom-layers[torch]>=0.3.0",
265
- "onnxruntime-extensions",
266
- ]
262
+ ["model-compression-toolkit>=2.4.1", "sony-custom-layers[torch]>=0.3.0", "onnxruntime-extensions"]
267
263
  )
268
264
  w = next(Path(w).glob("*.onnx"))
269
265
  LOGGER.info(f"Loading {w} for ONNX IMX inference...")
@@ -273,7 +269,6 @@ class AutoBackend(nn.Module):
273
269
  session_options = mctq.get_ort_session_options()
274
270
  session_options.enable_mem_reuse = False # fix the shape mismatch from onnxruntime
275
271
  session = onnxruntime.InferenceSession(w, session_options, providers=["CPUExecutionProvider"])
276
- task = "detect"
277
272
 
278
273
  output_names = [x.name for x in session.get_outputs()]
279
274
  metadata = session.get_modelmeta().custom_metadata_map
@@ -674,8 +669,12 @@ class AutoBackend(nn.Module):
674
669
  self.session.run_with_iobinding(self.io)
675
670
  y = self.bindings
676
671
  if self.imx:
677
- # boxes, conf, cls
678
- y = np.concatenate([y[0], y[1][:, :, None], y[2][:, :, None]], axis=-1)
672
+ if self.task == "detect":
673
+ # boxes, conf, cls
674
+ y = np.concatenate([y[0], y[1][:, :, None], y[2][:, :, None]], axis=-1)
675
+ elif self.task == "pose":
676
+ # boxes, conf, kpts
677
+ y = np.concatenate([y[0], y[1][:, :, None], y[2][:, :, None], y[3]], axis=-1)
679
678
 
680
679
  # OpenVINO
681
680
  elif self.xml:
@@ -178,14 +178,10 @@ class Detect(nn.Module):
178
178
  grid_size = torch.tensor([grid_w, grid_h, grid_w, grid_h], device=box.device).reshape(1, 4, 1)
179
179
  norm = self.strides / (self.stride[0] * grid_size)
180
180
  dbox = self.decode_bboxes(self.dfl(box) * norm, self.anchors.unsqueeze(0) * norm[:, :2])
181
- elif self.export and self.format == "imx":
182
- dbox = self.decode_bboxes(
183
- self.dfl(box) * self.strides, self.anchors.unsqueeze(0) * self.strides, xywh=False
184
- )
185
- return dbox.transpose(1, 2), cls.sigmoid().permute(0, 2, 1)
186
181
  else:
187
182
  dbox = self.decode_bboxes(self.dfl(box), self.anchors.unsqueeze(0)) * self.strides
188
-
183
+ if self.export and self.format == "imx":
184
+ return dbox.transpose(1, 2), cls.sigmoid().permute(0, 2, 1)
189
185
  return torch.cat((dbox, cls.sigmoid()), 1)
190
186
 
191
187
  def bias_init(self):
@@ -384,6 +380,8 @@ class Pose(Detect):
384
380
  if self.training:
385
381
  return x, kpt
386
382
  pred_kpt = self.kpts_decode(bs, kpt)
383
+ if self.export and self.format == "imx":
384
+ return (*x, pred_kpt.permute(0, 2, 1))
387
385
  return torch.cat([x, pred_kpt], 1) if self.export else (torch.cat([x[0], pred_kpt], 1), (x[1], kpt))
388
386
 
389
387
  def kpts_decode(self, bs: int, kpts: torch.Tensor) -> torch.Tensor:
@@ -441,16 +441,15 @@ class ConfusionMatrix(DataExportMixin):
441
441
  array[array < 0.005] = np.nan # don't annotate (would appear as 0.00)
442
442
 
443
443
  fig, ax = plt.subplots(1, 1, figsize=(12, 9))
444
+ names, n = self.names, self.nc
444
445
  if self.nc >= 100: # downsample for large class count
445
446
  k = max(2, self.nc // 60) # step size for downsampling, always > 1
446
447
  keep_idx = slice(None, None, k) # create slice instead of array
447
- self.names = self.names[keep_idx] # slice class names
448
+ names = names[keep_idx] # slice class names
448
449
  array = array[keep_idx, :][:, keep_idx] # slice matrix rows and cols
449
450
  n = (self.nc + k - 1) // k # number of retained classes
450
- nc = nn = n if self.task == "classify" else n + 1 # adjust for background if needed
451
- else:
452
- nc = nn = self.nc if self.task == "classify" else self.nc + 1
453
- ticklabels = (self.names + ["background"]) if (0 < nn < 99) and (nn == nc) else "auto"
451
+ nc = nn = n if self.task == "classify" else n + 1 # adjust for background if needed
452
+ ticklabels = (names + ["background"]) if (0 < nn < 99) and (nn == nc) else "auto"
454
453
  xy_ticks = np.arange(len(ticklabels))
455
454
  tick_fontsize = max(6, 15 - 0.1 * nc) # Minimum size is 6
456
455
  label_fontsize = max(6, 12 - 0.1 * nc)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ultralytics
3
- Version: 8.3.166
3
+ Version: 8.3.167
4
4
  Summary: Ultralytics YOLO 🚀 for SOTA object detection, multi-object tracking, instance segmentation, pose estimation and image classification.
5
5
  Author-email: Glenn Jocher <glenn.jocher@ultralytics.com>, Jing Qiu <jing.qiu@ultralytics.com>
6
6
  Maintainer-email: Ultralytics <hello@ultralytics.com>
@@ -7,7 +7,7 @@ tests/test_exports.py,sha256=HmMKOTCia9ZDC0VYc_EPmvBTM5LM5eeI1NF_pKjLpd8,9677
7
7
  tests/test_integrations.py,sha256=kl_AKmE_Qs1GB0_91iVwbzNxofm_hFTt0zzU6JF-pg4,6323
8
8
  tests/test_python.py,sha256=JJu-69IfuUf1dLK7Ko9elyPONiQ1yu7yhapMVIAt_KI,27907
9
9
  tests/test_solutions.py,sha256=tuf6n_fsI8KvSdJrnc-cqP2qYdiYqCWuVrx0z9dOz3Q,13213
10
- ultralytics/__init__.py,sha256=yczpDVZI5DkFqH3t28doRPDuDqSjoNtwLkDWy4qLC3c,730
10
+ ultralytics/__init__.py,sha256=25BnED8OrDgyWwAHSNTDasTO5KJyBbtsiHMkJU2cmZk,730
11
11
  ultralytics/assets/bus.jpg,sha256=wCAZxJecGR63Od3ZRERe9Aja1Weayrb9Ug751DS_vGM,137419
12
12
  ultralytics/assets/zidane.jpg,sha256=Ftc4aeMmen1O0A3o6GCDO9FlfBslLpTAw0gnetx7bts,50427
13
13
  ultralytics/cfg/__init__.py,sha256=VIpPHImhjb0XLJquGZrG_LBGZchtOtBSXR7HYTYV2GU,39602
@@ -119,7 +119,7 @@ ultralytics/data/scripts/get_coco.sh,sha256=UuJpJeo3qQpTHVINeOpmP0NYmg8PhEFE3A8J
119
119
  ultralytics/data/scripts/get_coco128.sh,sha256=qmRQl_hOKrsdHrTrnyQuFIH01oDz3lfaz138OgGfLt8,650
120
120
  ultralytics/data/scripts/get_imagenet.sh,sha256=hr42H16bM47iT27rgS7MpEo-GeOZAYUQXgr0B2cwn48,1705
121
121
  ultralytics/engine/__init__.py,sha256=lm6MckFYCPTbqIoX7w0s_daxdjNeBeKW6DXppv1-QUM,70
122
- ultralytics/engine/exporter.py,sha256=mb_mJ2eQ7pvCpRk9xrzGOmTvJ6dbknGWN6adcHe_7pM,73500
122
+ ultralytics/engine/exporter.py,sha256=m6HAaoDRDaUR4P0zue3o7bUKjnPa4QlMCjcbJtS4iCI,74926
123
123
  ultralytics/engine/model.py,sha256=FmLwiKuItVNgoyXhAvesUnD3UeHBzCVzGHDrqB8J4ms,53453
124
124
  ultralytics/engine/predictor.py,sha256=xxl1kdAzKrN8Y_5MQ5f92uFPeeRq1mYOl6hNlzpPjy8,22520
125
125
  ultralytics/engine/results.py,sha256=QcHcbPVlLBiy_APwABr-T5K65HR8Bl1rRzxawjjP76E,71873
@@ -164,7 +164,7 @@ ultralytics/models/utils/__init__.py,sha256=lm6MckFYCPTbqIoX7w0s_daxdjNeBeKW6DXp
164
164
  ultralytics/models/utils/loss.py,sha256=E-61TfLPc04IdeL6IlFDityDoPju-ov0ouWV_cNY4Kg,21254
165
165
  ultralytics/models/utils/ops.py,sha256=Pr77n8XW25SUEx4X3bBvXcVIbRdJPoaXJuG0KWWawRQ,15253
166
166
  ultralytics/models/yolo/__init__.py,sha256=or0j5xvcM0usMlsFTYhNAOcQUri7reD0cD9JR5b7zDk,307
167
- ultralytics/models/yolo/model.py,sha256=xK-Te6D0PGY3vpWQg-HT3TwP0bzPs0XfUjd_L_tVXRs,18752
167
+ ultralytics/models/yolo/model.py,sha256=e66CIsSLHbEeGlkEQ1r6WwVDKAoR2nc0-UoGA94z-eM,18544
168
168
  ultralytics/models/yolo/classify/__init__.py,sha256=9--HVaNOfI1K7rn_rRqclL8FUAnpfeBrRqEQIaQw2xM,383
169
169
  ultralytics/models/yolo/classify/predict.py,sha256=FqAC2YXe25bRwedMZhF3Lw0waoY-a60xMKELhxApP9I,4149
170
170
  ultralytics/models/yolo/classify/train.py,sha256=V-hevc6X7xemnpyru84OfTRA77eNnkVSMEz16_OUvo4,10244
@@ -194,14 +194,14 @@ ultralytics/models/yolo/yoloe/train.py,sha256=XYpQYSnSD8vi_9VSj_S5oIsNUEqm3e66vP
194
194
  ultralytics/models/yolo/yoloe/train_seg.py,sha256=aCV7M8oQOvODFnU4piZdJh3tIrBJYAzZfRVRx1vRgxo,4956
195
195
  ultralytics/models/yolo/yoloe/val.py,sha256=yebPkxwKKt__cY05Zbh1YXg4_BKzzpcDc3Cv3FJ5SAA,9769
196
196
  ultralytics/nn/__init__.py,sha256=rjociYD9lo_K-d-1s6TbdWklPLjTcEHk7OIlRDJstIE,615
197
- ultralytics/nn/autobackend.py,sha256=n-2ADzX3Y2MRE8nHFeVvFCJFJP9rCbkkNbcufPZ24dE,41532
197
+ ultralytics/nn/autobackend.py,sha256=_65yU6AIpmz1vV24oSNNMPIBmywPTQQdWF0pwHDHxiU,41628
198
198
  ultralytics/nn/tasks.py,sha256=jRUjYn1xz_LEa_zx6Upb0UpXvy0Bca1o5HEc7FCRgwM,72653
199
199
  ultralytics/nn/text_model.py,sha256=cYwD-0el4VeToDBP4iPFOQGqyEQatJOBHrVyONL3K_s,15282
200
200
  ultralytics/nn/modules/__init__.py,sha256=2nY0X69Z5DD5SWt6v3CUTZa5gXSzC9TQr3VTVqhyGho,3158
201
201
  ultralytics/nn/modules/activation.py,sha256=75JcIMH2Cu9GTC2Uf55r_5YLpxcrXQDaVoeGQ0hlUAU,2233
202
202
  ultralytics/nn/modules/block.py,sha256=JfOjWEgUNfwFCt-P2awhga4B7GXeDlkKVhLBp7oA-Es,70652
203
203
  ultralytics/nn/modules/conv.py,sha256=eM_t0hQwvEH4rllJucqRMNq7IoipEjbTa_ELROu4ubs,21445
204
- ultralytics/nn/modules/head.py,sha256=zTXFXc46ljPdP3mjgH7B3y2bPIjvbVPtgTu_rQCV8xo,53505
204
+ ultralytics/nn/modules/head.py,sha256=WiYJ-odEWisWZKKbOuvj1dJkUky2Z6D3yCTFqiRO-B0,53450
205
205
  ultralytics/nn/modules/transformer.py,sha256=PW5-6gzOP3_rZ_uAkmxvI42nU5bkrgbgLKCy5PC5px4,31415
206
206
  ultralytics/nn/modules/utils.py,sha256=rn8yTObZGkQoqVzjbZWLaHiytppG4ffjMME4Lw60glM,6092
207
207
  ultralytics/solutions/__init__.py,sha256=ZoeAQavTLp8aClnhZ9tbl6lxy86GxofyGvZWTx2aWkI,1209
@@ -246,7 +246,7 @@ ultralytics/utils/export.py,sha256=LK-wlTlyb_zIKtSvOmfmvR70RcUU9Ct9UBDt5wn9_rY,9
246
246
  ultralytics/utils/files.py,sha256=ZCbLGleiF0f-PqYfaxMFAWop88w7U1hpreHXl8b2ko0,8238
247
247
  ultralytics/utils/instance.py,sha256=dC83rHvQXciAED3rOiScFs3BOX9OI06Ey1mj9sjUKvs,19070
248
248
  ultralytics/utils/loss.py,sha256=fbOWc3Iu0QOJiWbi-mXWA9-1otTYlehtmUsI7os7ydM,39799
249
- ultralytics/utils/metrics.py,sha256=pazuzAjKFnfnhSVH_w6xEWB4vN7RpC8n7v3zj9LkFbs,62247
249
+ ultralytics/utils/metrics.py,sha256=AbaYgGPEFY-IVv1_Izb0dXulSs1NEZ2-TVkO1GcP8iI,62179
250
250
  ultralytics/utils/ops.py,sha256=8d60fbpntrexK3gPoLUS6mWAYGrtrQaQCOYyRJsCjuI,34521
251
251
  ultralytics/utils/patches.py,sha256=tBAsNo_RyoFLL9OAzVuJmuoDLUJIPuTMByBYyblGG1A,6517
252
252
  ultralytics/utils/plotting.py,sha256=LO-iR-k1UewV5vt4xXDUIirdmNEZdpfiQvLyIWqINPg,47171
@@ -265,9 +265,9 @@ ultralytics/utils/callbacks/neptune.py,sha256=j8pecmlcsM8FGzLKWoBw5xUsi5t8E5HuxY
265
265
  ultralytics/utils/callbacks/raytune.py,sha256=S6Bq16oQDQ8BQgnZzA0zJHGN_BBr8iAM_WtGoLiEcwg,1283
266
266
  ultralytics/utils/callbacks/tensorboard.py,sha256=MDPBW7aDes-66OE6YqKXXvqA_EocjzEMHWGM-8z9vUQ,5281
267
267
  ultralytics/utils/callbacks/wb.py,sha256=Tm_-aRr2CN32MJkY9tylpMBJkb007-MSRNSQ7rDJ5QU,7521
268
- ultralytics-8.3.166.dist-info/licenses/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
269
- ultralytics-8.3.166.dist-info/METADATA,sha256=4N4h2N1Vii9mOjtYcrL76k9zyCXctBsm-0k_zdReNCw,37576
270
- ultralytics-8.3.166.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
271
- ultralytics-8.3.166.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
272
- ultralytics-8.3.166.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
273
- ultralytics-8.3.166.dist-info/RECORD,,
268
+ ultralytics-8.3.167.dist-info/licenses/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
269
+ ultralytics-8.3.167.dist-info/METADATA,sha256=GHOf_ArFRGBsrNgvyYN-MibqukqrWcY4ORaG0A-XOg4,37576
270
+ ultralytics-8.3.167.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
271
+ ultralytics-8.3.167.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
272
+ ultralytics-8.3.167.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
273
+ ultralytics-8.3.167.dist-info/RECORD,,