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

GPU Comparação de utilização

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

Training GPU memory allocated percent

Training GPU memory utilization percent

Ambientes suportados

Ultralytics fornece uma gama de ambientes prontos a utilizar, cada um pré-instalado com dependências essenciais, tais 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-06-10
Autores: glenn-jocher (7)

Coment√°rios