ultralytics 8.3.29__py3-none-any.whl → 8.3.30__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 YOLO 🚀, AGPL-3.0 license
2
2
 
3
- __version__ = "8.3.29"
3
+ __version__ = "8.3.30"
4
4
 
5
5
  import os
6
6
 
@@ -671,6 +671,9 @@ def handle_yolo_solutions(args: List[str]) -> None:
671
671
  )
672
672
  s_n = "count" # Default solution if none provided
673
673
 
674
+ if args and args[0] == "help": # Add check for return if user call `yolo solutions help`
675
+ return
676
+
674
677
  cls, method = SOLUTION_MAP[s_n] # solution class name, method name and default source
675
678
 
676
679
  from ultralytics import solutions # import ultralytics solutions
@@ -750,7 +750,7 @@ class Results(SimpleClass):
750
750
  save_one_box(
751
751
  d.xyxy,
752
752
  self.orig_img.copy(),
753
- file=Path(save_dir) / self.names[int(d.cls)] / f"{Path(file_name)}.jpg",
753
+ file=Path(save_dir) / self.names[int(d.cls)] / Path(file_name).with_suffix(".jpg"),
754
754
  BGR=True,
755
755
  )
756
756
 
@@ -155,8 +155,8 @@ class DetectionValidator(BaseValidator):
155
155
  # Evaluate
156
156
  if nl:
157
157
  stat["tp"] = self._process_batch(predn, bbox, cls)
158
- if self.args.plots:
159
- self.confusion_matrix.process_batch(predn, bbox, cls)
158
+ if self.args.plots:
159
+ self.confusion_matrix.process_batch(predn, bbox, cls)
160
160
  for k in self.stats.keys():
161
161
  self.stats[k].append(stat[k])
162
162
 
@@ -138,8 +138,8 @@ class PoseValidator(DetectionValidator):
138
138
  if nl:
139
139
  stat["tp"] = self._process_batch(predn, bbox, cls)
140
140
  stat["tp_p"] = self._process_batch(predn, bbox, cls, pred_kpts, pbatch["kpts"])
141
- if self.args.plots:
142
- self.confusion_matrix.process_batch(predn, bbox, cls)
141
+ if self.args.plots:
142
+ self.confusion_matrix.process_batch(predn, bbox, cls)
143
143
 
144
144
  for k in self.stats.keys():
145
145
  self.stats[k].append(stat[k])
@@ -135,8 +135,8 @@ class SegmentationValidator(DetectionValidator):
135
135
  stat["tp_m"] = self._process_batch(
136
136
  predn, bbox, cls, pred_masks, gt_masks, self.args.overlap_mask, masks=True
137
137
  )
138
- if self.args.plots:
139
- self.confusion_matrix.process_batch(predn, bbox, cls)
138
+ if self.args.plots:
139
+ self.confusion_matrix.process_batch(predn, bbox, cls)
140
140
 
141
141
  for k in self.stats.keys():
142
142
  self.stats[k].append(stat[k])
@@ -7,6 +7,7 @@ from .heatmap import Heatmap
7
7
  from .object_counter import ObjectCounter
8
8
  from .parking_management import ParkingManagement, ParkingPtsSelection
9
9
  from .queue_management import QueueManager
10
+ from .region_counter import RegionCounter
10
11
  from .speed_estimation import SpeedEstimator
11
12
  from .streamlit_inference import inference
12
13
 
@@ -21,4 +22,5 @@ __all__ = (
21
22
  "SpeedEstimator",
22
23
  "Analytics",
23
24
  "inference",
25
+ "RegionCounter",
24
26
  )
@@ -54,7 +54,7 @@ class Analytics(BaseSolution):
54
54
  self.y_label = "Total Counts"
55
55
 
56
56
  # Predefined data
57
- self.bg_color = "#00F344" # background color of frame
57
+ self.bg_color = "#F3F3F3" # background color of frame
58
58
  self.fg_color = "#111E68" # foreground color of frame
