ultralytics 8.1.10__py3-none-any.whl → 8.1.12__py3-none-any.whl

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

Potentially problematic release.


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

ultralytics/__init__.py CHANGED
@@ -1,6 +1,6 @@
1
1
  # Ultralytics YOLO 🚀, AGPL-3.0 license
2
2
 
3
- __version__ = "8.1.10"
3
+ __version__ = "8.1.12"
4
4
 
5
5
  from ultralytics.data.explorer.explorer import Explorer
6
6
  from ultralytics.models import RTDETR, SAM, YOLO
@@ -454,7 +454,21 @@ class Exporter:
454
454
  if n < 300:
455
455
  LOGGER.warning(f"{prefix} WARNING ⚠️ >300 images recommended for INT8 calibration, found {n} images.")
456
456
  quantization_dataset = nncf.Dataset(dataset, transform_fn)
457
- ignored_scope = nncf.IgnoredScope(types=["Multiply", "Subtract", "Sigmoid"]) # ignore operation
457
+ ignored_scope = None
458
+ if isinstance(self.model.model[-1], (Detect, RTDETRDecoder)): # Segment and Pose use Detect base class
459
+ # get detection module name in onnx
460
+ head_module_name = ".".join(list(self.model.named_modules())[-1][0].split(".")[:2])
461
+
462
+ ignored_scope = nncf.IgnoredScope( # ignore operations
463
+ patterns=[
464
+ f"/{head_module_name}/Add",
465
+ f"/{head_module_name}/Sub",
466
+ f"/{head_module_name}/Mul",
467
+ f"/{head_module_name}/Div",
468
+ f"/{head_module_name}/dfl",
469
+ ],
470
+ names=[f"/{head_module_name}/Sigmoid"],
471
+ )
458
472
  quantized_ov_model = nncf.quantize(
459
473
  ov_model, quantization_dataset, preset=nncf.QuantizationPreset.MIXED, ignored_scope=ignored_scope
460
474
  )
@@ -483,7 +497,7 @@ class Exporter:
483
497
  """
484
498
  YOLOv8 ncnn export using PNNX https://github.com/pnnx/pnnx.
485
499
  """
486
- check_requirements("git+https://github.com/Tencent/ncnn.git" if ARM64 else "ncnn") # requires ncnn
500
+ check_requirements("ncnn")
487
501
  import ncnn # noqa
488
502
 
489
503
  LOGGER.info(f"\n{prefix} starting export with ncnn {ncnn.__version__}...")
@@ -67,30 +67,45 @@ class Results(SimpleClass):
67
67
  """
68
68
  A class for storing and manipulating inference results.
69
69
 
70
- Args:
71
- orig_img (numpy.ndarray): The original image as a numpy array.
72
- path (str): The path to the image file.
73
- names (dict): A dictionary of class names.
74
- boxes (torch.tensor, optional): A 2D tensor of bounding box coordinates for each detection.
75
- masks (torch.tensor, optional): A 3D tensor of detection masks, where each mask is a binary image.
76
- probs (torch.tensor, optional): A 1D tensor of probabilities of each class for classification task.
77
- keypoints (List[List[float]], optional): A list of detected keypoints for each object.
78
-
79
70
  Attributes:
80
- orig_img (numpy.ndarray): The original image as a numpy array.
81
- orig_shape (tuple): The original image shape in (height, width) format.
82
- boxes (Boxes, optional): A Boxes object containing the detection bounding boxes.
83
- masks (Masks, optional): A Masks object containing the detection masks.
84
- probs (Probs, optional): A Probs object containing probabilities of each class for classification task.
85
- keypoints (Keypoints, optional): A Keypoints object containing detected keypoints for each object.
86
- speed (dict): A dictionary of preprocess, inference, and postprocess speeds in milliseconds per image.
87
- names (dict): A dictionary of class names.
88
- path (str): The path to the image file.
89
- _keys (tuple): A tuple of attribute names for non-empty attributes.
71
+ orig_img (numpy.ndarray): Original image as a numpy array.
72
+ orig_shape (tuple): Original image shape in (height, width) format.
73
+ boxes (Boxes, optional): Object containing detection bounding boxes.
74
+ masks (Masks, optional): Object containing detection masks.
75
+ probs (Probs, optional): Object containing class probabilities for classification tasks.
76
+ keypoints (Keypoints, optional): Object containing detected keypoints for each object.
77
+ speed (dict): Dictionary of preprocess, inference, and postprocess speeds (ms/image).
78
+ names (dict): Dictionary of class names.
79
+ path (str): Path to the image file.
80
+
81
+ Methods:
82
+ update(boxes=None, masks=None, probs=None, obb=None): Updates object attributes with new detection results.
83
+ cpu(): Returns a copy of the Results object with all tensors on CPU memory.
84
+ numpy(): Returns a copy of the Results object with all tensors as numpy arrays.
85
+ cuda(): Returns a copy of the Results object with all tensors on GPU memory.
86
+ to(*args, **kwargs): Returns a copy of the Results object with tensors on a specified device and dtype.
87
+ new(): Returns a new Results object with the same image, path, and names.
88
+ plot(...): Plots detection results on an input image, returning an annotated image.
89
+ verbose(): Returns a log string for each task, detailing detections and classifications.
90
+ save_txt(txt_file, save_conf=False): Saves detection results to a text file.
91
+ save_crop(save_dir, file_name=Path("im.jpg")): Saves cropped detection images.
92
+ tojson(normalize=False): Converts detection results to JSON format.
90
93
  """
