ultralytics 8.2.8__py3-none-any.whl → 8.2.10__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.8"
3
+ __version__ = "8.2.10"
4
4
 
5
5
  from ultralytics.data.explorer.explorer import Explorer
6
6
  from ultralytics.models import RTDETR, SAM, YOLO, YOLOWorld
@@ -53,6 +53,7 @@ TASK2METRIC = {
53
53
  "pose": "metrics/mAP50-95(P)",
54
54
  "obb": "metrics/mAP50-95(B)",
55
55
  }
56
+ MODELS = {TASK2MODEL[task] for task in TASKS}
56
57
 
57
58
  ARGV = sys.argv or ["", ""] # sometimes sys.argv = []
58
59
  CLI_HELP_MSG = f"""
@@ -10,6 +10,7 @@ import numpy as np
10
10
  import torch
11
11
  from PIL import Image
12
12
 
13
+ from ultralytics.data.utils import polygons2masks, polygons2masks_overlap
13
14
  from ultralytics.utils import LOGGER, colorstr
14
15
  from ultralytics.utils.checks import check_version
15
16
  from ultralytics.utils.instance import Instances
@@ -17,8 +18,6 @@ from ultralytics.utils.metrics import bbox_ioa
17
18
  from ultralytics.utils.ops import segment2box, xyxyxyxy2xywhr
18
19
  from ultralytics.utils.torch_utils import TORCHVISION_0_10, TORCHVISION_0_11, TORCHVISION_0_13
19
20
 
20
- from .utils import polygons2masks, polygons2masks_overlap
21
-
22
21
  DEFAULT_MEAN = (0.0, 0.0, 0.0)
23
22
  DEFAULT_STD = (1.0, 1.0, 1.0)
24
23
  DEFAULT_CROP_FRACTION = 1.0
ultralytics/data/base.py CHANGED
@@ -14,10 +14,9 @@ import numpy as np
14
14
  import psutil
15
15
  from torch.utils.data import Dataset
16
16
 
17
+ from ultralytics.data.utils import FORMATS_HELP_MSG, HELP_URL, IMG_FORMATS
17
18
  from ultralytics.utils import DEFAULT_CFG, LOCAL_RANK, LOGGER, NUM_THREADS, TQDM
18
19
 
19
- from .utils import FORMATS_HELP_MSG, HELP_URL, IMG_FORMATS
20
-
21
20
 
22
21
  class BaseDataset(Dataset):
23
22
  """
ultralytics/data/build.py CHANGED
@@ -9,6 +9,7 @@ import torch
9
9
  from PIL import Image
10
10
  from torch.utils.data import dataloader, distributed
11
11
 
