Arquitectura de Ultralytics YOLOv5#
YOLOv5 (v6.0/6.1) es un potente algoritmo de detección de objetos desarrollado por Ultralytics. En este artículo se profundiza en la arquitectura de YOLOv5, las estrategias de aumento de datos, las metodologías de entrenamiento y las técnicas de cálculo de pérdidas. Esta comprensión exhaustiva te ayudará a mejorar la aplicación práctica de la detección de objetos en diversos campos, como la vigilancia, los vehículos autónomos y el reconocimiento de imágenes.
1. Estructura del modelo#
La arquitectura de YOLOv5 consta de tres partes principales:
- Backbone: Es el cuerpo principal de la red. En YOLOv5, el backbone está diseñado mediante la estructura
CSPDarknet53, una modificación de la arquitectura Darknet utilizada en versiones anteriores. - Neck: Esta parte conecta el backbone y el head. En YOLOv5 se utilizan las estructuras
SPPF(agrupación piramidal espacial rápida) yPANet(red de agregación de rutas). - Head: Esta parte se encarga de generar la salida final. YOLOv5 utiliza
YOLOv3 Headpara este fin.
La estructura del modelo se muestra en la siguiente imagen. Puedes consultar los detalles de la estructura del modelo en models/yolov5l.yaml.

YOLOv5 introduce varias mejoras destacables con respecto a sus predecesores:
- La estructura
Focus, presente en versiones anteriores, se sustituye por una estructura6x6 Conv2d. Este cambio mejora la eficiencia #4825. - La estructura
SPPse sustituye porSPPF. Esta modificación duplica con creces la velocidad de procesamiento manteniendo la misma salida.
Para probar la velocidad de SPP y SPPF, puedes utilizar el siguiente código:
SPP vs SPPF speed profiling example (click to open)
import time
import torch
from torch import 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()resultado:
True
SPP time: 0.5373051166534424
SPPF time: 0.207807064056396482. Técnicas de aumento de datos#
YOLOv5 emplea diversas técnicas de aumento de datos para mejorar la capacidad de generalización del modelo y reducir el sobreajuste. Estas técnicas incluyen:
-
Aumento Mosaic: Una técnica de procesamiento de imágenes que combina cuatro imágenes de entrenamiento en una, de forma que ayuda a los modelos de detección de objetos a gestionar mejor distintas escalas y traslaciones de objetos.

-
Aumento Copy-Paste: Un innovador método de aumento de datos que copia parches aleatorios de una imagen y los pega sobre otra imagen elegida aleatoriamente, generando de forma eficaz una nueva muestra de entrenamiento.

-
Transformaciones afines aleatorias: Incluyen la rotación, el escalado, la traslación y el cizallamiento aleatorios de las imágenes.

-
Aumento MixUp: Un método que crea imágenes compuestas mediante una combinación lineal de dos imágenes y sus etiquetas asociadas.

-
Albumentations: Una potente biblioteca de aumento de imágenes compatible con una amplia variedad de técnicas de aumento. Obtén más información sobre cómo utilizar los aumentos de Albumentations.
-
Aumento HSV: Cambios aleatorios en el tono, la saturación y el valor de las imágenes.

-
Volteo horizontal aleatorio: Un método de aumento que voltea las imágenes horizontalmente de forma aleatoria.

