Architettura di Ultralytics YOLOv5#
YOLOv5 (v6.0/6.1) è un potente algoritmo di rilevamento degli oggetti sviluppato da Ultralytics. Questo articolo esamina in profondità l'architettura di YOLOv5, le strategie di aumento dei dati, le metodologie di addestramento e le tecniche di calcolo della funzione di perdita. Questa comprensione completa ti aiuterà a migliorare l'applicazione pratica del rilevamento degli oggetti in vari ambiti, tra cui la videosorveglianza, i veicoli autonomi e il riconoscimento delle immagini.
1. Struttura del modello#
L'architettura di YOLOv5 è composta da tre parti principali:
- Backbone: è il corpo principale della rete. In 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 seguente. I dettagli sulla struttura del modello sono disponibili in models/yolov5l.yaml.

YOLOv5 introduce alcuni miglioramenti significativi rispetto ai suoi predecessori:
- La struttura
Focus, presente nelle versioni precedenti, viene sostituita dalla struttura6x6 Conv2d. Questa modifica aumenta l'efficienza #4825. - La struttura
SPPviene sostituita daSPPF. Questa modifica più che raddoppia la velocità di elaborazione mantenendo invariato l'output.
Per testare la velocità di SPP e SPPF, puoi 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.207807064056396482. Tecniche di aumento dei dati#
YOLOv5 utilizza diverse tecniche di aumento dei dati per migliorare la capacità di generalizzazione del modello e ridurre l'overfitting. Queste tecniche includono:
-
Aumento Mosaic: una tecnica di elaborazione delle immagini che combina quattro immagini di addestramento in una sola, in modo da aiutare i modelli di rilevamento degli oggetti a gestire meglio diverse scale e traslazioni degli oggetti.

-
Aumento Copy-Paste: un innovativo metodo di aumento dei dati che copia patch casuali da un'immagine e le incolla su un'altra immagine scelta casualmente, generando di fatto un nuovo campione di addestramento.

-
Trasformazioni affini casuali: includono rotazione, ridimensionamento, traslazione e deformazione casuali delle immagini.

-
Aumento MixUp: un metodo che crea immagini composite combinando linearmente due immagini e le relative annotazioni.

-
Albumentations: una potente libreria per l'aumento delle immagini che supporta un'ampia varietà di tecniche di aumento. Scopri di più sull'utilizzo degli aumenti di Albumentations.
-
Aumento HSV: modifiche casuali a tonalità, saturazione e valore delle immagini.

-
Ribaltamento orizzontale casuale: un metodo di aumento che ribalta casualmente le immagini in orizzontale.