59
59
  self.title = "Ultralytics Solutions" # window name
60
60
  self.max_points = 45 # maximum points to be drawn on window
@@ -0,0 +1,112 @@
1
+ # Ultralytics YOLO 🚀, AGPL-3.0 license
2
+
3
+ from ultralytics.solutions.solutions import BaseSolution
4
+ from ultralytics.utils.plotting import Annotator, colors
5
+
6
+
7
+ class RegionCounter(BaseSolution):
8
+ """
9
+ A class designed for real-time counting of objects within user-defined regions in a video stream.
10
+
11
+ This class inherits from `BaseSolution` and offers functionalities to define polygonal regions in a video
12
+ frame, track objects, and count those objects that pass through each defined region. This makes it useful
13
+ for applications that require counting in specified areas, such as monitoring zones or segmented sections.
14
+
15
+ Attributes:
16
+ region_template (dict): A template for creating new counting regions with default attributes including
17
+ the name, polygon coordinates, and display colors.
18
+ counting_regions (list): A list storing all defined regions, where each entry is based on `region_template`
19
+ and includes specific region settings like name, coordinates, and color.
20
+
21
+ Methods:
22
+ add_region: Adds a new counting region with specified attributes, such as the region's name, polygon points,
23
+ region color, and text color.
24
+ count: Processes video frames to count objects in each region, drawing regions and displaying counts
25
+ on the frame. Handles object detection, region definition, and containment checks.
26
+ """
27
+
28
+ def __init__(self, **kwargs):
29
+ """Initializes the RegionCounter class for real-time counting in different regions of the video streams."""
30
+ super().__init__(**kwargs)
31
+ self.region_template = {
32
+ "name": "Default Region",
33
+ "polygon": None,
34
+ "counts": 0,
35
+ "dragging": False,
36
+ "region_color": (255, 255, 255),
37
+ "text_color": (0, 0, 0),
38
+ }
39
+ self.counting_regions = []
40
+
41
+ def add_region(self, name, polygon_points, region_color, text_color):
42
+ """
43
+ Adds a new region to the counting list based on the provided template with specific attributes.
44
+
45
+ Args:
46
+ name (str): Name assigned to the new region.
47
+ polygon_points (list[tuple]): List of (x, y) coordinates defining the region's polygon.
48
+ region_color (tuple): BGR color for region visualization.
49
+ text_color (tuple): BGR color for the text within the region.
50
+ """
51
+ region = self.region_template.copy()
52
+ region.update(
53
+ {
54
+ "name": name,
55
+ "polygon": self.Polygon(polygon_points),
56
+ "region_color": region_color,
57
+ "text_color": text_color,
58
+ }
59
+ )
60
+ self.counting_regions.append(region)
61
+
62
+ def count(self, im0):
63
+ """
64
+ Processes the input frame to detect and count objects within each defined region.
65
+
66
+ Args:
67
+ im0 (numpy.ndarray): Input image frame where objects and regions are annotated.
68
+
69
+ Returns:
70
+ im0 (numpy.ndarray): Processed image frame with annotated counting information.
71
+ """
72
+ self.annotator = Annotator(im0, line_width=self.line_width)
73
+ self.extract_tracks(im0)
74
+
75
+ # Region initialization and conversion
76
+ if self.region is None:
77
+ self.initialize_region()
78
+ regions = {"Region#01": self.region}
79
+ else:
80
+ regions = self.region if isinstance(self.region, dict) else {"Region#01": self.region}
81
+
82
+ # Draw regions and process counts for each defined area
83
+ for idx, (region_name, reg_pts) in enumerate(regions.items(), start=1):
84
+ color = colors(idx, True)
85
+ self.annotator.draw_region(reg_pts=reg_pts, color=color, thickness=self.line_width * 2)
86
+ self.add_region(region_name, reg_pts, color, self.annotator.get_txt_color())
87
+
88
+ # Prepare regions for containment check
89
+ for region in self.counting_regions:
90
+ region["prepared_polygon"] = self.prep(region["polygon"])
91
+
92
+ # Process bounding boxes and count objects within each region
93
+ for box, cls in zip(self.boxes, self.clss):
94
+ self.annotator.box_label(box, label=self.names[cls], color=colors(cls, True))
95
+ bbox_center = ((box[0] + box[2]) / 2, (box[1] + box[3]) / 2)
96
+
97
+ for region in self.counting_regions:
98
+ if region["prepared_polygon"].contains(self.Point(bbox_center)):
99
+ region["counts"] += 1
100
+
101
+ # Display counts in each region
102
+ for region in self.counting_regions:
103
+ self.annotator.text_label(
104
+ region["polygon"].bounds,
105
+ label=str(region["counts"]),
106
+ color=region["region_color"],
107
+ txt_color=region["text_color"],
108
+ )
109
+ region["counts"] = 0 # Reset count for next frame
110
+
111
+ self.display_output(im0)
112
+ return im0
@@ -50,10 +50,12 @@ class BaseSolution:
50
50
  """
51
51
  check_requirements("shapely>=2.0.0")
52
52
  from shapely.geometry import LineString, Point, Polygon
53
+ from shapely.prepared import prep
53
54
 
54
55
  self.LineString = LineString
55
56
  self.Polygon = Polygon
56
57
  self.Point = Point
58
+ self.prep = prep
57
59
 
58
60
  # Load config and update with args
59
61
  DEFAULT_SOL_DICT.update(kwargs)
ultralytics/utils/tal.py CHANGED
@@ -58,17 +58,45 @@ class TaskAlignedAssigner(nn.Module):
58
58
  """
