Salta para o conteúdo

Aprendizagem por transferência com camadas congeladas

📚 Este guia explica como congelar YOLOv5 🚀 camadas ao transferir a aprendizagem. A aprendizagem por transferência é uma forma útil de retreinar rapidamente um modelo em novos dados sem ter de retreinar toda a rede. Em vez disso, parte dos pesos iniciais é congelada no lugar, e o restante dos pesos é usado para calcular a perda e é atualizado pelo otimizador. Isso requer menos recursos do que o treinamento normal e permite tempos de treinamento mais rápidos, embora também possa resultar em reduções na precisão final treinada.

Antes de começares

Clona o repo e instala o requirements.txt em um Python>=3.8.0 incluindo PyTorch>=1.8. Os modelos e conjuntos de dados são descarregados automaticamente a partir daversão mais recente de YOLOv5 .

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

Congela o backbone

Todas as camadas que correspondem ao train.py freeze em train.py serão congeladas, definindo os seus gradientes para zero antes do início do treino.

# 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

Para ver uma lista de nomes de módulos:

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
...
model.23.m.0.cv2.bn.weight
model.23.m.0.cv2.bn.bias
model.24.m.0.weight
model.24.m.0.bias
model.24.m.1.weight
model.24.m.1.bias
model.24.m.2.weight
model.24.m.2.bias
"""

Observando a arquitetura do modelo, podemos ver que a espinha dorsal do modelo é constituída pelas camadas 0-9:

# 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

  - [-1, 1, Conv, [256, 1, 1]]
  - [-1, 1, nn.Upsample, [None, 2, 'nearest']]
  - [[-1, 4], 1, Concat, [1]]  # cat backbone P3
  - [-1, 3, C3, [256, False]]  # 17 (P3/8-small)

  - [-1, 1, Conv, [256, 3, 2]]
  - [[-1, 14], 1, Concat, [1]]  # cat head P4
  - [-1, 3, C3, [512, False]]  # 20 (P4/16-medium)

  - [-1, 1, Conv, [512, 3, 2]]
  - [[-1, 10], 1, Concat, [1]]  # cat head P5
  - [-1, 3, C3, [1024, False]]  # 23 (P5/32-large)

  - [[17, 20, 23], 1, Detect, [nc]]  # Detect(P3, P4, P5)

para que possamos definir a lista de congelamento para conter todos os módulos com 'model.0.' - 'model.9.' nos seus nomes:

python train.py --freeze 10

Congelar todas as camadas

Para congelar o modelo completo, exceto as camadas de convolução de saída final em Detect(), definimos a lista de congelamento para conter todos os módulos com 'model.0.' - 'model.23.' nos seus nomes:

python train.py --freeze 24

Resultados

Treinamos o YOLOv5m no COV em ambos os cenários acima referidos, juntamente com um modelo por defeito (sem congelamento), a partir do modelo oficial COCO pré-treinado --weights yolov5m.pt:

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

Comparação da precisão

Os resultados mostram que o congelamento acelera o treino, mas reduz ligeiramente a precisão final.

Resultados do treino de congelação mAP50

Resultados do treino de congelação mAP50-95

Resultados do quadro

Comparação de utilização de GPU

Curiosamente, quanto mais módulos são congelados, menos memória da GPU é necessária para treinar e menor é a utilização da GPU. Isso indica que modelos maiores ou modelos treinados em tamanho de imagem maior podem se beneficiar do congelamento para treinar mais rapidamente.

Percentagem de memória atribuída à GPU de treino

Percentagem de utilização da memória da GPU de treino

Ambientes suportados

Ultralytics fornece uma gama de ambientes prontos a utilizar, cada um pré-instalado com dependências essenciais como CUDA, CUDNN, Python, e PyTorchpara dar início aos teus projectos.

Estado do projeto

YOLOv5 CI

Este emblema indica que todos os testes de Integração Contínua (CI) do YOLOv5 GitHub Actions foram aprovados com êxito. Esses testes de CI verificam rigorosamente a funcionalidade e o desempenho do YOLOv5 em vários aspectos principais: treinamento, validação, inferência, exportação e benchmarks. Eles garantem uma operação consistente e confiável no macOS, Windows e Ubuntu, com testes realizados a cada 24 horas e a cada novo commit.



Criado em 2023-11-12, Atualizado em 2024-01-14
Autores: glenn-jocher (4)

Comentários