ultralytics 8.2.88__py3-none-any.whl → 8.2.89__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.2.88"
3
+ __version__ = "8.2.89"
4
4
 
5
5
  import os
6
6
 
@@ -385,7 +385,7 @@ def convert_segment_masks_to_yolo_seg(masks_dir, output_dir, classes):
385
385
  continue # Skip background
386
386
  class_index = pixel_to_class_mapping.get(value, -1)
387
387
  if class_index == -1:
388
- LOGGER.warning(f"Unknown class for pixel value {value} in file {mask_filename}, skipping.")
388
+ LOGGER.warning(f"Unknown class for pixel value {value} in file {mask_path}, skipping.")
389
389
  continue
390
390
 
391
391
  # Create a binary mask for the current class and find contours
@@ -403,7 +403,7 @@ def convert_segment_masks_to_yolo_seg(masks_dir, output_dir, classes):
403
403
  yolo_format.append(round(point[1] / img_height, 6))
404
404
  yolo_format_data.append(yolo_format)
405
405
  # Save Ultralytics YOLO format data to file
406
- output_path = Path(output_dir) / f"{Path(mask_filename).stem}.txt"
406
+ output_path = Path(output_dir) / f"{mask_path.stem}.txt"
407
407
  with open(output_path, "w") as file:
408
408
  for item in yolo_format_data:
409
409
  line = " ".join(map(str, item))
@@ -610,6 +610,9 @@ class Exporter:
610
610
  f = self.file.with_suffix(".mlmodel" if mlmodel else ".mlpackage")
611
611
  if f.is_dir():
612
612
  shutil.rmtree(f)
613
+ if self.args.nms and getattr(self.model, "end2end", False):
614
+ LOGGER.warning(f"{prefix} WARNING ⚠️ 'nms=True' is not available for end2end models. Forcing 'nms=False'.")
615
+ self.args.nms = False
613
616
 
614
617
  bias = [0.0, 0.0, 0.0]
615
618
  scale = 1 / 255
@@ -1,5 +1,7 @@
1
1
  # Ultralytics YOLO 🚀, AGPL-3.0 license
2
2
 
3
+ from copy import copy
4
+
3
5
  import torch
4
6
 
5
7
  from ultralytics.data import ClassificationDataset, build_dataloader
@@ -107,7 +109,9 @@ class ClassificationTrainer(BaseTrainer):
107
109
  def get_validator(self):
108
110
  """Returns an instance of ClassificationValidator for validation."""
109
111
  self.loss_names = ["loss"]
110
- return yolo.classify.ClassificationValidator(self.test_loader, self.save_dir, _callbacks=self.callbacks)
112
+ return yolo.classify.ClassificationValidator(
113
+ self.test_loader, self.save_dir, args=copy(self.args), _callbacks=self.callbacks
114
+ )
111
115
 
112
116
  def label_loss_items(self, loss_items=None, prefix="train"):
113
117
  """
ultralytics/nn/tasks.py CHANGED
@@ -341,11 +341,8 @@ class DetectionModel(BaseModel):
341
341
 
342
342
  def _predict_augment(self, x):
343
343
  """Perform augmentations on input image x and return augmented inference and train outputs."""
344
- if getattr(self, "end2end", False):
345
- LOGGER.warning(
346
- "WARNING ⚠️ End2End model does not support 'augment=True' prediction. "
347
- "Reverting to single-scale prediction."
348
- )
344
+ if getattr(self, "end2end", False) or self.__class__.__name__ != "DetectionModel":
345
+ LOGGER.warning("WARNING ⚠️ Model does not support 'augment=True', reverting to single-scale prediction.")
349
346
  return self._predict_once(x)
350
347
  img_size = x.shape[-2:] # height, width
351
348
  s = [1, 0.83, 0.67] # scales
@@ -19,19 +19,11 @@ class ObjectCounter:
19
19
  self,
20
20
  names,
21
21
  reg_pts=None,
22
- count_reg_color=(255, 0, 255),
23
- count_txt_color=(0, 0, 0),
24
- count_bg_color=(255, 255, 255),
25
22
  line_thickness=2,
26
- track_thickness=2,
27
23
  view_img=False,
28
24
  view_in_counts=True,
29
25
  view_out_counts=True,
30
26
  draw_tracks=False,
31
- track_color=None,
32
- region_thickness=5,
33
- line_dist_thresh=15,
34
- cls_txtdisplay_gap=50,
35
27
  ):
36
28
  """
