ultralytics 8.3.113__py3-none-any.whl → 8.3.115__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.113"
3
+ __version__ = "8.3.115"
4
4
 
5
5
  import os
6
6
 
@@ -6,7 +6,7 @@
6
6
  # parent
7
7
  # ├── ultralytics
8
8
  # └── datasets
9
- # └── dota8-multispectral ← downloads here (1MB)
9
+ # └── dota8-multispectral ← downloads here (37.3MB)
10
10
 
11
11
  # Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
12
12
  path: ../datasets/dota8-multispectral # dataset root dir
@@ -15,7 +15,8 @@ fuse_score: True # Whether to fuse confidence scores with the iou distances befo
15
15
 
16
16
  # BoT-SORT settings
17
17
  gmc_method: sparseOptFlow # method of global motion compensation
18
- # ReID model related thresh (not supported yet)
19
- proximity_thresh: 0.5
20
- appearance_thresh: 0.25
18
+ # ReID model related thresh
19
+ proximity_thresh: 0.5 # minimum IoU for valid match with ReID
20
+ appearance_thresh: 0.25 # minimum appearance similarity for ReID
21
21
  with_reid: False
22
+ model: auto # uses native features if detector is YOLO else yolo11n-cls.pt
ultralytics/data/utils.py CHANGED
@@ -47,7 +47,7 @@ def img2label_paths(img_paths):
47
47
  return [sb.join(x.rsplit(sa, 1)).rsplit(".", 1)[0] + ".txt" for x in img_paths]
48
48
 
49
49
 
50
- def check_file_speeds(files, threshold_ms=10, max_files=5, prefix=""):
50
+ def check_file_speeds(files, threshold_ms=10, threshold_mb=50, max_files=5, prefix=""):
51
51
  """
52
52
  Check dataset file access speed and provide performance feedback.
53
53
 
@@ -57,6 +57,7 @@ def check_file_speeds(files, threshold_ms=10, max_files=5, prefix=""):
57
57
  Args:
58
58
  files (list): List of file paths to check for access speed.
59
59
  threshold_ms (float, optional): Threshold in milliseconds for ping time warnings.
60
+ threshold_mb (float, optional): Threshold in megabytes per second for read speed warnings.
60
61
  max_files (int, optional): The maximum number of files to check.
61
62
  prefix (str, optional): Prefix string to add to log messages.
62
63
 
@@ -112,7 +113,7 @@ def check_file_speeds(files, threshold_ms=10, max_files=5, prefix=""):
112
113
  else:
113
114
  speed_msg = ""
114
115
 
115
- if avg_ping < threshold_ms:
116
+ if avg_ping < threshold_ms or avg_speed < threshold_mb:
116
117
  LOGGER.info(f"{prefix}Fast image access ✅ ({ping_msg}{speed_msg}{size_msg})")
117
118
  else:
118
119
  LOGGER.warning(
@@ -351,7 +351,7 @@ class Exporter:
351
351
  if self.args.int8 and not self.args.data:
352
352
  self.args.data = DEFAULT_CFG.data or TASK2DATA[getattr(model, "task", "detect")] # assign default data
353
353
  LOGGER.warning(
354
- "INT8 export requires a missing 'data' arg for calibration. Using default 'data={self.args.data}'."
354
+ f"INT8 export requires a missing 'data' arg for calibration. Using default 'data={self.args.data}'."
355
355
  )
356
356
  if tfjs and (ARM64 and LINUX):
357
357
  raise SystemError("TF.js exports are not currently supported on ARM64 Linux")
@@ -51,6 +51,7 @@ class DetectionPredictor(BasePredictor):
51
51
  >>> results = predictor.predict("path/to/image.jpg")
52
52
  >>> processed_results = predictor.postprocess(preds, img, orig_imgs)
53
53
  """
54
+ save_feats = getattr(self, "save_feats", False)
54
55
  preds = ops.non_max_suppression(
55
56
  preds,
56
57
  self.args.conf,
@@ -61,12 +62,35 @@ class DetectionPredictor(BasePredictor):
61
62
  nc=len(self.model.names),
62
63
  end2end=getattr(self.model, "end2end", False),
63
64
  rotated=self.args.task == "obb",
65
+ return_idxs=save_feats,
64
66
  )
65
67
 
66
68
  if not isinstance(orig_imgs, list): # input images are a torch.Tensor, not a list
67
69
  orig_imgs = ops.convert_torch2numpy_batch(orig_imgs)
68
70
 
