Como ajustar YOLO conjunto de dados personalizado
O ajuste fino adapta um modelo pré-treinado para reconhecer novas classes, partindo dos pesos já aprendidos em vez de uma inicialização aleatória. Em vez de treinar do zero durante centenas de épocas, o ajuste fino aproveita o modelo pré-treinado COCO e converge para dados personalizados numa fração do tempo.
Este guia aborda o ajuste fino do YOLO26 em conjuntos de dados personalizados, desde a utilização básica até técnicas avançadas, como o congelamento de camadas e o treino em duas fases.
Ajuste fino vs. treino a partir do zero
Um modelo pré-treinado já aprendeu características visuais gerais — deteção de contornos, reconhecimento de texturas, compreensão de formas — a partir de milhões de imagens. A aprendizagem por transferência através do ajuste fino reutiliza esse conhecimento e limita-se a ensinar ao modelo a aparência das novas classes, razão pela qual converge mais rapidamente e requer menos dados. O treino a partir do zero descarta tudo isso e obriga o modelo a aprender tudo, desde os padrões ao nível dos píxeis, o que exige significativamente mais recursos.
| Ajuste Fino | Formação desde o início | |
|---|---|---|
| Peso inicial | Pré-treinado no COCO 80 classes) | Inicialização aleatória |
| Comando | YOLO("yolo26n.pt") | YOLO("yolo26n.yaml") |
| Convergência | Mais rápido - a rede principal já está treinada | Mais lento - todas as camadas aprendem do zero |
| Requisitos de dados | Menos — as características pré-treinadas compensam a menor quantidade de dados | Mais avançado - o modelo deve aprender todas as características apenas a partir do conjunto de dados |
| Quando utilizar | Classes personalizadas com imagens da natureza | Áreas fundamentalmente diferentes da COCO medicina, satélites, radares) |
O ajuste fino não requer código adicional
Quando um .pt o ficheiro é carregado com YOLO("yolo26n.pt"), os pesos pré-treinados são armazenados no modelo. Ao chamar .train(data="custom.yaml") Em seguida, transfere automaticamente todos os pesos compatíveis para a nova arquitetura do modelo, reinicializa quaisquer camadas que não correspondam (como a camada de deteção, quando o número de classes difere) e inicia o treino. Não é necessário carregar pesos manualmente, manipular camadas nem utilizar código personalizado de aprendizagem por transferência.
Como funciona a transferência de pesos pré-treinados
Quando um modelo pré-treinado é ajustado num conjunto de dados com um número diferente de classes (por exemplo, das 80 classes COCO para 5 classes personalizadas), Ultralytics uma transferência de pesos sensível à forma:
- Transferência total da coluna vertebral e do pescoço — estas camadas extraem características visuais gerais e as suas formas são independentes do número de classes.
- A cabeça de deteção foi parcialmente reinicializada - as camadas de saída de classificação (
cv3,one2one_cv3) têm formas ligadas ao número de classes (80 contra 5), pelo que não podem ser transferidas e são inicializadas aleatoriamente. Camadas de regressão de caixas (cv2,one2one_cv2) na cabeça têm formas fixas, independentemente do número de classes, pelo que são transferidas normalmente. - A grande maioria dos pesos é transferida quando se altera o número de classes. Apenas as camadas específicas da classificação na cabeça de deteção são reinicializadas — as ramificações da estrutura principal, do pescoço e da regressão de caixas permanecem intactas.
No caso de conjuntos de dados com o mesmo número de classes que o modelo pré-treinado (por exemplo, o ajuste fino de pesos COCO num outro conjunto de dados com 80 classes), 100% dos pesos são transferidos, incluindo a cabeça de deteção.
Exemplo básico de ajuste fino
Exemplo
from ultralytics import YOLO
model = YOLO("yolo26n.pt") # load pretrained model
model.train(data="path/to/data.yaml", epochs=50, imgsz=640)
yolo detect train model=yolo26n.pt data=path/to/data.yaml epochs=50 imgsz=640
Escolher o tamanho do modelo
Os modelos maiores têm mais capacidade, mas também mais parâmetros para atualizar, o que pode aumentar o risco de sobreajuste quando os dados de treino são limitados. Começar com um modelo mais pequeno (YOLO26n ou YOLO26s) e só aumentar a escala se as métricas de validação atingirem um patamar é uma abordagem prática. O tamanho ideal do modelo depende da complexidade da tarefa, do número de classes, da diversidade do conjunto de dados e do hardware disponível para implementação. Consulte a página completa do modelo YOLO26 para conhecer os tamanhos disponíveis e os benchmarks de desempenho.
Seleção do otimizador e da taxa de aprendizagem
O padrão optimizer=auto Esta configuração seleciona o otimizador e a taxa de aprendizagem com base no número total de iterações de treino:
- < 10,000 iterations (small datasets or few epochs): AdamW with a low, auto-calculated learning rate
- > 10 000 iterações (conjuntos de dados de grande dimensão): MuSGD (umSGD híbridoSGD ) com lr=0,01
Para a maioria das tarefas de ajuste fino, a configuração padrão funciona bem sem qualquer ajuste manual. Considere definir o otimizador explicitamente quando:
- O treino está instável (picos ou divergências na perda): tente
optimizer=AdamW, lr0=0.001para uma convergência mais estável - Ajustar um modelo de grandes dimensões com base num conjunto de dados reduzido: uma taxa de aprendizagem mais baixa, como
lr0=0.001ajuda a preservar as características pré-treinadas
O otimizador automático substitui o lr0 manual
Quando optimizer=auto, a função lr0 e momentum os valores são ignorados. Para controlar manualmente a taxa de aprendizagem, defina explicitamente o otimizador: optimizer=SGD, lr0=0.005.
Camadas congeladas
O congelamento impede que determinadas camadas sejam atualizadas durante o treino. Isto acelera o treino e reduz o sobreajuste quando o conjunto de dados é pequeno em relação à capacidade do modelo.
O freeze O parâmetro aceita um número inteiro ou uma lista. Um número inteiro freeze=10 congela as primeiras 10 camadas (de 0 a 9, o que corresponde à estrutura principal do YOLO26). Uma lista pode conter índices de camadas como freeze=[0, 3, 5] para o congelamento parcial da estrutura principal, ou cadeias de caracteres de nomes de módulos como freeze=["23.cv2"] para um controlo mais preciso sobre ramos específicos dentro de uma camada.
Exemplo
model.train(data="custom.yaml", epochs=50, freeze=10)
model.train(data="custom.yaml", epochs=50, freeze=[0, 1, 2, 3, 4])
# Freeze the box regression branch of the detection head
model.train(data="custom.yaml", epochs=50, freeze=["23.cv2"])
A profundidade de congelamento adequada depende do grau de semelhança entre o domínio alvo e os dados pré-treinados, bem como da quantidade de dados de treino disponíveis:
| Cenário | Recomendação | Fundamentação |
|---|---|---|
| Conjunto de dados extenso, domínio semelhante | freeze=None (padrão) | Dados suficientes para ajustar todas as camadas sem sobreajuste |
| Conjunto de dados pequeno, domínio semelhante | freeze=10 | Mantém as características essenciais, reduz os parâmetros treináveis |
| Conjunto de dados muito pequeno | freeze=23 | Apenas o modelo de deteção é treinado, minimizando o risco de sobreajuste |
| Domínio distante do COCO | freeze=None | As funcionalidades do Backbone podem não ser facilmente transferíveis e exigir uma nova formação |
A profundidade de congelamento também pode ser considerada um hiperparâmetro — experimentar alguns valores (0, 5, 10) e comparar mAP de validação mAP uma forma prática de encontrar a melhor configuração para um conjunto de dados específico.
Hiperparâmetros essenciais para o ajuste fino
O ajuste fino requer, geralmente, menos ajustes nos hiperparâmetros do que o treino a partir do zero. Os parâmetros mais importantes são:
epochs: O ajuste fino converge mais rapidamente do que o treino a partir do zero. Comece com um valor moderado e utilizepatienceparar mais cedo quando os indicadores de validação atingirem um patamar estável.patience: O valor padrão de 100 foi concebido para execuções de treino prolongadas. Reduzir este valor para 10-20 evita perder tempo com execuções que já convergiram.warmup_epochs: O aquecimento predefinido (3 épocas) aumenta gradualmente a taxa de aprendizagem a partir de zero, o que evita que grandes atualizações de gradiente prejudiquem as características pré-treinadas nas primeiras iterações. Recomenda-se manter a configuração predefinida, mesmo para o ajuste fino.
Para consultar a lista completa de parâmetros de treino, consulte a referência de configuração do treino.
Ajuste fino em duas fases
O ajuste fino em duas etapas divide o treino em duas fases. A primeira etapa congela a estrutura principal e treina apenas o pescoço e a cabeça, permitindo que as camadas de deteção se adaptem às novas classes sem comprometer as características pré-treinadas. A segunda etapa descongela todas as camadas e treina o modelo completo com uma taxa de aprendizagem mais baixa para aperfeiçoar a estrutura principal para o domínio alvo.
Esta abordagem é particularmente útil quando o domínio alvo difere significativamente do COCO imagens médicas, imagens aéreas, microscopia), em que a estrutura principal pode necessitar de adaptação, mas treinar tudo de uma só vez causa instabilidade. Para o desbloqueio automático com uma abordagem baseada em callbacks, consulte Congelar e desbloquear a estrutura principal.
Ajuste fino em duas fases
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)
Armadilhas comuns
O modelo não produz previsões
- Dados de treino insuficientes: o treino com muito poucas amostras é a causa mais comum — o modelo não consegue aprender nem generalizar com dados insuficientes. Certifique-se de que existem exemplos suficientemente diversificados por classe antes de investigar outras causas.
- Verificar os caminhos dos conjuntos de dados: caminhos incorretos em
data.yamlproduzir silenciosamente zero etiquetas. Executaryolo detect val model=yolo26n.pt data=your_data.yamlantes do treino, para confirmar se os rótulos carregam corretamente. - Limiar de confiança mais baixo: se existirem previsões, mas estas forem filtradas, tente
conf=0.1durante a inferência. - Verificar o número de alunos: garantir
ncemdata.yamlcorresponde ao número real de classes nos ficheiros de etiquetas.
A curva de validação mAP precoce
- Adicionar mais dados: o ajuste fino beneficia significativamente da inclusão de dados de treino adicionais, especialmente exemplos diversificados com ângulos, iluminação e fundos variados.
- Verificar o equilíbrio da turma: as classes sub-representadas terão AP baixo. Utilize
cls_pwpara aplicar a ponderação inversa da classe de frequência (começar comcls_pw=0.25em caso de desequilíbrio moderado, aumente para1.0(em caso de desequilíbrio grave). - Reduzir o aumento: no caso de conjuntos de dados muito pequenos, uma ampliação excessiva pode ser mais prejudicial do que benéfica. Experimente
mosaic=0.5oumosaic=0.0. - Aumentar a resolução: para conjuntos de dados com objetos pequenos, experimente
imgsz=1280para preservar os detalhes.
O desempenho das classes originais diminui após o ajuste fino
Este fenómeno é conhecido como «esquecimento catastrófico» — o modelo perde o conhecimento adquirido anteriormente quando é ajustado exclusivamente com base em novos dados. O esquecimento é, na maioria das vezes, inevitável se não forem incluídas imagens do conjunto de dados original juntamente com os novos dados. Para mitigar esta situação:
- Combinar conjuntos de dados: incluir exemplos das classes originais juntamente com as novas classes durante o ajuste fino. Esta é a única forma fiável de evitar o esquecimento.
- Congelar a coluna vertebral e o pescoço: congelar tanto a coluna vertebral como o pescoço, de modo a que apenas a cabeça de deteção seja treinada, ajuda em execuções curtas de ajuste fino com uma taxa de aprendizagem muito baixa.
- Treine durante menos épocas: quanto mais tempo o modelo for treinado exclusivamente com novos dados, maior será a perda de conhecimento.
FAQ
Quantas imagens preciso para ajustar YOLO?
Não existe um mínimo fixo — os resultados dependem da complexidade da tarefa, do número de classes e do grau de semelhança do domínio com COCO. Imagens mais diversificadas (iluminação, ângulos e fundos variados) são mais importantes do que a quantidade em si. Comece com o que tiver e aumente a escala se as métricas de validação forem insuficientes.
Como posso ajustar o YOLO26 num conjunto de dados personalizado?
Carregar um modelo pré-treinado .pt arquivo e chamada .train() com o caminho para um ficheiro personalizado data.yaml. Ultralytics trata Ultralytics transferência de peso, reinicialização da cabeça de deteção e seleção do otimizador. Consulte o Ajustes básicos secção para ver o exemplo de código completo.
Por que é que YOLO meu YOLO ajustado não está a detetar nada?
As causas mais comuns são caminhos incorretos em data.yaml (que, silenciosamente, não gera nenhuma etiqueta), uma incompatibilidade entre nc no YAML e nos ficheiros de rótulos propriamente ditos, ou um limiar de confiança demasiado elevado. Ver Armadilhas comuns para consultar uma lista de verificação completa de resolução de problemas.
Que YOLO devo congelar para o ajuste fino?
Depende do tamanho do conjunto de dados e da semelhança do domínio. No caso de conjuntos de dados pequenos com um domínio semelhante ao COCO, congelar a estrutura principal (freeze=10) evita o sobreajuste. Para domínios muito diferentes do COCO, deixar todas as camadas não congeladas (freeze=None) permite que a rede principal se adapte. Ver Camadas congeladas para obter recomendações detalhadas.
Como posso evitar o esquecimento catastrófico ao ajustar YOLO novas classes?
Inclua exemplos das classes originais nos dados de treino, juntamente com as novas classes. Se isso não for possível, congele mais camadas (freeze=10 (ou superior) e a utilização de uma taxa de aprendizagem mais baixa ajuda a preservar o conhecimento pré-treinado. Ver O desempenho diminui nas classes originais para mais detalhes.