91
94
 
92
95
  def __init__(self, orig_img, path, names, boxes=None, masks=None, probs=None, keypoints=None, obb=None) -> None:
93
- """Initialize the Results class."""
96
+ """
97
+ Initialize the Results class.
98
+
99
+ Args:
100
+ orig_img (numpy.ndarray): The original image as a numpy array.
101
+ path (str): The path to the image file.
102
+ names (dict): A dictionary of class names.
103
+ boxes (torch.tensor, optional): A 2D tensor of bounding box coordinates for each detection.
104
+ masks (torch.tensor, optional): A 3D tensor of detection masks, where each mask is a binary image.
105
+ probs (torch.tensor, optional): A 1D tensor of probabilities of each class for classification task.
106
+ keypoints (torch.tensor, optional): A 2D tensor of keypoint coordinates for each detection.
107
+ obb (torch.tensor, optional): A 2D tensor of oriented bounding box coordinates for each detection.
108
+ """
94
109
  self.orig_img = orig_img
95
110
  self.orig_shape = orig_img.shape[:2]
96
111
  self.boxes = Boxes(boxes, self.orig_shape) if boxes is not None else None # native size boxes
@@ -181,6 +196,9 @@ class Results(SimpleClass):
181
196
  boxes=True,
182
197
  masks=True,
183
198
  probs=True,
199
+ show=False,
200
+ save=False,
201
+ filename=None,
184
202
  ):
185
203
  """
186
204
  Plots the detection results on an input RGB image. Accepts a numpy array (cv2) or a PIL Image.
@@ -199,6 +217,9 @@ class Results(SimpleClass):
199
217
  boxes (bool): Whether to plot the bounding boxes.
200
218
  masks (bool): Whether to plot the masks.
201
219
  probs (bool): Whether to plot classification probability
220
+ show (bool): Whether to display the annotated image directly.
221
+ save (bool): Whether to save the annotated image to `filename`.
222
+ filename (str): Filename to save image to if save is True.
202
223
 
203
224
  Returns:
204
225
  (numpy.ndarray): A numpy array of the annotated image.
@@ -268,8 +289,27 @@ class Results(SimpleClass):
268
289
  for k in reversed(self.keypoints.data):
269
290
  annotator.kpts(k, self.orig_shape, radius=kpt_radius, kpt_line=kpt_line)
270
291
 
292
+ # Show results
293
+ if show:
294
+ annotator.show(self.path)
295
+
296
+ # Save results
297
+ if save:
298
+ annotator.save(filename)
299
+
271
300
  return annotator.result()
272
301
 
302
+ def show(self, *args, **kwargs):
303
+ """Show annotated results image."""
304
+ self.plot(show=True, *args, **kwargs)
305
+
306
+ def save(self, filename=None, *args, **kwargs):
307
+ """Save annotated results image."""
308
+ if not filename:
309
+ filename = f"results_{Path(self.path).name}"
310
+ self.plot(save=True, filename=filename, *args, **kwargs)
311
+ return filename
312
+
273
313
  def verbose(self):
274
314
  """Return log string for each task."""
275
315
  log_string = ""
@@ -377,33 +417,41 @@ class Results(SimpleClass):
377
417
 
378
418
  class Boxes(BaseTensor):
379
419
  """
