Ir al contenido

Aprendizaje por transferencia con capas congeladas en YOLOv5

📚 Esta guía explica cómo congelar las capas de YOLOv5 🚀 al implementar el aprendizaje por transferencia. El aprendizaje por transferencia es una potente técnica que permite volver a entrenar rápidamente un modelo con nuevos datos sin tener que volver a entrenar toda la red. Congelando parte de los pesos iniciales y actualizando sólo el resto, puedes reducir significativamente los recursos computacionales y el tiempo de entrenamiento, aunque este enfoque puede afectar ligeramente a la precisión final del modelo.

Antes de empezar

Clona el repositorio e instala requirements.txt en un directorio Python.8.0 incluyendo PyTorch.8. Los modelos y conjuntos de datos se descargan automáticamente de la últimaversión de YOLOv5 .

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

Cómo funciona la congelación por capas

Cuando se congelan las capas de una red neuronal, básicamente se están configurando sus parámetros para que no se puedan entrenar. Los gradientes de estas capas se ponen a cero, impidiendo cualquier actualización del peso durante la retropropagación. Esto se implementa en el proceso de entrenamiento de YOLOv5 de la siguiente manera:

# 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

Explorar la arquitectura del modelo

Para congelar eficazmente partes específicas del modelo, es útil comprender la estructura de capas. Puede ver todos los nombres de los módulos 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
...
"""

La arquitectura YOLOv5 consta de una columna vertebral (capas 0-9) y una cabeza (capas restantes):

# 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

Opciones de congelación

Congelar sólo la columna vertebral

Congelar sólo la columna vertebral (capas 0-9), lo que resulta útil para adaptar el modelo a nuevas clases conservando las capacidades de extracción de características aprendidas:

python train.py --freeze 10

Este enfoque es especialmente eficaz cuando el nuevo conjunto de datos comparte características de bajo nivel similares con los datos de entrenamiento originales, pero tiene clases u objetos diferentes.

Congelar todo excepto las capas de detección

Para congelar todo el modelo excepto las capas de convolución de salida final en el módulo Detectar:

python train.py --freeze 24

Este enfoque es ideal cuando se desea mantener la mayor parte de las características aprendidas del modelo, pero es necesario adaptarlo para detectar un número diferente de clases.

Comparación de resultados

Entrenamos YOLOv5m en el conjunto de datos VOC utilizando diferentes estrategias de congelación, partiendo de los pesos preentrenados oficiales de COCO:

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

Resultados de precisión

Los resultados demuestran que la congelación de capas acelera el entrenamiento pero reduce ligeramente la precisión final:

Congelación de los resultados del entrenamiento mAP50

Resultados del entrenamiento de congelación mAP50-95

Resultados de la tabla

Utilización de los recursos

Congelar más capas reduce los requisitos de memoria de GPU y su utilización, lo que hace que esta técnica sea valiosa para entrenar modelos más grandes o utilizar imágenes de mayor resolución:

Formación GPU memoria asignada por ciento

Formación GPU porcentaje de utilización de la memoria

Cuándo utilizar la congelación por capas

La congelación de capas en el aprendizaje por transferencia es especialmente beneficiosa en escenarios como:

  1. Recursos computacionales limitados: Cuando la memoria o la capacidad de procesamiento GPU son limitadas.
  2. Conjuntos de datos pequeños: Cuando su nuevo conjunto de datos es demasiado pequeño para entrenar un modelo completo sin sobreajustar
  3. Adaptación rápida: Cuando se necesita adaptar rápidamente un modelo a un nuevo dominio.
  4. Ajuste para tareas específicas: Al adaptar un modelo general a una aplicación especializada

Para más información sobre las técnicas de aprendizaje por transferencia y sus aplicaciones, consulte la entrada del glosario sobre aprendizaje por transferencia.

Entornos compatibles

Ultralytics proporciona una serie de entornos listos para usar, cada uno de ellos preinstalado con dependencias esenciales como CUDACUDNN, Pythony PyTorchpara poner en marcha sus proyectos.

Estado del proyecto

YOLOv5 CI

Este distintivo indica que todas las pruebas de integración continua (IC) deYOLOv5 GitHub Actions se han superado con éxito. Estas pruebas de IC comprueban rigurosamente la funcionalidad y el rendimiento de YOLOv5 en varios aspectos clave: formación, validación, inferencia, exportación y puntos de referencia. Garantizan un funcionamiento coherente y fiable en macOS, Windows y Ubuntu, con pruebas realizadas cada 24 horas y en cada nueva confirmación.

Creado hace 1 año ✏️ Actualizado hace 9 días

Comentarios