ultralytics 8.2.7__py3-none-any.whl → 8.2.9__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.7"
3
+ __version__ = "8.2.9"
4
4
 
5
5
  from ultralytics.data.explorer.explorer import Explorer
6
6
  from ultralytics.models import RTDETR, SAM, YOLO, YOLOWorld
@@ -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
@@ -917,7 +916,6 @@ class Albumentations:
917
916
  return labels
918
917
 
919
918
 
920
- # TODO: technically this is not an augmentation, maybe we should put this to another files
921
919
  class Format:
922
920
  """
923
921
  Formats image annotations for object detection, instance segmentation, and pose estimation tasks. The class
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.utils import NUM_THREADS, RANK, colorstr
23
+ from ultralytics.data.utils import IMG_FORMATS, PIN_MEMORY, VID_FORMATS
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
  """
@@ -81,7 +79,8 @@ def seed_worker(worker_id): # noqa
81
79
  worker_seed = torch.initial_seed() % 2**32
82
80
  np.random.seed(worker_seed)
83
81
  random.seed(worker_seed)
84
- os.sched_setaffinity(0, range(NUM_THREADS)) # fix https://github.com/ultralytics/ultralytics/pull/11195
82
+ if LINUX and hasattr(os, "sched_setaffinity"): # unsupported on macOS and Windows
83
+ os.sched_setaffinity(0, range(NUM_THREADS)) # fix https://github.com/ultralytics/ultralytics/pull/11195
85
84
 
86
85
 
87
86
  def build_yolo_dataset(cfg, img_path, batch, data, mode="train", rect=False, stride=32, multi_modal=False):
@@ -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
@@ -787,11 +797,9 @@ class Exporter:
787
797
  verbosity = "info"
788
798
  if self.args.data:
789
799
  # 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)
800
+ dataloader = self.get_int8_calibration_dataloader(prefix)
793
801
  images = []
794
- for i, batch in enumerate(dataset):
802
+ for i, batch in enumerate(dataloader):
795
803
  if i >= 100: # maximum number of calibration images
796
804
  break
797
805
  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.
@@ -329,6 +329,7 @@ class BaseTrainer:
329
329
  base_idx = (self.epochs - self.args.close_mosaic) * nb
330
330
  self.plot_idx.extend([base_idx, base_idx + 1, base_idx + 2])
331
331
  epoch = self.start_epoch
332
+ self.optimizer.zero_grad() # zero any resumed gradients to ensure stability on train start
332
333
  while True:
333
334
  self.epoch = epoch
334
335
  self.run_callbacks("on_train_epoch_start")
@@ -349,7 +350,6 @@ class BaseTrainer:
349
350
  LOGGER.info(self.progress_string())
350
351
  pbar = TQDM(enumerate(self.train_loader), total=nb)
351
352
  self.tloss = None
352
- self.optimizer.zero_grad()
353
353
  for i, batch in pbar:
354
354
  self.run_callbacks("on_train_batch_start")
355
355
  # Warmup
@@ -14,10 +14,23 @@ import tkinter as tk
14
14
 
15
15
  class ParkingPtsSelection:
16
16
  def __init__(self, master):
17
- # Initialize window and widgets.
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]
@@ -109,12 +123,12 @@ class ParkingPtsSelection:
109
123
  messagebox.showwarning("Warning", "No bounding boxes to remove.")
110
124
 
111
125
  def save_to_json(self):
126
+ """Saves rescaled bounding boxes to 'bounding_boxes.json' based on image-to-canvas size ratio."""
112
127
  canvas_width, canvas_height = self.canvas.winfo_width(), self.canvas.winfo_height()
113
128
  width_scaling_factor = self.img_width / canvas_width
114
129
  height_scaling_factor = self.img_height / canvas_height
115
130
  bounding_boxes_data = []
116
131
  for box in self.bounding_boxes:
117
- print("Bounding Box ", bounding_boxes_data)
118
132
  rescaled_box = []
119
133
  for x, y in box:
120
134
  rescaled_x = int(x * width_scaling_factor)
@@ -162,7 +176,8 @@ class ParkingManagement:
162
176
  self.model = YOLO(self.model_path)
163
177
  return self.model
164
178
 
165
- def parking_regions_extraction(self, json_file):
179
+ @staticmethod
180
+ def parking_regions_extraction(json_file):
166
181
  """
167
182
  Extract parking regions from json file.
168
183
 
@@ -171,8 +186,7 @@ class ParkingManagement:
171
186
  """
172
187
 
173
188
  with open(json_file, "r") as json_file:
174
- json_data = json.load(json_file)
175
- return json_data
189
+ return json.load(json_file)
176
190
 
177
191
  def process_data(self, json_data, im0, boxes, clss):
178
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"
@@ -72,8 +72,11 @@ class Bboxes:
72
72
 
73
73
  def areas(self):
74
74
  """Return box areas."""
75
- self.convert("xyxy")
76
- return (self.bboxes[:, 2] - self.bboxes[:, 0]) * (self.bboxes[:, 3] - self.bboxes[:, 1])
75
+ return (
76
+ (self.bboxes[:, 2] - self.bboxes[:, 0]) * (self.bboxes[:, 3] - self.bboxes[:, 1]) # format xyxy
77
+ if self.format == "xyxy"
78
+ else self.bboxes[:, 3] * self.bboxes[:, 2] # format xywh or ltwh
79
+ )
77
80
 