3. Estrategias de entrenamiento#
YOLOv5 aplica varias estrategias sofisticadas de entrenamiento para mejorar el rendimiento del modelo. Entre ellas se incluyen:
- Entrenamiento multiescala: Las imágenes de entrada se redimensionan aleatoriamente entre 0,5 y 1,5 veces su tamaño original durante el proceso de entrenamiento.
- AutoAnchor: Esta estrategia optimiza las cajas anchor previas para que coincidan con las características estadísticas de las cajas de verdad terreno de tus datos personalizados.
- Programador de LR con calentamiento y coseno: Un método para ajustar la tasa de aprendizaje y mejorar el rendimiento del modelo.
- Media móvil exponencial (EMA): Una estrategia que utiliza la media de los parámetros de los pasos anteriores para estabilizar el proceso de entrenamiento y reducir el error de generalización.
- Entrenamiento de precisión mixta: Un método para realizar operaciones en formato de precisión media, reduciendo el uso de memoria y mejorando la velocidad de cálculo.
- Evolución de hiperparámetros: Una estrategia para ajustar automáticamente los hiperparámetros y lograr un rendimiento óptimo. Obtén más información sobre el ajuste de hiperparámetros.
4. Funciones adicionales#
4.1 Calcular las pérdidas#
La pérdida de YOLOv5 se calcula como una combinación de tres componentes de pérdida individuales:
- Pérdida de clases (pérdida BCE): Pérdida de entropía cruzada binaria que mide el error de la tarea de clasificación.
- Pérdida de objetualidad (pérdida BCE): Otra pérdida de entropía cruzada binaria que calcula el error al detectar si hay un objeto presente o no en una celda concreta de la cuadrícula.
- Pérdida de localización (pérdida CIoU): Pérdida de IoU completa que mide el error al localizar el objeto dentro de la celda de la cuadrícula.
La función de pérdida global se representa mediante:
4.2 Equilibrar las pérdidas#
Las pérdidas de objetualidad de las tres capas de predicción (P3, P4, P5) tienen pesos diferentes. Los pesos de equilibrio son [4.0, 1.0, 0.4], respectivamente. Este enfoque garantiza que las predicciones a distintas escalas contribuyan adecuadamente a la pérdida total.
4.3 Eliminar la sensibilidad a la cuadrícula#
La arquitectura de YOLOv5 introduce algunos cambios importantes en la estrategia de predicción de cajas con respecto a las versiones anteriores de YOLO. En YOLOv2 y YOLOv3, las coordenadas de las cajas se predecían directamente mediante la activación de la última capa.
Sin embargo, en YOLOv5, la fórmula para predecir las coordenadas de la caja se ha actualizado para reducir la sensibilidad a la cuadrícula y evitar que el modelo prediga dimensiones de caja sin límites.
Las fórmulas revisadas para calcular la caja delimitadora predicha son las siguientes:
Compara el desplazamiento del punto central antes y después del escalado. El intervalo de desplazamiento del punto central se ajusta de (0, 1) a (-0,5, 1,5). Por tanto, el desplazamiento puede ser fácilmente 0 o 1.
Compara la proporción de escalado de la altura y la anchura (con respecto al anchor) antes y después del ajuste. Las ecuaciones originales de cajas de yolo/darknet presentan un defecto grave. La anchura y la altura no están limitadas en absoluto, ya que simplemente se calculan como out=exp(in), lo cual es peligroso porque puede provocar gradientes descontrolados, inestabilidades, pérdidas NaN y, en última instancia, la pérdida completa del entrenamiento. Consulta este problema para obtener más información.
4.4 Crear objetivos#
El proceso de creación de objetivos en YOLOv5 es fundamental para la eficiencia del entrenamiento y la precisión del modelo. Consiste en asignar las cajas de verdad terreno a las celdas de cuadrícula adecuadas del mapa de salida y emparejarlas con las cajas anchor correspondientes.
Este proceso sigue estos pasos:
- Calcula la proporción entre las dimensiones de la caja de verdad terreno y las dimensiones de cada plantilla de anchor.
- Si la proporción calculada está dentro del umbral, empareja la caja de verdad terreno con el anchor correspondiente.
- Asigna el anchor emparejado a las celdas adecuadas, teniendo en cuenta que, debido al desplazamiento revisado del punto central, una caja de verdad terreno puede asignarse a más de un anchor, ya que el intervalo de desplazamiento del punto central se ajusta de (0, 1) a (-0,5, 1,5), lo que permite emparejamientos adicionales.
De este modo, el proceso de creación de objetivos garantiza que cada objeto de verdad terreno se asigne y empareje correctamente durante el entrenamiento, lo que permite a YOLOv5 aprender la tarea de detección de objetos con mayor eficacia.
Conclusión#
YOLOv5 representa un avance significativo en la evolución de la detección de objetos en tiempo real. Sus decisiones arquitectónicas, estrategias de entrenamiento y mejoras de ingeniería proporcionan un sólido rendimiento y eficiencia en comparación con versiones anteriores de YOLO.
Las principales mejoras de YOLOv5 incluyen el uso de una arquitectura dinámica, una amplia variedad de técnicas de aumento de datos, estrategias innovadoras de entrenamiento, así como ajustes importantes en el cálculo de pérdidas y en el proceso de creación de objetivos. Todas estas innovaciones mejoran significativamente la precisión y la eficiencia de la detección de objetos, manteniendo al mismo tiempo un alto nivel de velocidad, que es el rasgo distintivo de los modelos YOLO.