ultralytics 8.3.144__py3-none-any.whl → 8.3.145__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 +1 -1
- ultralytics/engine/model.py +13 -12
- ultralytics/engine/results.py +4 -4
- ultralytics/solutions/ai_gym.py +3 -5
- ultralytics/solutions/heatmap.py +1 -1
- ultralytics/solutions/instance_segmentation.py +1 -1
- ultralytics/solutions/object_counter.py +0 -4
- ultralytics/solutions/solutions.py +5 -4
- ultralytics/utils/benchmarks.py +3 -1
- {ultralytics-8.3.144.dist-info → ultralytics-8.3.145.dist-info}/METADATA +2 -2
- {ultralytics-8.3.144.dist-info → ultralytics-8.3.145.dist-info}/RECORD +15 -15
- {ultralytics-8.3.144.dist-info → ultralytics-8.3.145.dist-info}/WHEEL +0 -0
- {ultralytics-8.3.144.dist-info → ultralytics-8.3.145.dist-info}/entry_points.txt +0 -0
- {ultralytics-8.3.144.dist-info → ultralytics-8.3.145.dist-info}/licenses/LICENSE +0 -0
- {ultralytics-8.3.144.dist-info → ultralytics-8.3.145.dist-info}/top_level.txt +0 -0
ultralytics/__init__.py
CHANGED
ultralytics/engine/model.py
CHANGED
@@ -634,10 +634,7 @@ class Model(torch.nn.Module):
|
|
634
634
|
self.metrics = validator.metrics
|
635
635
|
return validator.metrics
|
636
636
|
|
637
|
-
def benchmark(
|
638
|
-
self,
|
639
|
-
**kwargs: Any,
|
640
|
-
):
|
637
|
+
def benchmark(self, data=None, format="", verbose=False, **kwargs: Any):
|
641
638
|
"""
|
642
639
|
Benchmark the model across various export formats to evaluate performance.
|
643
640
|
|
@@ -647,14 +644,14 @@ class Model(torch.nn.Module):
|
|
647
644
|
defaults, and any additional user-provided keyword arguments.
|
648
645
|
|
649
646
|
Args:
|
647
|
+
data (str): Path to the dataset for benchmarking.
|
648
|
+
verbose (bool): Whether to print detailed benchmark information.
|
649
|
+
format (str): Export format name for specific benchmarking.
|
650
650
|
**kwargs (Any): Arbitrary keyword arguments to customize the benchmarking process. Common options include:
|
651
|
-
- data (str): Path to the dataset for benchmarking.
|
652
651
|
- imgsz (int | List[int]): Image size for benchmarking.
|
653
652
|
- half (bool): Whether to use half-precision (FP16) mode.
|
654
653
|
- int8 (bool): Whether to use int8 precision mode.
|
655
654
|
- device (str): Device to run the benchmark on (e.g., 'cpu', 'cuda').
|
656
|
-
- verbose (bool): Whether to print detailed benchmark information.
|
657
|
-
- format (str): Export format name for specific benchmarking.
|
658
655
|
|
659
656
|
Returns:
|
660
657
|
(dict): A dictionary containing the results of the benchmarking process, including metrics for
|
@@ -671,17 +668,21 @@ class Model(torch.nn.Module):
|
|
671
668
|
self._check_is_pytorch_model()
|
672
669
|
from ultralytics.utils.benchmarks import benchmark
|
673
670
|
|
671
|
+
from .exporter import export_formats
|
672
|
+
|
674
673
|
custom = {"verbose": False} # method defaults
|
675
674
|
args = {**DEFAULT_CFG_DICT, **self.model.args, **custom, **kwargs, "mode": "benchmark"}
|
675
|
+
fmts = export_formats()
|
676
|
+
export_args = set(dict(zip(fmts["Argument"], fmts["Arguments"])).get(format, []))
|
677
|
+
export_kwargs = {k: v for k, v in args.items() if k in export_args - set(["batch"])}
|
676
678
|
return benchmark(
|
677
679
|
model=self,
|
678
|
-
data=
|
680
|
+
data=data, # if no 'data' argument passed set data=None for default datasets
|
679
681
|
imgsz=args["imgsz"],
|
680
|
-
half=args["half"],
|
681
|
-
int8=args["int8"],
|
682
682
|
device=args["device"],
|
683
|
-
verbose=
|
684
|
-
format=
|
683
|
+
verbose=verbose,
|
684
|
+
format=format,
|
685
|
+
**export_kwargs,
|
685
686
|
)
|
686
687
|
|
687
688
|
def export(
|
ultralytics/engine/results.py
CHANGED
@@ -558,7 +558,7 @@ class Results(SimpleClass, DataExportMixin):
|
|
558
558
|
)
|
559
559
|
idx = (
|
560
560
|
pred_boxes.id
|
561
|
-
if pred_boxes.
|
561
|
+
if pred_boxes.is_track and color_mode == "instance"
|
562
562
|
else pred_boxes.cls
|
563
563
|
if pred_boxes and color_mode == "class"
|
564
564
|
else reversed(range(len(pred_masks)))
|
@@ -568,10 +568,10 @@ class Results(SimpleClass, DataExportMixin):
|
|
568
568
|
# Plot Detect results
|
569
569
|
if pred_boxes is not None and show_boxes:
|
570
570
|
for i, d in enumerate(reversed(pred_boxes)):
|
571
|
-
c, d_conf, id = int(d.cls), float(d.conf) if conf else None,
|
571
|
+
c, d_conf, id = int(d.cls), float(d.conf) if conf else None, int(d.id.item()) if d.is_track else None
|
572
572
|
name = ("" if id is None else f"id:{id} ") + names[c]
|
573
573
|
label = (f"{name} {d_conf:.2f}" if conf else name) if labels else None
|
574
|
-
box = d.xyxyxyxy.
|
574
|
+
box = d.xyxyxyxy.squeeze() if is_obb else d.xyxy.squeeze()
|
575
575
|
annotator.box_label(
|
576
576
|
box,
|
577
577
|
label,
|
@@ -733,7 +733,7 @@ class Results(SimpleClass, DataExportMixin):
|
|
733
733
|
elif boxes:
|
734
734
|
# Detect/segment/pose
|
735
735
|
for j, d in enumerate(boxes):
|
736
|
-
c, conf, id = int(d.cls), float(d.conf),
|
736
|
+
c, conf, id = int(d.cls), float(d.conf), int(d.id.item()) if d.is_track else None
|
737
737
|
line = (c, *(d.xyxyxyxyn.view(-1) if is_obb else d.xywhn.view(-1)))
|
738
738
|
if masks:
|
739
739
|
seg = masks[j].xyn[0].copy().reshape(-1) # reversed mask.xyn, (n,2) to (n*2)
|
ultralytics/solutions/ai_gym.py
CHANGED
@@ -74,14 +74,12 @@ class AIGym(BaseSolution):
|
|
74
74
|
annotator = SolutionAnnotator(im0, line_width=self.line_width) # Initialize annotator
|
75
75
|
|
76
76
|
self.extract_tracks(im0) # Extract tracks (bounding boxes, classes, and masks)
|
77
|
-
tracks = self.tracks[0]
|
78
77
|
|
79
|
-
if
|
80
|
-
|
81
|
-
kpt_data = tracks.keypoints.data.cpu() # Avoid repeated .cpu() calls
|
78
|
+
if len(self.boxes):
|
79
|
+
kpt_data = self.tracks.keypoints.data.cpu() # Avoid repeated .cpu() calls
|
82
80
|
|
83
81
|
for i, k in enumerate(kpt_data):
|
84
|
-
track_id = int(track_ids[i]) # get track id
|
82
|
+
track_id = int(self.track_ids[i]) # get track id
|
85
83
|
state = self.states[track_id] # get state details
|
86
84
|
# Get keypoints and estimate the angle
|
87
85
|
state["angle"] = annotator.estimate_pose_angle(*[k[int(idx)] for idx in self.kpts])
|
ultralytics/solutions/heatmap.py
CHANGED
@@ -110,7 +110,7 @@ class Heatmap(ObjectCounter):
|
|
110
110
|
self.display_counts(plot_im) # Display the counts on the frame
|
111
111
|
|
112
112
|
# Normalize, apply colormap to heatmap and combine with original image
|
113
|
-
if self.track_data.
|
113
|
+
if self.track_data.is_track:
|
114
114
|
normalized_heatmap = cv2.normalize(self.heatmap, None, 0, 255, cv2.NORM_MINMAX).astype(np.uint8)
|
115
115
|
colored_heatmap = cv2.applyColorMap(normalized_heatmap, self.colormap)
|
116
116
|
plot_im = cv2.addWeighted(plot_im, 0.5, colored_heatmap, 0.5, 0)
|
@@ -65,7 +65,7 @@ class InstanceSegmentation(BaseSolution):
|
|
65
65
|
>>> print(summary)
|
66
66
|
"""
|
67
67
|
self.extract_tracks(im0) # Extract tracks (bounding boxes, classes, and masks)
|
68
|
-
self.masks = getattr(self.tracks
|
68
|
+
self.masks = getattr(self.tracks, "masks", None)
|
69
69
|
|
70
70
|
# Iterate over detected classes, track IDs, and segmentation masks
|
71
71
|
if self.masks is None:
|
@@ -167,10 +167,6 @@ class ObjectCounter(BaseSolution):
|
|
167
167
|
self.extract_tracks(im0) # Extract tracks
|
168
168
|
self.annotator = SolutionAnnotator(im0, line_width=self.line_width) # Initialize annotator
|
169
169
|
|
170
|
-
is_obb = getattr(self.tracks[0], "obb", None) is not None # True if OBB results exist
|
171
|
-
if is_obb and self.track_data and self.track_data.id is not None:
|
172
|
-
self.boxes = self.track_data.xyxyxyxy.reshape(-1, 4, 2).cpu()
|
173
|
-
|
174
170
|
self.annotator.draw_region(
|
175
171
|
reg_pts=self.region, color=(104, 0, 123), thickness=self.line_width * 2
|
176
172
|
) # Draw region
|
@@ -169,11 +169,12 @@ class BaseSolution:
|
|
169
169
|
with self.profilers[0]:
|
170
170
|
self.tracks = self.model.track(
|
171
171
|
source=im0, persist=True, classes=self.classes, verbose=False, **self.track_add_args
|
172
|
-
)
|
173
|
-
|
172
|
+
)[0]
|
173
|
+
is_obb = self.tracks.obb is not None
|
174
|
+
self.track_data = self.tracks.obb if is_obb else self.tracks.boxes # Extract tracks for OBB or object detection
|
174
175
|
|
175
|
-
if self.track_data and self.track_data.
|
176
|
-
self.boxes = self.track_data.xyxy.cpu()
|
176
|
+
if self.track_data and self.track_data.is_track:
|
177
|
+
self.boxes = (self.track_data.xyxyxyxy if is_obb else self.track_data.xyxy).cpu()
|
177
178
|
self.clss = self.track_data.cls.cpu().tolist()
|
178
179
|
self.track_ids = self.track_data.id.int().cpu().tolist()
|
179
180
|
self.confs = self.track_data.conf.cpu().tolist()
|
ultralytics/utils/benchmarks.py
CHANGED
@@ -59,6 +59,7 @@ def benchmark(
|
|
59
59
|
verbose=False,
|
60
60
|
eps=1e-3,
|
61
61
|
format="",
|
62
|
+
**kwargs,
|
62
63
|
):
|
63
64
|
"""
|
64
65
|
Benchmark a YOLO model across different formats for speed and accuracy.
|
@@ -73,6 +74,7 @@ def benchmark(
|
|
73
74
|
verbose (bool | float): If True or a float, assert benchmarks pass with given metric.
|
74
75
|
eps (float): Epsilon value for divide by zero prevention.
|
75
76
|
format (str): Export format for benchmarking. If not supplied all formats are benchmarked.
|
77
|
+
**kwargs (Any): Additional keyword arguments for exporter.
|
76
78
|
|
77
79
|
Returns:
|
78
80
|
(pandas.DataFrame): A pandas DataFrame with benchmark results for each format, including file size, metric,
|
@@ -154,7 +156,7 @@ def benchmark(
|
|
154
156
|
exported_model = model # PyTorch format
|
155
157
|
else:
|
156
158
|
filename = model.export(
|
157
|
-
imgsz=imgsz, format=format, half=half, int8=int8, data=data, device=device, verbose=False
|
159
|
+
imgsz=imgsz, format=format, half=half, int8=int8, data=data, device=device, verbose=False, **kwargs
|
158
160
|
)
|
159
161
|
exported_model = YOLO(filename, task=model.task)
|
160
162
|
assert suffix in str(filename), "export failed"
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: ultralytics
|
3
|
-
Version: 8.3.
|
3
|
+
Version: 8.3.145
|
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>
|
@@ -55,7 +55,7 @@ Requires-Dist: coverage[toml]; extra == "dev"
|
|
55
55
|
Requires-Dist: mkdocs>=1.6.0; extra == "dev"
|
56
56
|
Requires-Dist: mkdocs-material>=9.5.9; extra == "dev"
|
57
57
|
Requires-Dist: mkdocstrings[python]; extra == "dev"
|
58
|
-
Requires-Dist: mkdocs-ultralytics-plugin>=0.1.
|
58
|
+
Requires-Dist: mkdocs-ultralytics-plugin>=0.1.19; extra == "dev"
|
59
59
|
Requires-Dist: mkdocs-macros-plugin>=1.0.5; extra == "dev"
|
60
60
|
Provides-Extra: export
|
61
61
|
Requires-Dist: onnx<1.18.0,>=1.12.0; extra == "export"
|
@@ -7,7 +7,7 @@ tests/test_exports.py,sha256=HmMKOTCia9ZDC0VYc_EPmvBTM5LM5eeI1NF_pKjLpd8,9677
|
|
7
7
|
tests/test_integrations.py,sha256=cQfgueFhEZ8Xs-tF0uiIEhvn0DlhOH-Wqrx96LXp3D0,6303
|
8
8
|
tests/test_python.py,sha256=Zx9OlPN11_D1WSLpi9nPFqORNHNz0lEn6mxVNL2ZHjE,25852
|
9
9
|
tests/test_solutions.py,sha256=tuf6n_fsI8KvSdJrnc-cqP2qYdiYqCWuVrx0z9dOz3Q,13213
|
10
|
-
ultralytics/__init__.py,sha256=
|
10
|
+
ultralytics/__init__.py,sha256=u3QffN3nHEJosKs8D2yFToSRrI9sa77PqqJoQ1T2Fms,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=a2jQYIUoTwYRNUddLWE_TWxD7LQOczveM_BV7qVbork,39655
|
@@ -119,9 +119,9 @@ ultralytics/data/scripts/get_coco128.sh,sha256=qmRQl_hOKrsdHrTrnyQuFIH01oDz3lfaz
|
|
119
119
|
ultralytics/data/scripts/get_imagenet.sh,sha256=hr42H16bM47iT27rgS7MpEo-GeOZAYUQXgr0B2cwn48,1705
|
120
120
|
ultralytics/engine/__init__.py,sha256=lm6MckFYCPTbqIoX7w0s_daxdjNeBeKW6DXppv1-QUM,70
|
121
121
|
ultralytics/engine/exporter.py,sha256=Ug0HvQSseQA9k4jb_CUGXKPg9w082W1cocwPxxtXgkM,73902
|
122
|
-
ultralytics/engine/model.py,sha256=
|
122
|
+
ultralytics/engine/model.py,sha256=hJNeSemchlecsyxd_Fuj-351z0AJIhOE4GN3W0tJGU8,53300
|
123
123
|
ultralytics/engine/predictor.py,sha256=30fBpuwOuNT3hr8bju4coeOr-jqU_8hDYESugmowLBE,22151
|
124
|
-
ultralytics/engine/results.py,sha256=
|
124
|
+
ultralytics/engine/results.py,sha256=Mb8pBTOrBtQh0PQtGVbhRZ_C1VyqYFumjLggiKCRIJs,72295
|
125
125
|
ultralytics/engine/trainer.py,sha256=zZ2Lm7VJOlBX-Ya52ec3n3IlSn9_yM5fbsRIWGeGOyo,39556
|
126
126
|
ultralytics/engine/tuner.py,sha256=4ue7JbMFQp7JcWhhwCAY-b-xZsjm5VKVlPFDUTyxt_8,12789
|
127
127
|
ultralytics/engine/validator.py,sha256=MMxH1TMKN32Y8MHaN4XOofQ1RkXNm867oM63eVtOtZA,16970
|
@@ -204,21 +204,21 @@ ultralytics/nn/modules/head.py,sha256=zTXFXc46ljPdP3mjgH7B3y2bPIjvbVPtgTu_rQCV8x
|
|
204
204
|
ultralytics/nn/modules/transformer.py,sha256=PW5-6gzOP3_rZ_uAkmxvI42nU5bkrgbgLKCy5PC5px4,31415
|
205
205
|
ultralytics/nn/modules/utils.py,sha256=rn8yTObZGkQoqVzjbZWLaHiytppG4ffjMME4Lw60glM,6092
|
206
206
|
ultralytics/solutions/__init__.py,sha256=ZoeAQavTLp8aClnhZ9tbl6lxy86GxofyGvZWTx2aWkI,1209
|
207
|
-
ultralytics/solutions/ai_gym.py,sha256=
|
207
|
+
ultralytics/solutions/ai_gym.py,sha256=A8vzdjTqOF2mFAiiy7zu3f8lzwqLJ07dk5aqZ8p-x_w,5256
|
208
208
|
ultralytics/solutions/analytics.py,sha256=e_uD6lVFdpVrpxSZzAt_zLh5GnoKpSDDZF16uz3nS0U,12252
|
209
209
|
ultralytics/solutions/config.py,sha256=1HZvgWPt7duDxqAaOTyu4-TOBeRJeWx5EQgUwnyyO50,5394
|
210
210
|
ultralytics/solutions/distance_calculation.py,sha256=e2Xa7dVOqiuk43JNakoxQlX48evEgZiEtxdtHTdlAsk,5931
|
211
|
-
ultralytics/solutions/heatmap.py,sha256=
|
212
|
-
ultralytics/solutions/instance_segmentation.py,sha256=
|
211
|
+
ultralytics/solutions/heatmap.py,sha256=IVnTOyIbxKrhmnzGbkncIqPakPHeJe4nrwQkOPJ00wY,5421
|
212
|
+
ultralytics/solutions/instance_segmentation.py,sha256=HBWkCwmRa0jk84q4fhANzGpyirAtiCkAKRt0j9ED_Cw,3739
|
213
213
|
ultralytics/solutions/object_blurrer.py,sha256=UVd9EGpyb_fJXFnPg3lbnhWxY1ntHVWmIJ2ragbZ6eY,3942
|
214
|
-
ultralytics/solutions/object_counter.py,sha256=
|
214
|
+
ultralytics/solutions/object_counter.py,sha256=8wLAGv3DYFHvVgGGaEVaYj2WtdCSspuxInX-T78rwLs,9505
|
215
215
|
ultralytics/solutions/object_cropper.py,sha256=SVB9fflB7-juZWUARpi-kndSZDVI-oXjHg4WUnOuA9A,3470
|
216
216
|
ultralytics/solutions/parking_management.py,sha256=IHWK48DZa6PwaOKUu3XTJAZCxF6WtTlCno7N8W6VR4k,13481
|
217
217
|
ultralytics/solutions/queue_management.py,sha256=_K6ugLMDfpp37S-LFV36K3QXf3vqjfxji8BPP_-6iqc,4337
|
218
218
|
ultralytics/solutions/region_counter.py,sha256=8vNrr0SnEBJ7ngD_whWpD7jMlrzuYGWxUuZx3WOv0ys,5739
|
219
219
|
ultralytics/solutions/security_alarm.py,sha256=HXoPFlTOVp5eUecPuGIl_DXLKuN8-M32BCvCOd_vRac,6279
|
220
220
|
ultralytics/solutions/similarity_search.py,sha256=GdrPEpfBwLpM5Mx4XQiTrahgdQgiSIeGdHWWTLQl5xU,9926
|
221
|
-
ultralytics/solutions/solutions.py,sha256=
|
221
|
+
ultralytics/solutions/solutions.py,sha256=3JGuGGzEvgKHw_XYNv11yo_PxZlSqduIuW8fyrNeZ4E,37407
|
222
222
|
ultralytics/solutions/speed_estimation.py,sha256=_4tIfWPI7O_hYRQAvNrALMzdy2sBR5_0BxnPdJb0Gks,5823
|
223
223
|
ultralytics/solutions/streamlit_inference.py,sha256=menjJLsuP7AsQJSnBo7gRHfMlYE8HzMp0YNGqCU64n0,9986
|
224
224
|
ultralytics/solutions/trackzone.py,sha256=LRCG5HhcZb9PiYWbkUPeWuIOnNskPE4FEDY6a3Y4ctA,3850
|
@@ -236,7 +236,7 @@ ultralytics/trackers/utils/matching.py,sha256=uSYtywqi1lE_uNN1FwuBFPyISfDQXHMu8K
|
|
236
236
|
ultralytics/utils/__init__.py,sha256=Z2-2V5jKe4psJ1IH8FwPK2U-2f40m4iKa3YJN7kBqx8,59563
|
237
237
|
ultralytics/utils/autobatch.py,sha256=33m8YgggLIhltDqMXZ5OE-FGs2QiHrl2-LfgY1mI4cw,5119
|
238
238
|
ultralytics/utils/autodevice.py,sha256=AvgXFt8c1Cg4icKh0Hbhhz8UmVQ2Wjyfdfkeb2C8zck,8855
|
239
|
-
ultralytics/utils/benchmarks.py,sha256=
|
239
|
+
ultralytics/utils/benchmarks.py,sha256=YYsSSQfoe1HzHLEz-OR2z3XcrcMlFG_hef6kvaS3fwQ,30886
|
240
240
|
ultralytics/utils/checks.py,sha256=qykHykHYl5ceWX3EYW06qRpIQw1HB2JgIvbFBFrXWns,33762
|
241
241
|
ultralytics/utils/dist.py,sha256=A9lDGtGefTjSVvVS38w86GOdbtLzNBDZuDGK0MT4PRI,4170
|
242
242
|
ultralytics/utils/downloads.py,sha256=aKbQJVJqRFSpLXPWW8bZXNmAA19naa-SMGH8hiSA_38,22048
|
@@ -264,9 +264,9 @@ ultralytics/utils/callbacks/neptune.py,sha256=j8pecmlcsM8FGzLKWoBw5xUsi5t8E5HuxY
|
|
264
264
|
ultralytics/utils/callbacks/raytune.py,sha256=S6Bq16oQDQ8BQgnZzA0zJHGN_BBr8iAM_WtGoLiEcwg,1283
|
265
265
|
ultralytics/utils/callbacks/tensorboard.py,sha256=MDPBW7aDes-66OE6YqKXXvqA_EocjzEMHWGM-8z9vUQ,5281
|
266
266
|
ultralytics/utils/callbacks/wb.py,sha256=Tm_-aRr2CN32MJkY9tylpMBJkb007-MSRNSQ7rDJ5QU,7521
|
267
|
-
ultralytics-8.3.
|
268
|
-
ultralytics-8.3.
|
269
|
-
ultralytics-8.3.
|
270
|
-
ultralytics-8.3.
|
271
|
-
ultralytics-8.3.
|
272
|
-
ultralytics-8.3.
|
267
|
+
ultralytics-8.3.145.dist-info/licenses/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
|
268
|
+
ultralytics-8.3.145.dist-info/METADATA,sha256=FgXekJXZrrgIpL91ohK8GSKACSKwgBOezGaVt_BbiIE,37200
|
269
|
+
ultralytics-8.3.145.dist-info/WHEEL,sha256=zaaOINJESkSfm_4HQVc5ssNzHCPXhJm0kEUakpsEHaU,91
|
270
|
+
ultralytics-8.3.145.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
|
271
|
+
ultralytics-8.3.145.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
|
272
|
+
ultralytics-8.3.145.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|