Arquitectura de Ultralytics YOLOv5

YOLOv5 (v6.0/6.1) es un potente algoritmo de detección de objetos desarrollado por Ultralytics. Este artículo analiza en profundidad 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. Este conocimiento integral te ayudará a mejorar tu aplicación práctica de la detección de objetos en diversos campos, incluyendo 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. Para YOLOv5, el backbone está diseñado utilizando la estructura CSPDarknet53, una modificación de la arquitectura Darknet utilizada en versiones anteriores.
  • Neck: Esta parte conecta el backbone y la head. En YOLOv5, se utilizan las estructuras SPPF (Spatial Pyramid Pooling - Fast) y PANet (Path Aggregation Network).
  • Head: Esta parte es responsable de generar la salida final. YOLOv5 utiliza la YOLOv3 Head para este propósito.

La estructura del modelo se muestra en la imagen siguiente. Los detalles de la estructura del modelo se pueden encontrar en models/yolov5l.yaml.

Arquitectura de YOLOv5 mostrando el backbone, el neck y la head

YOLOv5 introduce algunas mejoras notables en comparación con sus predecesores:

  1. La estructura Focus, presente en versiones anteriores, se reemplaza por una estructura 6x6 Conv2d. Este cambio aumenta la eficiencia #4825.
  2. La estructura SPP se reemplaza por SPPF. Esta alteración más que duplica la velocidad de procesamiento mientras mantiene la misma salida.

Para probar la velocidad de SPP y SPPF, se puede utilizar el siguiente código:

SPP vs SPPF speed profiling example (click to open)
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()

resultado:

True
SPP time: 0.5373051166534424
SPPF time: 0.20780706405639648

2. Técnicas de aumento de datos

YOLOv5 emplea varias técnicas de aumento de datos para mejorar la capacidad del modelo para generalizar 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 formas que alientan a los modelos de detección de objetos a manejar mejor diversas escalas y traslaciones de objetos.

    Aumento de datos mosaic de YOLOv5 combinando cuatro imágenes

  • Aumento Copy-Paste: Un método innovador de aumento de datos que copia parches aleatorios de una imagen y los pega en otra imagen elegida al azar, generando eficazmente una nueva muestra de entrenamiento.

    Aumento copy-paste de YOLOv5 para segmentación de instancias

  • Transformaciones afines aleatorias: Esto incluye rotación, escalado, traslación y cizallamiento aleatorios de las imágenes.

    Transformaciones afines aleatorias de YOLOv5 para entrenamiento

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

    Aumento de datos MixUp de YOLOv5 combinando dos imágenes

  • Albumentations: Una potente biblioteca de aumento de imágenes que admite una amplia variedad de técnicas de aumento. Aprende más sobre cómo usar aumentos de Albumentations.

  • Aumento HSV: Cambios aleatorios en el matiz (Hue), la saturación (Saturation) y el valor (Value) de las imágenes.

    Ejemplos de aumento del espacio de color HSV de YOLOv5

  • Volteo horizontal aleatorio: Un método de aumento que voltea aleatoriamente las imágenes de forma horizontal.

    Aumento de volteo horizontal aleatorio de YOLOv5

3. Estrategias de entrenamiento

YOLOv5 aplica varias estrategias de entrenamiento sofisticadas para mejorar el rendimiento del modelo. Incluyen:

  • Entrenamiento multiescala: Las imágenes de entrada se reescalan aleatoriamente dentro de un rango de 0,5 a 1,5 veces su tamaño original durante el proceso de entrenamiento.
  • AutoAnchor: Esta estrategia optimiza las cajas de anclaje (anchor boxes) previas para que coincidan con las características estadísticas de las cajas de verdad (ground truth) en tus datos personalizados.
  • Warmup y programador de LR de coseno: Un método para ajustar la tasa de aprendizaje para mejorar el rendimiento del modelo.
  • Promedio móvil exponencial (EMA): Una estrategia que utiliza el promedio de los parámetros en 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 media precisión, reduciendo el uso de memoria y mejorando la velocidad computacional.
  • Evolución de hiperparámetros: Una estrategia para ajustar automáticamente los hiperparámetros para lograr un rendimiento óptimo. Aprende más sobre ajuste de hiperparámetros.

4. Características adicionales

4.1 Calcular pérdidas

La pérdida en YOLOv5 se calcula como una combinación de tres componentes de pérdida individuales:

  • Pérdida de clases (BCE Loss): Pérdida de entropía cruzada binaria, mide el error para la tarea de clasificación.
  • Pérdida de objetividad (BCE Loss): Otra pérdida de entropía cruzada binaria, calcula el error al detectar si un objeto está presente o no en una celda de cuadrícula particular.
  • Pérdida de ubicación (CIoU Loss): Pérdida completa de IoU, mide el error en la localización del objeto dentro de la celda de la cuadrícula.

