YOLO Vision 2026:

Transfer learning con layer congelati in YOLOv5#

📚 Questa guida spiega come congelare i layer di YOLOv5 🚀 durante l'implementazione del transfer learning. Il transfer learning è una potente tecnica di apprendimento automatico (ML) che ti permette di riaddestrare rapidamente un modello su nuovi dati senza riaddestrare l'intera rete da zero. Congelando i pesi dei layer iniziali e aggiornando solo i parametri dei layer successivi, puoi ridurre significativamente i requisiti di risorse computazionali e i tempi di addestramento. Tuttavia, questo approccio potrebbe influire leggermente sull'accuratezza finale del modello.

Prima di iniziare#

Per prima cosa, clona il repository di YOLOv5 e installa le dipendenze necessarie elencate in requirements.txt. Assicurati di avere un ambiente Python>=3.8.0 con PyTorch>=1.8 installato. I modelli preaddestrati e i dataset richiesti verranno scaricati automaticamente dall'ultima release di YOLOv5.

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

Come funziona il congelamento dei layer#

Quando congeli i layer in una rete neurale, impedisci che i relativi parametri (pesi e bias) vengano aggiornati durante il processo di addestramento. In PyTorch, questo si ottiene impostando l'attributo requires_grad dei tensori del layer su False. Di conseguenza, per questi layer non vengono calcolati i gradienti durante la retropropagazione, risparmiando calcolo e memoria.

Ecco come YOLOv5 implementa il congelamento dei layer nel suo script di addestramento:

# 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

Esplorazione dell'architettura del modello#

Comprendere la struttura del modello YOLOv5 è fondamentale per decidere quali layer congelare. Puoi esaminare i nomi di tutti i moduli e i relativi parametri usando il seguente frammento di codice 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 è generalmente composta da un backbone (layer da 0 a 9 nelle configurazioni standard come YOLOv5s/m/l/x), responsabile dell'estrazione delle caratteristiche, e da una head (i layer 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#

Puoi controllare quali layer vengono congelati usando l'argomento --freeze nel comando di addestramento. Questo argomento specifica l'indice del primo modulo non congelato; tutti i moduli precedenti a questo indice avranno i pesi congelati. Usa model.model (un nn.Sequential) per esaminare l'ordine dei moduli se devi verificare quali indici corrispondono a un determinato blocco.

Congelare solo il backbone#

Per congelare l'intero backbone (layer da 0 a 9), una pratica comune quando si adatta il modello a nuove classi di oggetti mantenendo le capacità generali di estrazione delle caratteristiche apprese da un dataset di grandi dimensioni 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 tutto tranne i layer finali di rilevamento#

Per congelare quasi l'intera rete, lasciando addestrabili solo i layer convoluzionali di output finali (parte del modulo Detect, in genere l'ultimo modulo, ad esempio il modulo 24 in YOLOv5s):

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

Questo approccio è utile quando devi principalmente adattare il modello a un numero diverso di classi di output, mantenendo intatta la maggior parte delle caratteristiche apprese. Richiede il minor quantitativo di risorse computazionali per il fine-tuning.

Confronto delle prestazioni#

Per illustrare gli effetti del congelamento dei layer, abbiamo addestrato YOLOv5m sul dataset Pascal VOC per 50 epoche, partendo dai [pesi](https://ultralytics-translation-2.invalid ufficiali preaddestrati su COCO (yolov5m.pt). Abbiamo confrontato tre scenari: addestramento di tutti i layer (--freeze 0), congelamento del backbone (--freeze 10) e congelamento di tutti i layer tranne quelli finali di rilevamento (--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 data/hyps/hyp.VOC.yaml --freeze 10

Risultati dell'accuratezza#

I risultati mostrano che il congelamento dei layer può accelerare significativamente l'addestramento, ma può comportare una lieve riduzione della mAP (precisione media) finale. L'addestramento di tutti i layer generalmente produce la migliore accuratezza, mentre il congelamento di un numero maggiore di layer offre un addestramento più rapido, a scapito di prestazioni potenzialmente inferiori.

Risultati della mAP50 di addestramento a confronto tra diverse strategie di congelamento Confronto della mAP50 durante l'addestramento

Risultati della mAP50-95 di addestramento a confronto tra diverse strategie di congelamento Confronto della mAP50-95 durante l'addestramento

YOLOv5 frozen layer training performance *Summary table of performance metrics*

Utilizzo delle risorse#

Il congelamento di un numero maggiore di layer riduce sostanzialmente i requisiti di memoria della GPU e l'utilizzo complessivo. Ciò rende il transfer learning con layer congelati un'opzione interessante quando lavori con risorse hardware limitate, permettendoti di addestrare modelli più grandi o usare immagini di dimensioni maggiori di quanto sarebbe altrimenti possibile.

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

Percentuale di utilizzo della GPU durante l'addestramento Utilizzo della GPU (%)

Quando usare il congelamento dei layer#

Il congelamento dei layer durante il transfer learning è particolarmente vantaggioso in diverse situazioni:

  1. Risorse computazionali limitate: se hai vincoli sulla memoria della GPU o sulla potenza di elaborazione.
  2. Dataset di piccole dimensioni: quando il dataset di destinazione è significativamente più piccolo del dataset originale di preaddestramento, il congelamento aiuta a prevenire l'overfitting.
  3. Prototipazione rapida: quando devi adattare rapidamente un modello esistente a una nuova attività o a un nuovo dominio per una valutazione iniziale.
  4. Domini con caratteristiche simili: se le caratteristiche di basso livello del nuovo dataset sono molto simili a quelle del dataset su cui il modello è stato preaddestrato.

Scopri di più sulle sfumature del transfer learning nella nostra voce del glossario e valuta tecniche come il tuning degli iperparametri per ottimizzare le prestazioni.

Ambienti supportati#

Ultralytics offre diversi ambienti pronti all'uso con dipendenze essenziali come CUDA, CuDNN, Python e PyTorch preinstallate.

Stato del progetto#

YOLOv5 Continuous Integration Status

Questo badge conferma che tutti i test di GitHub Actions di YOLOv5 per l'integrazione continua (CI) vengono superati correttamente. Questi test CI valutano rigorosamente la funzionalità e le prestazioni di YOLOv5 nelle operazioni principali: addestramento, validazione, inferenza, esportazione e benchmark. Garantiscono un funzionamento coerente e affidabile su macOS, Windows e Ubuntu, eseguendosi automaticamente ogni 24 ore e a ogni nuovo commit del codice.

Commenti