ultralytics 8.3.49__py3-none-any.whl → 8.3.51__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/solutions/default.yaml +3 -0
- ultralytics/data/dataset.py +4 -2
- ultralytics/engine/model.py +2 -2
- ultralytics/engine/tuner.py +1 -1
- ultralytics/engine/validator.py +1 -1
- ultralytics/models/sam/modules/sam.py +3 -3
- ultralytics/models/yolo/obb/train.py +3 -1
- ultralytics/solutions/__init__.py +2 -0
- ultralytics/solutions/security_alarm.py +141 -0
- ultralytics/utils/autobatch.py +13 -5
- ultralytics/utils/instance.py +15 -2
- ultralytics/utils/ops.py +2 -0
- {ultralytics-8.3.49.dist-info → ultralytics-8.3.51.dist-info}/METADATA +1 -1
- {ultralytics-8.3.49.dist-info → ultralytics-8.3.51.dist-info}/RECORD +19 -18
- {ultralytics-8.3.49.dist-info → ultralytics-8.3.51.dist-info}/LICENSE +0 -0
- {ultralytics-8.3.49.dist-info → ultralytics-8.3.51.dist-info}/WHEEL +0 -0
- {ultralytics-8.3.49.dist-info → ultralytics-8.3.51.dist-info}/entry_points.txt +0 -0
- {ultralytics-8.3.49.dist-info → ultralytics-8.3.51.dist-info}/top_level.txt +0 -0
ultralytics/__init__.py
CHANGED
@@ -17,3 +17,6 @@ kpts: [6, 8, 10] # Keypoints for workouts monitoring, i.e. If you want to consid
|
|
17
17
|
# Analytics settings
|
18
18
|
analytics_type: "line" # Analytics type i.e "line", "pie", "bar" or "area" charts. By default, "line" analytics will be used for processing.
|
19
19
|
json_file: # parking system regions file path.
|
20
|
+
|
21
|
+
# Security alarm system
|
22
|
+
records: 5 # Total detections count to send an email about security
|
ultralytics/data/dataset.py
CHANGED
@@ -218,8 +218,10 @@ class YOLODataset(BaseDataset):
|
|
218
218
|
# NOTE: do NOT resample oriented boxes
|
219
219
|
segment_resamples = 100 if self.use_obb else 1000
|
220
220
|
if len(segments) > 0:
|
221
|
-
#
|
222
|
-
|
221
|
+
# make sure segments interpolate correctly if original length is greater than segment_resamples
|
222
|
+
max_len = max([len(s) for s in segments])
|
223
|
+
segment_resamples = (max_len + 1) if segment_resamples < max_len else segment_resamples
|
224
|
+
# list[np.array(segment_resamples, 2)] * num_samples
|
223
225
|
segments = np.stack(resample_segments(segments, n=segment_resamples), axis=0)
|
224
226
|
else:
|
225
227
|
segments = np.zeros((0, segment_resamples, 2), dtype=np.float32)
|
ultralytics/engine/model.py
CHANGED
@@ -115,7 +115,7 @@ class Model(nn.Module):
|
|
115
115
|
self.predictor = None # reuse predictor
|
116
116
|
self.model = None # model object
|
117
117
|
self.trainer = None # trainer object
|
118
|
-
self.ckpt =
|
118
|
+
self.ckpt = {} # if loaded from *.pt
|
119
119
|
self.cfg = None # if loaded from *.yaml
|
120
120
|
self.ckpt_path = None
|
121
121
|
self.overrides = {} # overrides for trainer object
|
@@ -807,7 +807,7 @@ class Model(nn.Module):
|
|
807
807
|
# Update model and cfg after training
|
808
808
|
if RANK in {-1, 0}:
|
809
809
|
ckpt = self.trainer.best if self.trainer.best.exists() else self.trainer.last
|
810
|
-
self.model,
|
810
|
+
self.model, self.ckpt = attempt_load_one_weight(ckpt)
|
811
811
|
self.overrides = self.model.args
|
812
812
|
self.metrics = getattr(self.trainer.validator, "metrics", None) # TODO: no metrics returned by DDP
|
813
813
|
return self.metrics
|
ultralytics/engine/tuner.py
CHANGED
@@ -191,7 +191,7 @@ class Tuner:
|
|
191
191
|
try:
|
192
192
|
# Train YOLO model with mutated hyperparameters (run in subprocess to avoid dataloader hang)
|
193
193
|
cmd = ["yolo", "train", *(f"{k}={v}" for k, v in train_args.items())]
|
194
|
-
return_code = subprocess.run(cmd, check=True).returncode
|
194
|
+
return_code = subprocess.run(" ".join(cmd), check=True, shell=True).returncode
|
195
195
|
ckpt_file = weights_dir / ("best.pt" if (weights_dir / "best.pt").exists() else "last.pt")
|
196
196
|
metrics = torch.load(ckpt_file)["train_metrics"]
|
197
197
|
assert return_code == 0, "training failed"
|
ultralytics/engine/validator.py
CHANGED
@@ -120,7 +120,7 @@ class BaseValidator:
|
|
120
120
|
self.args.plots &= trainer.stopper.possible_stop or (trainer.epoch == trainer.epochs - 1)
|
121
121
|
model.eval()
|
122
122
|
else:
|
123
|
-
if str(self.args.model).endswith(".yaml"):
|
123
|
+
if str(self.args.model).endswith(".yaml") and model is None:
|
124
124
|
LOGGER.warning("WARNING ⚠️ validating an untrained model YAML will result in 0 mAP.")
|
125
125
|
callbacks.add_integration_callbacks(self)
|
126
126
|
model = AutoBackend(
|
@@ -685,11 +685,11 @@ class SAM2Model(torch.nn.Module):
|
|
685
685
|
if prev is None:
|
686
686
|
continue # skip padding frames
|
687
687
|
# "maskmem_features" might have been offloaded to CPU in demo use cases,
|
688
|
-
# so we load it back to
|
689
|
-
feats = prev["maskmem_features"].
|
688
|
+
# so we load it back to inference device (it's a no-op if it's already on device).
|
689
|
+
feats = prev["maskmem_features"].to(device=device, non_blocking=True)
|
690
690
|
to_cat_memory.append(feats.flatten(2).permute(2, 0, 1))
|
691
691
|
# Spatial positional encoding (it might have been offloaded to CPU in eval)
|
692
|
-
maskmem_enc = prev["maskmem_pos_enc"][-1].
|
692
|
+
maskmem_enc = prev["maskmem_pos_enc"][-1].to(device=device)
|
693
693
|
maskmem_enc = maskmem_enc.flatten(2).permute(2, 0, 1)
|
694
694
|
# Temporal positional encoding
|
695
695
|
maskmem_enc = maskmem_enc + self.maskmem_tpos_enc[self.num_maskmem - t_pos - 1]
|
@@ -39,4 +39,6 @@ class OBBTrainer(yolo.detect.DetectionTrainer):
|
|
39
39
|
def get_validator(self):
|
40
40
|
"""Return an instance of OBBValidator for validation of YOLO model."""
|
41
41
|
self.loss_names = "box_loss", "cls_loss", "dfl_loss"
|
42
|
-
return yolo.obb.OBBValidator(
|
42
|
+
return yolo.obb.OBBValidator(
|
43
|
+
self.test_loader, save_dir=self.save_dir, args=copy(self.args), _callbacks=self.callbacks
|
44
|
+
)
|
@@ -8,6 +8,7 @@ from .object_counter import ObjectCounter
|
|
8
8
|
from .parking_management import ParkingManagement, ParkingPtsSelection
|
9
9
|
from .queue_management import QueueManager
|
10
10
|
from .region_counter import RegionCounter
|
11
|
+
from .security_alarm import SecurityAlarm
|
11
12
|
from .speed_estimation import SpeedEstimator
|
12
13
|
from .streamlit_inference import inference
|
13
14
|
from .trackzone import TrackZone
|
@@ -25,4 +26,5 @@ __all__ = (
|
|
25
26
|
"inference",
|
26
27
|
"RegionCounter",
|
27
28
|
"TrackZone",
|
29
|
+
"SecurityAlarm",
|
28
30
|
)
|
@@ -0,0 +1,141 @@
|
|
1
|
+
# Ultralytics YOLO 🚀, AGPL-3.0 license
|
2
|
+
|
3
|
+
from ultralytics.solutions.solutions import LOGGER, BaseSolution
|
4
|
+
from ultralytics.utils.plotting import Annotator, colors
|
5
|
+
|
6
|
+
|
7
|
+
class SecurityAlarm(BaseSolution):
|
8
|
+
"""
|
9
|
+
A class to manage security alarm functionalities for real-time monitoring.
|
10
|
+
|
11
|
+
This class extends the BaseSolution class and provides features to monitor
|
12
|
+
objects in a frame, send email notifications when specific thresholds are
|
13
|
+
exceeded for total detections, and annotate the output frame for visualization.
|
14
|
+
|
15
|
+
Attributes:
|
16
|
+
email_sent (bool): Flag to track if an email has already been sent for the current event.
|
17
|
+
records (int): Threshold for the number of detected objects to trigger an alert.
|
18
|
+
|
19
|
+
Methods:
|
20
|
+
authenticate: Sets up email server authentication for sending alerts.
|
21
|
+
send_email: Sends an email notification with details and an image attachment.
|
22
|
+
monitor: Monitors the frame, processes detections, and triggers alerts if thresholds are crossed.
|
23
|
+
|
24
|
+
Examples:
|
25
|
+
>>> security = SecurityAlarm()
|
26
|
+
>>> security.authenticate("abc@gmail.com", "1111222233334444", "xyz@gmail.com")
|
27
|
+
>>> frame = cv2.imread("frame.jpg")
|
28
|
+
>>> processed_frame = security.monitor(frame)
|
29
|
+
"""
|
30
|
+
|
31
|
+
def __init__(self, **kwargs):
|
32
|
+
"""Initializes the SecurityAlarm class with parameters for real-time object monitoring."""
|
33
|
+
super().__init__(**kwargs)
|
34
|
+
self.email_sent = False
|
35
|
+
self.records = self.CFG["records"]
|
36
|
+
|
37
|
+
def authenticate(self, from_email, password, to_email):
|
38
|
+
"""
|
39
|
+
Authenticates the email server for sending alert notifications.
|
40
|
+
|
41
|
+
Args:
|
42
|
+
from_email (str): Sender's email address.
|
43
|
+
password (str): Password for the sender's email account.
|
44
|
+
to_email (str): Recipient's email address.
|
45
|
+
|
46
|
+
This method initializes a secure connection with the SMTP server
|
47
|
+
and logs in using the provided credentials.
|
48
|
+
|
49
|
+
Examples:
|
50
|
+
>>> alarm = SecurityAlarm()
|
51
|
+
>>> alarm.authenticate("sender@example.com", "password123", "recipient@example.com")
|
52
|
+
"""
|
53
|
+
import smtplib
|
54
|
+
|
55
|
+
self.server = smtplib.SMTP("smtp.gmail.com: 587")
|
56
|
+
self.server.starttls()
|
57
|
+
self.server.login(from_email, password)
|
58
|
+
self.to_email = to_email
|
59
|
+
self.from_email = from_email
|
60
|
+
|
61
|
+
def send_email(self, im0, records=5):
|
62
|
+
"""
|
63
|
+
Sends an email notification with an image attachment indicating the number of objects detected.
|
64
|
+
|
65
|
+
Args:
|
66
|
+
im0 (numpy.ndarray): The input image or frame to be attached to the email.
|
67
|
+
records (int): The number of detected objects to be included in the email message.
|
68
|
+
|
69
|
+
This method encodes the input image, composes the email message with
|
70
|
+
details about the detection, and sends it to the specified recipient.
|
71
|
+
|
72
|
+
Examples:
|
73
|
+
>>> alarm = SecurityAlarm()
|
74
|
+
>>> frame = cv2.imread("path/to/image.jpg")
|
75
|
+
>>> alarm.send_email(frame, records=10)
|
76
|
+
"""
|
77
|
+
from email.mime.image import MIMEImage
|
78
|
+
from email.mime.multipart import MIMEMultipart
|
79
|
+
from email.mime.text import MIMEText
|
80
|
+
|
81
|
+
import cv2
|
82
|
+
|
83
|
+
img_bytes = cv2.imencode(".jpg", im0)[1].tobytes() # Encode the image as JPEG
|
84
|
+
|
85
|
+
# Create the email
|
86
|
+
message = MIMEMultipart()
|
87
|
+
message["From"] = self.from_email
|
88
|
+
message["To"] = self.to_email
|
89
|
+
message["Subject"] = "Security Alert"
|
90
|
+
|
91
|
+
# Add the text message body
|
92
|
+
message_body = f"Ultralytics ALERT!!! " f"{records} objects have been detected!!"
|
93
|
+
message.attach(MIMEText(message_body, "plain"))
|
94
|
+
|
95
|
+
# Attach the image
|
96
|
+
image_attachment = MIMEImage(img_bytes, name="ultralytics.jpg")
|
97
|
+
message.attach(image_attachment)
|
98
|
+
|
99
|
+
# Send the email
|
100
|
+
try:
|
101
|
+
self.server.send_message(message)
|
102
|
+
LOGGER.info("✅ Email sent successfully!")
|
103
|
+
except Exception as e:
|
104
|
+
print(f"❌ Failed to send email: {e}")
|
105
|
+
|
106
|
+
def monitor(self, im0):
|
107
|
+
"""
|
108
|
+
Monitors the frame, processes object detections, and triggers alerts if thresholds are exceeded.
|
109
|
+
|
110
|
+
Args:
|
111
|
+
im0 (numpy.ndarray): The input image or frame to be processed and annotated.
|
112
|
+
|
113
|
+
This method processes the input frame, extracts detections, annotates the frame
|
114
|
+
with bounding boxes, and sends an email notification if the number of detected objects
|
115
|
+
surpasses the specified threshold and an alert has not already been sent.
|
116
|
+
|
117
|
+
Returns:
|
118
|
+
(numpy.ndarray): The processed frame with annotations.
|
119
|
+
|
120
|
+
Examples:
|
121
|
+
>>> alarm = SecurityAlarm()
|
122
|
+
>>> frame = cv2.imread("path/to/image.jpg")
|
123
|
+
>>> processed_frame = alarm.monitor(frame)
|
124
|
+
"""
|
125
|
+
self.annotator = Annotator(im0, line_width=self.line_width) # Initialize annotator
|
126
|
+
self.extract_tracks(im0) # Extract tracks
|
127
|
+
|
128
|
+
# Iterate over bounding boxes, track ids and classes index
|
129
|
+
for box, cls in zip(self.boxes, self.clss):
|
130
|
+
# Draw bounding box
|
131
|
+
self.annotator.box_label(box, label=self.names[cls], color=colors(cls, True))
|
132
|
+
|
133
|
+
total_det = len(self.clss)
|
134
|
+
if total_det > self.records: # Only send email If not sent before
|
135
|
+
if not self.email_sent:
|
136
|
+
self.send_email(im0, total_det)
|
137
|
+
self.email_sent = True
|
138
|
+
|
139
|
+
self.display_output(im0) # display output with base class function
|
140
|
+
|
141
|
+
return im0 # return output image for more usage
|
ultralytics/utils/autobatch.py
CHANGED
@@ -77,18 +77,26 @@ def autobatch(model, imgsz=640, fraction=0.60, batch_size=DEFAULT_CFG.batch, max
|
|
77
77
|
results = profile(img, model, n=1, device=device, max_num_obj=max_num_obj)
|
78
78
|
|
79
79
|
# Fit a solution
|
80
|
-
|
81
|
-
|
82
|
-
|
80
|
+
xy = [
|
81
|
+
[x, y[2]]
|
82
|
+
for i, (x, y) in enumerate(zip(batch_sizes, results))
|
83
|
+
if y # valid result
|
84
|
+
and isinstance(y[2], (int, float)) # is numeric
|
85
|
+
and 0 < y[2] < t # between 0 and GPU limit
|
86
|
+
and (i == 0 or not results[i - 1] or y[2] > results[i - 1][2]) # first item or increasing memory
|
87
|
+
]
|
88
|
+
fit_x, fit_y = zip(*xy) if xy else ([], [])
|
89
|
+
p = np.polyfit(np.log(fit_x), np.log(fit_y), deg=1) # first-degree polynomial fit in log space
|
90
|
+
b = int(round(np.exp((np.log(f * fraction) - p[1]) / p[0]))) # y intercept (optimal batch size)
|
83
91
|
if None in results: # some sizes failed
|
84
92
|
i = results.index(None) # first fail index
|
85
93
|
if b >= batch_sizes[i]: # y intercept above failure point
|
86
94
|
b = batch_sizes[max(i - 1, 0)] # select prior safe point
|
87
95
|
if b < 1 or b > 1024: # b outside of safe range
|
96
|
+
LOGGER.info(f"{prefix}WARNING ⚠️ batch={b} outside safe range, using default batch-size {batch_size}.")
|
88
97
|
b = batch_size
|
89
|
-
LOGGER.info(f"{prefix}WARNING ⚠️ CUDA anomaly detected, using default batch-size {batch_size}.")
|
90
98
|
|
91
|
-
fraction = (np.polyval(p, b) + r + a) / t #
|
99
|
+
fraction = (np.exp(np.polyval(p, np.log(b))) + r + a) / t # predicted fraction
|
92
100
|
LOGGER.info(f"{prefix}Using batch-size {b} for {d} {t * fraction:.2f}G/{t:.2f}G ({fraction * 100:.0f}%) ✅")
|
93
101
|
return b
|
94
102
|
except Exception as e:
|
ultralytics/utils/instance.py
CHANGED
@@ -7,7 +7,7 @@ from typing import List
|
|
7
7
|
|
8
8
|
import numpy as np
|
9
9
|
|
10
|
-
from .ops import ltwh2xywh, ltwh2xyxy, xywh2ltwh, xywh2xyxy, xyxy2ltwh, xyxy2xywh
|
10
|
+
from .ops import ltwh2xywh, ltwh2xyxy, resample_segments, xywh2ltwh, xywh2xyxy, xyxy2ltwh, xyxy2xywh
|
11
11
|
|
12
12
|
|
13
13
|
def _ntuple(n):
|
@@ -406,7 +406,20 @@ class Instances:
|
|
406
406
|
normalized = instances_list[0].normalized
|
407
407
|
|
408
408
|
cat_boxes = np.concatenate([ins.bboxes for ins in instances_list], axis=axis)
|
409
|
-
|
409
|
+
seg_len = [b.segments.shape[1] for b in instances_list]
|
410
|
+
if len(set(seg_len)) > 1: # resample segments if there's different length
|
411
|
+
max_len = max(seg_len)
|
412
|
+
cat_segments = np.concatenate(
|
413
|
+
[
|
414
|
+
resample_segments(list(b.segments), max_len)
|
415
|
+
if len(b.segments)
|
416
|
+
else np.zeros((0, max_len, 2), dtype=np.float32) # re-generating empty segments
|
417
|
+
for b in instances_list
|
418
|
+
],
|
419
|
+
axis=axis,
|
420
|
+
)
|
421
|
+
else:
|
422
|
+
cat_segments = np.concatenate([b.segments for b in instances_list], axis=axis)
|
410
423
|
cat_keypoints = np.concatenate([b.keypoints for b in instances_list], axis=axis) if use_keypoint else None
|
411
424
|
return cls(cat_boxes, cat_segments, cat_keypoints, bbox_format, normalized)
|
412
425
|
|
ultralytics/utils/ops.py
CHANGED
@@ -624,6 +624,8 @@ def resample_segments(segments, n=1000):
|
|
624
624
|
segments (list): the resampled segments.
|
625
625
|
"""
|
626
626
|
for i, s in enumerate(segments):
|
627
|
+
if len(s) == n:
|
628
|
+
continue
|
627
629
|
s = np.concatenate((s, s[0:1, :]), axis=0)
|
628
630
|
x = np.linspace(0, len(s) - 1, n - len(s) if len(s) < n else n)
|
629
631
|
xp = np.arange(len(s))
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: ultralytics
|
3
|
-
Version: 8.3.
|
3
|
+
Version: 8.3.51
|
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,7 +7,7 @@ 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=IfHAXqilpYxWNmIE6rAWWUSeIYS6SBO9AkXGHDGZTvA,23182
|
9
9
|
tests/test_solutions.py,sha256=HlDe-XOgBX0k1cLhRTAhhawMHk6p-5dg5xl2AIRjfdk,3790
|
10
|
-
ultralytics/__init__.py,sha256=
|
10
|
+
ultralytics/__init__.py,sha256=N_1YdKbgbRhGjif32J6eXAFEks3rnGA2wmIqlcWYx84,681
|
11
11
|
ultralytics/assets/bus.jpg,sha256=wCAZxJecGR63Od3ZRERe9Aja1Weayrb9Ug751DS_vGM,137419
|
12
12
|
ultralytics/assets/zidane.jpg,sha256=Ftc4aeMmen1O0A3o6GCDO9FlfBslLpTAw0gnetx7bts,50427
|
13
13
|
ultralytics/cfg/__init__.py,sha256=etGrRb8t9r6R-n-00qFAmOZHXNriXEUe0zvEzCPi5oc,38921
|
@@ -86,7 +86,7 @@ ultralytics/cfg/models/v9/yolov9e.yaml,sha256=dhaR47WxuLOrZWDCceS4bQG00sQdrMc8FQ
|
|
86
86
|
ultralytics/cfg/models/v9/yolov9m.yaml,sha256=l6CmivzNu44sRVmkQXk4-tXflbV1nWnk5MSc8su2vhs,1311
|
87
87
|
ultralytics/cfg/models/v9/yolov9s.yaml,sha256=lPWcu-6ub1kCBD6zIDFwthYZ3RvdJfODWKy3vEQWRjo,1291
|
88
88
|
ultralytics/cfg/models/v9/yolov9t.yaml,sha256=qL__kr6GoefpQWP4jV0jdzwTp46bdFUcqtPRnfDbkY8,1275
|
89
|
-
ultralytics/cfg/solutions/default.yaml,sha256=
|
89
|
+
ultralytics/cfg/solutions/default.yaml,sha256=YaCj0YRRfkwJGf7bRN0idUJrWROq3T6lJE-IR14D5_c,1332
|
90
90
|
ultralytics/cfg/trackers/botsort.yaml,sha256=FDIrZ3hAhRtMfDl654pt1HIexmPqlFQK-3lQ4D0tF84,918
|
91
91
|
ultralytics/cfg/trackers/bytetrack.yaml,sha256=rBWY4RjjX6PTO2o6TUJFYHVgXNZHCN5TuBuzwuPYVjA,723
|
92
92
|
ultralytics/data/__init__.py,sha256=VGe-ATG7j35F4A4r8Jmzffjlhve4JAJPgRa5ahKTU18,616
|
@@ -95,18 +95,18 @@ ultralytics/data/augment.py,sha256=Cfa3cufMjNMBqnzSpCFrF7IjR5B-NkpOJ6NwpVdEAWo,1
|
|
95
95
|
ultralytics/data/base.py,sha256=ZCIhAyFfxXVp5fVnYD8mwbksNALJTayBKIR5FKGV7ZM,15168
|
96
96
|
ultralytics/data/build.py,sha256=AfMmz0sHIYmwry_90tEJFRk_kz0S3SolScVXqYHiT08,7261
|
97
97
|
ultralytics/data/converter.py,sha256=RIfTXNrazwZqmTYOYoJtupDMtNzm8dxsrVp6q2m8gyg,24388
|
98
|
-
ultralytics/data/dataset.py,sha256=
|
98
|
+
ultralytics/data/dataset.py,sha256=pVNs7484LusQ3IwcEcNeGiZfNrSvhw0K5K4JT35Ljh0,23184
|
99
99
|
ultralytics/data/loaders.py,sha256=k1Vq7Rxv6tpsRsYuMdZeI3_f2BciAaZwhDQU8iHhVJM,28506
|
100
100
|
ultralytics/data/split_dota.py,sha256=eFafJ7Vg52wj6KDCHFJAf1tKzyPD5YaPB8kM4VX5Aeg,10688
|
101
101
|
ultralytics/data/utils.py,sha256=bmWEIrdogj4kssZQSJdSbIF8QsJU00lo-EY-Mgcqv4M,31073
|
102
102
|
ultralytics/engine/__init__.py,sha256=mHtJuK4hwF8cuV-VHDc7tp6u6D1gHz2Z7JI8grmQDTs,42
|
103
103
|
ultralytics/engine/exporter.py,sha256=EMrdP8Ra5VnmNEUjustWOvgrH1C4vgwz0L0frjZRSJY,67054
|
104
|
-
ultralytics/engine/model.py,sha256
|
104
|
+
ultralytics/engine/model.py,sha256=l5UiXGBa4ox9BXq0dc6eUsOvd85Q4KHUxGCwY2dfXQE,53113
|
105
105
|
ultralytics/engine/predictor.py,sha256=o1RYMFH3_uVOMCIXXakpRYpNzoD-6Bdsxryt5fuBni0,17712
|
106
106
|
ultralytics/engine/results.py,sha256=a1XFZRPwqgKDBOEAibHuT9nP2xefLiWVsMoBJbcr4iA,75058
|
107
107
|
ultralytics/engine/trainer.py,sha256=Cd95QLJ3C4fncoOX1YgauLA9aWVYRd1G6x0Au2xX86k,37335
|
108
|
-
ultralytics/engine/tuner.py,sha256=
|
109
|
-
ultralytics/engine/validator.py,sha256=
|
108
|
+
ultralytics/engine/tuner.py,sha256=0E0I3wOj1egLs-fwCB32_a6USVLUuDk_g6RaBhs0mJw,11860
|
109
|
+
ultralytics/engine/validator.py,sha256=fCBTYHwXAT6u4Pq-UYYZDZCwHjjB9ZWzFUdsENDt_Is,14888
|
110
110
|
ultralytics/hub/__init__.py,sha256=c6Me4E8V-P7mtzTggyPYz9FnVkqWRyPp9F-fMcyFNQ0,5632
|
111
111
|
ultralytics/hub/auth.py,sha256=pj_2NijotQpyG4_VJ6EAzNWGD93L6t-34J60yfiNZPc,5541
|
112
112
|
ultralytics/hub/session.py,sha256=2KznO5kX14HFZ2-Ct9LoG312sdHuigQSLZb58MGvbJY,16411
|
@@ -137,7 +137,7 @@ ultralytics/models/sam/modules/blocks.py,sha256=Q-KwhFbdyZhl1tjG_kP2LcQkZbzoNt61
|
|
137
137
|
ultralytics/models/sam/modules/decoders.py,sha256=mODsqnTN_CjE3H0Sh9cd8PfTnHANPjGB1bjqHxfezSg,25830
|
138
138
|
ultralytics/models/sam/modules/encoders.py,sha256=Ay3sYeUonCf6URXBdB0dDwyngovevW8hUDgULRnNIoA,34824
|
139
139
|
ultralytics/models/sam/modules/memory_attention.py,sha256=XilWBnRfH8wZxIoL2-yEk-dRypCsS0Jf_9t8WJxXKg0,9722
|
140
|
-
ultralytics/models/sam/modules/sam.py,sha256=
|
140
|
+
ultralytics/models/sam/modules/sam.py,sha256=Rmg9teVlZo-Iu5BhlBtHsmwzxJqXRGs0deAp9Ijp2-0,52725
|
141
141
|
ultralytics/models/sam/modules/tiny_encoder.py,sha256=NyzeFMLnmqwcFQFs-JBM9PCWSsYoYZ_6h59Un1DeDV0,41332
|
142
142
|
ultralytics/models/sam/modules/transformer.py,sha256=nuhF_14LGrr5uYCAP9XCXps-zlVcT4OWO0evXWDxPwI,16081
|
143
143
|
ultralytics/models/sam/modules/utils.py,sha256=Y36V6BVy6GeaAvKE8gHmoDIa-f5LjJpmSVwywNkv2yk,12315
|
@@ -156,7 +156,7 @@ ultralytics/models/yolo/detect/train.py,sha256=LKCcQTAsXm3-TPK2zkE1YJhbAcS65qhY2
|
|
156
156
|
ultralytics/models/yolo/detect/val.py,sha256=MV7U81vqj8tR8NYdeexFqRK2lxXwcRclvRqzRfeLJGM,15066
|
157
157
|
ultralytics/models/yolo/obb/__init__.py,sha256=txWbPGLY1_M7ZwlLQjrwGjTBOlsv9P3yk5ZEgysTinU,193
|
158
158
|
ultralytics/models/yolo/obb/predict.py,sha256=VxpKCKV5dWnOr0GyV1rJGH5SzzRouCYW_8T26xJ8MU8,2037
|
159
|
-
ultralytics/models/yolo/obb/train.py,sha256=
|
159
|
+
ultralytics/models/yolo/obb/train.py,sha256=vN7p_ec8rHhA0AeKvVUNzaSGG4O30UGlMh6Qk7bCkhQ,1522
|
160
160
|
ultralytics/models/yolo/obb/val.py,sha256=ARha7rJmf12wM1neVi7VX6ejorXrjUMNUpx9dDvRmYU,9337
|
161
161
|
ultralytics/models/yolo/pose/__init__.py,sha256=OGvxN3LqJot2h8GX1csJ1KErsHnDKsm33Ce6ZBU9Lr4,199
|
162
162
|
ultralytics/models/yolo/pose/predict.py,sha256=cpTe4vTI3etnGCgyMcvxbF0cMNetiWXUwhsipEFX-KQ,2365
|
@@ -179,7 +179,7 @@ ultralytics/nn/modules/conv.py,sha256=DPLZCRno_ZOjsuajAXIq-GbJdOh2jp1WayRXfDEd8z
|
|
179
179
|
ultralytics/nn/modules/head.py,sha256=yZdDr71pWm-vB18XrNkbX35o3q4o4mhzrfJz6yVh9m4,27934
|
180
180
|
ultralytics/nn/modules/transformer.py,sha256=tGiK8NmPfswwW1rbF21r5ILUkkZQ6Nk4s8j16vFBmps,18069
|
181
181
|
ultralytics/nn/modules/utils.py,sha256=a88cKl2wz1nMVSEBiajtvaCbDBQIkESWOKTZ_WAJy90,3195
|
182
|
-
ultralytics/solutions/__init__.py,sha256=
|
182
|
+
ultralytics/solutions/__init__.py,sha256=zsW-vYzuKM6QGfpEPACcK4RYx-MmoDiW1GjyHCQ_a64,824
|
183
183
|
ultralytics/solutions/ai_gym.py,sha256=Jv8ERJqcSjQeFh78zCAH2XnXoTIngCK7X_7XOQ6cPzs,5255
|
184
184
|
ultralytics/solutions/analytics.py,sha256=C57pIghXeKN8hul8QOV7W9YDMpfFfSfPTBb-lE9HeAc,11535
|
185
185
|
ultralytics/solutions/distance_calculation.py,sha256=KN3CC-dm2dTQylj79IrifCJT8ZhE7hc2EweH3KK31mE,5461
|
@@ -188,6 +188,7 @@ ultralytics/solutions/object_counter.py,sha256=MuxQG4a22458WwciAB96m5AxVXwH98AIW
|
|
188
188
|
ultralytics/solutions/parking_management.py,sha256=Hh28FTuP_TaO7x5RadYm-JSVJuEu1M2SSgHqgdYYtr8,11198
|
189
189
|
ultralytics/solutions/queue_management.py,sha256=lIHBgdMSKmGGPrICY2HC01_Ofad-vu4AnaGAqH-DxMs,4931
|
190
190
|
ultralytics/solutions/region_counter.py,sha256=w0c0Sz9XG6rwzr5nA6nb1zFW8IVkTQuatfZNBtOik68,4947
|
191
|
+
ultralytics/solutions/security_alarm.py,sha256=NgOt5qcz9RrzUw9RDuXKyYxYfJM_XDZ0trizbJ1Y8v4,5588
|
191
192
|
ultralytics/solutions/solutions.py,sha256=BqkMDAq9A8kqL4TkjHLkMYXrJAdZPK-VAdNSObS1kNQ,7502
|
192
193
|
ultralytics/solutions/speed_estimation.py,sha256=A10DmuZlGkoZUyfHhZWcDRjj1-9GXiDhEjyBbAzfaDs,4936
|
193
194
|
ultralytics/solutions/streamlit_inference.py,sha256=w4dnvSv2FOrpji9W1Ir86phka3OXc7jd_38-OCbQdZw,5701
|
@@ -202,17 +203,17 @@ ultralytics/trackers/utils/gmc.py,sha256=VcURuY041qGCeWUGMxHZBr10T16LtcMqyv7AmTf
|
|
202
203
|
ultralytics/trackers/utils/kalman_filter.py,sha256=cH9zD3fwkuezP97H9mw8cSBN7a8hHKx_Sx1j7t3oYGs,21349
|
203
204
|
ultralytics/trackers/utils/matching.py,sha256=Y94cMwo9TLd-IWFqHKp8dHSDyguS1qtOeebBMalWnJQ,7078
|
204
205
|
ultralytics/utils/__init__.py,sha256=_KUqXbKcFgN11_ZLGrpQuPNOdSbIGhuv_IBGUPw9jX0,49203
|
205
|
-
ultralytics/utils/autobatch.py,sha256=
|
206
|
+
ultralytics/utils/autobatch.py,sha256=yBkojvLhZofwwKnaA8BnEIFXp3UWt7rVmyuh-dl1Ymk,5020
|
206
207
|
ultralytics/utils/benchmarks.py,sha256=Ub--iTq2hL_oHkG2R3HXmZXQ6qcBC-P9MabUv60bMLE,25625
|
207
208
|
ultralytics/utils/checks.py,sha256=1Cu8k2qg_pFaoHvkiE07Ab5ZGLyZHZxFAg1IMM63CBQ,30145
|
208
209
|
ultralytics/utils/dist.py,sha256=NDFga-uKxkBX2zLxFHSene_cCiGQJoyOeCXcN9JIOIk,2358
|
209
210
|
ultralytics/utils/downloads.py,sha256=fh7I5toTSowAOXtmx5zIzCEDREfTFG45cLIHmsDmuYw,21974
|
210
211
|
ultralytics/utils/errors.py,sha256=GqP_Jgj_n0paxn8OMhn3DTCgoNkB2WjUcUaqs-M6SQk,816
|
211
212
|
ultralytics/utils/files.py,sha256=uiXQSVABJRoI5ImnM6ndEBIFbECfksmWNEldBg8GnSo,8224
|
212
|
-
ultralytics/utils/instance.py,sha256=
|
213
|
+
ultralytics/utils/instance.py,sha256=NuTLa_XoqgmWNhxQ2JuflT22UAmEmv0UWd5BZXCjSNM,16841
|
213
214
|
ultralytics/utils/loss.py,sha256=_d2L4lIemaeAHrGHqf9q-KI7yTgHKCbIcYAF7Y-farI,34185
|
214
215
|
ultralytics/utils/metrics.py,sha256=toJlyA0W-xtChqAtIDiHISolxc_30NP33ezxWQ1rnPc,53804
|
215
|
-
ultralytics/utils/ops.py,sha256=
|
216
|
+
ultralytics/utils/ops.py,sha256=O_p_GUAtYL31YQIvEl4m3OOgUE34qaIZY9UN5k0ROnU,33219
|
216
217
|
ultralytics/utils/patches.py,sha256=J-iOwIRbfUs-inBZerhnXby5tUKjYcOIyvhLTS352JE,3270
|
217
218
|
ultralytics/utils/plotting.py,sha256=GmBkN7e1skJK2cZ2hzKBXQCb1gayWTrA9TLHw0q07UM,62948
|
218
219
|
ultralytics/utils/tal.py,sha256=thD_AEhVmhaZqmS5szZMvpKO-RKOeZwfX1BYAhdnA0o,18470
|
@@ -230,9 +231,9 @@ ultralytics/utils/callbacks/neptune.py,sha256=IbGQfEltamUKXJt93uSLQFn8c2rYh3DMTg
|
|
230
231
|
ultralytics/utils/callbacks/raytune.py,sha256=Ck_yFzg7UZXiDWrLHaltjQybzVWSFDfzpdrx9ZYTRfI,700
|
231
232
|
ultralytics/utils/callbacks/tensorboard.py,sha256=SHlE58Fb-sg-uZKtgy-ybIO3SAIfK55aj8kTYGA0Cyg,4167
|
232
233
|
ultralytics/utils/callbacks/wb.py,sha256=sizfTa-xI9k2pnDSP_Q9pHZEFwcl__gSFM0AcneuRpY,7058
|
233
|
-
ultralytics-8.3.
|
234
|
-
ultralytics-8.3.
|
235
|
-
ultralytics-8.3.
|
236
|
-
ultralytics-8.3.
|
237
|
-
ultralytics-8.3.
|
238
|
-
ultralytics-8.3.
|
234
|
+
ultralytics-8.3.51.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
|
235
|
+
ultralytics-8.3.51.dist-info/METADATA,sha256=q5i3qgmMzgn2vLxSqF_NwhKgiOrxSFjfUnuaJvm8inQ,35332
|
236
|
+
ultralytics-8.3.51.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
|
237
|
+
ultralytics-8.3.51.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
|
238
|
+
ultralytics-8.3.51.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
|
239
|
+
ultralytics-8.3.51.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|