La función de pérdida general se representa mediante:

Fórmula de la función de pérdida total de YOLOv5

4.2 Equilibrar pérdidas

Las pérdidas de objetividad de las tres capas de predicción (P3, P4, P5) se ponderan de manera diferente. Los pesos de equilibrio son [4.0, 1.0, 0.4] respectivamente. Este enfoque garantiza que las predicciones a diferentes escalas contribuyan adecuadamente a la pérdida total.

Fórmula de equilibrio de pérdida de objetividad de YOLOv5

4.3 Eliminar la sensibilidad de la cuadrícula

La arquitectura de YOLOv5 realiza algunos cambios importantes en la estrategia de predicción de cajas en comparación con versiones anteriores de YOLO. En YOLOv2 y YOLOv3, las coordenadas de la caja se predecían directamente utilizando la activación de la última capa.

Fórmula de predicción de la coordenada x de la caja delimitadora Fórmula de predicción de la coordenada y de la caja delimitadora Fórmula de predicción de la anchura de la caja delimitadora Fórmula de predicción de la altura de la caja delimitadora

YOLOv5 grid computation

Sin embargo, en YOLOv5, la fórmula para predecir las coordenadas de la caja se ha actualizado para reducir la sensibilidad de 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:

Fórmula revisada de la coordenada x de la caja delimitadora de YOLOv5 Fórmula revisada de la coordenada y de la caja delimitadora de YOLOv5 Fórmula revisada de la anchura de la caja delimitadora de YOLOv5 Fórmula revisada de la altura de la caja delimitadora de YOLOv5

Compara el desplazamiento del punto central antes y después del escalado. El rango de desplazamiento del punto central se ajusta de (0, 1) a (-0,5, 1,5). Por lo tanto, el desplazamiento puede obtener fácilmente 0 o 1.

YOLOv5 grid scaling

Compara la relación de escalado de altura y anchura (relativa al ancla) antes y después del ajuste. Las ecuaciones de caja originales de yolo/darknet tienen un fallo grave. La anchura y la altura no tienen límites, ya que son simplemente out=exp(in), lo cual es peligroso, ya que puede llevar a gradientes descontrolados, inestabilidades, pérdidas NaN y, en última instancia, a una pérdida completa del entrenamiento. Consulta este problema para más detalles.

YOLOv5 unbounded scaling

4.4 Construir objetivos

El proceso de construcción de objetivos en YOLOv5 es fundamental para la eficiencia del entrenamiento y la precisión del modelo. Implica asignar cajas de verdad (ground truth) a las celdas de la cuadrícula apropiadas en el mapa de salida y hacerlas coincidir con las cajas de anclaje adecuadas.

Este proceso sigue estos pasos:

  • Calcula la proporción de las dimensiones de la caja de verdad y las dimensiones de cada plantilla de ancla.

Fórmula de la relación entre la anchura de la verdad y el ancla

Fórmula de la relación entre la altura de la verdad y el ancla

Fórmula de la relación máxima de anchura

Fórmula de la relación máxima de altura

Fórmula de la relación máxima general

Fórmula del umbral de coincidencia del ancla

YOLOv5 IoU computation
  • Si la proporción calculada está dentro del umbral, haz coincidir la caja de verdad con el ancla correspondiente.
YOLOv5 grid overlap
  • Asigna el ancla coincidente a las celdas apropiadas, teniendo en cuenta que debido al desplazamiento del punto central revisado, una caja de verdad puede asignarse a más de un ancla porque el rango de desplazamiento del punto central se ajusta de (0, 1) a (-0,5, 1,5), haciendo posibles coincidencias adicionales.
YOLOv5 anchor selection

De esta manera, el proceso de construcción de objetivos asegura que cada objeto de verdad se asigne y coincida correctamente durante el proceso de entrenamiento, permitiendo que YOLOv5 aprenda la tarea de detección de objetos de manera más efectiva.

Conclusión

YOLOv5 representa un paso significativo en la evolución de la detección de objetos en tiempo real. Sus elecciones arquitectónicas, estrategias de entrenamiento y refinamientos de ingeniería ofrecen un rendimiento y una eficiencia sólidos en comparación con las versiones anteriores de YOLO.

Las principales mejoras en YOLOv5 incluyen el uso de una arquitectura dinámica, una amplia gama de técnicas de aumento de datos, estrategias de entrenamiento innovadoras, así como ajustes importantes en el cálculo de pérdidas y el proceso de construcció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 grado de velocidad, que es el sello distintivo de los modelos YOLO.

Comentarios