69
- return self.construct_results(preds, img, orig_imgs, **kwargs)
71
+ if save_feats:
72
+ obj_feats = self.get_obj_feats(self._feats, preds[1])
73
+ preds = preds[0]
74
+
75
+ results = self.construct_results(preds, img, orig_imgs, **kwargs)
76
+
77
+ if save_feats:
78
+ for r, f in zip(results, obj_feats):
79
+ r.feats = f # add object features to results
80
+
81
+ return results
82
+
83
+ def get_obj_feats(self, feat_maps, idxs):
84
+ """Extract object features from the feature maps."""
85
+ from math import gcd
86
+
87
+ import torch
88
+
89
+ s = gcd(*[x.shape[1] for x in feat_maps]) # find smallest vector length
90
+ obj_feats = torch.cat(
91
+ [x.permute(0, 2, 3, 1).reshape(x.shape[0], -1, s, x.shape[1] // s).mean(dim=-1) for x in feat_maps], dim=1
92
+ ) # mean reduce all vectors to same length
93
+ return [feats[idx] for feats, idx in zip(obj_feats, idxs)] # for each image in batch, indexed separately
70
94
 
71
95
  def construct_results(self, preds, img, orig_imgs):
72
96
  """
@@ -538,7 +538,7 @@ class AutoBackend(nn.Module):
538
538
  metadata = yaml_load(metadata)
539
539
  if metadata and isinstance(metadata, dict):
540
540
  for k, v in metadata.items():
541
- if k in {"stride", "batch"}:
541
+ if k in {"stride", "batch", "channels"}:
542
542
  metadata[k] = int(v)
543
543
  elif k in {"imgsz", "names", "kpt_shape", "args"} and isinstance(v, str):
544
544
  metadata[k] = eval(v)
@@ -3,6 +3,10 @@
3
3
  from collections import deque
4
4
 
5
5
  import numpy as np
6
+ import torch
7
+
8
+ from ultralytics.utils.ops import xywh2xyxy
9
+ from ultralytics.utils.plotting import save_one_box
6
10
 
7
11
  from .basetrack import TrackState
8
12
  from .byte_tracker import BYTETracker, STrack
@@ -186,14 +190,18 @@ class BOTSORT(BYTETracker):
186
190
  >>> bot_sort = BOTSORT(args, frame_rate=30)
187
191
  """
188
192
  super().__init__(args, frame_rate)
193
+ self.gmc = GMC(method=args.gmc_method)
194
+
189
195
  # ReID module
190
196
  self.proximity_thresh = args.proximity_thresh
191
197
  self.appearance_thresh = args.appearance_thresh
192
-
193
- if args.with_reid:
194
- # Haven't supported BoT-SORT(reid) yet
195
- self.encoder = None
196
- self.gmc = GMC(method=args.gmc_method)
198
+ self.encoder = (
199
+ (lambda feats, s: [f.cpu().numpy() for f in feats]) # native features do not require any model
200
+ if self.args.model == "auto"
201
+ else ReID(args.model)
202
+ if args.with_reid
203
+ else None
204
+ )
197
205
 
198
206
  def get_kalmanfilter(self):
199
207
  """Return an instance of KalmanFilterXYWH for predicting and updating object states in the tracking process."""
@@ -204,7 +212,7 @@ class BOTSORT(BYTETracker):
204
212
  if len(dets) == 0:
205
213
  return []
206
214
  if self.args.with_reid and self.encoder is not None:
207
- features_keep = self.encoder.inference(img, dets)
215
+ features_keep = self.encoder(img, dets)
208
216
  return [BOTrack(xyxy, s, c, f) for (xyxy, s, c, f) in zip(dets, scores, cls, features_keep)] # detections
209
217
  else:
210
218
  return [BOTrack(xyxy, s, c) for (xyxy, s, c) in zip(dets, scores, cls)] # detections
@@ -212,14 +220,14 @@ class BOTSORT(BYTETracker):
212
220
  def get_dists(self, tracks, detections):
213
221
  """Calculate distances between tracks and detections using IoU and optionally ReID embeddings."""
214
222
  dists = matching.iou_distance(tracks, detections)
215
- dists_mask = dists > self.proximity_thresh
223
+ dists_mask = dists > (1 - self.proximity_thresh)
216
224
 
217
225
  if self.args.fuse_score:
218
226
  dists = matching.fuse_score(dists, detections)
219
227
 
220
228
  if self.args.with_reid and self.encoder is not None:
221
229
  emb_dists = matching.embedding_distance(tracks, detections) / 2.0
222
- emb_dists[emb_dists > self.appearance_thresh] = 1.0
230
+ emb_dists[emb_dists > (1 - self.appearance_thresh)] = 1.0
223
231
  emb_dists[dists_mask] = 1.0
224
232
  dists = np.minimum(dists, emb_dists)
225
233
  return dists
@@ -232,3 +240,19 @@ class BOTSORT(BYTETracker):
232
240
  """Reset the BOTSORT tracker to its initial state, clearing all tracked objects and internal states."""
233
241
  super().reset()
234
242
  self.gmc.reset_params()
243
+
244
+
245
+ class ReID:
246
+ """YOLO model as encoder for re-identification."""
247
+
248
+ def __init__(self, model):
249
+ """Initialize encoder for re-identification."""
250
+ from ultralytics import YOLO
251
+
252
+ self.model = YOLO(model)
253
+ self.model(embed=[len(self.model.model.model) - 2 if ".pt" in model else -1], verbose=False) # initialize
254
+
255
+ def __call__(self, img, dets):
256
+ """Extract embeddings for detected objects."""
257
+ feats = self.model([save_one_box(det, img, save=False) for det in xywh2xyxy(torch.from_numpy(dets[:, :4]))])
258
+ return [f.cpu().numpy() for f in feats]
@@ -290,7 +290,7 @@ class BYTETracker:
290
290
  self.kalman_filter = self.get_kalmanfilter()
291
291
  self.reset_id()
292
292
 
293
- def update(self, results, img=None):
293
+ def update(self, results, img=None, feats=None):
294
294
  """Updates the tracker with new detections and returns the current list of tracked objects."""
295
295
  self.frame_id += 1
296
296
  activated_stracks = []
@@ -316,7 +316,7 @@ class BYTETracker:
316
316
  cls_keep = cls[remain_inds]
317
317
  cls_second = cls[inds_second]
318
318
 
319
- detections = self.init_track(dets, scores_keep, cls_keep, img)
319
+ detections = self.init_track(dets, scores_keep, cls_keep, img if feats is None else feats)
320
320
  # Add newly detected tracklets to tracked_stracks
321
321
  unconfirmed = []
322
322
  tracked_stracks = [] # type: list[STrack]
@@ -347,7 +347,7 @@ class BYTETracker:
347
347
  track.re_activate(det, self.frame_id, new_id=False)
348
348
  refind_stracks.append(track)
349
349
  # Step 3: Second association, with low score detection boxes association the untrack to the low score detections
350
- detections_second = self.init_track(dets_second, scores_second, cls_second, img)
350
+ detections_second = self.init_track(dets_second, scores_second, cls_second, img if feats is None else feats)
351
351
  r_tracked_stracks = [strack_pool[i] for i in u_track if strack_pool[i].state == TrackState.Tracked]
352
352
  # TODO
353
353
  dists = matching.iou_distance(r_tracked_stracks, detections_second)
@@ -44,6 +44,25 @@ def on_predict_start(predictor: object, persist: bool = False) -> None:
44
44
  if cfg.tracker_type not in {"bytetrack", "botsort"}:
45
45
  raise AssertionError(f"Only 'bytetrack' and 'botsort' are supported for now, but got '{cfg.tracker_type}'")
46
46
 
47
+ if cfg.tracker_type == "botsort" and cfg.with_reid and cfg.model == "auto":
48
+ from ultralytics.nn.modules.head import Detect
49
+
50
+ if not (
51
+ isinstance(predictor.model.model, torch.nn.Module)
52
+ and isinstance(predictor.model.model.model[-1], Detect)
53
+ and not predictor.model.model.model[-1].end2end
54
+ ):
55
+ cfg.model = "yolo11n-cls.pt"
56
+ else:
57
+ predictor.save_feats = True
58
+ predictor._feats = None
59
+
60
+ # Register hook to extract input of Detect layer
61
+ def capture_io(module, input, output):
62
+ predictor._feats = input[0]
63
+
64
+ predictor.model.model.model[-1].register_forward_hook(capture_io)
65
+
47
66
  trackers = []
48
67
  for _ in range(predictor.dataset.bs):
49
68
  tracker = TRACKER_MAP[cfg.tracker_type](args=cfg, frame_rate=30)
@@ -79,7 +98,7 @@ def on_predict_postprocess_end(predictor: object, persist: bool = False) -> None
79
98
  det = (result.obb if is_obb else result.boxes).cpu().numpy()
80
99
  if len(det) == 0:
81
100
  continue
82
- tracks = tracker.update(det, result.orig_img)
101
+ tracks = tracker.update(det, result.orig_img, getattr(result, "feats", None))
83
102
  if len(tracks) == 0:
84
103
  continue
85
104
  idx = tracks[:, -1].astype(int)
@@ -1261,7 +1261,7 @@ class SettingsManager(JSONDict):
1261
1261
  "For help see https://docs.ultralytics.com/quickstart/#ultralytics-settings."
1262
1262
  )
1263
1263
 
1264
- with torch_distributed_zero_first(RANK):
1264
+ with torch_distributed_zero_first(LOCAL_RANK):
1265
1265
  super().__init__(self.file)
1266
1266
 
1267
1267
  if not self.file.exists() or not self: # Check if file doesn't exist or is empty
ultralytics/utils/ops.py CHANGED
@@ -194,6 +194,7 @@ def non_max_suppression(
194
194
  in_place=True,
195
195
  rotated=False,
196
196
  end2end=False,
197
+ return_idxs=False,
197
198
  ):
198
199
  """
199
200
  Perform non-maximum suppression (NMS) on a set of boxes, with support for masks and multiple labels per box.
@@ -221,6 +222,7 @@ def non_max_suppression(
221
222
  in_place (bool): If True, the input prediction tensor will be modified in place.
222
223
  rotated (bool): If Oriented Bounding Boxes (OBB) are being passed for NMS.
223
224
  end2end (bool): If the model doesn't require NMS.
225
+ return_idxs (bool): Return the indices of the detections that were kept.
224
226
 
225
227
  Returns:
226
228
  (List[torch.Tensor]): A list of length batch_size, where each element is a tensor of
@@ -248,6 +250,7 @@ def non_max_suppression(
248
250
  nm = prediction.shape[1] - nc - 4 # number of masks
249
251
  mi = 4 + nc # mask start index
250
252
  xc = prediction[:, 4:mi].amax(1) > conf_thres # candidates
253
+ xinds = torch.stack([torch.arange(len(i), device=prediction.device) for i in xc])[..., None] # to track idxs
251
254
 
252
255
  # Settings
253
256
  # min_wh = 2 # (pixels) minimum box width and height
@@ -263,10 +266,12 @@ def non_max_suppression(
263
266
 
264
267
  t = time.time()
265
268
  output = [torch.zeros((0, 6 + nm), device=prediction.device)] * bs
266
- for xi, x in enumerate(prediction): # image index, image inference
269
+ keepi = [torch.zeros((0, 1), device=prediction.device)] * bs # to store the kept idxs
270
+ for xi, (x, xk) in enumerate(zip(prediction, xinds)): # image index, (preds, preds indices)
267
271
  # Apply constraints
268
272
  # x[((x[:, 2:4] < min_wh) | (x[:, 2:4] > max_wh)).any(1), 4] = 0 # width-height
269
- x = x[xc[xi]] # confidence
273
+ filt = xc[xi] # confidence
274
+ x, xk = x[filt], xk[filt]
270
275
 
271
276
  # Cat apriori labels if autolabelling
272
277
  if labels and len(labels[xi]) and not rotated:
@@ -286,20 +291,25 @@ def non_max_suppression(
286
291
  if multi_label:
287
292
  i, j = torch.where(cls > conf_thres)
288
293
  x = torch.cat((box[i], x[i, 4 + j, None], j[:, None].float(), mask[i]), 1)
294
+ xk = xk[i]
289
295
  else: # best class only
290
296
  conf, j = cls.max(1, keepdim=True)
291
- x = torch.cat((box, conf, j.float(), mask), 1)[conf.view(-1) > conf_thres]
297
+ filt = conf.view(-1) > conf_thres
298
+ x = torch.cat((box, conf, j.float(), mask), 1)[filt]
299
+ xk = xk[filt]
292
300
 
293
301
  # Filter by class
294
302
  if classes is not None:
295
303
  x = x[(x[:, 5:6] == classes).any(1)]
304
+ x, xk = x[filt], xk[filt]
296
305
 
297
306
  # Check shape
298
307
  n = x.shape[0] # number of boxes
299
308
  if not n: # no boxes
300
309
  continue
301
310
  if n > max_nms: # excess boxes
302
- x = x[x[:, 4].argsort(descending=True)[:max_nms]] # sort by confidence and remove excess boxes
311
+ filt = x[:, 4].argsort(descending=True)[:max_nms] # sort by confidence and remove excess boxes
312
+ x, xk = x[filt], xk[filt]
303
313
 
304
314
  # Batched NMS
305
315
  c = x[:, 5:6] * (0 if agnostic else max_wh) # classes
@@ -324,12 +334,12 @@ def non_max_suppression(
324
334
  # if redundant:
325
335
  # i = i[iou.sum(1) > 1] # require redundancy
326
336
 
327
- output[xi] = x[i]
337
+ output[xi], keepi[xi] = x[i], xk[i].reshape(-1)
328
338
  if (time.time() - t) > time_limit:
329
339
  LOGGER.warning(f"NMS time limit {time_limit:.3f}s exceeded")
330
340
  break # time limit exceeded
331
341
 
332
- return output
342
+ return (output, keepi) if return_idxs else output
333
343
 
334
344
 
335
345
  def clip_boxes(boxes, shape):
@@ -31,7 +31,8 @@ def imread(filename: str, flags: int = cv2.IMREAD_COLOR):
31
31
  if filename.endswith((".tiff", ".tif")):
32
32
  success, frames = cv2.imdecodemulti(file_bytes, cv2.IMREAD_UNCHANGED)
33
33
  if success:
34
- return np.stack(frames, axis=2) # or np.asarray(frames).transpose(1,2,0)
34
+ # handle RGB images in tif/tiff format
35
+ return frames[0] if len(frames) == 1 and frames[0].ndim == 3 else np.stack(frames, axis=2)
35
36
  return None
36
37
  else:
37
38
  return cv2.imdecode(file_bytes, flags)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ultralytics
3
- Version: 8.3.113
3
+ Version: 8.3.115
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>
@@ -1,4 +1,4 @@
1
- ultralytics/__init__.py,sha256=VTqTgGNRGJceBOt1vzSsy_E-AT4lpo3E0ME01yvryLU,730
1
+ ultralytics/__init__.py,sha256=5_It_NFtWsEmQfPoBKF_EizYL00IIzHhERi_Y3Hx-hM,730
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=-66Vtli1XqcRUJ9F_gYyEoKTO3gDMmOrDDnUEa5G84s,39646
@@ -25,7 +25,7 @@ ultralytics/cfg/datasets/coco8-seg.yaml,sha256=wpfFI-GfL5asbLtFyaHLE6593jdka7waE
25
25
  ultralytics/cfg/datasets/coco8.yaml,sha256=qJX2TSM7nMV-PpCMXCX4702yp3a-ZF1ubLatlGN5XOE,1901
26
26
  ultralytics/cfg/datasets/crack-seg.yaml,sha256=QEnxOouOKQ3TM6Cl8pBnX5QLPWdChZEBA28jaLkzxA4,852
27
27
  ultralytics/cfg/datasets/dog-pose.yaml,sha256=Cr-J7dPhHmNfW9TKH48L22WPYmJFtWH-lbOAxLHnjKU,907
28
- ultralytics/cfg/datasets/dota8-multispectral.yaml,sha256=62euz96MV3wRos2w6lhhG0DsSpSWte3VxPz-1hLz7YQ,1226
28
+ ultralytics/cfg/datasets/dota8-multispectral.yaml,sha256=F_GBGsFyuJwaWItCOn27CBDgCdsVyI9e0IcXKbZc7t0,1229
29
29
  ultralytics/cfg/datasets/dota8.yaml,sha256=W43bp_6yUUVjs6vpogNrGI9vU7rLbEsSx6vyfIkDyj8,1073
30
30
  ultralytics/cfg/datasets/hand-keypoints.yaml,sha256=5vue4kvPrAdd6ZyB90rZgtGUUHvSi3s_ht7jBBqX7a4,989
31
31
  ultralytics/cfg/datasets/lvis.yaml,sha256=jD-z6cny0l_Cl7xN6RqiFAc7a7odcVwr3E8_jmH-wzA,29716
@@ -91,7 +91,7 @@ ultralytics/cfg/models/v9/yolov9m.yaml,sha256=WcKQ3xRsC1JMgA42Hx4xzr4FZmtE6B3wKv
91
91
  ultralytics/cfg/models/v9/yolov9s.yaml,sha256=j_v3JWaPtiuM8aKJt15Z_4HPRCoHWn_G6Z07t8CZyjk,1391
92
92
  ultralytics/cfg/models/v9/yolov9t.yaml,sha256=Q8GpSXE7fumhuJiQg4a2SkuS_UmnXqp-eoZxW_C0vEo,1375
93
93
  ultralytics/cfg/solutions/default.yaml,sha256=c-9thwI7y7VmIoIM6AW70Z0r825SToH2h7gSCsUoAak,1664
94
- ultralytics/cfg/trackers/botsort.yaml,sha256=D9doE5GQUe6HrAFzr7OfQFIGPFk0M_vJ0B_n7VjxH6Q,1080
94
+ ultralytics/cfg/trackers/botsort.yaml,sha256=8fM3y4TXKKT_5aWsqmQw5JEgwNlBGlRaf8LXpJQSmYs,1216
95
95
  ultralytics/cfg/trackers/bytetrack.yaml,sha256=6u-tiZlk16EqEwkNXaMrza6PAQmWj_ypgv26LGCtPDg,886
96
96
  ultralytics/data/__init__.py,sha256=nAXaL1puCc7z_NjzQNlJnhbVhT9Fla2u7Dsqo7q1dAc,644
97
97
  ultralytics/data/annotator.py,sha256=VEwb11FsEZm75qlEp8XDHFGKW0_rGsEaFDaBVd771Kw,2902
@@ -103,13 +103,13 @@ ultralytics/data/dataset.py,sha256=3hcnCBBb5C_m4l5E1m2uf_2hQFhMv31FmvTfvWed8ek,3
103
103
  ultralytics/data/loaders.py,sha256=kl3gHkcIcNHqLKuQ5fyAlDo9WYBsCPjLcnFbRpk6KVw,28494
104
104
  ultralytics/data/split.py,sha256=6LHB1z8woXurWjXfM-Zm2thRr1KXvzR18CFJA-SDUvE,4677
105
105
  ultralytics/data/split_dota.py,sha256=p8eVGht9tABSVbf9vwvxA_AQYEva3IGHePKlMeNrn64,11872
106
- ultralytics/data/utils.py,sha256=yzYHZor0E1JU5RjC5dKYSqQx1uYHorDtzZK_Qi2dz6E,35124
106
+ ultralytics/data/utils.py,sha256=3hx0YvotLn_Luy6fu7DTLpQJr6ZFhr2PhDbXhCdAO0Q,35268
107
107
  ultralytics/data/scripts/download_weights.sh,sha256=0y8XtZxOru7dVThXDFUXLHBuICgOIqZNUwpyL4Rh6lg,595
108
108
  ultralytics/data/scripts/get_coco.sh,sha256=UuJpJeo3qQpTHVINeOpmP0NYmg8PhEFE3A8J3jKrnPw,1768
109
109
  ultralytics/data/scripts/get_coco128.sh,sha256=qmRQl_hOKrsdHrTrnyQuFIH01oDz3lfaz138OgGfLt8,650
110
110
  ultralytics/data/scripts/get_imagenet.sh,sha256=hr42H16bM47iT27rgS7MpEo-GeOZAYUQXgr0B2cwn48,1705
111
111
  ultralytics/engine/__init__.py,sha256=lm6MckFYCPTbqIoX7w0s_daxdjNeBeKW6DXppv1-QUM,70
112
- ultralytics/engine/exporter.py,sha256=qdJ2uXGASnEvpcddoNstiLBaO4ljUsjqFC6oFQtB8mk,73662
112
+ ultralytics/engine/exporter.py,sha256=KeOF8LH0sgQdPd4jSny5ggATMf1AOebcTGdibLvS0AA,73663
113
113
  ultralytics/engine/model.py,sha256=wS1cwgv0iyhsslMAZYMGlYDWitDIRW96d7MxwW-Sw5o,52817
114
114
  ultralytics/engine/predictor.py,sha256=YJ5l-0qIpr6JAJxowswtZ0IqmXBqVTvAA9vR40v0sCM,21752
115
115
  ultralytics/engine/results.py,sha256=C3j-kyjoMxn7bb8tK_kaYrOWB8-7qDYZ-_hSh1LPWMA,79742
@@ -160,7 +160,7 @@ ultralytics/models/yolo/classify/predict.py,sha256=JV9szginTQ9Lpob0FozhKMiEIu1vV
160
160
  ultralytics/models/yolo/classify/train.py,sha256=rv2CJv9fzvtHf2q4l5g0RsjplWKeLpz637kKqjtrLNY,9737
161
161
  ultralytics/models/yolo/classify/val.py,sha256=xk-YwSQdl_oqyCBV0OOAOcXFL6CchebFOc36AkRSyjE,9992
162
162
  ultralytics/models/yolo/detect/__init__.py,sha256=GIRsLYR-kT4JJx7lh4ZZAFGBZj0aebokuU0A7JbjDVA,257
163
- ultralytics/models/yolo/detect/predict.py,sha256=KZTf2UI7O8ZmPaihqCgsb8IwwchSQTBnO8kAlv8XEMo,4376
163
+ ultralytics/models/yolo/detect/predict.py,sha256=7s9j-JaFNO0ATxlQZCav3PjAGe9qx5jrs2CGJ5_h7aM,5306
164
164
  ultralytics/models/yolo/detect/train.py,sha256=YOEmUZkfJBq6hNbB_P10k-uy4_2fUgdPfVWzO4y8Egs,9538
165
165
  ultralytics/models/yolo/detect/val.py,sha256=_gpsMoMzo_7Rv_vQDyvCeztp6NbuoPNQBNvDWH_R-L4,18434
166
166
  ultralytics/models/yolo/obb/__init__.py,sha256=tQmpG8wVHsajWkZdmD6cjGohJ4ki64iSXQT8JY_dydo,221
@@ -184,7 +184,7 @@ ultralytics/models/yolo/yoloe/train.py,sha256=JF_QxJUU3_w8yhmTfKFTpI7rVRJL1g7z7w
184
184
  ultralytics/models/yolo/yoloe/train_seg.py,sha256=6nN9DbP-AJKlJ3nIlvNn8VXFwFLQEVjSOgdN5aA817M,5309
185
185
  ultralytics/models/yolo/yoloe/val.py,sha256=utdt8wZvvW9OPxO5rx8KsFlkLG0FXj0YMD7Jhyk54D8,8440
186
186
  ultralytics/nn/__init__.py,sha256=rjociYD9lo_K-d-1s6TbdWklPLjTcEHk7OIlRDJstIE,615
187
- ultralytics/nn/autobackend.py,sha256=_Pcqui3HykJx2o5ez1a9goV_jzFg-d1LmGm_P4As0y4,39202
187
+ ultralytics/nn/autobackend.py,sha256=5FAYp7VktiOKxY0ta1BSewaXf_eH-EENvjnvazPotwQ,39214
188
188
  ultralytics/nn/tasks.py,sha256=EwRC70qA3eP8Xp-gGP8OuN-q8LCGDrq1iRue7ncRSV4,62916
189
189
  ultralytics/nn/text_model.py,sha256=H6OiLe0FOyZY4pd7-ixRTxaBgx3lOc2GmGTmrFnoJd0,10136
190
190
  ultralytics/nn/modules/__init__.py,sha256=dXLtIk9rt944WfsTdpgEdWOg3HQEHdwQztuZ6WNJygs,3144
@@ -214,14 +214,14 @@ ultralytics/solutions/trackzone.py,sha256=05XVTQVCGHFAuFNPzyv0VXKQSJKiyWkU6zkXVo
214
214
  ultralytics/solutions/vision_eye.py,sha256=cFjex7mau20Ww4Cuq9lbaAidVTByXk7nhZ0KVHqUzBY,2924
215
215
  ultralytics/trackers/__init__.py,sha256=Zlu_Ig5osn7hqch_g5Be_e4pwZUkeeTQiesJCi0pFGI,255
216
216
  ultralytics/trackers/basetrack.py,sha256=LYvWB5d7Woyrz_RlxaopjV07RQKH3sff_lZJfMcMxcA,4450
217
- ultralytics/trackers/bot_sort.py,sha256=BuySzVBqQS6P4spoAKjE2a64e5CvmymbN7gVLU_4bjs,10425
218
- ultralytics/trackers/byte_tracker.py,sha256=Z1wmrvbA_GcAMW0IitBg_voSe7Pxm-ZzmupvGtTQOPU,20853
219
- ultralytics/trackers/track.py,sha256=URALIdE8H0RBaAx7ClQ7oFEGeboY5cjIs6_yIwge-xU,4062
217
+ ultralytics/trackers/bot_sort.py,sha256=vu3gtJnaVZ3O_Z-YBHypY2IxOZgMf63tucRGPgcf5Es,11296
218
+ ultralytics/trackers/byte_tracker.py,sha256=D7JQ_6V8OUMQryxTrAr010UXMSaboQnI7T1xppzHXYg,20921
219
+ ultralytics/trackers/track.py,sha256=mu6L9RWAW8Nq0vJanX-hTTUST-OmLq49d8VV96-J9u8,4817
220
220
  ultralytics/trackers/utils/__init__.py,sha256=lm6MckFYCPTbqIoX7w0s_daxdjNeBeKW6DXppv1-QUM,70
221
221
  ultralytics/trackers/utils/gmc.py,sha256=dz3I5LbIv7h1__Xg7rGHecQFE32VFTe54tUnxb8F0Z8,14466
222
222
  ultralytics/trackers/utils/kalman_filter.py,sha256=A0CqOnnaKH6kr0XwuHzyHmIU6aJAjJYxF9jVlNBKZHo,21326
223
223
  ultralytics/trackers/utils/matching.py,sha256=7eIufSdeN7cXuFMjvcfvz0Ldq84m4YKZl5IGxBR8IIo,7169
224
- ultralytics/utils/__init__.py,sha256=oH-D2pJrrOzZuYNUrnBlJhwnSz5WUcud8_pAZs1M8KA,50423
224
+ ultralytics/utils/__init__.py,sha256=ZtidK2cfc4G3z9EfG2oDuJRjWaf9rIl2CnWyz5vP2q8,50429
225
225
  ultralytics/utils/autobatch.py,sha256=VZTIKLWeFZFwBHJmbiCn3MaxoFp89hLR0DSCR_iLXJg,4913
226
226
  ultralytics/utils/benchmarks.py,sha256=L7rpcnVAnk2doGNJMhXcDqypPLiz0taZ3bDv850IZkU,30404
227
227
  ultralytics/utils/checks.py,sha256=lE1V-lkvEd8sUYKYfgt3YJoqWd3dJT5-1DeHAQTMm88,32541
@@ -233,8 +233,8 @@ ultralytics/utils/files.py,sha256=0K4O1cgqRiXaDw7EQK13TqA5SME_RrvfDVQSPetNr5w,80
233
233
  ultralytics/utils/instance.py,sha256=UOEsXR9V-bXNRk6BTonASBEgeMqvzzAk4S7VdXZJUAM,18090
234
234
  ultralytics/utils/loss.py,sha256=us3lwmSlIwEzoMztNjpet7Kb1r1-sMGyESykqgYPDVo,36945
235
235
  ultralytics/utils/metrics.py,sha256=uv5O-2Ft8wYfTvDedFxiUqMZ6Nr2CL6I9ybGZiK3e2s,53773
236
- ultralytics/utils/ops.py,sha256=9QCSbEcgJPcBAp3lw4esof93aOHBadS3hN18gaMjC-M,34200
237
- ultralytics/utils/patches.py,sha256=qArRoYscf7jph-OwIYJAAkOB5bAM6pcktgXKc76A8HE,4860
236
+ ultralytics/utils/ops.py,sha256=Fkbd91djIdf8npXRTLzUQMWsNak3aQKANFTTnOxl77Y,34783
237
+ ultralytics/utils/patches.py,sha256=6rVT-l8WDp_Py3O-gZdv9t3PnrYRRkrX_lF3mZ1XS8c,4928
238
238
  ultralytics/utils/plotting.py,sha256=5QPK1y-gm4T1mK3sjfRZhIUJAyP05D1cJ7h9wHPTifU,46616
239
239
  ultralytics/utils/tal.py,sha256=P5nPoR9qNnFuDIda0fsn8WP6m1V8r7EbvXUuhNRFFTA,20805
240
240
  ultralytics/utils/torch_utils.py,sha256=OqH2yNSghs0JSq16Br_PDBnVed5ZRs0C58zDZDk_bqA,38888
@@ -251,9 +251,9 @@ ultralytics/utils/callbacks/neptune.py,sha256=JaI95Cj2kIjUhlEEOiDN0-Drc-fDelLhNI
251
251
  ultralytics/utils/callbacks/raytune.py,sha256=A8amUGpux7dYES-L1iSeMoMXBySGWCD1aUqT7vcG-pU,1284
252
252
  ultralytics/utils/callbacks/tensorboard.py,sha256=jgYnym3cUQFAgN1GzTyO7l3jINtfAh8zhrllDvnLuVQ,5339
253
253
  ultralytics/utils/callbacks/wb.py,sha256=iDRFXI4IIDm8R5OI89DMTmjs8aHLo1HRCLkOFKdaMG4,7507
254
- ultralytics-8.3.113.dist-info/licenses/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
255
- ultralytics-8.3.113.dist-info/METADATA,sha256=GIjS16RqWNypO6Ub9fmk_Z8gzmTAmFubqpOUzi3ae-4,37354
256
- ultralytics-8.3.113.dist-info/WHEEL,sha256=pxyMxgL8-pra_rKaQ4drOZAegBVuX-G_4nRHjjgWbmo,91
257
- ultralytics-8.3.113.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
258
- ultralytics-8.3.113.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
259
- ultralytics-8.3.113.dist-info/RECORD,,
254
+ ultralytics-8.3.115.dist-info/licenses/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
255
+ ultralytics-8.3.115.dist-info/METADATA,sha256=cFP6Jz-a_fClMOLnnR5gYESPzaAkWeSsLZ_c7n536ks,37354
256
+ ultralytics-8.3.115.dist-info/WHEEL,sha256=pxyMxgL8-pra_rKaQ4drOZAegBVuX-G_4nRHjjgWbmo,91
257
+ ultralytics-8.3.115.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
258
+ ultralytics-8.3.115.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
259
+ ultralytics-8.3.115.dist-info/RECORD,,