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 +1 -1
- ultralytics/data/augment.py +1 -3
- ultralytics/data/base.py +1 -2
- ultralytics/data/build.py +5 -6
- ultralytics/engine/exporter.py +37 -29
- ultralytics/engine/model.py +2 -2
- ultralytics/engine/trainer.py +1 -1
- ultralytics/solutions/parking_management.py +37 -23
- ultralytics/utils/benchmarks.py +4 -3
- ultralytics/utils/instance.py +6 -7
- {ultralytics-8.2.7.dist-info → ultralytics-8.2.9.dist-info}/METADATA +2 -2
- {ultralytics-8.2.7.dist-info → ultralytics-8.2.9.dist-info}/RECORD +16 -16
- {ultralytics-8.2.7.dist-info → ultralytics-8.2.9.dist-info}/LICENSE +0 -0
- {ultralytics-8.2.7.dist-info → ultralytics-8.2.9.dist-info}/WHEEL +0 -0
- {ultralytics-8.2.7.dist-info → ultralytics-8.2.9.dist-info}/entry_points.txt +0 -0
- {ultralytics-8.2.7.dist-info → ultralytics-8.2.9.dist-info}/top_level.txt +0 -0
ultralytics/__init__.py
CHANGED
ultralytics/data/augment.py
CHANGED
|
@@ -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
|
|
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):
|
ultralytics/engine/exporter.py
CHANGED
|
@@ -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
|
-
|
|
457
|
-
|
|
458
|
-
|
|
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,
|
|
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
|
-
|
|
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(
|
|
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
|
ultralytics/engine/model.py
CHANGED
|
@@ -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
|
-
(
|
|
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.
|
ultralytics/engine/trainer.py
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
"""
|
|
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
|
-
|
|
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
|
-
|
|
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
|
"""
|
ultralytics/utils/benchmarks.py
CHANGED
|
@@ -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
|
-
|
|
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"
|
ultralytics/utils/instance.py
CHANGED
|
@@ -72,8 +72,11 @@ class Bboxes:
|
|
|
72
72
|
|
|
73
73
|
def areas(self):
|
|
74
74
|
"""Return box areas."""
|
|
75
|
-
|
|
76
|
-
|
|
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.
|
|
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
|
|
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=
|
|
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=
|
|
68
|
-
ultralytics/data/base.py,sha256=
|
|
69
|
-
ultralytics/data/build.py,sha256=
|
|
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=
|
|
82
|
-
ultralytics/engine/model.py,sha256=
|
|
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=
|
|
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
|
|
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=
|
|
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=
|
|
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.
|
|
203
|
-
ultralytics-8.2.
|
|
204
|
-
ultralytics-8.2.
|
|
205
|
-
ultralytics-8.2.
|
|
206
|
-
ultralytics-8.2.
|
|
207
|
-
ultralytics-8.2.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|