380
- A class for storing and manipulating detection boxes.
381
-
382
- Args:
383
- boxes (torch.Tensor | numpy.ndarray): A tensor or numpy array containing the detection boxes,
384
- with shape (num_boxes, 6) or (num_boxes, 7). The last two columns contain confidence and class values.
385
- If present, the third last column contains track IDs.
386
- orig_shape (tuple): Original image size, in the format (height, width).
420
+ Manages detection boxes, providing easy access and manipulation of box coordinates, confidence scores, class
421
+ identifiers, and optional tracking IDs. Supports multiple formats for box coordinates, including both absolute and
422
+ normalized forms.
387
423
 
388
424
  Attributes:
389
- xyxy (torch.Tensor | numpy.ndarray): The boxes in xyxy format.
390
- conf (torch.Tensor | numpy.ndarray): The confidence values of the boxes.
391
- cls (torch.Tensor | numpy.ndarray): The class values of the boxes.
392
- id (torch.Tensor | numpy.ndarray): The track IDs of the boxes (if available).
393
- xywh (torch.Tensor | numpy.ndarray): The boxes in xywh format.
394
- xyxyn (torch.Tensor | numpy.ndarray): The boxes in xyxy format normalized by original image size.
395
- xywhn (torch.Tensor | numpy.ndarray): The boxes in xywh format normalized by original image size.
396
- data (torch.Tensor): The raw bboxes tensor (alias for `boxes`).
425
+ data (torch.Tensor): The raw tensor containing detection boxes and their associated data.
426
+ orig_shape (tuple): The original image size as a tuple (height, width), used for normalization.
427
+ is_track (bool): Indicates whether tracking IDs are included in the box data.
428
+
429
+ Properties:
430
+ xyxy (torch.Tensor | numpy.ndarray): Boxes in [x1, y1, x2, y2] format.
431
+ conf (torch.Tensor | numpy.ndarray): Confidence scores for each box.
432
+ cls (torch.Tensor | numpy.ndarray): Class labels for each box.
433
+ id (torch.Tensor | numpy.ndarray, optional): Tracking IDs for each box, if available.
434
+ xywh (torch.Tensor | numpy.ndarray): Boxes in [x, y, width, height] format, calculated on demand.
435
+ xyxyn (torch.Tensor | numpy.ndarray): Normalized [x1, y1, x2, y2] boxes, relative to `orig_shape`.
436
+ xywhn (torch.Tensor | numpy.ndarray): Normalized [x, y, width, height] boxes, relative to `orig_shape`.
397
437
 
398
438
  Methods:
