ultralytics 8.3.29__py3-none-any.whl → 8.3.31__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ultralytics/__init__.py +1 -1
- ultralytics/cfg/__init__.py +3 -0
- ultralytics/engine/results.py +1 -1
- ultralytics/engine/trainer.py +11 -6
- ultralytics/models/yolo/detect/train.py +7 -0
- ultralytics/models/yolo/detect/val.py +2 -2
- ultralytics/models/yolo/pose/val.py +2 -2
- ultralytics/models/yolo/segment/val.py +2 -2
- ultralytics/solutions/__init__.py +2 -0
- ultralytics/solutions/analytics.py +1 -1
- ultralytics/solutions/region_counter.py +112 -0
- ultralytics/solutions/solutions.py +2 -0
- ultralytics/utils/autobatch.py +8 -4
- ultralytics/utils/tal.py +36 -6
- ultralytics/utils/torch_utils.py +9 -1
- {ultralytics-8.3.29.dist-info → ultralytics-8.3.31.dist-info}/METADATA +1 -1
- {ultralytics-8.3.29.dist-info → ultralytics-8.3.31.dist-info}/RECORD +21 -20
- {ultralytics-8.3.29.dist-info → ultralytics-8.3.31.dist-info}/WHEEL +1 -1
- {ultralytics-8.3.29.dist-info → ultralytics-8.3.31.dist-info}/LICENSE +0 -0
- {ultralytics-8.3.29.dist-info → ultralytics-8.3.31.dist-info}/entry_points.txt +0 -0
- {ultralytics-8.3.29.dist-info → ultralytics-8.3.31.dist-info}/top_level.txt +0 -0
ultralytics/__init__.py
CHANGED
ultralytics/cfg/__init__.py
CHANGED
@@ -671,6 +671,9 @@ def handle_yolo_solutions(args: List[str]) -> None:
|
|
671
671
|
)
|
672
672
|
s_n = "count" # Default solution if none provided
|
673
673
|
|
674
|
+
if args and args[0] == "help": # Add check for return if user call `yolo solutions help`
|
675
|
+
return
|
676
|
+
|
674
677
|
cls, method = SOLUTION_MAP[s_n] # solution class name, method name and default source
|
675
678
|
|
676
679
|
from ultralytics import solutions # import ultralytics solutions
|
ultralytics/engine/results.py
CHANGED
@@ -750,7 +750,7 @@ class Results(SimpleClass):
|
|
750
750
|
save_one_box(
|
751
751
|
d.xyxy,
|
752
752
|
self.orig_img.copy(),
|
753
|
-
file=Path(save_dir) / self.names[int(d.cls)] /
|
753
|
+
file=Path(save_dir) / self.names[int(d.cls)] / Path(file_name).with_suffix(".jpg"),
|
754
754
|
BGR=True,
|
755
755
|
)
|
756
756
|
|
ultralytics/engine/trainer.py
CHANGED
@@ -279,12 +279,7 @@ class BaseTrainer:
|
|
279
279
|
|
280
280
|
# Batch size
|
281
281
|
if self.batch_size < 1 and RANK == -1: # single-GPU only, estimate best batch size
|
282
|
-
self.args.batch = self.batch_size =
|
283
|
-
model=self.model,
|
284
|
-
imgsz=self.args.imgsz,
|
285
|
-
amp=self.amp,
|
286
|
-
batch=self.batch_size,
|
287
|
-
)
|
282
|
+
self.args.batch = self.batch_size = self.auto_batch()
|
288
283
|
|
289
284
|
# Dataloaders
|
290
285
|
batch_size = self.batch_size // max(world_size, 1)
|
@@ -478,6 +473,16 @@ class BaseTrainer:
|
|
478
473
|
self._clear_memory()
|
479
474
|
self.run_callbacks("teardown")
|
480
475
|
|
476
|
+
def auto_batch(self, max_num_obj=0):
|
477
|
+
"""Get batch size by calculating memory occupation of model."""
|
478
|
+
return check_train_batch_size(
|
479
|
+
model=self.model,
|
480
|
+
imgsz=self.args.imgsz,
|
481
|
+
amp=self.amp,
|
482
|
+
batch=self.batch_size,
|
483
|
+
max_num_obj=max_num_obj,
|
484
|
+
) # returns batch size
|
485
|
+
|
481
486
|
def _get_memory(self):
|
482
487
|
"""Get accelerator memory utilization in GB."""
|
483
488
|
if self.device.type == "mps":
|
@@ -141,3 +141,10 @@ class DetectionTrainer(BaseTrainer):
|
|
141
141
|
boxes = np.concatenate([lb["bboxes"] for lb in self.train_loader.dataset.labels], 0)
|
142
142
|
cls = np.concatenate([lb["cls"] for lb in self.train_loader.dataset.labels], 0)
|
143
143
|
plot_labels(boxes, cls.squeeze(), names=self.data["names"], save_dir=self.save_dir, on_plot=self.on_plot)
|
144
|
+
|
145
|
+
def auto_batch(self):
|
146
|
+
"""Get batch size by calculating memory occupation of model."""
|
147
|
+
train_dataset = self.build_dataset(self.trainset, mode="train", batch=16)
|
148
|
+
# 4 for mosaic augmentation
|
149
|
+
max_num_obj = max(len(l["cls"]) for l in train_dataset.labels) * 4
|
150
|
+
return super().auto_batch(max_num_obj)
|
@@ -155,8 +155,8 @@ class DetectionValidator(BaseValidator):
|
|
155
155
|
# Evaluate
|
156
156
|
if nl:
|
157
157
|
stat["tp"] = self._process_batch(predn, bbox, cls)
|
158
|
-
|
159
|
-
|
158
|
+
if self.args.plots:
|
159
|
+
self.confusion_matrix.process_batch(predn, bbox, cls)
|
160
160
|
for k in self.stats.keys():
|
161
161
|
self.stats[k].append(stat[k])
|
162
162
|
|
@@ -138,8 +138,8 @@ class PoseValidator(DetectionValidator):
|
|
138
138
|
if nl:
|
139
139
|
stat["tp"] = self._process_batch(predn, bbox, cls)
|
140
140
|
stat["tp_p"] = self._process_batch(predn, bbox, cls, pred_kpts, pbatch["kpts"])
|
141
|
-
|
142
|
-
|
141
|
+
if self.args.plots:
|
142
|
+
self.confusion_matrix.process_batch(predn, bbox, cls)
|
143
143
|
|
144
144
|
for k in self.stats.keys():
|
145
145
|
self.stats[k].append(stat[k])
|
@@ -135,8 +135,8 @@ class SegmentationValidator(DetectionValidator):
|
|
135
135
|
stat["tp_m"] = self._process_batch(
|
136
136
|
predn, bbox, cls, pred_masks, gt_masks, self.args.overlap_mask, masks=True
|
137
137
|
)
|
138
|
-
|
139
|
-
|
138
|
+
if self.args.plots:
|
139
|
+
self.confusion_matrix.process_batch(predn, bbox, cls)
|
140
140
|
|
141
141
|
for k in self.stats.keys():
|
142
142
|
self.stats[k].append(stat[k])
|
@@ -7,6 +7,7 @@ from .heatmap import Heatmap
|
|
7
7
|
from .object_counter import ObjectCounter
|
8
8
|
from .parking_management import ParkingManagement, ParkingPtsSelection
|
9
9
|
from .queue_management import QueueManager
|
10
|
+
from .region_counter import RegionCounter
|
10
11
|
from .speed_estimation import SpeedEstimator
|
11
12
|
from .streamlit_inference import inference
|
12
13
|
|
@@ -21,4 +22,5 @@ __all__ = (
|
|
21
22
|
"SpeedEstimator",
|
22
23
|
"Analytics",
|
23
24
|
"inference",
|
25
|
+
"RegionCounter",
|
24
26
|
)
|
@@ -54,7 +54,7 @@ class Analytics(BaseSolution):
|
|
54
54
|
self.y_label = "Total Counts"
|
55
55
|
|
56
56
|
# Predefined data
|
57
|
-
self.bg_color = "#
|
57
|
+
self.bg_color = "#F3F3F3" # background color of frame
|
58
58
|
self.fg_color = "#111E68" # foreground color of frame
|
59
59
|
self.title = "Ultralytics Solutions" # window name
|
60
60
|
self.max_points = 45 # maximum points to be drawn on window
|
@@ -0,0 +1,112 @@
|
|
1
|
+
# Ultralytics YOLO 🚀, AGPL-3.0 license
|
2
|
+
|
3
|
+
from ultralytics.solutions.solutions import BaseSolution
|
4
|
+
from ultralytics.utils.plotting import Annotator, colors
|
5
|
+
|
6
|
+
|
7
|
+
class RegionCounter(BaseSolution):
|
8
|
+
"""
|
9
|
+
A class designed for real-time counting of objects within user-defined regions in a video stream.
|
10
|
+
|
11
|
+
This class inherits from `BaseSolution` and offers functionalities to define polygonal regions in a video
|
12
|
+
frame, track objects, and count those objects that pass through each defined region. This makes it useful
|
13
|
+
for applications that require counting in specified areas, such as monitoring zones or segmented sections.
|
14
|
+
|
15
|
+
Attributes:
|
16
|
+
region_template (dict): A template for creating new counting regions with default attributes including
|
17
|
+
the name, polygon coordinates, and display colors.
|
18
|
+
counting_regions (list): A list storing all defined regions, where each entry is based on `region_template`
|
19
|
+
and includes specific region settings like name, coordinates, and color.
|
20
|
+
|
21
|
+
Methods:
|
22
|
+
add_region: Adds a new counting region with specified attributes, such as the region's name, polygon points,
|
23
|
+
region color, and text color.
|
24
|
+
count: Processes video frames to count objects in each region, drawing regions and displaying counts
|
25
|
+
on the frame. Handles object detection, region definition, and containment checks.
|
26
|
+
"""
|
27
|
+
|
28
|
+
def __init__(self, **kwargs):
|
29
|
+
"""Initializes the RegionCounter class for real-time counting in different regions of the video streams."""
|
30
|
+
super().__init__(**kwargs)
|
31
|
+
self.region_template = {
|
32
|
+
"name": "Default Region",
|
33
|
+
"polygon": None,
|
34
|
+
"counts": 0,
|
35
|
+
"dragging": False,
|
36
|
+
"region_color": (255, 255, 255),
|
37
|
+
"text_color": (0, 0, 0),
|
38
|
+
}
|
39
|
+
self.counting_regions = []
|
40
|
+
|
41
|
+
def add_region(self, name, polygon_points, region_color, text_color):
|
42
|
+
"""
|
43
|
+
Adds a new region to the counting list based on the provided template with specific attributes.
|
44
|
+
|
45
|
+
Args:
|
46
|
+
name (str): Name assigned to the new region.
|
47
|
+
polygon_points (list[tuple]): List of (x, y) coordinates defining the region's polygon.
|
48
|
+
region_color (tuple): BGR color for region visualization.
|
49
|
+
text_color (tuple): BGR color for the text within the region.
|
50
|
+
"""
|
51
|
+
region = self.region_template.copy()
|
52
|
+
region.update(
|
53
|
+
{
|
54
|
+
"name": name,
|
55
|
+
"polygon": self.Polygon(polygon_points),
|
56
|
+
"region_color": region_color,
|
57
|
+
"text_color": text_color,
|
58
|
+
}
|
59
|
+
)
|
60
|
+
self.counting_regions.append(region)
|
61
|
+
|
62
|
+
def count(self, im0):
|
63
|
+
"""
|
64
|
+
Processes the input frame to detect and count objects within each defined region.
|
65
|
+
|
66
|
+
Args:
|
67
|
+
im0 (numpy.ndarray): Input image frame where objects and regions are annotated.
|
68
|
+
|
69
|
+
Returns:
|
70
|
+
im0 (numpy.ndarray): Processed image frame with annotated counting information.
|
71
|
+
"""
|
72
|
+
self.annotator = Annotator(im0, line_width=self.line_width)
|
73
|
+
self.extract_tracks(im0)
|
74
|
+
|
75
|
+
# Region initialization and conversion
|
76
|
+
if self.region is None:
|
77
|
+
self.initialize_region()
|
78
|
+
regions = {"Region#01": self.region}
|
79
|
+
else:
|
80
|
+
regions = self.region if isinstance(self.region, dict) else {"Region#01": self.region}
|
81
|
+
|
82
|
+
# Draw regions and process counts for each defined area
|
83
|
+
for idx, (region_name, reg_pts) in enumerate(regions.items(), start=1):
|
84
|
+
color = colors(idx, True)
|
85
|
+
self.annotator.draw_region(reg_pts=reg_pts, color=color, thickness=self.line_width * 2)
|
86
|
+
self.add_region(region_name, reg_pts, color, self.annotator.get_txt_color())
|
87
|
+
|
88
|
+
# Prepare regions for containment check
|
89
|
+
for region in self.counting_regions:
|
90
|
+
region["prepared_polygon"] = self.prep(region["polygon"])
|
91
|
+
|
92
|
+
# Process bounding boxes and count objects within each region
|
93
|
+
for box, cls in zip(self.boxes, self.clss):
|
94
|
+
self.annotator.box_label(box, label=self.names[cls], color=colors(cls, True))
|
95
|
+
bbox_center = ((box[0] + box[2]) / 2, (box[1] + box[3]) / 2)
|
96
|
+
|
97
|
+
for region in self.counting_regions:
|
98
|
+
if region["prepared_polygon"].contains(self.Point(bbox_center)):
|
99
|
+
region["counts"] += 1
|
100
|
+
|
101
|
+
# Display counts in each region
|
102
|
+
for region in self.counting_regions:
|
103
|
+
self.annotator.text_label(
|
104
|
+
region["polygon"].bounds,
|
105
|
+
label=str(region["counts"]),
|
106
|
+
color=region["region_color"],
|
107
|
+
txt_color=region["text_color"],
|
108
|
+
)
|
109
|
+
region["counts"] = 0 # Reset count for next frame
|
110
|
+
|
111
|
+
self.display_output(im0)
|
112
|
+
return im0
|
@@ -50,10 +50,12 @@ class BaseSolution:
|
|
50
50
|
"""
|
51
51
|
check_requirements("shapely>=2.0.0")
|
52
52
|
from shapely.geometry import LineString, Point, Polygon
|
53
|
+
from shapely.prepared import prep
|
53
54
|
|
54
55
|
self.LineString = LineString
|
55
56
|
self.Polygon = Polygon
|
56
57
|
self.Point = Point
|
58
|
+
self.prep = prep
|
57
59
|
|
58
60
|
# Load config and update with args
|
59
61
|
DEFAULT_SOL_DICT.update(kwargs)
|
ultralytics/utils/autobatch.py
CHANGED
@@ -11,7 +11,7 @@ from ultralytics.utils import DEFAULT_CFG, LOGGER, colorstr
|
|
11
11
|
from ultralytics.utils.torch_utils import autocast, profile
|
12
12
|
|
13
13
|
|
14
|
-
def check_train_batch_size(model, imgsz=640, amp=True, batch=-1):
|
14
|
+
def check_train_batch_size(model, imgsz=640, amp=True, batch=-1, max_num_obj=1):
|
15
15
|
"""
|
16
16
|
Compute optimal YOLO training batch size using the autobatch() function.
|
17
17
|
|
@@ -20,6 +20,7 @@ def check_train_batch_size(model, imgsz=640, amp=True, batch=-1):
|
|
20
20
|
imgsz (int, optional): Image size used for training.
|
21
21
|
amp (bool, optional): Use automatic mixed precision if True.
|
22
22
|
batch (float, optional): Fraction of GPU memory to use. If -1, use default.
|
23
|
+
max_num_obj (int, optional): The maximum number of objects from dataset.
|
23
24
|
|
24
25
|
Returns:
|
25
26
|
(int): Optimal batch size computed using the autobatch() function.
|
@@ -29,10 +30,12 @@ def check_train_batch_size(model, imgsz=640, amp=True, batch=-1):
|
|
29
30
|
Otherwise, a default fraction of 0.6 is used.
|
30
31
|
"""
|
31
32
|
with autocast(enabled=amp):
|
32
|
-
return autobatch(
|
33
|
+
return autobatch(
|
34
|
+
deepcopy(model).train(), imgsz, fraction=batch if 0.0 < batch < 1.0 else 0.6, max_num_obj=max_num_obj
|
35
|
+
)
|
33
36
|
|
34
37
|
|
35
|
-
def autobatch(model, imgsz=640, fraction=0.60, batch_size=DEFAULT_CFG.batch):
|
38
|
+
def autobatch(model, imgsz=640, fraction=0.60, batch_size=DEFAULT_CFG.batch, max_num_obj=1):
|
36
39
|
"""
|
37
40
|
Automatically estimate the best YOLO batch size to use a fraction of the available CUDA memory.
|
38
41
|
|
@@ -41,6 +44,7 @@ def autobatch(model, imgsz=640, fraction=0.60, batch_size=DEFAULT_CFG.batch):
|
|
41
44
|
imgsz (int, optional): The image size used as input for the YOLO model. Defaults to 640.
|
42
45
|
fraction (float, optional): The fraction of available CUDA memory to use. Defaults to 0.60.
|
43
46
|
batch_size (int, optional): The default batch size to use if an error is detected. Defaults to 16.
|
47
|
+
max_num_obj (int, optional): The maximum number of objects from dataset.
|
44
48
|
|
45
49
|
Returns:
|
46
50
|
(int): The optimal batch size.
|
@@ -70,7 +74,7 @@ def autobatch(model, imgsz=640, fraction=0.60, batch_size=DEFAULT_CFG.batch):
|
|
70
74
|
batch_sizes = [1, 2, 4, 8, 16] if t < 16 else [1, 2, 4, 8, 16, 32, 64]
|
71
75
|
try:
|
72
76
|
img = [torch.empty(b, 3, imgsz, imgsz) for b in batch_sizes]
|
73
|
-
results = profile(img, model, n=1, device=device)
|
77
|
+
results = profile(img, model, n=1, device=device, max_num_obj=max_num_obj)
|
74
78
|
|
75
79
|
# Fit a solution
|
76
80
|
y = [x[2] for x in results if x] # memory [2]
|
ultralytics/utils/tal.py
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
import torch
|
4
4
|
import torch.nn as nn
|
5
5
|
|
6
|
+
from . import LOGGER
|
6
7
|
from .checks import check_version
|
7
8
|
from .metrics import bbox_iou, probiou
|
8
9
|
from .ops import xywhr2xyxyxyxy
|
@@ -58,17 +59,46 @@ class TaskAlignedAssigner(nn.Module):
|
|
58
59
|
"""
|
59
60
|
self.bs = pd_scores.shape[0]
|
60
61
|
self.n_max_boxes = gt_bboxes.shape[1]
|
62
|
+
device = gt_bboxes.device
|
61
63
|
|
62
64
|
if self.n_max_boxes == 0:
|
63
|
-
device = gt_bboxes.device
|
64
65
|
return (
|
65
|
-
torch.full_like(pd_scores[..., 0], self.bg_idx)
|
66
|
-
torch.zeros_like(pd_bboxes)
|
67
|
-
torch.zeros_like(pd_scores)
|
68
|
-
torch.zeros_like(pd_scores[..., 0])
|
69
|
-
torch.zeros_like(pd_scores[..., 0])
|
66
|
+
torch.full_like(pd_scores[..., 0], self.bg_idx),
|
67
|
+
torch.zeros_like(pd_bboxes),
|
68
|
+
torch.zeros_like(pd_scores),
|
69
|
+
torch.zeros_like(pd_scores[..., 0]),
|
70
|
+
torch.zeros_like(pd_scores[..., 0]),
|
70
71
|
)
|
71
72
|
|
73
|
+
try:
|
74
|
+
return self._forward(pd_scores, pd_bboxes, anc_points, gt_labels, gt_bboxes, mask_gt)
|
75
|
+
except torch.OutOfMemoryError:
|
76
|
+
# Move tensors to CPU, compute, then move back to original device
|
77
|
+
LOGGER.warning("WARNING: CUDA OutOfMemoryError in TaskAlignedAssigner, using CPU")
|
78
|
+
cpu_tensors = [t.cpu() for t in (pd_scores, pd_bboxes, anc_points, gt_labels, gt_bboxes, mask_gt)]
|
79
|
+
result = self._forward(*cpu_tensors)
|
80
|
+
return tuple(t.to(device) for t in result)
|
81
|
+
|
82
|
+
def _forward(self, pd_scores, pd_bboxes, anc_points, gt_labels, gt_bboxes, mask_gt):
|
83
|
+
"""
|
84
|
+
Compute the task-aligned assignment. Reference code is available at
|
85
|
+
https://github.com/Nioolek/PPYOLOE_pytorch/blob/master/ppyoloe/assigner/tal_assigner.py.
|
86
|
+
|
87
|
+
Args:
|
88
|
+
pd_scores (Tensor): shape(bs, num_total_anchors, num_classes)
|
89
|
+
pd_bboxes (Tensor): shape(bs, num_total_anchors, 4)
|
90
|
+
anc_points (Tensor): shape(num_total_anchors, 2)
|
91
|
+
gt_labels (Tensor): shape(bs, n_max_boxes, 1)
|
92
|
+
gt_bboxes (Tensor): shape(bs, n_max_boxes, 4)
|
93
|
+
mask_gt (Tensor): shape(bs, n_max_boxes, 1)
|
94
|
+
|
95
|
+
Returns:
|
96
|
+
target_labels (Tensor): shape(bs, num_total_anchors)
|
97
|
+
target_bboxes (Tensor): shape(bs, num_total_anchors, 4)
|
98
|
+
target_scores (Tensor): shape(bs, num_total_anchors, num_classes)
|
99
|
+
fg_mask (Tensor): shape(bs, num_total_anchors)
|
100
|
+
target_gt_idx (Tensor): shape(bs, num_total_anchors)
|
101
|
+
"""
|
72
102
|
mask_pos, align_metric, overlaps = self.get_pos_mask(
|
73
103
|
pd_scores, pd_bboxes, gt_labels, gt_bboxes, anc_points, mask_gt
|
74
104
|
)
|
ultralytics/utils/torch_utils.py
CHANGED
@@ -623,7 +623,7 @@ def convert_optimizer_state_dict_to_fp16(state_dict):
|
|
623
623
|
return state_dict
|
624
624
|
|
625
625
|
|
626
|
-
def profile(input, ops, n=10, device=None):
|
626
|
+
def profile(input, ops, n=10, device=None, max_num_obj=0):
|
627
627
|
"""
|
628
628
|
Ultralytics speed, memory and FLOPs profiler.
|
629
629
|
|
@@ -671,6 +671,14 @@ def profile(input, ops, n=10, device=None):
|
|
671
671
|
t[2] = float("nan")
|
672
672
|
tf += (t[1] - t[0]) * 1000 / n # ms per op forward
|
673
673
|
tb += (t[2] - t[1]) * 1000 / n # ms per op backward
|
674
|
+
if max_num_obj: # simulate training with predictions per image grid (for AutoBatch)
|
675
|
+
torch.randn(
|
676
|
+
x.shape[0],
|
677
|
+
max_num_obj,
|
678
|
+
int(sum([(x.shape[-1] / s) * (x.shape[-2] / s) for s in m.stride.tolist()])),
|
679
|
+
device=device,
|
680
|
+
dtype=torch.float32,
|
681
|
+
)
|
674
682
|
mem = torch.cuda.memory_reserved() / 1e9 if torch.cuda.is_available() else 0 # (GB)
|
675
683
|
s_in, s_out = (tuple(x.shape) if isinstance(x, torch.Tensor) else "list" for x in (x, y)) # shapes
|
676
684
|
p = sum(x.numel() for x in m.parameters()) if isinstance(m, nn.Module) else 0 # parameters
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: ultralytics
|
3
|
-
Version: 8.3.
|
3
|
+
Version: 8.3.31
|
4
4
|
Summary: Ultralytics YOLO 🚀 for SOTA object detection, multi-object tracking, instance segmentation, pose estimation and image classification.
|
5
5
|
Author-email: Glenn Jocher <glenn.jocher@ultralytics.com>, Jing Qiu <jing.qiu@ultralytics.com>
|
6
6
|
Maintainer-email: Ultralytics <hello@ultralytics.com>
|
@@ -7,10 +7,10 @@ tests/test_exports.py,sha256=1MvhcQ2qHdbJImHII-bFarcaIcm-kPlEK-OdFLxnj7o,8769
|
|
7
7
|
tests/test_integrations.py,sha256=f5-QCUk1SU_-qn4mBCZwS3GN3tXEBIIXo4z2EhExbHw,6126
|
8
8
|
tests/test_python.py,sha256=I1RRdCwLdrc3jX06huVxct8HX8ccQOmQgVpuEflRl0U,23560
|
9
9
|
tests/test_solutions.py,sha256=sPYhy2d814mIVvojQeVxeZPu0IVy01_Y8zuMcu_9GF0,3790
|
10
|
-
ultralytics/__init__.py,sha256=
|
10
|
+
ultralytics/__init__.py,sha256=Z3VjR0LGu2YpNK8RouNCLcCrmcAaslU5opcp7PtMzsg,681
|
11
11
|
ultralytics/assets/bus.jpg,sha256=wCAZxJecGR63Od3ZRERe9Aja1Weayrb9Ug751DS_vGM,137419
|
12
12
|
ultralytics/assets/zidane.jpg,sha256=Ftc4aeMmen1O0A3o6GCDO9FlfBslLpTAw0gnetx7bts,50427
|
13
|
-
ultralytics/cfg/__init__.py,sha256=
|
13
|
+
ultralytics/cfg/__init__.py,sha256=ArJow4-pOPN3y6aKOv5KcVXimikI6vAQvQlSRb7IdWE,38743
|
14
14
|
ultralytics/cfg/default.yaml,sha256=jlSdLkFAngX6HvrzJHdZ9kdi-xO7utyLc4X2M3NWhEI,8342
|
15
15
|
ultralytics/cfg/datasets/Argoverse.yaml,sha256=FyeuJT5CHq_9d4hlfAf0kpZlnbUMO0S--UJ1yIqcdKk,3134
|
16
16
|
ultralytics/cfg/datasets/DOTAv1.5.yaml,sha256=QVfp_Qp-4rukuicaB4qx86NxSHM8Mrzym8l_fIDo8gw,1195
|
@@ -102,8 +102,8 @@ ultralytics/engine/__init__.py,sha256=mHtJuK4hwF8cuV-VHDc7tp6u6D1gHz2Z7JI8grmQDT
|
|
102
102
|
ultralytics/engine/exporter.py,sha256=DH67LwNDr3fiWxaES-lhSLvm5pCuasXLbQv4FSLCi_M,67171
|
103
103
|
ultralytics/engine/model.py,sha256=TfuTczFjNJ3GW0E_qWVH6OaJ_2I-_Srx7i_4GQebDoo,51472
|
104
104
|
ultralytics/engine/predictor.py,sha256=aS4yJdTK2kYq-TTpzIlWxqnAcBz38zIECZoMb_yOPMY,17597
|
105
|
-
ultralytics/engine/results.py,sha256=
|
106
|
-
ultralytics/engine/trainer.py,sha256=
|
105
|
+
ultralytics/engine/results.py,sha256=a1XFZRPwqgKDBOEAibHuT9nP2xefLiWVsMoBJbcr4iA,75058
|
106
|
+
ultralytics/engine/trainer.py,sha256=Cd95QLJ3C4fncoOX1YgauLA9aWVYRd1G6x0Au2xX86k,37335
|
107
107
|
ultralytics/engine/tuner.py,sha256=WBj8iw1K1TK0hvanlA-wkwmfqh1SI8jEe2dGwUINeTg,11838
|
108
108
|
ultralytics/engine/validator.py,sha256=aWpXE3nrOqaA7jCuUgwxi0FabiGTIXtZvjoJyCX903o,14870
|
109
109
|
ultralytics/hub/__init__.py,sha256=c6Me4E8V-P7mtzTggyPYz9FnVkqWRyPp9F-fMcyFNQ0,5632
|
@@ -151,8 +151,8 @@ ultralytics/models/yolo/classify/train.py,sha256=3aYzLDqX_03xR1xqlTn1TxA4t58cCIG
|
|
151
151
|
ultralytics/models/yolo/classify/val.py,sha256=Tzizhp3ebzPvwJejrE8tb-TuXw4MdkEI9mOANV74eXQ,4909
|
152
152
|
ultralytics/models/yolo/detect/__init__.py,sha256=JR8gZJWn7wMBbh-0j_073nxJVZTMFZVWTOG5Wnvk6w0,229
|
153
153
|
ultralytics/models/yolo/detect/predict.py,sha256=-uZFLutxGYZX47RANcaxC-LFStRbv0nBv_8-ypadQoI,1471
|
154
|
-
ultralytics/models/yolo/detect/train.py,sha256=
|
155
|
-
ultralytics/models/yolo/detect/val.py,sha256=
|
154
|
+
ultralytics/models/yolo/detect/train.py,sha256=f-QwAxaRsdtY-KY9femcWLQt1wB1tAHu-QV0a13LOGA,6702
|
155
|
+
ultralytics/models/yolo/detect/val.py,sha256=Ydf0W7FPf-nSz_lOCTcIrlDqhG_kOK8Od6eYsGQDx9U,15144
|
156
156
|
ultralytics/models/yolo/obb/__init__.py,sha256=txWbPGLY1_M7ZwlLQjrwGjTBOlsv9P3yk5ZEgysTinU,193
|
157
157
|
ultralytics/models/yolo/obb/predict.py,sha256=VxpKCKV5dWnOr0GyV1rJGH5SzzRouCYW_8T26xJ8MU8,2037
|
158
158
|
ultralytics/models/yolo/obb/train.py,sha256=_FVYCvHJ5ECi2aN8k7AmVLxRUuun7acSqwWtCBRuL6Q,1473
|
@@ -160,11 +160,11 @@ ultralytics/models/yolo/obb/val.py,sha256=dgKJnGKfdBpYMXsM1_MN2chONd2O6E3hEnITuT
|
|
160
160
|
ultralytics/models/yolo/pose/__init__.py,sha256=OGvxN3LqJot2h8GX1csJ1KErsHnDKsm33Ce6ZBU9Lr4,199
|
161
161
|
ultralytics/models/yolo/pose/predict.py,sha256=cpTe4vTI3etnGCgyMcvxbF0cMNetiWXUwhsipEFX-KQ,2365
|
162
162
|
ultralytics/models/yolo/pose/train.py,sha256=mUC1GaYmRBTvXQsL-uNdcdANoIXdeGGBRdgOKkqRIRI,2926
|
163
|
-
ultralytics/models/yolo/pose/val.py,sha256=
|
163
|
+
ultralytics/models/yolo/pose/val.py,sha256=uAZkNGYvivhpm83y7kgv7cOsgp762kd2GC_8pfQ-Kyk,12382
|
164
164
|
ultralytics/models/yolo/segment/__init__.py,sha256=mSbKOE8BnHL7PL2nCOVG7dRM7CI6hJezFPPwZFjEmy8,247
|
165
165
|
ultralytics/models/yolo/segment/predict.py,sha256=UAzSIc7xlZKr9PVMWS63X4ySUg9QmMh8tHtdfd7D-nk,2468
|
166
166
|
ultralytics/models/yolo/segment/train.py,sha256=UTGGSInq_yuQuNm0wdrVruyiGe04fAZv5v1WMqQl9Ys,2298
|
167
|
-
ultralytics/models/yolo/segment/val.py,sha256=
|
167
|
+
ultralytics/models/yolo/segment/val.py,sha256=LIq3gJTX2VqXwZ3MehBVMXMT-Ga1detezw4h-iwdTao,14052
|
168
168
|
ultralytics/models/yolo/world/__init__.py,sha256=3VTH0q4NOt2EWRom15yCymvmvm0Etp2bmETJUhsVTBI,103
|
169
169
|
ultralytics/models/yolo/world/train.py,sha256=gaDrAmLJpg9qDtmL5evA5HsV2yb4RTRSfk2EDYrHdRg,3686
|
170
170
|
ultralytics/models/yolo/world/train_world.py,sha256=IsnCEVt6DcM9lUskCKmIN-M8MM79xLpwTRqRoAHUnZ4,4857
|
@@ -178,15 +178,16 @@ ultralytics/nn/modules/conv.py,sha256=vOeHZ6Z4sc6-9PrDmRGT1hFkxSBbbWkQm2jRbGGjpq
|
|
178
178
|
ultralytics/nn/modules/head.py,sha256=KCO-qarg2K7uJqQ7L5zVJ4-viiHqmu4bzbSgAw3L_nk,27815
|
179
179
|
ultralytics/nn/modules/transformer.py,sha256=tGiK8NmPfswwW1rbF21r5ILUkkZQ6Nk4s8j16vFBmps,18069
|
180
180
|
ultralytics/nn/modules/utils.py,sha256=a88cKl2wz1nMVSEBiajtvaCbDBQIkESWOKTZ_WAJy90,3195
|
181
|
-
ultralytics/solutions/__init__.py,sha256=
|
181
|
+
ultralytics/solutions/__init__.py,sha256=4i8QCABfxRWPYUEdb58Pbg1xvR_Ra1u-ifB9fx21UUs,711
|
182
182
|
ultralytics/solutions/ai_gym.py,sha256=Jb9Rbd9gOOj2ox4Q5mqalCdvg3RMXA6Cxe5kS18IFgA,5232
|
183
|
-
ultralytics/solutions/analytics.py,sha256=
|
183
|
+
ultralytics/solutions/analytics.py,sha256=C57pIghXeKN8hul8QOV7W9YDMpfFfSfPTBb-lE9HeAc,11535
|
184
184
|
ultralytics/solutions/distance_calculation.py,sha256=KN3CC-dm2dTQylj79IrifCJT8ZhE7hc2EweH3KK31mE,5461
|
185
185
|
ultralytics/solutions/heatmap.py,sha256=If9rosSCmE7pAL1HtVnLkx05gQp6nP1K6HzATMcaEEE,5372
|
186
186
|
ultralytics/solutions/object_counter.py,sha256=vKB7riRm8NjHA6IXyf557FpmV-b0_XoKbXHqMHziXSM,8264
|
187
187
|
ultralytics/solutions/parking_management.py,sha256=1DsEE94eauqcnnFxUYI-BX9eA1GbJVNt7oncj1okYpI,11198
|
188
188
|
ultralytics/solutions/queue_management.py,sha256=D9TqwJSVrZQFxp_M8O62WfBAxkAuDWWnXe7FFmnp7_w,4881
|
189
|
-
ultralytics/solutions/
|
189
|
+
ultralytics/solutions/region_counter.py,sha256=w0c0Sz9XG6rwzr5nA6nb1zFW8IVkTQuatfZNBtOik68,4947
|
190
|
+
ultralytics/solutions/solutions.py,sha256=XEXLQKBWCDdYyZLkmQMyFIqdOEzr4WTfWNajvgjlhmU,7275
|
190
191
|
ultralytics/solutions/speed_estimation.py,sha256=A10DmuZlGkoZUyfHhZWcDRjj1-9GXiDhEjyBbAzfaDs,4936
|
191
192
|
ultralytics/solutions/streamlit_inference.py,sha256=w4dnvSv2FOrpji9W1Ir86phka3OXc7jd_38-OCbQdZw,5701
|
192
193
|
ultralytics/trackers/__init__.py,sha256=j72IgH2dZHQArMPK4YwcV5ieIw94fYvlGdQjB9cOQKw,227
|
@@ -199,7 +200,7 @@ ultralytics/trackers/utils/gmc.py,sha256=VcURuY041qGCeWUGMxHZBr10T16LtcMqyv7AmTf
|
|
199
200
|
ultralytics/trackers/utils/kalman_filter.py,sha256=cH9zD3fwkuezP97H9mw8cSBN7a8hHKx_Sx1j7t3oYGs,21349
|
200
201
|
ultralytics/trackers/utils/matching.py,sha256=3Ie1WNNRZ4_q3365F03XD7Nr9juZB_08mw4yUKC3w74,7162
|
201
202
|
ultralytics/utils/__init__.py,sha256=08pFkzKn1eR9xdIFhx8tx_8MO-gqXjt2n0HGwDeUlWE,49159
|
202
|
-
ultralytics/utils/autobatch.py,sha256=
|
203
|
+
ultralytics/utils/autobatch.py,sha256=nt0nSNNhrQqvtaxeNBBYpU2OkZnI3ihNEAa3jF4pybo,4594
|
203
204
|
ultralytics/utils/benchmarks.py,sha256=aEW28iVIMj-8bwOgISDphOJExDmaGi5bz3G2PJlRjcc,25793
|
204
205
|
ultralytics/utils/checks.py,sha256=KXQSeauhzecy9tSjyDVy8oXbTDkHSSB9lOTYrqRWpok,29582
|
205
206
|
ultralytics/utils/dist.py,sha256=NDFga-uKxkBX2zLxFHSene_cCiGQJoyOeCXcN9JIOIk,2358
|
@@ -212,8 +213,8 @@ ultralytics/utils/metrics.py,sha256=msPaXc244ndc0NPBhnNlHsKkVhdc-TMgFn5NATlZZVI,
|
|
212
213
|
ultralytics/utils/ops.py,sha256=dsXNdyrYx_p6io6zezig9p84dxS7U-10vceHNVu2IL0,32888
|
213
214
|
ultralytics/utils/patches.py,sha256=J-iOwIRbfUs-inBZerhnXby5tUKjYcOIyvhLTS352JE,3270
|
214
215
|
ultralytics/utils/plotting.py,sha256=TKtdbAOl6gZdFD2hlA5T4LNWfr2LUWbCC-cXkgL1JAU,61089
|
215
|
-
ultralytics/utils/tal.py,sha256=
|
216
|
-
ultralytics/utils/torch_utils.py,sha256=
|
216
|
+
ultralytics/utils/tal.py,sha256=thD_AEhVmhaZqmS5szZMvpKO-RKOeZwfX1BYAhdnA0o,18470
|
217
|
+
ultralytics/utils/torch_utils.py,sha256=CfftLVZqCEgIOLtRsU4mytRJoHDiXd5ijzIqIVt-zZM,32070
|
217
218
|
ultralytics/utils/triton.py,sha256=gg1finxno_tY2Ge9PMhmu7PI9wvoFZoiicdT4Bhqv3w,3936
|
218
219
|
ultralytics/utils/tuner.py,sha256=K09-z5k1E4ZriSKoWdwQrJ2PJ2fY1ez3-b2R6aKPTqM,6198
|
219
220
|
ultralytics/utils/callbacks/__init__.py,sha256=YrWqC3BVVaTLob4iCPR6I36mUxIUOpPJW7B_LjT78Qw,214
|
@@ -227,9 +228,9 @@ ultralytics/utils/callbacks/neptune.py,sha256=IbGQfEltamUKXJt93uSLQFn8c2rYh3DMTg
|
|
227
228
|
ultralytics/utils/callbacks/raytune.py,sha256=Ck_yFzg7UZXiDWrLHaltjQybzVWSFDfzpdrx9ZYTRfI,700
|
228
229
|
ultralytics/utils/callbacks/tensorboard.py,sha256=SHlE58Fb-sg-uZKtgy-ybIO3SAIfK55aj8kTYGA0Cyg,4167
|
229
230
|
ultralytics/utils/callbacks/wb.py,sha256=oX3JarCJGhzvW556XiEXQNaZblAaK_UETAt3kzkY61w,6869
|
230
|
-
ultralytics-8.3.
|
231
|
-
ultralytics-8.3.
|
232
|
-
ultralytics-8.3.
|
233
|
-
ultralytics-8.3.
|
234
|
-
ultralytics-8.3.
|
235
|
-
ultralytics-8.3.
|
231
|
+
ultralytics-8.3.31.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
|
232
|
+
ultralytics-8.3.31.dist-info/METADATA,sha256=pCRq3cWOvmofljRT9bsJ0P_x0Mtk2uNQXQUHZf8scO8,35213
|
233
|
+
ultralytics-8.3.31.dist-info/WHEEL,sha256=R06PA3UVYHThwHvxuRWMqaGcr-PuniXahwjmQRFMEkY,91
|
234
|
+
ultralytics-8.3.31.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
|
235
|
+
ultralytics-8.3.31.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
|
236
|
+
ultralytics-8.3.31.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|