Meet YOLO26: next-gen vision AI.

Link to this sectionArchitettura di Ultralytics YOLOv5#

YOLOv5 (v6.0/6.1) è un potente algoritmo di object detection sviluppato da Ultralytics. Questo articolo analizza in profondità l'architettura di YOLOv5, le strategie di data augmentation, le metodologie di training e le tecniche di calcolo della loss. Questa comprensione completa ti aiuterà a migliorare la tua applicazione pratica dell'object detection in vari campi, inclusi sorveglianza, veicoli autonomi e image recognition.

Link to this sectionStruttura del Modello#

L'architettura di YOLOv5 consiste in tre parti principali:

  • Backbone: Questo è il corpo principale della rete. Per YOLOv5, il backbone è progettato utilizzando la struttura CSPDarknet53, una modifica dell'architettura Darknet utilizzata nelle versioni precedenti.
  • Neck: Questa parte connette il backbone e la head. In YOLOv5, vengono utilizzate le strutture SPPF (Spatial Pyramid Pooling - Fast) e PANet (Path Aggregation Network).
  • Head: Questa parte è responsabile della generazione dell'output finale. YOLOv5 utilizza la YOLOv3 Head a questo scopo.

La struttura del modello è raffigurata nell'immagine sottostante. I dettagli della struttura del modello possono essere trovati in models/yolov5l.yaml.

Architettura di YOLOv5 che mostra backbone, neck e head

YOLOv5 introduce alcuni miglioramenti degni di nota rispetto ai suoi predecessori:

  1. La struttura Focus, presente nelle versioni precedenti, è sostituita con una struttura 6x6 Conv2d. Questa modifica incrementa l'efficienza #4825.
  2. La struttura SPP è sostituita con SPPF. Questa alterazione più che raddoppia la velocità di elaborazione mantenendo lo stesso output.

Per testare la velocità di SPP e SPPF, è possibile utilizzare il seguente codice:

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()

risultato:

True
SPP time: 0.5373051166534424
SPPF time: 0.20780706405639648

Link to this sectionTecniche di Data Augmentation#

YOLOv5 impiega varie tecniche di data augmentation per migliorare la capacità del modello di generalizzare e ridurre l'overfitting. Queste tecniche includono:

  • Mosaic Augmentation: Una tecnica di elaborazione delle immagini che combina quattro immagini di training in una, in modi che incoraggiano i modelli di object detection a gestire meglio varie scale e traslazioni degli oggetti.

    Data augmentation mosaic di YOLOv5 che combina quattro immagini

  • Copy-Paste Augmentation: Un metodo innovativo di data augmentation che copia patch casuali da un'immagine e le incolla su un'altra immagine scelta casualmente, generando effettivamente un nuovo campione di training.

    Data augmentation copy-paste di YOLOv5 per l'instance segmentation

  • Trasformazioni Affini Casuali: Questo include rotazione casuale, ridimensionamento, traslazione e inclinazione (shearing) delle immagini.

    Trasformazioni affini casuali di YOLOv5 per il training

  • MixUp Augmentation: Un metodo che crea immagini composite prendendo una combinazione lineare di due immagini e delle relative etichette.

    Data augmentation MixUp di YOLOv5 che fonde due immagini

  • Albumentations: Una potente libreria di augmentation per immagini che supporta un'ampia varietà di tecniche di augmentation. Scopri di più su come utilizzare le augmentation di Albumentations.

  • HSV Augmentation: Modifiche casuali a tonalità (Hue), saturazione (Saturation) e valore (Value) delle immagini.

    Esempi di augmentation dello spazio colore HSV di YOLOv5

  • Random Horizontal Flip: Un metodo di augmentation che ribalta casualmente le immagini in orizzontale.

    Data augmentation random horizontal flip di YOLOv5

Link to this sectionStrategie di Training#

YOLOv5 applica diverse strategie di training sofisticate per migliorare le prestazioni del modello. Queste includono:

  • Multiscale Training: Le immagini in input vengono ridimensionate casualmente all'interno di un intervallo da 0,5 a 1,5 volte la loro dimensione originale durante il processo di training.
  • AutoAnchor: Questa strategia ottimizza le anchor box predefinite per adattarle alle caratteristiche statistiche delle ground truth box nei tuoi dati personalizzati.
  • Warmup e Cosine LR Scheduler: Un metodo per regolare il learning rate al fine di migliorare le prestazioni del modello.
  • Exponential Moving Average (EMA): Una strategia che utilizza la media dei parametri calcolata sui passi precedenti per stabilizzare il processo di training e ridurre l'errore di generalizzazione.
  • Training in Mixed Precision: Un metodo per eseguire operazioni in formato a mezza precision, riducendo l'utilizzo della memoria e migliorando la velocità computazionale.
  • Hyperparameter Evolution: Una strategia per regolare automaticamente gli iperparametri al fine di ottenere prestazioni ottimali. Scopri di più sul tuning degli iperparametri.

Link to this sectionFunzionalità Aggiuntive#

Link to this section4.1 Calcolo delle Losses#