399
- cpu(): Move the object to CPU memory.
400
- numpy(): Convert the object to a numpy array.
401
- cuda(): Move the object to CUDA memory.
402
- to(*args, **kwargs): Move the object to the specified device.
439
+ cpu(): Moves the boxes to CPU memory.
440
+ numpy(): Converts the boxes to a numpy array format.
441
+ cuda(): Moves the boxes to CUDA (GPU) memory.
442
+ to(device, dtype=None): Moves the boxes to the specified device.
403
443
  """
404
444
 
405
445
  def __init__(self, boxes, orig_shape) -> None:
406
- """Initialize the Boxes class."""
446
+ """
447
+ Initialize the Boxes class.
448
+
449
+ Args:
450
+ boxes (torch.Tensor | numpy.ndarray): A tensor or numpy array containing the detection boxes, with
451
+ shape (num_boxes, 6) or (num_boxes, 7). The last two columns contain confidence and class values.
452
+ If present, the third last column contains track IDs.
453
+ orig_shape (tuple): Original image size, in the format (height, width).
454
+ """
407
455
  if boxes.ndim == 1:
408
456
  boxes = boxes[None, :]
409
457
  n = boxes.shape[-1]
@@ -607,7 +655,7 @@ class OBB(BaseTensor):
607
655
  conf (torch.Tensor | numpy.ndarray): The confidence values of the boxes.
608
656
  cls (torch.Tensor | numpy.ndarray): The class values of the boxes.
609
657
  id (torch.Tensor | numpy.ndarray): The track IDs of the boxes (if available).
610
- xyxyxyxyn (torch.Tensor | numpy.ndarray): The rotated boxes in xyxyxyxy format normalized by original image size.
658
+ xyxyxyxyn (torch.Tensor | numpy.ndarray): The rotated boxes in xyxyxyxy format normalized by orig image size.
611
659
  xyxyxyxy (torch.Tensor | numpy.ndarray): The rotated boxes in xyxyxyxy format.
612
660
  xyxy (torch.Tensor | numpy.ndarray): The horizontal boxes in xyxyxyxy format.
613
661
  data (torch.Tensor): The raw OBB tensor (alias for `boxes`).
@@ -109,7 +109,6 @@ class GMC:
109
109
 
110
110
  Args:
111
111
  raw_frame (np.array): The raw frame to be processed.
112
- detections (list): List of detections to be used in the processing.
113
112
 
114
113
  Returns:
115
114
  (np.array): Processed frame.
@@ -298,7 +297,6 @@ class GMC:
298
297
 
299
298
  Args:
300
299
  raw_frame (np.array): The raw frame to be processed.
301
- detections (list): List of detections to be used in the processing.
302
300
 
303
301
  Returns:
304
302
  (np.array): Processed frame.
@@ -329,10 +329,18 @@ class Annotator:
329
329
  """Return annotated image as array."""
330
330
  return np.asarray(self.im)
331
331
 
332
- # Object Counting Annotator
332
+ def show(self, title=None):
333
+ """Show the annotated image."""
334
+ (self.im if isinstance(self.im, Image.Image) else Image.fromarray(self.im[..., ::-1])).show(title)
335
+
336
+ def save(self, filename="image.jpg"):
337
+ """Save the annotated image to 'filename'."""
338
+ (self.im if isinstance(self.im, Image.Image) else Image.fromarray(self.im[..., ::-1])).save(filename)
339
+
333
340
  def draw_region(self, reg_pts=None, color=(0, 255, 0), thickness=5):
334
341
  """
335
- Draw region line
342
+ Draw region line.
343
+
336
344
  Args:
337
345
  reg_pts (list): Region Points (for line 2 points, for region 4 points)
338
346
  color (tuple): Region Color value
@@ -342,7 +350,8 @@ class Annotator:
342
350
 
343
351
  def draw_centroid_and_tracks(self, track, color=(255, 0, 255), track_thickness=2):
344
352
  """
345
- Draw centroid point and track trails
353
+ Draw centroid point and track trails.
354
+
346
355
  Args:
347
356
  track (list): object tracking points for trails display
348
357
  color (tuple): tracks line color
@@ -354,7 +363,8 @@ class Annotator:
354
363
 
355
364
  def count_labels(self, counts=0, count_txt_size=2, color=(255, 255, 255), txt_color=(0, 0, 0)):
356
365
  """
357
- Plot counts for object counter
366
+ Plot counts for object counter.
367
+
358
368
  Args:
359
369
  counts (int): objects counts value
360
370
  count_txt_size (int): text size for counts display
@@ -383,7 +393,9 @@ class Annotator:
383
393
 
384
394
  @staticmethod
385
395
  def estimate_pose_angle(a, b, c):
386
- """Calculate the pose angle for object
396
+ """
397
+ Calculate the pose angle for object.
398
+
387
399
  Args:
388
400
  a (float) : The value of pose point a
389
401
  b (float): The value of pose point b
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ultralytics
3
- Version: 8.1.10
3
+ Version: 8.1.12
4
4
  Summary: Ultralytics YOLOv8 for SOTA object detection, multi-object tracking, instance segmentation, pose estimation and image classification.
5
5
  Author: Glenn Jocher, Ayush Chaurasia, Jing Qiu
6
6
  Maintainer: Glenn Jocher, Ayush Chaurasia, Jing Qiu
@@ -51,7 +51,7 @@ Requires-Dist: pre-commit ; extra == 'dev'
51
51
  Requires-Dist: pytest ; extra == 'dev'
52
52
  Requires-Dist: pytest-cov ; extra == 'dev'