37
29
  Initializes the ObjectCounter with various tracking and counting parameters.
@@ -39,19 +31,11 @@ class ObjectCounter:
39
31
  Args:
40
32
  names (dict): Dictionary of class names.
41
33
  reg_pts (list): List of points defining the counting region.
42
- count_reg_color (tuple): RGB color of the counting region.
43
- count_txt_color (tuple): RGB color of the count text.
44
- count_bg_color (tuple): RGB color of the count text background.
45
34
  line_thickness (int): Line thickness for bounding boxes.
46
- track_thickness (int): Thickness of the track lines.
47
35
  view_img (bool): Flag to control whether to display the video stream.
48
36
  view_in_counts (bool): Flag to control whether to display the in counts on the video stream.
49
37
  view_out_counts (bool): Flag to control whether to display the out counts on the video stream.
50
38
  draw_tracks (bool): Flag to control whether to draw the object tracks.
51
- track_color (tuple): RGB color of the tracks.
52
- region_thickness (int): Thickness of the object counting region.
53
- line_dist_thresh (int): Euclidean distance threshold for line counter.
54
- cls_txtdisplay_gap (int): Display gap between each class count.
55
39
  """
56
40
  # Mouse events
57
41
  self.is_drawing = False
@@ -59,10 +43,7 @@ class ObjectCounter:
59
43
 
60
44
  # Region & Line Information
61
45
  self.reg_pts = [(20, 400), (1260, 400)] if reg_pts is None else reg_pts
62
- self.line_dist_thresh = line_dist_thresh
63
46
  self.counting_region = None
64
- self.region_color = count_reg_color
65
- self.region_thickness = region_thickness
66
47
 
67
48
  # Image and annotation Information
68
49
  self.im0 = None
@@ -72,7 +53,6 @@ class ObjectCounter:
72
53
  self.view_out_counts = view_out_counts
73
54
 
74
55
  self.names = names # Classes names
75
- self.annotator = None # Annotator
76
56
  self.window_name = "Ultralytics YOLOv8 Object Counter"
77
57
 
78
58
  # Object counting Information
@@ -81,16 +61,10 @@ class ObjectCounter:
81
61
  self.count_ids = []
82
62
  self.class_wise_count = {}
83
63
  self.count_txt_thickness = 0
84
- self.count_txt_color = count_txt_color
85
- self.count_bg_color = count_bg_color
86
- self.cls_txtdisplay_gap = cls_txtdisplay_gap
87
- self.fontsize = 0.6
88
64
 
89
65
  # Tracks info
90
66
  self.track_history = defaultdict(list)
91
- self.track_thickness = track_thickness
92
67
  self.draw_tracks = draw_tracks
93
- self.track_color = track_color
94
68
 
95
69
  # Check if environment supports imshow
96
70
  self.env_check = check_imshow(warn=True)
@@ -107,6 +81,14 @@ class ObjectCounter:
107
81
  print("Using Line Counter Now")
108
82
  self.counting_region = LineString(self.reg_pts)
109
83
 
84
+ # Define the counting line segment
85
+ self.counting_line_segment = LineString(
86
+ [
87
+ (self.reg_pts[0][0], self.reg_pts[0][1]),
88
+ (self.reg_pts[1][0], self.reg_pts[1][1]),
89
+ ]
90
+ )
91
+
110
92
  def mouse_event_for_region(self, event, x, y, flags, params):
111
93
  """
112
94
  Handles mouse events for defining and moving the counting region in a real-time video stream.
@@ -141,10 +123,10 @@ class ObjectCounter:
141
123
  def extract_and_process_tracks(self, tracks):
142
124
  """Extracts and processes tracks for object counting in a video stream."""
143
125
  # Annotator Init and region drawing
144
- self.annotator = Annotator(self.im0, self.tf, self.names)
126
+ annotator = Annotator(self.im0, self.tf, self.names)
145
127
 
146
128
  # Draw region or line
