Vai al contenuto

Apprendimento per trasferimento con strati congelati in YOLOv5

📚 Questa guida spiega come congelare YOLOv5 🚀 quando si implementa l'apprendimento per trasferimento. L'apprendimento per trasferimento è una potente tecnica di apprendimento automatico (ML) che consente di riqualificare rapidamente un modello su nuovi dati senza dover riqualificare l'intera rete da zero. Congelando i pesi degli strati iniziali e aggiornando solo i parametri degli strati successivi, è possibile ridurre significativamente i requisiti di risorse computazionali e il tempo di addestramento. Tuttavia, questo approccio potrebbe influire leggermente sull'accuratezza finale del modello.

Prima di iniziare

Per prima cosa, clonare il repository YOLOv5 e installare le dipendenze necessarie elencate in requirements.txt. Assicuratevi di avere un Python.8.0 ambiente con PyTorch.8 installato. Pre-formato modelli e richiesto set di dati verrà scaricato automaticamente dall'ultima versione di YOLOv5. rilascio.

git clone https://github.com/ultralytics/yolov5 # clone repository
cd yolov5
pip install -r requirements.txt # install dependencies

Come funziona il congelamento degli strati

Quando si congelano gli strati in un rete neurale, si impedisce che i loro parametriweights and biases) vengano aggiornati durante il processo di addestramento. In PyTorch, questo si ottiene impostando il parametro requires_grad dei tensori dello strato a False. Di conseguenza, i gradienti non vengono calcolati per questi strati durante la fase di retropropagazionerisparmiando calcolo e memoria.

Ecco come YOLOv5 implementa il congelamento dei livelli nel suo script di allenamento:

# Freeze specified layers
freeze = [f"model.{x}." for x in range(freeze)]  # Define layers to freeze based on module index
for k, v in model.named_parameters():
    v.requires_grad = True  # Ensure all parameters are initially trainable
    if any(x in k for x in freeze):
        print(f"Freezing layer: {k}")
        v.requires_grad = False  # Disable gradient calculation for frozen layers

Esplorare l'architettura del modello

La comprensione della struttura del modello YOLOv5 è fondamentale per decidere quali livelli congelare. È possibile esaminare i nomi di tutti i moduli e i loro parametri utilizzando il seguente snippet Python :

# Assuming 'model' is your loaded YOLOv5 model instance
for name, param in model.named_parameters():
    print(name)

"""
Example Output:
model.0.conv.conv.weight
model.0.conv.bn.weight
model.0.conv.bn.bias
model.1.conv.weight
model.1.bn.weight
model.1.bn.bias
model.2.cv1.conv.weight
model.2.cv1.bn.weight
...
"""

L'architettura di YOLOv5 consiste tipicamente in una spina dorsale (strati 0-9 in configurazioni standard come YOLOv5s/m/l/x) responsabile dell'estrazione delle caratteristiche e in una testa (gli strati rimanenti) che esegue il rilevamento degli oggetti.

# Example YOLOv5 v6.0 backbone structure
backbone:
    # [from, number, module, args]
    - [-1, 1, Conv, [64, 6, 2, 2]]  # Layer 0: Initial convolution (P1/2 stride)
    - [-1, 1, Conv, [128, 3, 2]] # Layer 1: Downsampling convolution (P2/4 stride)
    - [-1, 3, C3, [128]]          # Layer 2: C3 module
    - [-1, 1, Conv, [256, 3, 2]] # Layer 3: Downsampling convolution (P3/8 stride)
    - [-1, 6, C3, [256]]          # Layer 4: C3 module
    - [-1, 1, Conv, [512, 3, 2]] # Layer 5: Downsampling convolution (P4/16 stride)
    - [-1, 9, C3, [512]]          # Layer 6: C3 module
    - [-1, 1, Conv, [1024, 3, 2]]# Layer 7: Downsampling convolution (P5/32 stride)
    - [-1, 3, C3, [1024]]         # Layer 8: C3 module
    - [-1, 1, SPPF, [1024, 5]]    # Layer 9: Spatial Pyramid Pooling Fast

# Example YOLOv5 v6.0 head structure
head:
    - [-1, 1, Conv, [512, 1, 1]] # Layer 10
    - [-1, 1, nn.Upsample, [None, 2, "nearest"]] # Layer 11
    - [[-1, 6], 1, Concat, [1]] # Layer 12: Concatenate with backbone P4 (from layer 6)
    - [-1, 3, C3, [512, False]] # Layer 13: C3 module
    # ... subsequent head layers for feature fusion and detection

Opzioni di congelamento

È possibile controllare quali livelli vengono congelati utilizzando l'opzione --freeze nel comando di addestramento. Questo argomento specifica l'indice del primo non congelato tutti i moduli precedenti a questo indice avranno i loro pesi congelati.

Congelare solo la spina dorsale

