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 +1 -1
- ultralytics/cfg/__init__.py +1 -0
- ultralytics/data/augment.py +1 -2
- ultralytics/data/base.py +1 -2
- ultralytics/data/build.py +2 -4
- ultralytics/engine/exporter.py +38 -29
- ultralytics/engine/model.py +2 -2
- ultralytics/engine/results.py +22 -16
- ultralytics/solutions/parking_management.py +35 -22
- ultralytics/utils/benchmarks.py +4 -3
- ultralytics/utils/tuner.py +1 -1
- {ultralytics-8.2.8.dist-info → ultralytics-8.2.10.dist-info}/METADATA +2 -2
- {ultralytics-8.2.8.dist-info → ultralytics-8.2.10.dist-info}/RECORD +17 -17
- {ultralytics-8.2.8.dist-info → ultralytics-8.2.10.dist-info}/LICENSE +0 -0
- {ultralytics-8.2.8.dist-info → ultralytics-8.2.10.dist-info}/WHEEL +0 -0
- {ultralytics-8.2.8.dist-info → ultralytics-8.2.10.dist-info}/entry_points.txt +0 -0
- {ultralytics-8.2.8.dist-info → ultralytics-8.2.10.dist-info}/top_level.txt +0 -0
ultralytics/__init__.py
CHANGED
ultralytics/cfg/__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
|
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
|
"""
|
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
|
|
@@ -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
|
-
|
|
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(
|
|
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
|
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/results.py
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
"
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
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
|
-
|
|
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]
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
"""
|
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/tuner.py
CHANGED
|
@@ -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__, "
|
|
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.
|
|
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
|
|
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=
|
|
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=
|
|
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=
|
|
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,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=
|
|
82
|
-
ultralytics/engine/model.py,sha256=
|
|
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=
|
|
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
|
|
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=
|
|
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=
|
|
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.
|
|
203
|
-
ultralytics-8.2.
|
|
204
|
-
ultralytics-8.2.
|
|
205
|
-
ultralytics-8.2.
|
|
206
|
-
ultralytics-8.2.
|
|
207
|
-
ultralytics-8.2.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|