Architettura di Ultralytics YOLOv5
YOLOv5 (v6.0/6.1) è un potente algoritmo di object detection sviluppato da Ultralytics. Questo articolo approfondisce l'architettura di YOLOv5, le strategie di aumento dei dati, le metodologie di addestramento e le tecniche di calcolo della perdita. Questa comprensione completa ti aiuterà a migliorare la tua applicazione pratica dell'object detection in vari campi, tra cui la sorveglianza, i veicoli autonomi e il riconoscimento delle immagini.
1. Struttura del modello
L'architettura di YOLOv5 è composta da tre parti principali:
- Backbone: Questo è il corpo principale della rete. Per YOLOv5, la backbone è progettata utilizzando il
CSPDarknet53
struttura, una modifica dell'architettura Darknet utilizzata nelle versioni precedenti. - Neck: Questa parte connette la backbone e l'head. In YOLOv5,
SPPF
(Spatial Pyramid Pooling - Fast) ePANet
(Path Aggregation Network). - Testa: Questa parte è responsabile della generazione dell'output finale. YOLOv5 utilizza il
YOLOv3 Head
a tale scopo.
La struttura del modello è rappresentata nell'immagine sottostante. I dettagli della struttura del modello sono disponibili in yolov5l.yaml
.
YOLOv5 introduce alcuni notevoli miglioramenti rispetto ai suoi predecessori:
- Il
Focus
la struttura, presente nelle versioni precedenti, è sostituita con una6x6 Conv2d
struttura. Questa modifica aumenta l'efficienza #4825. - Il
SPP
la struttura è sostituita conSPPF
. Questa modifica più che raddoppia la velocità di elaborazione mantenendo lo stesso output.
Per testare la velocità di SPP
e SPPF
, è possibile utilizzare il seguente codice:
Esempio di profilazione della velocità SPP vs SPPF (clicca per aprire)
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. Tecniche di aumento dei dati
YOLOv5 impiega varie tecniche di aumento dei dati per migliorare la capacità del modello di generalizzare e ridurre l'overfitting. Queste tecniche includono:
-
Aumento Mosaico: 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 e traslazioni degli oggetti.
-
Copy-Paste Augmentation: Un metodo innovativo di aumento dei dati che copia porzioni casuali da un'immagine e le incolla su un'altra immagine scelta casualmente, generando efficacemente un nuovo campione di training.
-
Trasformazioni affini casuali: Include rotazione, ridimensionamento, traslazione e shear casuali delle immagini.
-
Aumento MixUp: Un metodo che crea immagini composite prendendo una combinazione lineare di due immagini e delle loro etichette associate.
-
Albumentations: Una potente libreria per l'aumento delle immagini che supporta un'ampia varietà di tecniche di augmentation. Scopri di più sull'utilizzo delle augmentation di Albumentations.
-
Aumento HSV: modifiche casuali alla tonalità, alla saturazione e al valore delle immagini.
-
Capovolgimento orizzontale casuale: Un metodo di aumento dei dati che capovolge casualmente le immagini orizzontalmente.
3. Strategie di addestramento
YOLOv5 applica diverse strategie di addestramento sofisticate per migliorare le prestazioni del modello. Queste includono:
- Addestramento Multiscala: Le immagini di input vengono ridimensionate casualmente entro un intervallo compreso tra 0,5 e 1,5 volte la loro dimensione originale durante il processo di addestramento.
- AutoAnchor: Questa strategia ottimizza le anchor box precedenti per corrispondere alle caratteristiche statistiche delle ground truth box nei tuoi dati personalizzati.
- Warmup e scheduler LR coseno: Un metodo per regolare il tasso di apprendimento per migliorare le prestazioni del modello.
- Media mobile esponenziale (EMA): Una strategia che utilizza la media dei parametri sui passaggi passati per stabilizzare il processo di addestramento e ridurre l'errore di generalizzazione.
- Addestramento a precisione mista: Un metodo per eseguire operazioni in formato a mezza precisione, riducendo l'utilizzo della memoria e migliorando la velocità computazionale.
- Evoluzione degli iperparametri: Una strategia per ottimizzare automaticamente gli iperparametri per ottenere prestazioni ottimali. Scopri di più sull'ottimizzazione degli iperparametri.
4. Funzionalità aggiuntive
4.1 Calcola le perdite
La loss in YOLOv5 è calcolata come una combinazione di tre singole componenti di loss:
- Perdita delle classi (Perdita BCE): Perdita di Binary Cross-Entropy, misura l'errore per l'attività di classificazione.
- Objectness Loss (BCE Loss): Un'altra perdita di Binary Cross-Entropy, calcola l'errore nel rilevare se un oggetto è presente in una particolare cella della griglia o meno.
- Perdita di posizione (perdita CIoU): perdita IoU completa, misura l'errore nella localizzazione dell'oggetto all'interno della cella della griglia.
La funzione di perdita complessiva è rappresentata da:
4.2 Bilancia le perdite
Le perdite di objectness dei tre livelli di previsione (P3
, P4
, P5
) sono ponderati in modo diverso. I pesi di bilanciamento sono [4.0, 1.0, 0.4]
rispettivamente. Questo approccio garantisce che le previsioni a scale diverse contribuiscano in modo appropriato alla perdita totale.
4.3 Elimina la sensibilità della griglia
L'architettura YOLOv5 apporta alcune modifiche importanti alla strategia di previsione dei box rispetto alle versioni precedenti di YOLO. In YOLOv2 e YOLOv3, le coordinate dei box venivano previste direttamente utilizzando l'attivazione dell'ultimo layer.
Tuttavia, in YOLOv5, la formula per prevedere le coordinate del box è stata aggiornata per ridurre la sensibilità della griglia e impedire al modello di prevedere dimensioni del box illimitate.
Le formule riviste per il calcolo del bounding box previsto sono le seguenti:
Confronta l'offset del punto centrale prima e dopo il ridimensionamento. L'intervallo dell'offset del punto centrale viene regolato da (0, 1) a (-0.5, 1.5). Pertanto, l'offset può facilmente ottenere 0 o 1.
Confronta il rapporto di ridimensionamento in altezza e larghezza (rispetto all'ancora) prima e dopo la regolazione. Le equazioni originali della box di yolo/darknet hanno un grave difetto. Larghezza e altezza sono completamente illimitate poiché sono semplicemente out=exp(in), il che è pericoloso, poiché può portare a gradienti incontrollati, instabilità, perdite NaN e, in definitiva, a una completa perdita di training. Fare riferimento a questo problema per maggiori dettagli.
4.4 Build Targets
Il processo di build target in YOLOv5 è fondamentale per l'efficienza dell'addestramento e l'accuratezza del modello. Comporta l'assegnazione di ground truth box alle celle della griglia appropriate nella mappa di output e l'abbinamento con gli anchor box appropriati.
Questo processo segue questi passaggi:
- Calcola il rapporto tra le dimensioni del box di ground truth e le dimensioni di ciascun template di ancoraggio.
- Se il rapporto calcolato rientra nella soglia, abbinare il box di ground truth all'anchor corrispondente.
- Assegna l'anchor corrispondente alle celle appropriate, tenendo presente che, a causa dell'offset del punto centrale rivisto, una ground truth box può essere assegnata a più di un anchor. Poiché l'intervallo di offset del punto centrale è stato modificato da (0, 1) a (-0.5, 1.5), la GT Box può essere assegnata a più anchor.
In questo modo, il processo dei target di build assicura che ogni oggetto ground truth sia correttamente assegnato e abbinato durante il processo di training, consentendo a YOLOv5 di apprendere in modo più efficace il compito del rilevamento degli oggetti.
Conclusione
In conclusione, YOLOv5 rappresenta un significativo passo avanti nello sviluppo di modelli di rilevamento oggetti in tempo reale. Incorporando varie nuove funzionalità, miglioramenti e strategie di addestramento, supera le versioni precedenti della famiglia YOLO in termini di prestazioni ed efficienza.
I principali miglioramenti in YOLOv5 includono l'uso di un'architettura dinamica, una vasta gamma di tecniche di aumento dei dati, strategie di training innovative, nonché importanti modifiche nel calcolo delle perdite e nel processo di costruzione dei target. Tutte queste innovazioni migliorano significativamente l'accuratezza e l'efficienza del rilevamento degli oggetti, pur mantenendo un alto grado di velocità, che è il marchio di fabbrica dei modelli YOLO.