Refactor code for speed and clarity
pull/13032/head
Glenn Jocher 2024-07-08 21:19:04 +02:00 committed by GitHub
parent 900a1262cd
commit 8257e0a68c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 1446 additions and 75 deletions

View File

@ -60,7 +60,41 @@ def run(
pt_only=False, # test PyTorch only pt_only=False, # test PyTorch only
hard_fail=False, # throw error on benchmark failure hard_fail=False, # throw error on benchmark failure
): ):
"""Run YOLOv5 benchmarks on multiple export formats and log results for model performance evaluation.""" """
Run YOLOv5 benchmarks on multiple export formats and log results for model performance evaluation.
Args:
weights (Path | str): Path to the model weights file (default: ROOT / "yolov5s.pt").
imgsz (int): Inference size in pixels (default: 640).
batch_size (int): Batch size for inference (default: 1).
data (Path | str): Path to the dataset.yaml file (default: ROOT / "data/coco128.yaml").
device (str): CUDA device, e.g., '0' or '0,1,2,3' or 'cpu' (default: None).
half (bool): Use FP16 half-precision inference (default: False).
test (bool): Test export formats only (default: False).
pt_only (bool): Test PyTorch format only (default: False).
hard_fail (bool): Throw an error on benchmark failure if True (default: False).
Returns:
None. Logs information about the benchmark results, including the format, size, mAP50-95, and inference time.
Notes:
Supported export formats and models include PyTorch, TorchScript, ONNX, OpenVINO, TensorRT, CoreML, TensorFlow
SavedModel, TensorFlow GraphDef, TensorFlow Lite, and TensorFlow Edge TPU. Edge TPU and TF.js are unsupported.
Examples:
```python
$ python benchmarks.py --weights yolov5s.pt --img 640
```
Usage:
Install required packages:
$ pip install -r requirements.txt coremltools onnx onnx-simplifier onnxruntime openvino-dev tensorflow-cpu # CPU support
$ pip install -r requirements.txt coremltools onnx onnx-simplifier onnxruntime-gpu openvino-dev tensorflow # GPU support
$ pip install -U nvidia-tensorrt --index-url https://pypi.ngc.nvidia.com # TensorRT
Run benchmarks:
$ python benchmarks.py --weights yolov5s.pt --img 640
"""
y, t = [], time.time() y, t = [], time.time()
device = select_device(device) device = select_device(device)
model_type = type(attempt_load(weights, fuse=False)) # DetectionModel, SegmentationModel, etc. model_type = type(attempt_load(weights, fuse=False)) # DetectionModel, SegmentationModel, etc.
@ -125,7 +159,23 @@ def test(
pt_only=False, # test PyTorch only pt_only=False, # test PyTorch only
hard_fail=False, # throw error on benchmark failure hard_fail=False, # throw error on benchmark failure
): ):
"""Run YOLOv5 export tests for all supported formats and log the results, including inference speed and mAP.""" """
Run YOLOv5 export tests for all supported formats and log the results, including export statuses.
Args:
weights (Path | str): Path to the model weights file (.pt format). Default is 'ROOT / "yolov5s.pt"'.
imgsz (int): Inference image size (in pixels). Default is 640.
batch_size (int): Batch size for testing. Default is 1.
data (Path | str): Path to the dataset configuration file (.yaml format). Default is 'ROOT / "data/coco128.yaml"'.
device (str): Device for running the tests, can be 'cpu' or a specific CUDA device ('0', '0,1,2,3', etc.). Default is an empty string.
half (bool): Use FP16 half-precision for inference if True. Default is False.
test (bool): Test export formats only without running inference. Default is False.
pt_only (bool): Test only the PyTorch model if True. Default is False.
hard_fail (bool): Raise error on export or test failure if True. Default is False.
Returns:
pd.DataFrame: DataFrame containing the results of the export tests, including format names and export statuses.
"""
y, t = [], time.time() y, t = [], time.time()
device = select_device(device) device = select_device(device)
for i, (name, f, suffix, gpu) in export.export_formats().iterrows(): # index, (name, file, suffix, gpu-capable) for i, (name, f, suffix, gpu) in export.export_formats().iterrows(): # index, (name, file, suffix, gpu-capable)
@ -151,7 +201,28 @@ def test(
def parse_opt(): def parse_opt():
"""Parses command-line arguments for YOLOv5 model inference configuration.""" """
Parses command-line arguments for YOLOv5 model inference configuration.
Args:
weights (str): The path to the weights file. Defaults to 'ROOT / "yolov5s.pt"'.
imgsz (int): Inference size in pixels. Defaults to 640.
batch_size (int): Batch size. Defaults to 1.
data (str): Path to the dataset YAML file. Defaults to 'ROOT / "data/coco128.yaml"'.
device (str): CUDA device, e.g., '0' or '0,1,2,3' or 'cpu'. Defaults to an empty string (auto-select).
half (bool): Use FP16 half-precision inference. This is a flag and defaults to False.
test (bool): Test exports only. This is a flag and defaults to False.
pt_only (bool): Test PyTorch only. This is a flag and defaults to False.
hard_fail (bool|str): Throw an error on benchmark failure. Can be a boolean or a string representing a minimum metric
floor, i.e., '0.29'. Defaults to False.
Returns:
argparse.Namespace: Parsed command-line arguments encapsulated in an argparse Namespace object.
Notes:
The function modifies the 'opt.data' by checking and validating the YAML path using 'check_yaml()'.
The parsed arguments are printed for reference using 'print_args()'.
"""
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument("--weights", type=str, default=ROOT / "yolov5s.pt", help="weights path") parser.add_argument("--weights", type=str, default=ROOT / "yolov5s.pt", help="weights path")
parser.add_argument("--imgsz", "--img", "--img-size", type=int, default=640, help="inference size (pixels)") parser.add_argument("--imgsz", "--img", "--img-size", type=int, default=640, help="inference size (pixels)")
@ -169,7 +240,34 @@ def parse_opt():
def main(opt): def main(opt):
"""Executes a test run if `opt.test` is True, otherwise starts training or inference with provided options.""" """
Executes YOLOv5 benchmark tests or main training/inference routines based on the provided command-line arguments.
Args:
opt (argparse.Namespace): Parsed command-line arguments including options for weights, image size, batch size, data
configuration, device, and other flags for inference settings.
Returns:
None: This function does not return any value. It leverages side-effects such as logging and running benchmarks.
Example:
```python
if __name__ == "__main__":
opt = parse_opt()
main(opt)
```
Notes:
- For a complete list of supported export formats and their respective requirements, refer to the
[Ultralytics YOLOv5 Export Formats](https://github.com/ultralytics/yolov5#export-formats).
- Ensure that you have installed all necessary dependencies by following the installation instructions detailed in
the [main repository](https://github.com/ultralytics/yolov5#installation).
```shell
# Running benchmarks on default weights and image size
$ python benchmarks.py --weights yolov5s.pt --img 640
```
"""
test(**vars(opt)) if opt.test else run(**vars(opt)) test(**vars(opt)) if opt.test else run(**vars(opt))

117
detect.py
View File

@ -97,7 +97,56 @@ def run(
dnn=False, # use OpenCV DNN for ONNX inference dnn=False, # use OpenCV DNN for ONNX inference
vid_stride=1, # video frame-rate stride vid_stride=1, # video frame-rate stride
): ):
"""Runs YOLOv5 detection inference on various sources like images, videos, directories, streams, etc.""" """
Runs YOLOv5 detection inference on various sources like images, videos, directories, streams, etc.
Args:
weights (str | Path): Path to the model weights file or a Triton URL. Default is 'yolov5s.pt'.
source (str | Path): Input source, which can be a file, directory, URL, glob pattern, screen capture, or webcam index.
Default is 'data/images'.
data (str | Path): Path to the dataset YAML file. Default is 'data/coco128.yaml'.
imgsz (tuple[int, int]): Inference image size as a tuple (height, width). Default is (640, 640).
conf_thres (float): Confidence threshold for detections. Default is 0.25.
iou_thres (float): Intersection Over Union (IOU) threshold for non-max suppression. Default is 0.45.
max_det (int): Maximum number of detections per image. Default is 1000.
device (str): CUDA device identifier (e.g., '0' or '0,1,2,3') or 'cpu'. Default is an empty string, which
uses the best available device.
view_img (bool): If True, display inference results using OpenCV. Default is False.
save_txt (bool): If True, save results in a text file. Default is False.
save_csv (bool): If True, save results in a CSV file. Default is False.
save_conf (bool): If True, include confidence scores in the saved results. Default is False.
save_crop (bool): If True, save cropped prediction boxes. Default is False.
nosave (bool): If True, do not save inference images or videos. Default is False.
classes (list[int]): List of class indices to filter detections by. Default is None.
agnostic_nms (bool): If True, perform class-agnostic non-max suppression. Default is False.
augment (bool): If True, use augmented inference. Default is False.
visualize (bool): If True, visualize feature maps. Default is False.
update (bool): If True, update all models' weights. Default is False.
project (str | Path): Directory to save results. Default is 'runs/detect'.
name (str): Name of the current experiment; used to create a subdirectory within 'project'. Default is 'exp'.
exist_ok (bool): If True, existing directories with the same name are reused instead of being incremented. Default is
False.
line_thickness (int): Thickness of bounding box lines in pixels. Default is 3.
hide_labels (bool): If True, do not display labels on bounding boxes. Default is False.
hide_conf (bool): If True, do not display confidence scores on bounding boxes. Default is False.
half (bool): If True, use FP16 half-precision inference. Default is False.
dnn (bool): If True, use OpenCV DNN backend for ONNX inference. Default is False.
vid_stride (int): Stride for processing video frames, to skip frames between processing. Default is 1.
Returns:
None
Examples:
```python
from ultralytics import run
# Run inference on an image
run(source='data/images/example.jpg', weights='yolov5s.pt', device='0')
# Run inference on a video with specific confidence threshold
run(source='data/videos/example.mp4', weights='yolov5s.pt', conf_thres=0.4, device='0')
```
"""
source = str(source) source = str(source)
save_img = not nosave and not source.endswith(".txt") # save inference images save_img = not nosave and not source.endswith(".txt") # save inference images
is_file = Path(source).suffix[1:] in (IMG_FORMATS + VID_FORMATS) is_file = Path(source).suffix[1:] in (IMG_FORMATS + VID_FORMATS)
@ -266,7 +315,48 @@ def run(
def parse_opt(): def parse_opt():
"""Parses command-line arguments for YOLOv5 detection, setting inference options and model configurations.""" """
Parses command-line arguments for YOLOv5 detection, setting inference options and model configurations.
Args:
--weights (str | list[str], optional): Model path or Triton URL. Defaults to ROOT / 'yolov5s.pt'.
--source (str, optional): File/dir/URL/glob/screen/0(webcam). Defaults to ROOT / 'data/images'.
--data (str, optional): Dataset YAML path. Provides dataset configuration information.
--imgsz (list[int], optional): Inference size (height, width). Defaults to [640].
--conf-thres (float, optional): Confidence threshold. Defaults to 0.25.
--iou-thres (float, optional): NMS IoU threshold. Defaults to 0.45.
--max-det (int, optional): Maximum number of detections per image. Defaults to 1000.
--device (str, optional): CUDA device, i.e., '0' or '0,1,2,3' or 'cpu'. Defaults to "".
--view-img (bool, optional): Flag to display results. Defaults to False.
--save-txt (bool, optional): Flag to save results to *.txt files. Defaults to False.
--save-csv (bool, optional): Flag to save results in CSV format. Defaults to False.
--save-conf (bool, optional): Flag to save confidences in labels saved via --save-txt. Defaults to False.
--save-crop (bool, optional): Flag to save cropped prediction boxes. Defaults to False.
--nosave (bool, optional): Flag to prevent saving images/videos. Defaults to False.
--classes (list[int], optional): List of classes to filter results by, e.g., '--classes 0 2 3'. Defaults to None.
--agnostic-nms (bool, optional): Flag for class-agnostic NMS. Defaults to False.
--augment (bool, optional): Flag for augmented inference. Defaults to False.
--visualize (bool, optional): Flag for visualizing features. Defaults to False.
--update (bool, optional): Flag to update all models in the model directory. Defaults to False.
--project (str, optional): Directory to save results. Defaults to ROOT / 'runs/detect'.
--name (str, optional): Sub-directory name for saving results within --project. Defaults to 'exp'.
--exist-ok (bool, optional): Flag to allow overwriting if the project/name already exists. Defaults to False.
--line-thickness (int, optional): Thickness (in pixels) of bounding boxes. Defaults to 3.
--hide-labels (bool, optional): Flag to hide labels in the output. Defaults to False.
--hide-conf (bool, optional): Flag to hide confidences in the output. Defaults to False.
--half (bool, optional): Flag to use FP16 half-precision inference. Defaults to False.
--dnn (bool, optional): Flag to use OpenCV DNN for ONNX inference. Defaults to False.
--vid-stride (int, optional): Video frame-rate stride, determining the number of frames to skip in between consecutive frames. Defaults to 1.
Returns:
argparse.Namespace: Parsed command-line arguments as an argparse.Namespace object.
Example:
```python
from ultralytics import YOLOv5
args = YOLOv5.parse_opt()
```
"""
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument("--weights", nargs="+", type=str, default=ROOT / "yolov5s.pt", help="model path or triton URL") parser.add_argument("--weights", nargs="+", type=str, default=ROOT / "yolov5s.pt", help="model path or triton URL")
parser.add_argument("--source", type=str, default=ROOT / "data/images", help="file/dir/URL/glob/screen/0(webcam)") parser.add_argument("--source", type=str, default=ROOT / "data/images", help="file/dir/URL/glob/screen/0(webcam)")
@ -303,7 +393,28 @@ def parse_opt():
def main(opt): def main(opt):
"""Executes YOLOv5 model inference with given options, checking requirements before running the model.""" """
Executes YOLOv5 model inference based on provided command-line arguments, validating dependencies before running.
Args:
opt (argparse.Namespace): Command-line arguments for YOLOv5 detection. See function `parse_opt` for details.
Returns:
None
Note:
This function performs essential pre-execution checks and initiates the YOLOv5 detection process based on user-specified options.
Refer to the usage guide and examples for more information about different sources and formats at:
https://github.com/ultralytics/ultralytics
Example usage:
```python
if __name__ == "__main__":
opt = parse_opt()
main(opt)
```
"""
check_requirements(ROOT / "requirements.txt", exclude=("tensorboard", "thop")) check_requirements(ROOT / "requirements.txt", exclude=("tensorboard", "thop"))
run(**vars(opt)) run(**vars(opt))

621
export.py
View File

@ -92,7 +92,22 @@ MACOS = platform.system() == "Darwin" # macOS environment
class iOSModel(torch.nn.Module): class iOSModel(torch.nn.Module):
def __init__(self, model, im): def __init__(self, model, im):
"""Initializes an iOS compatible model with normalization based on image dimensions.""" """
Initializes an iOS compatible model with normalization based on image dimensions.
Args:
model (torch.nn.Module): The PyTorch model to be adapted for iOS compatibility.
im (torch.Tensor): An input tensor representing a batch of images with shape (batch, channel, height, width).
Returns:
None: This method does not return any value.
Notes:
This initializer configures normalization based on the input image dimensions, which is critical for
ensuring the model's compatibility and proper functionality on iOS devices. The normalization step
involves dividing by the image width if the image is square; otherwise, additional conditions might
apply (trimmed for brevity).
"""
super().__init__() super().__init__()
b, c, h, w = im.shape # batch, channel, height, width b, c, h, w = im.shape # batch, channel, height, width
self.model = model self.model = model
@ -105,13 +120,48 @@ class iOSModel(torch.nn.Module):
# self.normalize = torch.tensor([1. / w, 1. / h, 1. / w, 1. / h]).expand(np, 4) # explicit (faster, larger) # self.normalize = torch.tensor([1. / w, 1. / h, 1. / w, 1. / h]).expand(np, 4) # explicit (faster, larger)
def forward(self, x): def forward(self, x):
"""Runs forward pass on the input tensor, returning class confidences and normalized coordinates.""" """
Runs a forward pass on the input tensor, returning class confidences and normalized coordinates.
Args:
x (torch.Tensor): Input tensor containing the image data.
Returns:
torch.Tensor: Concatenated tensor with normalized coordinates (xywh), confidence scores (conf), and class probabilities (cls).
Examples:
```python
model = iOSModel(pretrained_model, input_image)
output = model.forward(torch_input_tensor)
```
"""
xywh, conf, cls = self.model(x)[0].squeeze().split((4, 1, self.nc), 1) xywh, conf, cls = self.model(x)[0].squeeze().split((4, 1, self.nc), 1)
return cls * conf, xywh * self.normalize # confidence (3780, 80), coordinates (3780, 4) return cls * conf, xywh * self.normalize # confidence (3780, 80), coordinates (3780, 4)
def export_formats(): def export_formats():
"""Returns a DataFrame of supported YOLOv5 model export formats and their properties.""" """
Returns a DataFrame of supported YOLOv5 model export formats and their properties.
Returns:
pd.DataFrame: A pandas DataFrame containing supported export formats and their properties. The DataFrame includes
columns for format name, CLI argument suffix, file extension or directory name, and boolean flags indicating if the
export format supports training and detection.
Examples:
```python
formats = export_formats()
print(formats)
```
Notes:
The DataFrame contains the following columns:
- Format: The name of the model format (e.g., PyTorch, TorchScript, ONNX, etc.)
- Include Argument: The argument to use with the export script to include this format.
- File Suffix: File extension or directory name associated with the format.
- Supports Training: Whether the format supports training.
- Supports Detection: Whether the format supports detection.
"""
x = [ x = [
["PyTorch", "-", ".pt", True, True], ["PyTorch", "-", ".pt", True, True],
["TorchScript", "torchscript", ".torchscript", True, True], ["TorchScript", "torchscript", ".torchscript", True, True],
@ -130,7 +180,28 @@ def export_formats():
def try_export(inner_func): def try_export(inner_func):
"""Decorator @try_export for YOLOv5 model export functions that logs success/failure, time taken, and file size.""" """
Logs success or failure, execution time, and file size for YOLOv5 model export functions wrapped with @try_export.
Args:
inner_func (Callable): The model export function to be wrapped by the decorator.
Returns:
Callable: The wrapped function that logs execution details. When executed, this wrapper function returns either:
- Tuple (str, torch.nn.Module): On success the file path of the exported model and the model instance.
- Tuple (None, None): On failure None values indicating export failed.
Examples:
@try_export
def export_onnx(model, filepath):
# implementation here
pass
exported_file, exported_model = export_onnx(yolo_model, 'path/to/save/model.onnx')
Notes:
For additional requirements and model export formats, refer to the [Ultralytics YOLOv5 GitHub repository](https://github.com/ultralytics/ultralytics).
"""
inner_args = get_default_args(inner_func) inner_args = get_default_args(inner_func)
def outer_func(*args, **kwargs): def outer_func(*args, **kwargs):
@ -150,8 +221,46 @@ def try_export(inner_func):
@try_export @try_export
def export_torchscript(model, im, file, optimize, prefix=colorstr("TorchScript:")): def export_torchscript(model, im, file, optimize, prefix=colorstr("TorchScript:")):
"""Exports YOLOv5 model to TorchScript format, optionally optimized for mobile, with image shape and stride """
metadata. Exports a YOLOv5 model to the TorchScript format.
Args:
model (torch.nn.Module): The YOLOv5 model to be exported.
im (torch.Tensor): Example input tensor to be used for tracing the TorchScript model.
file (Path): File path where the exported TorchScript model will be saved.
optimize (bool): If True, applies optimizations for mobile deployment.
prefix (str): Optional prefix for log messages. Default is 'TorchScript:'.
Returns:
(str | None, torch.jit.ScriptModule | None): A tuple containing the file path of the exported model
(as a string) and the TorchScript model (as a torch.jit.ScriptModule). If the export fails, both elements
of the tuple will be None.
Notes:
- This function uses tracing to create the TorchScript model.
- Metadata, including the input image shape, model stride, and class names, is saved in an extra file (`config.txt`)
within the TorchScript model package.
- For mobile optimization, refer to the PyTorch tutorial: https://pytorch.org/tutorials/recipes/mobile_interpreter.html
Example:
```python
from pathlib import Path
import torch
from models.experimental import attempt_load
from utils.torch_utils import select_device
# Load model
weights = 'yolov5s.pt'
device = select_device('')
model = attempt_load(weights, map_location=device)
# Example input tensor
im = torch.zeros(1, 3, 640, 640).to(device)
# Export model
file = Path('yolov5s.torchscript')
export_torchscript(model, im, file, optimize=False)
```
""" """
LOGGER.info(f"\n{prefix} starting export with torch {torch.__version__}...") LOGGER.info(f"\n{prefix} starting export with torch {torch.__version__}...")
f = file.with_suffix(".torchscript") f = file.with_suffix(".torchscript")
@ -168,7 +277,31 @@ def export_torchscript(model, im, file, optimize, prefix=colorstr("TorchScript:"
@try_export @try_export
def export_onnx(model, im, file, opset, dynamic, simplify, prefix=colorstr("ONNX:")): def export_onnx(model, im, file, opset, dynamic, simplify, prefix=colorstr("ONNX:")):
"""Exports a YOLOv5 model to ONNX format with dynamic axes and optional simplification.""" """
Export a YOLOv5 model to ONNX format with dynamic axes support and optional model simplification.
Args:
model (torch.nn.Module): The YOLOv5 model to be exported.
im (torch.Tensor): A sample input tensor for model tracing, usually the shape is (1, 3, height, width).
file (pathlib.Path | str): The output file path where the ONNX model will be saved.
opset (int): The ONNX opset version to use for export.
dynamic (bool): If True, enables dynamic axes for batch, height, and width dimensions.
simplify (bool): If True, applies ONNX model simplification for optimization.
prefix (str): A prefix string for logging messages, defaults to 'ONNX:'.
Returns:
tuple[pathlib.Path | str, None]: The path to the saved ONNX model file and None (consistent with decorator).
Raises:
ImportError: If required libraries for export (e.g., 'onnx', 'onnx-simplifier') are not installed.
AssertionError: If the simplification check fails.
Notes:
The required packages for this function can be installed via:
```
pip install onnx onnx-simplifier onnxruntime onnxruntime-gpu
```
"""
check_requirements("onnx>=1.12.0") check_requirements("onnx>=1.12.0")
import onnx import onnx
@ -225,7 +358,41 @@ def export_onnx(model, im, file, opset, dynamic, simplify, prefix=colorstr("ONNX
@try_export @try_export
def export_openvino(file, metadata, half, int8, data, prefix=colorstr("OpenVINO:")): def export_openvino(file, metadata, half, int8, data, prefix=colorstr("OpenVINO:")):
"""Exports a YOLOv5 model to OpenVINO format with optional FP16 and INT8 quantization; see https://pypi.org/project/openvino-dev/.""" """
Exports a YOLOv5 model to OpenVINO format with optional FP16 and INT8 quantization; see
https://pypi.org/project/openvino-dev/.
Args:
file (Path): The path to the output file where the OpenVINO model will be saved.
metadata (dict): Dictionary including model metadata such as names and strides.
half (bool): If True, export the model with FP16 precision.
int8 (bool): If True, export the model with INT8 quantization.
data (str): Path to the dataset YAML file required for INT8 quantization.
prefix (str): Prefix string for logging purposes (default is "OpenVINO:").
Returns:
(str, openvino.runtime.Model | None): Returns the OpenVINO model file path and openvino.runtime.Model object if
export is successful; otherwise, returns None.
Notes:
- Requires `openvino-dev` package version 2023.0 or higher. Install with:
`$ pip install openvino-dev>=2023.0`
- For INT8 quantization, also requires `nncf` library version 2.5.0 or higher. Install with:
`$ pip install nncf>=2.5.0`
Examples:
```python
from pathlib import Path
from ultralytics import YOLOv5
model = YOLOv5('yolov5s.pt')
export_openvino(Path('yolov5s.onnx'), metadata={'names': model.names, 'stride': model.stride}, half=True,
int8=False, data='data.yaml')
```
This will export the YOLOv5 model to OpenVINO with FP16 precision but without INT8 quantization, saving it to
the specified file path.
"""
check_requirements("openvino-dev>=2023.0") # requires openvino-dev: https://pypi.org/project/openvino-dev/ check_requirements("openvino-dev>=2023.0") # requires openvino-dev: https://pypi.org/project/openvino-dev/
import openvino.runtime as ov # noqa import openvino.runtime as ov # noqa
from openvino.tools import mo # noqa from openvino.tools import mo # noqa
@ -282,8 +449,39 @@ def export_openvino(file, metadata, half, int8, data, prefix=colorstr("OpenVINO:
@try_export @try_export
def export_paddle(model, im, file, metadata, prefix=colorstr("PaddlePaddle:")): def export_paddle(model, im, file, metadata, prefix=colorstr("PaddlePaddle:")):
"""Exports a YOLOv5 model to PaddlePaddle format using X2Paddle, saving to `save_dir` and adding a metadata.yaml """
file. Exports a YOLOv5 model to PaddlePaddle format using X2Paddle, saving the converted model and metadata.
Args:
model (torch.nn.Module): The YOLOv5 model to be exported.
im (torch.Tensor): Input tensor used for model tracing during export.
file (pathlib.Path): Path to the source file to be converted.
metadata (dict): Additional metadata to be saved alongside the model.
prefix (str): Prefix for logging information.
Returns:
tuple (str, None): A tuple where the first element is the path to the saved PaddlePaddle model, and the
second element is None.
Examples:
```python
from pathlib import Path
import torch
# Assume 'model' is a pre-trained YOLOv5 model and 'im' is an example input tensor
model = ... # Load your model here
im = torch.randn((1, 3, 640, 640)) # Dummy input tensor for tracing
file = Path("yolov5s.pt")
metadata = {"stride": 32, "names": ["person", "bicycle", "car", "motorbike"]}
export_paddle(model=model, im=im, file=file, metadata=metadata)
```
Notes:
Ensure that `paddlepaddle` and `x2paddle` are installed, as these are required for the export function. You can
install them via pip:
```
$ pip install paddlepaddle x2paddle
```
""" """
check_requirements(("paddlepaddle", "x2paddle")) check_requirements(("paddlepaddle", "x2paddle"))
import x2paddle import x2paddle
@ -299,7 +497,36 @@ def export_paddle(model, im, file, metadata, prefix=colorstr("PaddlePaddle:")):
@try_export @try_export
def export_coreml(model, im, file, int8, half, nms, prefix=colorstr("CoreML:")): def export_coreml(model, im, file, int8, half, nms, prefix=colorstr("CoreML:")):
"""Exports YOLOv5 model to CoreML format with optional NMS, INT8, and FP16 support; requires coremltools.""" """
Export a YOLOv5 model to CoreML format with optional NMS, INT8, and FP16 support.
Args:
model (torch.nn.Module): The YOLOv5 model to be exported.
im (torch.Tensor): Example input tensor to trace the model.
file (pathlib.Path): Path object where the CoreML model will be saved.
int8 (bool): Flag indicating whether to use INT8 quantization (default is False).
half (bool): Flag indicating whether to use FP16 quantization (default is False).
nms (bool): Flag indicating whether to include Non-Maximum Suppression (default is False).
prefix (str): Prefix string for logging purposes (default is 'CoreML:').
Returns:
tuple[pathlib.Path | None, None]: The path to the saved CoreML model file, or (None, None) if there is an error.
Notes:
The exported CoreML model will be saved with a .mlmodel extension.
Quantization is supported only on macOS.
Example:
```python
from pathlib import Path
import torch
from models.yolo import Model
model = Model(cfg, ch=3, nc=80)
im = torch.randn(1, 3, 640, 640)
file = Path("yolov5s_coreml")
export_coreml(model, im, file, int8=False, half=False, nms=True)
```
"""
check_requirements("coremltools") check_requirements("coremltools")
import coremltools as ct import coremltools as ct
@ -327,7 +554,36 @@ def export_engine(model, im, file, half, dynamic, simplify, workspace=4, verbose
""" """
Exports a YOLOv5 model to TensorRT engine format, requiring GPU and TensorRT>=7.0.0. Exports a YOLOv5 model to TensorRT engine format, requiring GPU and TensorRT>=7.0.0.
https://developer.nvidia.com/tensorrt Args:
model (torch.nn.Module): YOLOv5 model to be exported.
im (torch.Tensor): Input tensor of shape (B,C,H,W).
file (Path): Path to save the exported model.
half (bool): Set to True to export with FP16 precision.
dynamic (bool): Set to True to enable dynamic input shapes.
simplify (bool): Set to True to simplify the model during export.
workspace (int): Workspace size in GB (default is 4).
verbose (bool): Set to True for verbose logging output.
prefix (str): Log message prefix.
Returns:
(Path, None): Tuple containing the path to the exported model and None.
Raises:
AssertionError: If executed on CPU instead of GPU.
RuntimeError: If there is a failure in parsing the ONNX file.
Example:
```python
from ultralytics import YOLOv5
import torch
from pathlib import Path
model = YOLOv5('yolov5s.pt') # Load a pre-trained YOLOv5 model
input_tensor = torch.randn(1, 3, 640, 640).cuda() # example input tensor on GPU
export_path = Path('yolov5s.engine') # export destination
export_engine(model.model, input_tensor, export_path, half=True, dynamic=True, simplify=True, workspace=8, verbose=True)
```
""" """
assert im.device.type != "cpu", "export running on CPU but must be on GPU, i.e. `python export.py --device 0`" assert im.device.type != "cpu", "export running on CPU but must be on GPU, i.e. `python export.py --device 0`"
try: try:
@ -407,8 +663,40 @@ def export_saved_model(
keras=False, keras=False,
prefix=colorstr("TensorFlow SavedModel:"), prefix=colorstr("TensorFlow SavedModel:"),
): ):
"""Exports a YOLOv5 model to TensorFlow SavedModel format, supporting dynamic axes and non-maximum suppression """
(NMS). Exports a YOLOv5 model to TensorFlow SavedModel format, supporting dynamic axes and non-maximum suppression (NMS).
Args:
model (torch.nn.Module): The PyTorch model to convert.
im (torch.Tensor): Sample input tensor with shape (B, C, H, W) for tracing.
file (pathlib.Path): File path to save the exported model.
dynamic (bool): Flag to indicate whether dynamic axes should be used.
tf_nms (bool, optional): Enable TensorFlow non-maximum suppression (NMS). Default is False.
agnostic_nms (bool, optional): Enable class-agnostic NMS. Default is False.
topk_per_class (int, optional): Top K detections per class to keep before applying NMS. Default is 100.
topk_all (int, optional): Top K detections across all classes to keep before applying NMS. Default is 100.
iou_thres (float, optional): IoU threshold for NMS. Default is 0.45.
conf_thres (float, optional): Confidence threshold for detections. Default is 0.25.
keras (bool, optional): Save the model in Keras format if True. Default is False.
prefix (str, optional): Prefix for logging messages. Default is "TensorFlow SavedModel:".
Returns:
tuple: A tuple containing the path to the saved model folder (str) and the Keras model instance (tf.keras.Model | None).
Notes:
- The method supports TensorFlow versions up to 2.15.1.
- TensorFlow NMS may not be supported in older TensorFlow versions.
- If the TensorFlow version exceeds 2.13.1, it might cause issues when exporting to TFLite.
Refer to: https://github.com/ultralytics/yolov5/issues/12489
Raises:
Exception: If TensorFlow is not installed.
Example:
```python
model, im = ... # Initialize your PyTorch model and input tensor
export_saved_model(model, im, Path("yolov5_saved_model"), dynamic=True)
```
""" """
# YOLOv5 TensorFlow SavedModel export # YOLOv5 TensorFlow SavedModel export
try: try:
@ -460,7 +748,28 @@ def export_saved_model(
@try_export @try_export
def export_pb(keras_model, file, prefix=colorstr("TensorFlow GraphDef:")): def export_pb(keras_model, file, prefix=colorstr("TensorFlow GraphDef:")):
"""Exports YOLOv5 model to TensorFlow GraphDef *.pb format; see https://github.com/leimao/Frozen_Graph_TensorFlow for details.""" """
Exports YOLOv5 model to TensorFlow GraphDef (*.pb) format.
Args:
keras_model (tf.keras.Model): The Keras model to be converted.
file (Path): The output file path where the GraphDef will be saved.
prefix (str): Optional prefix string; defaults to a colored string indicating TensorFlow GraphDef export status.
Returns:
Tuple[Path, None]: The file path where the GraphDef model was saved and a None placeholder.
Notes:
For more details, refer to the guide on frozen graphs: https://github.com/leimao/Frozen_Graph_TensorFlow
Example:
```python
from pathlib import Path
keras_model = ... # assume an existing Keras model
file = Path("model.pb")
export_pb(keras_model, file)
```
"""
import tensorflow as tf import tensorflow as tf
from tensorflow.python.framework.convert_to_constants import convert_variables_to_constants_v2 from tensorflow.python.framework.convert_to_constants import convert_variables_to_constants_v2
@ -480,7 +789,46 @@ def export_tflite(
keras_model, im, file, int8, per_tensor, data, nms, agnostic_nms, prefix=colorstr("TensorFlow Lite:") keras_model, im, file, int8, per_tensor, data, nms, agnostic_nms, prefix=colorstr("TensorFlow Lite:")
): ):
# YOLOv5 TensorFlow Lite export # YOLOv5 TensorFlow Lite export
"""Exports YOLOv5 model to TensorFlow Lite format with optional FP16, INT8, and NMS support.""" """
Exports YOLOv5 model to TensorFlow Lite format with optional FP16, INT8, and NMS support.
Args:
keras_model (tf.keras.Model): The Keras model to be exported.
im (torch.Tensor): Image tensor for normalization and model tracing.
file (Path): The file path to save the exported TensorFlow Lite model.
int8 (bool): Enables INT8 quantization if True.
per_tensor (bool): If True, disable per-channel quantization (applicable when int8 is True).
data (str): Path to dataset for representative dataset generation in INT8 quantization.
nms (bool): Enables Non-Maximum Suppression (NMS) support if True.
agnostic_nms (bool): Enables class-agnostic NMS support if True.
prefix (str): Prefix for logging messages.
Returns:
(str | None, tf.lite.Model | None): The file path of the saved TFLite model, and the TFLite model instance if successful.
Example:
```python
from pathlib import Path
import torch
import tensorflow as tf
from torchvision import models
# Load a pre-trained model from torchvision
model = models.yolov5() # Placeholder for actual YOLOv5 model loading
im = torch.zeros(1, 3, 640, 640) # Example image tensor
# Provide the Keras model wrapping the PyTorch YOLOv5 model
keras_model = tf.keras.models.load_model('path/to/keras_model.h5')
# Export the model to TensorFlow Lite format
file_path = export_tflite(keras_model, im, Path('model.tflite'), int8=False, per_tensor=False,
data='path/to/dataset.yaml', nms=False, agnostic_nms=False)
```
Notes:
Ensure the TensorFlow and TensorFlow Lite dependencies are installed. The exported TFLite model can be used for
efficient inference on mobile and edge devices.
"""
import tensorflow as tf import tensorflow as tf
LOGGER.info(f"\n{prefix} starting export with tensorflow {tf.__version__}...") LOGGER.info(f"\n{prefix} starting export with tensorflow {tf.__version__}...")
@ -515,9 +863,31 @@ def export_tflite(
@try_export @try_export
def export_edgetpu(file, prefix=colorstr("Edge TPU:")): def export_edgetpu(file, prefix=colorstr("Edge TPU:")):
""" """
Clear and concise summary line describing the function's purpose:
Exports a YOLOv5 model to Edge TPU compatible TFLite format; requires Linux and Edge TPU compiler. Exports a YOLOv5 model to Edge TPU compatible TFLite format; requires Linux and Edge TPU compiler.
https://coral.ai/docs/edgetpu/models-intro/ Args:
file (Path): Path to the YOLOv5 model file to be exported (.pt format).
prefix (str, optional): Prefix for logging messages. Defaults to colorstr("Edge TPU:").
Returns:
tuple[Path, None]: Path to the exported Edge TPU compatible TFLite model, None.
Raises:
AssertionError: If the system is not Linux.
subprocess.CalledProcessError: If any subprocess call to install or run the Edge TPU compiler fails.
Notes:
To use this function, ensure you have the Edge TPU compiler installed on your Linux system. You can find
installation instructions here: https://coral.ai/docs/edgetpu/compiler/.
Example:
```python
from pathlib import Path
file = Path('yolov5s.pt')
export_edgetpu(file)
```
""" """
cmd = "edgetpu_compiler --version" cmd = "edgetpu_compiler --version"
help_url = "https://coral.ai/docs/edgetpu/compiler/" help_url = "https://coral.ai/docs/edgetpu/compiler/"
@ -556,7 +926,30 @@ def export_edgetpu(file, prefix=colorstr("Edge TPU:")):
@try_export @try_export
def export_tfjs(file, int8, prefix=colorstr("TensorFlow.js:")): def export_tfjs(file, int8, prefix=colorstr("TensorFlow.js:")):
"""Exports a YOLOv5 model to TensorFlow.js format, optionally with uint8 quantization.""" """
Exports a YOLOv5 model to TensorFlow.js format, optionally with uint8 quantization.
Args:
file (Path): Path to the input model file.
int8 (bool): If True, applies uint8 quantization.
prefix (str): Prefix for logging information (default: colorstr("TensorFlow.js:")).
Returns:
tuple: Output directory path (str), None
Notes:
This function requires `tensorflowjs` to be installed. You can install it using:
```shell
pip install tensorflowjs
```
Example usage:
```python
export_tfjs(Path('yolov5s.onnx'), int8=False)
```
The TensorFlow.js converted model is saved in the directory specified by `file` with "_web_model" suffix.
"""
check_requirements("tensorflowjs") check_requirements("tensorflowjs")
import tensorflowjs as tfjs import tensorflowjs as tfjs
@ -596,7 +989,30 @@ def add_tflite_metadata(file, metadata, num_outputs):
""" """
Adds TFLite metadata to a model file, supporting multiple outputs, as specified by TensorFlow guidelines. Adds TFLite metadata to a model file, supporting multiple outputs, as specified by TensorFlow guidelines.
https://www.tensorflow.org/lite/models/convert/metadata Args:
file (str): The path to the TensorFlow Lite model file to which metadata will be added.
metadata (dict): Metadata information to be added to the model, structured as required by TFLite metadata schema.
num_outputs (int): Number of output tensors the model has, to properly configure the metadata.
Returns:
None
Example:
```python
metadata = {
"name": "yolov5",
"description": "YOLOv5 object detection model",
"version": "1.0",
"author": "Ultralytics",
"license": "Apache License 2.0"
}
add_tflite_metadata("model.tflite", metadata, num_outputs=4)
```
Note:
TFLite metadata can include information such as model name, version, author, and other relevant details.
For more details and structure of the metadata, refer to the TensorFlow Lite
[metadata guidelines](https://www.tensorflow.org/lite/models/convert/metadata).
""" """
with contextlib.suppress(ImportError): with contextlib.suppress(ImportError):
# check_requirements('tflite_support') # check_requirements('tflite_support')
@ -630,8 +1046,49 @@ def add_tflite_metadata(file, metadata, num_outputs):
def pipeline_coreml(model, im, file, names, y, prefix=colorstr("CoreML Pipeline:")): def pipeline_coreml(model, im, file, names, y, prefix=colorstr("CoreML Pipeline:")):
"""Converts a PyTorch YOLOv5 model to CoreML format with NMS, handling different input/output shapes and saving the """
model. Converts a PyTorch YOLOv5 model to CoreML format with Non-Maximum Suppression (NMS), handling different input/output
shapes and saving the model.
Args:
model (torch.nn.Module): The YOLOv5 PyTorch model.
im (torch.Tensor): Input tensor example with shape [N, C, H, W], where N is the batch size, C is the number of
channels, H is the height, and W is the width.
file (Path): Path to save the converted CoreML model.
names (dict[int, str]): Dictionary mapping class indices to class names.
y (torch.Tensor): Output tensor from the PyTorch model's forward pass.
prefix (str): Custom prefix for logging messages.
Returns:
Path: Path to the saved CoreML model (.mlmodel).
Raises:
AssertionError: If the number of class names does not match the number of classes in the model.
Notes:
- This function requires `coremltools` to be installed.
- Running this function on a non-macOS environment might not support some features.
- Flexible input shapes and additional NMS options can be customized within the function.
Examples:
```python
from pathlib import Path
import torch
# Load YOLOv5 model and an example input tensor
model = torch.load("yolov5s.pt")
im = torch.zeros(1, 3, 640, 640) # Example input tensor
# Define class names
names = {0: "person", 1: "bicycle", 2: "car", ...}
# Perform forward pass to get model output
y = model(im)
# Convert to CoreML
output_file = Path("yolov5s.mlmodel")
pipeline_coreml(model, im, output_file, names, y)
```
""" """
import coremltools as ct import coremltools as ct
from PIL import Image from PIL import Image
@ -788,7 +1245,70 @@ def run(
iou_thres=0.45, # TF.js NMS: IoU threshold iou_thres=0.45, # TF.js NMS: IoU threshold
conf_thres=0.25, # TF.js NMS: confidence threshold conf_thres=0.25, # TF.js NMS: confidence threshold
): ):
"""Exports YOLOv5 model to specified formats including ONNX, TensorRT, CoreML, and TensorFlow; see https://github.com/ultralytics/yolov5.""" """
Exports a YOLOv5 model to specified formats including ONNX, TensorRT, CoreML, and TensorFlow.
Args:
data (str | Path): Path to the dataset YAML configuration file. Default is 'data/coco128.yaml'.
weights (str | Path): Path to the pretrained model weights file. Default is 'yolov5s.pt'.
imgsz (tuple): Image size as (height, width). Default is (640, 640).
batch_size (int): Batch size for exporting the model. Default is 1.
device (str): Device to run the export on, e.g., '0' for GPU, 'cpu' for CPU. Default is 'cpu'.
include (tuple): Formats to include in the export. Default is ('torchscript', 'onnx').
half (bool): Flag to export model with FP16 half-precision. Default is False.
inplace (bool): Set the YOLOv5 Detect() module inplace=True. Default is False.
keras (bool): Flag to use Keras for TensorFlow SavedModel export. Default is False.
optimize (bool): Optimize TorchScript model for mobile deployment. Default is False.
int8 (bool): Apply INT8 quantization for CoreML or TensorFlow models. Default is False.
per_tensor (bool): Apply per tensor quantization for TensorFlow models. Default is False.
dynamic (bool): Enable dynamic axes for ONNX, TensorFlow, or TensorRT exports. Default is False.
simplify (bool): Simplify the ONNX model during export. Default is False.
opset (int): ONNX opset version. Default is 12.
verbose (bool): Enable verbose logging for TensorRT export. Default is False.
workspace (int): TensorRT workspace size in GB. Default is 4.
nms (bool): Add non-maximum suppression (NMS) to the TensorFlow model. Default is False.
agnostic_nms (bool): Add class-agnostic NMS to the TensorFlow model. Default is False.
topk_per_class (int): Top-K boxes per class to keep for TensorFlow.js NMS. Default is 100.
topk_all (int): Top-K boxes for all classes to keep for TensorFlow.js NMS. Default is 100.
iou_thres (float): IoU threshold for NMS. Default is 0.45.
conf_thres (float): Confidence threshold for NMS. Default is 0.25.
Returns:
None
Notes:
- Model export is based on the specified formats in the 'include' argument.
- Be cautious of combinations where certain flags are mutually exclusive, such as `--half` and `--dynamic`.
Example:
```python
run(
data="data/coco128.yaml",
weights="yolov5s.pt",
imgsz=(640, 640),
batch_size=1,
device="cpu",
include=("torchscript", "onnx"),
half=False,
inplace=False,
keras=False,
optimize=False,
int8=False,
per_tensor=False,
dynamic=False,
simplify=False,
opset=12,
verbose=False,
workspace=4,
nms=False,
agnostic_nms=False,
topk_per_class=100,
topk_all=100,
iou_thres=0.45,
conf_thres=0.25,
)
```
"""
t = time.time() t = time.time()
include = [x.lower() for x in include] # to lowercase include = [x.lower() for x in include] # to lowercase
fmts = tuple(export_formats()["Argument"][1:]) # --include arguments fmts = tuple(export_formats()["Argument"][1:]) # --include arguments
@ -901,7 +1421,23 @@ def run(
def parse_opt(known=False): def parse_opt(known=False):
"""Parses command-line arguments for YOLOv5 model export configurations, returning the parsed options.""" """
Parses command-line arguments for YOLOv5 model export configurations.
Args:
known (bool): If True, `argparse.ArgumentParser.parse_known_args` is used to parse command-line arguments; otherwise,
`argparse.ArgumentParser.parse_args` is used. Defaults to False.
Returns:
argparse.Namespace: An object containing parsed command-line arguments.
Example:
```python
opts = parse_opt()
print(opts.data)
print(opts.weights)
```
"""
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument("--data", type=str, default=ROOT / "data/coco128.yaml", help="dataset.yaml path") parser.add_argument("--data", type=str, default=ROOT / "data/coco128.yaml", help="dataset.yaml path")
parser.add_argument("--weights", nargs="+", type=str, default=ROOT / "yolov5s.pt", help="model.pt path(s)") parser.add_argument("--weights", nargs="+", type=str, default=ROOT / "yolov5s.pt", help="model.pt path(s)")
@ -937,7 +1473,44 @@ def parse_opt(known=False):
def main(opt): def main(opt):
"""Executes the YOLOv5 model inference or export with specified weights and options.""" """
```python Exports the YOLOv5 model to specified formats, including ONNX, TensorRT, CoreML, and TensorFlow.
Args:
opt (argparse.Namespace): Parsed command-line arguments containing the export configurations.
- data (str): Path to the dataset.yaml.
- weights (list[str]): Paths to model (.pt) file(s).
- imgsz (list[int]): Image size (height, width).
- batch_size (int): Batch size.
- device (str): CUDA device, e.g., '0' or '0,1,2,3' or 'cpu'.
- half (bool): FP16 half-precision export flag.
- inplace (bool): Set YOLOv5 Detect() inplace to True.
- keras (bool): Use Keras for TensorFlow models.
- optimize (bool): Optimize TorchScript model for mobile.
- int8 (bool): INT8 quantization flag.
- per_tensor (bool): Per tensor quantization for TensorFlow.
- dynamic (bool): Dynamic axes for ONNX/TF/TensorRT.
- simplify (bool): Simplify ONNX model.
- opset (int): ONNX opset version.
- verbose (bool): Verbose logging for TensorRT.
- workspace (int): Workspace size for TensorRT (in GB).
- nms (bool): Add NMS to TensorFlow model.
- agnostic_nms (bool): Add agnostic NMS to TensorFlow model.
- topk_per_class (int): Top-k per class for TensorFlow.js NMS.
- topk_all (int): Top-k for all classes for TensorFlow.js NMS.
- iou_thres (float): IoU threshold for TensorFlow.js NMS.
- conf_thres (float): Confidence threshold for TensorFlow.js NMS.
- include (list[str]): List of formats to include in export, e.g., ['torchscript', 'onnx'].
Returns:
list[str]: List of exported file paths.
```python
# Example usage:
# opt = parse_opt()
# main(opt)
```
"""
for opt.weights in opt.weights if isinstance(opt.weights, list) else [opt.weights]: for opt.weights in opt.weights if isinstance(opt.weights, list) else [opt.weights]:
run(**vars(opt)) run(**vars(opt))

View File

@ -15,19 +15,38 @@ import torch
def _create(name, pretrained=True, channels=3, classes=80, autoshape=True, verbose=True, device=None): def _create(name, pretrained=True, channels=3, classes=80, autoshape=True, verbose=True, device=None):
""" """
Creates or loads a YOLOv5 model. Creates or loads a YOLOv5 model, with options for pretrained weights and model customization.
Arguments: Args:
name (str): model name 'yolov5s' or path 'path/to/best.pt' name (str): Model name (e.g., 'yolov5s') or path to the model checkpoint (e.g., 'path/to/best.pt').
pretrained (bool): load pretrained weights into the model pretrained (bool, optional): If True, loads pretrained weights into the model. Defaults to True.
channels (int): number of input channels channels (int, optional): Number of input channels the model expects. Defaults to 3.
classes (int): number of model classes classes (int, optional): Number of classes the model is expected to detect. Defaults to 80.
autoshape (bool): apply YOLOv5 .autoshape() wrapper to model autoshape (bool, optional): If True, applies the YOLOv5 .autoshape() wrapper for various input formats. Defaults to True.
verbose (bool): print all information to screen verbose (bool, optional): If True, prints detailed information during the model creation/loading process. Defaults to True.
device (str, torch.device, None): device to use for model parameters device (str | torch.device | None, optional): Device to use for model parameters (e.g., 'cpu', 'cuda'). If None, selects the best available device. Defaults to None.
Returns: Returns:
YOLOv5 model DetectMultiBackend | AutoShape: The loaded YOLOv5 model, potentially wrapped with AutoShape if specified.
Examples:
```python
import torch
from ultralytics import _create
# Load an official YOLOv5s model with pretrained weights
model = _create('yolov5s')
# Load a custom model from a local checkpoint
model = _create('path/to/custom_model.pt', pretrained=False)
# Load a model with specific input channels and classes
model = _create('yolov5s', channels=1, classes=10)
```
Notes:
For more information on model loading and customization, visit the
[YOLOv5 PyTorch Hub Documentation](https://docs.ultralytics.com/yolov5/tutorials/pytorch_hub_model_loading).
""" """
from pathlib import Path from pathlib import Path
@ -84,76 +103,355 @@ def _create(name, pretrained=True, channels=3, classes=80, autoshape=True, verbo
def custom(path="path/to/model.pt", autoshape=True, _verbose=True, device=None): def custom(path="path/to/model.pt", autoshape=True, _verbose=True, device=None):
"""Loads a custom or local YOLOv5 model from a given path with optional autoshaping and device specification.""" """
Loads a custom or local YOLOv5 model from a given path with optional autoshaping and device specification.
Args:
path (str): Path to the custom model file (e.g., 'path/to/model.pt').
autoshape (bool): Apply YOLOv5 .autoshape() wrapper to model if True, enabling compatibility with various input types
(default is True).
_verbose (bool): If True, prints all informational messages to the screen; otherwise, operates silently
(default is True).
device (str | torch.device | None): Device to load the model on, e.g., 'cpu', 'cuda', torch.device('cuda:0'), etc.
(default is None, which automatically selects the best available device).
Returns:
torch.nn.Module: A YOLOv5 model loaded with the specified parameters.
Notes:
For more details on loading models from PyTorch Hub:
https://docs.ultralytics.com/yolov5/tutorials/pytorch_hub_model_loading
Examples:
```python
# Load model from a given path with autoshape enabled on the best available device
model = torch.hub.load('ultralytics/yolov5', 'custom', 'yolov5s.pt')
# Load model from a local path without autoshape on the CPU device
model = torch.hub.load('.', 'custom', 'yolov5s.pt', source='local', autoshape=False, device='cpu')
```
"""
return _create(path, autoshape=autoshape, verbose=_verbose, device=device) return _create(path, autoshape=autoshape, verbose=_verbose, device=device)
def yolov5n(pretrained=True, channels=3, classes=80, autoshape=True, _verbose=True, device=None): def yolov5n(pretrained=True, channels=3, classes=80, autoshape=True, _verbose=True, device=None):
"""Instantiates the YOLOv5-nano model with options for pretraining, input channels, class count, autoshaping, """
Instantiates the YOLOv5-nano model with options for pretraining, input channels, class count, autoshaping,
verbosity, and device. verbosity, and device.
Args:
pretrained (bool): If True, loads pretrained weights into the model. Defaults to True.
channels (int): Number of input channels for the model. Defaults to 3.
classes (int): Number of classes for object detection. Defaults to 80.
autoshape (bool): If True, applies the YOLOv5 .autoshape() wrapper to the model for various formats (file/URI/PIL/
cv2/np) and non-maximum suppression (NMS) during inference. Defaults to True.
_verbose (bool): If True, prints detailed information to the screen. Defaults to True.
device (str | torch.device | None): Specifies the device to use for model computation. If None, uses the best device
available (i.e., GPU if available, otherwise CPU). Defaults to None.
Returns:
DetectionModel | ClassificationModel | SegmentationModel: The instantiated YOLOv5-nano model, potentially with
pretrained weights and autoshaping applied.
Notes:
For further details on loading models from PyTorch Hub, refer to [PyTorch Hub models](https://pytorch.org/hub/
ultralytics_yolov5).
Examples:
```python
import torch
from ultralytics import yolov5n
# Load the YOLOv5-nano model with defaults
model = yolov5n()
# Load the YOLOv5-nano model with a specific device
model = yolov5n(device='cuda')
```
""" """
return _create("yolov5n", pretrained, channels, classes, autoshape, _verbose, device) return _create("yolov5n", pretrained, channels, classes, autoshape, _verbose, device)
def yolov5s(pretrained=True, channels=3, classes=80, autoshape=True, _verbose=True, device=None): def yolov5s(pretrained=True, channels=3, classes=80, autoshape=True, _verbose=True, device=None):
"""Creates YOLOv5-small model with options for pretraining, input channels, class count, autoshaping, verbosity, and """
Creates YOLOv5-small model with options for pretraining, input channels, class count, autoshaping, verbosity, and
device. device.
Args:
pretrained (bool, optional): Flag to load pretrained weights into the model. Defaults to True.
channels (int, optional): Number of input channels. Defaults to 3.
classes (int, optional): Number of model classes. Defaults to 80.
autoshape (bool, optional): Whether to apply YOLOv5 .autoshape() wrapper to the model for preprocessed inputs.
Defaults to True.
_verbose (bool, optional): Flag to print detailed information on model loading. Defaults to True.
device (str | torch.device | None, optional): Device to use for model parameters, e.g., 'cpu', 'cuda'. If None,
auto-select the best available device. Defaults to None.
Returns:
YOLOv5 model (torch.nn.Module): The YOLOv5-small model loaded with specified configurations and optionally
pretrained weights.
Usage:
```python
import torch
model = torch.hub.load('ultralytics/yolov5', 'yolov5s') # official model
model = torch.hub.load('ultralytics/yolov5:master', 'yolov5s') # from branch
model = torch.hub.load('ultralytics/yolov5', 'custom', 'yolov5s.pt') # custom/local model
model = torch.hub.load('.', 'custom', 'yolov5s.pt', source='local') # local repo
```
For more information, visit https://pytorch.org/hub/ultralytics_yolov5.
""" """
return _create("yolov5s", pretrained, channels, classes, autoshape, _verbose, device) return _create("yolov5s", pretrained, channels, classes, autoshape, _verbose, device)
def yolov5m(pretrained=True, channels=3, classes=80, autoshape=True, _verbose=True, device=None): def yolov5m(pretrained=True, channels=3, classes=80, autoshape=True, _verbose=True, device=None):
"""Instantiates the YOLOv5-medium model with customizable pretraining, channel count, class count, autoshaping, """
Instantiates the YOLOv5-medium model with customizable pretraining, channel count, class count, autoshaping,
verbosity, and device. verbosity, and device.
Args:
pretrained (bool, optional): Whether to load pretrained weights into the model. Default is True.
channels (int, optional): Number of input channels. Default is 3.
classes (int, optional): Number of model classes. Default is 80.
autoshape (bool, optional): Apply YOLOv5 .autoshape() wrapper to the model for handling various input formats. Default is True.
_verbose (bool, optional): Whether to print detailed information to the screen. Default is True.
device (str | torch.device | None, optional): Device specification to use for model parameters (e.g., 'cpu', 'cuda'). Default is None.
Returns:
torch.nn.Module: The instantiated YOLOv5-medium model.
Usage Example:
```python
import torch
model = torch.hub.load('ultralytics/yolov5', 'yolov5m') # Load YOLOv5-medium from Ultralytics repository
model = torch.hub.load('ultralytics/yolov5:master', 'yolov5m') # Load from the master branch
model = torch.hub.load('ultralytics/yolov5', 'custom', 'yolov5m.pt') # Load a custom/local YOLOv5-medium model
model = torch.hub.load('.', 'custom', 'yolov5m.pt', source='local') # Load from a local repository
```
""" """
return _create("yolov5m", pretrained, channels, classes, autoshape, _verbose, device) return _create("yolov5m", pretrained, channels, classes, autoshape, _verbose, device)
def yolov5l(pretrained=True, channels=3, classes=80, autoshape=True, _verbose=True, device=None): def yolov5l(pretrained=True, channels=3, classes=80, autoshape=True, _verbose=True, device=None):
"""Creates YOLOv5-large model with options for pretraining, channels, classes, autoshaping, verbosity, and device """
Creates YOLOv5-large model with options for pretraining, channels, classes, autoshaping, verbosity, and device
selection. selection.
Args:
pretrained (bool): Load pretrained weights into the model. Default is True.
channels (int): Number of input channels. Default is 3.
classes (int): Number of model classes. Default is 80.
autoshape (bool): Apply YOLOv5 .autoshape() wrapper to model. Default is True.
_verbose (bool): Print all information to screen. Default is True.
device (str | torch.device | None): Device to use for model parameters, e.g., 'cpu', 'cuda', or a torch.device instance. Default is None.
Returns:
YOLOv5 model (torch.nn.Module).
Example:
```python
import torch
model = torch.hub.load('ultralytics/yolov5', 'yolov5l')
```
Notes:
For additional details, refer to the PyTorch Hub models documentation:
https://pytorch.org/hub/ultralytics_yolov5
""" """
return _create("yolov5l", pretrained, channels, classes, autoshape, _verbose, device) return _create("yolov5l", pretrained, channels, classes, autoshape, _verbose, device)
def yolov5x(pretrained=True, channels=3, classes=80, autoshape=True, _verbose=True, device=None): def yolov5x(pretrained=True, channels=3, classes=80, autoshape=True, _verbose=True, device=None):
"""Instantiates the YOLOv5-xlarge model with customizable pretraining, channel count, class count, autoshaping, """
Instantiates the YOLOv5-xlarge model with customizable pretraining, channel count, class count, autoshaping,
verbosity, and device. verbosity, and device.
Args:
pretrained (bool): If True, loads pretrained weights into the model. Defaults to True.
channels (int): Number of input channels. Defaults to 3.
classes (int): Number of model classes. Defaults to 80.
autoshape (bool): If True, applies YOLOv5 .autoshape() wrapper to the model for easier image handling. Defaults to
True.
_verbose (bool): If True, prints detailed information to the screen. Defaults to True.
device (str | torch.device | None): Device for model parameters, e.g., 'cpu', 'cuda:0', or a torch.device object.
Defaults to None.
Returns:
torch.nn.Module: The instantiated YOLOv5-xlarge model.
Example:
```python
import torch
model = torch.hub.load('ultralytics/yolov5', 'yolov5x')
```
For more details and usage, refer to the official YOLOv5 PyTorch Hub models documentation:
https://pytorch.org/hub/ultralytics_yolov5
""" """
return _create("yolov5x", pretrained, channels, classes, autoshape, _verbose, device) return _create("yolov5x", pretrained, channels, classes, autoshape, _verbose, device)
def yolov5n6(pretrained=True, channels=3, classes=80, autoshape=True, _verbose=True, device=None): def yolov5n6(pretrained=True, channels=3, classes=80, autoshape=True, _verbose=True, device=None):
"""Creates YOLOv5-nano-P6 model with options for pretraining, channels, classes, autoshaping, verbosity, and """
device. Creates YOLOv5-nano-P6 model with options for pretraining, channels, classes, autoshaping, verbosity, and device.
Args:
pretrained (bool, optional): If True, loads pretrained weights into the model. Default is True.
channels (int, optional): Number of input channels. Default is 3.
classes (int, optional): Number of model classes. Default is 80.
autoshape (bool, optional): If True, applies the YOLOv5 .autoshape() wrapper to the model. Default is True.
_verbose (bool, optional): If True, prints all information to screen. Default is True.
device (str | torch.device | None, optional): Device to use for model parameters. Can be 'cpu', 'cuda', or None.
Default is None.
Returns:
torch.nn.Module: YOLOv5 model loaded with the specified configurations.
Example:
```python
import torch
model = yolov5n6(pretrained=True, channels=3, classes=80, autoshape=True, _verbose=True, device='cuda')
```
Notes:
For more information on PyTorch Hub models, visit: https://pytorch.org/hub/ultralytics_yolov5
""" """
return _create("yolov5n6", pretrained, channels, classes, autoshape, _verbose, device) return _create("yolov5n6", pretrained, channels, classes, autoshape, _verbose, device)
def yolov5s6(pretrained=True, channels=3, classes=80, autoshape=True, _verbose=True, device=None): def yolov5s6(pretrained=True, channels=3, classes=80, autoshape=True, _verbose=True, device=None):
"""Instantiate YOLOv5-small-P6 model with options for pretraining, input channels, number of classes, autoshaping, """
Instantiate the YOLOv5-small-P6 model with options for pretraining, input channels, number of classes, autoshaping,
verbosity, and device selection. verbosity, and device selection.
Args:
pretrained (bool): If True, loads pretrained weights. Default is True.
channels (int): Number of input channels. Default is 3.
classes (int): Number of object detection classes. Default is 80.
autoshape (bool): If True, applies YOLOv5 .autoshape() wrapper to the model, allowing for varied input formats.
Default is True.
_verbose (bool): If True, prints detailed information during model loading. Default is True.
device (str | torch.device | None): Device specification for model parameters (e.g., 'cpu', 'cuda', or torch.device).
Default is None, which selects an available device automatically.
Returns:
torch.nn.Module: The YOLOv5-small-P6 model instance.
Usage:
```python
import torch
model = torch.hub.load('ultralytics/yolov5', 'yolov5s6')
model = torch.hub.load('ultralytics/yolov5:master', 'yolov5s6') # load from a specific branch
model = torch.hub.load('ultralytics/yolov5', 'custom', 'path/to/yolov5s6.pt') # custom/local model
model = torch.hub.load('.', 'custom', 'path/to/yolov5s6.pt', source='local') # local repo model
```
Notes:
- For more information, refer to the PyTorch Hub models documentation at https://pytorch.org/hub/ultralytics_yolov5
Raises:
Exception: If there is an error during model creation or loading, with a suggestion to visit the YOLOv5
tutorials for help.
""" """
return _create("yolov5s6", pretrained, channels, classes, autoshape, _verbose, device) return _create("yolov5s6", pretrained, channels, classes, autoshape, _verbose, device)
def yolov5m6(pretrained=True, channels=3, classes=80, autoshape=True, _verbose=True, device=None): def yolov5m6(pretrained=True, channels=3, classes=80, autoshape=True, _verbose=True, device=None):
"""Creates YOLOv5-medium-P6 model with options for pretraining, channel count, class count, autoshaping, verbosity, """
and device. Creates YOLOv5-medium-P6 model with options for pretraining, channel count, class count, autoshaping, verbosity, and
device.
Args:
pretrained (bool): If True, loads pretrained weights. Default is True.
channels (int): Number of input channels. Default is 3.
classes (int): Number of model classes. Default is 80.
autoshape (bool): Apply YOLOv5 .autoshape() wrapper to the model for file/URI/PIL/cv2/np inputs and NMS. Default is True.
_verbose (bool): If True, prints detailed information to the screen. Default is True.
device (str | torch.device | None): Device to use for model parameters. Default is None, which uses the best available device.
Returns:
torch.nn.Module: The YOLOv5-medium-P6 model.
Refer to the PyTorch Hub models documentation: https://pytorch.org/hub/ultralytics_yolov5 for additional details.
Example:
```python
import torch
# Load YOLOv5-medium-P6 model
model = torch.hub.load('ultralytics/yolov5', 'yolov5m6')
```
Notes:
- The model can be loaded with pre-trained weights for better performance on specific tasks.
- The autoshape feature simplifies input handling by allowing various popular data formats.
""" """
return _create("yolov5m6", pretrained, channels, classes, autoshape, _verbose, device) return _create("yolov5m6", pretrained, channels, classes, autoshape, _verbose, device)
def yolov5l6(pretrained=True, channels=3, classes=80, autoshape=True, _verbose=True, device=None): def yolov5l6(pretrained=True, channels=3, classes=80, autoshape=True, _verbose=True, device=None):
"""Instantiates the YOLOv5-large-P6 model with customizable pretraining, channel and class counts, autoshaping, """
Instantiates the YOLOv5-large-P6 model with customizable pretraining, channel and class counts, autoshaping,
verbosity, and device selection. verbosity, and device selection.
Args:
pretrained (bool, optional): If True, load pretrained weights into the model. Default is True.
channels (int, optional): Number of input channels. Default is 3.
classes (int, optional): Number of model classes. Default is 80.
autoshape (bool, optional): If True, apply YOLOv5 .autoshape() wrapper to the model for input flexibility.
Default is True.
_verbose (bool, optional): If True, print all information to the screen. Default is True.
device (str | torch.device | None, optional): Device to use for model parameters, e.g., 'cpu', 'cuda', or
torch.device. If None, automatically selects the best available
device. Default is None.
Returns:
torch.nn.Module: The instantiated YOLOv5-large-P6 model.
Usage:
```python
import torch
model = torch.hub.load('ultralytics/yolov5', 'yolov5l6') # official model
model = torch.hub.load('ultralytics/yolov5:master', 'yolov5l6') # from specific branch
model = torch.hub.load('ultralytics/yolov5', 'custom', 'path/to/yolov5l6.pt') # custom/local model
model = torch.hub.load('.', 'custom', 'path/to/yolov5l6.pt', source='local') # local repository
```
Note:
Refer to [PyTorch Hub Documentation](https://pytorch.org/hub/ultralytics_yolov5) for additional usage instructions.
""" """
return _create("yolov5l6", pretrained, channels, classes, autoshape, _verbose, device) return _create("yolov5l6", pretrained, channels, classes, autoshape, _verbose, device)
def yolov5x6(pretrained=True, channels=3, classes=80, autoshape=True, _verbose=True, device=None): def yolov5x6(pretrained=True, channels=3, classes=80, autoshape=True, _verbose=True, device=None):
"""Creates YOLOv5-xlarge-P6 model with options for pretraining, channels, classes, autoshaping, verbosity, and """
device. Creates the YOLOv5-xlarge-P6 model with options for pretraining, number of input channels, class count, autoshaping,
verbosity, and device selection.
Args:
pretrained (bool): If True, loads pretrained weights into the model. Default is True.
channels (int): Number of input channels. Default is 3.
classes (int): Number of model classes. Default is 80.
autoshape (bool): If True, applies YOLOv5 .autoshape() wrapper to the model. Default is True.
_verbose (bool): If True, prints all information to the screen. Default is True.
device (str | torch.device | None): Device to use for model parameters, can be a string, torch.device object, or
None for default device selection. Default is None.
Returns:
torch.nn.Module: The instantiated YOLOv5-xlarge-P6 model.
Example:
```python
import torch
model = torch.hub.load('ultralytics/yolov5', 'yolov5x6') # load the YOLOv5-xlarge-P6 model
```
Note:
For more information on YOLOv5 models, visit the official documentation:
https://docs.ultralytics.com/yolov5
""" """
return _create("yolov5x6", pretrained, channels, classes, autoshape, _verbose, device) return _create("yolov5x6", pretrained, channels, classes, autoshape, _verbose, device)

140
train.py
View File

@ -102,10 +102,37 @@ GIT_INFO = check_git_info()
def train(hyp, opt, device, callbacks): def train(hyp, opt, device, callbacks):
""" """
Trains YOLOv5 model with given hyperparameters, options, and device, managing datasets, model architecture, loss Trains a YOLOv5 model on a custom dataset using specified hyperparameters, options, and device, managing datasets,
computation, and optimizer steps. model architecture, loss computation, and optimizer steps.
`hyp` argument is path/to/hyp.yaml or hyp dictionary. Args:
hyp (str | dict): Path to the hyperparameters YAML file or a dictionary of hyperparameters.
opt (argparse.Namespace): Parsed command-line arguments containing training options.
device (torch.device): Device on which training occurs, e.g., 'cuda' or 'cpu'.
callbacks (Callbacks): Callback functions for various training events.
Returns:
None
Models and datasets download automatically from the latest YOLOv5 release.
Example:
Single-GPU training:
```bash
$ python train.py --data coco128.yaml --weights yolov5s.pt --img 640 # from pretrained (recommended)
$ python train.py --data coco128.yaml --weights '' --cfg yolov5s.yaml --img 640 # from scratch
```
Multi-GPU DDP training:
```bash
$ python -m torch.distributed.run --nproc_per_node 4 --master_port 1 train.py --data coco128.yaml --weights
yolov5s.pt --img 640 --device 0,1,2,3
```
For more usage details, refer to:
- Models: https://github.com/ultralytics/yolov5/tree/master/models
- Datasets: https://github.com/ultralytics/yolov5/tree/master/data
- Tutorial: https://docs.ultralytics.com/yolov5/tutorials/train_custom_data
""" """
save_dir, epochs, batch_size, weights, single_cls, evolve, data, cfg, resume, noval, nosave, workers, freeze = ( save_dir, epochs, batch_size, weights, single_cls, evolve, data, cfg, resume, noval, nosave, workers, freeze = (
Path(opt.save_dir), Path(opt.save_dir),
@ -515,7 +542,27 @@ def train(hyp, opt, device, callbacks):
def parse_opt(known=False): def parse_opt(known=False):
"""Parses command-line arguments for YOLOv5 training, validation, and testing.""" """
Parses command-line arguments for YOLOv5 training, validation, and testing.
Args:
known (bool, optional): If True, parses known arguments, ignoring the unknown. Defaults to False.
Returns:
argparse.Namespace: Parsed command-line arguments.
Example:
```python
from ultralytics.yolo import parse_opt
opt = parse_opt()
print(opt)
```
Links:
Models: https://github.com/ultralytics/yolov5/tree/master/models
Datasets: https://github.com/ultralytics/yolov5/tree/master/data
Tutorial: https://docs.ultralytics.com/yolov5/tutorials/train_custom_data
"""
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument("--weights", type=str, default=ROOT / "yolov5s.pt", help="initial weights path") parser.add_argument("--weights", type=str, default=ROOT / "yolov5s.pt", help="initial weights path")
parser.add_argument("--cfg", type=str, default="", help="model.yaml path") parser.add_argument("--cfg", type=str, default="", help="model.yaml path")
@ -570,7 +617,21 @@ def parse_opt(known=False):
def main(opt, callbacks=Callbacks()): def main(opt, callbacks=Callbacks()):
"""Runs training or hyperparameter evolution with specified options and optional callbacks.""" """
Runs training or hyperparameter evolution with specified options and optional callbacks.
Args:
opt (argparse.Namespace): The command-line arguments parsed for YOLOv5 training and evolution.
callbacks (ultralytics.utils.callbacks.Callbacks, optional): Callback functions for various training stages.
Defaults to Callbacks().
Returns:
None
Note:
For detailed usage, visit:
https://github.com/ultralytics/yolov5/tree/master/models
"""
if RANK in {-1, 0}: if RANK in {-1, 0}:
print_args(vars(opt)) print_args(vars(opt))
check_git_status() check_git_status()
@ -826,7 +887,25 @@ def main(opt, callbacks=Callbacks()):
def generate_individual(input_ranges, individual_length): def generate_individual(input_ranges, individual_length):
"""Generates a list of random values within specified input ranges for each gene in the individual.""" """
Generate a random individual with gene values within specified input ranges.
Args:
input_ranges (list[tuple[float, float]]): List of tuples where each tuple contains the lower and upper bounds
for the corresponding gene.
individual_length (int): The number of genes in the individual.
Returns:
list[float]: A list representing a generated individual with random gene values within the specified ranges.
Examples:
```python
input_ranges = [(0.01, 0.1), (0.1, 1.0), (0.9, 2.0)]
individual_length = 3
individual = generate_individual(input_ranges, individual_length)
print(individual) # Output: [0.035, 0.678, 1.456] (example output)
```
"""
individual = [] individual = []
for i in range(individual_length): for i in range(individual_length):
lower_bound, upper_bound = input_ranges[i] lower_bound, upper_bound = input_ranges[i]
@ -836,9 +915,54 @@ def generate_individual(input_ranges, individual_length):
def run(**kwargs): def run(**kwargs):
""" """
Executes YOLOv5 training with given options, overriding with any kwargs provided. Executes YOLOv5 training with given options, allowing optional overrides through keyword arguments.
Example: import train; train.run(data='coco128.yaml', imgsz=320, weights='yolov5m.pt') Args:
weights (str): Path to initial weights. Defaults to ROOT / 'yolov5s.pt'.
cfg (str): Path to model YAML configuration. Defaults to an empty string.
data (str): Path to dataset YAML configuration. Defaults to ROOT / 'data/coco128.yaml'.
hyp (str): Path to hyperparameters YAML configuration. Defaults to ROOT / 'data/hyps/hyp.scratch-low.yaml'.
epochs (int): Total number of training epochs. Defaults to 100.
batch_size (int): Total batch size for all GPUs. Use -1 for automatic batch size determination. Defaults to 16.
imgsz (int): Image size (pixels) for training and validation. Defaults to 640.
rect (bool): Use rectangular training. Defaults to False.
resume (bool | str): Resume most recent training with an optional path. Defaults to False.
nosave (bool): Only save final checkpoint. Defaults to False.
noval (bool): Only validate at the final epoch. Defaults to False.
noautoanchor (bool): Disable AutoAnchor. Defaults to False.
noplots (bool): Do not save plot files. Defaults to False.
evolve (int): Evolve hyperparameters for a specified number of generations. Use 300 if provided without a value.
evolve_population (str): Directory for loading population during evolution. Defaults to ROOT / 'data/hyps'.
resume_evolve (str): Resume hyperparameter evolution from the last generation. Defaults to None.
bucket (str): gsutil bucket for saving checkpoints. Defaults to an empty string.
cache (str): Cache image data in 'ram' or 'disk'. Defaults to None.
image_weights (bool): Use weighted image selection for training. Defaults to False.
device (str): CUDA device identifier, e.g., '0', '0,1,2,3', or 'cpu'. Defaults to an empty string.
multi_scale (bool): Use multi-scale training, varying image size by ±50%. Defaults to False.
single_cls (bool): Train with multi-class data as single-class. Defaults to False.
optimizer (str): Optimizer type, choices are ['SGD', 'Adam', 'AdamW']. Defaults to 'SGD'.
sync_bn (bool): Use synchronized BatchNorm, only available in DDP mode. Defaults to False.
workers (int): Maximum dataloader workers per rank in DDP mode. Defaults to 8.
project (str): Directory for saving training runs. Defaults to ROOT / 'runs/train'.
name (str): Name for saving the training run. Defaults to 'exp'.
exist_ok (bool): Allow existing project/name without incrementing. Defaults to False.
quad (bool): Use quad dataloader. Defaults to False.
cos_lr (bool): Use cosine learning rate scheduler. Defaults to False.
label_smoothing (float): Label smoothing epsilon value. Defaults to 0.0.
patience (int): Patience for early stopping, measured in epochs without improvement. Defaults to 100.
freeze (list): Layers to freeze, e.g., backbone=10, first 3 layers = [0, 1, 2]. Defaults to [0].
save_period (int): Frequency in epochs to save checkpoints. Disabled if < 1. Defaults to -1.
seed (int): Global training random seed. Defaults to 0.
local_rank (int): Automatic DDP Multi-GPU argument. Do not modify. Defaults to -1.
Returns:
None: The function initiates YOLOv5 training or hyperparameter evolution based on the provided options.
Examples:
```python
import train
train.run(data='coco128.yaml', imgsz=320, weights='yolov5m.pt')
```
""" """
opt = parse_opt(True) opt = parse_opt(True)
for k, v in kwargs.items(): for k, v in kwargs.items():

191
val.py
View File

@ -62,7 +62,30 @@ from utils.torch_utils import select_device, smart_inference_mode
def save_one_txt(predn, save_conf, shape, file): def save_one_txt(predn, save_conf, shape, file):
"""Saves one detection result to a txt file in normalized xywh format, optionally including confidence.""" """
Saves one detection result to a txt file in normalized xywh format, optionally including confidence.
Args:
predn (torch.Tensor): Predicted bounding boxes and associated confidence scores and classes
in xyxy format, tensor of shape (N, 6) where N is the number of detections.
save_conf (bool): If True, saves the confidence scores along with the bounding box coordinates.
shape (tuple): Shape of the original image as (height, width).
file (str | Path): File path where the result will be saved.
Returns:
None
Notes:
The xyxy bounding box format represents the coordinates (xmin, ymin, xmax, ymax).
The xywh format represents the coordinates (center_x, center_y, width, height) and is
normalized by the width and height of the image.
Example:
```python
predn = torch.tensor([[10, 20, 30, 40, 0.9, 1]]) # example prediction
save_one_txt(predn, save_conf=True, shape=(640, 480), file="output.txt")
```
"""
gn = torch.tensor(shape)[[1, 0, 1, 0]] # normalization gain whwh gn = torch.tensor(shape)[[1, 0, 1, 0]] # normalization gain whwh
for *xyxy, conf, cls in predn.tolist(): for *xyxy, conf, cls in predn.tolist():
xywh = (xyxy2xywh(torch.tensor(xyxy).view(1, 4)) / gn).view(-1).tolist() # normalized xywh xywh = (xyxy2xywh(torch.tensor(xyxy).view(1, 4)) / gn).view(-1).tolist() # normalized xywh
@ -73,9 +96,36 @@ def save_one_txt(predn, save_conf, shape, file):
def save_one_json(predn, jdict, path, class_map): def save_one_json(predn, jdict, path, class_map):
""" """
Saves one JSON detection result with image ID, category ID, bounding box, and score. Saves a single JSON detection result, including image ID, category ID, bounding box, and confidence score.
Example: {"image_id": 42, "category_id": 18, "bbox": [258.15, 41.29, 348.26, 243.78], "score": 0.236} Args:
predn (torch.Tensor): Predicted detections in xyxy format with shape (n, 6) where n is the number of detections.
The tensor should contain [x_min, y_min, x_max, y_max, confidence, class_id] for each detection.
jdict (list[dict]): List to collect JSON formatted detection results.
path (pathlib.Path): Path object of the image file, used to extract image_id.
class_map (dict[int, int]): Mapping from model class indices to dataset-specific category IDs.
Returns:
None: Appends detection results as dictionaries to `jdict` list in-place.
Example:
```python
predn = torch.tensor([[100, 50, 200, 150, 0.9, 0], [50, 30, 100, 80, 0.8, 1]])
jdict = []
path = Path("42.jpg")
class_map = {0: 18, 1: 19}
save_one_json(predn, jdict, path, class_map)
```
This will append to `jdict`:
```
[
{'image_id': 42, 'category_id': 18, 'bbox': [125.0, 75.0, 100.0, 100.0], 'score': 0.9},
{'image_id': 42, 'category_id': 19, 'bbox': [75.0, 55.0, 50.0, 50.0], 'score': 0.8}
]
```
Notes:
The `bbox` values are formatted as [x, y, width, height], where x and y represent the top-left corner of the box.
""" """
image_id = int(path.stem) if path.stem.isnumeric() else path.stem image_id = int(path.stem) if path.stem.isnumeric() else path.stem
box = xyxy2xywh(predn[:, :4]) # xywh box = xyxy2xywh(predn[:, :4]) # xywh
@ -93,13 +143,30 @@ def save_one_json(predn, jdict, path, class_map):
def process_batch(detections, labels, iouv): def process_batch(detections, labels, iouv):
""" """
Return correct prediction matrix. Return a correct prediction matrix given detections and labels at various IoU thresholds.
Args:
detections (np.ndarray): Array of shape (N, 6) where each row corresponds to a detection with
format [x1, y1, x2, y2, conf, class].
labels (np.ndarray): Array of shape (M, 5) where each row corresponds to a ground truth label with
format [class, x1, y1, x2, y2].
iouv (np.ndarray): Array of IoU thresholds to evaluate at.
Arguments:
detections (array[N, 6]), x1, y1, x2, y2, conf, class
labels (array[M, 5]), class, x1, y1, x2, y2
Returns: Returns:
correct (array[N, 10]), for 10 IoU levels correct (np.ndarray): A binary array of shape (N, len(iouv)) indicating whether each detection
is a true positive for each IoU threshold. There are 10 IoU levels used in the evaluation.
Example:
```python
detections = np.array([[50, 50, 200, 200, 0.9, 1], [30, 30, 150, 150, 0.7, 0]])
labels = np.array([[1, 50, 50, 200, 200]])
iouv = np.linspace(0.5, 0.95, 10)
correct = process_batch(detections, labels, iouv)
```
Notes:
- This function is used as part of the evaluation pipeline for object detection models.
- IoU (Intersection over Union) is a common evaluation metric for object detection performance.
""" """
correct = np.zeros((detections.shape[0], iouv.shape[0])).astype(bool) correct = np.zeros((detections.shape[0], iouv.shape[0])).astype(bool)
iou = box_iou(labels[:, 1:], detections[:, :4]) iou = box_iou(labels[:, 1:], detections[:, :4])
@ -148,7 +215,44 @@ def run(
callbacks=Callbacks(), callbacks=Callbacks(),
compute_loss=None, compute_loss=None,
): ):
"""Evaluates model on a dataset and logs performance metrics, results are saved to specific directories.""" """
Evaluates a YOLOv5 model on a dataset and logs performance metrics.
Args:
data (str | dict): Path to a dataset yaml file or a dataset dictionary.
weights (str | list[str], optional): Path to the model weights file(s). Supports various formats: PyTorch,
TorchScript, ONNX, OpenVINO, TensorRT, CoreML, TensorFlow SavedModel, TensorFlow GraphDef, TensorFlow Lite,
TensorFlow Edge TPU, and PaddlePaddle.
batch_size (int, optional): Batch size for inference. Default is 32.
imgsz (int, optional): Input image size (pixels). Default is 640.
conf_thres (float, optional): Confidence threshold for object detection. Default is 0.001.
iou_thres (float, optional): IoU threshold for Non-Maximum Suppression (NMS). Default is 0.6.
max_det (int, optional): Maximum number of detections per image. Default is 300.
task (str, optional): Task type - 'train', 'val', 'test', 'speed', or 'study'. Default is 'val'.
device (str, optional): Device to use for computation, e.g., '0' or '0,1,2,3' for CUDA or 'cpu' for CPU. Default is ''.
workers (int, optional): Number of dataloader workers. Default is 8.
single_cls (bool, optional): Treat dataset as a single class. Default is False.
augment (bool, optional): Enable augmented inference. Default is False.
verbose (bool, optional): Enable verbose output. Default is False.
save_txt (bool, optional): Save results to *.txt files. Default is False.
save_hybrid (bool, optional): Save label and prediction hybrid results to *.txt files. Default is False.
save_conf (bool, optional): Save confidences in --save-txt labels. Default is False.
save_json (bool, optional): Save a COCO-JSON results file. Default is False.
project (str | Path, optional): Directory to save results. Default is ROOT/'runs/val'.
name (str, optional): Name of the run. Default is 'exp'.
exist_ok (bool, optional): Overwrite existing project/name without incrementing. Default is False.
half (bool, optional): Use FP16 half-precision inference. Default is True.
dnn (bool, optional): Use OpenCV DNN for ONNX inference. Default is False.
model (torch.nn.Module, optional): Model object for training. Default is None.
dataloader (torch.utils.data.DataLoader, optional): Dataloader object. Default is None.
save_dir (Path, optional): Directory to save results. Default is Path('').
plots (bool, optional): Plot validation images and metrics. Default is True.
callbacks (utils.callbacks.Callbacks, optional): Callbacks for logging and monitoring. Default is Callbacks().
compute_loss (function, optional): Loss function for training. Default is None.
Returns:
dict: Contains performance metrics including precision, recall, mAP50, and mAP50-95.
"""
# Initialize/load model and set device # Initialize/load model and set device
training = model is not None training = model is not None
if training: # called by train.py if training: # called by train.py
@ -364,7 +468,53 @@ def run(
def parse_opt(): def parse_opt():
"""Parses command-line options for YOLOv5 model inference configuration.""" """
Parses command-line options for YOLOv5 model inference configuration.
Args:
data (str): Path to the dataset YAML file, default is 'data/coco128.yaml'.
weights (List[str]): List of paths to the model weight files, default is 'yolov5s.pt'.
batch_size (int): Batch size for inference, default is 32.
imgsz (int): Inference image size in pixels, default is 640.
conf_thres (float): Confidence threshold for predictions, default is 0.001.
iou_thres (float): IoU threshold for Non-Max Suppression (NMS), default is 0.6.
max_det (int): Maximum number of detections per image, default is 300.
task (str): Task type - options are 'train', 'val', 'test', 'speed', or 'study'. Default is 'val'.
device (str): Device to run the model on, e.g., '0' or '0,1,2,3' or 'cpu'. Default is empty to let
the system choose automatically.
workers (int): Maximum number of dataloader workers per rank in DDP mode, default is 8.
single_cls (bool): If set, treats the dataset as a single-class dataset. Default is False.
augment (bool): If set, performs augmented inference. Default is False.
verbose (bool): If set, reports mAP by class. Default is False.
save_txt (bool): If set, saves results to *.txt files. Default is False.
save_hybrid (bool): If set, saves label+prediction hybrid results to *.txt files. Default is False.
save_conf (bool): If set, saves confidences in --save-txt labels. Default is False.
save_json (bool): If set, saves results to a COCO-JSON file. Default is False.
project (str): Project directory to save results to. Default is 'runs/val'.
name (str): Name of the directory to save results to. Default is 'exp'.
exist_ok (bool): If set, existing directory will not be incremented. Default is False.
half (bool): If set, uses FP16 half-precision inference. Default is False.
dnn (bool): If set, uses OpenCV DNN for ONNX inference. Default is False.
Returns:
argparse.Namespace: Parsed command-line options
Notes:
- The '--data' parameter is checked to ensure it ends with 'coco.yaml' if '--save-json' is set.
- The '--save-txt' option is set to True if '--save-hybrid' is enabled.
- Args are printed using `print_args` to facilitate debugging.
Example:
To validate a trained YOLOv5 model on a COCO dataset:
```python
$ python val.py --weights yolov5s.pt --data coco128.yaml --img 640
```
Different model formats could be used instead of yolov5s.pt:
```python
$ python val.py --weights yolov5s.pt yolov5s.torchscript yolov5s.onnx yolov5s_openvino_model yolov5s.engine
```
Additional options include saving results in different formats, selecting devices, and more.
"""
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument("--data", type=str, default=ROOT / "data/coco128.yaml", help="dataset.yaml path") parser.add_argument("--data", type=str, default=ROOT / "data/coco128.yaml", help="dataset.yaml path")
parser.add_argument("--weights", nargs="+", type=str, default=ROOT / "yolov5s.pt", help="model path(s)") parser.add_argument("--weights", nargs="+", type=str, default=ROOT / "yolov5s.pt", help="model path(s)")
@ -397,8 +547,25 @@ def parse_opt():
def main(opt): def main(opt):
"""Executes YOLOv5 tasks like training, validation, testing, speed, and study benchmarks based on provided """
options. Executes YOLOv5 tasks like training, validation, testing, speed, and study benchmarks based on provided options.
Args:
opt (argparse.Namespace): Parsed command-line options.
- This includes values for parameters like 'data', 'weights', 'batch_size', 'imgsz', 'conf_thres', 'iou_thres',
'max_det', 'task', 'device', 'workers', 'single_cls', 'augment', 'verbose', 'save_txt', 'save_hybrid',
'save_conf', 'save_json', 'project', 'name', 'exist_ok', 'half', and 'dnn', essential for configuring
the YOLOv5 tasks.
Returns:
None
Examples:
To validate a trained YOLOv5 model on the COCO dataset with a specific weights file, use:
```python
$ python val.py --weights yolov5s.pt --data coco128.yaml --img 640
```
""" """
check_requirements(ROOT / "requirements.txt", exclude=("tensorboard", "thop")) check_requirements(ROOT / "requirements.txt", exclude=("tensorboard", "thop"))