Arquitectura YOLOv5 de Ultralytics
YOLOv5 (v6.0/6.1) es un potente algoritmo de detección de objetos desarrollado por Ultralytics. Este artículo 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 integral ayudará a mejorar su aplicación práctica de la detección de objetos en varios 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: Este es el cuerpo principal de la red. Para YOLOv5, el backbone está diseñado utilizando la
CSPDarknet53
estructura, una modificación de la arquitectura Darknet utilizada en versiones anteriores. - Neck: Esta parte conecta el backbone y el head. En YOLOv5,
SPPF
(Spatial Pyramid Pooling - Fast) yPANet
Se utilizan estructuras (Path Aggregation Network). - Head: Esta parte es responsable de generar la salida final. YOLOv5 utiliza el
YOLOv3 Head
para este propósito.
La estructura del modelo se muestra en la imagen de abajo. Los detalles de la estructura del modelo se pueden encontrar en yolov5l.yaml
.
YOLOv5 introduce algunas mejoras notables en comparación con sus predecesores:
- El
Focus
se reemplaza con un6x6 Conv2d
estructura. Este cambio aumenta la eficiencia #4825. - El
SPP
la estructura se reemplaza conSPPF
. Esta alteración duplica con creces la velocidad de procesamiento manteniendo la misma salida.
Para probar la velocidad de SPP
y SPPF
, se puede utilizar el siguiente código:
Ejemplo de perfilado de velocidad SPP vs SPPF (haga clic para abrir)
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()
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 de mosaico: Una técnica de procesamiento de imágenes que combina cuatro imágenes de entrenamiento en una, de manera que anima a los modelos de detección de objetos a manejar mejor varias escalas y traslaciones de objetos.
-
Aumento de Copiar y Pegar: 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 de manera efectiva una nueva muestra de entrenamiento.
-
Transformaciones Afines Aleatorias: Esto incluye 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 tomando una combinación lineal de dos imágenes y sus etiquetas asociadas.
-
Albumentations: Una potente biblioteca para el aumento de imágenes que admite una amplia variedad de técnicas de aumento. Obtenga más información sobre el uso de 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 aleatoriamente las imágenes horizontalmente.
3. Estrategias de entrenamiento
YOLOv5 aplica varias estrategias de entrenamiento sofisticadas para mejorar el rendimiento del modelo. Estas 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 los cuadros delimitadores (anchor boxes) previos para que coincidan con las características estadísticas de los cuadros delimitadores (ground truth boxes) en tus datos personalizados.
- Warmup y Programador LR Coseno: Un método para ajustar la tasa de aprendizaje para mejorar el rendimiento del modelo.
- Media Móvil Exponencial (EMA): Una estrategia que utiliza el promedio de los parámetros de los pasos anteriores para estabilizar el proceso de entrenamiento y reducir el error de generalización.
- Entrenamiento con 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. Obtenga más información sobre el 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 (Pérdida BCE): Pérdida de Entropía Cruzada Binaria, mide el error de la tarea de clasificación.
- Pérdida de Objetividad (Pérdida BCE): Otra pérdida de Entropía Cruzada Binaria, calcula el error al detectar si un objeto está presente en una celda de la cuadrícula en particular o no.
- Pérdida de Localización (Pérdida CIoU): Pérdida de IoU Completa, mide el error al localizar el objeto dentro de la celda de la cuadrícula.
La función de pérdida general se representa mediante:
4.2 Equilibrar pérdidas
Las pérdidas de objetividad de las tres capas de predicción (P3
, P4
, P5
) se ponderan de forma 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.
4.3 Eliminar la sensibilidad de la cuadrícula
La arquitectura YOLOv5 realiza algunos cambios importantes en la estrategia de predicción de cajas en comparación con las 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.
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 ilimitadas.
Las fórmulas revisadas para calcular el cuadro delimitador predicho son las siguientes:
Compare 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.
Compare la relación de escala de altura y anchura (en relación con el ancla) antes y después del ajuste. Las ecuaciones originales de la caja yolo/darknet tienen un fallo grave. La anchura y la altura no están limitadas en absoluto, ya que son simplemente out=exp(in), lo cual es peligroso, ya que puede provocar gradientes descontrolados, inestabilidades, pérdidas NaN y, en última instancia, una pérdida total del entrenamiento. Consulte este problema para obtener más detalles.
4.4 Objetivos de compilación
El proceso de creación de objetivos en YOLOv5 es fundamental para la eficiencia del entrenamiento y la precisión del modelo. Implica asignar los cuadros de verdad fundamental a las celdas de la cuadrícula apropiadas en el mapa de salida y hacerlos coincidir con los cuadros de anclaje adecuados.
Este proceso sigue estos pasos:
- Calcular la relación entre las dimensiones del cuadro de verdad fundamental y las dimensiones de cada plantilla de anclaje.
- Si la relación calculada está dentro del umbral, hacer coincidir el cuadro de verdad fundamental con el anclaje correspondiente.
- Asignar el anclaje coincidente a las celdas apropiadas, teniendo en cuenta que, debido al punto central revisado, un cuadro de verdad fundamental se puede asignar a más de un anclaje. Debido a que el rango de desplazamiento del punto central se ajusta de (0, 1) a (-0,5, 1,5), el cuadro GT se puede asignar a más anclajes.
De esta manera, el proceso de creación de objetivos garantiza que cada objeto de verdad fundamental se asigne y coincida correctamente durante el proceso de entrenamiento, lo que permite que YOLOv5 aprenda la tarea de detección de objetos de manera más eficaz.
Conclusión
En conclusión, YOLOv5 representa un importante paso adelante en el desarrollo de modelos de detección de objetos en tiempo real. Al incorporar varias características nuevas, mejoras y estrategias de entrenamiento, supera a las versiones anteriores de la familia YOLO en rendimiento y eficiencia.
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 creación de objetivos. Todas estas innovaciones mejoran significativamente la precisión y la eficiencia de la detección de objetos, al tiempo que conservan un alto grado de velocidad, que es el sello distintivo de los modelos YOLO.