Vai al contenuto

Apprendimento per trasferimento con strati congelati in YOLOv5

📚 Questa guida spiega come congelare gli strati di YOLOv5 🚀 quando si implementa l'apprendimento per trasferimento. L'apprendimento per trasferimento è una tecnica potente che consente di riqualificare rapidamente un modello su nuovi dati senza dover riqualificare l'intera rete. Congelando una parte dei pesi iniziali e aggiornando solo il resto, è possibile ridurre significativamente le risorse computazionali e il tempo di addestramento, anche se questo approccio può influire leggermente sull'accuratezza finale del modello.

Prima di iniziare

Clonare il repo e installare il file requirements.txt in un file Python.8.0 con l'inclusione di PyTorch.8. I modelli e i dataset vengono scaricati automaticamente dall'ultimaversione di YOLOv5 .

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

Come funziona il congelamento degli strati

Quando si congelano i livelli di una rete neurale, si impostano essenzialmente i loro parametri come non addestrabili. I gradienti di questi livelli sono impostati a zero, impedendo l'aggiornamento dei pesi durante la retropropagazione. Questo viene implementato nel processo di addestramento di YOLOv5 come segue:

# Freeze
freeze = [f"model.{x}." for x in range(freeze)]  # layers to freeze
for k, v in model.named_parameters():
    v.requires_grad = True  # train all layers
    if any(x in k for x in freeze):
        print(f"freezing {k}")
        v.requires_grad = False

Esplorare l'architettura del modello

Per congelare efficacemente parti specifiche del modello, è utile comprendere la struttura dei livelli. È possibile visualizzare tutti i nomi dei moduli con:

for k, v in model.named_parameters():
    print(k)

"""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 è composta da una spina dorsale (strati 0-9) e da una testa (strati rimanenti):

# YOLOv5 v6.0 backbone
backbone:
    # [from, number, module, args]
    - [-1, 1, Conv, [64, 6, 2, 2]] # 0-P1/2
    - [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
    - [-1, 3, C3, [128]]
    - [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
    - [-1, 6, C3, [256]]
    - [-1, 1, Conv, [512, 3, 2]] # 5-P4/16
    - [-1, 9, C3, [512]]
    - [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32
    - [-1, 3, C3, [1024]]
    - [-1, 1, SPPF, [1024, 5]] # 9

# YOLOv5 v6.0 head
head:
    - [-1, 1, Conv, [512, 1, 1]]
    - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
    - [[-1, 6], 1, Concat, [1]] # cat backbone P4
    - [-1, 3, C3, [512, False]] # 13
    # ... remaining head layers

Opzioni di congelamento

Congelare solo la spina dorsale

congelare solo la spina dorsale (strati 0-9), utile per adattare il modello a nuove classi mantenendo le capacità di estrazione delle caratteristiche apprese:

python train.py --freeze 10

Questo approccio è particolarmente efficace quando il nuovo set di dati condivide caratteristiche di basso livello simili a quelle dei dati di addestramento originali, ma presenta classi o oggetti diversi.

Congelare tutti i livelli tranne quello di rilevamento

Per congelare l'intero modello, tranne gli strati di convoluzione dell'uscita finale nel modulo Detect:

python train.py --freeze 24

Questo approccio è ideale quando si vuole mantenere la maggior parte delle caratteristiche apprese dal modello, ma è necessario adattarlo per rilevare un numero diverso di classi.

Confronto delle prestazioni

Abbiamo addestrato YOLOv5m sul dataset VOC utilizzando diverse strategie di congelamento, partendo dai pesi preaddestrati ufficiali di COCO:

python train.py --batch 48 --weights yolov5m.pt --data voc.yaml --epochs 50 --cache --img 512 --hyp hyp.finetune.yaml

Risultati di precisione

I risultati dimostrano che il congelamento degli strati accelera l'addestramento, ma riduce leggermente l'accuratezza finale:

Risultati dell'allenamento al congelamento mAP50

Risultati del training di congelamento mAP50-95

Risultati della tabella

Utilizzo delle risorse

Il congelamento di un maggior numero di livelli riduce i requisiti di memoria e l'utilizzo della GPU , rendendo questa tecnica utile per l'addestramento di modelli più grandi o per l'utilizzo di immagini a risoluzione più elevata:

Formazione GPU Percentuale di memoria allocata

Formazione GPU percentuale di utilizzo della memoria

Quando utilizzare il congelamento a strati

Il congelamento dei livelli nell'apprendimento per trasferimento è particolarmente vantaggioso in scenari quali:

  1. Risorse di calcolo limitate: Quando la memoria o la potenza di elaborazione GPU sono limitate
  2. Set di dati di piccole dimensioni: Quando il nuovo set di dati è troppo piccolo per addestrare un modello completo senza overfitting
  3. Adattamento rapido: Quando è necessario adattare rapidamente un modello a un nuovo dominio
  4. Messa a punto per compiti specifici: Quando si adatta un modello generale a un'applicazione specializzata

Per maggiori informazioni sulle tecniche di apprendimento per trasferimento e sulle loro applicazioni, si veda la voce del glossario sull'apprendimento per trasferimento.

Ambienti supportati

Ultralytics fornisce una serie di ambienti pronti all'uso, ognuno dei quali è preinstallato con le dipendenze essenziali quali CUDA, CUDNN, Python, e PyTorchper avviare i vostri progetti.

Stato del progetto

YOLOv5 CI

Questo badge indica che tutti i test di Continuous Integration (CI) di YOLOv5 GitHub Actions sono stati superati con successo. Questi test CI verificano rigorosamente la funzionalità e le prestazioni di YOLOv5 in vari aspetti chiave: formazione, validazione, inferenza, esportazione e benchmark. Assicurano un funzionamento coerente e affidabile su macOS, Windows e Ubuntu, con test condotti ogni 24 ore e su ogni nuovo commit.

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

Commenti