59
59
  self.bs = pd_scores.shape[0]
60
60
  self.n_max_boxes = gt_bboxes.shape[1]
61
+ device = gt_bboxes.device
61
62
 
62
63
  if self.n_max_boxes == 0:
63
- device = gt_bboxes.device
64
64
  return (
65
- torch.full_like(pd_scores[..., 0], self.bg_idx).to(device),
66
- torch.zeros_like(pd_bboxes).to(device),
67
- torch.zeros_like(pd_scores).to(device),
68
- torch.zeros_like(pd_scores[..., 0]).to(device),
69
- torch.zeros_like(pd_scores[..., 0]).to(device),
65
+ torch.full_like(pd_scores[..., 0], self.bg_idx),
66
+ torch.zeros_like(pd_bboxes),
67
+ torch.zeros_like(pd_scores),
68
+ torch.zeros_like(pd_scores[..., 0]),
69
+ torch.zeros_like(pd_scores[..., 0]),
70
70
  )
71
71
 
72
+ try:
73
+ return self._forward(pd_scores, pd_bboxes, anc_points, gt_labels, gt_bboxes, mask_gt)
74
+ except torch.OutOfMemoryError:
75
+ # Move tensors to CPU, compute, then move back to original device
76
+ cpu_tensors = [t.cpu() for t in (pd_scores, pd_bboxes, anc_points, gt_labels, gt_bboxes, mask_gt)]
77
+ result = self._forward(*cpu_tensors)
78
+ return tuple(t.to(device) for t in result)
79
+
80
+ def _forward(self, pd_scores, pd_bboxes, anc_points, gt_labels, gt_bboxes, mask_gt):
81
+ """
82
+ Compute the task-aligned assignment. Reference code is available at
83
+ https://github.com/Nioolek/PPYOLOE_pytorch/blob/master/ppyoloe/assigner/tal_assigner.py.
84
+
85
+ Args:
86
+ pd_scores (Tensor): shape(bs, num_total_anchors, num_classes)
87
+ pd_bboxes (Tensor): shape(bs, num_total_anchors, 4)
88
+ anc_points (Tensor): shape(num_total_anchors, 2)
89
+ gt_labels (Tensor): shape(bs, n_max_boxes, 1)
90
+ gt_bboxes (Tensor): shape(bs, n_max_boxes, 4)
91
+ mask_gt (Tensor): shape(bs, n_max_boxes, 1)
92
+
93
+ Returns:
94
+ target_labels (Tensor): shape(bs, num_total_anchors)
95
+ target_bboxes (Tensor): shape(bs, num_total_anchors, 4)
96
+ target_scores (Tensor): shape(bs, num_total_anchors, num_classes)
97
+ fg_mask (Tensor): shape(bs, num_total_anchors)
98
+ target_gt_idx (Tensor): shape(bs, num_total_anchors)
99
+ """
72
100
  mask_pos, align_metric, overlaps = self.get_pos_mask(
73
101
  pd_scores, pd_bboxes, gt_labels, gt_bboxes, anc_points, mask_gt
74
102
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ultralytics
3
- Version: 8.3.29
3
+ Version: 8.3.30
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,10 +7,10 @@ tests/test_exports.py,sha256=1MvhcQ2qHdbJImHII-bFarcaIcm-kPlEK-OdFLxnj7o,8769
7
7
  tests/test_integrations.py,sha256=f5-QCUk1SU_-qn4mBCZwS3GN3tXEBIIXo4z2EhExbHw,6126
8
8
  tests/test_python.py,sha256=I1RRdCwLdrc3jX06huVxct8HX8ccQOmQgVpuEflRl0U,23560
9
9
  tests/test_solutions.py,sha256=sPYhy2d814mIVvojQeVxeZPu0IVy01_Y8zuMcu_9GF0,3790
10
- ultralytics/__init__.py,sha256=DQQhUIqALl4beZ1ywcZyZ7EXgENfKTLSTzAOl1ctiOY,681
10
+ ultralytics/__init__.py,sha256=rWIiTJOQfPzIOhdWwz2WFyiM9SD4GYuZ2eYzbj6MQYQ,681
11
11
  ultralytics/assets/bus.jpg,sha256=wCAZxJecGR63Od3ZRERe9Aja1Weayrb9Ug751DS_vGM,137419
12
12
  ultralytics/assets/zidane.jpg,sha256=Ftc4aeMmen1O0A3o6GCDO9FlfBslLpTAw0gnetx7bts,50427
13
- ultralytics/cfg/__init__.py,sha256=0X6rETee3FHzNENaPrkByFi7dtpj91x4PCYF1-RxKdI,38633
13
+ ultralytics/cfg/__init__.py,sha256=ArJow4-pOPN3y6aKOv5KcVXimikI6vAQvQlSRb7IdWE,38743
14
14
  ultralytics/cfg/default.yaml,sha256=jlSdLkFAngX6HvrzJHdZ9kdi-xO7utyLc4X2M3NWhEI,8342
15
15
  ultralytics/cfg/datasets/Argoverse.yaml,sha256=FyeuJT5CHq_9d4hlfAf0kpZlnbUMO0S--UJ1yIqcdKk,3134
16
16
  ultralytics/cfg/datasets/DOTAv1.5.yaml,sha256=QVfp_Qp-4rukuicaB4qx86NxSHM8Mrzym8l_fIDo8gw,1195
@@ -102,7 +102,7 @@ ultralytics/engine/__init__.py,sha256=mHtJuK4hwF8cuV-VHDc7tp6u6D1gHz2Z7JI8grmQDT
102
102
  ultralytics/engine/exporter.py,sha256=DH67LwNDr3fiWxaES-lhSLvm5pCuasXLbQv4FSLCi_M,67171
103
103
  ultralytics/engine/model.py,sha256=TfuTczFjNJ3GW0E_qWVH6OaJ_2I-_Srx7i_4GQebDoo,51472
104
104
  ultralytics/engine/predictor.py,sha256=aS4yJdTK2kYq-TTpzIlWxqnAcBz38zIECZoMb_yOPMY,17597
105
- ultralytics/engine/results.py,sha256=BZVQF8TbNRnf2DcnTYzVCin1NlpplWaEW9EskACvhOI,75047
105
+ ultralytics/engine/results.py,sha256=a1XFZRPwqgKDBOEAibHuT9nP2xefLiWVsMoBJbcr4iA,75058
106
106
  ultralytics/engine/trainer.py,sha256=lbFMLdrdWkk1td6BpUS0_uLhAkiWo-eAmx_Kaov1JPA,37149
107
107
  ultralytics/engine/tuner.py,sha256=WBj8iw1K1TK0hvanlA-wkwmfqh1SI8jEe2dGwUINeTg,11838
108
108
  ultralytics/engine/validator.py,sha256=aWpXE3nrOqaA7jCuUgwxi0FabiGTIXtZvjoJyCX903o,14870
@@ -152,7 +152,7 @@ ultralytics/models/yolo/classify/val.py,sha256=Tzizhp3ebzPvwJejrE8tb-TuXw4MdkEI9
152
152
  ultralytics/models/yolo/detect/__init__.py,sha256=JR8gZJWn7wMBbh-0j_073nxJVZTMFZVWTOG5Wnvk6w0,229
153
153
  ultralytics/models/yolo/detect/predict.py,sha256=-uZFLutxGYZX47RANcaxC-LFStRbv0nBv_8-ypadQoI,1471
154
154
  ultralytics/models/yolo/detect/train.py,sha256=jayPByykRhJvUeDCN-oZ4M6Yx0rpjAWq9epjJgnHeYA,6363
155
- ultralytics/models/yolo/detect/val.py,sha256=ulKYfViVU2WErDtFOU8FTGBlROR4p-jFK4Nf9O4LMV4,15152
155
+ ultralytics/models/yolo/detect/val.py,sha256=Ydf0W7FPf-nSz_lOCTcIrlDqhG_kOK8Od6eYsGQDx9U,15144
156
156
  ultralytics/models/yolo/obb/__init__.py,sha256=txWbPGLY1_M7ZwlLQjrwGjTBOlsv9P3yk5ZEgysTinU,193
157
157
  ultralytics/models/yolo/obb/predict.py,sha256=VxpKCKV5dWnOr0GyV1rJGH5SzzRouCYW_8T26xJ8MU8,2037
158
158
  ultralytics/models/yolo/obb/train.py,sha256=_FVYCvHJ5ECi2aN8k7AmVLxRUuun7acSqwWtCBRuL6Q,1473
@@ -160,11 +160,11 @@ ultralytics/models/yolo/obb/val.py,sha256=dgKJnGKfdBpYMXsM1_MN2chONd2O6E3hEnITuT
160
160
  ultralytics/models/yolo/pose/__init__.py,sha256=OGvxN3LqJot2h8GX1csJ1KErsHnDKsm33Ce6ZBU9Lr4,199
161
161
  ultralytics/models/yolo/pose/predict.py,sha256=cpTe4vTI3etnGCgyMcvxbF0cMNetiWXUwhsipEFX-KQ,2365
162
162
  ultralytics/models/yolo/pose/train.py,sha256=mUC1GaYmRBTvXQsL-uNdcdANoIXdeGGBRdgOKkqRIRI,2926
163
- ultralytics/models/yolo/pose/val.py,sha256=4SIfHioPZL2QVhhvFEibir0bAzvIhykswKc1Kl5GbwA,12390
163
+ ultralytics/models/yolo/pose/val.py,sha256=uAZkNGYvivhpm83y7kgv7cOsgp762kd2GC_8pfQ-Kyk,12382
164
164
  ultralytics/models/yolo/segment/__init__.py,sha256=mSbKOE8BnHL7PL2nCOVG7dRM7CI6hJezFPPwZFjEmy8,247
165
165
  ultralytics/models/yolo/segment/predict.py,sha256=UAzSIc7xlZKr9PVMWS63X4ySUg9QmMh8tHtdfd7D-nk,2468
166
166
  ultralytics/models/yolo/segment/train.py,sha256=UTGGSInq_yuQuNm0wdrVruyiGe04fAZv5v1WMqQl9Ys,2298
167
- ultralytics/models/yolo/segment/val.py,sha256=qqvhdFEjoj5uXW8Mz3FTDpxO7vkrTsTRH7doGMNuGK8,14060
167
+ ultralytics/models/yolo/segment/val.py,sha256=LIq3gJTX2VqXwZ3MehBVMXMT-Ga1detezw4h-iwdTao,14052
168
168
  ultralytics/models/yolo/world/__init__.py,sha256=3VTH0q4NOt2EWRom15yCymvmvm0Etp2bmETJUhsVTBI,103
169
169
  ultralytics/models/yolo/world/train.py,sha256=gaDrAmLJpg9qDtmL5evA5HsV2yb4RTRSfk2EDYrHdRg,3686
170
170
  ultralytics/models/yolo/world/train_world.py,sha256=IsnCEVt6DcM9lUskCKmIN-M8MM79xLpwTRqRoAHUnZ4,4857
@@ -178,15 +178,16 @@ ultralytics/nn/modules/conv.py,sha256=vOeHZ6Z4sc6-9PrDmRGT1hFkxSBbbWkQm2jRbGGjpq
178
178
  ultralytics/nn/modules/head.py,sha256=KCO-qarg2K7uJqQ7L5zVJ4-viiHqmu4bzbSgAw3L_nk,27815
179
179
  ultralytics/nn/modules/transformer.py,sha256=tGiK8NmPfswwW1rbF21r5ILUkkZQ6Nk4s8j16vFBmps,18069
180
180
  ultralytics/nn/modules/utils.py,sha256=a88cKl2wz1nMVSEBiajtvaCbDBQIkESWOKTZ_WAJy90,3195
181
- ultralytics/solutions/__init__.py,sha256=6RDeXWO1QSaMgCq8YrWXaj2xvPw2sJwJL_a0dgjCvz0,648
181
+ ultralytics/solutions/__init__.py,sha256=4i8QCABfxRWPYUEdb58Pbg1xvR_Ra1u-ifB9fx21UUs,711
182
182
  ultralytics/solutions/ai_gym.py,sha256=Jb9Rbd9gOOj2ox4Q5mqalCdvg3RMXA6Cxe5kS18IFgA,5232
183
- ultralytics/solutions/analytics.py,sha256=G4SKg8OPwGsHdUITOeD3pP11iUce1j8ut6HW7BCoJuc,11535
183
+ ultralytics/solutions/analytics.py,sha256=C57pIghXeKN8hul8QOV7W9YDMpfFfSfPTBb-lE9HeAc,11535
184
184
  ultralytics/solutions/distance_calculation.py,sha256=KN3CC-dm2dTQylj79IrifCJT8ZhE7hc2EweH3KK31mE,5461
185
185
  ultralytics/solutions/heatmap.py,sha256=If9rosSCmE7pAL1HtVnLkx05gQp6nP1K6HzATMcaEEE,5372
186
186
  ultralytics/solutions/object_counter.py,sha256=vKB7riRm8NjHA6IXyf557FpmV-b0_XoKbXHqMHziXSM,8264
187
187
  ultralytics/solutions/parking_management.py,sha256=1DsEE94eauqcnnFxUYI-BX9eA1GbJVNt7oncj1okYpI,11198
188
188
  ultralytics/solutions/queue_management.py,sha256=D9TqwJSVrZQFxp_M8O62WfBAxkAuDWWnXe7FFmnp7_w,4881
189
- ultralytics/solutions/solutions.py,sha256=q2nR5J9vJTQfuMHEuxdor1MhbQTP1WoCh9GmoXiKxcY,7208
189
+ ultralytics/solutions/region_counter.py,sha256=w0c0Sz9XG6rwzr5nA6nb1zFW8IVkTQuatfZNBtOik68,4947
190
+ ultralytics/solutions/solutions.py,sha256=XEXLQKBWCDdYyZLkmQMyFIqdOEzr4WTfWNajvgjlhmU,7275
190
191
  ultralytics/solutions/speed_estimation.py,sha256=A10DmuZlGkoZUyfHhZWcDRjj1-9GXiDhEjyBbAzfaDs,4936
191
192
  ultralytics/solutions/streamlit_inference.py,sha256=w4dnvSv2FOrpji9W1Ir86phka3OXc7jd_38-OCbQdZw,5701
192
193
  ultralytics/trackers/__init__.py,sha256=j72IgH2dZHQArMPK4YwcV5ieIw94fYvlGdQjB9cOQKw,227
@@ -212,7 +213,7 @@ ultralytics/utils/metrics.py,sha256=msPaXc244ndc0NPBhnNlHsKkVhdc-TMgFn5NATlZZVI,
212
213
  ultralytics/utils/ops.py,sha256=dsXNdyrYx_p6io6zezig9p84dxS7U-10vceHNVu2IL0,32888
213
214
  ultralytics/utils/patches.py,sha256=J-iOwIRbfUs-inBZerhnXby5tUKjYcOIyvhLTS352JE,3270
214
215
  ultralytics/utils/plotting.py,sha256=TKtdbAOl6gZdFD2hlA5T4LNWfr2LUWbCC-cXkgL1JAU,61089
215
- ultralytics/utils/tal.py,sha256=89m5adNGmwwFlUx895b_7lEjIJc8YBdivJaxl6ACaSA,16944
216
+ ultralytics/utils/tal.py,sha256=t5sTZwaoglx3pW0P5ootiKFL-AsKZksh3ypHbPTInKE,18354
216
217
  ultralytics/utils/torch_utils.py,sha256=jB03Q-9ajTplxE05CdkmJmpXDUkb4LSiv3S6S2laWII,31608
217
218
  ultralytics/utils/triton.py,sha256=gg1finxno_tY2Ge9PMhmu7PI9wvoFZoiicdT4Bhqv3w,3936
218
219
  ultralytics/utils/tuner.py,sha256=K09-z5k1E4ZriSKoWdwQrJ2PJ2fY1ez3-b2R6aKPTqM,6198
@@ -227,9 +228,9 @@ ultralytics/utils/callbacks/neptune.py,sha256=IbGQfEltamUKXJt93uSLQFn8c2rYh3DMTg
227
228
  ultralytics/utils/callbacks/raytune.py,sha256=Ck_yFzg7UZXiDWrLHaltjQybzVWSFDfzpdrx9ZYTRfI,700
228
229
  ultralytics/utils/callbacks/tensorboard.py,sha256=SHlE58Fb-sg-uZKtgy-ybIO3SAIfK55aj8kTYGA0Cyg,4167
229
230
  ultralytics/utils/callbacks/wb.py,sha256=oX3JarCJGhzvW556XiEXQNaZblAaK_UETAt3kzkY61w,6869
230
- ultralytics-8.3.29.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
231
- ultralytics-8.3.29.dist-info/METADATA,sha256=yh-DydnZ0WaLyeF3GoeuT1Z8NJsVBOV3iy00xBLDmTs,35213
232
- ultralytics-8.3.29.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
233
- ultralytics-8.3.29.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
234
- ultralytics-8.3.29.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
235
- ultralytics-8.3.29.dist-info/RECORD,,
231
+ ultralytics-8.3.30.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
232
+ ultralytics-8.3.30.dist-info/METADATA,sha256=Sfqm2741qh7purvJHD8A_h1wQs4Gb72aQVH1H1eXg4A,35213
233
+ ultralytics-8.3.30.dist-info/WHEEL,sha256=R06PA3UVYHThwHvxuRWMqaGcr-PuniXahwjmQRFMEkY,91
234
+ ultralytics-8.3.30.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
235
+ ultralytics-8.3.30.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
236
+ ultralytics-8.3.30.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.3.0)
2
+ Generator: setuptools (75.5.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5