Ultralytics YOLO27:
Get Started

Arquitetura Ultralytics YOLOv5#

YOLOv5 (v6.0/6.1) é um poderoso algoritmo de deteção de objetos desenvolvido pela Ultralytics. Este artigo analisa em profundidade a arquitetura YOLOv5, as estratégias de aumento de dados, as metodologias de treino e as técnicas de cálculo da perda. Esta compreensão abrangente vai ajudar-te a melhorar a aplicação prática da deteção de objetos em vários domínios, incluindo vigilância, veículos autónomos e reconhecimento de imagens.

1. Estrutura do modelo#

A arquitetura YOLOv5 é composta por três partes principais:

  • Backbone: é o corpo principal da rede. No YOLOv5, o backbone é concebido com a estrutura CSPDarknet53, uma modificação da arquitetura Darknet usada em versões anteriores.
  • Neck: esta parte liga o backbone à cabeça. No YOLOv5, são utilizadas as estruturas SPPF (Spatial Pyramid Pooling - Fast) e PANet (Path Aggregation Network).
  • Cabeça: esta parte é responsável por gerar a saída final. Para esse fim, o YOLOv5 usa YOLOv3 Head.

A estrutura do modelo é apresentada na imagem abaixo. Os detalhes da estrutura do modelo encontram-se em models/yolov5l.yaml.

Arquitetura YOLOv5 com o backbone, o neck e a cabeça

O YOLOv5 introduz algumas melhorias notáveis em relação às versões anteriores:

  1. A estrutura Focus, presente 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, mantendo a mesma saída.

Para testar a velocidade de SPP e SPPF, podes usar o seguinte código:

Exemplo de análise de desempenho da velocidade de SPP vs SPPF (clique para abrir)
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.20780706405639648

2. Técnicas de aumento de dados#

O YOLOv5 usa várias técnicas de aumento de dados para melhorar a capacidade de generalização do modelo e reduzir o sobreajuste. Estas técnicas incluem:

  • Aumento Mosaic: uma técnica de processamento de imagens que combina quatro imagens de treino numa só, de forma a ajudar os modelos de deteção de objetos a lidar melhor com várias escalas e translações de objetos.

    Aumento de dados Mosaic do YOLOv5 que combina quatro imagens

  • Aumento Copy-Paste: um método inovador de aumento de dados que copia recortes aleatórios de uma imagem e cola-os noutra imagem escolhida aleatoriamente, gerando efetivamente uma nova amostra de treino.

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

  • Transformações afins aleatórias: incluem rotação, escala, translação e cisalhamento aleatórios das imagens.

    Transformações afins aleatórias do YOLOv5 para o treino

  • Aumento MixUp: método que cria imagens compostas através de uma combinação linear de duas imagens e das respetivas etiquetas.

    Aumento de dados MixUp do YOLOv5 que combina duas imagens

  • Albumentations: uma poderosa biblioteca de aumento de imagens que suporta uma grande variedade de técnicas de aumento. Aprende mais sobre como usar os aumentos do Albumentations.

  • Aumento HSV: alterações aleatórias à tonalidade, à saturação e ao valor das imagens.

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

  • Inversão horizontal aleatória: método de aumento que inverte aleatoriamente as imagens na horizontal.

    Aumento de inversão horizontal aleatória do YOLOv5

3. Estratégias de treino#

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

  • Treino multiescala: durante o processo de treino, as imagens de entrada são redimensionadas aleatoriamente para um tamanho entre 0,5 e 1,5 vezes o tamanho original.
  • AutoAnchor: Esta estratégia otimiza as caixas de âncora anteriores para corresponder às características estatísticas das caixas de referência nos teus dados personalizados.
  • Agendador de aquecimento e taxa de aprendizado cosseno: Um método para ajustar a taxa de aprendizado e melhorar o desempenho do modelo.
  • Média móvel exponencial (EMA): Uma estratégia que usa a média dos parâmetros das etapas anteriores para estabilizar o processo de treinamento e reduzir o erro de generalização.
  • Treinamento com precisão mista: Um método para executar operações no formato de meia-precisão, 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 e alcançar o desempenho ideal. Consulta o tutorial de Evolução de hiperparâmetros.

4. Recursos adicionais#

4.1 Calcular as perdas#

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

  • Perda de classes (perda BCE): perda de entropia cruzada binária, que mede o erro da tarefa de classificação.
  • Perda de objetividade (perda BCE): outra perda de entropia cruzada binária, que calcula o erro ao detectar se há ou não um objeto em determinada célula da grade.
  • Perda de localização (perda CIoU): perda de IoU completa, que mede o erro ao localizar o objeto dentro da célula da grade.

A função de perda geral é representada por:

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

4.2 Balancear as perdas#

As perdas de objetividade das três camadas de predição (P3, P4, P5) recebem pesos diferentes. Os pesos de balanceamento são, respectivamente, [4.0, 1.0, 0.4]. Essa abordagem garante que as predições em diferentes escalas contribuam de forma adequada para a perda total.