12
+ from ultralytics.data.dataset import GroundingDataset, YOLODataset, YOLOMultiModalDataset
12
13
  from ultralytics.data.loaders import (
13
14
  LOADERS,
14
15
  LoadImagesAndVideos,
@@ -19,13 +20,10 @@ from ultralytics.data.loaders import (
19
20
  SourceTypes,
20
21
  autocast_list,
21
22
  )
22
- from ultralytics.data.utils import IMG_FORMATS, VID_FORMATS
23
+ from ultralytics.data.utils import IMG_FORMATS, PIN_MEMORY, VID_FORMATS
23
24
  from ultralytics.utils import LINUX, NUM_THREADS, RANK, colorstr
24
25
  from ultralytics.utils.checks import check_file
25
26
 
26
- from .dataset import GroundingDataset, YOLODataset, YOLOMultiModalDataset
27
- from .utils import PIN_MEMORY
28
-
29
27
 
30
28
  class InfiniteDataLoader(dataloader.DataLoader):
31
29
  """
@@ -64,9 +64,10 @@ from pathlib import Path
64
64
  import numpy as np
65
65
  import torch
66
66
 
67
- from ultralytics.cfg import get_cfg
67
+ from ultralytics.cfg import TASK2DATA, get_cfg
68
+ from ultralytics.data import build_dataloader
68
69
  from ultralytics.data.dataset import YOLODataset
69
- from ultralytics.data.utils import check_det_dataset
70
+ from ultralytics.data.utils import check_cls_dataset, check_det_dataset
70
71
  from ultralytics.nn.autobackend import check_class_names, default_class_names
71
72
  from ultralytics.nn.modules import C2f, Detect, RTDETRDecoder
72
73
  from ultralytics.nn.tasks import DetectionModel, SegmentationModel, WorldModel
@@ -169,7 +170,7 @@ class Exporter:
169
170
  callbacks.add_integration_callbacks(self)
170
171
 
171
172
  @smart_inference_mode()
172
- def __call__(self, model=None):
173
+ def __call__(self, model=None) -> str:
173
174
  """Returns list of exported files/dirs after running callbacks."""
174
175
  self.run_callbacks("on_export_start")
175
176
  t = time.time()
@@ -211,7 +212,12 @@ class Exporter:
211
212
  "(torchscript, onnx, openvino, engine, coreml) formats. "
212
213
  "See https://docs.ultralytics.com/models/yolo-world for details."
213
214
  )
214
-
215
+ if self.args.int8 and not self.args.data:
216
+ self.args.data = DEFAULT_CFG.data or TASK2DATA[getattr(model, "task", "detect")] # assign default data
217
+ LOGGER.warning(
218
+ "WARNING ⚠️ INT8 export requires a missing 'data' arg for calibration. "
219
+ f"Using default 'data={self.args.data}'."
220
+ )
215
221
  # Input
216
222
  im = torch.zeros(self.args.batch, 3, *self.imgsz).to(self.device)
217
223
  file = Path(
@@ -333,6 +339,23 @@ class Exporter:
333
339
  self.run_callbacks("on_export_end")
334
340
  return f # return list of exported files/dirs
335
341
 
342
+ def get_int8_calibration_dataloader(self, prefix=""):
343
+ """Build and return a dataloader suitable for calibration of INT8 models."""
344
+ LOGGER.info(f"{prefix} collecting INT8 calibration images from 'data={self.args.data}'")
345
+ data = (check_cls_dataset if self.model.task == "classify" else check_det_dataset)(self.args.data)
346
+ dataset = YOLODataset(
347
+ data[self.args.split or "val"],
348
+ data=data,
349
+ task=self.model.task,
350
+ imgsz=self.imgsz[0],
351
+ augment=False,
352
+ batch_size=self.args.batch,
353
+ )
354
+ n = len(dataset)
355
+ if n < 300:
356
+ LOGGER.warning(f"{prefix} WARNING ⚠️ >300 images recommended for INT8 calibration, found {n} images.")
357
+ return build_dataloader(dataset, batch=self.args.batch, workers=0) # required for batch loading
358
+
336
359
  @try_export
337
360
  def export_torchscript(self, prefix=colorstr("TorchScript:")):
338
361
  """YOLOv8 TorchScript model export."""
@@ -442,37 +465,21 @@ class Exporter:
442
465
  if self.args.int8:
443
466
  fq = str(self.file).replace(self.file.suffix, f"_int8_openvino_model{os.sep}")
444
467
  fq_ov = str(Path(fq) / self.file.with_suffix(".xml").name)
445
- if not self.args.data:
446
- self.args.data = DEFAULT_CFG.data or "coco128.yaml"
447
- LOGGER.warning(
448
- f"{prefix} WARNING ⚠️ INT8 export requires a missing 'data' arg for calibration. "
449
- f"Using default 'data={self.args.data}'."
450
- )
451
468
  check_requirements("nncf>=2.8.0")
452
469
  import nncf
453
470
 
454
- def transform_fn(data_item):
471
+ def transform_fn(data_item) -> np.ndarray:
455
472
  """Quantization transform function."""
456
- assert (
457
- data_item["img"].dtype == torch.uint8
458
- ), "Input image must be uint8 for the quantization preprocessing"
459
- im = data_item["img"].numpy().astype(np.float32) / 255.0 # uint8 to fp16/32 and 0 - 255 to 0.0 - 1.0
473
+ data_item: torch.Tensor = data_item["img"] if isinstance(data_item, dict) else data_item
474
+ assert data_item.dtype == torch.uint8, "Input image must be uint8 for the quantization preprocessing"
475
+ im = data_item.numpy().astype(np.float32) / 255.0 # uint8 to fp16/32 and 0 - 255 to 0.0 - 1.0
460
476
  return np.expand_dims(im, 0) if im.ndim == 3 else im
461
477
 
462
478
  # Generate calibration data for integer quantization
463
- LOGGER.info(f"{prefix} collecting INT8 calibration images from 'data={self.args.data}'")
464
- data = check_det_dataset(self.args.data)
465
- dataset = YOLODataset(data["val"], data=data, task=self.model.task, imgsz=self.imgsz[0], augment=False)
466
- n = len(dataset)
467
- if n < 300:
468
- LOGGER.warning(f"{prefix} WARNING ⚠️ >300 images recommended for INT8 calibration, found {n} images.")
469
- quantization_dataset = nncf.Dataset(dataset, transform_fn)
470
-
471
479
  ignored_scope = None
472
480
  if isinstance(self.model.model[-1], Detect):
473
481
  # Includes all Detect subclasses like Segment, Pose, OBB, WorldDetect
474
482
  head_module_name = ".".join(list(self.model.named_modules())[-1][0].split(".")[:2])
475
-
476
483
  ignored_scope = nncf.IgnoredScope( # ignore operations
477
484
  patterns=[
478
485
  f".*{head_module_name}/.*/Add",
@@ -485,7 +492,10 @@ class Exporter:
485
492
  )
486
493
 
487
494
  quantized_ov_model = nncf.quantize(
488
- ov_model, quantization_dataset, preset=nncf.QuantizationPreset.MIXED, ignored_scope=ignored_scope
495
+ model=ov_model,
496
+ calibration_dataset=nncf.Dataset(self.get_int8_calibration_dataloader(prefix), transform_fn),
497
+ preset=nncf.QuantizationPreset.MIXED,
498
+ ignored_scope=ignored_scope,
489
499
  )
490
500
  serialize(quantized_ov_model, fq_ov)
491
501
  return fq, None
@@ -589,6 +599,7 @@ class Exporter:
589
599
 
590
600
  LOGGER.info(f"\n{prefix} starting export with coremltools {ct.__version__}...")
591
601
  assert not WINDOWS, "CoreML export is not supported on Windows, please run on macOS or Linux."
602
+ assert self.args.batch == 1, "CoreML batch sizes > 1 are not supported. Please retry at 'batch=1'."
592
603
  f = self.file.with_suffix(".mlmodel" if mlmodel else ".mlpackage")
593
604
  if f.is_dir():
594
605
  shutil.rmtree(f)
@@ -787,11 +798,9 @@ class Exporter:
787
798
  verbosity = "info"
788
799
  if self.args.data:
789
800
  # Generate calibration data for integer quantization
790
- LOGGER.info(f"{prefix} collecting INT8 calibration images from 'data={self.args.data}'")
791
- data = check_det_dataset(self.args.data)
792
- dataset = YOLODataset(data["val"], data=data, imgsz=self.imgsz[0], augment=False)
801
+ dataloader = self.get_int8_calibration_dataloader(prefix)
793
802
  images = []
794
- for i, batch in enumerate(dataset):
803
+ for i, batch in enumerate(dataloader):
795
804
  if i >= 100: # maximum number of calibration images
796
805
  break
797
806
  im = batch["img"].permute(1, 2, 0)[None] # list to nparray, CHW to BHWC
@@ -572,7 +572,7 @@ class Model(nn.Module):
572
572
  def export(
573
573
  self,
574
574
  **kwargs,
575
- ):
575
+ ) -> str:
576
576
  """
577
577
  Exports the model to a different format suitable for deployment.
578
578
 
@@ -588,7 +588,7 @@ class Model(nn.Module):
588
588
  model's overrides and method defaults.
589
589
 
590
590
  Returns:
591
- (object): The exported model in the specified format, or an object related to the export process.
591
+ (str): The exported model filename in the specified format, or an object related to the export process.
592
592
 
593
593
  Raises:
594
594
  AssertionError: If the model is not a PyTorch model.
@@ -387,26 +387,32 @@ class Results(SimpleClass):
387
387
 
388
388
  def summary(self, normalize=False, decimals=5):
389
389
  """Convert the results to a summarized format."""
390
- if self.probs is not None:
391
- LOGGER.warning("Warning: Classify results do not support the `summary()` method yet.")
392
- return
393
-
394
390
  # Create list of detection dictionaries
395
391
  results = []
396
- data = self.boxes.data.cpu().tolist()
392
+ if self.probs is not None:
393
+ class_id = self.probs.top1
394
+ results.append(
395
+ {
396
+ "name": self.names[class_id],
397
+ "class": class_id,
398
+ "confidence": round(self.probs.top1conf.item(), decimals),
399
+ }
400
+ )
401
+ return results
402
+
403
+ data = self.boxes or self.obb
404
+ is_obb = self.obb is not None
397
405
  h, w = self.orig_shape if normalize else (1, 1)
398
406
  for i, row in enumerate(data): # xyxy, track_id if tracking, conf, class_id
399
- box = {
400
- "x1": round(row[0] / w, decimals),
401
- "y1": round(row[1] / h, decimals),
402
- "x2": round(row[2] / w, decimals),
403
- "y2": round(row[3] / h, decimals),
404
- }
405
- conf = round(row[-2], decimals)
406
- class_id = int(row[-1])
407
- result = {"name": self.names[class_id], "class": class_id, "confidence": conf, "box": box}
408
- if self.boxes.is_track:
409
- result["track_id"] = int(row[-3]) # track ID
407
+ class_id, conf = int(row.cls), round(row.conf.item(), decimals)
408
+ box = (row.xyxyxyxy if is_obb else row.xyxy).squeeze().reshape(-1, 2).tolist()
409
+ xy = {}
410
+ for i, b in enumerate(box):
411
+ xy[f"x{i + 1}"] = round(b[0] / w, decimals)
412
+ xy[f"y{i + 1}"] = round(b[1] / h, decimals)
413
+ result = {"name": self.names[class_id], "class": class_id, "confidence": conf, "box": xy}
414
+ if data.is_track:
415
+ result["track_id"] = int(row.id.item()) # track ID
410
416
  if self.masks:
411
417
  result["segments"] = {
412
418
  "x": (self.masks.xy[i][:, 0] / w).round(decimals).tolist(),
@@ -17,7 +17,20 @@ class ParkingPtsSelection:
17
17
  """Initializes the UI for selecting parking zone points in a tkinter window."""
18
18
  self.master = master
19
19
  master.title("Ultralytics Parking Zones Points Selector")
20
- self.initialize_ui()
20
+
21
+ # Resizable false
22
+ master.resizable(False, False)
23
+
24
+ # Setup canvas for image display
25
+ self.canvas = tk.Canvas(master, bg="white")
26
+
27
+ # Setup buttons
28
+ button_frame = tk.Frame(master)
29
+ button_frame.pack(side=tk.TOP)
30
+
31
+ tk.Button(button_frame, text="Upload Image", command=self.upload_image).grid(row=0, column=0)
32
+ tk.Button(button_frame, text="Remove Last BBox", command=self.remove_last_bounding_box).grid(row=0, column=1)
33
+ tk.Button(button_frame, text="Save", command=self.save_to_json).grid(row=0, column=2)
21
34
 
22
35
  # Initialize properties
23
36
  self.image_path = None
@@ -33,21 +46,6 @@ class ParkingPtsSelection:
33
46
  self.canvas_max_width = 1280
34
47
  self.canvas_max_height = 720
35
48
 
36
- def initialize_ui(self):
37
- """Setup UI components."""
38
- # Setup buttons
39
- button_frame = tk.Frame(self.master)
40
- button_frame.pack(side=tk.TOP)
41
-
42
- tk.Button(button_frame, text="Upload Image", command=self.upload_image).grid(row=0, column=0)
43
- tk.Button(button_frame, text="Remove Last BBox", command=self.remove_last_bounding_box).grid(row=0, column=1)
44
- tk.Button(button_frame, text="Save", command=self.save_to_json).grid(row=0, column=2)
45
-
46
- # Setup canvas for image display
47
- self.canvas = tk.Canvas(self.master, bg="white")
48
- self.canvas.pack(side=tk.BOTTOM)
49
- self.canvas.bind("<Button-1>", self.on_canvas_click)
50
-
51
49
  def upload_image(self):
52
50
  """Upload an image and resize it to fit canvas."""
53
51
  self.image_path = filedialog.askopenfilename(filetypes=[("Image Files", "*.png;*.jpg;*.jpeg")])
@@ -68,11 +66,18 @@ class ParkingPtsSelection:
68
66
  canvas_height = min(self.canvas_max_height, self.img_height)
69
67
  canvas_width = int(canvas_height * aspect_ratio)
70
68
 
71
- self.canvas.config(width=canvas_width, height=canvas_height)
69
+ # Check if canvas is already initialized
70
+ if self.canvas:
71
+ self.canvas.destroy() # Destroy previous canvas
72
+
73
+ self.canvas = tk.Canvas(self.master, bg="white", width=canvas_width, height=canvas_height)
72
74
  resized_image = self.image.resize((canvas_width, canvas_height), Image.LANCZOS)
73
75
  self.canvas_image = ImageTk.PhotoImage(resized_image)
74
76
  self.canvas.create_image(0, 0, anchor=tk.NW, image=self.canvas_image)
75
77
 
78
+ self.canvas.pack(side=tk.BOTTOM)
79
+ self.canvas.bind("<Button-1>", self.on_canvas_click)
80
+
76
81
  # Reset bounding boxes and current box
77
82
  self.bounding_boxes = []
78
83
  self.current_box = []
@@ -80,6 +85,9 @@ class ParkingPtsSelection:
80
85
  def on_canvas_click(self, event):
81
86
  """Handle mouse clicks on canvas to create points for bounding boxes."""
82
87
  self.current_box.append((event.x, event.y))
88
+ x0, y0 = event.x - 3, event.y - 3
89
+ x1, y1 = event.x + 3, event.y + 3
90
+ self.canvas.create_oval(x0, y0, x1, y1, fill="red")
83
91
 
84
92
  if len(self.current_box) == 4:
85
93
  self.bounding_boxes.append(self.current_box)
@@ -87,7 +95,13 @@ class ParkingPtsSelection:
87
95
  self.current_box = []
88
96
 
89
97
  def draw_bounding_box(self, box):
90
- """Draw bounding box on canvas."""
98
+ """
99
+ Draw bounding box on canvas.
100
+
101
+ Args:
102
+ box (list): Bounding box data
103
+ """
104
+
91
105
  for i in range(4):
92
106
  x1, y1 = box[i]
93
107
  x2, y2 = box[(i + 1) % 4]
@@ -115,7 +129,6 @@ class ParkingPtsSelection:
115
129
  height_scaling_factor = self.img_height / canvas_height
116
130
  bounding_boxes_data = []
117
131
  for box in self.bounding_boxes:
118
- print("Bounding Box ", bounding_boxes_data)
119
132
  rescaled_box = []
120
133
  for x, y in box:
121
134
  rescaled_x = int(x * width_scaling_factor)
@@ -163,7 +176,8 @@ class ParkingManagement:
163
176
  self.model = YOLO(self.model_path)
164
177
  return self.model
165
178
 
166
- def parking_regions_extraction(self, json_file):
179
+ @staticmethod
180
+ def parking_regions_extraction(json_file):
167
181
  """
168
182
  Extract parking regions from json file.
169
183
 
@@ -172,8 +186,7 @@ class ParkingManagement:
172
186
  """
173
187
 
174
188
  with open(json_file, "r") as json_file:
175
- json_data = json.load(json_file)
176
- return json_data
189
+ return json.load(json_file)
177
190
 
178
191
  def process_data(self, json_data, im0, boxes, clss):
179
192
  """
@@ -132,16 +132,17 @@ def benchmark(
132
132
  data=data, batch=1, imgsz=imgsz, plots=False, device=device, half=half, int8=int8, verbose=False
133
133
  )
134
134
  metric, speed = results.results_dict[key], results.speed["inference"]
135
- y.append([name, "✅", round(file_size(filename), 1), round(metric, 4), round(speed, 2)])
135
+ fps = round((1000 / speed), 2) # frames per second
136
+ y.append([name, "✅", round(file_size(filename), 1), round(metric, 4), round(speed, 2), fps])
136
137
  except Exception as e:
137
138
  if verbose:
138
139
  assert type(e) is AssertionError, f"Benchmark failure for {name}: {e}"
139
140
  LOGGER.warning(f"ERROR ❌️ Benchmark failure for {name}: {e}")
140
- y.append([name, emoji, round(file_size(filename), 1), None, None]) # mAP, t_inference
141
+ y.append([name, emoji, round(file_size(filename), 1), None, None, None]) # mAP, t_inference
141
142
 
142
143
  # Print results
143
144
  check_yolo(device=device) # print system info
144
- df = pd.DataFrame(y, columns=["Format", "Status❔", "Size (MB)", key, "Inference time (ms/im)"])
145
+ df = pd.DataFrame(y, columns=["Format", "Status❔", "Size (MB)", key, "Inference time (ms/im)", "FPS"])
145
146
 
146
147
  name = Path(model.ckpt_path).name
147
148
  s = f"\nBenchmarks complete for {name} on {data} at imgsz={imgsz} ({time.time() - t0:.2f}s)\n{df}\n"
@@ -57,7 +57,7 @@ def run_ray_tune(
57
57
  except (ImportError, AssertionError):
58
58
  wandb = False
59
59
 
60
- checks.check_version(ray.__version__, "<=2.9.3", "ray")
60
+ checks.check_version(ray.__version__, ">=2.0.0", "ray")
61
61
  default_space = {
62
62
  # 'optimizer': tune.choice(['SGD', 'Adam', 'AdamW', 'NAdam', 'RAdam', 'RMSProp']),
63
63
  "lr0": tune.uniform(1e-5, 1e-1),
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ultralytics
3
- Version: 8.2.8
3
+ Version: 8.2.10
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
@@ -73,7 +73,7 @@ Requires-Dist: tensorflowjs >=3.9.0 ; (python_version <= "3.11") and extra == 'e
73
73
  Provides-Extra: extra
74
74
  Requires-Dist: hub-sdk >=0.0.5 ; extra == 'extra'
75
75
  Requires-Dist: ipython ; extra == 'extra'
76
- Requires-Dist: albumentations <=1.4.4,>=1.0.3 ; extra == 'extra'
76
+ Requires-Dist: albumentations >=1.4.6 ; extra == 'extra'
77
77
  Requires-Dist: pycocotools >=2.0.7 ; extra == 'extra'
78
78
  Provides-Extra: logging
79
79
  Requires-Dist: comet ; extra == 'logging'
@@ -1,7 +1,7 @@
1
- ultralytics/__init__.py,sha256=n816rXwWPnPOPJ_vyk16ge6P1BJOJg1x8rBo30fvZ6U,632
1
+ ultralytics/__init__.py,sha256=JRHBL4PFEZmSrqSDusfaD0hEQrOr33jrN49kmwDERZE,633
2
2
  ultralytics/assets/bus.jpg,sha256=wCAZxJecGR63Od3ZRERe9Aja1Weayrb9Ug751DS_vGM,137419
3
3
  ultralytics/assets/zidane.jpg,sha256=Ftc4aeMmen1O0A3o6GCDO9FlfBslLpTAw0gnetx7bts,50427
4
- ultralytics/cfg/__init__.py,sha256=4ZnvY2ULMGofFhjaRIzKQlGC5YVkvWkEAYAhnsKC1Po,21312
4
+ ultralytics/cfg/__init__.py,sha256=lR6jykSO_0cigsjrqSyFj_8JG_LvYi796viasyWhcfs,21358
5
5
  ultralytics/cfg/default.yaml,sha256=KoXq5DHQK-Voge9DbkySd2rRpDizG6Oq-A4Byqz5Exc,8211
6
6
  ultralytics/cfg/datasets/Argoverse.yaml,sha256=FyeuJT5CHq_9d4hlfAf0kpZlnbUMO0S--UJ1yIqcdKk,3134
7
7
  ultralytics/cfg/datasets/DOTAv1.5.yaml,sha256=YDsyFPI6F6-OQXLBM3hOXo3vADYREwZzmMQfJNdpWyM,1193
@@ -64,9 +64,9 @@ ultralytics/cfg/trackers/botsort.yaml,sha256=YrPmj18p1UU40kJH5NRdL_4S8f7knggkk_q
64
64
  ultralytics/cfg/trackers/bytetrack.yaml,sha256=QvHmtuwulK4X6j3T5VEqtCm0sbWWBUVmWPcCcM20qe0,688
65
65
  ultralytics/data/__init__.py,sha256=VGe-ATG7j35F4A4r8Jmzffjlhve4JAJPgRa5ahKTU18,616
66
66
  ultralytics/data/annotator.py,sha256=evXQzARVerc0hb9ol-n_GrrHf-dlXO4lCMMWEZoJ2UM,2117
67
- ultralytics/data/augment.py,sha256=tPnqJAP85-Ei9BnyJhd4liLjRn_8s-289mNc8adXpdk,57650
68
- ultralytics/data/base.py,sha256=9dZcoXtczloWSsbU-sOa9NlJ7lIGoarEUAp2rzP1jMI,13481
69
- ultralytics/data/build.py,sha256=i_akfoF5ZrDCzXNpBeZDPvkLo61LN-GiYWjM7C5dKYA,7486
67
+ ultralytics/data/augment.py,sha256=OyGg5Ltmhi6sH8ImEiolr6KaiJPPB7bPqqcd3OHo_fQ,57665
68
+ ultralytics/data/base.py,sha256=rgF28Zn7Xw2jJIai5t8sDdmRNmv0DYhcTz9kevsXFIA,13496
69
+ ultralytics/data/build.py,sha256=JqMjNXEzCHKRgsKwaaTrALs3KnoajoaapCJcPP1UxUI,7483
70
70
  ultralytics/data/converter.py,sha256=NLDiV67RshbKQnMJUiQQF11boVzEqgi2Hz39nKVAI4U,17528
71
71
  ultralytics/data/dataset.py,sha256=NFaXyHRn64TyTEbtSkr7SkqWXK8bEJl6lZ6M1JwO3MY,22201
72
72
  ultralytics/data/loaders.py,sha256=UxNLLV6rwUDog9MSOkHpDn52TO-X2g2P4a5ZwvB7Ii8,23142
@@ -78,10 +78,10 @@ ultralytics/data/explorer/utils.py,sha256=EvvukQiQUTBrsZznmMnyEX2EqTuwZo_Geyc8yf
78
78
  ultralytics/data/explorer/gui/__init__.py,sha256=mHtJuK4hwF8cuV-VHDc7tp6u6D1gHz2Z7JI8grmQDTs,42
79
79
  ultralytics/data/explorer/gui/dash.py,sha256=2oAbNroR2lfS45v53M1sRqZklLXbbj6qXqNxvplulC0,10087
80
80
  ultralytics/engine/__init__.py,sha256=mHtJuK4hwF8cuV-VHDc7tp6u6D1gHz2Z7JI8grmQDTs,42
81
- ultralytics/engine/exporter.py,sha256=5dgkElp8YfZXWp6yOXPLVVD650atg59UbWoFtpKgtPo,54606
82
- ultralytics/engine/model.py,sha256=4zSVSBP8Ex49bJjnOXm7g3Qr_NgbplHPCjdnVfZwfxM,40019
81
+ ultralytics/engine/exporter.py,sha256=JmROwWm1q_GOC9TGXXKOI67PQYdi4gemen6D72k2bQw,55182
82
+ ultralytics/engine/model.py,sha256=EkLTBSm3RT0mWPsZQpVRShihEvI5vx5X_VnkBHc1fxk,40032
83
83
  ultralytics/engine/predictor.py,sha256=wQRKdWGDTP5A6CS0gTC6U3RPDMhP3QkEzWSPm6eqCkU,17022
84
- ultralytics/engine/results.py,sha256=MvrOBrBlRF7kbL-QwysMf9mIDy_lwQBTTYvy1x1FMME,30667
84
+ ultralytics/engine/results.py,sha256=r5dxL5of8TAf7GQECPehbvfz3KiYi4gUQHRqgPLBe3w,30919
85
85
  ultralytics/engine/trainer.py,sha256=GpseAovVKLRgAoqG4bEVtQqemWdDcxrY7gE3vGRU9gs,35048
86
86
  ultralytics/engine/tuner.py,sha256=iZrgMmXSDpfuDu4bdFRflmAsscys2-8W8qAGxSyOVJE,11844
87
87
  ultralytics/engine/validator.py,sha256=Y21Uo8_Zto4qjk_YqQk6k7tyfpq_Qk9cfjeXeyDRxs8,14643
@@ -158,7 +158,7 @@ ultralytics/solutions/ai_gym.py,sha256=IZHpvmNyEQT_aqMTrA5sIjCsl3_5Zl2WG31HxGT6K
158
158
  ultralytics/solutions/distance_calculation.py,sha256=N1QB5uDG_6sp8jD5uSwp_NTPmyP4UCqJm9G2lNrgpr8,6334
159
159
  ultralytics/solutions/heatmap.py,sha256=LDY8cpmsenkaWgDmaKuOPMyQcPCH4jQeMvgbZlTx2fc,11970
160
160
  ultralytics/solutions/object_counter.py,sha256=nYwUN_9M5azW9zET_hnV7wIY8gDNR4LtUoWo4C2cbXw,11287
161
- ultralytics/solutions/parking_management.py,sha256=x7td7B_K600PZASikbRxwvPiv-xbm1quLpJE82Q3DmQ,8809
161
+ ultralytics/solutions/parking_management.py,sha256=-AxUfpBoCCMAaYzeYRohCdBvG0Y7bG37Rvz04sO-6NE,9080
162
162
  ultralytics/solutions/queue_management.py,sha256=TBQ2dIKYtymBjhdw0Enxa22KHyH3IdXf2C-1Se21siA,6684
163
163
  ultralytics/solutions/speed_estimation.py,sha256=lvaU-F8f3V4KFVKFaNS7isIdYtMSFjh_zF9gl0Mals8,6714
164
164
  ultralytics/trackers/__init__.py,sha256=j72IgH2dZHQArMPK4YwcV5ieIw94fYvlGdQjB9cOQKw,227
@@ -172,7 +172,7 @@ ultralytics/trackers/utils/kalman_filter.py,sha256=0oqhk59NKEiwcJ2FXnw6_sT4bIFC6
172
172
  ultralytics/trackers/utils/matching.py,sha256=UxhSGa5pN6WoYwYSBAkkt-O7xMxUR47VuUB6PfVNkb4,5404
173
173
  ultralytics/utils/__init__.py,sha256=zyk1cbMtgG8LB9s1FRKRaN2ffMlkKQcVWnhGj1EPP5Y,39284
174
174
  ultralytics/utils/autobatch.py,sha256=ygZ3f2ByIkcujB89ENcTnGWWnAQw5Pbg6nBuShg-5t4,3863
175
- ultralytics/utils/benchmarks.py,sha256=l9SHatEr4itinf9R77bunBpNqrTI2S_qaPB3K2oAYRg,23470
175
+ ultralytics/utils/benchmarks.py,sha256=PlnUqhl2Om7jp7bKICDj9a2ABpJSl31VFI3ESnGdme8,23552
176
176
  ultralytics/utils/checks.py,sha256=kwHcB_o8-bieQV2NNNZe2d37QSXyBdIN6XaMlARTUEE,28077
177
177
  ultralytics/utils/dist.py,sha256=3HeNbY2gp7vYhcvVhsrvTrQXpQmgT8tpmnzApf3eQRA,2267
178
178
  ultralytics/utils/downloads.py,sha256=Rx32imHkKyVltEDMiCtCT2N5aA9Cud_0PyIUoTh4ru0,21496
@@ -187,7 +187,7 @@ ultralytics/utils/plotting.py,sha256=8Bts0M758PxAdOywsn8xv4ULBG7DuCGMhYWBVH5BrOM
187
187
  ultralytics/utils/tal.py,sha256=xuIyryUjaaYHkHPG9GvBwh1xxN2Hq4y3hXOtuERehwY,16017
188
188
  ultralytics/utils/torch_utils.py,sha256=y1qJniyii0sJFg8dpP-yjYh8AMOoFok9NEZcRi669Jo,25916
189
189
  ultralytics/utils/triton.py,sha256=gg1finxno_tY2Ge9PMhmu7PI9wvoFZoiicdT4Bhqv3w,3936
190
- ultralytics/utils/tuner.py,sha256=JhvBp6haKA6eqpNPpGJzzjjCmPxBx5phk9kHmt_jppw,6171
190
+ ultralytics/utils/tuner.py,sha256=49KAadKZsUeCpwIm5Sn0grb0RPcMNI8vHGLwroDEJNI,6171
191
191
  ultralytics/utils/callbacks/__init__.py,sha256=YrWqC3BVVaTLob4iCPR6I36mUxIUOpPJW7B_LjT78Qw,214
192
192
  ultralytics/utils/callbacks/base.py,sha256=A8H6jXnPQJfOxA1ByTBWF2ePDs5ldccUabXG0u5BfRI,5776
193
193
  ultralytics/utils/callbacks/clearml.py,sha256=M9Fi1OfdWqcm8uVkauuX3zJIYhNh6Tp7Jo4CfA0u0nw,5923
@@ -199,9 +199,9 @@ ultralytics/utils/callbacks/neptune.py,sha256=5Z3ua5YBTUS56FH8VQKQG1aaIo9fH8GEyz
199
199
  ultralytics/utils/callbacks/raytune.py,sha256=ODVYzy-CoM4Uge0zjkh3Hnh9nF2M0vhDrSenXnvcizw,705
200
200
  ultralytics/utils/callbacks/tensorboard.py,sha256=Z1veCVcn9THPhdplWuIzwlsW2yF7y-On9IZIk3khM0Y,4135
201
201
  ultralytics/utils/callbacks/wb.py,sha256=woCQVuZzqtM5KnwxIibcfM3sFBYojeMPnv11jrRaIQA,6674
202
- ultralytics-8.2.8.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
203
- ultralytics-8.2.8.dist-info/METADATA,sha256=0_6ZyqamPH8rNnzU4V6g9fCmvyreK9r_QX8OuLfXlTw,40701
204
- ultralytics-8.2.8.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
205
- ultralytics-8.2.8.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
206
- ultralytics-8.2.8.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
207
- ultralytics-8.2.8.dist-info/RECORD,,
202
+ ultralytics-8.2.10.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
203
+ ultralytics-8.2.10.dist-info/METADATA,sha256=9VTYzdpmTqWjX2MFmT2DqzaFGqX1VQiTc1VlzP88O8A,40694
204
+ ultralytics-8.2.10.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
205
+ ultralytics-8.2.10.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
206
+ ultralytics-8.2.10.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
207
+ ultralytics-8.2.10.dist-info/RECORD,,