Architettura di Ultralytics YOLOv5#
YOLOv5 (v6.0/6.1) è un potente algoritmo di rilevamento oggetti sviluppato da Ultralytics. Questo articolo approfondisce l'architettura di YOLOv5, le strategie di data augmentation, le metodologie di addestramento e le tecniche di calcolo della loss. Questa comprensione completa ti aiuterà a migliorare la tua applicazione pratica del rilevamento oggetti in vari campi, inclusi sorveglianza, veicoli autonomi e image recognition.
Struttura 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 collega il backbone e la head. In YOLOv5 vengono utilizzate le strutture
SPPF(Spatial Pyramid Pooling - Fast) ePANet(Path Aggregation Network). - Head: Questa parte è responsabile della generazione dell'output finale. YOLOv5 utilizza
YOLOv3 Heada questo scopo.
La struttura del modello è illustrata nell'immagine sottostante. I dettagli della struttura del modello sono reperibili in models/yolov5l.yaml.

YOLOv5 introduce alcuni miglioramenti degni di nota rispetto ai suoi predecessori:
- La struttura
Focus, presente nelle versioni precedenti, viene sostituita con una struttura6x6 Conv2d. Questa modifica aumenta l'efficienza #4825. - La struttura
SPPviene sostituita conSPPF. Questa alterazione più che raddoppia la velocità di elaborazione pur 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
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()risultato:
True
SPP time: 0.5373051166534424
SPPF time: 0.20780706405639648Tecniche di Data Augmentation#
YOLOv5 impiega varie tecniche di data augmentation per migliorare la capacità di generalizzazione del modello e ridurre l'overfitting. Queste tecniche includono:
-
Mosaic Augmentation: Una tecnica di elaborazione delle immagini che combina quattro immagini di addestramento in una sola in modi che incoraggiano i modelli di object detection a gestire meglio varie scale di oggetti e traslazioni.

-
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.

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

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

-
Albumentations: Una potente libreria di augmentation delle immagini che supporta un'ampia varietà di tecniche di augmentation. Scopri di più su come usare le augmentation di Albumentations.
-
HSV Augmentation: Modifiche casuali a tonalità (Hue), saturazione (Saturation) e valore (Value) delle immagini.

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

Strategie 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 per 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.
- Addestramento in Mixed Precision: Un metodo per eseguire operazioni in formato a metà precisione, riducendo l'utilizzo della memoria e migliorando la velocità di calcolo.
- Hyperparameter Evolution: Una strategia per sintonizzare automaticamente gli iperparametri per ottenere prestazioni ottimali. Scopri di più sulla regolazione degli iperparametri.
Funzionalità Aggiuntive#
4.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:
4.2 Bilanciamento delle Losses#
Le loss di objectness dei tre layer di predizione (P3, P4, P5) sono pesate in modo diverso. I pesi di bilanciamento sono rispettivamente [4.0, 1.0, 0.4]. Questo approccio garantisce che le predizioni a scale diverse contribuiscano in modo appropriato alla loss totale.
4.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.
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 il calcolo del bounding box predetto sono le seguenti:
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.
Confronta il rapporto di ridimensionamento di altezza e larghezza (rispetto all'anchor) prima e dopo la regolazione. Le equazioni originali dei box di yolo/darknet presentano un difetto grave. La larghezza e l'altezza sono completamente illimitate poiché sono semplicemente out=exp(in), il che è pericoloso, in quanto può portare a gradienti incontrollati, instabilità, loss NaN e infine a una perdita completa dell'addestramento. Fai riferimento a questo problema per maggiori dettagli.
4.4 Build Targets#
Il processo di generazione dei target in YOLOv5 è fondamentale per l'efficienza dell'addestramento e l'accuracy del modello. Comporta l'assegnazione dei box di ground truth alle celle della griglia appropriate nella mappa di output e il loro abbinamento con gli anchor box appropriati.
Questo processo segue questi passaggi:
- Calcola il rapporto tra le dimensioni della ground truth box e le dimensioni di ciascun template di anchor.
- Se il rapporto calcolato rientra nella soglia, abbina la ground truth box con l'anchor corrispondente.
- 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.
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.
Conclusione#
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.