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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
2
2
 
3
- __version__ = "8.3.144"
3
+ __version__ = "8.3.145"
4
4
 
5
5
  import os
6
6
 
@@ -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=kwargs.get("data"), # if no 'data' argument passed set data=None for default datasets
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=kwargs.get("verbose", False),
684
- format=kwargs.get("format", ""),
683
+ verbose=verbose,
684
+ format=format,
685
+ **export_kwargs,
685
686
  )
686
687
 
687
688
  def export(
@@ -558,7 +558,7 @@ class Results(SimpleClass, DataExportMixin):
558
558
  )
559
559
  idx = (
560
560
  pred_boxes.id
561
- if pred_boxes.id is not None and color_mode == "instance"
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, None if d.id is None else int(d.id.item())
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.reshape(-1, 4, 2).squeeze() if is_obb else d.xyxy.squeeze()
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), None if d.id is None else int(d.id.item())
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)
@@ -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 tracks.boxes.id is not None:
80
- track_ids = tracks.boxes.id.cpu().tolist()
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])
@@ -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.id is not None:
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[0], "masks", None)
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
- self.track_data = self.tracks[0].obb or self.tracks[0].boxes # Extract tracks for OBB or object detection
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.id is not None:
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()
@@ -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.144
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.17; extra == "dev"
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=3-pT6fFmi4jAduO28YsWFpL3KKxYvrl1kQhs2qaQLiI,730
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=JFouz4lZ4_1carHYjmpJc3ODNhs4OcEoDV96O8GGz_Y,53129
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=NJ63EIHUxwip_azu1tykQD_WH7-tr9H4LWbzBlKfWRs,72323
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=pOfuRFDt7q_AX4EtbZZKSWFLP63xZDnsRwBz9lCHkC0,5345
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=FXHVJqdJxhB2yKABaoEQXEJGnmWYNptL5lnZjfHJIJ0,5427
212
- ultralytics/solutions/instance_segmentation.py,sha256=9fW9XoSpVHnXAg7q6VziQNq2Wq1SUuPGjxMiBkDUZco,3742
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=F4naCZOx4YrA6avC6RYJkX61hjz-Ayse7f2p94RBMNY,9749
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=0KIjRelx283v5XdKd9ucjDpU654xRSpSo5KY6X52y9w,37317
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=QlfYzkGFhy_eP0DRCscdcpN-2TwvQFcM7zfR1Mc9WK4,30795
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.144.dist-info/licenses/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
268
- ultralytics-8.3.144.dist-info/METADATA,sha256=KFQOl3B4HQP586nENGqpjHRnX5g6tbpWaXkBnpK1sws,37200
269
- ultralytics-8.3.144.dist-info/WHEEL,sha256=zaaOINJESkSfm_4HQVc5ssNzHCPXhJm0kEUakpsEHaU,91
270
- ultralytics-8.3.144.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
271
- ultralytics-8.3.144.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
272
- ultralytics-8.3.144.dist-info/RECORD,,
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,,