La loss in YOLOv5 è calcolata come una combinazione di tre componenti individuali:

  • Classes Loss (BCE Loss): Loss di Binary Cross-Entropy, misura l'errore per il task di classificazione.
  • Objectness Loss (BCE Loss): Un'altra loss di Binary Cross-Entropy, calcola l'errore nel rilevare se un oggetto è presente o meno in una specifica cella della griglia.
  • Location Loss (CIoU Loss): Complete IoU loss, misura l'errore nella localizzazione dell'oggetto all'interno della cella della griglia.

La loss function complessiva è rappresentata da:

Formula della loss function totale di YOLOv5

Link to this section4.2 Bilanciamento delle Losses#

Le objectness loss dei tre layer di predizione (P3, P4, P5) sono pesate in modo differente. I pesi di bilanciamento sono rispettivamente [4.0, 1.0, 0.4]. Questo approccio assicura che le predizioni a scale diverse contribuiscano in modo appropriato alla loss totale.

Formula di bilanciamento della objectness loss di YOLOv5

Link to this section4.3 Eliminazione della sensibilità alla griglia#

L'architettura di YOLOv5 apporta alcune modifiche importanti alla strategia di predizione del box rispetto alle versioni precedenti di YOLO. In YOLOv2 e YOLOv3, le coordinate del box venivano predette direttamente utilizzando l'attivazione dell'ultimo layer.

Formula di predizione della coordinata x del bounding box Formula di predizione della coordinata y del bounding box Formula di predizione della larghezza del bounding box Formula di predizione dell'altezza del bounding box

YOLOv5 grid computation

Tuttavia, in YOLOv5, la formula per predire le coordinate del box è stata aggiornata per ridurre la sensibilità alla griglia e impedire al modello di predire dimensioni del box non vincolate.

Le formule riviste per calcolare il bounding box predetto sono le seguenti:

Formula rivista della coordinata x del bounding box di YOLOv5 Formula rivista della coordinata y del bounding box di YOLOv5 Formula rivista della larghezza del bounding box di YOLOv5 Formula rivista dell'altezza del bounding box di YOLOv5

Confronta l'offset del punto centrale prima e dopo lo scalamento. L'intervallo dell'offset del punto centrale è regolato da (0, 1) a (-0.5, 1.5). Pertanto, l'offset può facilmente ottenere 0 o 1.

YOLOv5 grid scaling

Confronta il rapporto di scalamento di altezza e larghezza (rispetto all'anchor) prima e dopo la regolazione. Le equazioni originali del box in yolo/darknet presentano un difetto grave. La larghezza e l'altezza sono completamente illimitate poiché sono semplicemente out=exp(in), il che è pericoloso, poiché può portare a gradienti incontrollati, instabilità, loss NaN e infine a una perdita completa del training. Consulta questo issue per maggiori dettagli.

YOLOv5 unbounded scaling

Link to this section4.4 Build Targets#

Il processo di build target in YOLOv5 è critico per l'efficienza del training e l'accuracy del modello. Comporta l'assegnazione delle ground truth box alle celle della griglia appropriate nella mappa di output e l'abbinamento con le anchor box appropriate.

Questo processo segue questi passaggi:

  • Calcola il rapporto tra le dimensioni della ground truth box e le dimensioni di ciascun template di anchor.

Formula del rapporto tra larghezza della ground truth e dell'anchor

Formula del rapporto tra altezza della ground truth e dell'anchor

Formula del rapporto di larghezza massimo

Formula del rapporto di altezza massimo

Formula del rapporto massimo complessivo

Formula della soglia di corrispondenza dell'anchor

YOLOv5 IoU computation
  • Se il rapporto calcolato rientra nella soglia, abbina la ground truth box con l'anchor corrispondente.
YOLOv5 grid overlap
  • Assegna l'anchor abbinata alle celle appropriate, tenendo presente che, a causa dell'offset rivisto del punto centrale, una ground truth box può essere assegnata a più di un'anchor poiché l'intervallo dell'offset del punto centrale è regolato da (0, 1) a (-0.5, 1.5), rendendo possibili corrispondenze aggiuntive.
YOLOv5 anchor selection

In questo modo, il processo di build targets assicura che ogni oggetto ground truth sia correttamente assegnato e abbinato durante il processo di training, consentendo a YOLOv5 di apprendere il task di object detection in modo più efficace.

Link to this sectionConclusione#

YOLOv5 rappresenta un passo significativo nell'evoluzione dell'object detection in tempo reale. Le sue scelte architetturali, le strategie di training e i perfezionamenti ingegneristici offrono prestazioni ed efficienza elevate rispetto alle versioni precedenti di YOLO.

I miglioramenti primari in YOLOv5 includono l'uso di un'architettura dinamica, un'ampia gamma di tecniche di data augmentation, strategie di training innovative, nonché importanti regolazioni nel calcolo delle loss e nel processo di costruzione dei target. Tutte queste innovazioni migliorano significativamente l'accuratezza e l'efficienza dell'object detection pur mantenendo un alto grado di velocità, che è il marchio di fabbrica dei modelli YOLO.

Collaboratori

Commenti