Arquitetura do Ultralytics YOLOv5

O YOLOv5 (v6.0/6.1) é um algoritmo de detecção de objetos poderoso desenvolvido pela Ultralytics. Este artigo aprofunda-se na arquitetura do YOLOv5, estratégias de data augmentation, metodologias de treinamento e técnicas de cálculo de perda. Esta compreensão abrangente ajudará a melhorar a sua aplicação prática de detecção de objetos em vários campos, incluindo vigilância, veículos autônomos e reconhecimento de imagem.

1. Estrutura do Modelo

A arquitetura do YOLOv5 consiste em três partes principais:

  • Backbone: Este é o corpo principal da rede. Para o YOLOv5, o backbone é projetado usando a estrutura CSPDarknet53, uma modificação da arquitetura Darknet usada em versões anteriores.
  • Neck: Esta parte conecta o backbone e o head. No YOLOv5, são utilizadas as estruturas SPPF (Spatial Pyramid Pooling - Fast) e PANet (Path Aggregation Network).
  • Head: Esta parte é responsável por gerar a saída final. O YOLOv5 usa o YOLOv3 Head para este propósito.

A estrutura do modelo está representada na imagem abaixo. Os detalhes da estrutura do modelo podem ser encontrados em models/yolov5l.yaml.

Arquitetura do YOLOv5 mostrando backbone, neck e head

O YOLOv5 introduz algumas melhorias notáveis em comparação com os seus antecessores:

  1. A estrutura Focus, encontrada em versões anteriores, é substituída por uma estrutura 6x6 Conv2d. Esta alteração aumenta a eficiência #4825.
  2. A estrutura SPP é substituída por SPPF. Esta alteração mais do que duplica a velocidade de processamento enquanto mantém a mesma saída.

Para testar a velocidade de SPP e SPPF, o seguinte código pode ser usado:

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 Data Augmentation

O YOLOv5 emprega várias técnicas de data augmentation para melhorar a capacidade de generalização do modelo e reduzir o overfitting. Estas técnicas incluem:

  • Mosaic Augmentation: Uma técnica de processamento de imagem que combina quatro imagens de treinamento em uma só, de maneiras que encorajam os modelos de object detection a lidar melhor com várias escalas e translações de objetos.

    Data augmentation Mosaic do YOLOv5 combinando quatro imagens

  • Copy-Paste Augmentation: Um método inovador de data augmentation que copia patches aleatórios de uma imagem e cola-os noutra imagem escolhida aleatoriamente, gerando efetivamente uma nova amostra de treinamento.

    Data augmentation Copy-Paste do YOLOv5 para segmentação de instâncias

  • Random Affine Transformations: Isto inclui rotação aleatória, escala, translação e cisalhamento das imagens.

    Random Affine Transformations do YOLOv5 para treinamento

  • MixUp Augmentation: Um método que cria imagens compostas ao tomar uma combinação linear de duas imagens e os seus rótulos associados.

    Data augmentation MixUp do YOLOv5 misturando duas imagens

  • Albumentations: Uma poderosa biblioteca de aumento de imagem que suporta uma grande variedade de técnicas de aumento. Saiba mais sobre como usar os augmentations do Albumentations.

  • HSV Augmentation: Alterações aleatórias na Matiz (Hue), Saturação (Saturation) e Valor (Value) das imagens.

    Exemplos de augmentation no espaço de cor HSV do YOLOv5

  • Random Horizontal Flip: Um método de augmentation que inverte imagens horizontalmente de forma aleatória.

    Data augmentation de inversão horizontal aleatória do YOLOv5

3. Estratégias de Treinamento

O YOLOv5 aplica várias estratégias de treinamento sofisticadas para melhorar o desempenho do modelo. Elas incluem:

  • Multiscale Training: As imagens de entrada são redimensionadas aleatoriamente dentro de uma faixa de 0,5 a 1,5 vezes o seu tamanho original durante o processo de treinamento.
  • AutoAnchor: Esta estratégia otimiza as anchor boxes prévias para corresponder às características estatísticas das ground truth boxes nos seus dados personalizados.
  • Warmup e Cosine LR Scheduler: Um método para ajustar a learning rate para melhorar o desempenho do modelo.
  • Exponential Moving Average (EMA): Uma estratégia que usa a média dos parâmetros ao longo de passos anteriores para estabilizar o processo de treinamento e reduzir o erro de generalização.
  • Treinamento com Mixed Precision: Um método para realizar operações em formato de meia-precision, reduzindo o uso de memória e aumentando a velocidade computacional.
  • Evolução de Hiperparâmetros: Uma estratégia para ajustar automaticamente os hiperparâmetros para alcançar um desempenho ideal. Saiba mais sobre ajuste de hiperparâmetros.

4. Recursos Adicionais

4.1 Calcular Perdas