Per congelare l'intera spina dorsale (strati da 0 a 9), cosa comune quando si adatta il modello a nuove classi di oggetti, pur mantenendo le capacità generali di estrazione delle caratteristiche apprese da un grande set di dati come COCO:

python train.py --weights yolov5m.pt --data your_dataset.yaml --freeze 10

Questa strategia è efficace quando il dataset di destinazione condivide caratteristiche visive di basso livello simili (bordi, texture) con i dati di addestramento originali (ad esempio, COCO), ma contiene categorie di oggetti diverse.

Congelare tutti i livelli tranne quello della rilevazione finale

Per congelare quasi l'intera rete, lasciando solo gli strati di convoluzione di uscita finali (parte del Detect modulo, in genere l'ultimo modulo, ad esempio il modulo 24 in YOLOv5s) addestrabile:

python train.py --weights yolov5m.pt --data your_dataset.yaml --freeze 24

Questo approccio è utile quando è necessario regolare il modello per un numero diverso di classi di uscita, mantenendo intatta la maggior parte delle caratteristiche apprese. Richiede le minori risorse computazionali per la messa a punto.

Confronto delle prestazioni

Per illustrare gli effetti degli strati di congelamento, abbiamo addestrato YOLOv5m sul Set di dati Pascal VOC per 50 epochea partire dal preaddestramento ufficiale COCO pesi (yolov5m.pt). Abbiamo confrontato tre scenari: addestrare tutti gli strati (--freeze 0), congelamento della spina dorsale (--freeze 10), e il congelamento di tutti gli strati di rilevamento tranne quello finale (--freeze 24).

# Example command for training with backbone frozen
python train.py --batch 48 --weights yolov5m.pt --data voc.yaml --epochs 50 --cache --img 512 --hyp hyp.finetune.yaml --freeze 10

Risultati di precisione

I risultati mostrano che il congelamento degli strati può accelerare significativamente l'addestramento, ma può portare a una leggera riduzione della mAP (mean Average Precision) finale. L'addestramento di tutti gli strati produce generalmente la migliore accuratezza, mentre il congelamento di più strati offre un addestramento più rapido al costo di prestazioni potenzialmente inferiori.

Risultati dell'addestramento mAP50 a confronto con diverse strategie di congelamento Confronto mAP50 durante l'allenamento

Risultati dell'addestramento mAP50-95 a confronto con diverse strategie di congelamento Confronto mAP50-95 durante l'allenamento

Tabella di riepilogo dei risultati delle prestazioni Tabella riassuntiva delle metriche di performance

Utilizzo delle risorse

Il congelamento di un maggior numero di strati riduce sostanzialmente GPU e l'utilizzo complessivo della memoria della GPU. Ciò rende l'apprendimento per trasferimento con livelli congelati un'opzione interessante quando si lavora con risorse hardware limitate, consentendo di addestrare modelli più grandi o di utilizzare immagini di dimensioni maggiori rispetto a quanto sarebbe altrimenti possibile.

Percentuale di memoria allocata GPU durante l'allenamento Memoria GPU allocata (%)

Percentuale di utilizzo della memoria GPU durante la formazione Utilizzo della GPU (%)

Quando utilizzare il congelamento a strati

Il congelamento dello strato durante l'apprendimento per trasferimento è particolarmente vantaggioso in diverse situazioni:

  1. Risorse di calcolo limitate: Se la memoria o la potenza di elaborazione della GPU sono limitate.
  2. Piccoli insiemi di dati: Quando il dataset di destinazione è significativamente più piccolo del dataset originale di pre-addestramento, il congelamento aiuta a prevenire l'overfitting.
  3. Prototipazione rapida: Quando è necessario adattare rapidamente un modello esistente a un nuovo compito o dominio per una valutazione iniziale.
  4. Domini di caratteristiche simili: Se le caratteristiche di basso livello del nuovo set di dati sono molto simili a quelle del set di dati su cui il modello è stato pre-addestrato.

Per saperne di più sulle sfumature dell'apprendimento per trasferimento, consultate la nostra voce di glossario e considerate tecniche come la regolazione degli iperparametri per ottimizzare le prestazioni.

Ambienti supportati

Ultralytics offre diversi ambienti pronti all'uso con dipendenze essenziali come CUDA, CuDNN, Pythone PyTorch preinstallati.

Stato del progetto

Stato dell'integrazione continua YOLOv5

Questo badge conferma che tutti i test di integrazione continua (CI) diYOLOv5 GitHub Actions sono stati superati con successo. Questi test CI valutano rigorosamente la funzionalità e le prestazioni di YOLOv5 attraverso le operazioni chiave: formazione, validazione, inferenza, esportazione e benchmark. Garantiscono un funzionamento coerente e affidabile su macOS, Windows e Ubuntu e vengono eseguiti automaticamente ogni 24 ore e su ogni nuovo commit di codice.

📅C reato 1 anno fa ✏️ Aggiornato 16 giorni fa

Commenti