53
53
  Requires-Dist: coverage[toml] ; extra == 'dev'
54
- Requires-Dist: mkdocs-material ; extra == 'dev'
54
+ Requires-Dist: mkdocs-material >=9.5.9 ; extra == 'dev'
55
55
  Requires-Dist: mkdocstrings[python] ; extra == 'dev'
56
56
  Requires-Dist: mkdocs-jupyter ; extra == 'dev'
57
57
  Requires-Dist: mkdocs-redirects ; extra == 'dev'
@@ -1,4 +1,4 @@
1
- ultralytics/__init__.py,sha256=Acy7EBxuoFjR4DRjZv-Ou3q8wjwt1bpfECWw2GxLBUU,597
1
+ ultralytics/__init__.py,sha256=-gWdBTB5ISYbDj7dtT3PyZixNrf8Li_QOTU4MP_gPK0,597
2
2
  ultralytics/assets/bus.jpg,sha256=wCAZxJecGR63Od3ZRERe9Aja1Weayrb9Ug751DS_vGM,137419
3
3
  ultralytics/assets/zidane.jpg,sha256=Ftc4aeMmen1O0A3o6GCDO9FlfBslLpTAw0gnetx7bts,50427
4
4
  ultralytics/cfg/__init__.py,sha256=OZe3OfyNAeT1lRI7uJVM_Lla91mxGYgJMxrwyT7VP6o,20768
@@ -69,10 +69,10 @@ ultralytics/data/explorer/utils.py,sha256=a6ugY8rKpFM8dIRcUwRyjRkRJ-zXEwe-NiJr6C
69
69
  ultralytics/data/explorer/gui/__init__.py,sha256=mHtJuK4hwF8cuV-VHDc7tp6u6D1gHz2Z7JI8grmQDTs,42
70
70
  ultralytics/data/explorer/gui/dash.py,sha256=3Vi-k2LpUis-WHZ81Qnzlj71wpTCr4A8YxjUl0-v8T4,10042
71
71
  ultralytics/engine/__init__.py,sha256=mHtJuK4hwF8cuV-VHDc7tp6u6D1gHz2Z7JI8grmQDTs,42
72
- ultralytics/engine/exporter.py,sha256=1Xh1Yvwq-Le7BBvmSnNzfMcchmZQ2Jk26qlvWhXfVdo,51992
72
+ ultralytics/engine/exporter.py,sha256=IP5b0jtwpOjs7CGI1rR4J6DTmqHoA22uXx7eJM93q5c,52576
73
73
  ultralytics/engine/model.py,sha256=hDAtM-E-5qZx6HMu7wQPo7L7Os8wr4eMZyf-l3llGhI,37636
74
74
  ultralytics/engine/predictor.py,sha256=95ujaUYbDtui-s4hloGmJ0yVm9IC05Ck5dyoyNTk0BU,17832
75
- ultralytics/engine/results.py,sha256=RIOSzGYBsPYvFNeqtoAw5u-fqgbzI6kNpg1FRQ3QVbI,27622
75
+ ultralytics/engine/results.py,sha256=CXtasTKBYdf_x3rfSQ6ExplE6F-f3eGL4XyUPXmFrfQ,30014
76
76
  ultralytics/engine/trainer.py,sha256=3JQBpdDtnZTli2zz-czZrYv5ttnYMBJhiJD3ZhcelJM,34306
77
77
  ultralytics/engine/tuner.py,sha256=yJTecrgsZbeE4XC8iJWoUA_DKACUnDSt8N1V_PTeCcc,11758
78
78
  ultralytics/engine/validator.py,sha256=znVY4997-pMzx23FP_JpQczIEvWT5jp-sIEovYXI6RQ,14576
@@ -153,7 +153,7 @@ ultralytics/trackers/bot_sort.py,sha256=39AvhYVbT7izF3--rX_e6Lhgb5czTA23gw6AgnNc
153
153
  ultralytics/trackers/byte_tracker.py,sha256=AQWpI-msOewPqPLnhvMTO_8Pk565IEd_ny6VvQQgMwk,18871
154
154
  ultralytics/trackers/track.py,sha256=dl4qu2t3f_ZCUJqJqnrxDDXWfbpPdRFZVE8WGkcRFMg,3091