78
81
  # def denormalize(self, w, h):
79
82
  # if not self.normalized:
@@ -340,11 +343,7 @@ class Instances:
340
343
  self.keypoints[..., 1] = self.keypoints[..., 1].clip(0, h)
341
344
 
342
345
  def remove_zero_area_boxes(self):
343
- """
344
- Remove zero-area boxes, i.e. after clipping some boxes may have zero width or height.
345
-
346
- This removes them.
347
- """
346
+ """Remove zero-area boxes, i.e. after clipping some boxes may have zero width or height."""
348
347
  good = self.bbox_areas > 0
349
348
  if not all(good):
350
349
  self._bboxes = self._bboxes[good]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ultralytics
3
- Version: 8.2.7
3
+ Version: 8.2.9
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.0.3 ; extra == 'extra'
76
+ Requires-Dist: albumentations <=1.4.4,>=1.0.3 ; 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,4 +1,4 @@
1
- ultralytics/__init__.py,sha256=7Rhmhx0uNSy56-6iosDmmMJM-jQBRfTt9ruZCAW7UjU,632
1
+ ultralytics/__init__.py,sha256=oq6eTgCV4Zs-TB07fjVkFZWcv7FY5U4QMgtqyeyRnHA,632
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=4ZnvY2ULMGofFhjaRIzKQlGC5YVkvWkEAYAhnsKC1Po,21312
@@ -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=81BOqY4DzxuNfw6Qg7rjBQTktU4JK2GHolXIhzXnAHg,57741
68
- ultralytics/data/base.py,sha256=9dZcoXtczloWSsbU-sOa9NlJ7lIGoarEUAp2rzP1jMI,13481
69
- ultralytics/data/build.py,sha256=0FQJFxv7IxUt1Q_ghl3JGuXTzbq-nkM_e85T5KFptvE,7388
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,11 +78,11 @@ 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=yCRWmWGrjFCCq0ltoV4Wq52k3ToYu6Fp1fFw99ke3NM,55074
82
+ ultralytics/engine/model.py,sha256=EkLTBSm3RT0mWPsZQpVRShihEvI5vx5X_VnkBHc1fxk,40032
83
83
  ultralytics/engine/predictor.py,sha256=wQRKdWGDTP5A6CS0gTC6U3RPDMhP3QkEzWSPm6eqCkU,17022
84
84
  ultralytics/engine/results.py,sha256=MvrOBrBlRF7kbL-QwysMf9mIDy_lwQBTTYvy1x1FMME,30667
85
- ultralytics/engine/trainer.py,sha256=FK2PkQyUThIU5RYr8Qa38JZDRB3iOl85Sdbi4HrlQ5U,34987
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
88
88
  ultralytics/hub/__init__.py,sha256=U4j-2QPdwSDlxw6RgFYnnJXOoIzLtwke4TkY2A8q4ws,5068
@@ -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=7M85ThMtQodv-zIfqCIkJccK-_gpOHz4VYiHHx43NwA,8656
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,13 +172,13 @@ 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
179
179
  ultralytics/utils/errors.py,sha256=GqP_Jgj_n0paxn8OMhn3DTCgoNkB2WjUcUaqs-M6SQk,816
180
180
  ultralytics/utils/files.py,sha256=TVfY0Wi5IsUc4YdsDzC0dAg-jAP5exYvwqB3VmXhDLY,6761
181
- ultralytics/utils/instance.py,sha256=fPClvPPtTk8VeXWiRv90DrFk1j1lTUKdYJtpZKUDDtA,15575
181
+ ultralytics/utils/instance.py,sha256=5daM5nkxBv9hr5QzyII8zmuFj24hHuNtcr4EMCHAtpY,15654
182
182
  ultralytics/utils/loss.py,sha256=ejXnPEIAzNEoNz2UjW0_fcdeUs9Hy-jPzUrJ3FiIIwE,32717
183
183
  ultralytics/utils/metrics.py,sha256=XPD-xP0fchR8KgCuTcihV2-n0EK1cWi3-53BWN_pLuA,53518
184
184
  ultralytics/utils/ops.py,sha256=wZCWx7dm5GJNIJHyZaFJRetGcQ7prdv-anplqq9figQ,33309
@@ -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.7.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
203
- ultralytics-8.2.7.dist-info/METADATA,sha256=lBAKCAa8MAMWFFD5KexR6aCHW4rdMvXl5qIo53jJL3A,40693
204
- ultralytics-8.2.7.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
205
- ultralytics-8.2.7.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
206
- ultralytics-8.2.7.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
207
- ultralytics-8.2.7.dist-info/RECORD,,
202
+ ultralytics-8.2.9.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
203
+ ultralytics-8.2.9.dist-info/METADATA,sha256=hrfhGcmLk1eQ0BbrVYCSW6WLCeTgRFa6blqzRLzvyaY,40701
204
+ ultralytics-8.2.9.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
205
+ ultralytics-8.2.9.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
206
+ ultralytics-8.2.9.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
207
+ ultralytics-8.2.9.dist-info/RECORD,,