3. Strategie di addestramento#
YOLOv5 applica diverse strategie di addestramento sofisticate per migliorare le prestazioni del modello. Queste includono:
- Addestramento multiscala: durante il processo di addestramento, le immagini di input vengono ridimensionate casualmente entro un intervallo compreso tra 0,5 e 1,5 volte la loro dimensione originale.
- AutoAnchor: questa strategia ottimizza le anchor box iniziali affinché corrispondano alle caratteristiche statistiche delle box ground truth nei tuoi dati personalizzati.
- Warmup e scheduler LR coseno: un metodo per regolare il learning rate e migliorare le prestazioni del modello.
- Media mobile esponenziale (EMA): una strategia che utilizza la media dei parametri dei passaggi precedenti per stabilizzare il processo di addestramento e ridurre l'errore di generalizzazione.
- Addestramento a precisione mista: un metodo per eseguire le operazioni in formato a precisione dimezzata, riducendo l'utilizzo della memoria e aumentando la velocità di calcolo.
- Evoluzione degli iperparametri: una strategia per ottimizzare automaticamente gli iperparametri e ottenere prestazioni ottimali. Scopri di più sull'ottimizzazione degli iperparametri.
4. Funzionalità aggiuntive#
4.1 Calcolo delle perdite#
La perdita in YOLOv5 viene calcolata come combinazione di tre singoli componenti di perdita:
- Perdita delle classi (perdita BCE): perdita di entropia incrociata binaria, misura l'errore del compito di classificazione.
- Perdita di objectness (perdita BCE): un'altra perdita di entropia incrociata binaria, calcola l'errore nel rilevare se un oggetto è presente o meno in una determinata cella della griglia.
- Perdita di localizzazione (perdita CIoU): perdita di IoU completo, misura l'errore nella localizzazione dell'oggetto all'interno della cella della griglia.
La funzione di perdita complessiva è rappresentata da:
4.2 Bilanciamento delle perdite#
Le perdite di objectness dei tre livelli 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 perdita totale.
4.3 Eliminazione della sensibilità alla griglia#
L'architettura di YOLOv5 apporta alcune modifiche importanti alla strategia di predizione delle box rispetto alle versioni precedenti di YOLO. In YOLOv2 e YOLOv3, le coordinate delle box venivano predette direttamente utilizzando l'attivazione dell'ultimo livello.
Tuttavia, in YOLOv5 la formula per predire le coordinate delle box è stata aggiornata per ridurre la sensibilità alla griglia e impedire al modello di predire dimensioni delle box non limitate.
Le formule aggiornate per calcolare la bounding box predetta sono le seguenti:
Confronta l'offset del punto centrale prima e dopo il ridimensionamento. L'intervallo dell'offset del punto centrale viene modificato da (0, 1) a (-0.5, 1.5). Pertanto, l'offset può facilmente assumere il valore 0 o 1.
Confronta il rapporto di ridimensionamento dell'altezza e della larghezza (rispetto all'anchor) prima e dopo la modifica. Le equazioni originali delle box di yolo/darknet presentano un difetto grave. La larghezza e l'altezza sono completamente non limitate, poiché sono semplicemente out=exp(in), il che è pericoloso perché può causare gradienti incontrollati, instabilità, perdite NaN e infine la perdita completa dell'addestramento. Consulta questo problema per maggiori dettagli.
4.4 Creazione dei target#
Il processo di creazione dei target in YOLOv5 è fondamentale per l'efficienza dell'addestramento e l'accuratezza del modello. Consiste nell'assegnare le box ground truth alle celle della griglia appropriate nella mappa di output e nel farle corrispondere alle anchor box appropriate.
Questo processo segue questi passaggi:
- Calcola il rapporto tra le dimensioni della box ground truth e le dimensioni di ciascun template di anchor.
- Se il rapporto calcolato rientra nella soglia, associa la box ground truth all'anchor corrispondente.
- Assegna l'anchor corrispondente alle celle appropriate, tenendo presente che, a causa del nuovo offset del punto centrale, una box ground truth può essere assegnata a più di un'anchor, poiché l'intervallo dell'offset del punto centrale viene modificato da (0, 1) a (-0.5, 1.5), rendendo possibili ulteriori corrispondenze.
In questo modo, il processo di creazione dei target garantisce che ogni oggetto ground truth venga assegnato e associato correttamente durante l'addestramento, consentendo a YOLOv5 di apprendere il compito di rilevamento degli oggetti in modo più efficace.
Conclusioni#
YOLOv5 rappresenta un passo significativo nell'evoluzione del rilevamento degli oggetti in tempo reale. Le sue scelte architetturali, le strategie di addestramento e i perfezionamenti ingegneristici offrono prestazioni ed efficienza elevate rispetto alle versioni precedenti di YOLO.
I principali miglioramenti di YOLOv5 includono l'uso di un'architettura dinamica, un'ampia gamma di tecniche di aumento dei dati, strategie di addestramento innovative, nonché importanti modifiche al calcolo delle perdite e al processo di creazione dei target. Tutte queste innovazioni migliorano significativamente l'accuratezza e l'efficienza del rilevamento degli oggetti, mantenendo al contempo un'elevata velocità, il tratto distintivo dei modelli YOLO.