155
155
  ultralytics/trackers/utils/__init__.py,sha256=mHtJuK4hwF8cuV-VHDc7tp6u6D1gHz2Z7JI8grmQDTs,42
156
- ultralytics/trackers/utils/gmc.py,sha256=S3NKaY4X8iM36dViWBuzArJSHtxbGdsNHLvoJUROzVk,13798
156
+ ultralytics/trackers/utils/gmc.py,sha256=TvFYzqOSeYjXgt6M1b7BmlzrU4Srl34PFAuR_sZs6hY,13638
157
157
  ultralytics/trackers/utils/kalman_filter.py,sha256=JN1sAcfJZy8fTZxc8w3jUJnGQDKtgAL__p4nTR6RM2I,15168
158
158
  ultralytics/trackers/utils/matching.py,sha256=c_pthBfu9sWeMVYe-dSecdWcQxUey-mQT2yMVsFH3VQ,5404
159
159
  ultralytics/utils/__init__.py,sha256=iCP2iY1J4ZQ15fT6_uMOIWvAf19F1ZWBWlEKXGqSSBA,36882
@@ -169,7 +169,7 @@ ultralytics/utils/loss.py,sha256=af2_eFPSR8S2t7dIh3H24WFkMYkN6mvreDEnOiYeAQc,325
169
169
  ultralytics/utils/metrics.py,sha256=ViQzjq9t9dVlK1Owz_jtLb7ybTImNd38RLYKrm4rXx8,53358
170
170
  ultralytics/utils/ops.py,sha256=RxnsheSa_mDWaCm0gCKNTRz7baTKIMQfy38Z2FP4e-o,32936
171
171
  ultralytics/utils/patches.py,sha256=2iMWzwBpAjTt0UzaPzFO5JPVoKklUhftuo_3H7xBoDc,2659
172
- ultralytics/utils/plotting.py,sha256=GbF0jgnb2TgiIy40jU6nO5H_hGjCM3OYJ9kR3HnjjiY,44447
172
+ ultralytics/utils/plotting.py,sha256=YDDHCuPO82gQNQpp-ZxlV5A5QUlatj2MBlqV5DZlVXc,44819
173
173
  ultralytics/utils/tal.py,sha256=5ZLwIt-8atPzZQk0uj0w_YFsSRqQV-NfpESUQ945P1s,16017
174
174
  ultralytics/utils/torch_utils.py,sha256=79VbjnMxNV_xXLrJjXhYP9eXfSJmJPeyH4hZItKfkKc,25143
175
175
  ultralytics/utils/triton.py,sha256=gg1finxno_tY2Ge9PMhmu7PI9wvoFZoiicdT4Bhqv3w,3936
@@ -185,9 +185,9 @@ ultralytics/utils/callbacks/neptune.py,sha256=5Z3ua5YBTUS56FH8VQKQG1aaIo9fH8GEyz
185
185
  ultralytics/utils/callbacks/raytune.py,sha256=6OgGNuC35F29lw8Dl_d0lue4-iBR6dqrBVQnIRQDx4E,632
186
186
  ultralytics/utils/callbacks/tensorboard.py,sha256=fyhgBgcTmEIifBqxBJkoMZ6yQNBGhSLQBAsy770-RtA,4038
187
187
  ultralytics/utils/callbacks/wb.py,sha256=03ACY2YwpTRigD0ZQH7_zlpwMdGw0lt23zX4d5Zaz28,6650
188
- ultralytics-8.1.10.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
189
- ultralytics-8.1.10.dist-info/METADATA,sha256=5HlHiyGCzzyTtYKRPLmt6egKtVS1lfg7QhpIXH1Ziqo,40205
190
- ultralytics-8.1.10.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
191
- ultralytics-8.1.10.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
192
- ultralytics-8.1.10.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
193
- ultralytics-8.1.10.dist-info/RECORD,,
188
+ ultralytics-8.1.12.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
189
+ ultralytics-8.1.12.dist-info/METADATA,sha256=RklTJHR3iSnRq2UCuzTZYgbI5FOaUQa4LsJOP3u7G60,40213
190
+ ultralytics-8.1.12.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
191
+ ultralytics-8.1.12.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
192
+ ultralytics-8.1.12.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
193
+ ultralytics-8.1.12.dist-info/RECORD,,