ultralytics 8.3.121__py3-none-any.whl → 8.3.122__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 +1 -1
- ultralytics/cfg/trackers/botsort.yaml +1 -1
- ultralytics/data/split_dota.py +1 -1
- ultralytics/engine/exporter.py +3 -0
- ultralytics/solutions/solutions.py +1 -1
- ultralytics/solutions/speed_estimation.py +48 -52
- ultralytics/trackers/bot_sort.py +2 -0
- {ultralytics-8.3.121.dist-info → ultralytics-8.3.122.dist-info}/METADATA +3 -3
- {ultralytics-8.3.121.dist-info → ultralytics-8.3.122.dist-info}/RECORD +14 -14
- {ultralytics-8.3.121.dist-info → ultralytics-8.3.122.dist-info}/WHEEL +1 -1
- {ultralytics-8.3.121.dist-info → ultralytics-8.3.122.dist-info}/entry_points.txt +0 -0
- {ultralytics-8.3.121.dist-info → ultralytics-8.3.122.dist-info}/licenses/LICENSE +0 -0
- {ultralytics-8.3.121.dist-info → ultralytics-8.3.122.dist-info}/top_level.txt +0 -0
ultralytics/__init__.py
CHANGED
ultralytics/cfg/__init__.py
CHANGED
@@ -701,7 +701,7 @@ def handle_yolo_solutions(args: List[str]) -> None:
|
|
701
701
|
solution_name = "count" # Default for invalid solution
|
702
702
|
|
703
703
|
if solution_name == "inference":
|
704
|
-
checks.check_requirements("streamlit>=1.29.0
|
704
|
+
checks.check_requirements("streamlit>=1.29.0")
|
705
705
|
LOGGER.info("💡 Loading Ultralytics live inference app...")
|
706
706
|
subprocess.run(
|
707
707
|
[ # Run subprocess with Streamlit custom argument
|
@@ -17,6 +17,6 @@ fuse_score: True # Whether to fuse confidence scores with the iou distances befo
|
|
17
17
|
gmc_method: sparseOptFlow # method of global motion compensation
|
18
18
|
# ReID model related thresh
|
19
19
|
proximity_thresh: 0.5 # minimum IoU for valid match with ReID
|
20
|
-
appearance_thresh: 0.
|
20
|
+
appearance_thresh: 0.8 # minimum appearance similarity for ReID
|
21
21
|
with_reid: False
|
22
22
|
model: auto # uses native features if detector is YOLO else yolo11n-cls.pt
|
ultralytics/data/split_dota.py
CHANGED
@@ -30,7 +30,7 @@ def bbox_iof(polygon1, bbox2, eps=1e-6):
|
|
30
30
|
Polygon format: [x1, y1, x2, y2, x3, y3, x4, y4].
|
31
31
|
Bounding box format: [x_min, y_min, x_max, y_max].
|
32
32
|
"""
|
33
|
-
check_requirements("shapely")
|
33
|
+
check_requirements("shapely>=2.0.0")
|
34
34
|
from shapely.geometry import Polygon
|
35
35
|
|
36
36
|
polygon1 = polygon1.reshape(-1, 4, 2)
|
ultralytics/engine/exporter.py
CHANGED
@@ -851,6 +851,9 @@ class Exporter:
|
|
851
851
|
ct_model.license = m.pop("license")
|
852
852
|
ct_model.version = m.pop("version")
|
853
853
|
ct_model.user_defined_metadata.update({k: str(v) for k, v in m.items()})
|
854
|
+
if self.model.task == "classify":
|
855
|
+
ct_model.user_defined_metadata.update({"com.apple.coreml.model.preview.type": "imageClassifier"})
|
856
|
+
|
854
857
|
try:
|
855
858
|
ct_model.save(str(f)) # save *.mlpackage
|
856
859
|
except Exception as e:
|
@@ -53,7 +53,7 @@ class BaseSolution:
|
|
53
53
|
is_cli (bool): Enables CLI mode if set to True.
|
54
54
|
**kwargs (Any): Additional configuration parameters that override defaults.
|
55
55
|
"""
|
56
|
-
check_requirements("shapely>=2.0.0
|
56
|
+
check_requirements("shapely>=2.0.0")
|
57
57
|
from shapely.geometry import LineString, Point, Polygon
|
58
58
|
from shapely.prepared import prep
|
59
59
|
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
|
2
2
|
|
3
|
-
from
|
3
|
+
from collections import deque
|
4
|
+
from math import sqrt
|
4
5
|
|
5
6
|
from ultralytics.solutions.solutions import BaseSolution, SolutionAnnotator, SolutionResults
|
6
7
|
from ultralytics.utils.plotting import colors
|
@@ -15,12 +16,10 @@ class SpeedEstimator(BaseSolution):
|
|
15
16
|
|
16
17
|
Attributes:
|
17
18
|
spd (Dict[int, float]): Dictionary storing speed data for tracked objects.
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
track_line (List[Tuple[float, float]]): List of points representing the object's track.
|
23
|
-
r_s (LineString): LineString object representing the speed estimation region.
|
19
|
+
trk_hist (Dict[int, float]): Dictionary storing the object tracking data.
|
20
|
+
max_hist (int): maximum track history before computing speed
|
21
|
+
meters_per_pixel (float): Real-world meters represented by one pixel (e.g., 0.04 for 4m over 100px).
|
22
|
+
max_speed (int): Maximum allowed object speed; values above this will be capped at 120 km/h.
|
24
23
|
|
25
24
|
Methods:
|
26
25
|
initialize_region: Initializes the speed estimation region.
|
@@ -45,12 +44,15 @@ class SpeedEstimator(BaseSolution):
|
|
45
44
|
"""
|
46
45
|
super().__init__(**kwargs)
|
47
46
|
|
48
|
-
self.
|
49
|
-
|
50
|
-
self.
|
51
|
-
self.
|
52
|
-
self.
|
53
|
-
self.
|
47
|
+
self.fps = kwargs.get("fps", 30) # assumed video FPS
|
48
|
+
self.frame_count = 0 # global frame count
|
49
|
+
self.trk_frame_ids = {} # Track ID → first frame index
|
50
|
+
self.spd = {} # Final speed per object (km/h), once locked
|
51
|
+
self.trk_hist = {} # Track ID → deque of (time, position)
|
52
|
+
self.locked_ids = set() # Track IDs whose speed has been finalized
|
53
|
+
self.max_hist = kwargs.get("max_hist", 5) # Required frame history before computing speed
|
54
|
+
self.meter_per_pixel = kwargs.get("meter_per_pixel", 0.05) # Scene scale, depends on camera details
|
55
|
+
self.max_speed = kwargs.get("max_speed", 120) # max_speed adjustment
|
54
56
|
|
55
57
|
def process(self, im0):
|
56
58
|
"""
|
@@ -67,45 +69,39 @@ class SpeedEstimator(BaseSolution):
|
|
67
69
|
>>> image = np.random.randint(0, 255, (480, 640, 3), dtype=np.uint8)
|
68
70
|
>>> results = estimator.process(image)
|
69
71
|
"""
|
70
|
-
self.
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
self.
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
# Calculate speed based on vertical displacement and time
|
104
|
-
self.spd[track_id] = abs(self.track_line[-1][1] - self.trk_pp[track_id][1]) / time_difference
|
105
|
-
|
106
|
-
# Update tracking data for next frame
|
107
|
-
self.trk_pt[track_id] = time()
|
108
|
-
self.trk_pp[track_id] = self.track_line[-1]
|
72
|
+
self.frame_count += 1
|
73
|
+
self.extract_tracks(im0)
|
74
|
+
annotator = SolutionAnnotator(im0, line_width=self.line_width)
|
75
|
+
|
76
|
+
for box, track_id, _, _ in zip(self.boxes, self.track_ids, self.clss, self.confs):
|
77
|
+
self.store_tracking_history(track_id, box)
|
78
|
+
|
79
|
+
if track_id not in self.trk_hist: # Initialize history if new track found
|
80
|
+
self.trk_hist[track_id] = deque(maxlen=self.max_hist)
|
81
|
+
self.trk_frame_ids[track_id] = self.frame_count
|
82
|
+
|
83
|
+
if track_id not in self.locked_ids: # Update history until speed is locked
|
84
|
+
trk_hist = self.trk_hist[track_id]
|
85
|
+
trk_hist.append(self.track_line[-1])
|
86
|
+
|
87
|
+
# Compute and lock speed once enough history is collected
|
88
|
+
if len(trk_hist) == self.max_hist:
|
89
|
+
p0, p1 = trk_hist[0], trk_hist[-1] # First and last points of track
|
90
|
+
dt = (self.frame_count - self.trk_frame_ids[track_id]) / self.fps # Time in seconds
|
91
|
+
if dt > 0:
|
92
|
+
dx, dy = p1[0] - p0[0], p1[1] - p0[1] # pixel displacement
|
93
|
+
pixel_distance = sqrt(dx * dx + dy * dy) # get pixel distance
|
94
|
+
meters = pixel_distance * self.meter_per_pixel # convert to meters
|
95
|
+
self.spd[track_id] = int(
|
96
|
+
min((meters / dt) * 3.6, self.max_speed)
|
97
|
+
) # convert to km/h and store final speed
|
98
|
+
self.locked_ids.add(track_id) # prevent further updates
|
99
|
+
self.trk_hist.pop(track_id, None) # free memory
|
100
|
+
self.trk_frame_ids.pop(track_id, None) # optional: remove frame start too
|
101
|
+
|
102
|
+
if track_id in self.spd:
|
103
|
+
speed_label = f"{self.spd[track_id]} km/h"
|
104
|
+
annotator.box_label(box, label=speed_label, color=colors(track_id, True)) # Draw bounding box
|
109
105
|
|
110
106
|
plot_im = annotator.result()
|
111
107
|
self.display_output(plot_im) # Display output with base class function
|
ultralytics/trackers/bot_sort.py
CHANGED
@@ -255,4 +255,6 @@ class ReID:
|
|
255
255
|
def __call__(self, img, dets):
|
256
256
|
"""Extract embeddings for detected objects."""
|
257
257
|
feats = self.model([save_one_box(det, img, save=False) for det in xywh2xyxy(torch.from_numpy(dets[:, :4]))])
|
258
|
+
if feats.shape[0] != dets.shape[0] and feats[0].shape[0] == dets.shape[0]:
|
259
|
+
feats = feats[0] # batched prediction with non-PyTorch backend
|
258
260
|
return [f.cpu().numpy() for f in feats]
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: ultralytics
|
3
|
-
Version: 8.3.
|
3
|
+
Version: 8.3.122
|
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>
|
@@ -68,8 +68,8 @@ Requires-Dist: tensorflowjs>=2.0.0; extra == "export"
|
|
68
68
|
Requires-Dist: tensorstore>=0.1.63; (platform_machine == "aarch64" and python_version >= "3.9") and extra == "export"
|
69
69
|
Requires-Dist: h5py!=3.11.0; platform_machine == "aarch64" and extra == "export"
|
70
70
|
Provides-Extra: solutions
|
71
|
-
Requires-Dist: shapely
|
72
|
-
Requires-Dist: streamlit
|
71
|
+
Requires-Dist: shapely>=2.0.0; extra == "solutions"
|
72
|
+
Requires-Dist: streamlit>=1.29.0; extra == "solutions"
|
73
73
|
Provides-Extra: logging
|
74
74
|
Requires-Dist: wandb; extra == "logging"
|
75
75
|
Requires-Dist: tensorboard; extra == "logging"
|
@@ -7,10 +7,10 @@ tests/test_exports.py,sha256=dhZn86LdbapW15RthQF870LGxDjC1MUZhlGdBgPmgIQ,9716
|
|
7
7
|
tests/test_integrations.py,sha256=dQteeRsRVuT_p5-T88-7jqT65Zm9iAXkyKg-KQ1_TQ8,6341
|
8
8
|
tests/test_python.py,sha256=ok2xp7zwPOwcyl4yNawlx1uJ5HETn9eU-jyTPYzA0fI,25491
|
9
9
|
tests/test_solutions.py,sha256=BIvg9zW0a_ggEmrPKgB_Y0MncveH-eYuN5KlqdJ6nHs,5726
|
10
|
-
ultralytics/__init__.py,sha256=
|
10
|
+
ultralytics/__init__.py,sha256=StjzKKqUrYk4rkeEY2AnsNAR8keYsHJzELLBKmqs6Q4,730
|
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=ZXbvd-lyu0IIwVYAN6NH3KbQ5MLC5865Lh2c7IDkNSw,39675
|
14
14
|
ultralytics/cfg/default.yaml,sha256=zSiCmQp_HRlh0gZe_AZSjNQNe1aNDoX2vcNUo5oJs2Q,8306
|
15
15
|
ultralytics/cfg/datasets/Argoverse.yaml,sha256=_xlEDIJ9XkUo0v_iNL7FW079BoSeZtKSuLteKTtGbA8,3275
|
16
16
|
ultralytics/cfg/datasets/DOTAv1.5.yaml,sha256=SHND_CFkojxw5iQD5Mcgju2kCZIl0gW2ajuzv1cqoL0,1224
|
@@ -100,7 +100,7 @@ ultralytics/cfg/models/v9/yolov9m.yaml,sha256=WcKQ3xRsC1JMgA42Hx4xzr4FZmtE6B3wKv
|
|
100
100
|
ultralytics/cfg/models/v9/yolov9s.yaml,sha256=j_v3JWaPtiuM8aKJt15Z_4HPRCoHWn_G6Z07t8CZyjk,1391
|
101
101
|
ultralytics/cfg/models/v9/yolov9t.yaml,sha256=Q8GpSXE7fumhuJiQg4a2SkuS_UmnXqp-eoZxW_C0vEo,1375
|
102
102
|
ultralytics/cfg/solutions/default.yaml,sha256=c-9thwI7y7VmIoIM6AW70Z0r825SToH2h7gSCsUoAak,1664
|
103
|
-
ultralytics/cfg/trackers/botsort.yaml,sha256=
|
103
|
+
ultralytics/cfg/trackers/botsort.yaml,sha256=TpRaK5kH_-QbjCQ7ekM4s_7j8I8ti3q8Hs7WDz4rEwA,1215
|
104
104
|
ultralytics/cfg/trackers/bytetrack.yaml,sha256=6u-tiZlk16EqEwkNXaMrza6PAQmWj_ypgv26LGCtPDg,886
|
105
105
|
ultralytics/data/__init__.py,sha256=nAXaL1puCc7z_NjzQNlJnhbVhT9Fla2u7Dsqo7q1dAc,644
|
106
106
|
ultralytics/data/annotator.py,sha256=VEwb11FsEZm75qlEp8XDHFGKW0_rGsEaFDaBVd771Kw,2902
|
@@ -111,14 +111,14 @@ ultralytics/data/converter.py,sha256=znXH2XTdo0Q4NDHMny1ydVBvrxKn2kbbwI-X5bn1MlQ
|
|
111
111
|
ultralytics/data/dataset.py,sha256=hbsjhmZBO-T1_gkUAm128kKowdwsLNwnK2lhnzmxJB8,34826
|
112
112
|
ultralytics/data/loaders.py,sha256=o844tZlfZEhXop16t-hwaEQHhbfP3_bQMS0whF_NSos,28531
|
113
113
|
ultralytics/data/split.py,sha256=6LHB1z8woXurWjXfM-Zm2thRr1KXvzR18CFJA-SDUvE,4677
|
114
|
-
ultralytics/data/split_dota.py,sha256=
|
114
|
+
ultralytics/data/split_dota.py,sha256=ihG56YfNFZJDq1r7Zcgk8fKzde3gn21W0f67ub6nT68,11879
|
115
115
|
ultralytics/data/utils.py,sha256=HET4rbj4iUcjen0t8E_Qo_9S9RGPVQRYL-j0KI0qflI,35269
|
116
116
|
ultralytics/data/scripts/download_weights.sh,sha256=0y8XtZxOru7dVThXDFUXLHBuICgOIqZNUwpyL4Rh6lg,595
|
117
117
|
ultralytics/data/scripts/get_coco.sh,sha256=UuJpJeo3qQpTHVINeOpmP0NYmg8PhEFE3A8J3jKrnPw,1768
|
118
118
|
ultralytics/data/scripts/get_coco128.sh,sha256=qmRQl_hOKrsdHrTrnyQuFIH01oDz3lfaz138OgGfLt8,650
|
119
119
|
ultralytics/data/scripts/get_imagenet.sh,sha256=hr42H16bM47iT27rgS7MpEo-GeOZAYUQXgr0B2cwn48,1705
|
120
120
|
ultralytics/engine/__init__.py,sha256=lm6MckFYCPTbqIoX7w0s_daxdjNeBeKW6DXppv1-QUM,70
|
121
|
-
ultralytics/engine/exporter.py,sha256=
|
121
|
+
ultralytics/engine/exporter.py,sha256=rFi7V-REi66DRLTWQzgx87NMfdp8eLfPZkYfSpS7Wfg,70137
|
122
122
|
ultralytics/engine/model.py,sha256=wS1cwgv0iyhsslMAZYMGlYDWitDIRW96d7MxwW-Sw5o,52817
|
123
123
|
ultralytics/engine/predictor.py,sha256=YJ5l-0qIpr6JAJxowswtZ0IqmXBqVTvAA9vR40v0sCM,21752
|
124
124
|
ultralytics/engine/results.py,sha256=MZkhI0CCOkBQPR-EzswymVqvqeyk35EkESGUQ_08r8k,79738
|
@@ -216,14 +216,14 @@ ultralytics/solutions/parking_management.py,sha256=SiVxRl44OxxYUXIzNOxOBqtaFJSRR
|
|
216
216
|
ultralytics/solutions/queue_management.py,sha256=p1-cuI_rs4ygtlBryXjE65NYG2bnZXhp3ylggFnWcRs,4344
|
217
217
|
ultralytics/solutions/region_counter.py,sha256=Zn35YRXNzhBk27D9MLOHBYe2L1o6H2ey3mEwCXofB_E,5418
|
218
218
|
ultralytics/solutions/security_alarm.py,sha256=mbUtqoLgjAWz9k3pjMoEZY_PR-lhjiic1NK90FhEJkw,6250
|
219
|
-
ultralytics/solutions/solutions.py,sha256=
|
220
|
-
ultralytics/solutions/speed_estimation.py,sha256=
|
219
|
+
ultralytics/solutions/solutions.py,sha256=OZAmwmqCOK8SI5dpZFrzUkrPIUFGMcgPL5zV4ymzkzU,32688
|
220
|
+
ultralytics/solutions/speed_estimation.py,sha256=dbHzj9NWrcuMXYbBJAZNcQ3D9zjKV8PsNkU6orOqf7Q,5344
|
221
221
|
ultralytics/solutions/streamlit_inference.py,sha256=M0ppTFInqSPrdytZBLH8x-XoA7zFc7PaRQ51wHG9ppU,9846
|
222
222
|
ultralytics/solutions/trackzone.py,sha256=efko4U8zT8lyNLLo9zF543rTXHefeYthxf9GV3c2TiU,3860
|
223
223
|
ultralytics/solutions/vision_eye.py,sha256=DHf3pQzNqP71oYx3QXflvcGsg4nEYJCD1SOdSOxiWBk,2965
|
224
224
|
ultralytics/trackers/__init__.py,sha256=Zlu_Ig5osn7hqch_g5Be_e4pwZUkeeTQiesJCi0pFGI,255
|
225
225
|
ultralytics/trackers/basetrack.py,sha256=LYvWB5d7Woyrz_RlxaopjV07RQKH3sff_lZJfMcMxcA,4450
|
226
|
-
ultralytics/trackers/bot_sort.py,sha256=
|
226
|
+
ultralytics/trackers/bot_sort.py,sha256=rpaj7X8COT0Vi5GFR9z-CGSBgJ7gTfFx2wTSZFTnhco,11466
|
227
227
|
ultralytics/trackers/byte_tracker.py,sha256=D7JQ_6V8OUMQryxTrAr010UXMSaboQnI7T1xppzHXYg,20921
|
228
228
|
ultralytics/trackers/track.py,sha256=mu6L9RWAW8Nq0vJanX-hTTUST-OmLq49d8VV96-J9u8,4817
|
229
229
|
ultralytics/trackers/utils/__init__.py,sha256=lm6MckFYCPTbqIoX7w0s_daxdjNeBeKW6DXppv1-QUM,70
|
@@ -260,9 +260,9 @@ ultralytics/utils/callbacks/neptune.py,sha256=JaI95Cj2kIjUhlEEOiDN0-Drc-fDelLhNI
|
|
260
260
|
ultralytics/utils/callbacks/raytune.py,sha256=A8amUGpux7dYES-L1iSeMoMXBySGWCD1aUqT7vcG-pU,1284
|
261
261
|
ultralytics/utils/callbacks/tensorboard.py,sha256=jgYnym3cUQFAgN1GzTyO7l3jINtfAh8zhrllDvnLuVQ,5339
|
262
262
|
ultralytics/utils/callbacks/wb.py,sha256=iDRFXI4IIDm8R5OI89DMTmjs8aHLo1HRCLkOFKdaMG4,7507
|
263
|
-
ultralytics-8.3.
|
264
|
-
ultralytics-8.3.
|
265
|
-
ultralytics-8.3.
|
266
|
-
ultralytics-8.3.
|
267
|
-
ultralytics-8.3.
|
268
|
-
ultralytics-8.3.
|
263
|
+
ultralytics-8.3.122.dist-info/licenses/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
|
264
|
+
ultralytics-8.3.122.dist-info/METADATA,sha256=Ie20iTid09rrSu0IDpyAHcgvr6MlwsZqZ5ciNuwfWmM,37180
|
265
|
+
ultralytics-8.3.122.dist-info/WHEEL,sha256=wXxTzcEDnjrTwFYjLPcsW_7_XihufBwmpiBeiXNBGEA,91
|
266
|
+
ultralytics-8.3.122.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
|
267
|
+
ultralytics-8.3.122.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
|
268
|
+
ultralytics-8.3.122.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|