Fórmula de balanceamento da perda de objetividade do YOLOv5

4.3 Eliminar a sensibilidade à grade#

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

Fórmula de predição da coordenada x da caixa delimitadora Fórmula de predição da coordenada y da caixa delimitadora Fórmula de predição da largura da caixa delimitadora Fórmula de predição da altura da caixa delimitadora

YOLOv5 grid computation

No entanto, no YOLOv5, a fórmula para predizer as coordenadas das caixas foi atualizada para reduzir a sensibilidade à grade e impedir que o modelo prediga dimensões de caixa sem limites.

As fórmulas revisadas para calcular a caixa delimitadora predita são as seguintes:

Fórmula revisada da coordenada x da caixa delimitadora do YOLOv5 Fórmula revisada da coordenada y da caixa delimitadora do YOLOv5 Fórmula revisada da largura da caixa delimitadora do YOLOv5 Fórmula revisada da altura da caixa delimitadora do YOLOv5

Compara 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). Assim, o deslocamento pode facilmente chegar a 0 ou 1.

YOLOv5 grid scaling

Compara a proporção de escala da altura e da largura (em relação à âncora) antes e depois do ajuste. As equações originais das caixas do yolo/darknet têm uma falha grave. A largura e a altura não têm limites, pois são simplesmente out=exp(in), o que é perigoso, já que pode causar gradientes descontrolados, instabilidades, perdas NaN e, por fim, a interrupção completa do treinamento. Consulta este problema para mais detalhes.

YOLOv5 unbounded scaling

4.4 Construir os alvos#

O processo de construção dos alvos no YOLOv5 é fundamental para a eficiência do treinamento e a precisão do modelo. Ele envolve atribuir as caixas de referência às células da grade apropriadas no mapa de saída e associá-las às caixas de âncora correspondentes.

Este processo segue estas etapas:

  • Calcula a proporção entre as dimensões da caixa de referência e as dimensões de cada modelo de âncora.

Fórmula da proporção entre a largura da caixa de referência e a âncora

Fórmula da proporção entre a altura da caixa de referência e a âncora

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

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

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

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

YOLOv5 IoU computation
  • Se a proporção calculada estiver dentro do limite, associa a caixa de referência à âncora correspondente.
YOLOv5 grid overlap
  • Atribui a âncora correspondente às células apropriadas, lembrando que, devido ao deslocamento revisado do ponto central, uma caixa de referência pode ser atribuída a mais de uma âncora, pois o intervalo de deslocamento do ponto central é ajustado de (0, 1) para (-0.5, 1.5), possibilitando correspondências adicionais.
YOLOv5 anchor selection

Dessa forma, o processo de construção dos alvos garante que cada objeto de referência seja atribuído e associado corretamente durante o treinamento, permitindo que o YOLOv5 aprenda a tarefa de detecção de objetos com mais eficiência.

Conclusão#

O YOLOv5 representa um avanço significativo na evolução da detecção de objetos em tempo real. Suas escolhas arquiteturais, estratégias de treinamento e aprimoramentos de engenharia oferecem alto desempenho e eficiência em relação às versões anteriores do YOLO.

Os principais aprimoramentos do YOLOv5 incluem o uso de uma arquitetura dinâmica, uma ampla variedade de técnicas de aumento de dados, estratégias inovadoras de treinamento, além de ajustes importantes no cálculo das perdas e no processo de construção dos alvos. Todas essas inovações melhoram significativamente a precisão e a eficiência da detecção de objetos, mantendo alta velocidade, característica marcante dos modelos YOLO.

Perguntas frequentes#

  • Um backbone CSPDarknet53 extrai características, um neck SPPF e PANet as combina entre escalas, e uma head no estilo YOLOv3 prediz caixas, objetividade e classes nos strides 8, 16 e 32. A lista completa de camadas está em models/yolov5l.yaml.

  • O SPPF encadeia três operações de max pooling 5x5, em vez de executar em paralelo operações de pooling 5x5, 9x9 e 13x13. O resultado é matematicamente idêntico, mas é mais de duas vezes mais rápido, como mostra o trecho de criação de perfil acima.

  • O deslocamento original do YOLO não podia chegar exatamente a 0 ou 1, então era difícil predizer objetos centralizados nos limites da grade. Escalar a sigmoid para o intervalo (-0.5, 1.5) elimina essa sensibilidade à grade, e elevar 2σ ao quadrado para limitar a largura e a altura das predições a 4x o tamanho da âncora evita os gradientes descontrolados causados pela exponencial sem limites.

  • Qualquer âncora cujas proporções de largura e altura em relação à caixa estejam dentro de anchor_t (4.0 por padrão) corresponde; além disso, o intervalo de deslocamento ampliado permite atribuir a caixa também às duas células vizinhas da grade. Portanto, um único objeto pode gerar vários alvos positivos, acelerando a convergência.

Comentários