单目3D初始代码
This commit is contained in:
230
docs/en/yolov5/tutorials/architecture_description.md
Executable file
230
docs/en/yolov5/tutorials/architecture_description.md
Executable file
@@ -0,0 +1,230 @@
|
||||
---
|
||||
comments: true
|
||||
description: Dive deep into the powerful YOLOv5 architecture by Ultralytics, exploring its model structure, data augmentation techniques, training strategies, and loss computations.
|
||||
keywords: YOLOv5 architecture, object detection, Ultralytics, YOLO, model structure, data augmentation, training strategies, loss computations, deep learning, machine learning
|
||||
---
|
||||
|
||||
# Ultralytics YOLOv5 Architecture
|
||||
|
||||
YOLOv5 (v6.0/6.1) is a powerful object detection algorithm developed by Ultralytics. This article dives deep into the YOLOv5 architecture, [data augmentation](https://www.ultralytics.com/glossary/data-augmentation) strategies, training methodologies, and loss computation techniques. This comprehensive understanding will help improve your practical application of object detection in various fields, including surveillance, autonomous vehicles, and [image recognition](https://www.ultralytics.com/glossary/image-recognition).
|
||||
|
||||
## 1. Model Structure
|
||||
|
||||
YOLOv5's architecture consists of three main parts:
|
||||
|
||||
- **Backbone**: This is the main body of the network. For YOLOv5, the backbone is designed using the `CSPDarknet53` structure, a modification of the Darknet architecture used in previous versions.
|
||||
- **Neck**: This part connects the backbone and the head. In YOLOv5, `SPPF` (Spatial Pyramid Pooling - Fast) and `PANet` (Path Aggregation Network) structures are utilized.
|
||||
- **Head**: This part is responsible for generating the final output. YOLOv5 uses the `YOLOv3 Head` for this purpose.
|
||||
|
||||
The structure of the model is depicted in the image below. The model structure details can be found in [`models/yolov5l.yaml`](https://github.com/ultralytics/yolov5/blob/master/models/yolov5l.yaml).
|
||||
|
||||

|
||||
|
||||
YOLOv5 introduces some notable improvements compared to its predecessors:
|
||||
|
||||
1. The `Focus` structure, found in earlier versions, is replaced with a `6x6 Conv2d` structure. This change boosts efficiency [#4825](https://github.com/ultralytics/yolov5/issues/4825).
|
||||
2. The `SPP` structure is replaced with `SPPF`. This alteration more than doubles the speed of processing while maintaining the same output.
|
||||
|
||||
To test the speed of `SPP` and `SPPF`, the following code can be used:
|
||||
|
||||
<details>
|
||||
<summary>SPP vs SPPF speed profiling example (click to open)</summary>
|
||||
|
||||
```python
|
||||
import time
|
||||
|
||||
import torch
|
||||
import torch.nn as nn
|
||||
|
||||
|
||||
class SPP(nn.Module):
|
||||
def __init__(self):
|
||||
"""Initializes an SPP module with three different sizes of max pooling layers."""
|
||||
super().__init__()
|
||||
self.maxpool1 = nn.MaxPool2d(5, 1, padding=2)
|
||||
self.maxpool2 = nn.MaxPool2d(9, 1, padding=4)
|
||||
self.maxpool3 = nn.MaxPool2d(13, 1, padding=6)
|
||||
|
||||
def forward(self, x):
|
||||
"""Applies three max pooling layers on input `x` and concatenates results along channel dimension."""
|
||||
o1 = self.maxpool1(x)
|
||||
o2 = self.maxpool2(x)
|
||||
o3 = self.maxpool3(x)
|
||||
return torch.cat([x, o1, o2, o3], dim=1)
|
||||
|
||||
|
||||
class SPPF(nn.Module):
|
||||
def __init__(self):
|
||||
"""Initializes an SPPF module with a specific configuration of MaxPool2d layer."""
|
||||
super().__init__()
|
||||
self.maxpool = nn.MaxPool2d(5, 1, padding=2)
|
||||
|
||||
def forward(self, x):
|
||||
"""Applies sequential max pooling and concatenates results with input tensor."""
|
||||
o1 = self.maxpool(x)
|
||||
o2 = self.maxpool(o1)
|
||||
o3 = self.maxpool(o2)
|
||||
return torch.cat([x, o1, o2, o3], dim=1)
|
||||
|
||||
|
||||
def main():
|
||||
"""Compares outputs and performance of SPP and SPPF on a random tensor (8, 32, 16, 16)."""
|
||||
input_tensor = torch.rand(8, 32, 16, 16)
|
||||
spp = SPP()
|
||||
sppf = SPPF()
|
||||
output1 = spp(input_tensor)
|
||||
output2 = sppf(input_tensor)
|
||||
|
||||
print(torch.equal(output1, output2))
|
||||
|
||||
t_start = time.time()
|
||||
for _ in range(100):
|
||||
spp(input_tensor)
|
||||
print(f"SPP time: {time.time() - t_start}")
|
||||
|
||||
t_start = time.time()
|
||||
for _ in range(100):
|
||||
sppf(input_tensor)
|
||||
print(f"SPPF time: {time.time() - t_start}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
```
|
||||
|
||||
result:
|
||||
|
||||
```
|
||||
True
|
||||
SPP time: 0.5373051166534424
|
||||
SPPF time: 0.20780706405639648
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
## 2. Data Augmentation Techniques
|
||||
|
||||
YOLOv5 employs various data augmentation techniques to improve the model's ability to generalize and reduce [overfitting](https://www.ultralytics.com/glossary/overfitting). These techniques include:
|
||||
|
||||
- **Mosaic Augmentation**: An image processing technique that combines four training images into one in ways that encourage [object detection](https://www.ultralytics.com/glossary/object-detection) models to better handle various object scales and translations.
|
||||
|
||||

|
||||
|
||||
- **Copy-Paste Augmentation**: An innovative data augmentation method that copies random patches from an image and pastes them onto another randomly chosen image, effectively generating a new training sample.
|
||||
|
||||

|
||||
|
||||
- **Random Affine Transformations**: This includes random rotation, scaling, translation, and shearing of the images.
|
||||
|
||||

|
||||
|
||||
- **MixUp Augmentation**: A method that creates composite images by taking a linear combination of two images and their associated labels.
|
||||
|
||||

|
||||
|
||||
- **Albumentations**: A powerful image augmentation library that supports a wide variety of augmentation techniques. Learn more about [using Albumentations augmentations](https://www.ultralytics.com/blog/using-albumentations-augmentations-to-diversify-your-data).
|
||||
|
||||
- **HSV Augmentation**: Random changes to the Hue, Saturation, and Value of the images.
|
||||
|
||||

|
||||
|
||||
- **Random Horizontal Flip**: An augmentation method that randomly flips images horizontally.
|
||||
|
||||

|
||||
|
||||
## 3. Training Strategies
|
||||
|
||||
YOLOv5 applies several sophisticated training strategies to enhance the model's performance. They include:
|
||||
|
||||
- **Multiscale Training**: The input images are randomly rescaled within a range of 0.5 to 1.5 times their original size during the training process.
|
||||
- **AutoAnchor**: This strategy optimizes the prior anchor boxes to match the statistical characteristics of the ground truth boxes in your custom data.
|
||||
- **Warmup and Cosine LR Scheduler**: A method to adjust the [learning rate](https://www.ultralytics.com/glossary/learning-rate) to enhance model performance.
|
||||
- **Exponential Moving Average (EMA)**: A strategy that uses the average of parameters over past steps to stabilize the training process and reduce generalization error.
|
||||
- **[Mixed Precision](https://www.ultralytics.com/glossary/mixed-precision) Training**: A method to perform operations in half-[precision](https://www.ultralytics.com/glossary/precision) format, reducing memory usage and enhancing computational speed.
|
||||
- **Hyperparameter Evolution**: A strategy to automatically tune hyperparameters to achieve optimal performance. Learn more about [hyperparameter tuning](https://docs.ultralytics.com/guides/hyperparameter-tuning/).
|
||||
|
||||
## 4. Additional Features
|
||||
|
||||
### 4.1 Compute Losses
|
||||
|
||||
The loss in YOLOv5 is computed as a combination of three individual loss components:
|
||||
|
||||
- **Classes Loss (BCE Loss)**: Binary Cross-Entropy loss, measures the error for the classification task.
|
||||
- **Objectness Loss (BCE Loss)**: Another Binary Cross-Entropy loss, calculates the error in detecting whether an object is present in a particular grid cell or not.
|
||||
- **Location Loss (CIoU Loss)**: Complete IoU loss, measures the error in localizing the object within the grid cell.
|
||||
|
||||
The overall [loss function](https://www.ultralytics.com/glossary/loss-function) is depicted by:
|
||||
|
||||

|
||||
|
||||
### 4.2 Balance Losses
|
||||
|
||||
The objectness losses of the three prediction layers (`P3`, `P4`, `P5`) are weighted differently. The balance weights are `[4.0, 1.0, 0.4]` respectively. This approach ensures that the predictions at different scales contribute appropriately to the total loss.
|
||||
|
||||

|
||||
|
||||
### 4.3 Eliminate Grid Sensitivity
|
||||
|
||||
The YOLOv5 architecture makes some important changes to the box prediction strategy compared to earlier versions of YOLO. In YOLOv2 and YOLOv3, the box coordinates were directly predicted using the activation of the last layer.
|
||||
|
||||
+c_x>)
|
||||
+c_y>)
|
||||

|
||||

|
||||
|
||||
<img src="https://user-images.githubusercontent.com/31005897/158508027-8bf63c28-8290-467b-8a3e-4ad09235001a.png#pic_center" width=40% alt="YOLOv5 grid computation">
|
||||
|
||||
However, in YOLOv5, the formula for predicting the box coordinates has been updated to reduce grid sensitivity and prevent the model from predicting unbounded box dimensions.
|
||||
|
||||
The revised formulas for calculating the predicted [bounding box](https://www.ultralytics.com/glossary/bounding-box) are as follows:
|
||||
|
||||
-0.5)+c_x>)
|
||||
-0.5)+c_y>)
|
||||
)^2>)
|
||||
)^2>)
|
||||
|
||||
Compare the center point offset before and after scaling. The center point offset range is adjusted from (0, 1) to (-0.5, 1.5). Therefore, offset can easily get 0 or 1.
|
||||
|
||||
<img src="https://user-images.githubusercontent.com/31005897/158508052-c24bc5e8-05c1-4154-ac97-2e1ec71f582e.png#pic_center" width=40% alt="YOLOv5 grid scaling">
|
||||
|
||||
Compare the height and width scaling ratio (relative to anchor) before and after adjustment. The original yolo/darknet box equations have a serious flaw. Width and Height are completely unbounded as they are simply out=exp(in), which is dangerous, as it can lead to runaway gradients, instabilities, NaN losses and ultimately a complete loss of training. [Refer to this issue](https://github.com/ultralytics/yolov5/issues/471#issuecomment-662009779) for more details.
|
||||
|
||||
<img src="https://user-images.githubusercontent.com/31005897/158508089-5ac0c7a3-6358-44b7-863e-a6e45babb842.png#pic_center" width=40% alt="YOLOv5 unbounded scaling">
|
||||
|
||||
### 4.4 Build Targets
|
||||
|
||||
The build target process in YOLOv5 is critical for training efficiency and model [accuracy](https://www.ultralytics.com/glossary/accuracy). It involves assigning ground truth boxes to the appropriate grid cells in the output map and matching them with the appropriate anchor boxes.
|
||||
|
||||
This process follows these steps:
|
||||
|
||||
- Calculate the ratio of the ground truth box dimensions and the dimensions of each anchor template.
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
>)
|
||||
|
||||
>)
|
||||
|
||||
>)
|
||||
|
||||

|
||||
|
||||
<img src="https://user-images.githubusercontent.com/31005897/158508119-fbb2e483-7b8c-4975-8e1f-f510d367f8ff.png#pic_center" width=70% alt="YOLOv5 IoU computation">
|
||||
|
||||
- If the calculated ratio is within the threshold, match the ground truth box with the corresponding anchor.
|
||||
|
||||
<img src="https://user-images.githubusercontent.com/31005897/158508771-b6e7cab4-8de6-47f9-9abf-cdf14c275dfe.png#pic_center" width=70% alt="YOLOv5 grid overlap">
|
||||
|
||||
- Assign the matched anchor to the appropriate cells, keeping in mind that due to the revised center point offset, a ground truth box can be assigned to more than one anchor because the center point offset range is adjusted from (0, 1) to (-0.5, 1.5), making additional matches possible.
|
||||
|
||||
<img src="https://user-images.githubusercontent.com/31005897/158508139-9db4e8c2-cf96-47e0-bc80-35d11512f296.png#pic_center" width=70% alt="YOLOv5 anchor selection">
|
||||
|
||||
This way, the build targets process ensures that each ground truth object is properly assigned and matched during the training process, allowing YOLOv5 to learn the task of object detection more effectively.
|
||||
|
||||
## Conclusion
|
||||
|
||||
In conclusion, YOLOv5 represents a significant step forward in the development of real-time object detection models. By incorporating various new features, enhancements, and training strategies, it surpasses previous versions of the YOLO family in performance and efficiency.
|
||||
|
||||
The primary enhancements in YOLOv5 include the use of a dynamic architecture, an extensive range of data augmentation techniques, innovative training strategies, as well as important adjustments in computing losses and the process of building targets. All these innovations significantly improve the accuracy and efficiency of object detection while retaining a high degree of speed, which is the trademark of YOLO models.
|
||||
241
docs/en/yolov5/tutorials/clearml_logging_integration.md
Executable file
241
docs/en/yolov5/tutorials/clearml_logging_integration.md
Executable file
@@ -0,0 +1,241 @@
|
||||
---
|
||||
comments: true
|
||||
description: Learn how to use ClearML for tracking YOLOv5 experiments, data versioning, hyperparameter optimization, and remote execution with ease.
|
||||
keywords: ClearML, YOLOv5, machine learning, experiment tracking, data versioning, hyperparameter optimization, remote execution, ML pipeline
|
||||
---
|
||||
|
||||
# ClearML Integration
|
||||
|
||||
<img align="center" src="https://github.com/thepycoder/clearml_screenshots/raw/main/logos_dark.png#gh-light-mode-only" alt="ClearML MLOps experiment tracking platform"><img align="center" src="https://github.com/thepycoder/clearml_screenshots/raw/main/logos_light.png#gh-dark-mode-only" alt="ClearML MLOps experiment tracking platform">
|
||||
|
||||
## About ClearML
|
||||
|
||||
[ClearML](https://clear.ml/) is an [open-source](https://github.com/clearml/clearml) MLOps platform designed to streamline your machine learning workflow and save you time ⏱️.
|
||||
|
||||
🔨 Track every YOLOv5 training run in the <b>experiment manager</b>
|
||||
|
||||
🔧 Version and easily access your custom [training data](https://www.ultralytics.com/glossary/training-data) with the integrated ClearML <b>Data Versioning Tool</b>
|
||||
|
||||
🔦 <b>Remotely train and monitor</b> your YOLOv5 training runs using ClearML Agent
|
||||
|
||||
🔬 Get the very best mAP using ClearML <b>Hyperparameter Optimization</b>
|
||||
|
||||
🔭 Turn your newly trained <b>YOLOv5 model into an API</b> with just a few commands using ClearML Serving
|
||||
|
||||
<br>
|
||||
And so much more. It's up to you how many of these tools you want to use, you can stick to the experiment manager, or chain them all together into an impressive pipeline!
|
||||
<br>
|
||||
<br>
|
||||
|
||||

|
||||
|
||||
<br>
|
||||
<br>
|
||||
|
||||
## 🦾 Setting Things Up
|
||||
|
||||
To keep track of your experiments and/or data, ClearML needs to communicate with a server. You have 2 options to get one:
|
||||
|
||||
Either sign up for free to the [ClearML Hosted Service](https://clear.ml/) or you can set up your own [ClearML server](https://clear.ml/docs/latest/docs/deploying_clearml/clearml_server). Even the server is open-source, so even if you're dealing with sensitive data, you should be good to go!
|
||||
|
||||
- Install the `clearml` python package:
|
||||
|
||||
```bash
|
||||
pip install clearml
|
||||
```
|
||||
|
||||
- Connect the ClearML SDK to the server by [creating credentials](https://app.clear.ml/settings/workspace-configuration) (go right top to Settings -> Workspace -> Create new credentials), then execute the command below and follow the instructions:
|
||||
|
||||
```bash
|
||||
clearml-init
|
||||
```
|
||||
|
||||
That's it! You're done 😎
|
||||
|
||||
<br>
|
||||
|
||||
## 🚀 Training YOLOv5 With ClearML
|
||||
|
||||
To enable ClearML experiment tracking, simply install the ClearML pip package as shown earlier (or run the command below if you skipped that step).
|
||||
|
||||
```bash
|
||||
pip install clearml
|
||||
```
|
||||
|
||||
This will enable integration with the YOLOv5 training script. Every training run from now on will be captured and stored by the ClearML [experiment manager](https://docs.ultralytics.com/integrations/clearml/).
|
||||
|
||||
If you want to change the `project_name` or `task_name`, use the `--project` and `--name` arguments of the `train.py` script, by default the project will be called `YOLOv5` and the task `Training`. PLEASE NOTE: ClearML uses `/` as a delimiter for subprojects, so be careful when using `/` in your project name!
|
||||
|
||||
```bash
|
||||
python train.py --img 640 --batch 16 --epochs 3 --data coco8.yaml --weights yolov5s.pt --cache
|
||||
```
|
||||
|
||||
or with custom project and task name:
|
||||
|
||||
```bash
|
||||
python train.py --project my_project --name my_training --img 640 --batch 16 --epochs 3 --data coco8.yaml --weights yolov5s.pt --cache
|
||||
```
|
||||
|
||||
This will capture:
|
||||
|
||||
- Source code + uncommitted changes
|
||||
- Installed packages
|
||||
- (Hyper)parameters
|
||||
- Model files (use `--save-period n` to save a checkpoint every n epochs)
|
||||
- Console output
|
||||
- Scalars (mAP_0.5, mAP_0.5:0.95, precision, recall, losses, learning rates, ...)
|
||||
- General info such as machine details, runtime, creation date etc.
|
||||
- All produced plots such as label correlogram and [confusion matrix](https://www.ultralytics.com/glossary/confusion-matrix)
|
||||
- Images with bounding boxes per [epoch](https://www.ultralytics.com/glossary/epoch)
|
||||
- Mosaic per epoch
|
||||
- Validation images per epoch
|
||||
|
||||
That's a lot right? 🤯 Now, we can visualize all of this information in the ClearML UI to get an overview of our training progress. Add custom columns to the table view (such as e.g. mAP_0.5) so you can easily sort on the best performing model. Or select multiple experiments and directly compare them!
|
||||
|
||||
There's even more we can do with all of this information, like [hyperparameter optimization](https://www.ultralytics.com/glossary/hyperparameter-tuning) and remote execution, so keep reading if you want to see how that works!
|
||||
|
||||
### 🔗 Dataset Version Management
|
||||
|
||||
Versioning your data separately from your code is generally a good idea and makes it easy to acquire the latest version too. This repository supports supplying a dataset version ID, and it will make sure to get the data if it's not there yet. Next to that, this workflow also saves the used dataset ID as part of the task parameters, so you will always know for sure which data was used in which experiment!
|
||||
|
||||

|
||||
|
||||
### Prepare Your Dataset
|
||||
|
||||
The YOLOv5 repository supports a number of different datasets by using YAML files containing their information. By default, datasets are downloaded to the `../datasets` folder in relation to the repository root folder. So if you downloaded the `coco128` dataset using the link in the YAML or with the scripts provided by yolov5, you get this folder structure:
|
||||
|
||||
```
|
||||
..
|
||||
|_ yolov5
|
||||
|_ datasets
|
||||
|_ coco128
|
||||
|_ images
|
||||
|_ labels
|
||||
|_ LICENSE
|
||||
|_ README.txt
|
||||
```
|
||||
|
||||
But this can be any dataset you wish. Feel free to use your own, as long as you keep to this folder structure.
|
||||
|
||||
Next, ⚠️**copy the corresponding YAML file to the root of the dataset folder**⚠️. This YAML file contains the information ClearML will need to properly use the dataset. You can make this yourself too, of course, just follow the structure of the example YAMLs.
|
||||
|
||||
Basically we need the following keys: `path`, `train`, `test`, `val`, `nc`, `names`.
|
||||
|
||||
```
|
||||
..
|
||||
|_ yolov5
|
||||
|_ datasets
|
||||
|_ coco128
|
||||
|_ images
|
||||
|_ labels
|
||||
|_ coco128.yaml # <---- HERE!
|
||||
|_ LICENSE
|
||||
|_ README.txt
|
||||
```
|
||||
|
||||
### Upload Your Dataset
|
||||
|
||||
To get this dataset into ClearML as a versioned dataset, go to the dataset root folder (for example `../datasets/coco128` when working from the YOLOv5 repository) and run the following command:
|
||||
|
||||
```bash
|
||||
cd ../datasets/coco128
|
||||
clearml-data sync --project YOLOv5 --name coco128 --folder .
|
||||
```
|
||||
|
||||
The command `clearml-data sync` is actually a shorthand command. You could also run these commands one after the other:
|
||||
|
||||
```bash
|
||||
# Optionally add --parent <parent_dataset_id> if you want to base
|
||||
# this version on another dataset version, so no duplicate files are uploaded!
|
||||
clearml-data create --name coco128 --project YOLOv5
|
||||
clearml-data add --files .
|
||||
clearml-data close
|
||||
```
|
||||
|
||||
### Run Training Using A ClearML Dataset
|
||||
|
||||
Now that you have a ClearML dataset, you can very simply use it to train custom YOLOv5 🚀 models!
|
||||
|
||||
```bash
|
||||
python train.py --img 640 --batch 16 --epochs 3 --data clearml://YOUR_DATASET_ID --weights yolov5s.pt --cache
|
||||
```
|
||||
|
||||
<br>
|
||||
|
||||
### 👀 Hyperparameter Optimization
|
||||
|
||||
Now that we have our experiments and data versioned, it's time to take a look at what we can build on top!
|
||||
|
||||
Using the code information, installed packages and environment details, the experiment itself is now **completely reproducible**. In fact, ClearML allows you to clone an experiment and even change its parameters. We can then just rerun it with these new parameters automatically, this is basically what HPO does!
|
||||
|
||||
To **run hyperparameter optimization locally**, we've included a pre-made script for you. Just make sure a training task has been run at least once, so it is in the ClearML experiment manager, we will essentially clone it and change its hyperparameters.
|
||||
|
||||
You'll need to fill in the ID of this `template task` in the script found at `utils/loggers/clearml/hpo.py` and then just run it. You can change `task.execute_locally()` to `task.execute()` to put it in a ClearML queue and have a remote agent work on it instead.
|
||||
|
||||
```bash
|
||||
# To use optuna, install it first, otherwise you can change the optimizer to just be RandomSearch
|
||||
pip install optuna
|
||||
python utils/loggers/clearml/hpo.py
|
||||
```
|
||||
|
||||

|
||||
|
||||
## 🤯 Remote Execution (advanced)
|
||||
|
||||
Running HPO locally is really handy, but what if we want to run our experiments on a remote machine instead? Maybe you have access to a very powerful GPU machine on-site, or you have some budget to use cloud GPUs. This is where the [ClearML Agent](https://clear.ml/docs/latest/docs/clearml_agent) comes into play. Check out what the agent can do here:
|
||||
|
||||
- [YouTube video](https://youtu.be/MX3BrXnaULs)
|
||||
- [Documentation](https://clear.ml/docs/latest/docs/clearml_agent)
|
||||
|
||||
In short: every experiment tracked by the experiment manager contains enough information to reproduce it on a different machine (installed packages, uncommitted changes etc.). So a ClearML agent does just that: it listens to a queue for incoming tasks and when it finds one, it recreates the environment and runs it while still reporting scalars, plots etc. to the experiment manager.
|
||||
|
||||
You can turn any machine (a cloud VM, a local GPU machine, your own laptop...) into a ClearML agent by simply running:
|
||||
|
||||
```bash
|
||||
clearml-agent daemon --queue QUEUES_TO_LISTEN_TO [--docker]
|
||||
```
|
||||
|
||||
### Cloning, Editing And Enqueuing
|
||||
|
||||
With our agent running, we can give it some work. Remember from the HPO section that we can clone a task and edit the hyperparameters? We can do that from the interface too!
|
||||
|
||||
🪄 Clone the experiment by right-clicking it
|
||||
|
||||
🎯 Edit the hyperparameters to what you wish them to be
|
||||
|
||||
⏳ Enqueue the task to any of the queues by right-clicking it
|
||||
|
||||

|
||||
|
||||
### Executing A Task Remotely
|
||||
|
||||
Now you can clone a task like we explained above, or simply mark your current script by adding `task.execute_remotely()` and on execution it will be put into a queue, for the agent to start working on!
|
||||
|
||||
To run the YOLOv5 training script remotely, all you have to do is add this line to the training.py script after the clearml logger has been instantiated:
|
||||
|
||||
```python
|
||||
# ...
|
||||
# Loggers
|
||||
data_dict = None
|
||||
if RANK in {-1, 0}:
|
||||
loggers = Loggers(save_dir, weights, opt, hyp, LOGGER) # loggers instance
|
||||
if loggers.clearml:
|
||||
loggers.clearml.task.execute_remotely(queue="my_queue") # <------ ADD THIS LINE
|
||||
# Data_dict is either None if user did not choose for ClearML dataset or is filled in by ClearML
|
||||
data_dict = loggers.clearml.data_dict
|
||||
# ...
|
||||
```
|
||||
|
||||
When running the training script after this change, python will run the script up until that line, after which it will package the code and send it to the queue instead!
|
||||
|
||||
### Autoscaling workers
|
||||
|
||||
ClearML comes with [autoscalers](https://clear.ml/docs/latest/docs/guides/services/aws_autoscaler) too! This tool will automatically spin up new remote machines in the cloud of your choice (AWS, GCP, Azure) and turn them into ClearML agents for you whenever there are experiments detected in the queue. Once the tasks are processed, the autoscaler will automatically shut down the remote machines, and you stop paying!
|
||||
|
||||
Check out the autoscalers getting started video below.
|
||||
|
||||
[](https://youtu.be/j4XVMAaUt3E)
|
||||
|
||||
## Learn More
|
||||
|
||||
For more information about integrating ClearML with Ultralytics models, check out our [ClearML integration guide](https://docs.ultralytics.com/integrations/clearml/) and explore how you can enhance your [MLOps workflow](https://www.ultralytics.com/blog/exploring-yolov8-ml-experiment-tracking-integrations) with other experiment tracking tools.
|
||||
257
docs/en/yolov5/tutorials/comet_logging_integration.md
Executable file
257
docs/en/yolov5/tutorials/comet_logging_integration.md
Executable file
@@ -0,0 +1,257 @@
|
||||
---
|
||||
comments: true
|
||||
description: Learn to track, visualize and optimize YOLOv5 model metrics with Comet for seamless machine learning workflows.
|
||||
keywords: YOLOv5, Comet, machine learning, model tracking, hyperparameters, visualization, deep learning, logging, metrics
|
||||
---
|
||||
|
||||

|
||||
|
||||
# YOLOv5 with Comet
|
||||
|
||||
This guide will cover how to use YOLOv5 with [Comet](https://bit.ly/yolov5-readme-comet2), a powerful tool for tracking, comparing, and optimizing machine learning experiments.
|
||||
|
||||
## About Comet
|
||||
|
||||
[Comet](https://bit.ly/yolov5-readme-comet2) builds tools that help data scientists, engineers, and team leaders accelerate and optimize [machine learning](https://www.ultralytics.com/glossary/machine-learning-ml) and [deep learning](https://www.ultralytics.com/glossary/deep-learning-dl) models.
|
||||
|
||||
Track and visualize model metrics in real time, save your hyperparameters, datasets, and model checkpoints, and visualize your model predictions with [Comet Custom Panels](https://www.comet.com/docs/v2/guides/comet-dashboard/code-panels/about-panels/?utm_source=yolov5&utm_medium=partner&utm_campaign=partner_yolov5_2022&utm_content=github)! Comet ensures you never lose track of your work and makes it easy to share results and collaborate across teams of all sizes!
|
||||
|
||||
## Getting Started
|
||||
|
||||
### Install Comet
|
||||
|
||||
```bash
|
||||
pip install comet_ml
|
||||
```
|
||||
|
||||
### Configure Comet Credentials
|
||||
|
||||
There are two ways to configure Comet with YOLOv5.
|
||||
|
||||
You can either set your credentials through environment variables:
|
||||
|
||||
**Environment Variables**
|
||||
|
||||
```bash
|
||||
export COMET_API_KEY=YOUR_API_KEY
|
||||
export COMET_PROJECT_NAME=YOUR_COMET_PROJECT_NAME # This will default to 'yolov5'
|
||||
```
|
||||
|
||||
Or create a `.comet.config` file in your working directory and set your credentials there:
|
||||
|
||||
**Comet Configuration File**
|
||||
|
||||
```
|
||||
[comet]
|
||||
api_key=YOUR_API_KEY
|
||||
project_name=YOUR_COMET_PROJECT_NAME # This will default to 'yolov5'
|
||||
```
|
||||
|
||||
### Run the Training Script
|
||||
|
||||
```bash
|
||||
# Train YOLOv5s on COCO128 for 5 epochs
|
||||
python train.py --img 640 --batch 16 --epochs 5 --data coco128.yaml --weights yolov5s.pt
|
||||
```
|
||||
|
||||
That's it! Comet will automatically log your hyperparameters, command line arguments, training and validation metrics. You can visualize and analyze your runs in the Comet UI.
|
||||
|
||||

|
||||
|
||||
## Try out an Example!
|
||||
|
||||
Check out an example of a [completed run here](https://www.comet.com/examples/comet-example-yolov5/a0e29e0e9b984e4a822db2a62d0cb357?experiment-tab=chart&showOutliers=true&smoothing=0&transformY=smoothing&xAxis=step&utm_source=yolov5&utm_medium=partner&utm_campaign=partner_yolov5_2022&utm_content=github).
|
||||
|
||||
Or better yet, try it out yourself in this Colab Notebook:
|
||||
|
||||
[](https://colab.research.google.com/drive/1RG0WOQyxlDlo5Km8GogJpIEJlg_5lyYO?usp=sharing)
|
||||
|
||||
## Log Automatically
|
||||
|
||||
By default, Comet will log the following items:
|
||||
|
||||
### Metrics
|
||||
|
||||
- Box Loss, Object Loss, Classification Loss for the training and [validation data](https://www.ultralytics.com/glossary/validation-data)
|
||||
- mAP_0.5, mAP_0.5:0.95 metrics for the validation data
|
||||
- [Precision](https://www.ultralytics.com/glossary/precision) and [Recall](https://www.ultralytics.com/glossary/recall) for the validation data
|
||||
|
||||
### Parameters
|
||||
|
||||
- Model Hyperparameters
|
||||
- All parameters passed through the command line options
|
||||
|
||||
### Visualizations
|
||||
|
||||
- [Confusion Matrix](https://www.ultralytics.com/glossary/confusion-matrix) of the model predictions on the validation data
|
||||
- Plots for the PR and F1 curves across all classes
|
||||
- Correlogram of the Class Labels
|
||||
|
||||
## Configure Comet Logging
|
||||
|
||||
Comet can be configured to log additional data either through command line flags passed to the training script or through environment variables:
|
||||
|
||||
```bash
|
||||
export COMET_MODE=online # Set whether to run Comet in 'online' or 'offline' mode. Defaults to online
|
||||
export COMET_MODEL_NAME="yolov5" # Set the name for the saved model. Defaults to yolov5
|
||||
export COMET_LOG_CONFUSION_MATRIX=false # Set to disable logging a Comet Confusion Matrix. Defaults to true
|
||||
export COMET_MAX_IMAGE_UPLOADS=30 # Controls how many total image predictions to log to Comet. Defaults to 100.
|
||||
export COMET_LOG_PER_CLASS_METRICS=true # Set to log evaluation metrics for each detected class at the end of training. Defaults to false
|
||||
export COMET_DEFAULT_CHECKPOINT_FILENAME="last.pt" # Set this if you would like to resume training from a different checkpoint. Defaults to 'last.pt'
|
||||
export COMET_LOG_BATCH_LEVEL_METRICS=true # Set this if you would like to log training metrics at the batch level. Defaults to false.
|
||||
export COMET_LOG_PREDICTIONS=true # Set this to false to disable logging model predictions
|
||||
```
|
||||
|
||||
## Logging Checkpoints with Comet
|
||||
|
||||
Logging Models to Comet is disabled by default. To enable it, pass the `save-period` argument to the training script. This will save the logged checkpoints to Comet based on the interval value provided by `save-period`:
|
||||
|
||||
```bash
|
||||
python train.py \
|
||||
--img 640 \
|
||||
--batch 16 \
|
||||
--epochs 5 \
|
||||
--data coco128.yaml \
|
||||
--weights yolov5s.pt \
|
||||
--save-period 1
|
||||
```
|
||||
|
||||
## Logging Model Predictions
|
||||
|
||||
By default, model predictions (images, ground truth labels and bounding boxes) will be logged to Comet.
|
||||
|
||||
You can control the frequency of logged predictions and the associated images by passing the `bbox_interval` command line argument. Predictions can be visualized using Comet's [Object Detection](https://www.ultralytics.com/glossary/object-detection) Custom Panel. This frequency corresponds to every Nth batch of data per [epoch](https://www.ultralytics.com/glossary/epoch). In the example below, we are logging every 2nd batch of data for each epoch.
|
||||
|
||||
**Note:** The YOLOv5 validation dataloader will default to a [batch size](https://www.ultralytics.com/glossary/batch-size) of 32, so you will have to set the logging frequency accordingly.
|
||||
|
||||
Here is an [example project using the Panel](https://www.comet.com/examples/comet-example-yolov5?shareable=YcwMiJaZSXfcEXpGOHDD12vA1&utm_source=yolov5&utm_medium=partner&utm_campaign=partner_yolov5_2022&utm_content=github)
|
||||
|
||||
```bash
|
||||
python train.py \
|
||||
--img 640 \
|
||||
--batch 16 \
|
||||
--epochs 5 \
|
||||
--data coco128.yaml \
|
||||
--weights yolov5s.pt \
|
||||
--bbox_interval 2
|
||||
```
|
||||
|
||||
### Controlling the number of Prediction Images logged to Comet
|
||||
|
||||
When logging predictions from YOLOv5, Comet will log the images associated with each set of predictions. By default, a maximum of 100 validation images are logged. You can increase or decrease this number using the `COMET_MAX_IMAGE_UPLOADS` environment variable:
|
||||
|
||||
```bash
|
||||
env COMET_MAX_IMAGE_UPLOADS=200 python train.py \
|
||||
--img 640 \
|
||||
--batch 16 \
|
||||
--epochs 5 \
|
||||
--data coco128.yaml \
|
||||
--weights yolov5s.pt \
|
||||
--bbox_interval 1
|
||||
```
|
||||
|
||||
### Logging Class Level Metrics
|
||||
|
||||
Use the `COMET_LOG_PER_CLASS_METRICS` environment variable to log mAP, precision, recall, f1 for each class:
|
||||
|
||||
```bash
|
||||
env COMET_LOG_PER_CLASS_METRICS=true python train.py \
|
||||
--img 640 \
|
||||
--batch 16 \
|
||||
--epochs 5 \
|
||||
--data coco128.yaml \
|
||||
--weights yolov5s.pt
|
||||
```
|
||||
|
||||
## Uploading a Dataset to Comet Artifacts
|
||||
|
||||
If you would like to store your data using [Comet Artifacts](https://www.comet.com/docs/v2/guides/data-management/using-artifacts/#learn-more?utm_source=yolov5&utm_medium=partner&utm_campaign=partner_yolov5_2022&utm_content=github), you can do so using the `upload_dataset` flag.
|
||||
|
||||
The dataset should be organized as described in the [YOLOv5 documentation](./train_custom_data.md). The dataset config `yaml` file must follow the same format as that of the `coco128.yaml` file.
|
||||
|
||||
```bash
|
||||
python train.py \
|
||||
--img 640 \
|
||||
--batch 16 \
|
||||
--epochs 5 \
|
||||
--data coco128.yaml \
|
||||
--weights yolov5s.pt \
|
||||
--upload_dataset
|
||||
```
|
||||
|
||||
You can find the uploaded dataset in the Artifacts tab in your Comet Workspace:
|
||||
|
||||

|
||||
|
||||
You can preview the data directly in the Comet UI:
|
||||
|
||||

|
||||
|
||||
Artifacts are versioned and also support adding metadata about the dataset. Comet will automatically log the metadata from your dataset `yaml` file:
|
||||
|
||||

|
||||
|
||||
### Using a saved Artifact
|
||||
|
||||
If you would like to use a dataset from Comet Artifacts, set the `path` variable in your dataset `yaml` file to point to the following Artifact resource URL:
|
||||
|
||||
```yaml
|
||||
# Contents of artifact.yaml file
|
||||
path: "comet://WORKSPACE_NAME/ARTIFACT_NAME:ARTIFACT_VERSION_OR_ALIAS"
|
||||
```
|
||||
|
||||
Then pass this file to your training script in the following way:
|
||||
|
||||
```bash
|
||||
python train.py \
|
||||
--img 640 \
|
||||
--batch 16 \
|
||||
--epochs 5 \
|
||||
--data artifact.yaml \
|
||||
--weights yolov5s.pt
|
||||
```
|
||||
|
||||
Artifacts also allow you to track the lineage of data as it flows through your experimentation workflow. Here you can see a graph that shows you all the experiments that have used your uploaded dataset:
|
||||
|
||||

|
||||
|
||||
## Resuming a Training Run
|
||||
|
||||
If your training run is interrupted for any reason, e.g., disrupted internet connection, you can resume the run using the `resume` flag and the Comet Run Path.
|
||||
|
||||
The Run Path has the following format `comet://WORKSPACE_NAME/PROJECT_NAME/EXPERIMENT_ID`.
|
||||
|
||||
This will restore the run to its state before the interruption, which includes restoring the model from a checkpoint, restoring all hyperparameters and training arguments, and downloading Comet dataset Artifacts if they were used in the original run. The resumed run will continue logging to the existing Experiment in the Comet UI:
|
||||
|
||||
```bash
|
||||
python train.py \
|
||||
--resume "comet://YOUR_RUN_PATH"
|
||||
```
|
||||
|
||||
## Hyperparameter Search with the Comet Optimizer
|
||||
|
||||
YOLOv5 is also integrated with [Comet's Optimizer](https://www.comet.com/docs/v2/guides/optimizer/configure-optimizer/), making it simple to visualize hyperparameter sweeps in the Comet UI.
|
||||
|
||||
### Configuring an Optimizer Sweep
|
||||
|
||||
To configure the Comet Optimizer, you will have to create a JSON file with the information about the sweep. An example file has been provided in `utils/loggers/comet/optimizer_config.json`:
|
||||
|
||||
```bash
|
||||
python utils/loggers/comet/hpo.py \
|
||||
--comet_optimizer_config "utils/loggers/comet/optimizer_config.json"
|
||||
```
|
||||
|
||||
The `hpo.py` script accepts the same arguments as `train.py`. If you wish to pass additional arguments to your sweep simply add them after the script:
|
||||
|
||||
```bash
|
||||
python utils/loggers/comet/hpo.py \
|
||||
--comet_optimizer_config "utils/loggers/comet/optimizer_config.json" \
|
||||
--save-period 1 \
|
||||
--bbox_interval 1
|
||||
```
|
||||
|
||||
## Visualizing Results
|
||||
|
||||
Comet provides a number of ways to visualize the results of your sweep. Take a look at a [project with a completed sweep here](https://www.comet.com/examples/comet-example-yolov5/view/PrlArHGuuhDTKC1UuBmTtOSXD/panels?utm_source=yolov5&utm_medium=partner&utm_campaign=partner_yolov5_2022&utm_content=github).
|
||||
|
||||

|
||||
180
docs/en/yolov5/tutorials/hyperparameter_evolution.md
Executable file
180
docs/en/yolov5/tutorials/hyperparameter_evolution.md
Executable file
@@ -0,0 +1,180 @@
|
||||
---
|
||||
comments: true
|
||||
description: Learn how to optimize YOLOv5 hyperparameters using genetic algorithms for improved training performance. Step-by-step instructions included.
|
||||
keywords: YOLOv5, hyperparameter evolution, genetic algorithms, machine learning, optimization, Ultralytics, hyperparameter tuning
|
||||
---
|
||||
|
||||
# Hyperparameter Evolution for YOLOv5
|
||||
|
||||
📚 This guide explains **hyperparameter evolution** for YOLOv5 🚀. Hyperparameter evolution is a method of [Hyperparameter Optimization](https://en.wikipedia.org/wiki/Hyperparameter_optimization) using a [Genetic Algorithm](https://en.wikipedia.org/wiki/Genetic_algorithm) (GA) for optimization.
|
||||
|
||||
Hyperparameters in [machine learning](https://www.ultralytics.com/glossary/machine-learning-ml) control various aspects of training, and finding optimal values for them can be a challenge. Traditional methods like grid searches can quickly become intractable due to:
|
||||
|
||||
1. The high dimensional search space
|
||||
2. Unknown correlations among the dimensions
|
||||
3. Expensive nature of evaluating the fitness at each point
|
||||
|
||||
This makes genetic algorithms a suitable candidate for hyperparameter searches.
|
||||
|
||||
## Before You Start
|
||||
|
||||
Clone repo and install [requirements.txt](https://github.com/ultralytics/yolov5/blob/master/requirements.txt) in a [**Python>=3.8.0**](https://www.python.org/) environment, including [**PyTorch>=1.8**](https://pytorch.org/get-started/locally/). [Models](https://github.com/ultralytics/yolov5/tree/master/models) and [datasets](https://github.com/ultralytics/yolov5/tree/master/data) download automatically from the latest YOLOv5 [release](https://github.com/ultralytics/yolov5/releases).
|
||||
|
||||
```bash
|
||||
git clone https://github.com/ultralytics/yolov5 # clone
|
||||
cd yolov5
|
||||
pip install -r requirements.txt # install
|
||||
```
|
||||
|
||||
## 1. Initialize Hyperparameters
|
||||
|
||||
YOLOv5 has about 30 hyperparameters used for various training settings. These are defined in `*.yaml` files in the `/data/hyps` directory. Better initial guesses will produce better final results, so it is important to initialize these values properly before evolving. If in doubt, simply use the default values, which are optimized for YOLOv5 COCO training from scratch.
|
||||
|
||||
```yaml
|
||||
# YOLOv5 🚀 by Ultralytics, AGPL-3.0 license
|
||||
# Hyperparameters for low-augmentation COCO training from scratch
|
||||
# python train.py --batch 64 --cfg yolov5n6.yaml --weights '' --data coco.yaml --img 640 --epochs 300 --linear
|
||||
# See tutorials for hyperparameter evolution https://github.com/ultralytics/yolov5#tutorials
|
||||
|
||||
lr0: 0.01 # initial learning rate (SGD=1E-2, Adam=1E-3)
|
||||
lrf: 0.01 # final OneCycleLR learning rate (lr0 * lrf)
|
||||
momentum: 0.937 # SGD momentum/Adam beta1
|
||||
weight_decay: 0.0005 # optimizer weight decay 5e-4
|
||||
warmup_epochs: 3.0 # warmup epochs (fractions ok)
|
||||
warmup_momentum: 0.8 # warmup initial momentum
|
||||
warmup_bias_lr: 0.1 # warmup initial bias lr
|
||||
box: 0.05 # box loss gain
|
||||
cls: 0.5 # cls loss gain
|
||||
cls_pw: 1.0 # cls BCELoss positive_weight
|
||||
obj: 1.0 # obj loss gain (scale with pixels)
|
||||
obj_pw: 1.0 # obj BCELoss positive_weight
|
||||
iou_t: 0.20 # IoU training threshold
|
||||
anchor_t: 4.0 # anchor-multiple threshold
|
||||
# anchors: 3 # anchors per output layer (0 to ignore)
|
||||
fl_gamma: 0.0 # focal loss gamma (efficientDet default gamma=1.5)
|
||||
hsv_h: 0.015 # image HSV-Hue augmentation (fraction)
|
||||
hsv_s: 0.7 # image HSV-Saturation augmentation (fraction)
|
||||
hsv_v: 0.4 # image HSV-Value augmentation (fraction)
|
||||
degrees: 0.0 # image rotation (+/- deg)
|
||||
translate: 0.1 # image translation (+/- fraction)
|
||||
scale: 0.5 # image scale (+/- gain)
|
||||
shear: 0.0 # image shear (+/- deg)
|
||||
perspective: 0.0 # image perspective (+/- fraction), range 0-0.001
|
||||
flipud: 0.0 # image flip up-down (probability)
|
||||
fliplr: 0.5 # image flip left-right (probability)
|
||||
mosaic: 1.0 # image mosaic (probability)
|
||||
mixup: 0.0 # image mixup (probability)
|
||||
copy_paste: 0.0 # segment copy-paste (probability)
|
||||
```
|
||||
|
||||
## 2. Define Fitness
|
||||
|
||||
Fitness is the value we seek to maximize. In YOLOv5 we define a default fitness function as a weighted combination of metrics: `mAP@0.5` contributes 10% of the weight and `mAP@0.5:0.95` contributes the remaining 90%, with [precision (P)](https://www.ultralytics.com/glossary/precision) and [recall (R)](https://www.ultralytics.com/glossary/recall) absent. You may adjust these as you see fit or use the default fitness definition in utils/metrics.py (recommended).
|
||||
|
||||
```python
|
||||
def fitness(x):
|
||||
"""Return model fitness as the sum of weighted metrics [P, R, mAP@0.5, mAP@0.5:0.95]."""
|
||||
w = [0.0, 0.0, 0.1, 0.9] # weights for [P, R, mAP@0.5, mAP@0.5:0.95]
|
||||
return (x[:, :4] * w).sum(1)
|
||||
```
|
||||
|
||||
## 3. Evolve
|
||||
|
||||
Evolution is performed about a base scenario which we seek to improve upon. The base scenario in this example is [fine-tuning](https://www.ultralytics.com/glossary/fine-tuning) COCO128 for 10 [epochs](https://www.ultralytics.com/glossary/epoch) using pretrained YOLOv5s. The base scenario training command is:
|
||||
|
||||
```bash
|
||||
python train.py --epochs 10 --data coco128.yaml --weights yolov5s.pt --cache
|
||||
```
|
||||
|
||||
To evolve hyperparameters **specific to this scenario**, starting from our initial values defined in **Section 1.**, and maximizing the fitness defined in **Section 2.**, append `--evolve`:
|
||||
|
||||
```bash
|
||||
# Single-GPU
|
||||
python train.py --epochs 10 --data coco128.yaml --weights yolov5s.pt --cache --evolve
|
||||
|
||||
# Multi-GPU with delay
|
||||
for i in {0..7}; do
|
||||
sleep $((30 * i)) # 30-second delay (optional)
|
||||
echo "Starting GPU $i..."
|
||||
nohup python train.py --epochs 10 --data coco128.yaml --weights yolov5s.pt --cache --device $i --evolve > "evolve_gpu_$i.log" &
|
||||
done
|
||||
|
||||
# Continuous training (use with caution)
|
||||
# for i in {0..7}; do
|
||||
# sleep $((30 * i)) # 30-second delay (optional)
|
||||
# echo "Starting continuous training on GPU $i..."
|
||||
# (
|
||||
# while true; do
|
||||
# python train.py --epochs 10 --data coco128.yaml --weights yolov5s.pt --cache --device $i --evolve > "evolve_gpu_$i.log"
|
||||
# done
|
||||
# ) &
|
||||
# done
|
||||
```
|
||||
|
||||
The default evolution settings will run the base scenario 300 times, i.e. for 300 generations. You can modify generations via the `--evolve` argument, i.e. `python train.py --evolve 1000`.
|
||||
|
||||
The main genetic operators are **crossover** and **mutation**. In this work mutation is used, with an 80% probability and a 0.04 variance to create new offspring based on a combination of the best parents from all previous generations. Results are logged to `runs/evolve/exp/evolve.csv`, and the highest fitness offspring is saved every generation as `runs/evolve/hyp_evolved.yaml`:
|
||||
|
||||
```yaml
|
||||
# YOLOv5 Hyperparameter Evolution Results
|
||||
# Best generation: 287
|
||||
# Last generation: 300
|
||||
# metrics/precision, metrics/recall, metrics/mAP_0.5, metrics/mAP_0.5:0.95, val/box_loss, val/obj_loss, val/cls_loss
|
||||
# 0.54634, 0.55625, 0.58201, 0.33665, 0.056451, 0.042892, 0.013441
|
||||
|
||||
lr0: 0.01 # initial learning rate (SGD=1E-2, Adam=1E-3)
|
||||
lrf: 0.2 # final OneCycleLR learning rate (lr0 * lrf)
|
||||
momentum: 0.937 # SGD momentum/Adam beta1
|
||||
weight_decay: 0.0005 # optimizer weight decay 5e-4
|
||||
warmup_epochs: 3.0 # warmup epochs (fractions ok)
|
||||
warmup_momentum: 0.8 # warmup initial momentum
|
||||
warmup_bias_lr: 0.1 # warmup initial bias lr
|
||||
box: 0.05 # box loss gain
|
||||
cls: 0.5 # cls loss gain
|
||||
cls_pw: 1.0 # cls BCELoss positive_weight
|
||||
obj: 1.0 # obj loss gain (scale with pixels)
|
||||
obj_pw: 1.0 # obj BCELoss positive_weight
|
||||
iou_t: 0.20 # IoU training threshold
|
||||
anchor_t: 4.0 # anchor-multiple threshold
|
||||
# anchors: 3 # anchors per output layer (0 to ignore)
|
||||
fl_gamma: 0.0 # focal loss gamma (efficientDet default gamma=1.5)
|
||||
hsv_h: 0.015 # image HSV-Hue augmentation (fraction)
|
||||
hsv_s: 0.7 # image HSV-Saturation augmentation (fraction)
|
||||
hsv_v: 0.4 # image HSV-Value augmentation (fraction)
|
||||
degrees: 0.0 # image rotation (+/- deg)
|
||||
translate: 0.1 # image translation (+/- fraction)
|
||||
scale: 0.5 # image scale (+/- gain)
|
||||
shear: 0.0 # image shear (+/- deg)
|
||||
perspective: 0.0 # image perspective (+/- fraction), range 0-0.001
|
||||
flipud: 0.0 # image flip up-down (probability)
|
||||
fliplr: 0.5 # image flip left-right (probability)
|
||||
mosaic: 1.0 # image mosaic (probability)
|
||||
mixup: 0.0 # image mixup (probability)
|
||||
copy_paste: 0.0 # segment copy-paste (probability)
|
||||
```
|
||||
|
||||
We recommend a minimum of 300 generations of evolution for best results. Note that **evolution is generally expensive and time-consuming**, as the base scenario is trained hundreds of times, possibly requiring hundreds or thousands of GPU hours.
|
||||
|
||||
When evolution finishes, reuse the discovered settings by pointing training at the saved file, for example `python train.py --hyp runs/evolve/hyp_evolved.yaml --data your.yaml --weights yolov5s.pt`.
|
||||
|
||||
## 4. Visualize
|
||||
|
||||
`evolve.csv` is plotted as `evolve.png` by `utils.plots.plot_evolve()` after evolution finishes with one subplot per hyperparameter showing fitness (y-axis) vs hyperparameter values (x-axis). Yellow indicates higher concentrations. Vertical distributions indicate that a parameter has been disabled and does not mutate. This is user selectable in the `meta` dictionary in train.py, and is useful for fixing parameters and preventing them from evolving.
|
||||
|
||||

|
||||
|
||||
## Supported Environments
|
||||
|
||||
Ultralytics provides a range of ready-to-use environments, each pre-installed with essential dependencies such as [CUDA](https://developer.nvidia.com/cuda), [CUDNN](https://developer.nvidia.com/cudnn), [Python](https://www.python.org/), and [PyTorch](https://pytorch.org/), to kickstart your projects.
|
||||
|
||||
- **Free GPU Notebooks**: <a href="https://bit.ly/yolov5-paperspace-notebook"><img src="https://assets.paperspace.io/img/gradient-badge.svg" alt="Run on Gradient"></a> <a href="https://colab.research.google.com/github/ultralytics/yolov5/blob/master/tutorial.ipynb"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open In Colab"></a> <a href="https://www.kaggle.com/models/ultralytics/yolov5"><img src="https://kaggle.com/static/images/open-in-kaggle.svg" alt="Open In Kaggle"></a>
|
||||
- **Google Cloud**: [GCP Quickstart Guide](../environments/google_cloud_quickstart_tutorial.md)
|
||||
- **Amazon**: [AWS Quickstart Guide](../environments/aws_quickstart_tutorial.md)
|
||||
- **Azure**: [AzureML Quickstart Guide](../environments/azureml_quickstart_tutorial.md)
|
||||
- **Docker**: [Docker Quickstart Guide](../environments/docker_image_quickstart_tutorial.md) <a href="https://hub.docker.com/r/ultralytics/yolov5"><img src="https://img.shields.io/docker/pulls/ultralytics/yolov5?logo=docker" alt="Docker Pulls"></a>
|
||||
|
||||
## Project Status
|
||||
|
||||
<a href="https://github.com/ultralytics/yolov5/actions/workflows/ci-testing.yml"><img src="https://github.com/ultralytics/yolov5/actions/workflows/ci-testing.yml/badge.svg" alt="YOLOv5 CI"></a>
|
||||
|
||||
This badge indicates that all [YOLOv5 GitHub Actions](https://github.com/ultralytics/yolov5/actions) Continuous Integration (CI) tests are successfully passing. These CI tests rigorously check the functionality and performance of YOLOv5 across various key aspects: [training](https://github.com/ultralytics/yolov5/blob/master/train.py), [validation](https://github.com/ultralytics/yolov5/blob/master/val.py), [inference](https://github.com/ultralytics/yolov5/blob/master/detect.py), [export](https://github.com/ultralytics/yolov5/blob/master/export.py), and [benchmarks](https://github.com/ultralytics/yolov5/blob/master/benchmarks.py). They ensure consistent and reliable operation on macOS, Windows, and Ubuntu, with tests conducted every 24 hours and upon each new commit.
|
||||
173
docs/en/yolov5/tutorials/model_ensembling.md
Executable file
173
docs/en/yolov5/tutorials/model_ensembling.md
Executable file
@@ -0,0 +1,173 @@
|
||||
---
|
||||
comments: true
|
||||
description: Learn how to use YOLOv5 model ensembling during testing and inference to enhance mAP and Recall for more accurate predictions.
|
||||
keywords: YOLOv5, model ensembling, testing, inference, mAP, Recall, Ultralytics, object detection, PyTorch
|
||||
---
|
||||
|
||||
# YOLOv5 Model Ensembling
|
||||
|
||||
📚 This guide explains how to use Ultralytics YOLOv5 🚀 **model ensembling** during testing and inference for improved mAP and [Recall](https://www.ultralytics.com/glossary/recall).
|
||||
|
||||
From [ensemble learning](https://en.wikipedia.org/wiki/Ensemble_learning):
|
||||
|
||||
> Ensemble modeling is a process where multiple diverse models are created to predict an outcome, either by using many different modeling algorithms or using different [training data](https://www.ultralytics.com/glossary/training-data) sets. The ensemble model then aggregates the prediction of each base model and results in one final prediction for the unseen data. The motivation for using ensemble models is to reduce the generalization error of the prediction. As long as the base models are diverse and independent, the prediction error of the model decreases when the ensemble approach is used. The approach seeks the wisdom of crowds in making a prediction. Even though the ensemble model has multiple base models within the model, it acts and performs as a single model.
|
||||
|
||||
## Before You Start
|
||||
|
||||
Clone repo and install [requirements.txt](https://github.com/ultralytics/yolov5/blob/master/requirements.txt) in a [**Python>=3.8.0**](https://www.python.org/) environment, including [**PyTorch>=1.8**](https://pytorch.org/get-started/locally/). [Models](https://github.com/ultralytics/yolov5/tree/master/models) and [datasets](https://github.com/ultralytics/yolov5/tree/master/data) download automatically from the latest YOLOv5 [release](https://github.com/ultralytics/yolov5/releases).
|
||||
|
||||
```bash
|
||||
git clone https://github.com/ultralytics/yolov5 # clone
|
||||
cd yolov5
|
||||
pip install -r requirements.txt # install
|
||||
```
|
||||
|
||||
## Test Normally
|
||||
|
||||
Before ensembling, establish the baseline performance of a single model. This command tests YOLOv5x on COCO val2017 at image size 640 pixels. `yolov5x.pt` is the largest and most accurate model available. Other options are `yolov5s.pt`, `yolov5m.pt` and `yolov5l.pt`, or your own checkpoint from training a custom dataset `./weights/best.pt`. For details on all available models, see the [pretrained checkpoints table](https://docs.ultralytics.com/models/yolov5/).
|
||||
|
||||
```bash
|
||||
python val.py --weights yolov5x.pt --data coco.yaml --img 640 --half
|
||||
```
|
||||
|
||||
Output:
|
||||
|
||||
```text
|
||||
val: data=./data/coco.yaml, weights=['yolov5x.pt'], batch_size=32, imgsz=640, conf_thres=0.001, iou_thres=0.65, task=val, device=, single_cls=False, augment=False, verbose=False, save_txt=False, save_conf=False, save_json=True, project=runs/val, name=exp, exist_ok=False, half=True
|
||||
YOLOv5 🚀 v5.0-267-g6a3ee7c torch 1.9.0+cu102 CUDA:0 (Tesla P100-PCIE-16GB, 16280.875MB)
|
||||
|
||||
Fusing layers...
|
||||
Model Summary: 476 layers, 87730285 parameters, 0 gradients
|
||||
|
||||
val: Scanning '../datasets/coco/val2017' images and labels...4952 found, 48 missing, 0 empty, 0 corrupted: 100% 5000/5000 [00:01<00:00, 2846.03it/s]
|
||||
val: New cache created: ../datasets/coco/val2017.cache
|
||||
Class Images Labels P R mAP@.5 mAP@.5:.95: 100% 157/157 [02:30<00:00, 1.05it/s]
|
||||
all 5000 36335 0.746 0.626 0.68 0.49
|
||||
Speed: 0.1ms pre-process, 22.4ms inference, 1.4ms NMS per image at shape (32, 3, 640, 640) # <--- baseline speed
|
||||
|
||||
Evaluating pycocotools mAP... saving runs/val/exp/yolov5x_predictions.json...
|
||||
...
|
||||
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.504 # <--- baseline mAP
|
||||
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.688
|
||||
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.546
|
||||
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.351
|
||||
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.551
|
||||
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.644
|
||||
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.382
|
||||
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.628
|
||||
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.681 # <--- baseline mAR
|
||||
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.524
|
||||
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.735
|
||||
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.826
|
||||
```
|
||||
|
||||
## Ensemble Test
|
||||
|
||||
Multiple pretrained models can be ensembled together at test and inference time by simply appending extra models to the `--weights` argument in any existing val.py or detect.py command. This example tests an ensemble of 2 models together:
|
||||
|
||||
- YOLOv5x
|
||||
- YOLOv5l6
|
||||
|
||||
```bash
|
||||
python val.py --weights yolov5x.pt yolov5l6.pt --data coco.yaml --img 640 --half
|
||||
```
|
||||
|
||||
You can list as many checkpoints as you would like, including custom weights such as `runs/train/exp5/weights/best.pt`. YOLOv5 will automatically run each model, align the predictions on a per-image basis, and average the outputs before performing NMS.
|
||||
|
||||
Output:
|
||||
|
||||
```text
|
||||
val: data=./data/coco.yaml, weights=['yolov5x.pt', 'yolov5l6.pt'], batch_size=32, imgsz=640, conf_thres=0.001, iou_thres=0.6, task=val, device=, single_cls=False, augment=False, verbose=False, save_txt=False, save_conf=False, save_json=True, project=runs/val, name=exp, exist_ok=False, half=True
|
||||
YOLOv5 🚀 v5.0-267-g6a3ee7c torch 1.9.0+cu102 CUDA:0 (Tesla P100-PCIE-16GB, 16280.875MB)
|
||||
|
||||
Fusing layers...
|
||||
Model Summary: 476 layers, 87730285 parameters, 0 gradients # Model 1
|
||||
Fusing layers...
|
||||
Model Summary: 501 layers, 77218620 parameters, 0 gradients # Model 2
|
||||
Ensemble created with ['yolov5x.pt', 'yolov5l6.pt'] # Ensemble notice
|
||||
|
||||
val: Scanning '../datasets/coco/val2017.cache' images and labels... 4952 found, 48 missing, 0 empty, 0 corrupted: 100% 5000/5000 [00:00<00:00, 49695545.02it/s]
|
||||
Class Images Labels P R mAP@.5 mAP@.5:.95: 100% 157/157 [03:58<00:00, 1.52s/it]
|
||||
all 5000 36335 0.747 0.637 0.692 0.502
|
||||
Speed: 0.1ms pre-process, 39.5ms inference, 2.0ms NMS per image at shape (32, 3, 640, 640) # <--- ensemble speed
|
||||
|
||||
Evaluating pycocotools mAP... saving runs/val/exp3/yolov5x_predictions.json...
|
||||
...
|
||||
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.515 # <--- ensemble mAP
|
||||
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.699
|
||||
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.557
|
||||
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.356
|
||||
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.563
|
||||
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.668
|
||||
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.387
|
||||
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.638
|
||||
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.689 # <--- ensemble mAR
|
||||
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.526
|
||||
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.743
|
||||
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.844
|
||||
```
|
||||
|
||||
## Ensemble Inference
|
||||
|
||||
Append extra models to the `--weights` argument to run ensemble inference:
|
||||
|
||||
```bash
|
||||
python detect.py --weights yolov5x.pt yolov5l6.pt --img 640 --source data/images
|
||||
```
|
||||
|
||||
Output:
|
||||
|
||||
```text
|
||||
YOLOv5 🚀 v5.0-267-g6a3ee7c torch 1.9.0+cu102 CUDA:0 (Tesla P100-PCIE-16GB, 16280.875MB)
|
||||
|
||||
Fusing layers...
|
||||
Model Summary: 476 layers, 87730285 parameters, 0 gradients
|
||||
Fusing layers...
|
||||
Model Summary: 501 layers, 77218620 parameters, 0 gradients
|
||||
Ensemble created with ['yolov5x.pt', 'yolov5l6.pt']
|
||||
|
||||
image 1/2 /content/yolov5/data/images/bus.jpg: 640x512 4 persons, 1 bus, 1 tie, Done. (0.063s)
|
||||
image 2/2 /content/yolov5/data/images/zidane.jpg: 384x640 3 persons, 2 ties, Done. (0.056s)
|
||||
Results saved to runs/detect/exp2
|
||||
Done. (0.223s)
|
||||
```
|
||||
|
||||
<img src="https://cdn.jsdelivr.net/gh/ultralytics/assets@main/docs/yolo-inference-result.avif" width="500" alt="YOLO inference result">
|
||||
|
||||
## Benefits of Model Ensembling
|
||||
|
||||
Model ensembling with YOLOv5 offers several advantages:
|
||||
|
||||
1. **Improved Accuracy**: As demonstrated in the examples above, ensembling multiple models increases mAP from 0.504 to 0.515 and mAR from 0.681 to 0.689.
|
||||
2. **Better Generalization**: Combining diverse models helps reduce overfitting and improves performance on varied data.
|
||||
3. **Enhanced Robustness**: Ensembles are typically more robust to noise and outliers in the data.
|
||||
4. **Complementary Strengths**: Different models may excel at detecting different types of objects or in different environmental conditions.
|
||||
|
||||
The primary trade-off is increased inference time, as shown in the speed metrics (22.4ms for single model vs. 39.5ms for ensemble).
|
||||
|
||||
## When to Use Model Ensembling
|
||||
|
||||
Consider using model ensembling in these scenarios:
|
||||
|
||||
- When accuracy is more important than inference speed
|
||||
- For critical applications where false negatives must be minimized
|
||||
- When processing challenging images with varied lighting, occlusion, or scale
|
||||
- During competitions or benchmarking where maximum performance is required
|
||||
|
||||
For real-time applications with strict latency requirements, single model inference may be more appropriate.
|
||||
|
||||
## Supported Environments
|
||||
|
||||
Ultralytics provides a range of ready-to-use environments, each pre-installed with essential dependencies such as [CUDA](https://developer.nvidia.com/cuda), [CUDNN](https://developer.nvidia.com/cudnn), [Python](https://www.python.org/), and [PyTorch](https://pytorch.org/), to kickstart your projects.
|
||||
|
||||
- **Free GPU Notebooks**: <a href="https://bit.ly/yolov5-paperspace-notebook"><img src="https://assets.paperspace.io/img/gradient-badge.svg" alt="Run on Gradient"></a> <a href="https://colab.research.google.com/github/ultralytics/yolov5/blob/master/tutorial.ipynb"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open In Colab"></a> <a href="https://www.kaggle.com/models/ultralytics/yolov5"><img src="https://kaggle.com/static/images/open-in-kaggle.svg" alt="Open In Kaggle"></a>
|
||||
- **Google Cloud**: [GCP Quickstart Guide](../environments/google_cloud_quickstart_tutorial.md)
|
||||
- **Amazon**: [AWS Quickstart Guide](../environments/aws_quickstart_tutorial.md)
|
||||
- **Azure**: [AzureML Quickstart Guide](../environments/azureml_quickstart_tutorial.md)
|
||||
- **Docker**: [Docker Quickstart Guide](../environments/docker_image_quickstart_tutorial.md) <a href="https://hub.docker.com/r/ultralytics/yolov5"><img src="https://img.shields.io/docker/pulls/ultralytics/yolov5?logo=docker" alt="Docker Pulls"></a>
|
||||
|
||||
## Project Status
|
||||
|
||||
<a href="https://github.com/ultralytics/yolov5/actions/workflows/ci-testing.yml"><img src="https://github.com/ultralytics/yolov5/actions/workflows/ci-testing.yml/badge.svg" alt="YOLOv5 CI"></a>
|
||||
|
||||
This badge indicates that all [YOLOv5 GitHub Actions](https://github.com/ultralytics/yolov5/actions) Continuous Integration (CI) tests are successfully passing. These CI tests rigorously check the functionality and performance of YOLOv5 across various key aspects: [training](https://github.com/ultralytics/yolov5/blob/master/train.py), [validation](https://github.com/ultralytics/yolov5/blob/master/val.py), [inference](https://github.com/ultralytics/yolov5/blob/master/detect.py), [export](https://github.com/ultralytics/yolov5/blob/master/export.py), and [benchmarks](https://github.com/ultralytics/yolov5/blob/master/benchmarks.py). They ensure consistent and reliable operation on macOS, Windows, and Ubuntu, with tests conducted every 24 hours and upon each new commit.
|
||||
252
docs/en/yolov5/tutorials/model_export.md
Executable file
252
docs/en/yolov5/tutorials/model_export.md
Executable file
@@ -0,0 +1,252 @@
|
||||
---
|
||||
comments: true
|
||||
description: Learn to export YOLOv5 models to various formats like TFLite, ONNX, CoreML and TensorRT. Increase model efficiency and deployment flexibility with our step-by-step guide.
|
||||
keywords: YOLOv5 export, TFLite, ONNX, CoreML, TensorRT, model conversion, YOLOv5 tutorial, PyTorch export
|
||||
---
|
||||
|
||||
# TFLite, ONNX, CoreML, TensorRT Export
|
||||
|
||||
📚 This guide explains how to export a trained YOLOv5 🚀 model from [PyTorch](https://www.ultralytics.com/glossary/pytorch) to various deployment formats including ONNX, TensorRT, CoreML and more.
|
||||
|
||||
## Before You Start
|
||||
|
||||
Clone repo and install [requirements.txt](https://github.com/ultralytics/yolov5/blob/master/requirements.txt) in a [**Python>=3.8.0**](https://www.python.org/) environment, including [**PyTorch>=1.8**](https://pytorch.org/get-started/locally/). [Models](https://github.com/ultralytics/yolov5/tree/master/models) and [datasets](https://github.com/ultralytics/yolov5/tree/master/data) download automatically from the latest YOLOv5 [release](https://github.com/ultralytics/yolov5/releases).
|
||||
|
||||
```bash
|
||||
git clone https://github.com/ultralytics/yolov5 # clone
|
||||
cd yolov5
|
||||
pip install -r requirements.txt # install
|
||||
```
|
||||
|
||||
For [TensorRT](https://developer.nvidia.com/tensorrt) export example (requires GPU) see our Colab [notebook](https://colab.research.google.com/github/ultralytics/yolov5/blob/master/tutorial.ipynb#scrollTo=VTRwsvA9u7ln&line=2&uniqifier=1) appendix section. <a href="https://colab.research.google.com/github/ultralytics/yolov5/blob/master/tutorial.ipynb"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open In Colab"></a>
|
||||
|
||||
## Supported Export Formats
|
||||
|
||||
YOLOv5 inference is officially supported in 12 formats:
|
||||
|
||||
!!! tip "Performance Tips"
|
||||
|
||||
- Export to ONNX or OpenVINO for up to 3x CPU speedup. See [CPU Benchmarks](https://github.com/ultralytics/yolov5/pull/6613).
|
||||
- Export to TensorRT for up to 5x GPU speedup. See [GPU Benchmarks](https://github.com/ultralytics/yolov5/pull/6963).
|
||||
|
||||
| Format | `export.py --include` | Model |
|
||||
| :----------------------------------------------------------- | :-------------------- | :------------------------ |
|
||||
| [PyTorch](https://pytorch.org/) | - | `yolov5s.pt` |
|
||||
| [TorchScript](../../integrations/torchscript.md) | `torchscript` | `yolov5s.torchscript` |
|
||||
| [ONNX](../../integrations/onnx.md) | `onnx` | `yolov5s.onnx` |
|
||||
| [OpenVINO](../../integrations/openvino.md) | `openvino` | `yolov5s_openvino_model/` |
|
||||
| [TensorRT](../../integrations/tensorrt.md) | `engine` | `yolov5s.engine` |
|
||||
| [CoreML](../../integrations/coreml.md) | `coreml` | `yolov5s.mlmodel` |
|
||||
| [TensorFlow SavedModel](../../integrations/tf-savedmodel.md) | `saved_model` | `yolov5s_saved_model/` |
|
||||
| [TensorFlow GraphDef](../../integrations/tf-graphdef.md) | `pb` | `yolov5s.pb` |
|
||||
| [TensorFlow Lite](../../integrations/tflite.md) | `tflite` | `yolov5s.tflite` |
|
||||
| [TensorFlow Edge TPU](../../integrations/edge-tpu.md) | `edgetpu` | `yolov5s_edgetpu.tflite` |
|
||||
| [TensorFlow.js](../../integrations/tfjs.md) | `tfjs` | `yolov5s_web_model/` |
|
||||
| [PaddlePaddle](../../integrations/paddlepaddle.md) | `paddle` | `yolov5s_paddle_model/` |
|
||||
|
||||
## Benchmarks
|
||||
|
||||
Benchmarks below run on a Colab Pro with the YOLOv5 tutorial notebook <a href="https://colab.research.google.com/github/ultralytics/yolov5/blob/master/tutorial.ipynb"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open In Colab"></a>. To reproduce:
|
||||
|
||||
```bash
|
||||
python benchmarks.py --weights yolov5s.pt --imgsz 640 --device 0
|
||||
```
|
||||
|
||||
### Colab Pro V100 GPU
|
||||
|
||||
```
|
||||
benchmarks: weights=/content/yolov5/yolov5s.pt, imgsz=640, batch_size=1, data=/content/yolov5/data/coco128.yaml, device=0, half=False, test=False
|
||||
Checking setup...
|
||||
YOLOv5 🚀 v6.1-135-g7926afc torch 1.10.0+cu111 CUDA:0 (Tesla V100-SXM2-16GB, 16160MiB)
|
||||
Setup complete ✅ (8 CPUs, 51.0 GB RAM, 46.7/166.8 GB disk)
|
||||
|
||||
Benchmarks complete (458.07s)
|
||||
Format mAP@0.5:0.95 Inference time (ms)
|
||||
0 PyTorch 0.4623 10.19
|
||||
1 TorchScript 0.4623 6.85
|
||||
2 ONNX 0.4623 14.63
|
||||
3 OpenVINO NaN NaN
|
||||
4 TensorRT 0.4617 1.89
|
||||
5 CoreML NaN NaN
|
||||
6 TensorFlow SavedModel 0.4623 21.28
|
||||
7 TensorFlow GraphDef 0.4623 21.22
|
||||
8 TensorFlow Lite NaN NaN
|
||||
9 TensorFlow Edge TPU NaN NaN
|
||||
10 TensorFlow.js NaN NaN
|
||||
```
|
||||
|
||||
### Colab Pro CPU
|
||||
|
||||
```
|
||||
benchmarks: weights=/content/yolov5/yolov5s.pt, imgsz=640, batch_size=1, data=/content/yolov5/data/coco128.yaml, device=cpu, half=False, test=False
|
||||
Checking setup...
|
||||
YOLOv5 🚀 v6.1-135-g7926afc torch 1.10.0+cu111 CPU
|
||||
Setup complete ✅ (8 CPUs, 51.0 GB RAM, 41.5/166.8 GB disk)
|
||||
|
||||
Benchmarks complete (241.20s)
|
||||
Format mAP@0.5:0.95 Inference time (ms)
|
||||
0 PyTorch 0.4623 127.61
|
||||
1 TorchScript 0.4623 131.23
|
||||
2 ONNX 0.4623 69.34
|
||||
3 OpenVINO 0.4623 66.52
|
||||
4 TensorRT NaN NaN
|
||||
5 CoreML NaN NaN
|
||||
6 TensorFlow SavedModel 0.4623 123.79
|
||||
7 TensorFlow GraphDef 0.4623 121.57
|
||||
8 TensorFlow Lite 0.4623 316.61
|
||||
9 TensorFlow Edge TPU NaN NaN
|
||||
10 TensorFlow.js NaN NaN
|
||||
```
|
||||
|
||||
## Export a Trained YOLOv5 Model
|
||||
|
||||
This command exports a pretrained YOLOv5s model to TorchScript and ONNX formats. `yolov5s.pt` is the 'small' model, the second-smallest model available. Other options are `yolov5n.pt`, `yolov5m.pt`, `yolov5l.pt` and `yolov5x.pt`, along with their P6 counterparts i.e. `yolov5s6.pt` or you own custom training checkpoint i.e. `runs/exp/weights/best.pt`. For details on all available models please see our README [table](https://github.com/ultralytics/yolov5#pretrained-checkpoints).
|
||||
|
||||
```bash
|
||||
python export.py --weights yolov5s.pt --include torchscript onnx
|
||||
```
|
||||
|
||||
!!! tip
|
||||
|
||||
Add `--half` to export models at FP16 half [precision](https://www.ultralytics.com/glossary/precision) for smaller file sizes
|
||||
|
||||
Output:
|
||||
|
||||
```text
|
||||
export: data=data/coco128.yaml, weights=['yolov5s.pt'], imgsz=[640, 640], batch_size=1, device=cpu, half=False, inplace=False, train=False, keras=False, optimize=False, int8=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, include=['torchscript', 'onnx']
|
||||
YOLOv5 🚀 v6.2-104-ge3e5122 Python-3.8.0 torch-1.12.1+cu113 CPU
|
||||
|
||||
Downloading https://github.com/ultralytics/yolov5/releases/download/v6.2/yolov5s.pt to yolov5s.pt...
|
||||
100% 14.1M/14.1M [00:00<00:00, 274MB/s]
|
||||
|
||||
Fusing layers...
|
||||
YOLOv5s summary: 213 layers, 7225885 parameters, 0 gradients
|
||||
|
||||
PyTorch: starting from yolov5s.pt with output shape (1, 25200, 85) (14.1 MB)
|
||||
|
||||
TorchScript: starting export with torch 1.12.1+cu113...
|
||||
TorchScript: export success ✅ 1.7s, saved as yolov5s.torchscript (28.1 MB)
|
||||
|
||||
ONNX: starting export with onnx 1.12.0...
|
||||
ONNX: export success ✅ 2.3s, saved as yolov5s.onnx (28.0 MB)
|
||||
|
||||
Export complete (5.5s)
|
||||
Results saved to /content/yolov5
|
||||
Detect: python detect.py --weights yolov5s.onnx
|
||||
Validate: python val.py --weights yolov5s.onnx
|
||||
PyTorch Hub: model = torch.hub.load('ultralytics/yolov5', 'custom', 'yolov5s.onnx')
|
||||
Visualize: https://netron.app/
|
||||
```
|
||||
|
||||
The 3 exported models will be saved alongside the original PyTorch model:
|
||||
|
||||
<p align="center"><img width="700" src="https://cdn.jsdelivr.net/gh/ultralytics/assets@main/docs/yolo-export-locations.avif" alt="YOLO export locations"></p>
|
||||
|
||||
[Netron Viewer](https://github.com/lutzroeder/netron) is recommended for visualizing exported models:
|
||||
|
||||
<p align="center"><img width="850" src="https://cdn.jsdelivr.net/gh/ultralytics/assets@main/docs/yolo-model-visualization.avif" alt="YOLO model visualization"></p>
|
||||
|
||||
## Exported Model Usage Examples
|
||||
|
||||
`detect.py` runs inference on exported models:
|
||||
|
||||
```bash
|
||||
python detect.py --weights yolov5s.pt # PyTorch
|
||||
python detect.py --weights yolov5s.torchscript # TorchScript
|
||||
python detect.py --weights yolov5s.onnx # ONNX Runtime or OpenCV DNN with dnn=True
|
||||
python detect.py --weights yolov5s_openvino_model # OpenVINO
|
||||
python detect.py --weights yolov5s.engine # TensorRT
|
||||
python detect.py --weights yolov5s.mlmodel # CoreML (macOS only)
|
||||
python detect.py --weights yolov5s_saved_model # TensorFlow SavedModel
|
||||
python detect.py --weights yolov5s.pb # TensorFlow GraphDef
|
||||
python detect.py --weights yolov5s.tflite # TensorFlow Lite
|
||||
python detect.py --weights yolov5s_edgetpu.tflite # TensorFlow Edge TPU
|
||||
python detect.py --weights yolov5s_paddle_model # PaddlePaddle
|
||||
```
|
||||
|
||||
`val.py` runs validation on exported models:
|
||||
|
||||
```bash
|
||||
python val.py --weights yolov5s.pt # PyTorch
|
||||
python val.py --weights yolov5s.torchscript # TorchScript
|
||||
python val.py --weights yolov5s.onnx # ONNX Runtime or OpenCV DNN with dnn=True
|
||||
python val.py --weights yolov5s_openvino_model # OpenVINO
|
||||
python val.py --weights yolov5s.engine # TensorRT
|
||||
python val.py --weights yolov5s.mlmodel # CoreML (macOS Only)
|
||||
python val.py --weights yolov5s_saved_model # TensorFlow SavedModel
|
||||
python val.py --weights yolov5s.pb # TensorFlow GraphDef
|
||||
python val.py --weights yolov5s.tflite # TensorFlow Lite
|
||||
python val.py --weights yolov5s_edgetpu.tflite # TensorFlow Edge TPU
|
||||
python val.py --weights yolov5s_paddle_model # PaddlePaddle
|
||||
```
|
||||
|
||||
Use PyTorch Hub with exported YOLOv5 models:
|
||||
|
||||
```python
|
||||
import torch
|
||||
|
||||
# Model
|
||||
model = torch.hub.load("ultralytics/yolov5", "custom", "yolov5s.pt")
|
||||
model = torch.hub.load("ultralytics/yolov5", "custom", "yolov5s.torchscript") # TorchScript
|
||||
model = torch.hub.load("ultralytics/yolov5", "custom", "yolov5s.onnx") # ONNX Runtime
|
||||
model = torch.hub.load("ultralytics/yolov5", "custom", "yolov5s_openvino_model") # OpenVINO
|
||||
model = torch.hub.load("ultralytics/yolov5", "custom", "yolov5s.engine") # TensorRT
|
||||
model = torch.hub.load("ultralytics/yolov5", "custom", "yolov5s.mlmodel") # CoreML (macOS Only)
|
||||
model = torch.hub.load("ultralytics/yolov5", "custom", "yolov5s_saved_model") # TensorFlow SavedModel
|
||||
model = torch.hub.load("ultralytics/yolov5", "custom", "yolov5s.pb") # TensorFlow GraphDef
|
||||
model = torch.hub.load("ultralytics/yolov5", "custom", "yolov5s.tflite") # TensorFlow Lite
|
||||
model = torch.hub.load("ultralytics/yolov5", "custom", "yolov5s_edgetpu.tflite") # TensorFlow Edge TPU
|
||||
model = torch.hub.load("ultralytics/yolov5", "custom", "yolov5s_paddle_model") # PaddlePaddle
|
||||
|
||||
# Images
|
||||
img = "https://ultralytics.com/images/zidane.jpg" # or file, Path, PIL, OpenCV, numpy, list
|
||||
|
||||
# Inference
|
||||
results = model(img)
|
||||
|
||||
# Results
|
||||
results.print() # or .show(), .save(), .crop(), .pandas(), etc.
|
||||
```
|
||||
|
||||
## OpenCV DNN inference
|
||||
|
||||
[OpenCV](https://www.ultralytics.com/glossary/opencv) inference with ONNX models:
|
||||
|
||||
```bash
|
||||
python export.py --weights yolov5s.pt --include onnx
|
||||
|
||||
python detect.py --weights yolov5s.onnx --dnn # detect
|
||||
python val.py --weights yolov5s.onnx --dnn # validate
|
||||
```
|
||||
|
||||
## C++ Inference
|
||||
|
||||
YOLOv5 OpenCV DNN C++ inference on exported ONNX model examples:
|
||||
|
||||
- [https://github.com/Hexmagic/ONNX-yolov5/blob/master/src/test.cpp](https://github.com/Hexmagic/ONNX-yolov5/blob/master/src/test.cpp)
|
||||
- [https://github.com/doleron/yolov5-opencv-cpp-python](https://github.com/doleron/yolov5-opencv-cpp-python)
|
||||
|
||||
YOLOv5 OpenVINO C++ inference examples:
|
||||
|
||||
- [https://github.com/dacquaviva/yolov5-openvino-cpp-python](https://github.com/dacquaviva/yolov5-openvino-cpp-python)
|
||||
- [https://github.com/UNeedCryDear/yolov5-seg-opencv-dnn-cpp](https://github.com/UNeedCryDear/yolov5-seg-opencv-onnxruntime-cpp)
|
||||
|
||||
## TensorFlow.js Web Browser Inference
|
||||
|
||||
- [https://aukerul-shuvo.github.io/YOLOv5_TensorFlow-JS/](https://aukerul-shuvo.github.io/YOLOv5_TensorFlow-JS/)
|
||||
|
||||
## Supported Environments
|
||||
|
||||
Ultralytics provides a range of ready-to-use environments, each pre-installed with essential dependencies such as [CUDA](https://developer.nvidia.com/cuda), [CUDNN](https://developer.nvidia.com/cudnn), [Python](https://www.python.org/), and [PyTorch](https://pytorch.org/), to kickstart your projects.
|
||||
|
||||
- **Free GPU Notebooks**: <a href="https://bit.ly/yolov5-paperspace-notebook"><img src="https://assets.paperspace.io/img/gradient-badge.svg" alt="Run on Gradient"></a> <a href="https://colab.research.google.com/github/ultralytics/yolov5/blob/master/tutorial.ipynb"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open In Colab"></a> <a href="https://www.kaggle.com/models/ultralytics/yolov5"><img src="https://kaggle.com/static/images/open-in-kaggle.svg" alt="Open In Kaggle"></a>
|
||||
- **Google Cloud**: [GCP Quickstart Guide](../environments/google_cloud_quickstart_tutorial.md)
|
||||
- **Amazon**: [AWS Quickstart Guide](../environments/aws_quickstart_tutorial.md)
|
||||
- **Azure**: [AzureML Quickstart Guide](../environments/azureml_quickstart_tutorial.md)
|
||||
- **Docker**: [Docker Quickstart Guide](../environments/docker_image_quickstart_tutorial.md) <a href="https://hub.docker.com/r/ultralytics/yolov5"><img src="https://img.shields.io/docker/pulls/ultralytics/yolov5?logo=docker" alt="Docker Pulls"></a>
|
||||
|
||||
## Project Status
|
||||
|
||||
<a href="https://github.com/ultralytics/yolov5/actions/workflows/ci-testing.yml"><img src="https://github.com/ultralytics/yolov5/actions/workflows/ci-testing.yml/badge.svg" alt="YOLOv5 CI"></a>
|
||||
|
||||
This badge indicates that all [YOLOv5 GitHub Actions](https://github.com/ultralytics/yolov5/actions) Continuous Integration (CI) tests are successfully passing. These CI tests rigorously check the functionality and performance of YOLOv5 across various key aspects: [training](https://github.com/ultralytics/yolov5/blob/master/train.py), [validation](https://github.com/ultralytics/yolov5/blob/master/val.py), [inference](https://github.com/ultralytics/yolov5/blob/master/detect.py), [export](https://github.com/ultralytics/yolov5/blob/master/export.py), and [benchmarks](https://github.com/ultralytics/yolov5/blob/master/benchmarks.py). They ensure consistent and reliable operation on macOS, Windows, and Ubuntu, with tests conducted every 24 hours and upon each new commit.
|
||||
142
docs/en/yolov5/tutorials/model_pruning_and_sparsity.md
Executable file
142
docs/en/yolov5/tutorials/model_pruning_and_sparsity.md
Executable file
@@ -0,0 +1,142 @@
|
||||
---
|
||||
comments: true
|
||||
description: Learn how to prune YOLOv5 models for improved performance. Follow this step-by-step guide to optimize your YOLOv5 models effectively.
|
||||
keywords: YOLOv5 pruning, model pruning, YOLOv5 optimization, YOLOv5 guide, machine learning pruning, model sparsity, neural network optimization
|
||||
---
|
||||
|
||||
# Model Pruning and Sparsity in YOLOv5
|
||||
|
||||
📚 This guide explains how to apply **pruning** to YOLOv5 🚀 models to create more efficient networks while maintaining performance.
|
||||
|
||||
## What is Model Pruning?
|
||||
|
||||
[Model pruning](https://www.ultralytics.com/glossary/model-pruning) is a technique used to reduce the size and complexity of neural networks by removing less important parameters (weights and connections). This process creates a more efficient model with several benefits:
|
||||
|
||||
- Reduced model size for easier deployment on resource-constrained devices
|
||||
- Faster inference speeds with minimal impact on accuracy
|
||||
- Lower memory usage and energy consumption
|
||||
- Improved overall efficiency for real-time applications
|
||||
|
||||
Pruning works by identifying and removing parameters that contribute minimally to the model's performance, resulting in a more lightweight model with similar accuracy.
|
||||
|
||||
## Before You Start
|
||||
|
||||
Clone repo and install [requirements.txt](https://github.com/ultralytics/yolov5/blob/master/requirements.txt) in a [**Python>=3.8.0**](https://www.python.org/) environment, including [**PyTorch>=1.8**](https://pytorch.org/get-started/locally/). [Models](https://github.com/ultralytics/yolov5/tree/master/models) and [datasets](https://github.com/ultralytics/yolov5/tree/master/data) download automatically from the latest YOLOv5 [release](https://github.com/ultralytics/yolov5/releases).
|
||||
|
||||
```bash
|
||||
git clone https://github.com/ultralytics/yolov5 # clone
|
||||
cd yolov5
|
||||
pip install -r requirements.txt # install
|
||||
```
|
||||
|
||||
## Test Baseline Performance
|
||||
|
||||
Before pruning, establish a baseline performance to compare against. This command tests YOLOv5x on COCO val2017 at image size 640 pixels. `yolov5x.pt` is the largest and most accurate model available. Other options are `yolov5s.pt`, `yolov5m.pt` and `yolov5l.pt`, or your own checkpoint from training a custom dataset `./weights/best.pt`. For details on all available models, see the README [table](https://github.com/ultralytics/yolov5#pretrained-checkpoints).
|
||||
|
||||
```bash
|
||||
python val.py --weights yolov5x.pt --data coco.yaml --img 640 --half
|
||||
```
|
||||
|
||||
Output:
|
||||
|
||||
```text
|
||||
val: data=/content/yolov5/data/coco.yaml, weights=['yolov5x.pt'], batch_size=32, imgsz=640, conf_thres=0.001, iou_thres=0.65, task=val, device=, workers=8, single_cls=False, augment=False, verbose=False, save_txt=False, save_conf=False, save_json=True, project=runs/val, name=exp, exist_ok=False, half=True, dnn=False
|
||||
YOLOv5 🚀 v6.0-224-g4c40933 torch 1.10.0+cu111 CUDA:0 (Tesla V100-SXM2-16GB, 16160MiB)
|
||||
|
||||
Fusing layers...
|
||||
Model Summary: 444 layers, 86705005 parameters, 0 gradients
|
||||
val: Scanning '/content/datasets/coco/val2017.cache' images and labels... 4952 found, 48 missing, 0 empty, 0 corrupt: 100% 5000/5000 [00:00<?, ?it/s]
|
||||
Class Images Labels P R mAP@.5 mAP@.5:.95: 100% 157/157 [01:12<00:00, 2.16it/s]
|
||||
all 5000 36335 0.732 0.628 0.683 0.496
|
||||
Speed: 0.1ms pre-process, 5.2ms inference, 1.7ms NMS per image at shape (32, 3, 640, 640) # <--- base speed
|
||||
|
||||
Evaluating pycocotools mAP... saving runs/val/exp2/yolov5x_predictions.json...
|
||||
...
|
||||
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.507 # <--- base mAP
|
||||
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.689
|
||||
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.552
|
||||
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.345
|
||||
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.559
|
||||
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.652
|
||||
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.381
|
||||
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.630
|
||||
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.682
|
||||
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.526
|
||||
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.731
|
||||
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.829
|
||||
Results saved to runs/val/exp
|
||||
```
|
||||
|
||||
## Apply Pruning to YOLOv5x (30% Sparsity)
|
||||
|
||||
We can apply pruning to the model using the `torch_utils.prune()` command defined in `utils/torch_utils.py`. To test a pruned model, we update `val.py` to prune YOLOv5x to 0.3 sparsity (30% of weights set to zero):
|
||||
|
||||
<img width="894" alt="YOLOv5 model pruning to 30% sparsity code" src="https://cdn.jsdelivr.net/gh/ultralytics/assets@main/docs/sparsity-test-yolov5x-coco.avif">
|
||||
|
||||
30% pruned output:
|
||||
|
||||
```text
|
||||
val: data=/content/yolov5/data/coco.yaml, weights=['yolov5x.pt'], batch_size=32, imgsz=640, conf_thres=0.001, iou_thres=0.65, task=val, device=, workers=8, single_cls=False, augment=False, verbose=False, save_txt=False, save_conf=False, save_json=True, project=runs/val, name=exp, exist_ok=False, half=True, dnn=False
|
||||
YOLOv5 🚀 v6.0-224-g4c40933 torch 1.10.0+cu111 CUDA:0 (Tesla V100-SXM2-16GB, 16160MiB)
|
||||
|
||||
Fusing layers...
|
||||
Model Summary: 444 layers, 86705005 parameters, 0 gradients
|
||||
Pruning model... 0.3 global sparsity
|
||||
val: Scanning '/content/datasets/coco/val2017.cache' images and labels... 4952 found, 48 missing, 0 empty, 0 corrupt: 100% 5000/5000 [00:00<?, ?it/s]
|
||||
Class Images Labels P R mAP@.5 mAP@.5:.95: 100% 157/157 [01:11<00:00, 2.19it/s]
|
||||
all 5000 36335 0.724 0.614 0.671 0.478
|
||||
Speed: 0.1ms pre-process, 5.2ms inference, 1.7ms NMS per image at shape (32, 3, 640, 640) # <--- prune speed
|
||||
|
||||
Evaluating pycocotools mAP... saving runs/val/exp3/yolov5x_predictions.json...
|
||||
...
|
||||
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.489 # <--- prune mAP
|
||||
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.677
|
||||
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.537
|
||||
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.334
|
||||
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.542
|
||||
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.635
|
||||
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.370
|
||||
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.612
|
||||
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.664
|
||||
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.496
|
||||
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.722
|
||||
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.803
|
||||
Results saved to runs/val/exp3
|
||||
```
|
||||
|
||||
## Results Analysis
|
||||
|
||||
From the results, we can observe:
|
||||
|
||||
- **30% sparsity achieved**: 30% of the model's weight parameters in `nn.Conv2d` layers are now zero
|
||||
- **Inference time remains unchanged**: Despite pruning, the processing speed is essentially the same
|
||||
- **Minimal performance impact**: mAP dropped slightly from 0.507 to 0.489 (only 3.6% reduction)
|
||||
- **Model size reduction**: The pruned model requires less memory for storage
|
||||
|
||||
This demonstrates that pruning can significantly reduce model complexity with only a minor impact on performance, making it an effective optimization technique for deployment in resource-constrained environments.
|
||||
|
||||
## Fine-tuning Pruned Models
|
||||
|
||||
For best results, pruned models should be fine-tuned after pruning to recover accuracy. This can be done by:
|
||||
|
||||
1. Applying pruning with a desired sparsity level
|
||||
2. Training the pruned model for a few epochs with a lower learning rate
|
||||
3. Evaluating the fine-tuned pruned model against the baseline
|
||||
|
||||
This process helps the remaining parameters adapt to compensate for the removed connections, often recovering most or all of the original accuracy.
|
||||
|
||||
## Supported Environments
|
||||
|
||||
Ultralytics provides a range of ready-to-use environments, each pre-installed with essential dependencies such as [CUDA](https://developer.nvidia.com/cuda), [CUDNN](https://developer.nvidia.com/cudnn), [Python](https://www.python.org/), and [PyTorch](https://pytorch.org/), to kickstart your projects.
|
||||
|
||||
- **Free GPU Notebooks**: <a href="https://bit.ly/yolov5-paperspace-notebook"><img src="https://assets.paperspace.io/img/gradient-badge.svg" alt="Run on Gradient"></a> <a href="https://colab.research.google.com/github/ultralytics/yolov5/blob/master/tutorial.ipynb"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open In Colab"></a> <a href="https://www.kaggle.com/models/ultralytics/yolov5"><img src="https://kaggle.com/static/images/open-in-kaggle.svg" alt="Open In Kaggle"></a>
|
||||
- **Google Cloud**: [GCP Quickstart Guide](../environments/google_cloud_quickstart_tutorial.md)
|
||||
- **Amazon**: [AWS Quickstart Guide](../environments/aws_quickstart_tutorial.md)
|
||||
- **Azure**: [AzureML Quickstart Guide](../environments/azureml_quickstart_tutorial.md)
|
||||
- **Docker**: [Docker Quickstart Guide](../environments/docker_image_quickstart_tutorial.md) <a href="https://hub.docker.com/r/ultralytics/yolov5"><img src="https://img.shields.io/docker/pulls/ultralytics/yolov5?logo=docker" alt="Docker Pulls"></a>
|
||||
|
||||
## Project Status
|
||||
|
||||
<a href="https://github.com/ultralytics/yolov5/actions/workflows/ci-testing.yml"><img src="https://github.com/ultralytics/yolov5/actions/workflows/ci-testing.yml/badge.svg" alt="YOLOv5 CI"></a>
|
||||
|
||||
This badge indicates that all [YOLOv5 GitHub Actions](https://github.com/ultralytics/yolov5/actions) Continuous Integration (CI) tests are successfully passing. These CI tests rigorously check the functionality and performance of YOLOv5 across various key aspects: [training](https://github.com/ultralytics/yolov5/blob/master/train.py), [validation](https://github.com/ultralytics/yolov5/blob/master/val.py), [inference](https://github.com/ultralytics/yolov5/blob/master/detect.py), [export](https://github.com/ultralytics/yolov5/blob/master/export.py), and [benchmarks](https://github.com/ultralytics/yolov5/blob/master/benchmarks.py). They ensure consistent and reliable operation on macOS, Windows, and Ubuntu, with tests conducted every 24 hours and upon each new commit.
|
||||
202
docs/en/yolov5/tutorials/multi_gpu_training.md
Executable file
202
docs/en/yolov5/tutorials/multi_gpu_training.md
Executable file
@@ -0,0 +1,202 @@
|
||||
---
|
||||
comments: true
|
||||
description: Learn how to train YOLOv5 on multiple GPUs for optimal performance. Guide covers single and multiple machine setups with DistributedDataParallel.
|
||||
keywords: YOLOv5, multiple GPUs, machine learning, deep learning, PyTorch, data parallel, distributed data parallel, DDP, multi-GPU training
|
||||
---
|
||||
|
||||
# Multi-GPU Training with YOLOv5
|
||||
|
||||
This guide explains how to properly use **multiple** GPUs to train a dataset with YOLOv5 🚀 on single or multiple machine(s).
|
||||
|
||||
## Before You Start
|
||||
|
||||
Clone repo and install [requirements.txt](https://github.com/ultralytics/yolov5/blob/master/requirements.txt) in a [**Python>=3.8.0**](https://www.python.org/) environment, including [**PyTorch>=1.8**](https://pytorch.org/get-started/locally/). [Models](https://github.com/ultralytics/yolov5/tree/master/models) and [datasets](https://github.com/ultralytics/yolov5/tree/master/data) download automatically from the latest YOLOv5 [release](https://github.com/ultralytics/yolov5/releases).
|
||||
|
||||
```bash
|
||||
git clone https://github.com/ultralytics/yolov5 # clone
|
||||
cd yolov5
|
||||
pip install -r requirements.txt # install
|
||||
```
|
||||
|
||||
!!! tip "ProTip!"
|
||||
|
||||
**Docker Image** is recommended for all Multi-GPU trainings. See [Docker Quickstart Guide](../environments/docker_image_quickstart_tutorial.md) <a href="https://hub.docker.com/r/ultralytics/yolov5"><img src="https://img.shields.io/docker/pulls/ultralytics/yolov5?logo=docker" alt="Docker Pulls"></a>
|
||||
|
||||
!!! tip "ProTip!"
|
||||
|
||||
`torch.distributed.run` replaces `torch.distributed.launch` in **[PyTorch](https://www.ultralytics.com/glossary/pytorch)>=1.9**. See [PyTorch distributed documentation](https://docs.pytorch.org/docs/stable/distributed.html) for details.
|
||||
|
||||
## Training
|
||||
|
||||
Select a pretrained model to start training from. Here we select [YOLOv5s](https://github.com/ultralytics/yolov5/blob/master/models/yolov5s.yaml), the smallest and fastest model available. See our README [table](https://github.com/ultralytics/yolov5#pretrained-checkpoints) for a full comparison of all models. We will train this model with Multi-GPU on the [COCO](https://github.com/ultralytics/yolov5/blob/master/data/scripts/get_coco.sh) dataset.
|
||||
|
||||
<p align="center"><img width="700" alt="YOLOv5 Models" src="https://cdn.jsdelivr.net/gh/ultralytics/assets@main/docs/yolov5-model-comparison.avif"></p>
|
||||
|
||||
### Single GPU
|
||||
|
||||
```bash
|
||||
python train.py --batch 64 --data coco.yaml --weights yolov5s.pt --device 0
|
||||
```
|
||||
|
||||
### Multi-GPU [DataParallel](https://docs.pytorch.org/docs/stable/nn.html#torch.nn.DataParallel) Mode (⚠️ not recommended)
|
||||
|
||||
You can increase the `device` to use Multiple GPUs in DataParallel mode.
|
||||
|
||||
```bash
|
||||
python train.py --batch 64 --data coco.yaml --weights yolov5s.pt --device 0,1
|
||||
```
|
||||
|
||||
This method is slow and barely speeds up training compared to using just 1 GPU.
|
||||
|
||||
### Multi-GPU [DistributedDataParallel](https://docs.pytorch.org/docs/stable/nn.html#torch.nn.parallel.DistributedDataParallel) Mode (✅ recommended)
|
||||
|
||||
You will have to pass `python -m torch.distributed.run --nproc_per_node`, followed by the usual arguments.
|
||||
|
||||
```bash
|
||||
python -m torch.distributed.run --nproc_per_node 2 train.py --batch 64 --data coco.yaml --weights yolov5s.pt --device 0,1
|
||||
```
|
||||
|
||||
- `--nproc_per_node` specifies how many GPUs you would like to use. In the example above, it is 2.
|
||||
- `--batch` is the total batch-size. It will be divided evenly to each GPU. In the example above, it is 64/2=32 per GPU.
|
||||
|
||||
The code above will use GPUs `0... (N-1)`. You can also set `CUDA_VISIBLE_DEVICES=2,3` (or any other list) before launching the command if you prefer to control device visibility via environment variables.
|
||||
|
||||
<details>
|
||||
<summary>Use specific GPUs (click to expand)</summary>
|
||||
|
||||
You can do so by simply passing `--device` followed by your specific GPUs. For example, in the code below, we will use GPUs `2,3`.
|
||||
|
||||
```bash
|
||||
python -m torch.distributed.run --nproc_per_node 2 train.py --batch 64 --data coco.yaml --cfg yolov5s.yaml --weights '' --device 2,3
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>Use SyncBatchNorm (click to expand)</summary>
|
||||
|
||||
[SyncBatchNorm](https://docs.pytorch.org/docs/master/generated/torch.nn.SyncBatchNorm.html) could increase [accuracy](https://www.ultralytics.com/glossary/accuracy) for multiple GPU training, however, it will slow down training by a significant factor. It is **only** available for Multiple GPU DistributedDataParallel training.
|
||||
|
||||
It is best used when the batch-size on **each** GPU is small (<= 8).
|
||||
|
||||
To use SyncBatchNorm, simply pass `--sync-bn` to the command like below:
|
||||
|
||||
```bash
|
||||
python -m torch.distributed.run --nproc_per_node 2 train.py --batch 64 --data coco.yaml --cfg yolov5s.yaml --weights '' --sync-bn
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>Use Multiple machines (click to expand)</summary>
|
||||
|
||||
This is **only** available for Multiple GPU DistributedDataParallel training.
|
||||
|
||||
Before we continue, make sure the files on all machines are the same, dataset, codebase, etc. Afterward, make sure the machines can communicate with each other.
|
||||
|
||||
You will have to choose a master machine (the machine that the others will talk to). Note down its address (`master_addr`) and choose a port (`master_port`). I will use `master_addr = 192.168.1.1` and `master_port = 1234` for the example below.
|
||||
|
||||
To use it, you can do as the following:
|
||||
|
||||
```bash
|
||||
# On master machine 0
|
||||
python -m torch.distributed.run --nproc_per_node G --nnodes N --node_rank 0 --master_addr "192.168.1.1" --master_port 1234 train.py --batch 64 --data coco.yaml --cfg yolov5s.yaml --weights ''
|
||||
```
|
||||
|
||||
```bash
|
||||
# On machine R
|
||||
python -m torch.distributed.run --nproc_per_node G --nnodes N --node_rank R --master_addr "192.168.1.1" --master_port 1234 train.py --batch 64 --data coco.yaml --cfg yolov5s.yaml --weights ''
|
||||
```
|
||||
|
||||
where `G` is number of GPU per machine, `N` is the number of machines, and `R` is the machine number from `0...(N-1)`. Let's say I have two machines with two GPUs each, it would be `G = 2`, `N = 2`, and `R = 1` for the above.
|
||||
|
||||
Training will not start until **all** `N` machines are connected. Output will only be shown on the master machine!
|
||||
|
||||
</details>
|
||||
|
||||
### Notes
|
||||
|
||||
- Windows support is untested, Linux is recommended.
|
||||
- `--batch` must be a multiple of the number of GPUs.
|
||||
- GPU 0 will take slightly more memory than the other GPUs as it maintains EMA and is responsible for checkpointing etc.
|
||||
- If you get `RuntimeError: Address already in use`, it could be because you are running multiple trainings at a time. To fix this, simply use a different port number by adding `--master_port` like below:
|
||||
|
||||
```bash
|
||||
python -m torch.distributed.run --master_port 1234 --nproc_per_node 2 ...
|
||||
```
|
||||
|
||||
## Results
|
||||
|
||||
DDP profiling results on an [AWS EC2 P4d instance](../environments/aws_quickstart_tutorial.md) with 8x A100 SXM4-40GB for YOLOv5l for 1 COCO [epoch](https://www.ultralytics.com/glossary/epoch).
|
||||
|
||||
<details>
|
||||
<summary>Profiling code</summary>
|
||||
|
||||
```bash
|
||||
# prepare
|
||||
t=ultralytics/yolov5:latest && sudo docker pull $t && sudo docker run -it --runtime=nvidia --ipc=host --gpus all -v "$(pwd)"/coco:/usr/src/coco $t
|
||||
pip3 install torch==1.9.0+cu111 torchvision==0.10.0+cu111 -f https://download.pytorch.org/whl/torch_stable.html
|
||||
cd .. && rm -rf app && git clone https://github.com/ultralytics/yolov5 -b master app && cd app
|
||||
cp data/coco.yaml data/coco_profile.yaml
|
||||
|
||||
# profile
|
||||
python train.py --batch-size 16 --data coco_profile.yaml --weights yolov5l.pt --epochs 1 --device 0
|
||||
python -m torch.distributed.run --nproc_per_node 2 train.py --batch-size 32 --data coco_profile.yaml --weights yolov5l.pt --epochs 1 --device 0,1
|
||||
python -m torch.distributed.run --nproc_per_node 4 train.py --batch-size 64 --data coco_profile.yaml --weights yolov5l.pt --epochs 1 --device 0,1,2,3
|
||||
python -m torch.distributed.run --nproc_per_node 8 train.py --batch-size 128 --data coco_profile.yaml --weights yolov5l.pt --epochs 1 --device 0,1,2,3,4,5,6,7
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
| GPUs<br>A100 | batch-size | CUDA_mem<br><sup>device0 (G)</sup> | COCO<br><sup>train</sup> | COCO<br><sup>val</sup> |
|
||||
| ------------ | ---------- | ---------------------------------- | ------------------------ | ---------------------- |
|
||||
| 1x | 16 | 26GB | 20:39 | 0:55 |
|
||||
| 2x | 32 | 26GB | 11:43 | 0:57 |
|
||||
| 4x | 64 | 26GB | 5:57 | 0:55 |
|
||||
| 8x | 128 | 26GB | 3:09 | 0:57 |
|
||||
|
||||
As shown in the results, using [DistributedDataParallel](https://docs.pytorch.org/docs/stable/nn.html#torch.nn.parallel.DistributedDataParallel) with multiple GPUs provides nearly linear scaling in training speed. With 8 GPUs, training completes approximately 6.5 times faster than with a single GPU, while maintaining the same memory usage per device.
|
||||
|
||||
## FAQ
|
||||
|
||||
If an error occurs, please read the checklist below first! (It could save your time)
|
||||
|
||||
<details>
|
||||
<summary>Checklist (click to expand)</summary>
|
||||
|
||||
- Have you properly read this post?
|
||||
- Have you tried to re-clone the codebase? The code changes **daily**.
|
||||
- Have you tried to search for your error? Someone may have already encountered it in this repo or in another and have the solution.
|
||||
- Have you installed all the requirements listed on top (including the correct Python and PyTorch versions)?
|
||||
- Have you tried in other environments listed in the "Environments" section below?
|
||||
- Have you tried with another dataset like coco128 or coco2017? It will make it easier to find the root cause.
|
||||
|
||||
If you went through all the above, feel free to raise an Issue by giving as much detail as possible following the template.
|
||||
|
||||
</details>
|
||||
|
||||
## Supported Environments
|
||||
|
||||
Ultralytics provides a range of ready-to-use environments, each pre-installed with essential dependencies such as [CUDA](https://developer.nvidia.com/cuda), [CUDNN](https://developer.nvidia.com/cudnn), [Python](https://www.python.org/), and [PyTorch](https://pytorch.org/), to kickstart your projects.
|
||||
|
||||
- **Free GPU Notebooks**: <a href="https://bit.ly/yolov5-paperspace-notebook"><img src="https://assets.paperspace.io/img/gradient-badge.svg" alt="Run on Gradient"></a> <a href="https://colab.research.google.com/github/ultralytics/yolov5/blob/master/tutorial.ipynb"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open In Colab"></a> <a href="https://www.kaggle.com/models/ultralytics/yolov5"><img src="https://kaggle.com/static/images/open-in-kaggle.svg" alt="Open In Kaggle"></a>
|
||||
- **Google Cloud**: [GCP Quickstart Guide](../environments/google_cloud_quickstart_tutorial.md)
|
||||
- **Amazon**: [AWS Quickstart Guide](../environments/aws_quickstart_tutorial.md)
|
||||
- **Azure**: [AzureML Quickstart Guide](../environments/azureml_quickstart_tutorial.md)
|
||||
- **Docker**: [Docker Quickstart Guide](../environments/docker_image_quickstart_tutorial.md) <a href="https://hub.docker.com/r/ultralytics/yolov5"><img src="https://img.shields.io/docker/pulls/ultralytics/yolov5?logo=docker" alt="Docker Pulls"></a>
|
||||
|
||||
## Project Status
|
||||
|
||||
<a href="https://github.com/ultralytics/yolov5/actions/workflows/ci-testing.yml"><img src="https://github.com/ultralytics/yolov5/actions/workflows/ci-testing.yml/badge.svg" alt="YOLOv5 CI"></a>
|
||||
|
||||
This badge indicates that all [YOLOv5 GitHub Actions](https://github.com/ultralytics/yolov5/actions) Continuous Integration (CI) tests are successfully passing. These CI tests rigorously check the functionality and performance of YOLOv5 across various key aspects: [training](https://github.com/ultralytics/yolov5/blob/master/train.py), [validation](https://github.com/ultralytics/yolov5/blob/master/val.py), [inference](https://github.com/ultralytics/yolov5/blob/master/detect.py), [export](https://github.com/ultralytics/yolov5/blob/master/export.py), and [benchmarks](https://github.com/ultralytics/yolov5/blob/master/benchmarks.py). They ensure consistent and reliable operation on macOS, Windows, and Ubuntu, with tests conducted every 24 hours and upon each new commit.
|
||||
|
||||
## Credits
|
||||
|
||||
We would like to thank @MagicFrogSJTU, who did all the heavy lifting, and @glenn-jocher for guiding us along the way.
|
||||
|
||||
## See Also
|
||||
|
||||
- [Train Mode](https://docs.ultralytics.com/modes/train/) - Learn about training YOLO models with Ultralytics
|
||||
- [Hyperparameter Tuning](https://docs.ultralytics.com/guides/hyperparameter-tuning/) - Optimize your model's performance
|
||||
- [Docker Quickstart Guide](https://docs.ultralytics.com/guides/docker-quickstart/) - Set up your Docker environment for training
|
||||
276
docs/en/yolov5/tutorials/neural_magic_pruning_quantization.md
Executable file
276
docs/en/yolov5/tutorials/neural_magic_pruning_quantization.md
Executable file
@@ -0,0 +1,276 @@
|
||||
---
|
||||
comments: true
|
||||
description: Learn how to deploy YOLOv5 using Neural Magic's DeepSparse for GPU-class performance on CPUs. Discover easy integration, flexible deployments, and more.
|
||||
keywords: YOLOv5, DeepSparse, Neural Magic, YOLO deployment, Sparse inference, Deep learning, Model sparsity, CPU optimization, No hardware accelerators, AI deployment
|
||||
---
|
||||
|
||||
<!--
|
||||
Copyright (c) 2021 - present / Neuralmagic, Inc. All Rights Reserved.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
# Deploy YOLOv5 with Neural Magic's DeepSparse
|
||||
|
||||
Welcome to software-delivered AI.
|
||||
|
||||
This guide explains how to deploy YOLOv5 with Neural Magic's DeepSparse.
|
||||
|
||||
DeepSparse is an inference runtime with exceptional performance on CPUs. For instance, compared to the ONNX Runtime baseline, DeepSparse offers a 5.8x speed-up for YOLOv5s, running on the same machine!
|
||||
|
||||
<p align="center">
|
||||
<img width="60%" src="https://cdn.jsdelivr.net/gh/ultralytics/assets@main/docs/yolov5-speed-improvement.avif" alt="YOLOv5 DeepSparse vs ONNX Runtime speed comparison chart">
|
||||
</p>
|
||||
|
||||
For the first time, your [deep learning](https://www.ultralytics.com/glossary/deep-learning-dl) workloads can meet the performance demands of production without the complexity and costs of hardware accelerators. Put simply, DeepSparse gives you the performance of GPUs and the simplicity of software:
|
||||
|
||||
- **Flexible Deployments**: Run consistently across cloud, data center, and edge with any hardware provider from Intel to AMD to ARM
|
||||
- **Infinite Scalability**: Scale vertically to 100s of cores, out with standard Kubernetes, or fully-abstracted with Serverless
|
||||
- **Easy Integration**: Clean APIs for integrating your model into an application and monitoring it in production
|
||||
|
||||
## How Does DeepSparse Achieve GPU-Class Performance?
|
||||
|
||||
DeepSparse takes advantage of model sparsity to gain its performance speedup.
|
||||
|
||||
Sparsification through pruning and quantization is a broadly studied technique, allowing order-of-magnitude reductions in the size and compute needed to execute a network, while maintaining high [accuracy](https://www.ultralytics.com/glossary/accuracy). DeepSparse is sparsity-aware, meaning it skips the zeroed out parameters, shrinking amount of compute in a forward pass. Since the sparse computation is now memory bound, DeepSparse executes the network depth-wise, breaking the problem into Tensor Columns, vertical stripes of computation that fit in cache.
|
||||
|
||||
<p align="center">
|
||||
<img width="60%" src="https://cdn.jsdelivr.net/gh/ultralytics/assets@main/docs/tensor-columns.avif" alt="DeepSparse tensor columns for sparse neural network inference">
|
||||
</p>
|
||||
|
||||
Sparse networks with compressed computation, executed depth-wise in cache, allows DeepSparse to deliver GPU-class performance on CPUs!
|
||||
|
||||
## How Do I Create A Sparse Version of YOLOv5 Trained on My Data?
|
||||
|
||||
Neural Magic's open-source model repository, [SparseZoo](https://github.com/neuralmagic/sparsezoo/blob/main/README.md), contains pre-sparsified checkpoints of each YOLOv5 model. Using [SparseML](https://github.com/neuralmagic/sparseml), which is integrated with Ultralytics, you can fine-tune a sparse checkpoint onto your data with a single CLI command.
|
||||
|
||||
[Checkout Neural Magic's YOLOv5 documentation for more details](https://www.redhat.com/en/about/press-releases/red-hat-completes-acquisition-neural-magic-fuel-optimized-generative-ai-innovation-across-hybrid-cloud).
|
||||
|
||||
## DeepSparse Usage
|
||||
|
||||
We will walk through an example benchmarking and deploying a sparse version of YOLOv5s with DeepSparse.
|
||||
|
||||
### Install DeepSparse
|
||||
|
||||
Run the following to install DeepSparse. We recommend you use a virtual environment with Python.
|
||||
|
||||
```bash
|
||||
pip install "deepsparse[server,yolo,onnxruntime]"
|
||||
```
|
||||
|
||||
### Collect an ONNX File
|
||||
|
||||
DeepSparse accepts a model in the ONNX format, passed either as:
|
||||
|
||||
- A SparseZoo stub which identifies an ONNX file in the SparseZoo
|
||||
- A local path to an ONNX model in a filesystem
|
||||
|
||||
The examples below use the standard dense and pruned-quantized YOLOv5s checkpoints, identified by the following SparseZoo stubs:
|
||||
|
||||
```bash
|
||||
zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
|
||||
zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none
|
||||
```
|
||||
|
||||
### Deploy a Model
|
||||
|
||||
DeepSparse offers convenient APIs for integrating your model into an application.
|
||||
|
||||
To try the deployment examples below, pull down a sample image and save it as `basilica.jpg` with the following:
|
||||
|
||||
```bash
|
||||
wget -O basilica.jpg https://raw.githubusercontent.com/neuralmagic/deepsparse/main/src/deepsparse/yolo/sample_images/basilica.jpg
|
||||
```
|
||||
|
||||
#### Python API
|
||||
|
||||
`Pipelines` wrap pre-processing and output post-processing around the runtime, providing a clean interface for adding DeepSparse to an application. The DeepSparse-Ultralytics integration includes an out-of-the-box `Pipeline` that accepts raw images and outputs the bounding boxes.
|
||||
|
||||
Create a `Pipeline` and run inference:
|
||||
|
||||
```python
|
||||
from deepsparse import Pipeline
|
||||
|
||||
# list of images in local filesystem
|
||||
images = ["basilica.jpg"]
|
||||
|
||||
# create Pipeline
|
||||
model_stub = "zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none"
|
||||
yolo_pipeline = Pipeline.create(
|
||||
task="yolo",
|
||||
model_path=model_stub,
|
||||
)
|
||||
|
||||
# run inference on images, receive bounding boxes + classes
|
||||
pipeline_outputs = yolo_pipeline(images=images, iou_thres=0.6, conf_thres=0.001)
|
||||
print(pipeline_outputs)
|
||||
```
|
||||
|
||||
If you are running in the cloud, you may get an error that OpenCV cannot find `libGL.so.1`. You can either install the missing library:
|
||||
|
||||
```bash
|
||||
apt-get install libgl1
|
||||
```
|
||||
|
||||
Or use the headless Ultralytics package that avoids GUI dependencies entirely:
|
||||
|
||||
```bash
|
||||
pip install ultralytics-opencv-headless
|
||||
```
|
||||
|
||||
#### HTTP Server
|
||||
|
||||
DeepSparse Server runs on top of the popular [FastAPI](https://fastapi.tiangolo.com/) web framework and [Uvicorn](https://www.uvicorn.org/) web server. With just a single CLI command, you can easily setup a model service endpoint with DeepSparse. The Server supports any Pipeline from DeepSparse, including [object detection](https://www.ultralytics.com/glossary/object-detection) with YOLOv5, enabling you to send raw images to the endpoint and receive the bounding boxes.
|
||||
|
||||
Spin up the Server with the pruned-quantized YOLOv5s:
|
||||
|
||||
```bash
|
||||
deepsparse.server \
|
||||
--task yolo \
|
||||
--model_path zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none
|
||||
```
|
||||
|
||||
An example request, using Python's `requests` package:
|
||||
|
||||
```python
|
||||
import json
|
||||
|
||||
import requests
|
||||
|
||||
# list of images for inference (local files on client side)
|
||||
path = ["basilica.jpg"]
|
||||
files = [("request", open(img, "rb")) for img in path]
|
||||
|
||||
# send request over HTTP to /predict/from_files endpoint
|
||||
url = "http://0.0.0.0:5543/predict/from_files"
|
||||
resp = requests.post(url=url, files=files)
|
||||
|
||||
# response is returned in JSON
|
||||
annotations = json.loads(resp.text) # dictionary of annotation results
|
||||
bounding_boxes = annotations["boxes"]
|
||||
labels = annotations["labels"]
|
||||
```
|
||||
|
||||
#### Annotate CLI
|
||||
|
||||
You can also use the annotate command to have the engine save an annotated photo on disk. Try `--source 0` to annotate your live webcam feed!
|
||||
|
||||
```bash
|
||||
deepsparse.object_detection.annotate --model_filepath zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none --source basilica.jpg
|
||||
```
|
||||
|
||||
Running the above command will create an `annotation-results` folder and save the annotated image inside.
|
||||
|
||||
<p align="center">
|
||||
<img src="https://cdn.jsdelivr.net/gh/ultralytics/assets@main/docs/basilica-annotated.avif" alt="YOLOv5 detection results with bounding boxes" width="60%">
|
||||
</p>
|
||||
|
||||
## Benchmarking Performance
|
||||
|
||||
We will compare DeepSparse's throughput to ONNX Runtime's throughput on YOLOv5s, using DeepSparse's benchmarking script.
|
||||
|
||||
The benchmarks were run on an AWS `c6i.8xlarge` instance (16 cores).
|
||||
|
||||
### Batch 32 Performance Comparison
|
||||
|
||||
#### ONNX Runtime Baseline
|
||||
|
||||
At batch 32, ONNX Runtime achieves 42 images/sec with the standard dense YOLOv5s:
|
||||
|
||||
```bash
|
||||
deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none -s sync -b 32 -nstreams 1 -e onnxruntime
|
||||
|
||||
# Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
|
||||
# Batch Size: 32
|
||||
# Scenario: sync
|
||||
# Throughput (items/sec): 41.9025
|
||||
```
|
||||
|
||||
#### DeepSparse Dense Performance
|
||||
|
||||
While DeepSparse offers its best performance with optimized sparse models, it also performs well with the standard dense YOLOv5s.
|
||||
|
||||
At batch 32, DeepSparse achieves 70 images/sec with the standard dense YOLOv5s, a **1.7x performance improvement over ORT**!
|
||||
|
||||
```bash
|
||||
deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none -s sync -b 32 -nstreams 1
|
||||
|
||||
# Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
|
||||
# Batch Size: 32
|
||||
# Scenario: sync
|
||||
# Throughput (items/sec): 69.5546
|
||||
```
|
||||
|
||||
#### DeepSparse Sparse Performance
|
||||
|
||||
When sparsity is applied to the model, DeepSparse's performance gains over ONNX Runtime are even stronger.
|
||||
|
||||
At batch 32, DeepSparse achieves 241 images/sec with the pruned-quantized YOLOv5s, a **5.8x performance improvement over ORT**!
|
||||
|
||||
```bash
|
||||
deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none -s sync -b 32 -nstreams 1
|
||||
|
||||
# Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none
|
||||
# Batch Size: 32
|
||||
# Scenario: sync
|
||||
# Throughput (items/sec): 241.2452
|
||||
```
|
||||
|
||||
### Batch 1 Performance Comparison
|
||||
|
||||
DeepSparse is also able to gain a speed-up over ONNX Runtime for the latency-sensitive, batch 1 scenario.
|
||||
|
||||
#### ONNX Runtime Baseline
|
||||
|
||||
At batch 1, ONNX Runtime achieves 48 images/sec with the standard, dense YOLOv5s.
|
||||
|
||||
```bash
|
||||
deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none -s sync -b 1 -nstreams 1 -e onnxruntime
|
||||
|
||||
# Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
|
||||
# Batch Size: 1
|
||||
# Scenario: sync
|
||||
# Throughput (items/sec): 48.0921
|
||||
```
|
||||
|
||||
#### DeepSparse Sparse Performance
|
||||
|
||||
At batch 1, DeepSparse achieves 135 items/sec with a pruned-quantized YOLOv5s, **a 2.8x performance gain over ONNX Runtime!**
|
||||
|
||||
```bash
|
||||
deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none -s sync -b 1 -nstreams 1
|
||||
|
||||
# Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none
|
||||
# Batch Size: 1
|
||||
# Scenario: sync
|
||||
# Throughput (items/sec): 134.9468
|
||||
```
|
||||
|
||||
Since `c6i.8xlarge` instances have VNNI instructions, DeepSparse's throughput can be pushed further if weights are pruned in blocks of 4.
|
||||
|
||||
At batch 1, DeepSparse achieves 180 items/sec with a 4-block pruned-quantized YOLOv5s, a **3.7x performance gain over ONNX Runtime!**
|
||||
|
||||
```bash
|
||||
deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned35_quant-none-vnni -s sync -b 1 -nstreams 1
|
||||
|
||||
# Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned35_quant-none-vnni
|
||||
# Batch Size: 1
|
||||
# Scenario: sync
|
||||
# Throughput (items/sec): 179.7375
|
||||
```
|
||||
|
||||
## Get Started With DeepSparse
|
||||
|
||||
**Research or Testing?** DeepSparse Community is free for research and testing. Get started with their [Documentation](https://www.redhat.com/en/about/press-releases/red-hat-completes-acquisition-neural-magic-fuel-optimized-generative-ai-innovation-across-hybrid-cloud).
|
||||
|
||||
For more information on deploying YOLOv5 with DeepSparse, check out the [Neural Magic's DeepSparse documentation](https://www.redhat.com/en/about/press-releases/red-hat-completes-acquisition-neural-magic-fuel-optimized-generative-ai-innovation-across-hybrid-cloud) and the [Ultralytics blog post on DeepSparse integration](https://www.ultralytics.com/blog/deploy-yolov5-with-neural-magics-deepsparse-for-gpu-class-performance-on-cpus).
|
||||
372
docs/en/yolov5/tutorials/pytorch_hub_model_loading.md
Executable file
372
docs/en/yolov5/tutorials/pytorch_hub_model_loading.md
Executable file
@@ -0,0 +1,372 @@
|
||||
---
|
||||
comments: true
|
||||
description: Learn how to load YOLOv5 from PyTorch Hub for seamless model inference and customization. Follow our step-by-step guide at Ultralytics Docs.
|
||||
keywords: YOLOv5, PyTorch Hub, model loading, Ultralytics, object detection, machine learning, AI, tutorial, inference
|
||||
---
|
||||
|
||||
# Loading YOLOv5 from PyTorch Hub
|
||||
|
||||
📚 This guide explains how to load YOLOv5 🚀 from [PyTorch](https://www.ultralytics.com/glossary/pytorch) Hub at [https://pytorch.org/hub/ultralytics_yolov5](https://pytorch.org/hub/ultralytics_yolov5/).
|
||||
|
||||
## Before You Start
|
||||
|
||||
Install [requirements.txt](https://github.com/ultralytics/yolov5/blob/master/requirements.txt) in a [**Python>=3.8.0**](https://www.python.org/) environment, including [**PyTorch>=1.8**](https://pytorch.org/get-started/locally/). [Models](https://github.com/ultralytics/yolov5/tree/master/models) and [datasets](https://github.com/ultralytics/yolov5/tree/master/data) download automatically from the latest YOLOv5 [release](https://github.com/ultralytics/yolov5/releases).
|
||||
|
||||
```bash
|
||||
pip install -r https://raw.githubusercontent.com/ultralytics/yolov5/master/requirements.txt
|
||||
```
|
||||
|
||||
💡 ProTip: Cloning [https://github.com/ultralytics/yolov5](https://github.com/ultralytics/yolov5) is **not** required 😃
|
||||
|
||||
## Load YOLOv5 with PyTorch Hub
|
||||
|
||||
### Simple Example
|
||||
|
||||
This example loads a pretrained YOLOv5s model from PyTorch Hub as `model` and passes an image for inference. `'yolov5s'` is the lightest and fastest YOLOv5 model. For details on all available models please see the [README](https://github.com/ultralytics/yolov5#pretrained-checkpoints).
|
||||
|
||||
```python
|
||||
import torch
|
||||
|
||||
# Model
|
||||
model = torch.hub.load("ultralytics/yolov5", "yolov5s")
|
||||
|
||||
# Image
|
||||
im = "https://ultralytics.com/images/zidane.jpg"
|
||||
|
||||
# Inference
|
||||
results = model(im)
|
||||
|
||||
results.pandas().xyxy[0]
|
||||
# xmin ymin xmax ymax confidence class name
|
||||
# 0 749.50 43.50 1148.0 704.5 0.874023 0 person
|
||||
# 1 433.50 433.50 517.5 714.5 0.687988 27 tie
|
||||
# 2 114.75 195.75 1095.0 708.0 0.624512 0 person
|
||||
# 3 986.00 304.00 1028.0 420.0 0.286865 27 tie
|
||||
```
|
||||
|
||||
### Detailed Example
|
||||
|
||||
This example shows **batched inference** with **PIL** and **[OpenCV](https://www.ultralytics.com/glossary/opencv)** image sources. `results` can be **printed** to console, **saved** to `runs/hub`, **showed** to screen on supported environments, and returned as **tensors** or **pandas** dataframes.
|
||||
|
||||
```python
|
||||
import cv2
|
||||
import torch
|
||||
from PIL import Image
|
||||
|
||||
# Model
|
||||
model = torch.hub.load("ultralytics/yolov5", "yolov5s")
|
||||
|
||||
# Images
|
||||
for f in "zidane.jpg", "bus.jpg":
|
||||
torch.hub.download_url_to_file("https://ultralytics.com/images/" + f, f) # download 2 images
|
||||
im1 = Image.open("zidane.jpg") # PIL image
|
||||
im2 = cv2.imread("bus.jpg")[..., ::-1] # OpenCV image (BGR to RGB)
|
||||
|
||||
# Inference
|
||||
results = model([im1, im2], size=640) # batch of images
|
||||
|
||||
# Results
|
||||
results.print()
|
||||
results.save() # or .show()
|
||||
|
||||
results.xyxy[0] # im1 predictions (tensor)
|
||||
results.pandas().xyxy[0] # im1 predictions (pandas)
|
||||
# xmin ymin xmax ymax confidence class name
|
||||
# 0 749.50 43.50 1148.0 704.5 0.874023 0 person
|
||||
# 1 433.50 433.50 517.5 714.5 0.687988 27 tie
|
||||
# 2 114.75 195.75 1095.0 708.0 0.624512 0 person
|
||||
# 3 986.00 304.00 1028.0 420.0 0.286865 27 tie
|
||||
```
|
||||
|
||||
<img src="https://cdn.jsdelivr.net/gh/ultralytics/assets@main/docs/yolo-inference-results-zidane.avif" width="500" alt="YOLO inference results on zidane.jpg">
|
||||
<img src="https://cdn.jsdelivr.net/gh/ultralytics/assets@main/docs/yolo-inference-results-on-bus.avif" width="300" alt="YOLO inference results on bus.jpg">
|
||||
|
||||
For all inference options see YOLOv5 `AutoShape()` forward [method](https://github.com/ultralytics/yolov5/blob/30e4c4f09297b67afedf8b2bcd851833ddc9dead/models/common.py#L243-L252).
|
||||
|
||||
### Inference Settings
|
||||
|
||||
YOLOv5 models contain various inference attributes such as **confidence threshold**, **IoU threshold**, etc. which can be set by:
|
||||
|
||||
```python
|
||||
model.conf = 0.25 # NMS confidence threshold
|
||||
model.iou = 0.45 # NMS IoU threshold
|
||||
model.agnostic = False # NMS class-agnostic
|
||||
model.multi_label = False # NMS multiple labels per box
|
||||
model.classes = None # (optional list) filter by class, i.e. = [0, 15, 16] for COCO persons, cats and dogs
|
||||
model.max_det = 1000 # maximum number of detections per image
|
||||
model.amp = False # Automatic Mixed Precision (AMP) inference
|
||||
|
||||
results = model(im, size=320) # custom inference size
|
||||
```
|
||||
|
||||
### Device
|
||||
|
||||
Models can be transferred to any device after creation:
|
||||
|
||||
```python
|
||||
model.cpu() # CPU
|
||||
model.cuda() # GPU
|
||||
model.to(device) # i.e. device=torch.device(0)
|
||||
```
|
||||
|
||||
Models can also be created directly on any `device`:
|
||||
|
||||
```python
|
||||
model = torch.hub.load("ultralytics/yolov5", "yolov5s", device="cpu") # load on CPU
|
||||
```
|
||||
|
||||
💡 ProTip: Input images are automatically transferred to the correct model device before inference.
|
||||
|
||||
### Silence Outputs
|
||||
|
||||
Models can be loaded silently with `_verbose=False`:
|
||||
|
||||
```python
|
||||
model = torch.hub.load("ultralytics/yolov5", "yolov5s", _verbose=False) # load silently
|
||||
```
|
||||
|
||||
### Input Channels
|
||||
|
||||
To load a pretrained YOLOv5s model with 4 input channels rather than the default 3:
|
||||
|
||||
```python
|
||||
model = torch.hub.load("ultralytics/yolov5", "yolov5s", channels=4)
|
||||
```
|
||||
|
||||
In this case the model will be composed of pretrained weights **except for** the very first input layer, which is no longer the same shape as the pretrained input layer. The input layer will remain initialized by random weights.
|
||||
|
||||
### Number of Classes
|
||||
|
||||
To load a pretrained YOLOv5s model with 10 output classes rather than the default 80:
|
||||
|
||||
```python
|
||||
model = torch.hub.load("ultralytics/yolov5", "yolov5s", classes=10)
|
||||
```
|
||||
|
||||
In this case the model will be composed of pretrained weights **except for** the output layers, which are no longer the same shape as the pretrained output layers. The output layers will remain initialized by random weights.
|
||||
|
||||
### Force Reload
|
||||
|
||||
If you run into problems with the above steps, setting `force_reload=True` may help by discarding the existing cache and force a fresh download of the latest YOLOv5 version from PyTorch Hub. Cached copies live in `~/.cache/torch/hub`; deleting that folder achieves the same effect.
|
||||
|
||||
```python
|
||||
model = torch.hub.load("ultralytics/yolov5", "yolov5s", force_reload=True) # force reload
|
||||
```
|
||||
|
||||
### Screenshot Inference
|
||||
|
||||
To run inference on your desktop screen:
|
||||
|
||||
```python
|
||||
import torch
|
||||
from PIL import ImageGrab
|
||||
|
||||
# Model
|
||||
model = torch.hub.load("ultralytics/yolov5", "yolov5s")
|
||||
|
||||
# Image
|
||||
im = ImageGrab.grab() # take a screenshot
|
||||
|
||||
# Inference
|
||||
results = model(im)
|
||||
```
|
||||
|
||||
### Multi-GPU Inference
|
||||
|
||||
YOLOv5 models can be loaded to multiple GPUs in parallel with threaded inference:
|
||||
|
||||
```python
|
||||
import threading
|
||||
|
||||
import torch
|
||||
|
||||
|
||||
def run(model, im):
|
||||
"""Performs inference on an image using a given model and saves the output; model must support `.save()` method."""
|
||||
results = model(im)
|
||||
results.save()
|
||||
|
||||
|
||||
# Models
|
||||
model0 = torch.hub.load("ultralytics/yolov5", "yolov5s", device=0)
|
||||
model1 = torch.hub.load("ultralytics/yolov5", "yolov5s", device=1)
|
||||
|
||||
# Inference
|
||||
threading.Thread(target=run, args=[model0, "https://ultralytics.com/images/zidane.jpg"], daemon=True).start()
|
||||
threading.Thread(target=run, args=[model1, "https://ultralytics.com/images/bus.jpg"], daemon=True).start()
|
||||
```
|
||||
|
||||
### Training
|
||||
|
||||
To load a YOLOv5 model for training rather than inference, set `autoshape=False`. To load a model with randomly initialized weights (to train from scratch) use `pretrained=False`. You must provide your own training script in this case. Alternatively see our YOLOv5 [Train Custom Data Tutorial](./train_custom_data.md) for model training.
|
||||
|
||||
```python
|
||||
import torch
|
||||
|
||||
model = torch.hub.load("ultralytics/yolov5", "yolov5s", autoshape=False) # load pretrained
|
||||
model = torch.hub.load("ultralytics/yolov5", "yolov5s", autoshape=False, pretrained=False) # load scratch
|
||||
```
|
||||
|
||||
### Base64 Results
|
||||
|
||||
For use with API services. See [Flask REST API](https://github.com/ultralytics/yolov5/tree/master/utils/flask_rest_api) example for details.
|
||||
|
||||
```python
|
||||
import base64
|
||||
from io import BytesIO
|
||||
|
||||
from PIL import Image
|
||||
|
||||
results = model(im) # inference
|
||||
|
||||
results.ims # array of original images (as np array) passed to model for inference
|
||||
results.render() # updates results.ims with boxes and labels
|
||||
for im in results.ims:
|
||||
buffered = BytesIO()
|
||||
im_base64 = Image.fromarray(im)
|
||||
im_base64.save(buffered, format="JPEG")
|
||||
print(base64.b64encode(buffered.getvalue()).decode("utf-8")) # base64 encoded image with results
|
||||
```
|
||||
|
||||
### Cropped Results
|
||||
|
||||
Results can be returned and saved as detection crops:
|
||||
|
||||
```python
|
||||
results = model(im) # inference
|
||||
crops = results.crop(save=True) # cropped detections dictionary
|
||||
```
|
||||
|
||||
### Pandas Results
|
||||
|
||||
Results can be returned as [Pandas DataFrames](https://pandas.pydata.org/):
|
||||
|
||||
```python
|
||||
results = model(im) # inference
|
||||
results.pandas().xyxy[0] # Pandas DataFrame
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>Pandas Output (click to expand)</summary>
|
||||
|
||||
```python
|
||||
print(results.pandas().xyxy[0])
|
||||
# xmin ymin xmax ymax confidence class name
|
||||
# 0 749.50 43.50 1148.0 704.5 0.874023 0 person
|
||||
# 1 433.50 433.50 517.5 714.5 0.687988 27 tie
|
||||
# 2 114.75 195.75 1095.0 708.0 0.624512 0 person
|
||||
# 3 986.00 304.00 1028.0 420.0 0.286865 27 tie
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
### Sorted Results
|
||||
|
||||
Results can be sorted by column, i.e. to sort license plate digit detection left-to-right (x-axis):
|
||||
|
||||
```python
|
||||
results = model(im) # inference
|
||||
results.pandas().xyxy[0].sort_values("xmin") # sorted left-right
|
||||
```
|
||||
|
||||
### JSON Results
|
||||
|
||||
Results can be returned in JSON format once converted to `.pandas()` dataframes using the `.to_json()` method. The JSON format can be modified using the `orient` argument. See pandas `.to_json()` [documentation](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_json.html) for details.
|
||||
|
||||
```python
|
||||
results = model(ims) # inference
|
||||
results.pandas().xyxy[0].to_json(orient="records") # JSON img1 predictions
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>JSON Output (click to expand)</summary>
|
||||
|
||||
```json
|
||||
[
|
||||
{
|
||||
"xmin": 749.5,
|
||||
"ymin": 43.5,
|
||||
"xmax": 1148.0,
|
||||
"ymax": 704.5,
|
||||
"confidence": 0.8740234375,
|
||||
"class": 0,
|
||||
"name": "person"
|
||||
},
|
||||
{
|
||||
"xmin": 433.5,
|
||||
"ymin": 433.5,
|
||||
"xmax": 517.5,
|
||||
"ymax": 714.5,
|
||||
"confidence": 0.6879882812,
|
||||
"class": 27,
|
||||
"name": "tie"
|
||||
},
|
||||
{
|
||||
"xmin": 115.25,
|
||||
"ymin": 195.75,
|
||||
"xmax": 1096.0,
|
||||
"ymax": 708.0,
|
||||
"confidence": 0.6254882812,
|
||||
"class": 0,
|
||||
"name": "person"
|
||||
},
|
||||
{
|
||||
"xmin": 986.0,
|
||||
"ymin": 304.0,
|
||||
"xmax": 1028.0,
|
||||
"ymax": 420.0,
|
||||
"confidence": 0.2873535156,
|
||||
"class": 27,
|
||||
"name": "tie"
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
## Custom Models
|
||||
|
||||
This example loads a custom 20-class [VOC](https://github.com/ultralytics/yolov5/blob/master/data/VOC.yaml)-trained YOLOv5s model `'best.pt'` with PyTorch Hub.
|
||||
|
||||
```python
|
||||
import torch
|
||||
|
||||
model = torch.hub.load("ultralytics/yolov5", "custom", path="path/to/best.pt") # local model
|
||||
model = torch.hub.load("path/to/yolov5", "custom", path="path/to/best.pt", source="local") # local repo
|
||||
```
|
||||
|
||||
## TensorRT, ONNX and OpenVINO Models
|
||||
|
||||
PyTorch Hub supports inference on most YOLOv5 export formats, including custom-trained models. See [TFLite, ONNX, CoreML, TensorRT Export tutorial](./model_export.md) for details on exporting models.
|
||||
|
||||
💡 ProTip: **TensorRT** may be up to 2-5X faster than PyTorch on [**GPU benchmarks**](https://github.com/ultralytics/yolov5/pull/6963)
|
||||
💡 ProTip: **ONNX** and **OpenVINO** may be up to 2-3X faster than PyTorch on [**CPU benchmarks**](https://github.com/ultralytics/yolov5/pull/6613)
|
||||
|
||||
```python
|
||||
import torch
|
||||
|
||||
model = torch.hub.load("ultralytics/yolov5", "custom", path="yolov5s.pt") # PyTorch
|
||||
model = torch.hub.load("ultralytics/yolov5", "custom", path="yolov5s.torchscript") # TorchScript
|
||||
model = torch.hub.load("ultralytics/yolov5", "custom", path="yolov5s.onnx") # ONNX
|
||||
model = torch.hub.load("ultralytics/yolov5", "custom", path="yolov5s_openvino_model/") # OpenVINO
|
||||
model = torch.hub.load("ultralytics/yolov5", "custom", path="yolov5s.engine") # TensorRT
|
||||
model = torch.hub.load("ultralytics/yolov5", "custom", path="yolov5s.mlmodel") # CoreML (macOS-only)
|
||||
model = torch.hub.load("ultralytics/yolov5", "custom", path="yolov5s.tflite") # TFLite
|
||||
model = torch.hub.load("ultralytics/yolov5", "custom", path="yolov5s_paddle_model/") # PaddlePaddle
|
||||
```
|
||||
|
||||
## Supported Environments
|
||||
|
||||
Ultralytics provides a range of ready-to-use environments, each pre-installed with essential dependencies such as [CUDA](https://developer.nvidia.com/cuda), [CUDNN](https://developer.nvidia.com/cudnn), [Python](https://www.python.org/), and [PyTorch](https://pytorch.org/), to kickstart your projects.
|
||||
|
||||
- **Free GPU Notebooks**: <a href="https://bit.ly/yolov5-paperspace-notebook"><img src="https://assets.paperspace.io/img/gradient-badge.svg" alt="Run on Gradient"></a> <a href="https://colab.research.google.com/github/ultralytics/yolov5/blob/master/tutorial.ipynb"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open In Colab"></a> <a href="https://www.kaggle.com/models/ultralytics/yolov5"><img src="https://kaggle.com/static/images/open-in-kaggle.svg" alt="Open In Kaggle"></a>
|
||||
- **Google Cloud**: [GCP Quickstart Guide](../environments/google_cloud_quickstart_tutorial.md)
|
||||
- **Amazon**: [AWS Quickstart Guide](../environments/aws_quickstart_tutorial.md)
|
||||
- **Azure**: [AzureML Quickstart Guide](../environments/azureml_quickstart_tutorial.md)
|
||||
- **Docker**: [Docker Quickstart Guide](../environments/docker_image_quickstart_tutorial.md) <a href="https://hub.docker.com/r/ultralytics/yolov5"><img src="https://img.shields.io/docker/pulls/ultralytics/yolov5?logo=docker" alt="Docker Pulls"></a>
|
||||
|
||||
## Project Status
|
||||
|
||||
<a href="https://github.com/ultralytics/yolov5/actions/workflows/ci-testing.yml"><img src="https://github.com/ultralytics/yolov5/actions/workflows/ci-testing.yml/badge.svg" alt="YOLOv5 CI"></a>
|
||||
|
||||
This badge indicates that all [YOLOv5 GitHub Actions](https://github.com/ultralytics/yolov5/actions) Continuous Integration (CI) tests are successfully passing. These CI tests rigorously check the functionality and performance of YOLOv5 across various key aspects: [training](https://github.com/ultralytics/yolov5/blob/master/train.py), [validation](https://github.com/ultralytics/yolov5/blob/master/val.py), [inference](https://github.com/ultralytics/yolov5/blob/master/detect.py), [export](https://github.com/ultralytics/yolov5/blob/master/export.py), and [benchmarks](https://github.com/ultralytics/yolov5/blob/master/benchmarks.py). They ensure consistent and reliable operation on macOS, Windows, and Ubuntu, with tests conducted every 24 hours and upon each new commit.
|
||||
175
docs/en/yolov5/tutorials/test_time_augmentation.md
Executable file
175
docs/en/yolov5/tutorials/test_time_augmentation.md
Executable file
@@ -0,0 +1,175 @@
|
||||
---
|
||||
comments: true
|
||||
description: Boost your YOLOv5 performance with Test-Time Augmentation (TTA). Learn setup, testing, and inference techniques to elevate mAP and Recall.
|
||||
keywords: YOLOv5, Test-Time Augmentation, TTA, machine learning, deep learning, object detection, mAP, Recall, PyTorch
|
||||
---
|
||||
|
||||
# Test-Time Augmentation (TTA)
|
||||
|
||||
📚 This guide explains how to use Test Time Augmentation (TTA) during testing and inference for improved mAP and [Recall](https://www.ultralytics.com/glossary/recall) with YOLOv5 🚀.
|
||||
|
||||
## Before You Start
|
||||
|
||||
Clone repo and install [requirements.txt](https://github.com/ultralytics/yolov5/blob/master/requirements.txt) in a [**Python>=3.8.0**](https://www.python.org/) environment, including [**PyTorch>=1.8**](https://pytorch.org/get-started/locally/). [Models](https://github.com/ultralytics/yolov5/tree/master/models) and [datasets](https://github.com/ultralytics/yolov5/tree/master/data) download automatically from the latest YOLOv5 [release](https://github.com/ultralytics/yolov5/releases).
|
||||
|
||||
```bash
|
||||
git clone https://github.com/ultralytics/yolov5 # clone
|
||||
cd yolov5
|
||||
pip install -r requirements.txt # install
|
||||
```
|
||||
|
||||
## Test Normally
|
||||
|
||||
Before trying TTA we want to establish a baseline performance to compare to. This command tests YOLOv5x on COCO val2017 at image size 640 pixels. `yolov5x.pt` is the largest and most accurate model available. Other options are `yolov5s.pt`, `yolov5m.pt` and `yolov5l.pt`, or your own checkpoint from training a custom dataset `./weights/best.pt`. For details on all available models please see our [YOLOv5 documentation](https://docs.ultralytics.com/models/yolov5/).
|
||||
|
||||
```bash
|
||||
python val.py --weights yolov5x.pt --data coco.yaml --img 640 --half
|
||||
```
|
||||
|
||||
Output:
|
||||
|
||||
```text
|
||||
val: data=./data/coco.yaml, weights=['yolov5x.pt'], batch_size=32, imgsz=640, conf_thres=0.001, iou_thres=0.65, task=val, device=, single_cls=False, augment=False, verbose=False, save_txt=False, save_conf=False, save_json=True, project=runs/val, name=exp, exist_ok=False, half=True
|
||||
YOLOv5 🚀 v5.0-267-g6a3ee7c torch 1.9.0+cu102 CUDA:0 (Tesla P100-PCIE-16GB, 16280.875MB)
|
||||
|
||||
Fusing layers...
|
||||
Model Summary: 476 layers, 87730285 parameters, 0 gradients
|
||||
|
||||
val: Scanning '../datasets/coco/val2017' images and labels...4952 found, 48 missing, 0 empty, 0 corrupted: 100% 5000/5000 [00:01<00:00, 2846.03it/s]
|
||||
val: New cache created: ../datasets/coco/val2017.cache
|
||||
Class Images Labels P R mAP@.5 mAP@.5:.95: 100% 157/157 [02:30<00:00, 1.05it/s]
|
||||
all 5000 36335 0.746 0.626 0.68 0.49
|
||||
Speed: 0.1ms pre-process, 22.4ms inference, 1.4ms NMS per image at shape (32, 3, 640, 640) # <--- baseline speed
|
||||
|
||||
Evaluating pycocotools mAP... saving runs/val/exp/yolov5x_predictions.json...
|
||||
...
|
||||
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.504 # <--- baseline mAP
|
||||
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.688
|
||||
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.546
|
||||
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.351
|
||||
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.551
|
||||
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.644
|
||||
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.382
|
||||
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.628
|
||||
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.681 # <--- baseline mAR
|
||||
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.524
|
||||
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.735
|
||||
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.826
|
||||
```
|
||||
|
||||
## Test with TTA
|
||||
|
||||
Append `--augment` to any existing `val.py` command to enable TTA, and increase the image size by about 30% for improved results. Note that inference with TTA enabled will typically take about 2-3X the time of normal inference as the images are being left-right flipped and processed at 3 different resolutions, with the outputs merged before [NMS](https://www.ultralytics.com/glossary/non-maximum-suppression-nms). Part of the speed decrease is simply due to larger image sizes (832 vs 640), while part is due to the actual TTA operations, so ensure your GPU has enough memory headroom before increasing `--img`.
|
||||
|
||||
```bash
|
||||
python val.py --weights yolov5x.pt --data coco.yaml --img 832 --augment --half
|
||||
```
|
||||
|
||||
Output:
|
||||
|
||||
```text
|
||||
val: data=./data/coco.yaml, weights=['yolov5x.pt'], batch_size=32, imgsz=832, conf_thres=0.001, iou_thres=0.6, task=val, device=, single_cls=False, augment=True, verbose=False, save_txt=False, save_conf=False, save_json=True, project=runs/val, name=exp, exist_ok=False, half=True
|
||||
YOLOv5 🚀 v5.0-267-g6a3ee7c torch 1.9.0+cu102 CUDA:0 (Tesla P100-PCIE-16GB, 16280.875MB)
|
||||
|
||||
Fusing layers...
|
||||
/usr/local/lib/python3.7/dist-packages/torch/nn/functional.py:718: UserWarning: Named tensors and all their associated APIs are an experimental feature and subject to change. Please do not use them for anything important until they are released as stable. (Triggered internally at /pytorch/c10/core/TensorImpl.h:1156.)
|
||||
return torch.max_pool2d(input, kernel_size, stride, padding, dilation, ceil_mode)
|
||||
Model Summary: 476 layers, 87730285 parameters, 0 gradients
|
||||
val: Scanning '../datasets/coco/val2017' images and labels...4952 found, 48 missing, 0 empty, 0 corrupted: 100% 5000/5000 [00:01<00:00, 2885.61it/s]
|
||||
val: New cache created: ../datasets/coco/val2017.cache
|
||||
Class Images Labels P R mAP@.5 mAP@.5:.95: 100% 157/157 [07:29<00:00, 2.86s/it]
|
||||
all 5000 36335 0.718 0.656 0.695 0.503
|
||||
Speed: 0.2ms pre-process, 80.6ms inference, 2.7ms NMS per image at shape (32, 3, 832, 832) # <--- TTA speed
|
||||
|
||||
Evaluating pycocotools mAP... saving runs/val/exp2/yolov5x_predictions.json...
|
||||
...
|
||||
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.516 # <--- TTA mAP
|
||||
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.701
|
||||
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.562
|
||||
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.361
|
||||
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.564
|
||||
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.656
|
||||
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.388
|
||||
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.640
|
||||
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.696 # <--- TTA mAR
|
||||
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.553
|
||||
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.744
|
||||
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.833
|
||||
```
|
||||
|
||||
## Inference with TTA
|
||||
|
||||
`detect.py` TTA inference operates identically to `val.py` TTA: simply append `--augment` to any existing `detect.py` command:
|
||||
|
||||
```bash
|
||||
python detect.py --weights yolov5s.pt --img 832 --source data/images --augment
|
||||
```
|
||||
|
||||
Output:
|
||||
|
||||
```text
|
||||
YOLOv5 🚀 v5.0-267-g6a3ee7c torch 1.9.0+cu102 CUDA:0 (Tesla P100-PCIE-16GB, 16280.875MB)
|
||||
|
||||
Downloading https://github.com/ultralytics/yolov5/releases/download/v5.0/yolov5s.pt to yolov5s.pt...
|
||||
100% 14.1M/14.1M [00:00<00:00, 81.9MB/s]
|
||||
|
||||
Fusing layers...
|
||||
Model Summary: 224 layers, 7266973 parameters, 0 gradients
|
||||
image 1/2 /content/yolov5/data/images/bus.jpg: 832x640 4 persons, 1 bus, 1 fire hydrant, Done. (0.029s)
|
||||
image 2/2 /content/yolov5/data/images/zidane.jpg: 480x832 3 persons, 3 ties, Done. (0.024s)
|
||||
Results saved to runs/detect/exp
|
||||
Done. (0.156s)
|
||||
```
|
||||
|
||||
<img src="https://cdn.jsdelivr.net/gh/ultralytics/assets@main/docs/yolov5-test-time-augmentations.avif" width="500" alt="YOLOv5 test time augmentations">
|
||||
|
||||
### PyTorch Hub TTA
|
||||
|
||||
TTA is automatically integrated into all [YOLOv5 PyTorch Hub](https://pytorch.org/hub/ultralytics_yolov5/) models, and can be accessed by passing `augment=True` at inference time.
|
||||
|
||||
```python
|
||||
import torch
|
||||
|
||||
# Model
|
||||
model = torch.hub.load("ultralytics/yolov5", "yolov5s") # or yolov5m, yolov5x, custom
|
||||
|
||||
# Images
|
||||
img = "https://ultralytics.com/images/zidane.jpg" # or file, PIL, OpenCV, numpy, multiple
|
||||
|
||||
# Inference
|
||||
results = model(img, augment=True) # <--- TTA inference
|
||||
|
||||
# Results
|
||||
results.print() # or .show(), .save(), .crop(), .pandas(), etc.
|
||||
```
|
||||
|
||||
### Customize
|
||||
|
||||
You can customize the TTA operations applied in the [YOLOv5 `forward_augment()` method](https://github.com/ultralytics/yolov5/blob/8c6f9e15bfc0000d18b976a95b9d7c17d407ec91/models/yolo.py#L125-L137).
|
||||
|
||||
## Benefits of Test-Time Augmentation
|
||||
|
||||
Test-Time Augmentation offers several key advantages for [object detection](https://www.ultralytics.com/glossary/object-detection) tasks:
|
||||
|
||||
- **Improved Accuracy**: As demonstrated in the results above, TTA increases mAP from 0.504 to 0.516 and mAR from 0.681 to 0.696.
|
||||
- **Better Small Object Detection**: TTA particularly enhances detection of small objects, with small area AP improving from 0.351 to 0.361.
|
||||
- **Increased Robustness**: By testing multiple variations of each image, TTA reduces the impact of viewing angle, lighting, and other environmental factors.
|
||||
- **Simple Implementation**: Requires only adding the `--augment` flag to existing commands.
|
||||
|
||||
The tradeoff is increased inference time, making TTA more suitable for applications where accuracy is prioritized over speed.
|
||||
|
||||
## Supported Environments
|
||||
|
||||
Ultralytics provides a range of ready-to-use environments, each pre-installed with essential dependencies such as [CUDA](https://developer.nvidia.com/cuda), [CUDNN](https://developer.nvidia.com/cudnn), [Python](https://www.python.org/), and [PyTorch](https://pytorch.org/), to kickstart your projects.
|
||||
|
||||
- **Free GPU Notebooks**: <a href="https://bit.ly/yolov5-paperspace-notebook"><img src="https://assets.paperspace.io/img/gradient-badge.svg" alt="Run on Gradient"></a> <a href="https://colab.research.google.com/github/ultralytics/yolov5/blob/master/tutorial.ipynb"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open In Colab"></a> <a href="https://www.kaggle.com/models/ultralytics/yolov5"><img src="https://kaggle.com/static/images/open-in-kaggle.svg" alt="Open In Kaggle"></a>
|
||||
- **Google Cloud**: [GCP Quickstart Guide](../environments/google_cloud_quickstart_tutorial.md)
|
||||
- **Amazon**: [AWS Quickstart Guide](../environments/aws_quickstart_tutorial.md)
|
||||
- **Azure**: [AzureML Quickstart Guide](../environments/azureml_quickstart_tutorial.md)
|
||||
- **Docker**: [Docker Quickstart Guide](../environments/docker_image_quickstart_tutorial.md) <a href="https://hub.docker.com/r/ultralytics/yolov5"><img src="https://img.shields.io/docker/pulls/ultralytics/yolov5?logo=docker" alt="Docker Pulls"></a>
|
||||
|
||||
## Project Status
|
||||
|
||||
<a href="https://github.com/ultralytics/yolov5/actions/workflows/ci-testing.yml"><img src="https://github.com/ultralytics/yolov5/actions/workflows/ci-testing.yml/badge.svg" alt="YOLOv5 CI"></a>
|
||||
|
||||
This badge indicates that all [YOLOv5 GitHub Actions](https://github.com/ultralytics/yolov5/actions) Continuous Integration (CI) tests are successfully passing. These CI tests rigorously check the functionality and performance of YOLOv5 across various key aspects: [training](https://github.com/ultralytics/yolov5/blob/master/train.py), [validation](https://github.com/ultralytics/yolov5/blob/master/val.py), [inference](https://github.com/ultralytics/yolov5/blob/master/detect.py), [export](https://github.com/ultralytics/yolov5/blob/master/export.py), and [benchmarks](https://github.com/ultralytics/yolov5/blob/master/benchmarks.py). They ensure consistent and reliable operation on macOS, Windows, and Ubuntu, with tests conducted every 24 hours and upon each new commit.
|
||||
96
docs/en/yolov5/tutorials/tips_for_best_training_results.md
Executable file
96
docs/en/yolov5/tutorials/tips_for_best_training_results.md
Executable file
@@ -0,0 +1,96 @@
|
||||
---
|
||||
comments: true
|
||||
description: Discover how to achieve optimal mAP and training results using YOLOv5. Learn essential dataset, model selection, and training settings best practices.
|
||||
keywords: YOLOv5 training, mAP, dataset best practices, model selection, training settings, YOLOv5 guide, YOLOv5 tutorial, machine learning
|
||||
---
|
||||
|
||||
# Tips for Best YOLOv5 Training Results
|
||||
|
||||
📚 This guide explains how to produce the best mAP and training results with YOLOv5 🚀.
|
||||
|
||||
Most of the time good results can be obtained with no changes to the models or training settings, **provided your dataset is sufficiently large and well labeled**. If at first you don't get good results, there are steps you might be able to take to improve, but we always recommend users **first train with all default settings** before considering any changes. This helps establish a performance baseline and spot areas for improvement.
|
||||
|
||||
If you have questions about your training results **we recommend you provide the maximum amount of information possible** if you expect a helpful response, including results plots (train losses, val losses, P, R, mAP), PR curve, [confusion matrix](https://www.ultralytics.com/glossary/confusion-matrix), training mosaics, test results and dataset statistics images such as labels.png. All of these are located in your `project/name` directory, typically `yolov5/runs/train/exp`.
|
||||
|
||||
We've put together a full guide for users looking to get the best results on their YOLOv5 trainings below.
|
||||
|
||||
## Dataset
|
||||
|
||||
- **Images per class.** ≥ 1500 images per class recommended
|
||||
- **Instances per class.** ≥ 10000 instances (labeled objects) per class recommended
|
||||
- **Image variety.** Must be representative of deployed environment. For real-world use cases we recommend images from different times of day, different seasons, different weather, different lighting, different angles, different sources (scraped online, collected locally, different cameras) etc.
|
||||
- **Label consistency.** All instances of all classes in all images must be labeled. Partial labeling will not work.
|
||||
- **Label [accuracy](https://www.ultralytics.com/glossary/accuracy).** Labels must closely enclose each object. No space should exist between an object and its [bounding box](https://www.ultralytics.com/glossary/bounding-box). No objects should be missing a label.
|
||||
- **Train/val split discipline.** Ensure that validation and test images never appear in the training set to avoid overly optimistic metrics. Keep class distributions similar between the splits.
|
||||
- **Label verification.** View `train_batch*.jpg` on train start to verify your labels appear correct, i.e. see [example](./train_custom_data.md#local-logging) mosaic.
|
||||
- **Background images.** Background images are images with no objects that are added to a dataset to reduce False Positives (FP). We recommend about 0-10% background images to help reduce FPs (COCO has 1000 background images for reference, 1% of the total). No labels are required for background images.
|
||||
|
||||
<a href="https://arxiv.org/abs/1405.0312"><img width="800" src="https://cdn.jsdelivr.net/gh/ultralytics/assets@main/docs/coco-analysis.avif" alt="COCO dataset class distribution analysis"></a>
|
||||
|
||||
## Model Selection
|
||||
|
||||
Larger models like YOLOv5x and [YOLOv5x6](https://github.com/ultralytics/yolov5/releases/tag/v5.0) will produce better results in nearly all cases, but have more parameters, require more CUDA memory to train, and are slower to run. For **mobile** deployments we recommend YOLOv5s/m, for **cloud** deployments we recommend YOLOv5l/x. See our README [table](https://github.com/ultralytics/yolov5#pretrained-checkpoints) for a full comparison of all models.
|
||||
|
||||
<p align="center"><img width="700" alt="YOLOv5 Models" src="https://cdn.jsdelivr.net/gh/ultralytics/assets@main/docs/yolov5-model-comparison.avif"></p>
|
||||
|
||||
- **Start from Pretrained weights.** Recommended for small to medium-sized datasets (i.e. [VOC](https://github.com/ultralytics/yolov5/blob/master/data/VOC.yaml), [VisDrone](https://github.com/ultralytics/yolov5/blob/master/data/VisDrone.yaml), [GlobalWheat](https://github.com/ultralytics/yolov5/blob/master/data/GlobalWheat2020.yaml)). Pass the name of the model to the `--weights` argument. Models download automatically from the [latest YOLOv5 release](https://github.com/ultralytics/yolov5/releases).
|
||||
|
||||
```bash
|
||||
python train.py --data custom.yaml --weights yolov5s.pt
|
||||
python train.py --data custom.yaml --weights yolov5m.pt
|
||||
python train.py --data custom.yaml --weights yolov5l.pt
|
||||
python train.py --data custom.yaml --weights yolov5x.pt
|
||||
python train.py --data custom.yaml --weights custom_pretrained.pt
|
||||
```
|
||||
|
||||
- **Start from Scratch.** Recommended for large datasets (i.e. [COCO](https://github.com/ultralytics/yolov5/blob/master/data/coco.yaml), [Objects365](https://github.com/ultralytics/yolov5/blob/master/data/Objects365.yaml), [OIv6](https://storage.googleapis.com/openimages/web/index.html)). Pass the model architecture YAML you are interested in, along with an empty `--weights ''` argument:
|
||||
|
||||
```bash
|
||||
python train.py --data custom.yaml --weights '' --cfg yolov5s.yaml
|
||||
python train.py --data custom.yaml --weights '' --cfg yolov5m.yaml
|
||||
python train.py --data custom.yaml --weights '' --cfg yolov5l.yaml
|
||||
python train.py --data custom.yaml --weights '' --cfg yolov5x.yaml
|
||||
```
|
||||
|
||||
## Training Settings
|
||||
|
||||
Before modifying anything, **first train with default settings to establish a performance baseline**. A full list of train.py settings can be found in the [train.py](https://github.com/ultralytics/yolov5/blob/master/train.py) argparser.
|
||||
|
||||
- **[Epochs](https://www.ultralytics.com/glossary/epoch).** Start with 300 epochs. If this overfits early then you can reduce epochs. If [overfitting](https://www.ultralytics.com/glossary/overfitting) does not occur after 300 epochs, train longer, i.e. 600, 1200 etc. epochs.
|
||||
- **Image size.** COCO trains at native resolution of `--img 640`, though due to the high amount of small objects in the dataset it can benefit from training at higher resolutions such as `--img 1280`. If there are many small objects then custom datasets will benefit from training at native or higher resolution. Best inference results are obtained at the same `--img` as the training was run at, i.e. if you train at `--img 1280` you should also test and detect at `--img 1280`.
|
||||
- **[Batch size](https://www.ultralytics.com/glossary/batch-size).** Use the largest `--batch-size` that your hardware allows for. Small batch sizes produce poor [batch normalization](https://www.ultralytics.com/glossary/batch-normalization) statistics and should be avoided. You can use `--batch-size -1` to automatically select the optimal batch size for your GPU.
|
||||
- **[Learning rate](https://www.ultralytics.com/glossary/learning-rate).** The default learning rate schedule works well in most cases. For faster convergence, you can try using the `--cos-lr` flag to enable cosine learning rate scheduling, which gradually reduces the learning rate following a cosine curve over epochs.
|
||||
- **[Data augmentation](https://www.ultralytics.com/glossary/data-augmentation).** YOLOv5 includes various augmentation techniques like mosaic, which combines multiple training images. For the last few epochs, consider using `--close-mosaic 10` to disable mosaic augmentation, which can help stabilize training.
|
||||
- **Hyperparameters.** Default hyperparameters are in [hyp.scratch-low.yaml](https://github.com/ultralytics/yolov5/blob/master/data/hyps/hyp.scratch-low.yaml). We recommend you train with default hyperparameters first before thinking of modifying any. In general, increasing augmentation hyperparameters will reduce and delay overfitting, allowing for longer trainings and higher final mAP. Reduction in loss component gain hyperparameters like `hyp['obj']` will help reduce overfitting in those specific loss components. For an automated method of optimizing these hyperparameters, see our [Hyperparameter Evolution Tutorial](./hyperparameter_evolution.md).
|
||||
- **[Mixed precision](https://www.ultralytics.com/glossary/mixed-precision) training.** Enable mixed precision training with `--amp` to speed up training and reduce memory usage without sacrificing model accuracy.
|
||||
- **Multi-GPU training.** If you have multiple GPUs, use `--device 0,1,2,3` to distribute training across them, which can significantly reduce training time.
|
||||
- **Early stopping.** Use `--patience 50` to stop training if validation metrics don't improve for 50 epochs, saving time and preventing overfitting.
|
||||
|
||||
## Advanced Optimization Techniques
|
||||
|
||||
- **[Transfer learning](https://www.ultralytics.com/glossary/transfer-learning).** For specialized datasets, start with pretrained weights and gradually unfreeze layers during training to adapt the model to your specific task.
|
||||
- **[Model pruning](https://www.ultralytics.com/glossary/model-pruning).** After training, consider pruning your model to remove redundant weights and reduce model size without significant performance loss.
|
||||
- **[Model ensemble](https://www.ultralytics.com/glossary/model-ensemble).** For critical applications, train multiple models with different configurations and combine their predictions for improved accuracy.
|
||||
- **[Test-time augmentation](https://docs.ultralytics.com/yolov5/tutorials/test_time_augmentation/).** Enable TTA during inference with `--augment` to improve prediction accuracy by averaging results from augmented versions of the input image.
|
||||
|
||||
## Further Reading
|
||||
|
||||
If you'd like to know more, a good place to start is Karpathy's 'Recipe for Training [Neural Networks](https://www.ultralytics.com/glossary/neural-network-nn)', which has great ideas for training that apply broadly across all ML domains: [https://karpathy.github.io/2019/04/25/recipe/](https://karpathy.github.io/2019/04/25/recipe/)
|
||||
|
||||
For more detailed information on training settings and configurations, refer to the [Ultralytics train settings documentation](https://docs.ultralytics.com/modes/train/), which provides comprehensive explanations of all available parameters.
|
||||
|
||||
Good luck 🍀 and let us know if you have any other questions!
|
||||
|
||||
## FAQ
|
||||
|
||||
### How do I know if my model is overfitting?
|
||||
|
||||
Your model may be overfitting if the training loss continues to decrease while validation loss starts to increase. Monitor the validation mAP - if it plateaus or decreases while training loss keeps improving, that's a sign of overfitting. Solutions include adding more training data, increasing data augmentation, or implementing regularization techniques.
|
||||
|
||||
### What's the optimal batch size for training YOLOv5?
|
||||
|
||||
The optimal batch size depends on your GPU memory. Larger batch sizes generally provide better batch normalization statistics and training stability. Use the largest batch size your hardware can handle without running out of memory. You can use `--batch-size -1` to automatically determine the optimal batch size for your setup.
|
||||
|
||||
### How can I speed up YOLOv5 training?
|
||||
|
||||
To speed up training, try: enabling mixed precision training with `--amp`, using multiple GPUs with `--device 0,1,2,3`, caching your dataset with `--cache`, and optimizing your batch size. Also consider using a smaller model variant like YOLOv5s if absolute accuracy isn't critical.
|
||||
310
docs/en/yolov5/tutorials/train_custom_data.md
Executable file
310
docs/en/yolov5/tutorials/train_custom_data.md
Executable file
@@ -0,0 +1,310 @@
|
||||
---
|
||||
comments: true
|
||||
description: Learn how to train YOLOv5 on your own custom datasets with easy-to-follow steps. Detailed guide on dataset preparation, model selection, and training process.
|
||||
keywords: YOLOv5, custom dataset, model training, object detection, machine learning, AI, YOLO model, PyTorch, dataset preparation, Ultralytics
|
||||
---
|
||||
|
||||
# Train YOLOv5 on Custom Data
|
||||
|
||||
📚 This guide explains how to train your own **custom dataset** using the [YOLOv5](https://github.com/ultralytics/yolov5) model 🚀. Training custom models is a fundamental step in tailoring [computer vision](https://www.ultralytics.com/glossary/computer-vision-cv) solutions to specific real-world applications beyond generic [object detection](https://docs.ultralytics.com/tasks/detect/).
|
||||
|
||||
## Before You Start
|
||||
|
||||
First, ensure you have the necessary environment set up. Clone the YOLOv5 repository and install the required dependencies from `requirements.txt`. A [**Python>=3.8.0**](https://www.python.org/) environment with [**PyTorch>=1.8**](https://pytorch.org/get-started/locally/) is essential. Models and datasets are automatically downloaded from the latest YOLOv5 [release](https://github.com/ultralytics/yolov5/releases) if they are not found locally.
|
||||
|
||||
```bash
|
||||
git clone https://github.com/ultralytics/yolov5 # Clone the repository
|
||||
cd yolov5
|
||||
pip install -r requirements.txt # Install dependencies
|
||||
```
|
||||
|
||||
## Train On Custom Data
|
||||
|
||||
<a href="https://platform.ultralytics.com" target="_blank">
|
||||
<img width="100%" src="https://cdn.jsdelivr.net/gh/ultralytics/assets@main/docs/ultralytics-active-learning-loop.avif" alt="Ultralytics active learning loop diagram"></a>
|
||||
<br>
|
||||
<br>
|
||||
|
||||
Developing a custom [object detection](https://docs.ultralytics.com/tasks/detect/) model is an iterative process:
|
||||
|
||||
1. **Collect & Organize Images**: Gather images relevant to your specific task. High-quality, diverse data is crucial. See our guide on [Data Collection and Annotation](https://docs.ultralytics.com/guides/data-collection-and-annotation/).
|
||||
2. **Label Objects**: Annotate the objects of interest within your images accurately.
|
||||
3. **Train a Model**: Use the labeled data to [train](https://docs.ultralytics.com/modes/train/) your YOLOv5 model. Leverage [transfer learning](https://www.ultralytics.com/glossary/transfer-learning) by starting with pretrained weights.
|
||||
4. **Deploy & Predict**: Utilize the trained model for [inference](https://docs.ultralytics.com/modes/predict/) on new, unseen data.
|
||||
5. **Collect Edge Cases**: Identify scenarios where the model performs poorly ([edge cases](https://en.wikipedia.org/wiki/Edge_case)) and add similar data to your dataset to improve robustness. Repeat the cycle.
|
||||
|
||||
[Ultralytics Platform](https://docs.ultralytics.com/platform/) offers a streamlined, no-code solution for this entire [machine learning operations (MLOps)](https://www.ultralytics.com/glossary/machine-learning-operations-mlops) cycle, including dataset management, model training, and deployment.
|
||||
|
||||
!!! question "Licensing"
|
||||
|
||||
Ultralytics provides two licensing options to accommodate diverse usage scenarios:
|
||||
|
||||
- **AGPL-3.0 License**: This [OSI-approved](https://opensource.org/license/agpl-v3) open-source license is ideal for students, researchers, and enthusiasts passionate about open collaboration and knowledge sharing. It requires derived works to be shared under the same license. See the [LICENSE](https://github.com/ultralytics/ultralytics/blob/main/LICENSE) file for full details.
|
||||
- **Enterprise License**: Designed for commercial applications, this license permits the seamless integration of Ultralytics software and AI models into commercial products and services without the open-source stipulations of AGPL-3.0. If your project requires commercial deployment, request an [Enterprise License](https://www.ultralytics.com/license).
|
||||
|
||||
Explore our licensing options further on the [Ultralytics Licensing](https://www.ultralytics.com/license) page.
|
||||
|
||||
Before initiating the training, dataset preparation is essential.
|
||||
|
||||
## 1. Create a Dataset
|
||||
|
||||
YOLOv5 models require labeled data to learn the visual characteristics of object classes. Organizing your dataset correctly is key.
|
||||
|
||||
### 1.1 Create `dataset.yaml`
|
||||
|
||||
The dataset configuration file (e.g., `coco128.yaml`) outlines the dataset's structure, class names, and paths to image directories. [COCO128](https://docs.ultralytics.com/datasets/detect/coco128/) serves as a small example dataset, comprising the first 128 images from the extensive [COCO](https://docs.ultralytics.com/datasets/detect/coco/) dataset. It's useful for quickly testing the training pipeline and diagnosing potential issues like [overfitting](https://www.ultralytics.com/glossary/overfitting).
|
||||
|
||||
The `dataset.yaml` file structure includes:
|
||||
|
||||
- `path`: The root directory containing the dataset.
|
||||
- `train`, `val`, `test`: Relative paths from `path` to directories containing images or text files listing image paths for training, validation, and testing sets.
|
||||
- `names`: A dictionary mapping class indices (starting from 0) to their corresponding class names.
|
||||
|
||||
You can set `path` to either an absolute directory (e.g., `/home/user/datasets/coco128`) or a relative path such as `../datasets/coco128` when launching training from the YOLOv5 repository root.
|
||||
|
||||
Below is the structure for `coco128.yaml` ([view on GitHub](https://github.com/ultralytics/yolov5/blob/master/data/coco128.yaml)):
|
||||
|
||||
```yaml
|
||||
# Dataset root directory relative to the yolov5 directory
|
||||
path: coco128
|
||||
|
||||
# Train/val/test sets: specify directories, *.txt files, or lists
|
||||
train: images/train2017 # 128 images for training
|
||||
val: images/train2017 # 128 images for validation
|
||||
test: # Optional path to test images
|
||||
|
||||
# Classes (example using 80 COCO classes)
|
||||
names:
|
||||
0: person
|
||||
1: bicycle
|
||||
2: car
|
||||
# ... (remaining COCO classes)
|
||||
77: teddy bear
|
||||
78: hair drier
|
||||
79: toothbrush
|
||||
```
|
||||
|
||||
### 1.2 Leverage Models for Automated Labeling
|
||||
|
||||
While manual labeling using tools is a common approach, the process can be time-consuming. Recent advancements in foundation models offer possibilities for automating or semi-automating the annotation process, potentially speeding up dataset creation significantly. Here are a few examples of models that can assist with generating labels:
|
||||
|
||||
- **[Google Gemini](https://colab.research.google.com/github/ultralytics/notebooks/blob/main/notebooks/how-to-use-google-gemini-models-for-object-detection-image-captioning-and-ocr.ipynb)**: Large multimodal models like Gemini possess powerful image understanding capabilities. They can be prompted to identify and locate objects within images, generating bounding boxes or descriptions that can be converted into YOLO format labels. Explore its potential in the provided tutorial notebook.
|
||||
- **[SAM2 (Segment Anything Model 2)](https://docs.ultralytics.com/models/sam-2/)**: Foundation models focused on segmentation, like SAM2, can identify and delineate objects with high precision. While primarily for segmentation, the resulting masks can often be converted into bounding box annotations suitable for object detection tasks.
|
||||
- **[YOLOWorld](https://docs.ultralytics.com/models/yolo-world/)**: This model offers open-vocabulary detection capabilities. You can provide text descriptions of the objects you're interested in, and YOLOWorld can locate them in images _without_ prior training on those specific classes. This can be used as a starting point for generating initial labels, which can then be refined.
|
||||
|
||||
Using these models can provide a "pre-labeling" step, reducing the manual effort required. However, it's crucial to review and refine automatically generated labels to ensure accuracy and consistency, as the quality directly impacts the performance of your trained YOLOv5 model. After generating (and potentially refining) your labels, ensure they adhere to the **YOLO format**: one `*.txt` file per image, with each line representing an object as `class_index x_center y_center width height` (normalized coordinates, zero-indexed class). If an image has no objects of interest, no corresponding `*.txt` file is needed.
|
||||
|
||||
The YOLO format `*.txt` file specifications are precise:
|
||||
|
||||
- One row per object [bounding box](https://www.ultralytics.com/glossary/bounding-box).
|
||||
- Each row must contain: `class_index x_center y_center width height`.
|
||||
- Coordinates must be **normalized** to a range between 0 and 1. To achieve this, divide the pixel values of `x_center` and `width` by the image's total width, and divide `y_center` and `height` by the image's total height.
|
||||
- Class indices are zero-indexed (i.e., the first class is represented by `0`, the second by `1`, and so forth).
|
||||
|
||||
<p align="center"><img width="750" src="https://cdn.jsdelivr.net/gh/ultralytics/assets@main/docs/two-persons-tie.avif" alt="Example image with two persons and a tie annotated"></p>
|
||||
|
||||
The label file corresponding to the image above, containing two 'person' objects (class index `0`) and one 'tie' object (class index `27`), would look like this:
|
||||
|
||||
<p align="center"><img width="428" src="https://cdn.jsdelivr.net/gh/ultralytics/assets@main/docs/two-persons-tie-1.avif" alt="YOLO format label file content example"></p>
|
||||
|
||||
### 1.3 Organize Directories
|
||||
|
||||
Structure your [datasets](https://docs.ultralytics.com/datasets/) directory as illustrated below. By default, YOLOv5 anticipates the dataset directory (e.g., `/coco128`) to reside within a `/datasets` folder located **adjacent to** the `/yolov5` repository directory.
|
||||
|
||||
YOLOv5 automatically locates the labels for each image by substituting the last instance of `/images/` in the image path with `/labels/`. For example:
|
||||
|
||||
```bash
|
||||
../datasets/coco128/images/im0.jpg # Path to the image file
|
||||
../datasets/coco128/labels/im0.txt # Path to the corresponding label file
|
||||
```
|
||||
|
||||
The recommended directory structure is:
|
||||
|
||||
```
|
||||
/datasets/
|
||||
└── coco128/ # Dataset root
|
||||
├── images/
|
||||
│ ├── train2017/ # Training images
|
||||
│ │ ├── 000000000009.jpg
|
||||
│ │ └── ...
|
||||
│ └── val2017/ # Validation images (optional if using same set for train/val)
|
||||
│ └── ...
|
||||
└── labels/
|
||||
├── train2017/ # Training labels
|
||||
│ ├── 000000000009.txt
|
||||
│ └── ...
|
||||
└── val2017/ # Validation labels (optional if using same set for train/val)
|
||||
└── ...
|
||||
```
|
||||
|
||||
<p align="center"><img width="700" src="https://cdn.jsdelivr.net/gh/ultralytics/assets@main/docs/yolov5-dataset-structure.avif" alt="YOLOv5 recommended dataset directory structure"></p>
|
||||
|
||||
## 2. Select a Model
|
||||
|
||||
Choose a [pretrained model](https://docs.ultralytics.com/models/) to initiate the training process. Starting with pretrained weights significantly accelerates learning and improves performance compared to training from scratch. YOLOv5 offers various model sizes, each balancing speed and accuracy differently. For example, [YOLOv5s](https://github.com/ultralytics/yolov5/blob/master/models/yolov5s.yaml) is the second-smallest and fastest model, suitable for resource-constrained environments. Consult the [README table](https://github.com/ultralytics/yolov5#pretrained-checkpoints) for a detailed comparison of all available [models](https://docs.ultralytics.com/models/).
|
||||
|
||||
<p align="center"><img width="800" alt="Comparison chart of YOLOv5 models showing size, speed, and accuracy" src="https://cdn.jsdelivr.net/gh/ultralytics/assets@main/docs/yolov5-model-comparison.avif"></p>
|
||||
|
||||
## 3. Train
|
||||
|
||||
Begin the [model training](https://docs.ultralytics.com/modes/train/) using the `train.py` script. Essential arguments include:
|
||||
|
||||
- `--img`: Defines the input [image size](https://docs.ultralytics.com/usage/cfg/#image-size) (e.g., `--img 640`). Larger sizes generally yield better accuracy but require more GPU memory.
|
||||
- `--batch`: Determines the [batch size](https://www.ultralytics.com/glossary/batch-size) (e.g., `--batch 16`). Choose the largest size your GPU can handle.
|
||||
- `--epochs`: Specifies the total number of training [epochs](https://www.ultralytics.com/glossary/epoch) (e.g., `--epochs 100`). One epoch represents a full pass over the entire training dataset.
|
||||
- `--data`: Path to your `dataset.yaml` file (e.g., `--data coco128.yaml`).
|
||||
- `--weights`: Path to the initial weights file. Using pretrained weights (e.g., `--weights yolov5s.pt`) is highly recommended for faster convergence and superior results. To train from scratch (not advised unless you have a very large dataset and specific needs), use `--weights '' --cfg yolov5s.yaml`.
|
||||
|
||||
Pretrained weights are automatically downloaded from the [latest YOLOv5 release](https://github.com/ultralytics/yolov5/releases) if not found locally.
|
||||
|
||||
```bash
|
||||
# Example: Train YOLOv5s on the COCO128 dataset for 3 epochs
|
||||
python train.py --img 640 --batch 16 --epochs 3 --data coco128.yaml --weights yolov5s.pt
|
||||
```
|
||||
|
||||
!!! tip "Optimize Training Speed"
|
||||
|
||||
💡 Employ `--cache ram` or `--cache disk` to cache dataset images in [RAM](https://en.wikipedia.org/wiki/Random-access_memory) or local disk, respectively. This dramatically accelerates training, particularly when dataset I/O (Input/Output) operations are a bottleneck. Note that this requires substantial RAM or disk space.
|
||||
|
||||
!!! tip "Local Data Storage"
|
||||
|
||||
💡 Always train using datasets stored locally. Accessing data from network drives (like Google Drive) or remote storage can be significantly slower and impede training performance. Copying your dataset to a local SSD is often the best practice.
|
||||
|
||||
All training outputs, including weights and logs, are saved in the `runs/train/` directory. Each training session creates a new subdirectory (e.g., `runs/train/exp`, `runs/train/exp2`, etc.). For an interactive, hands-on experience, explore the training section in our official tutorial notebooks: <a href="https://colab.research.google.com/github/ultralytics/yolov5/blob/master/tutorial.ipynb"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open In Colab"></a> <a href="https://www.kaggle.com/models/ultralytics/yolov5"><img src="https://kaggle.com/static/images/open-in-kaggle.svg" alt="Open In Kaggle"></a>
|
||||
|
||||
## 4. Visualize
|
||||
|
||||
YOLOv5 seamlessly integrates with various tools for visualizing training progress, evaluating results, and monitoring performance in real-time.
|
||||
|
||||
### Comet Logging and Visualization 🌟 NEW
|
||||
|
||||
[Comet](https://docs.ultralytics.com/integrations/comet/) is fully integrated for comprehensive experiment tracking. Visualize metrics live, save hyperparameters, manage datasets and model checkpoints, and analyze model predictions using interactive [Comet Custom Panels](https://bit.ly/yolov5-colab-comet-panels).
|
||||
|
||||
Getting started is straightforward:
|
||||
|
||||
```bash
|
||||
pip install comet_ml # 1. Install Comet library
|
||||
export COMET_API_KEY=YOUR_API_KEY_HERE # 2. Set your Comet API key (create a free account at Comet.ml)
|
||||
python train.py --img 640 --epochs 3 --data coco128.yaml --weights yolov5s.pt # 3. Train your model - Comet automatically logs everything!
|
||||
```
|
||||
|
||||
Dive deeper into the supported features in our [Comet Integration Guide](https://docs.ultralytics.com/integrations/comet/). Learn more about Comet's capabilities from their official [documentation](https://bit.ly/yolov5-colab-comet-docs). Try the Comet Colab Notebook for a live demo: [](https://colab.research.google.com/drive/1RG0WOQyxlDlo5Km8GogJpIEJlg_5lyYO?usp=sharing)
|
||||
|
||||
<img width="1920" alt="Comet UI showing YOLOv5 training metrics and visualizations" src="https://cdn.jsdelivr.net/gh/ultralytics/assets@main/docs/yolo-ui.avif">
|
||||
|
||||
### ClearML Logging and Automation 🌟 NEW
|
||||
|
||||
[ClearML](https://docs.ultralytics.com/integrations/clearml/) integration enables detailed experiment tracking, dataset version management, and even remote execution of training runs. Activate ClearML with these simple steps:
|
||||
|
||||
- Install the package: `pip install clearml`
|
||||
- Initialize ClearML: Run `clearml-init` once to connect to your ClearML server (either self-hosted or the [free tier](https://clear.ml/)).
|
||||
|
||||
ClearML automatically captures experiment details, model uploads, comparisons, uncommitted code changes, and installed packages, ensuring full reproducibility. You can easily schedule training tasks on remote agents and manage dataset versions using ClearML Data. Explore the [ClearML Integration Guide](https://docs.ultralytics.com/integrations/clearml/) for comprehensive details.
|
||||
|
||||
<a href="https://clear.ml/">
|
||||
<img alt="ClearML experiment management UI for YOLOv5" src="https://cdn.jsdelivr.net/gh/ultralytics/assets@main/docs/clearml-experiment-management-ui.avif" width="1280"></a>
|
||||
|
||||
### Local Logging
|
||||
|
||||
Training results are automatically logged using [TensorBoard](https://docs.ultralytics.com/integrations/tensorboard/) and saved as [CSV](https://en.wikipedia.org/wiki/Comma-separated_values) files within the specific experiment directory (e.g., `runs/train/exp`). Logged data includes:
|
||||
|
||||
- Training and validation loss and performance metrics.
|
||||
- Sample images showing applied augmentations (like mosaics).
|
||||
- Ground truth labels alongside model predictions for visual inspection.
|
||||
- Key evaluation metrics such as [Precision](https://www.ultralytics.com/glossary/precision)-[Recall](https://www.ultralytics.com/glossary/recall) (PR) curves.
|
||||
- [Confusion matrices](https://www.ultralytics.com/glossary/confusion-matrix) for detailed class-wise performance analysis.
|
||||
|
||||
<img alt="YOLOv5 local logging results with charts and mosaics" src="https://cdn.jsdelivr.net/gh/ultralytics/assets@main/docs/local-logging-results.avif" width="1280">
|
||||
|
||||
The `results.csv` file is updated after every epoch and is plotted as `results.png` once training concludes. You can also plot any `results.csv` file manually using the provided utility function:
|
||||
|
||||
```python
|
||||
from utils.plots import plot_results
|
||||
|
||||
# Plot results from a specific training run directory
|
||||
plot_results("runs/train/exp/results.csv") # This will generate 'results.png' in the same directory
|
||||
```
|
||||
|
||||
<p align="center"><img width="800" alt="YOLOv5 results.png training metrics plot" src="https://cdn.jsdelivr.net/gh/ultralytics/assets@main/docs/yolov5-training-results-plot.avif"></p>
|
||||
|
||||
## 5. Next Steps
|
||||
|
||||
Upon successful completion of training, the best performing model checkpoint (`best.pt`) is saved and ready for deployment or further refinement. Potential next steps include:
|
||||
|
||||
- Run [inference](https://docs.ultralytics.com/modes/predict/) on new images or videos using the trained model via the [CLI](https://github.com/ultralytics/yolov5#quick-start-examples) or [Python](./pytorch_hub_model_loading.md).
|
||||
- Perform [validation](https://docs.ultralytics.com/modes/val/) to evaluate the model's [accuracy](https://www.ultralytics.com/glossary/accuracy) and generalization capabilities on different data splits (e.g., a held-out test set).
|
||||
- [Export](https://docs.ultralytics.com/modes/export/) the model to various deployment formats like [ONNX](https://docs.ultralytics.com/integrations/onnx/), [TensorFlow SavedModel](https://docs.ultralytics.com/integrations/tf-savedmodel/), or [TensorRT](https://docs.ultralytics.com/integrations/tensorrt/) for optimized inference on diverse platforms.
|
||||
- Employ [hyperparameter tuning](https://docs.ultralytics.com/guides/hyperparameter-tuning/) techniques to potentially squeeze out additional performance gains.
|
||||
- Continue improving your model by following our [Tips for Best Training Results](https://docs.ultralytics.com/guides/model-training-tips/) and iteratively adding more diverse and challenging data based on performance analysis.
|
||||
|
||||
## Supported Environments
|
||||
|
||||
Ultralytics provides ready-to-use environments equipped with essential dependencies like [CUDA](https://developer.nvidia.com/cuda), [cuDNN](https://developer.nvidia.com/cudnn), [Python](https://www.python.org/), and [PyTorch](https://pytorch.org/), facilitating a smooth start.
|
||||
|
||||
- **Free GPU Notebooks**:
|
||||
- <a href="https://bit.ly/yolov5-paperspace-notebook"><img src="https://assets.paperspace.io/img/gradient-badge.svg" alt="Run on Gradient"></a>
|
||||
- <a href="https://colab.research.google.com/github/ultralytics/yolov5/blob/master/tutorial.ipynb"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open In Colab"></a>
|
||||
- <a href="https://www.kaggle.com/models/ultralytics/yolov5"><img src="https://kaggle.com/static/images/open-in-kaggle.svg" alt="Open In Kaggle"></a>
|
||||
- **Cloud Platforms**:
|
||||
- **Google Cloud**: [GCP Quickstart Guide](https://docs.ultralytics.com/integrations/google-colab/)
|
||||
- **Amazon AWS**: [AWS Quickstart Guide](https://docs.ultralytics.com/integrations/amazon-sagemaker/)
|
||||
- **Microsoft Azure**: [AzureML Quickstart Guide](https://docs.ultralytics.com/guides/azureml-quickstart/)
|
||||
- **Local Setup**:
|
||||
- **Docker**: [Docker Quickstart Guide](https://docs.ultralytics.com/guides/docker-quickstart/) <a href="https://hub.docker.com/r/ultralytics/yolov5"><img src="https://img.shields.io/docker/pulls/ultralytics/yolov5?logo=docker" alt="Docker Pulls"></a>
|
||||
|
||||
## Project Status
|
||||
|
||||
<a href="https://github.com/ultralytics/yolov5/actions/workflows/ci-testing.yml"><img src="https://github.com/ultralytics/yolov5/actions/workflows/ci-testing.yml/badge.svg" alt="YOLOv5 Continuous Integration Status Badge"></a>
|
||||
|
||||
This badge indicates that all YOLOv5 [GitHub Actions](https://github.com/ultralytics/yolov5/actions) [Continuous Integration (CI)](https://www.ultralytics.com/glossary/continuous-integration-ci) tests are passing successfully. These rigorous CI tests cover the core functionalities, including [training](https://docs.ultralytics.com/modes/train/), [validation](https://docs.ultralytics.com/modes/val/), [inference](https://docs.ultralytics.com/modes/predict/), [export](https://docs.ultralytics.com/modes/export/), and [benchmarks](https://docs.ultralytics.com/modes/benchmark/), across macOS, Windows, and Ubuntu operating systems. Tests are executed automatically every 24 hours and upon each code commit, ensuring consistent stability and optimal performance.
|
||||
|
||||
## FAQ
|
||||
|
||||
### How do I train YOLOv5 on my custom dataset?
|
||||
|
||||
Training YOLOv5 on a custom dataset involves several key steps:
|
||||
|
||||
1. **Prepare Your Dataset**: Collect images and annotate them. Ensure annotations are in the required [YOLO format](https://docs.ultralytics.com/datasets/detect/). Organize images and labels into `train/` and `val/` (and optionally `test/`) directories. Consider using models like [Google Gemini](https://colab.research.google.com/github/ultralytics/notebooks/blob/main/notebooks/how-to-use-google-gemini-models-for-object-detection-image-captioning-and-ocr.ipynb), [SAM2](https://docs.ultralytics.com/models/sam-2/), or [YOLOWorld](https://docs.ultralytics.com/models/yolo-world/) to assist with or automate the labeling process (see Section 1.2).
|
||||
2. **Set Up Your Environment**: Clone the YOLOv5 repository and install dependencies using `pip install -r requirements.txt`.
|
||||
```bash
|
||||
git clone https://github.com/ultralytics/yolov5
|
||||
cd yolov5
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
3. **Create Dataset Configuration**: Define dataset paths, number of classes, and class names in a `dataset.yaml` file.
|
||||
4. **Start Training**: Execute the `train.py` script, providing paths to your `dataset.yaml`, desired pretrained weights (e.g., `yolov5s.pt`), image size, batch size, and the number of epochs.
|
||||
```bash
|
||||
python train.py --img 640 --batch 16 --epochs 100 --data path/to/your/dataset.yaml --weights yolov5s.pt
|
||||
```
|
||||
|
||||
### Why should I use Ultralytics Platform for training my YOLO models?
|
||||
|
||||
[Ultralytics Platform](https://docs.ultralytics.com/platform/) is a comprehensive platform designed to streamline the entire YOLO model development lifecycle, often without needing to write any code. Key benefits include:
|
||||
|
||||
- **Simplified Training**: Easily train models using pre-configured environments and an intuitive user interface.
|
||||
- **Integrated Data Management**: Upload, version control, and manage your datasets efficiently within the platform.
|
||||
- **Real-time Monitoring**: Track training progress and visualize performance metrics using integrated tools like [Comet](https://docs.ultralytics.com/integrations/comet/) or TensorBoard.
|
||||
- **Collaboration Features**: Facilitates teamwork through shared resources, project management tools, and easy model sharing.
|
||||
- **No-Code Deployment**: Deploy trained models directly to various targets.
|
||||
|
||||
For a practical walkthrough, check out our blog post: [How to Train Your Custom Models with Ultralytics Platform](https://www.ultralytics.com/blog/how-to-train-your-custom-models-with-ultralytics-hub).
|
||||
|
||||
### How do I convert my annotated data to the YOLOv5 format?
|
||||
|
||||
Whether you annotate manually or use automated tools (like those mentioned in Section 1.2), the final labels must be in the specific **YOLO format** required by YOLOv5:
|
||||
|
||||
- Create one `.txt` file for each image. The filename should match the image filename (e.g., `image1.jpg` corresponds to `image1.txt`). Place these files in a `labels/` directory parallel to your `images/` directory (e.g., `../datasets/mydataset/labels/train/`).
|
||||
- Each line within a `.txt` file represents one object annotation and follows the format: `class_index center_x center_y width height`.
|
||||
- Coordinates (`center_x`, `center_y`, `width`, `height`) must be **normalized** (values between 0.0 and 1.0) relative to the image's dimensions.
|
||||
- Class indices are **zero-based** (the first class is `0`, the second is `1`, etc.).
|
||||
|
||||
Many manual annotation tools offer direct export to YOLO format. If using automated models, you will need scripts or processes to convert their output (e.g., bounding box coordinates, segmentation masks) into this specific normalized text format. Ensure your final dataset structure adheres to the example provided in the guide. For more details, see our [Data Collection and Annotation Guide](https://docs.ultralytics.com/guides/data-collection-and-annotation/).
|
||||
|
||||
### What are the licensing options for using YOLOv5 in commercial applications?
|
||||
|
||||
Ultralytics provides flexible licensing tailored to different needs:
|
||||
|
||||
- **AGPL-3.0 License**: This open-source license is suitable for academic research, personal projects, and situations where open-source compliance is acceptable. It mandates that modifications and derivative works also be open-sourced under AGPL-3.0. Review the [AGPL-3.0 License details](https://www.ultralytics.com/legal/agpl-3-0-software-license).
|
||||
- **Enterprise License**: A commercial license designed for businesses integrating YOLOv5 into proprietary products or services. This license removes the open-source obligations of AGPL-3.0, allowing for closed-source distribution. Visit our [Licensing page](https://www.ultralytics.com/license) for further details or to request an [Enterprise License](https://www.ultralytics.com/legal/enterprise-software-license).
|
||||
|
||||
Select the license that aligns best with your project's requirements and distribution model.
|
||||
167
docs/en/yolov5/tutorials/transfer_learning_with_frozen_layers.md
Executable file
167
docs/en/yolov5/tutorials/transfer_learning_with_frozen_layers.md
Executable file
@@ -0,0 +1,167 @@
|
||||
---
|
||||
comments: true
|
||||
description: Learn to freeze YOLOv5 layers for efficient transfer learning, reducing resources and speeding up training while maintaining accuracy.
|
||||
keywords: YOLOv5, transfer learning, freeze layers, machine learning, deep learning, model training, PyTorch, Ultralytics
|
||||
---
|
||||
|
||||
# Transfer Learning with Frozen Layers in YOLOv5
|
||||
|
||||
📚 This guide explains how to **freeze** [YOLOv5](https://github.com/ultralytics/yolov5) 🚀 layers when implementing [transfer learning](https://www.ultralytics.com/glossary/transfer-learning). Transfer learning is a powerful [machine learning (ML)](https://www.ultralytics.com/glossary/machine-learning-ml) technique that allows you to quickly retrain a model on new data without retraining the entire network from scratch. By freezing the weights of initial layers and only updating the parameters of later layers, you can significantly reduce computational resource requirements and training time. However, this approach might slightly impact the final model [accuracy](https://www.ultralytics.com/glossary/accuracy).
|
||||
|
||||
## Before You Start
|
||||
|
||||
First, clone the YOLOv5 repository and install the necessary dependencies listed in [`requirements.txt`](https://github.com/ultralytics/yolov5/blob/master/requirements.txt). Ensure you have a [**Python>=3.8.0**](https://www.python.org/) environment with [**PyTorch>=1.8**](https://pytorch.org/get-started/locally/) installed. Pretrained [models](https://github.com/ultralytics/yolov5/tree/master/models) and required [datasets](https://github.com/ultralytics/yolov5/tree/master/data) will be downloaded automatically from the latest YOLOv5 [release](https://github.com/ultralytics/yolov5/releases).
|
||||
|
||||
```bash
|
||||
git clone https://github.com/ultralytics/yolov5 # clone repository
|
||||
cd yolov5
|
||||
pip install -r requirements.txt # install dependencies
|
||||
```
|
||||
|
||||
## How Layer Freezing Works
|
||||
|
||||
When you freeze layers in a [neural network](https://www.ultralytics.com/glossary/neural-network-nn), you prevent their parameters (weights and biases) from being updated during the training process. In PyTorch, this is achieved by setting the `requires_grad` attribute of the layer's tensors to `False`. Consequently, gradients are not computed for these layers during [backpropagation](https://www.ultralytics.com/glossary/backpropagation), saving computation and memory.
|
||||
|
||||
Here's how YOLOv5 implements layer freezing in its [training script](https://github.com/ultralytics/yolov5/blob/master/train.py):
|
||||
|
||||
```python
|
||||
# Freeze specified layers
|
||||
freeze = [f"model.{x}." for x in range(freeze)] # Define layers to freeze based on module index
|
||||
for k, v in model.named_parameters():
|
||||
v.requires_grad = True # Ensure all parameters are initially trainable
|
||||
if any(x in k for x in freeze):
|
||||
print(f"Freezing layer: {k}")
|
||||
v.requires_grad = False # Disable gradient calculation for frozen layers
|
||||
```
|
||||
|
||||
## Exploring Model Architecture
|
||||
|
||||
Understanding the structure of the YOLOv5 model is crucial for deciding which layers to freeze. You can inspect the names of all modules and their parameters using the following Python snippet:
|
||||
|
||||
```python
|
||||
# Assuming 'model' is your loaded YOLOv5 model instance
|
||||
for name, param in model.named_parameters():
|
||||
print(name)
|
||||
|
||||
"""
|
||||
Example Output:
|
||||
model.0.conv.conv.weight
|
||||
model.0.conv.bn.weight
|
||||
model.0.conv.bn.bias
|
||||
model.1.conv.weight
|
||||
model.1.bn.weight
|
||||
model.1.bn.bias
|
||||
model.2.cv1.conv.weight
|
||||
model.2.cv1.bn.weight
|
||||
...
|
||||
"""
|
||||
```
|
||||
|
||||
The YOLOv5 architecture typically consists of a [backbone](https://www.ultralytics.com/glossary/backbone) (layers 0-9 in standard configurations like YOLOv5s/m/l/x) responsible for [feature extraction](https://www.ultralytics.com/glossary/feature-extraction), and a head (the remaining layers) which performs [object detection](https://www.ultralytics.com/glossary/object-detection).
|
||||
|
||||
```yaml
|
||||
# Example YOLOv5 v6.0 backbone structure
|
||||
backbone:
|
||||
# [from, number, module, args]
|
||||
- [-1, 1, Conv, [64, 6, 2, 2]] # Layer 0: Initial convolution (P1/2 stride)
|
||||
- [-1, 1, Conv, [128, 3, 2]] # Layer 1: Downsampling convolution (P2/4 stride)
|
||||
- [-1, 3, C3, [128]] # Layer 2: C3 module
|
||||
- [-1, 1, Conv, [256, 3, 2]] # Layer 3: Downsampling convolution (P3/8 stride)
|
||||
- [-1, 6, C3, [256]] # Layer 4: C3 module
|
||||
- [-1, 1, Conv, [512, 3, 2]] # Layer 5: Downsampling convolution (P4/16 stride)
|
||||
- [-1, 9, C3, [512]] # Layer 6: C3 module
|
||||
- [-1, 1, Conv, [1024, 3, 2]]# Layer 7: Downsampling convolution (P5/32 stride)
|
||||
- [-1, 3, C3, [1024]] # Layer 8: C3 module
|
||||
- [-1, 1, SPPF, [1024, 5]] # Layer 9: Spatial Pyramid Pooling Fast
|
||||
|
||||
# Example YOLOv5 v6.0 head structure
|
||||
head:
|
||||
- [-1, 1, Conv, [512, 1, 1]] # Layer 10
|
||||
- [-1, 1, nn.Upsample, [None, 2, "nearest"]] # Layer 11
|
||||
- [[-1, 6], 1, Concat, [1]] # Layer 12: Concatenate with backbone P4 (from layer 6)
|
||||
- [-1, 3, C3, [512, False]] # Layer 13: C3 module
|
||||
# ... subsequent head layers for feature fusion and detection
|
||||
```
|
||||
|
||||
## Freezing Options
|
||||
|
||||
You can control which layers are frozen using the `--freeze` argument in the training command. This argument specifies the index of the first _unfrozen_ module; all modules before this index will have their weights frozen. Use `model.model` (a `nn.Sequential`) to inspect the module ordering if you need to confirm which indices correspond to a particular block.
|
||||
|
||||
### Freeze Backbone Only
|
||||
|
||||
To freeze the entire backbone (layers 0 through 9), which is common when adapting the model to new object classes while retaining general feature extraction capabilities learned from a large dataset like [COCO](https://docs.ultralytics.com/datasets/detect/coco/):
|
||||
|
||||
```bash
|
||||
python train.py --weights yolov5m.pt --data your_dataset.yaml --freeze 10
|
||||
```
|
||||
|
||||
This strategy is effective when your target dataset shares similar low-level visual features (edges, textures) with the original training data (e.g., COCO) but contains different object categories.
|
||||
|
||||
### Freeze All Except Final Detection Layers
|
||||
|
||||
To freeze almost the entire network, leaving only the final output convolution layers (part of the `Detect` module, typically the last module, e.g., module 24 in YOLOv5s) trainable:
|
||||
|
||||
```bash
|
||||
python train.py --weights yolov5m.pt --data your_dataset.yaml --freeze 24
|
||||
```
|
||||
|
||||
This approach is useful when you primarily need to adjust the model for a different number of output classes while keeping the vast majority of learned features intact. It requires the least computational resources for [fine-tuning](https://www.ultralytics.com/glossary/fine-tuning).
|
||||
|
||||
## Performance Comparison
|
||||
|
||||
To illustrate the effects of freezing layers, we trained YOLOv5m on the [Pascal VOC dataset](https://docs.ultralytics.com/datasets/detect/voc/) for 50 [epochs](https://www.ultralytics.com/glossary/epoch), starting from the official COCO pretrained [weights](https://www.ultralytics.com/glossary/model-weights) (`yolov5m.pt`). We compared three scenarios: training all layers (`--freeze 0`), freezing the backbone (`--freeze 10`), and freezing all but the final detection layers (`--freeze 24`).
|
||||
|
||||
```bash
|
||||
# Example command for training with backbone frozen
|
||||
python train.py --batch 48 --weights yolov5m.pt --data voc.yaml --epochs 50 --cache --img 512 --hyp hyp.finetune.yaml --freeze 10
|
||||
```
|
||||
|
||||
### Accuracy Results
|
||||
|
||||
The results show that freezing layers can accelerate training significantly but may lead to a slight reduction in final [mAP (mean Average Precision)](https://www.ultralytics.com/glossary/mean-average-precision-map). Training all layers generally yields the best accuracy, while freezing more layers offers faster training at the cost of potentially lower performance.
|
||||
|
||||

|
||||
_mAP50 comparison during training_
|
||||
|
||||

|
||||
_mAP50-95 comparison during training_
|
||||
|
||||
<img width="922" alt="YOLOv5 frozen layer training performance" src="https://cdn.jsdelivr.net/gh/ultralytics/assets@main/docs/table-results.avif">
|
||||
*Summary table of performance metrics*
|
||||
|
||||
### Resource Utilization
|
||||
|
||||
Freezing more layers substantially reduces [GPU](https://www.ultralytics.com/glossary/gpu-graphics-processing-unit) memory requirements and overall utilization. This makes transfer learning with frozen layers an attractive option when working with limited hardware resources, allowing for training larger models or using larger image sizes than might otherwise be possible.
|
||||
|
||||

|
||||
_GPU Memory Allocated (%)_
|
||||
|
||||

|
||||
_GPU Utilization (%)_
|
||||
|
||||
## When to Use Layer Freezing
|
||||
|
||||
Layer freezing during transfer learning is particularly advantageous in several situations:
|
||||
|
||||
1. **Limited Computational Resources**: If you have constraints on GPU memory or processing power.
|
||||
2. **Small Datasets**: When your target dataset is significantly smaller than the original pre-training dataset, freezing helps prevent [overfitting](https://www.ultralytics.com/glossary/overfitting).
|
||||
3. **Rapid Prototyping**: When you need to quickly adapt an existing model to a new task or domain for initial evaluation.
|
||||
4. **Similar Feature Domains**: If the low-level features in your new dataset are very similar to those in the dataset the model was pretrained on.
|
||||
|
||||
Explore more about the nuances of transfer learning in our [glossary entry](https://www.ultralytics.com/glossary/transfer-learning) and consider techniques like [hyperparameter tuning](https://docs.ultralytics.com/guides/hyperparameter-tuning/) for optimizing performance.
|
||||
|
||||
## Supported Environments
|
||||
|
||||
Ultralytics offers various ready-to-use environments with essential dependencies like [CUDA](https://developer.nvidia.com/cuda), [CuDNN](https://developer.nvidia.com/cudnn), [Python](https://www.python.org/), and [PyTorch](https://pytorch.org/) pre-installed.
|
||||
|
||||
- **Free GPU Notebooks**: <a href="https://bit.ly/yolov5-paperspace-notebook"><img src="https://assets.paperspace.io/img/gradient-badge.svg" alt="Run on Gradient"></a> <a href="https://colab.research.google.com/github/ultralytics/yolov5/blob/master/tutorial.ipynb"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open In Colab"></a> <a href="https://www.kaggle.com/models/ultralytics/yolov5"><img src="https://kaggle.com/static/images/open-in-kaggle.svg" alt="Open In Kaggle"></a>
|
||||
- **Google Cloud**: [GCP Quickstart Guide](../environments/google_cloud_quickstart_tutorial.md)
|
||||
- **Amazon**: [AWS Quickstart Guide](../environments/aws_quickstart_tutorial.md)
|
||||
- **Azure**: [AzureML Quickstart Guide](../environments/azureml_quickstart_tutorial.md)
|
||||
- **Docker**: [Docker Quickstart Guide](../environments/docker_image_quickstart_tutorial.md) <a href="https://hub.docker.com/r/ultralytics/yolov5"><img src="https://img.shields.io/docker/pulls/ultralytics/yolov5?logo=docker" alt="Docker Pulls"></a>
|
||||
|
||||
## Project Status
|
||||
|
||||
<a href="https://github.com/ultralytics/yolov5/actions/workflows/ci-testing.yml"><img src="https://github.com/ultralytics/yolov5/actions/workflows/ci-testing.yml/badge.svg" alt="YOLOv5 Continuous Integration Status"></a>
|
||||
|
||||
This badge confirms that all [YOLOv5 GitHub Actions](https://github.com/ultralytics/yolov5/actions) Continuous Integration (CI) tests are passing successfully. These CI tests rigorously evaluate the functionality and performance of YOLOv5 across key operations: [training](https://github.com/ultralytics/yolov5/blob/master/train.py), [validation](https://github.com/ultralytics/yolov5/blob/master/val.py), [inference](https://github.com/ultralytics/yolov5/blob/master/detect.py), [export](https://github.com/ultralytics/yolov5/blob/master/export.py), and [benchmarks](https://github.com/ultralytics/yolov5/blob/master/benchmarks.py). They ensure consistent and reliable operation on macOS, Windows, and Ubuntu, running automatically every 24 hours and on each new code commit.
|
||||
Reference in New Issue
Block a user