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:
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:
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.
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.
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.
- Portáteis GPU gratuitos:
- Google Cloud: Guia de início rápido do GCP
- Amazon: Guia de início rápido do AWS
- Azure: Guia de início rápido do AzureML
- Docker: Guia de início rápido do Docker
Estado do projeto
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.