ultralytics 8.3.52__py3-none-any.whl → 8.3.54__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.
- tests/test_solutions.py +1 -1
- ultralytics/__init__.py +1 -1
- ultralytics/cfg/__init__.py +56 -55
- ultralytics/engine/exporter.py +44 -18
- ultralytics/solutions/__init__.py +2 -2
- ultralytics/solutions/parking_management.py +3 -1
- ultralytics/solutions/security_alarm.py +2 -1
- ultralytics/solutions/streamlit_inference.py +175 -132
- ultralytics/utils/__init__.py +14 -4
- ultralytics/utils/benchmarks.py +1 -1
- {ultralytics-8.3.52.dist-info → ultralytics-8.3.54.dist-info}/METADATA +2 -2
- {ultralytics-8.3.52.dist-info → ultralytics-8.3.54.dist-info}/RECORD +16 -16
- {ultralytics-8.3.52.dist-info → ultralytics-8.3.54.dist-info}/LICENSE +0 -0
- {ultralytics-8.3.52.dist-info → ultralytics-8.3.54.dist-info}/WHEEL +0 -0
- {ultralytics-8.3.52.dist-info → ultralytics-8.3.54.dist-info}/entry_points.txt +0 -0
- {ultralytics-8.3.52.dist-info → ultralytics-8.3.54.dist-info}/top_level.txt +0 -0
tests/test_solutions.py
CHANGED
ultralytics/__init__.py
CHANGED
ultralytics/cfg/__init__.py
CHANGED
@@ -42,6 +42,7 @@ SOLUTION_MAP = {
|
|
42
42
|
"workout": ("AIGym", "monitor"),
|
43
43
|
"analytics": ("Analytics", "process_data"),
|
44
44
|
"trackzone": ("TrackZone", "trackzone"),
|
45
|
+
"inference": ("Inference", "inference"),
|
45
46
|
"help": None,
|
46
47
|
}
|
47
48
|
|
@@ -97,7 +98,10 @@ SOLUTIONS_HELP_MSG = f"""
|
|
97
98
|
yolo solutions analytics analytics_type="pie"
|
98
99
|
|
99
100
|
6. Track objects within specific zones
|
100
|
-
yolo solutions trackzone source="path/to/video/file.mp4" region=[(150, 150), (1130, 150), (1130, 570), (150, 570)]
|
101
|
+
yolo solutions trackzone source="path/to/video/file.mp4" region=[(150, 150), (1130, 150), (1130, 570), (150, 570)]
|
102
|
+
|
103
|
+
7. Streamlit real-time webcam inference GUI
|
104
|
+
yolo streamlit-predict
|
101
105
|
"""
|
102
106
|
CLI_HELP_MSG = f"""
|
103
107
|
Arguments received: {str(['yolo'] + ARGV[1:])}. Ultralytics 'yolo' commands use the following syntax:
|
@@ -121,13 +125,10 @@ CLI_HELP_MSG = f"""
|
|
121
125
|
4. Export a YOLO11n classification model to ONNX format at image size 224 by 128 (no TASK required)
|
122
126
|
yolo export model=yolo11n-cls.pt format=onnx imgsz=224,128
|
123
127
|
|
124
|
-
5.
|
125
|
-
yolo streamlit-predict
|
126
|
-
|
127
|
-
6. Ultralytics solutions usage
|
128
|
+
5. Ultralytics solutions usage
|
128
129
|
yolo solutions count or in {list(SOLUTION_MAP.keys())[1:-1]} source="path/to/video/file.mp4"
|
129
130
|
|
130
|
-
|
131
|
+
6. Run special commands:
|
131
132
|
yolo help
|
132
133
|
yolo checks
|
133
134
|
yolo version
|
@@ -636,6 +637,9 @@ def handle_yolo_solutions(args: List[str]) -> None:
|
|
636
637
|
Run analytics with custom configuration:
|
637
638
|
>>> handle_yolo_solutions(["analytics", "conf=0.25", "source=path/to/video/file.mp4"])
|
638
639
|
|
640
|
+
Run inference with custom configuration, requires Streamlit version 1.29.0 or higher.
|
641
|
+
>>> handle_yolo_solutions(["inference", "model=yolo11n.pt"])
|
642
|
+
|
639
643
|
Notes:
|
640
644
|
- Default configurations are merged from DEFAULT_SOL_DICT and DEFAULT_CFG_DICT
|
641
645
|
- Arguments can be provided in the format 'key=value' or as boolean flags
|
@@ -645,7 +649,9 @@ def handle_yolo_solutions(args: List[str]) -> None:
|
|
645
649
|
- For 'analytics' solution, frame numbers are tracked for generating analytical graphs
|
646
650
|
- Video processing can be interrupted by pressing 'q'
|
647
651
|
- Processes video frames sequentially and saves output in .avi format
|
648
|
-
- If no source is specified, downloads and uses a default sample video
|
652
|
+
- If no source is specified, downloads and uses a default sample video\
|
653
|
+
- The inference solution will be launched using the 'streamlit run' command.
|
654
|
+
- The Streamlit app file is located in the Ultralytics package directory.
|
649
655
|
"""
|
650
656
|
full_args_dict = {**DEFAULT_SOL_DICT, **DEFAULT_CFG_DICT} # arguments dictionary
|
651
657
|
overrides = {}
|
@@ -678,60 +684,56 @@ def handle_yolo_solutions(args: List[str]) -> None:
|
|
678
684
|
if args and args[0] == "help": # Add check for return if user call `yolo solutions help`
|
679
685
|
return
|
680
686
|
|
681
|
-
|
682
|
-
|
683
|
-
|
684
|
-
|
685
|
-
|
686
|
-
|
687
|
-
|
688
|
-
|
689
|
-
|
690
|
-
|
691
|
-
|
692
|
-
|
693
|
-
|
694
|
-
|
687
|
+
if s_n == "inference":
|
688
|
+
checks.check_requirements("streamlit>=1.29.0")
|
689
|
+
LOGGER.info("💡 Loading Ultralytics live inference app...")
|
690
|
+
subprocess.run(
|
691
|
+
[ # Run subprocess with Streamlit custom argument
|
692
|
+
"streamlit",
|
693
|
+
"run",
|
694
|
+
str(ROOT / "solutions/streamlit_inference.py"),
|
695
|
+
"--server.headless",
|
696
|
+
"true",
|
697
|
+
overrides["model"],
|
698
|
+
]
|
699
|
+
)
|
700
|
+
else:
|
701
|
+
cls, method = SOLUTION_MAP[s_n] # solution class name, method name and default source
|
695
702
|
|
696
|
-
|
697
|
-
if s_n == "analytics": # analytical graphs follow fixed shape for output i.e w=1920, h=1080
|
698
|
-
w, h = 1920, 1080
|
699
|
-
save_dir = increment_path(Path("runs") / "solutions" / "exp", exist_ok=False)
|
700
|
-
save_dir.mkdir(parents=True, exist_ok=True) # create the output directory
|
701
|
-
vw = cv2.VideoWriter(os.path.join(save_dir, "solution.avi"), cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))
|
703
|
+
from ultralytics import solutions # import ultralytics solutions
|
702
704
|
|
703
|
-
|
704
|
-
|
705
|
-
|
706
|
-
|
707
|
-
if not success:
|
708
|
-
break
|
709
|
-
frame = process(frame, f_n := f_n + 1) if s_n == "analytics" else process(frame)
|
710
|
-
vw.write(frame)
|
711
|
-
if cv2.waitKey(1) & 0xFF == ord("q"):
|
712
|
-
break
|
713
|
-
finally:
|
714
|
-
cap.release()
|
705
|
+
solution = getattr(solutions, cls)(IS_CLI=True, **overrides) # get solution class i.e ObjectCounter
|
706
|
+
process = getattr(
|
707
|
+
solution, method
|
708
|
+
) # get specific function of class for processing i.e, count from ObjectCounter
|
715
709
|
|
710
|
+
cap = cv2.VideoCapture(solution.CFG["source"]) # read the video file
|
716
711
|
|
717
|
-
|
718
|
-
|
719
|
-
|
712
|
+
# extract width, height and fps of the video file, create save directory and initialize video writer
|
713
|
+
import os # for directory creation
|
714
|
+
from pathlib import Path
|
720
715
|
|
721
|
-
|
722
|
-
Ultralytics models. It checks for the required Streamlit package and launches the app.
|
716
|
+
from ultralytics.utils.files import increment_path # for output directory path update
|
723
717
|
|
724
|
-
|
725
|
-
|
718
|
+
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))
|
719
|
+
if s_n == "analytics": # analytical graphs follow fixed shape for output i.e w=1920, h=1080
|
720
|
+
w, h = 1920, 1080
|
721
|
+
save_dir = increment_path(Path("runs") / "solutions" / "exp", exist_ok=False)
|
722
|
+
save_dir.mkdir(parents=True, exist_ok=True) # create the output directory
|
723
|
+
vw = cv2.VideoWriter(os.path.join(save_dir, "solution.avi"), cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))
|
726
724
|
|
727
|
-
|
728
|
-
|
729
|
-
|
730
|
-
|
731
|
-
|
732
|
-
|
733
|
-
|
734
|
-
|
725
|
+
try: # Process video frames
|
726
|
+
f_n = 0 # frame number, required for analytical graphs
|
727
|
+
while cap.isOpened():
|
728
|
+
success, frame = cap.read()
|
729
|
+
if not success:
|
730
|
+
break
|
731
|
+
frame = process(frame, f_n := f_n + 1) if s_n == "analytics" else process(frame)
|
732
|
+
vw.write(frame)
|
733
|
+
if cv2.waitKey(1) & 0xFF == ord("q"):
|
734
|
+
break
|
735
|
+
finally:
|
736
|
+
cap.release()
|
735
737
|
|
736
738
|
|
737
739
|
def parse_key_value_pair(pair: str = "key=value"):
|
@@ -853,7 +855,6 @@ def entrypoint(debug=""):
|
|
853
855
|
"login": lambda: handle_yolo_hub(args),
|
854
856
|
"logout": lambda: handle_yolo_hub(args),
|
855
857
|
"copy-cfg": copy_default_cfg,
|
856
|
-
"streamlit-predict": lambda: handle_streamlit_inference(),
|
857
858
|
"solutions": lambda: handle_yolo_solutions(args[1:]),
|
858
859
|
}
|
859
860
|
full_args_dict = {**DEFAULT_CFG_DICT, **{k: None for k in TASKS}, **{k: None for k in MODES}, **special}
|
ultralytics/engine/exporter.py
CHANGED
@@ -101,23 +101,47 @@ from ultralytics.utils.torch_utils import TORCH_1_13, get_latest_opset, select_d
|
|
101
101
|
def export_formats():
|
102
102
|
"""Ultralytics YOLO export formats."""
|
103
103
|
x = [
|
104
|
-
["PyTorch", "-", ".pt", True, True],
|
105
|
-
["TorchScript", "torchscript", ".torchscript", True, True],
|
106
|
-
["ONNX", "onnx", ".onnx", True, True],
|
107
|
-
["OpenVINO", "openvino", "_openvino_model", True, False],
|
108
|
-
["TensorRT", "engine", ".engine", False, True],
|
109
|
-
["CoreML", "coreml", ".mlpackage", True, False],
|
110
|
-
["TensorFlow SavedModel", "saved_model", "_saved_model", True, True],
|
111
|
-
["TensorFlow GraphDef", "pb", ".pb", True, True],
|
112
|
-
["TensorFlow Lite", "tflite", ".tflite", True, False],
|
113
|
-
["TensorFlow Edge TPU", "edgetpu", "_edgetpu.tflite", True, False],
|
114
|
-
["TensorFlow.js", "tfjs", "_web_model", True, False],
|
115
|
-
["PaddlePaddle", "paddle", "_paddle_model", True, True],
|
116
|
-
["MNN", "mnn", ".mnn", True, True],
|
117
|
-
["NCNN", "ncnn", "_ncnn_model", True, True],
|
118
|
-
["IMX", "imx", "_imx_model", True, True],
|
104
|
+
["PyTorch", "-", ".pt", True, True, []],
|
105
|
+
["TorchScript", "torchscript", ".torchscript", True, True, ["batch", "optimize"]],
|
106
|
+
["ONNX", "onnx", ".onnx", True, True, ["batch", "dynamic", "half", "opset", "simplify"]],
|
107
|
+
["OpenVINO", "openvino", "_openvino_model", True, False, ["batch", "dynamic", "half", "int8"]],
|
108
|
+
["TensorRT", "engine", ".engine", False, True, ["batch", "dynamic", "half", "int8", "simplify"]],
|
109
|
+
["CoreML", "coreml", ".mlpackage", True, False, ["batch", "half", "int8", "nms"]],
|
110
|
+
["TensorFlow SavedModel", "saved_model", "_saved_model", True, True, ["batch", "int8", "keras"]],
|
111
|
+
["TensorFlow GraphDef", "pb", ".pb", True, True, ["batch"]],
|
112
|
+
["TensorFlow Lite", "tflite", ".tflite", True, False, ["batch", "half", "int8"]],
|
113
|
+
["TensorFlow Edge TPU", "edgetpu", "_edgetpu.tflite", True, False, []],
|
114
|
+
["TensorFlow.js", "tfjs", "_web_model", True, False, ["batch", "half", "int8"]],
|
115
|
+
["PaddlePaddle", "paddle", "_paddle_model", True, True, ["batch"]],
|
116
|
+
["MNN", "mnn", ".mnn", True, True, ["batch", "half", "int8"]],
|
117
|
+
["NCNN", "ncnn", "_ncnn_model", True, True, ["batch", "half"]],
|
118
|
+
["IMX", "imx", "_imx_model", True, True, ["int8"]],
|
119
119
|
]
|
120
|
-
return dict(zip(["Format", "Argument", "Suffix", "CPU", "GPU"], zip(*x)))
|
120
|
+
return dict(zip(["Format", "Argument", "Suffix", "CPU", "GPU", "Arguments"], zip(*x)))
|
121
|
+
|
122
|
+
|
123
|
+
def validate_args(format, passed_args, valid_args):
|
124
|
+
"""
|
125
|
+
Validates arguments based on format.
|
126
|
+
|
127
|
+
Args:
|
128
|
+
format (str): The export format.
|
129
|
+
passed_args (Namespace): The arguments used during export.
|
130
|
+
valid_args (dict): List of valid arguments for the format.
|
131
|
+
|
132
|
+
Raises:
|
133
|
+
AssertionError: If an argument that's not supported by the export format is used, or if format doesn't have the supported arguments listed.
|
134
|
+
"""
|
135
|
+
# Only check valid usage of these args
|
136
|
+
export_args = ["half", "int8", "dynamic", "keras", "nms", "batch"]
|
137
|
+
|
138
|
+
assert valid_args is not None, f"ERROR ❌️ valid arguments for '{format}' not listed."
|
139
|
+
custom = {"batch": 1, "data": None, "device": None} # exporter defaults
|
140
|
+
default_args = get_cfg(DEFAULT_CFG, custom)
|
141
|
+
for arg in export_args:
|
142
|
+
not_default = getattr(passed_args, arg, None) != getattr(default_args, arg, None)
|
143
|
+
if not_default:
|
144
|
+
assert arg in valid_args, f"ERROR ❌️ argument '{arg}' is not supported for format='{format}'"
|
121
145
|
|
122
146
|
|
123
147
|
def gd_outputs(gd):
|
@@ -182,7 +206,8 @@ class Exporter:
|
|
182
206
|
fmt = "engine"
|
183
207
|
if fmt in {"mlmodel", "mlpackage", "mlprogram", "apple", "ios", "coreml"}: # 'coreml' aliases
|
184
208
|
fmt = "coreml"
|
185
|
-
|
209
|
+
fmts_dict = export_formats()
|
210
|
+
fmts = tuple(fmts_dict["Argument"][1:]) # available export formats
|
186
211
|
if fmt not in fmts:
|
187
212
|
import difflib
|
188
213
|
|
@@ -224,7 +249,8 @@ class Exporter:
|
|
224
249
|
assert dla in {"0", "1"}, f"Expected self.args.device='dla:0' or 'dla:1, but got {self.args.device}."
|
225
250
|
self.device = select_device("cpu" if self.args.device is None else self.args.device)
|
226
251
|
|
227
|
-
#
|
252
|
+
# Argument compatibility checks
|
253
|
+
validate_args(fmt, self.args, fmts_dict["Arguments"][flags.index(True) + 1])
|
228
254
|
if imx and not self.args.int8:
|
229
255
|
LOGGER.warning("WARNING ⚠️ IMX only supports int8 export, setting int8=True.")
|
230
256
|
self.args.int8 = True
|
@@ -10,7 +10,7 @@ from .queue_management import QueueManager
|
|
10
10
|
from .region_counter import RegionCounter
|
11
11
|
from .security_alarm import SecurityAlarm
|
12
12
|
from .speed_estimation import SpeedEstimator
|
13
|
-
from .streamlit_inference import
|
13
|
+
from .streamlit_inference import Inference
|
14
14
|
from .trackzone import TrackZone
|
15
15
|
|
16
16
|
__all__ = (
|
@@ -23,7 +23,7 @@ __all__ = (
|
|
23
23
|
"QueueManager",
|
24
24
|
"SpeedEstimator",
|
25
25
|
"Analytics",
|
26
|
-
"
|
26
|
+
"Inference",
|
27
27
|
"RegionCounter",
|
28
28
|
"TrackZone",
|
29
29
|
"SecurityAlarm",
|
@@ -5,7 +5,9 @@ import json
|
|
5
5
|
import cv2
|
6
6
|
import numpy as np
|
7
7
|
|
8
|
-
from ultralytics.solutions.solutions import
|
8
|
+
from ultralytics.solutions.solutions import BaseSolution
|
9
|
+
from ultralytics.utils import LOGGER
|
10
|
+
from ultralytics.utils.checks import check_requirements
|
9
11
|
from ultralytics.utils.plotting import Annotator
|
10
12
|
|
11
13
|
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# Ultralytics YOLO 🚀, AGPL-3.0 license
|
2
2
|
|
3
|
-
from ultralytics.solutions.solutions import
|
3
|
+
from ultralytics.solutions.solutions import BaseSolution
|
4
|
+
from ultralytics.utils import LOGGER
|
4
5
|
from ultralytics.utils.plotting import Annotator, colors
|
5
6
|
|
6
7
|
|
@@ -4,145 +4,188 @@ import io
|
|
4
4
|
import time
|
5
5
|
|
6
6
|
import cv2
|
7
|
-
import torch
|
8
7
|
|
8
|
+
from ultralytics import YOLO
|
9
|
+
from ultralytics.utils import LOGGER
|
9
10
|
from ultralytics.utils.checks import check_requirements
|
10
11
|
from ultralytics.utils.downloads import GITHUB_ASSETS_STEMS
|
11
12
|
|
12
13
|
|
13
|
-
|
14
|
-
"""
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
14
|
+
class Inference:
|
15
|
+
"""
|
16
|
+
A class to perform object detection, image classification, image segmentation and pose estimation inference using
|
17
|
+
Streamlit and Ultralytics YOLO models. It provides the functionalities such as loading models, configuring settings,
|
18
|
+
uploading video files, and performing real-time inference.
|
19
|
+
|
20
|
+
Attributes:
|
21
|
+
st (module): Streamlit module for UI creation.
|
22
|
+
temp_dict (dict): Temporary dictionary to store the model path.
|
23
|
+
model_path (str): Path to the loaded model.
|
24
|
+
model (YOLO): The YOLO model instance.
|
25
|
+
source (str): Selected video source.
|
26
|
+
enable_trk (str): Enable tracking option.
|
27
|
+
conf (float): Confidence threshold.
|
28
|
+
iou (float): IoU threshold for non-max suppression.
|
29
|
+
vid_file_name (str): Name of the uploaded video file.
|
30
|
+
selected_ind (list): List of selected class indices.
|
31
|
+
|
32
|
+
Methods:
|
33
|
+
web_ui: Sets up the Streamlit web interface with custom HTML elements.
|
34
|
+
sidebar: Configures the Streamlit sidebar for model and inference settings.
|
35
|
+
source_upload: Handles video file uploads through the Streamlit interface.
|
36
|
+
configure: Configures the model and loads selected classes for inference.
|
37
|
+
inference: Performs real-time object detection inference.
|
38
|
+
|
39
|
+
Examples:
|
40
|
+
>>> inf = solutions.Inference(model="path/to/model/file.pt") # Model is not necessary argument.
|
41
|
+
>>> inf.inference()
|
42
|
+
"""
|
43
|
+
|
44
|
+
def __init__(self, **kwargs):
|
45
|
+
"""
|
46
|
+
Initializes the Inference class, checking Streamlit requirements and setting up the model path.
|
47
|
+
|
48
|
+
Args:
|
49
|
+
**kwargs (Dict): Additional keyword arguments for model configuration.
|
50
|
+
"""
|
51
|
+
check_requirements("streamlit>=1.29.0") # scope imports for faster ultralytics package load speeds
|
52
|
+
import streamlit as st
|
53
|
+
|
54
|
+
self.st = st
|
55
|
+
|
56
|
+
self.temp_dict = {"model": None} # Temporary dict to store the model path
|
57
|
+
self.temp_dict.update(kwargs)
|
58
|
+
|
59
|
+
self.model_path = None # Store model file name with path
|
60
|
+
if self.temp_dict["model"] is not None:
|
61
|
+
self.model_path = self.temp_dict["model"]
|
62
|
+
|
63
|
+
LOGGER.info(f"Ultralytics Solutions: ✅ {self.temp_dict}")
|
64
|
+
|
65
|
+
def web_ui(self):
|
66
|
+
"""Sets up the Streamlit web interface with custom HTML elements."""
|
67
|
+
menu_style_cfg = """<style>MainMenu {visibility: hidden;}</style>""" # Hide main menu style
|
68
|
+
|
69
|
+
# Main title of streamlit application
|
70
|
+
main_title_cfg = """<div><h1 style="color:#FF64DA; text-align:center; font-size:40px; margin-top:-50px;
|
71
|
+
font-family: 'Archivo', sans-serif; margin-bottom:20px;">Ultralytics YOLO Streamlit Application</h1></div>"""
|
72
|
+
|
73
|
+
# Subtitle of streamlit application
|
74
|
+
sub_title_cfg = """<div><h4 style="color:#042AFF; text-align:center; font-family: 'Archivo', sans-serif;
|
75
|
+
margin-top:-15px; margin-bottom:50px;">Experience real-time object detection on your webcam with the power
|
76
|
+
of Ultralytics YOLO! 🚀</h4></div>"""
|
77
|
+
|
78
|
+
# Set html page configuration and append custom HTML
|
79
|
+
self.st.set_page_config(page_title="Ultralytics Streamlit App", layout="wide", initial_sidebar_state="auto")
|
80
|
+
self.st.markdown(menu_style_cfg, unsafe_allow_html=True)
|
81
|
+
self.st.markdown(main_title_cfg, unsafe_allow_html=True)
|
82
|
+
self.st.markdown(sub_title_cfg, unsafe_allow_html=True)
|
83
|
+
|
84
|
+
def sidebar(self):
|
85
|
+
"""Configures the Streamlit sidebar for model and inference settings."""
|
86
|
+
with self.st.sidebar: # Add Ultralytics LOGO
|
87
|
+
logo = "https://raw.githubusercontent.com/ultralytics/assets/main/logo/Ultralytics_Logotype_Original.svg"
|
88
|
+
self.st.image(logo, width=250)
|
89
|
+
|
90
|
+
self.st.sidebar.title("User Configuration") # Add elements to vertical setting menu
|
91
|
+
self.source = self.st.sidebar.selectbox(
|
92
|
+
"Video",
|
93
|
+
("webcam", "video"),
|
94
|
+
) # Add source selection dropdown
|
95
|
+
self.enable_trk = self.st.sidebar.radio("Enable Tracking", ("Yes", "No")) # Enable object tracking
|
96
|
+
self.conf = float(self.st.sidebar.slider("Confidence Threshold", 0.0, 1.0, 0.25, 0.01)) # Slider for confidence
|
97
|
+
self.iou = float(self.st.sidebar.slider("IoU Threshold", 0.0, 1.0, 0.45, 0.01)) # Slider for NMS threshold
|
98
|
+
|
99
|
+
col1, col2 = self.st.columns(2)
|
100
|
+
self.org_frame = col1.empty()
|
101
|
+
self.ann_frame = col2.empty()
|
102
|
+
self.fps_display = self.st.sidebar.empty() # Placeholder for FPS display
|
103
|
+
|
104
|
+
def source_upload(self):
|
105
|
+
"""Handles video file uploads through the Streamlit interface."""
|
106
|
+
self.vid_file_name = ""
|
107
|
+
if self.source == "video":
|
108
|
+
vid_file = self.st.sidebar.file_uploader("Upload Video File", type=["mp4", "mov", "avi", "mkv"])
|
109
|
+
if vid_file is not None:
|
110
|
+
g = io.BytesIO(vid_file.read()) # BytesIO Object
|
111
|
+
with open("ultralytics.mp4", "wb") as out: # Open temporary file as bytes
|
112
|
+
out.write(g.read()) # Read bytes into file
|
113
|
+
self.vid_file_name = "ultralytics.mp4"
|
114
|
+
elif self.source == "webcam":
|
115
|
+
self.vid_file_name = 0
|
116
|
+
|
117
|
+
def configure(self):
|
118
|
+
"""Configures the model and loads selected classes for inference."""
|
119
|
+
# Add dropdown menu for model selection
|
120
|
+
available_models = [x.replace("yolo", "YOLO") for x in GITHUB_ASSETS_STEMS if x.startswith("yolo11")]
|
121
|
+
if self.model_path: # If user provided the custom model, insert model without suffix as *.pt is added later
|
122
|
+
available_models.insert(0, self.model_path.split(".pt")[0])
|
123
|
+
selected_model = self.st.sidebar.selectbox("Model", available_models)
|
124
|
+
|
125
|
+
with self.st.spinner("Model is downloading..."):
|
126
|
+
self.model = YOLO(f"{selected_model.lower()}.pt") # Load the YOLO model
|
127
|
+
class_names = list(self.model.names.values()) # Convert dictionary to list of class names
|
128
|
+
self.st.success("Model loaded successfully!")
|
129
|
+
|
130
|
+
# Multiselect box with class names and get indices of selected classes
|
131
|
+
selected_classes = self.st.sidebar.multiselect("Classes", class_names, default=class_names[:3])
|
132
|
+
self.selected_ind = [class_names.index(option) for option in selected_classes]
|
133
|
+
|
134
|
+
if not isinstance(self.selected_ind, list): # Ensure selected_options is a list
|
135
|
+
self.selected_ind = list(self.selected_ind)
|
136
|
+
|
137
|
+
def inference(self):
|
138
|
+
"""Performs real-time object detection inference."""
|
139
|
+
self.web_ui() # Initialize the web interface
|
140
|
+
self.sidebar() # Create the sidebar
|
141
|
+
self.source_upload() # Upload the video source
|
142
|
+
self.configure() # Configure the app
|
143
|
+
|
144
|
+
if self.st.sidebar.button("Start"):
|
145
|
+
stop_button = self.st.button("Stop") # Button to stop the inference
|
146
|
+
cap = cv2.VideoCapture(self.vid_file_name) # Capture the video
|
147
|
+
if not cap.isOpened():
|
148
|
+
self.st.error("Could not open webcam.")
|
149
|
+
while cap.isOpened():
|
150
|
+
success, frame = cap.read()
|
151
|
+
if not success:
|
152
|
+
st.warning("Failed to read frame from webcam. Please make sure the webcam is connected properly.")
|
153
|
+
break
|
154
|
+
|
155
|
+
prev_time = time.time() # Store initial time for FPS calculation
|
156
|
+
|
157
|
+
# Store model predictions
|
158
|
+
if self.enable_trk == "Yes":
|
159
|
+
results = self.model.track(
|
160
|
+
frame, conf=self.conf, iou=self.iou, classes=self.selected_ind, persist=True
|
161
|
+
)
|
162
|
+
else:
|
163
|
+
results = self.model(frame, conf=self.conf, iou=self.iou, classes=self.selected_ind)
|
164
|
+
annotated_frame = results[0].plot() # Add annotations on frame
|
165
|
+
|
166
|
+
fps = 1 / (time.time() - prev_time) # Calculate model FPS
|
167
|
+
|
168
|
+
if stop_button:
|
169
|
+
cap.release() # Release the capture
|
170
|
+
self.st.stop() # Stop streamlit app
|
171
|
+
|
172
|
+
self.fps_display.metric("FPS", f"{fps:.2f}") # Display FPS in sidebar
|
173
|
+
self.org_frame.image(frame, channels="BGR") # Display original frame
|
174
|
+
self.ann_frame.image(annotated_frame, channels="BGR") # Display processed frame
|
175
|
+
|
176
|
+
cap.release() # Release the capture
|
177
|
+
cv2.destroyAllWindows() # Destroy window
|
47
178
|
|
48
|
-
# Add elements to vertical setting menu
|
49
|
-
st.sidebar.title("User Configuration")
|
50
179
|
|
51
|
-
|
52
|
-
|
53
|
-
"Video",
|
54
|
-
("webcam", "video"),
|
55
|
-
)
|
56
|
-
|
57
|
-
vid_file_name = ""
|
58
|
-
if source == "video":
|
59
|
-
vid_file = st.sidebar.file_uploader("Upload Video File", type=["mp4", "mov", "avi", "mkv"])
|
60
|
-
if vid_file is not None:
|
61
|
-
g = io.BytesIO(vid_file.read()) # BytesIO Object
|
62
|
-
vid_location = "ultralytics.mp4"
|
63
|
-
with open(vid_location, "wb") as out: # Open temporary file as bytes
|
64
|
-
out.write(g.read()) # Read bytes into file
|
65
|
-
vid_file_name = "ultralytics.mp4"
|
66
|
-
elif source == "webcam":
|
67
|
-
vid_file_name = 0
|
68
|
-
|
69
|
-
# Add dropdown menu for model selection
|
70
|
-
available_models = [x.replace("yolo", "YOLO") for x in GITHUB_ASSETS_STEMS if x.startswith("yolo11")]
|
71
|
-
if model:
|
72
|
-
available_models.insert(0, model.split(".pt")[0]) # insert model without suffix as *.pt is added later
|
73
|
-
|
74
|
-
selected_model = st.sidebar.selectbox("Model", available_models)
|
75
|
-
with st.spinner("Model is downloading..."):
|
76
|
-
model = YOLO(f"{selected_model.lower()}.pt") # Load the YOLO model
|
77
|
-
class_names = list(model.names.values()) # Convert dictionary to list of class names
|
78
|
-
st.success("Model loaded successfully!")
|
79
|
-
|
80
|
-
# Multiselect box with class names and get indices of selected classes
|
81
|
-
selected_classes = st.sidebar.multiselect("Classes", class_names, default=class_names[:3])
|
82
|
-
selected_ind = [class_names.index(option) for option in selected_classes]
|
83
|
-
|
84
|
-
if not isinstance(selected_ind, list): # Ensure selected_options is a list
|
85
|
-
selected_ind = list(selected_ind)
|
86
|
-
|
87
|
-
enable_trk = st.sidebar.radio("Enable Tracking", ("Yes", "No"))
|
88
|
-
conf = float(st.sidebar.slider("Confidence Threshold", 0.0, 1.0, 0.25, 0.01))
|
89
|
-
iou = float(st.sidebar.slider("IoU Threshold", 0.0, 1.0, 0.45, 0.01))
|
90
|
-
|
91
|
-
col1, col2 = st.columns(2)
|
92
|
-
org_frame = col1.empty()
|
93
|
-
ann_frame = col2.empty()
|
94
|
-
|
95
|
-
fps_display = st.sidebar.empty() # Placeholder for FPS display
|
96
|
-
|
97
|
-
if st.sidebar.button("Start"):
|
98
|
-
videocapture = cv2.VideoCapture(vid_file_name) # Capture the video
|
99
|
-
|
100
|
-
if not videocapture.isOpened():
|
101
|
-
st.error("Could not open webcam.")
|
102
|
-
|
103
|
-
stop_button = st.button("Stop") # Button to stop the inference
|
104
|
-
|
105
|
-
while videocapture.isOpened():
|
106
|
-
success, frame = videocapture.read()
|
107
|
-
if not success:
|
108
|
-
st.warning("Failed to read frame from webcam. Please make sure the webcam is connected properly.")
|
109
|
-
break
|
110
|
-
|
111
|
-
prev_time = time.time() # Store initial time for FPS calculation
|
112
|
-
|
113
|
-
# Store model predictions
|
114
|
-
if enable_trk == "Yes":
|
115
|
-
results = model.track(frame, conf=conf, iou=iou, classes=selected_ind, persist=True)
|
116
|
-
else:
|
117
|
-
results = model(frame, conf=conf, iou=iou, classes=selected_ind)
|
118
|
-
annotated_frame = results[0].plot() # Add annotations on frame
|
119
|
-
|
120
|
-
# Calculate model FPS
|
121
|
-
curr_time = time.time()
|
122
|
-
fps = 1 / (curr_time - prev_time)
|
123
|
-
|
124
|
-
# display frame
|
125
|
-
org_frame.image(frame, channels="BGR")
|
126
|
-
ann_frame.image(annotated_frame, channels="BGR")
|
127
|
-
|
128
|
-
if stop_button:
|
129
|
-
videocapture.release() # Release the capture
|
130
|
-
torch.cuda.empty_cache() # Clear CUDA memory
|
131
|
-
st.stop() # Stop streamlit app
|
132
|
-
|
133
|
-
# Display FPS in sidebar
|
134
|
-
fps_display.metric("FPS", f"{fps:.2f}")
|
135
|
-
|
136
|
-
# Release the capture
|
137
|
-
videocapture.release()
|
138
|
-
|
139
|
-
# Clear CUDA memory
|
140
|
-
torch.cuda.empty_cache()
|
180
|
+
if __name__ == "__main__":
|
181
|
+
import sys # Import the sys module for accessing command-line arguments
|
141
182
|
|
142
|
-
#
|
143
|
-
cv2.destroyAllWindows()
|
183
|
+
model = None # Initialize the model variable as None
|
144
184
|
|
185
|
+
# Check if a model name is provided as a command-line argument
|
186
|
+
args = len(sys.argv)
|
187
|
+
if args > 1:
|
188
|
+
model = args # Assign the first argument as the model name
|
145
189
|
|
146
|
-
#
|
147
|
-
|
148
|
-
inference()
|
190
|
+
# Create an instance of the Inference class and run inference
|
191
|
+
Inference(model=model).inference()
|
ultralytics/utils/__init__.py
CHANGED
@@ -12,12 +12,12 @@ import subprocess
|
|
12
12
|
import sys
|
13
13
|
import threading
|
14
14
|
import time
|
15
|
-
import urllib
|
16
15
|
import uuid
|
17
16
|
from pathlib import Path
|
18
17
|
from threading import Lock
|
19
18
|
from types import SimpleNamespace
|
20
19
|
from typing import Union
|
20
|
+
from urllib.parse import unquote
|
21
21
|
|
22
22
|
import cv2
|
23
23
|
import matplotlib.pyplot as plt
|
@@ -1130,7 +1130,8 @@ class JSONDict(dict):
|
|
1130
1130
|
|
1131
1131
|
def __str__(self):
|
1132
1132
|
"""Return a pretty-printed JSON string representation of the dictionary."""
|
1133
|
-
|
1133
|
+
contents = json.dumps(dict(self), indent=2, ensure_ascii=False, default=self._json_default)
|
1134
|
+
return f'JSONDict("{self.file_path}"):\n{contents}'
|
1134
1135
|
|
1135
1136
|
def update(self, *args, **kwargs):
|
1136
1137
|
"""Update the dictionary and persist changes."""
|
@@ -1238,14 +1239,23 @@ class SettingsManager(JSONDict):
|
|
1238
1239
|
f"Please change one to avoid possible issues during training. {self.help_msg}"
|
1239
1240
|
)
|
1240
1241
|
|
1242
|
+
def __setitem__(self, key, value):
|
1243
|
+
"""Updates one key: value pair."""
|
1244
|
+
self.update({key: value})
|
1245
|
+
|
1241
1246
|
def update(self, *args, **kwargs):
|
1242
1247
|
"""Updates settings, validating keys and types."""
|
1248
|
+
for arg in args:
|
1249
|
+
if isinstance(arg, dict):
|
1250
|
+
kwargs.update(arg)
|
1243
1251
|
for k, v in kwargs.items():
|
1244
1252
|
if k not in self.defaults:
|
1245
1253
|
raise KeyError(f"No Ultralytics setting '{k}'. {self.help_msg}")
|
1246
1254
|
t = type(self.defaults[k])
|
1247
1255
|
if not isinstance(v, t):
|
1248
|
-
raise TypeError(
|
1256
|
+
raise TypeError(
|
1257
|
+
f"Ultralytics setting '{k}' must be '{t.__name__}' type, not '{type(v).__name__}'. {self.help_msg}"
|
1258
|
+
)
|
1249
1259
|
super().update(*args, **kwargs)
|
1250
1260
|
|
1251
1261
|
def reset(self):
|
@@ -1265,7 +1275,7 @@ def deprecation_warn(arg, new_arg=None):
|
|
1265
1275
|
def clean_url(url):
|
1266
1276
|
"""Strip auth from URL, i.e. https://url.com/file.txt?auth -> https://url.com/file.txt."""
|
1267
1277
|
url = Path(url).as_posix().replace(":/", "://") # Pathlib turns :// -> :/, as_posix() for Windows
|
1268
|
-
return
|
1278
|
+
return unquote(url).split("?")[0] # '%2F' to '/', split https://url.com/file.txt?auth
|
1269
1279
|
|
1270
1280
|
|
1271
1281
|
def url2file(url):
|
ultralytics/utils/benchmarks.py
CHANGED
@@ -90,7 +90,7 @@ def benchmark(
|
|
90
90
|
|
91
91
|
y = []
|
92
92
|
t0 = time.time()
|
93
|
-
for i, (name, format, suffix, cpu, gpu) in enumerate(zip(*export_formats().values())):
|
93
|
+
for i, (name, format, suffix, cpu, gpu, _) in enumerate(zip(*export_formats().values())):
|
94
94
|
emoji, filename = "❌", None # export defaults
|
95
95
|
try:
|
96
96
|
# Checks
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: ultralytics
|
3
|
-
Version: 8.3.
|
3
|
+
Version: 8.3.54
|
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>
|
@@ -143,7 +143,7 @@ See below for a quickstart install and usage examples, and see our [Docs](https:
|
|
143
143
|
<details open>
|
144
144
|
<summary>Install</summary>
|
145
145
|
|
146
|
-
Pip install the
|
146
|
+
Pip install the Ultralytics package including all [requirements](https://github.com/ultralytics/ultralytics/blob/main/pyproject.toml) in a [**Python>=3.8**](https://www.python.org/) environment with [**PyTorch>=1.8**](https://pytorch.org/get-started/locally/).
|
147
147
|
|
148
148
|
[](https://pypi.org/project/ultralytics/) [](https://www.pepy.tech/projects/ultralytics) [](https://pypi.org/project/ultralytics/)
|
149
149
|
|
@@ -6,11 +6,11 @@ tests/test_engine.py,sha256=dcEcJsMQh61rDSNv7l4TIAgybLpzjVwerv9JZC_KCM8,4934
|
|
6
6
|
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
|
-
tests/test_solutions.py,sha256=
|
10
|
-
ultralytics/__init__.py,sha256=
|
9
|
+
tests/test_solutions.py,sha256=VShscutH1qk1sNIEsl_7bw-C_RMdbDgx-8BkIKr2qyw,3802
|
10
|
+
ultralytics/__init__.py,sha256=Vkgg4u34EmMW2oxDXs3Q6gqtjW4Tth3-wHXMyYdGfeM,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=Tnd5809b0wmMOjVwyEc_4ZhlEGZEsLwMTHFcsBKBLB4,39009
|
14
14
|
ultralytics/cfg/default.yaml,sha256=FcXbvTXXvMpssk9fSwdlnVTtyqfmlYE9gAcHsf0OMf8,8347
|
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
|
@@ -100,7 +100,7 @@ ultralytics/data/loaders.py,sha256=k1Vq7Rxv6tpsRsYuMdZeI3_f2BciAaZwhDQU8iHhVJM,2
|
|
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
|
-
ultralytics/engine/exporter.py,sha256=
|
103
|
+
ultralytics/engine/exporter.py,sha256=kt8pICda-2M_ICse1EW3uVif63qo6dO4tyf4L3UljrM,68613
|
104
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
|
@@ -179,19 +179,19 @@ 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=3f_4nENBQ0Mh6wiVl6KCzAOQeonVdh1xuc3v0njJ-JQ,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
|
186
186
|
ultralytics/solutions/heatmap.py,sha256=JkqwYAkIIDOj4HL5fLmcxQO0yix6-X8tAceXON6-Yg0,5275
|
187
187
|
ultralytics/solutions/object_counter.py,sha256=MuxQG4a22458WwciAB96m5AxVXwH98AIWAaf_kPali4,9613
|
188
|
-
ultralytics/solutions/parking_management.py,sha256=
|
188
|
+
ultralytics/solutions/parking_management.py,sha256=m1wRDyLWoW3dNr0z8e39UPVZRt6q55dr_L82-FD5h5A,11263
|
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=
|
191
|
+
ultralytics/solutions/security_alarm.py,sha256=1gXpapUdA5_Flq6bqEg13CP0wEHS2Y_dnW6CVCtDqQs,5617
|
192
192
|
ultralytics/solutions/solutions.py,sha256=BqkMDAq9A8kqL4TkjHLkMYXrJAdZPK-VAdNSObS1kNQ,7502
|
193
193
|
ultralytics/solutions/speed_estimation.py,sha256=A10DmuZlGkoZUyfHhZWcDRjj1-9GXiDhEjyBbAzfaDs,4936
|
194
|
-
ultralytics/solutions/streamlit_inference.py,sha256=
|
194
|
+
ultralytics/solutions/streamlit_inference.py,sha256=idqs_M8IbhTgh563wuDI9lGek6R7S1ms56rcL9239X8,9117
|
195
195
|
ultralytics/solutions/trackzone.py,sha256=jsSuvW3ExoQl5JyUF-5ZLQMou8h4qbkCGGGP831cHSY,2952
|
196
196
|
ultralytics/trackers/__init__.py,sha256=j72IgH2dZHQArMPK4YwcV5ieIw94fYvlGdQjB9cOQKw,227
|
197
197
|
ultralytics/trackers/basetrack.py,sha256=kPOeAX2ihvANtQJk-zUsN0C7JjhlJbx0UhjaCFk_ovQ,4423
|
@@ -202,9 +202,9 @@ ultralytics/trackers/utils/__init__.py,sha256=mHtJuK4hwF8cuV-VHDc7tp6u6D1gHz2Z7J
|
|
202
202
|
ultralytics/trackers/utils/gmc.py,sha256=VcURuY041qGCeWUGMxHZBr10T16LtcMqyv7AmTfE1MY,14557
|
203
203
|
ultralytics/trackers/utils/kalman_filter.py,sha256=cH9zD3fwkuezP97H9mw8cSBN7a8hHKx_Sx1j7t3oYGs,21349
|
204
204
|
ultralytics/trackers/utils/matching.py,sha256=Y94cMwo9TLd-IWFqHKp8dHSDyguS1qtOeebBMalWnJQ,7078
|
205
|
-
ultralytics/utils/__init__.py,sha256
|
205
|
+
ultralytics/utils/__init__.py,sha256=-Q71hK_mE5ED0PALDW9pOHCygWxF2SAIXwUN-5nhv2o,49505
|
206
206
|
ultralytics/utils/autobatch.py,sha256=yBkojvLhZofwwKnaA8BnEIFXp3UWt7rVmyuh-dl1Ymk,5020
|
207
|
-
ultralytics/utils/benchmarks.py,sha256=
|
207
|
+
ultralytics/utils/benchmarks.py,sha256=xFFFCPd8KISVkeDc32LZWZUBlqz6Sa1IzGUBnc1QZOM,25628
|
208
208
|
ultralytics/utils/checks.py,sha256=1Cu8k2qg_pFaoHvkiE07Ab5ZGLyZHZxFAg1IMM63CBQ,30145
|
209
209
|
ultralytics/utils/dist.py,sha256=NDFga-uKxkBX2zLxFHSene_cCiGQJoyOeCXcN9JIOIk,2358
|
210
210
|
ultralytics/utils/downloads.py,sha256=fh7I5toTSowAOXtmx5zIzCEDREfTFG45cLIHmsDmuYw,21974
|
@@ -231,9 +231,9 @@ ultralytics/utils/callbacks/neptune.py,sha256=IbGQfEltamUKXJt93uSLQFn8c2rYh3DMTg
|
|
231
231
|
ultralytics/utils/callbacks/raytune.py,sha256=Ck_yFzg7UZXiDWrLHaltjQybzVWSFDfzpdrx9ZYTRfI,700
|
232
232
|
ultralytics/utils/callbacks/tensorboard.py,sha256=SHlE58Fb-sg-uZKtgy-ybIO3SAIfK55aj8kTYGA0Cyg,4167
|
233
233
|
ultralytics/utils/callbacks/wb.py,sha256=sizfTa-xI9k2pnDSP_Q9pHZEFwcl__gSFM0AcneuRpY,7058
|
234
|
-
ultralytics-8.3.
|
235
|
-
ultralytics-8.3.
|
236
|
-
ultralytics-8.3.
|
237
|
-
ultralytics-8.3.
|
238
|
-
ultralytics-8.3.
|
239
|
-
ultralytics-8.3.
|
234
|
+
ultralytics-8.3.54.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
|
235
|
+
ultralytics-8.3.54.dist-info/METADATA,sha256=yrPbnbBywNWLmvWv7445QLjJ-FzZzWTw5goK-E0kwgo,35332
|
236
|
+
ultralytics-8.3.54.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
|
237
|
+
ultralytics-8.3.54.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
|
238
|
+
ultralytics-8.3.54.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
|
239
|
+
ultralytics-8.3.54.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|