A perda no YOLOv5 é calculada como uma combinação de três componentes de perda individuais:

  • Classes Loss (BCE Loss): Perda de Binary Cross-Entropy, mede o erro para a tarefa de classificação.
  • Objectness Loss (BCE Loss): Outra perda de Binary Cross-Entropy, calcula o erro na detecção se um objeto está presente numa célula de grade específica ou não.
  • Location Loss (CIoU Loss): Perda de CIoU completa, mede o erro na localização do objeto dentro da célula da grade.

A loss function geral é representada por:

Fórmula da função de perda total do YOLOv5

4.2 Balancear Perdas

As perdas de objectness das três camadas de predição (P3, P4, P5) são ponderadas de forma diferente. Os pesos de equilíbrio são [4.0, 1.0, 0.4] respectivamente. Esta abordagem garante que as predições em diferentes escalas contribuam adequadamente para a perda total.

Fórmula de equilíbrio de perda de objectness do YOLOv5

4.3 Eliminar Sensibilidade da Grade

A arquitetura do YOLOv5 faz algumas mudanças importantes na estratégia de predição de caixas em comparação com as versões anteriores do YOLO. No YOLOv2 e YOLOv3, as coordenadas da caixa eram previstas diretamente usando a ativação da última camada.

Fórmula de predição da coordenada-x da bounding box Fórmula de predição da coordenada-y da bounding box Fórmula de predição da largura da bounding box Fórmula de predição da altura da bounding box

YOLOv5 grid computation

No entanto, no YOLOv5, a fórmula para prever as coordenadas da caixa foi atualizada para reduzir a sensibilidade da grade e impedir que o modelo preveja dimensões de caixa ilimitadas.

As fórmulas revisadas para calcular a bounding box prevista são as seguintes:

Fórmula revisada da coordenada-x da bounding box do YOLOv5 Fórmula revisada da coordenada-y da bounding box do YOLOv5 Fórmula revisada da largura da bounding box do YOLOv5 Fórmula revisada da altura da bounding box do YOLOv5

Compare o deslocamento do ponto central antes e depois do escalonamento. O intervalo de deslocamento do ponto central é ajustado de (0, 1) para (-0,5, 1,5). Portanto, o deslocamento pode facilmente obter 0 ou 1.

YOLOv5 grid scaling

Compare a proporção de escala de altura e largura (em relação à âncora) antes e depois do ajuste. As equações originais de caixa do yolo/darknet têm uma falha séria. Largura e Altura são completamente ilimitadas, pois são simplesmente out=exp(in), o que é perigoso, pois pode levar a gradientes descontrolados, instabilidades, perdas NaN e, em última análise, uma perda total de treinamento. Consulte este problema para mais detalhes.

YOLOv5 unbounded scaling

4.4 Build Targets

O processo de build targets no YOLOv5 é fundamental para a eficiência do treinamento e a accuracy do modelo. Envolve atribuir ground truth boxes às células de grade apropriadas no mapa de saída e combiná-las com as anchor boxes apropriadas.

Este processo segue estes passos:

  • Calcule a proporção das dimensões da ground truth box e as dimensões de cada modelo de âncora.

Fórmula da proporção da largura da ground truth para a âncora

Fórmula da proporção da altura da ground truth para a âncora

Fórmula da proporção máxima de largura

Fórmula da proporção máxima de altura

Fórmula da proporção máxima geral

Fórmula do limiar de correspondência da âncora

YOLOv5 IoU computation
  • Se a proporção calculada estiver dentro do limite, combine a ground truth box com a âncora correspondente.
YOLOv5 grid overlap
  • Atribua a âncora combinada às células apropriadas, tendo em mente que, devido ao deslocamento revisado do ponto central, uma ground truth box pode ser atribuída a mais de uma âncora porque o intervalo de deslocamento do ponto central é ajustado de (0, 1) para (-0,5, 1,5), tornando possíveis correspondências adicionais.
YOLOv5 anchor selection

Desta forma, o processo de build targets garante que cada objeto de ground truth seja adequadamente atribuído e combinado durante o processo de treinamento, permitindo que o YOLOv5 aprenda a tarefa de detecção de objetos de forma mais eficaz.

Conclusão

O YOLOv5 representa um passo significativo na evolução da detecção de objetos em tempo real. As suas escolhas arquitetônicas, estratégias de treinamento e refinamentos de engenharia proporcionam um forte desempenho e eficiência em relação às versões anteriores do YOLO.

Os principais aprimoramentos no YOLOv5 incluem o uso de uma arquitetura dinâmica, uma vasta gama de técnicas de data augmentation, estratégias de treinamento inovadoras, bem como ajustes importantes no cálculo de perdas e no processo de build targets. Todas estas inovações melhoram significativamente a precisão e a eficiência da detecção de objetos, mantendo um alto grau de velocidade, que é a marca registrada dos modelos YOLO.

Comentários