147
- self.annotator.draw_region(reg_pts=self.reg_pts, color=self.region_color, thickness=self.region_thickness)
129
+ annotator.draw_region(reg_pts=self.reg_pts, color=(104, 0, 123), thickness=self.tf * 2)
148
130
 
149
131
  if tracks[0].boxes.id is not None:
150
132
  boxes = tracks[0].boxes.xyxy.cpu()
@@ -154,7 +136,7 @@ class ObjectCounter:
154
136
  # Extract tracks
155
137
  for box, track_id, cls in zip(boxes, track_ids, clss):
156
138
  # Draw bounding box
157
- self.annotator.box_label(box, label=f"{self.names[cls]}#{track_id}", color=colors(int(track_id), True))
139
+ annotator.box_label(box, label=f"{self.names[cls]}#{track_id}", color=colors(int(track_id), True))
158
140
 
159
141
  # Store class info
160
142
  if self.names[cls] not in self.class_wise_count:
@@ -168,10 +150,10 @@ class ObjectCounter:
168
150
 
169
151
  # Draw track trails
170
152
  if self.draw_tracks:
171
- self.annotator.draw_centroid_and_tracks(
153
+ annotator.draw_centroid_and_tracks(
172
154
  track_line,
173
- color=self.track_color or colors(int(track_id), True),
174
- track_thickness=self.track_thickness,
155
+ color=colors(int(track_id), True),
156
+ track_thickness=self.tf,
175
157
  )
176
158
 
177
159
  prev_position = self.track_history[track_id][-2] if len(self.track_history[track_id]) > 1 else None
@@ -193,11 +175,17 @@ class ObjectCounter:
193
175
  # Count objects using line
194
176
  elif len(self.reg_pts) == 2:
195
177
  if prev_position is not None and track_id not in self.count_ids:
196
- distance = Point(track_line[-1]).distance(self.counting_region)
197
- if distance < self.line_dist_thresh and track_id not in self.count_ids:
178
+ # Check if the object's movement segment intersects the counting line
179
+ if LineString([(prev_position[0], prev_position[1]), (box[0], box[1])]).intersects(
180
+ self.counting_line_segment
181
+ ):
198
182
  self.count_ids.append(track_id)
199
183
 
200
- if (box[0] - prev_position[0]) * (self.counting_region.centroid.x - prev_position[0]) > 0:
184
+ # Determine the direction of movement (IN or OUT)
185
+ direction = (box[0] - prev_position[0]) * (
186
+ self.counting_region.centroid.x - prev_position[0]
187
+ )
188
+ if direction > 0:
201
189
  self.in_counts += 1
202
190
  self.class_wise_count[self.names[cls]]["IN"] += 1
203
191
  else:
@@ -218,7 +206,7 @@ class ObjectCounter:
218
206
  labels_dict[str.capitalize(key)] = f"IN {value['IN']} OUT {value['OUT']}"
219
207
 
220
208
  if labels_dict:
221
- self.annotator.display_analytics(self.im0, labels_dict, self.count_txt_color, self.count_bg_color, 10)
209
+ annotator.display_analytics(self.im0, labels_dict, (104, 31, 17), (255, 255, 255), 10)
222
210
 
223
211
  def display_frames(self):
224
212
  """Displays the current frame with annotations and regions in a window."""
@@ -501,6 +501,10 @@ class Annotator:
501
501
  """
502
502
  cv2.polylines(self.im, [np.array(reg_pts, dtype=np.int32)], isClosed=True, color=color, thickness=thickness)
503
503
 
504
+ # Draw small circles at the corner points
505
+ for point in reg_pts:
506
+ cv2.circle(self.im, (point[0], point[1]), thickness * 2, color, -1) # -1 fills the circle
507
+
504
508
  def draw_centroid_and_tracks(self, track, color=(255, 0, 255), track_thickness=2):
505
509
  """
506
510
  Draw centroid point and track trails.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ultralytics
3
- Version: 8.2.88
3
+ Version: 8.2.89
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
@@ -8,7 +8,7 @@ tests/test_exports.py,sha256=Uezf3OatpPHlo5qoPw-2kqkZxuMCF9L4XF2riD4vmII,8225
8
8
  tests/test_integrations.py,sha256=xglcfMPjfVh346PV8WTpk6tBxraCXEFJEQyyJMr5tyU,6064
9
9
  tests/test_python.py,sha256=08fg47DuJflumuUBto480-9VCqtEGAhQjNnQdcHs9_c,22242
10
10
  tests/test_solutions.py,sha256=p_2edhl96Ty3jwzSf02Q2m2mTu9skc0Z-eMcUuuXfLg,3300
11
- ultralytics/__init__.py,sha256=NQ37pAzVcIC6eXgtoGc-_RWlWJ1WfO3D-eqVRVd_9TA,694
11
+ ultralytics/__init__.py,sha256=MVZqcQUPVKuAlSD9ewK8jnl-T2H5Gldkb6_OfnBVEj0,694
12
12
  ultralytics/assets/bus.jpg,sha256=wCAZxJecGR63Od3ZRERe9Aja1Weayrb9Ug751DS_vGM,137419
13
13
  ultralytics/assets/zidane.jpg,sha256=Ftc4aeMmen1O0A3o6GCDO9FlfBslLpTAw0gnetx7bts,50427
14
14
  ultralytics/cfg/__init__.py,sha256=pkB7wk0pHOA3xzKzMbS-hA0iJoPOWVNnwZJh0LuWh-w,33089
@@ -87,7 +87,7 @@ ultralytics/data/annotator.py,sha256=PniOxH2MScWKp539vuufk69uG1JsltDB5OMCUhxn2QY
87
87
  ultralytics/data/augment.py,sha256=RbFhBQQrE9TazD2MmRPP60HKL3yhkRG0e0VMWbrKe3I,119270
88
88
  ultralytics/data/base.py,sha256=HK-YZOStAkD8hVHhfBetH-Q_CWfEfuyPvv_gYwxULzY,13527
89
89
  ultralytics/data/build.py,sha256=AfMmz0sHIYmwry_90tEJFRk_kz0S3SolScVXqYHiT08,7261
90
- ultralytics/data/converter.py,sha256=i10R8N2LTKRfhj7DPuQbEs0C2qyXh-RfpzvKOqkkdoU,21399
90
+ ultralytics/data/converter.py,sha256=DjJ0atku2aKW0iS1PZPNX8V6WTrZ-CHZT6hopE1HSjI,21385
91
91
  ultralytics/data/dataset.py,sha256=IS07ulk7rXPZ-SW_rjYF9mS-TxPXOY9bbo5jqfcwPqM,22874
92
92
  ultralytics/data/loaders.py,sha256=JF2Z_ESK6RweavOuYWejYSGJwmqINb5hNwwCb3AAf0M,24094
93
93
  ultralytics/data/split_dota.py,sha256=yOtypHoY5HvIVBKZgFXdfj2tuCLLEBnMwNfAeG94Eik,10680
@@ -98,7 +98,7 @@ ultralytics/data/explorer/utils.py,sha256=EvvukQiQUTBrsZznmMnyEX2EqTuwZo_Geyc8yf
98
98
  ultralytics/data/explorer/gui/__init__.py,sha256=mHtJuK4hwF8cuV-VHDc7tp6u6D1gHz2Z7JI8grmQDTs,42
99
99
  ultralytics/data/explorer/gui/dash.py,sha256=vZ476NaUH4FKU08rAJ1K9WNyKtg0soMyJJxqg176yWc,10498
100
100
  ultralytics/engine/__init__.py,sha256=mHtJuK4hwF8cuV-VHDc7tp6u6D1gHz2Z7JI8grmQDTs,42
101
- ultralytics/engine/exporter.py,sha256=VNTZUbZV9Pf6cYH39bawhudrrNMQ36RnQUCuTkfHktc,56852
101
+ ultralytics/engine/exporter.py,sha256=UXp5_vZ6WliIWb1vD48OjISjkhJQLeZBuSMAmsftYlg,57078
102
102
  ultralytics/engine/model.py,sha256=AB9tu7kJW-QiTAp0F_J8KQJ4FijsHXcYBTaVHb7aMrg,52281
103
103
  ultralytics/engine/predictor.py,sha256=MgMWHUJdRcVCaVmOyvdy2Gjk_EyRHv-ar0SSGxQe8F4,17471
104
104
  ultralytics/engine/results.py,sha256=PgRcz90S7eMwlogqEvax8O1sU3CPA2tEmrAL5kSr6II,70537
@@ -146,7 +146,7 @@ ultralytics/models/yolo/__init__.py,sha256=e1cZr9pbSbf3Ya2OvkTjGRwD_E2YZpe610xsk
146
146
  ultralytics/models/yolo/model.py,sha256=CMh3_qYCm2mdFHVyZJDMu8eFCTMD0z1ZPmM8GmwTU7E,4233
147
147
  ultralytics/models/yolo/classify/__init__.py,sha256=t-4pUHmgI2gjhc-l3bqNEcEtKD1dO40nD4Vc6Y2xD6o,355
148
148
  ultralytics/models/yolo/classify/predict.py,sha256=0CEJ4B4fXbOMUnJy79gRvG-qdszOzTSLOb1xxkgsKek,2444
149
- ultralytics/models/yolo/classify/train.py,sha256=hWeSk-4xkYh7ic1RUi8JaY2HXVUL0WPAsOi68hweJ8M,6291
149
+ ultralytics/models/yolo/classify/train.py,sha256=THXSkQVQVBuw1QxcEVA8MtLHYYdaAEqepObJCXoLcZ8,6358
150
150
  ultralytics/models/yolo/classify/val.py,sha256=Tzizhp3ebzPvwJejrE8tb-TuXw4MdkEI9mOANV74eXQ,4909
151
151
  ultralytics/models/yolo/detect/__init__.py,sha256=JR8gZJWn7wMBbh-0j_073nxJVZTMFZVWTOG5Wnvk6w0,229
152
152
  ultralytics/models/yolo/detect/predict.py,sha256=_kY6-_wsPCt9ZOf-iwusceikAM5TV_KnjYdv2koE45A,1471
@@ -169,7 +169,7 @@ ultralytics/models/yolo/world/train.py,sha256=gaDrAmLJpg9qDtmL5evA5HsV2yb4RTRSfk
169
169
  ultralytics/models/yolo/world/train_world.py,sha256=IsnCEVt6DcM9lUskCKmIN-M8MM79xLpwTRqRoAHUnZ4,4857
170
170
  ultralytics/nn/__init__.py,sha256=4BPLHY89xEM_al5uK0aOmFgiML6CMGEZbezxOvTjOEs,587
171
171
  ultralytics/nn/autobackend.py,sha256=DZTIHsp2PLs8H2-oQR9LqA-uPj8DARGonCXzRv2Pkdc,31546
172
- ultralytics/nn/tasks.py,sha256=glHh-fqtlaP-q5rkOei6NYINypOe_f6buAyCocsDu3A,46135
172
+ ultralytics/nn/tasks.py,sha256=T1DRGKOe1hLS4fdQAONEJ5x75adBngdwYeSfmnRjnEU,46114
173
173
  ultralytics/nn/modules/__init__.py,sha256=m8x-XRHVLWMECPeysVlv1TQenV-n8oAbK1gxnoXzLpk,2553
174
174
  ultralytics/nn/modules/activation.py,sha256=chhn469wnRHEs5BMGNBYXwPYZc_7-urspTT8fnBd-xA,895
175
175
  ultralytics/nn/modules/block.py,sha256=n6Xhevz8_n05UCt_vmZ7eVRiDbA_zV_TvWNBbpZe-qA,34352
@@ -182,7 +182,7 @@ ultralytics/solutions/ai_gym.py,sha256=MgD_4DciCqXquM2Y6yjIIRkGWIg3rNfSuXrFqYzOC
182
182
  ultralytics/solutions/analytics.py,sha256=bGuZes11D7DNiTsHdwu6PJ0QA0vCiqMMAtZ7NyEkshY,11568
183
183
  ultralytics/solutions/distance_calculation.py,sha256=o_DAHk4JX8n2Vt7E68MX67mREOBZuy5skbXtVZ6iu_4,5228
184
184
  ultralytics/solutions/heatmap.py,sha256=oEVivA4KAK6z0wA5Ca_a2qTckQN8tCt9MCpsPREeNnk,10375
185
- ultralytics/solutions/object_counter.py,sha256=61KV4Ly7qVAN960fqNGlBUgojUkg-6rEcIhvaTOoaYE,10760
185
+ ultralytics/solutions/object_counter.py,sha256=Ed3jyXPya-wI6BDiOoDaUlqr2z0o1J6egtJr1SI59UY,9943
186
186
  ultralytics/solutions/parking_management.py,sha256=z0-g2nehh4aA1nO71foT8Rw5pQTxKnEdcKJb1Arrd0Q,10134
187
187
  ultralytics/solutions/queue_management.py,sha256=q617BErsU69Rm76EFTd8mzoSpPU2WqTs6_pazBQ8GMc,6773
188
188
  ultralytics/solutions/speed_estimation.py,sha256=kjqMSHGTHMZaNgTKNKWULxnJQNsvhq4WMUphMVlBjsc,6768
@@ -209,7 +209,7 @@ ultralytics/utils/loss.py,sha256=mDHGmF-gjggAUVhI1dkCm7TtfZHCwz25XKm4M2xJKLs,339
209
209
  ultralytics/utils/metrics.py,sha256=UgLGudWp57uXDMlMUJy4gsz6cfVjcq7tYmHeto3TqvM,53927
210
210
  ultralytics/utils/ops.py,sha256=dsXNdyrYx_p6io6zezig9p84dxS7U-10vceHNVu2IL0,32888
211
211
  ultralytics/utils/patches.py,sha256=Oo3DkP7MbXnNGvPfoFSocAkVvaPh9kwMT_9RQUfjVhI,3594
212
- ultralytics/utils/plotting.py,sha256=xGXGkVVYeoGhAw0kXpEYQfsCwLlbFDMjOAjh_rQVEl4,55997
212
+ ultralytics/utils/plotting.py,sha256=Tp1vjSrzbtQc1ILlT1Frw9YzvGtOHlf8bdLAvZg7TBU,56181
213
213
  ultralytics/utils/tal.py,sha256=ECsu95xEqOItmxMDN4YTD3FsUiIsQNWy0pZC3TfvFfk,16877
214
214
  ultralytics/utils/torch_utils.py,sha256=NgZtDgjQkAVCAqCdFrFMSU9Fl_x3pYqaYa1mhAvOb_8,29312
215
215
  ultralytics/utils/triton.py,sha256=gg1finxno_tY2Ge9PMhmu7PI9wvoFZoiicdT4Bhqv3w,3936
@@ -225,9 +225,9 @@ ultralytics/utils/callbacks/neptune.py,sha256=5Z3ua5YBTUS56FH8VQKQG1aaIo9fH8GEyz
225
225
  ultralytics/utils/callbacks/raytune.py,sha256=ODVYzy-CoM4Uge0zjkh3Hnh9nF2M0vhDrSenXnvcizw,705
226
226
  ultralytics/utils/callbacks/tensorboard.py,sha256=0kn4IR10no99UCIheojWRujgybmUHSx5fPI6Vsq6l_g,4135
227
227
  ultralytics/utils/callbacks/wb.py,sha256=9-fjQIdLjr3b73DTE3rHO171KvbH1VweJ-bmbv-rqTw,6747
228
- ultralytics-8.2.88.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
229
- ultralytics-8.2.88.dist-info/METADATA,sha256=ehJXczkRiGu6dIY107Isil6ss-3tY5ITx_nGpA7zWfY,41871
230
- ultralytics-8.2.88.dist-info/WHEEL,sha256=cVxcB9AmuTcXqmwrtPhNK88dr7IR_b6qagTj0UvIEbY,91
231
- ultralytics-8.2.88.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
232
- ultralytics-8.2.88.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
233
- ultralytics-8.2.88.dist-info/RECORD,,
228
+ ultralytics-8.2.89.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
229
+ ultralytics-8.2.89.dist-info/METADATA,sha256=1PD1bFkrWFYgJaFvbTLjKWBd7bDotjvJgZ2zXYY6XC0,41871
230
+ ultralytics-8.2.89.dist-info/WHEEL,sha256=cVxcB9AmuTcXqmwrtPhNK88dr7IR_b6qagTj0UvIEbY,91
231
+ ultralytics-8.2.89.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
232
+ ultralytics-8.2.89.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
233
+ ultralytics-8.2.89.dist-info/RECORD,,