Como fazer o ajuste fino (fine-tuning) do YOLO em um conjunto de dados personalizado#
Fine-tuning adapta um modelo pré-treinado para reconhecer novas classes começando a partir de pesos aprendidos em vez de inicialização aleatória. Em vez de treinar do zero por centenas de épocas, o fine-tuning aproveita os recursos pré-treinados do COCO e converge em dados personalizados em uma fração do tempo.
Este guia aborda o fine-tuning de YOLO26 em datasets personalizados, desde o uso básico até técnicas avançadas como layer freezing e two-stage training.
Fine-Tuning vs. Treinamento do zero#
Um modelo pré-treinado já aprendeu recursos visuais gerais - detecção de bordas, reconhecimento de textura, compreensão de formas - a partir de milhões de imagens. O Transfer learning por meio do fine-tuning reutiliza esse conhecimento e apenas ensina ao modelo a aparência das novas classes, e é por isso que ele converge mais rápido e exige menos dados. O treinamento do zero descarta tudo isso e força o modelo a aprender tudo desde padrões de nível de pixel, o que exige significativamente mais recursos.
| Ajuste Fino | Treinamento do zero | |
|---|---|---|
| Pesos iniciais | Pré-treinado no COCO (80 classes) | Inicialização aleatória |
| Comando | YOLO("yolo26n.pt") | YOLO("yolo26n.yaml") |
| Convergência | Mais rápida - a backbone já está treinada | Mais lenta - todas as camadas aprendem do zero |
| Requisitos de dados | Menores - características pré-treinadas compensam a falta de dados | Maiores - o modelo deve aprender todas as características apenas a partir do conjunto de dados |
| Quando usar | Classes personalizadas com imagens naturais | Domínios fundamentalmente diferentes do COCO (médico, satélite, radar) |
Quando um arquivo .pt é carregado com YOLO("yolo26n.pt"), os pesos pré-treinados são armazenados no modelo. Chamar .train(data="custom.yaml") depois disso transfere automaticamente todos os pesos compatíveis para a nova arquitetura do modelo, reinicializa quaisquer camadas que não correspondam (como o cabeçote de detecção quando o número de classes difere) e inicia o treinamento. Nenhum carregamento manual de pesos, manipulação de camadas ou código de transfer learning personalizado é necessário.
Como funciona a transferência de pesos pré-treinados#
Quando um modelo pré-treinado passa por fine-tuning em um conjunto de dados com um número diferente de classes (por exemplo, de 80 classes do COCO para 5 classes personalizadas), a Ultralytics realiza uma transferência de pesos consciente da forma (shape-aware):
- Backbone e neck transferem totalmente - estas camadas extraem características visuais gerais e suas formas são independentes do número de classes.
- O cabeçote de detecção é parcialmente reinicializado - as camadas de saída de classificação (
cv3,one2one_cv3) têm formas vinculadas à contagem de classes (80 vs 5), portanto, elas não podem ser transferidas e são inicializadas aleatoriamente. As camadas de regressão de caixa (cv2,one2one_cv2) no cabeçote têm formas fixas, independentemente da contagem de classes, portanto, elas são transferidas normalmente. - A vasta maioria dos pesos é transferida ao alterar a contagem de classes. Por exemplo, o fine-tuning do YOLO26n do COCO (80 classes) para um conjunto de dados de 5 classes transfere 606 de 708 tensores de peso: apenas as camadas de classificação dependentes da contagem de classes são reinicializadas, enquanto a backbone, o neck e os ramos de regressão de caixa permanecem intactos.
Para conjuntos de dados com o mesmo número de classes que o modelo pré-treinado (por exemplo, fazer fine-tuning de pesos pré-treinados no COCO em outro conjunto de dados de 80 classes), 100% dos pesos são transferidos, incluindo a cabeça de detecção.
Transfere Classes com Aliases de Nomes#
O Ultralytics transfere linhas correspondentes da camada de classificação por nome de classe entre datasets, ignorando maiúsculas/minúsculas e espaços em branco ao redor. Quando classes equivalentes usam nomes diferentes, renomeia as classes do checkpoint de origem na memória antes de carregar. Isso preserva os pesos de classificação pré-treinados para conceitos compartilhados que, de outra forma, seriam tratados como não correspondentes e inicializados aleatoriamente.
Este exemplo de Objects365 v2 para COCO renomeia as classes de origem no checkpoint carregado, que train() então repassa como os pesos pré-treinados:
from ultralytics import YOLO
# Source Objects365 v2 name -> target COCO name
ALIASES = {
"wild bird": "bird",
"handbag/satchel": "handbag",
"luggage": "suitcase",
"bowl/basin": "bowl",
"orange/tangerine": "orange",
"monitor/tv": "tv",
"stuffed toy": "teddy bear",
"hair dryer": "hair drier",
}
model = YOLO("path/to/yolo26s-objects365.pt")
model.model.names = {i: ALIASES.get(name, name) for i, name in model.model.names.items()}
model.train(data="coco.yaml", epochs=100, imgsz=640)Exemplo básico de fine-tuning#
from ultralytics import YOLO
model = YOLO("yolo26n.pt") # load pretrained model
model.train(data="custom.yaml", epochs=50, imgsz=640)Escolhendo um tamanho de modelo#
Modelos maiores têm mais capacidade, mas também mais parâmetros para atualizar, o que pode aumentar o risco de overfitting quando os dados de treinamento são limitados. Começar com um modelo menor (YOLO26n ou YOLO26s) e aumentar a escala apenas se as métricas de validação estagnarem é uma abordagem prática. O tamanho ideal do modelo depende da complexidade da tarefa, do número de classes, da diversidade do dataset e do hardware disponível para implantação. Consulte a página do modelo YOLO26 completa para tamanhos disponíveis e benchmarks de desempenho.
Seleção de otimizador e taxa de aprendizado#
A configuração padrão optimizer=auto seleciona o otimizador e a taxa de aprendizado com base no número total de iterações de treinamento:
- < 10.000 iterações (pequenos conjuntos de dados ou poucas épocas): AdamW com uma taxa de aprendizado baixa, calculada automaticamente
- > 10.000 iterações (datasets grandes): MuSGD (um otimizador híbrido Muon+SGD) com lr=0,01
Para a maioria das tarefas de fine-tuning, a configuração padrão funciona bem sem qualquer ajuste manual. Considere definir o otimizador explicitamente quando:
- O treinamento está instável (picos de perda ou divergência): tente
optimizer=AdamW, lr0=0.001para uma convergência mais estável - Fazendo fine-tuning de um modelo grande em um dataset pequeno: uma taxa de aprendizado menor, como
lr0=0.001, ajuda a preservar os recursos pré-treinados
Quando optimizer=auto, os valores de lr0 e momentum são ignorados. Para controlar a taxa de aprendizado manualmente, defina o otimizador explicitamente: optimizer=SGD, lr0=0.005.
Congelando camadas#
O congelamento impede que camadas específicas sejam atualizadas durante o treinamento. Isso acelera o treinamento e reduz o overfitting quando o dataset é pequeno em relação à capacidade do modelo.
O parâmetro freeze aceita um número inteiro ou uma lista. Um número inteiro freeze=10 congela as primeiras 10 camadas (índices 0-9), o que cobre a maior parte do backbone do YOLO26. O backbone abrange as camadas 0-10, portanto, freeze=10 deixa o bloco C2PSA final (camada 10) treinable; use freeze=11 para congelar todo o backbone. Uma lista pode conter índices de camadas como freeze=[0, 3, 5] para o congelamento parcial do backbone, ou strings de nomes de módulos como freeze=["23.cv2", "23.one2one_cv2"] para controle refinado sobre ramificações específicas dentro de uma camada (aqui, ambas as ramificações de regressão de caixa do cabeçote de detecção).
model.train(data="custom.yaml", epochs=50, freeze=10)A profundidade correta de congelamento depende de quão semelhante o domínio de destino é aos dados pré-treinados e de quantos dados de treinamento estão disponíveis:
| Cenário | Recomendação | Fundamentação |
|---|---|---|
| Grande conjunto de dados, domínio semelhante | freeze=None (padrão) | Dados suficientes para adaptar todas as camadas sem overfitting |
| Pequeno conjunto de dados, domínio semelhante | freeze=10 | Preserva as características da backbone, reduz os parâmetros treináveis |
| Conjunto de dados muito pequeno | freeze=23 | Apenas a cabeça de detecção é treinada, minimizando o risco de overfitting |
| Domínio muito diferente do COCO | freeze=None | As características da backbone podem não ser transferidas bem e precisam de retreinamento |
A profundidade de congelamento também pode ser tratada como um hiperparâmetro - tentar alguns valores (0, 5, 10) e comparar o mAP de validação é uma forma prática de encontrar a melhor configuração para um conjunto de dados específico.
Principais hiperparâmetros para fine-tuning#
O fine-tuning geralmente requer menos ajustes de hiperparâmetros do que o treinamento do zero. Os parâmetros que mais importam são:
epochs: O fine-tuning converge mais rápido do que o treinamento do zero. Comece com um valor moderado e usepatiencepara parar mais cedo quando as métricas de validação estagnarem.patience: O padrão de 100 foi projetado para execuções longas de treinamento. Reduzir isso para 10-20 evita desperdiçar tempo em execuções que já convergiram.warmup_epochs: O aquecimento padrão (3 épocas) aumenta gradualmente a taxa de aprendizado a partir de zero, o que evita que grandes atualizações de gradiente danifiquem os recursos pré-treinados nas primeiras iterações. Recomenda-se manter o padrão mesmo para o fine-tuning.
Para ver a lista completa de parâmetros de treinamento, consulte a referência de configuração de treinamento.
Fine-tuning em dois estágios#
O fine-tuning em dois estágios divide o treinamento em duas fases. O primeiro estágio congela a backbone e treina apenas o neck e a cabeça, permitindo que as camadas de detecção se adaptem às novas classes sem interromper as características pré-treinadas. O segundo estágio descongela todas as camadas e treina o modelo completo com uma taxa de aprendizado menor para refinar a backbone para o domínio de destino.
Essa abordagem é particularmente útil quando o domínio de destino difere significativamente do COCO (imagens médicas, imagens aéreas, microscopia), onde o backbone pode precisar de adaptação, mas treinar tudo de uma vez causa instabilidade. Para o descongelação automática com uma abordagem baseada em callback, consulte Freezing and Unfreezing the Backbone.
from ultralytics import YOLO
# Stage 1: freeze backbone, train head and neck
model = YOLO("yolo26n.pt")
model.train(data="custom.yaml", epochs=20, freeze=10, name="stage1", exist_ok=True)
# Stage 2: unfreeze all, fine-tune with lower lr
model = YOLO("runs/detect/stage1/weights/best.pt")
model.train(data="custom.yaml", epochs=30, lr0=0.001, name="stage2", exist_ok=True)Problemas comuns#
Modelo não produz previsões#
- Dados de treinamento insuficientes: treinar com pouquíssimas amostras é a causa mais comum - o modelo não consegue aprender ou generalizar com poucos dados. Garanta exemplos diversos suficientes por classe antes de investigar outras causas.
- Verificar os caminhos do dataset: caminhos incorretos em
data.yamlproduzem silenciosamente zero rótulos. Executeyolo detect val model=yolo26n.pt data=custom.yamlantes do treinamento para confirmar se os rótulos são carregados corretamente. - Diminuir o limite de confiança: se as previsões existirem, mas forem filtradas, tente
conf=0.1durante a inferência. - Verificar a contagem de classes: certifique-se de que
ncemdata.yamlcorresponda ao número real de classes nos arquivos de rótulos.
mAP de validação estagna precocemente#
- Adicione mais dados: o fine-tuning se beneficia significativamente de dados de treinamento adicionais, especialmente exemplos diversos com ângulos, iluminação e planos de fundo variados.
- Verificar o balanceamento de classes: classes sub-representadas terão AP baixo. Use
cls_pwpara aplicar a ponderação de classe por frequência inversa (comece comcls_pw=0.25para desequilíbrio moderado, aumente para1.0para desequilíbrio grave). - Reduzir a augmentação: para datasets muito pequenos, augmentações pesadas podem atrapalhar mais do que ajudar. Tente
mosaic=0.5oumosaic=0.0. - Aumentar a resolução: para datasets com objetos pequenos, tente
imgsz=1280para preservar os detalhes.
O desempenho degrada nas classes originais após o fine-tuning#
Isso é conhecido como esquecimento catastrófico - o modelo perde o conhecimento aprendido anteriormente quando ajustado exclusivamente em novos dados. O esquecimento é quase inevitável sem incluir imagens do conjunto de dados original junto com os novos dados. Para mitigar isso:
- Mescle conjuntos de dados: inclua exemplos das classes originais junto com as novas classes durante o fine-tuning. Esta é a única maneira confiável de evitar o esquecimento.
- Congele backbone e neck: congelar tanto a backbone quanto o neck para que apenas a cabeça de detecção treine ajuda em execuções curtas de fine-tuning com uma taxa de aprendizado muito baixa.
- Treine por menos épocas: quanto mais tempo o modelo treina exclusivamente em novos dados, mais o esquecimento aumenta.
FAQ#
Não há um mínimo fixo - os resultados dependem da complexidade da tarefa, do número de classes e de quão semelhante o domínio é ao COCO. Imagens mais diversas (iluminação, ângulos, planos de fundo variados) importam mais do que a quantidade bruta. Comece com o que você tem e aumente a escala se as métricas de validação forem insuficientes.
Carregue um arquivo
.ptpré-treinado e chame.train()com o caminho para umdata.yamlpersonalizado. O Ultralytics lida automaticamente com a transferência de pesos, a reinicialização do cabeçote de detecção e a seleção do otimizador. Consulte a seção Basic Fine-Tuning para ver o exemplo de código completo.As causas mais comuns são caminhos incorretos em
data.yaml(o que produz silenciosamente zero rótulos), uma incompatibilidade entrencno YAML e os arquivos de rótulos reais, ou um limite de confiança muito alto. Consulte Common Pitfalls para obter uma lista de verificação completa de solução de problemas.Isso depende do tamanho do dataset e da semelhança de domínio. Para datasets pequenos com um domínio semelhante ao COCO, congelar o backbone (
freeze=10) evita o overfitting. Para domínios muito diferentes do COCO, deixar todas as camadas descongeladas (freeze=None) permite que o backbone se adapte. Consulte Freezing Layers para obter recomendações detalhadas.Inclua exemplos das classes originais nos dados de treinamento junto com as novas classes. Se isso não for possível, congelar mais camadas (
freeze=10ou superior) e usar uma taxa de aprendizado menor ajuda a preservar o conhecimento pré-treinado. Consulte Performance degrades on original classes para obter mais detalhes.