Dicas para obter os melhores resultados de treino com YOLOv5

📚 Este guia explica como produzir os melhores resultados de mAP e de treino com YOLOv5 🚀.

Na maioria das vezes, bons resultados podem ser obtidos sem alterações nos modelos ou nas configurações de treino, desde que o seu conjunto de dados seja suficientemente grande e bem rotulado. Se a princípio não obtiver bons resultados, existem passos que podes seguir para melhorar, mas recomendamos sempre que os utilizadores comecem por treinar com todas as definições padrão antes de considerar qualquer alteração. Isto ajuda a estabelecer uma linha de base de desempenho e a identificar áreas para melhoria.

Se tiveres dúvidas sobre os teus resultados de treino, recomendamos que forneças a maior quantidade de informações possível se esperas uma resposta útil, incluindo gráficos de resultados (perdas de treino, perdas de validação, P, R, mAP), curva PR, matriz de confusão, mosaicos de treino, resultados de teste e imagens de estatísticas do conjunto de dados, como labels.png. Todos estes elementos encontram-se no teu diretório project/name, tipicamente yolov5/runs/train/exp.

Reunimos um guia completo para os utilizadores que pretendem obter os melhores resultados nos seus treinos com YOLOv5 abaixo.

Conjunto de Dados

  • Imagens por classe. ≥ 1500 imagens por classe recomendado
  • Instâncias por classe. ≥ 10000 instâncias (objetos rotulados) por classe recomendado
  • Variedade de imagens. Deve ser representativa do ambiente onde será implementado. Para casos de uso no mundo real, recomendamos imagens de diferentes alturas do dia, diferentes estações do ano, diferentes condições meteorológicas, diferentes iluminações, diferentes ângulos, diferentes fontes (obtidas online, recolhidas localmente, diferentes câmaras), etc.
  • Consistência dos rótulos. Todas as instâncias de todas as classes em todas as imagens devem ser rotuladas. A rotulagem parcial não funcionará.
  • Precisão dos rótulos. Os rótulos devem envolver estreitamente cada objeto. Não deve existir espaço entre um objeto e a sua caixa delimitadora. Não devem faltar rótulos em nenhum objeto.
  • Disciplina na divisão de treino/validação. Garante que as imagens de validação e teste nunca aparecem no conjunto de treino para evitar métricas excessivamente otimistas. Mantém as distribuições de classes semelhantes entre as divisões.
  • Verificação de rótulos. Observa train_batch*.jpg no início do treino para verificar se os teus rótulos parecem corretos, isto é, vê o mosaico de exemplo.
  • Imagens de fundo. Imagens de fundo são imagens sem objetos que são adicionadas a um conjunto de dados para reduzir Falsos Positivos (FP). Recomendamos cerca de 0-10% de imagens de fundo para ajudar a reduzir os FPs (o COCO tem 1000 imagens de fundo para referência, 1% do total). Não são necessários rótulos para imagens de fundo.

COCO dataset class distribution analysis

Seleção do Modelo

Modelos maiores como YOLOv5x e YOLOv5x6 produzirão melhores resultados em quase todos os casos, mas têm mais parâmetros, requerem mais memória CUDA para treinar e são mais lentos a executar. Para implementações móveis recomendamos YOLOv5s/m, para implementações em cloud recomendamos YOLOv5l/x. Vê a nossa tabela no README para uma comparação completa de todos os modelos.

YOLOv5 Models

  • Começar a partir de pesos pré-treinados. Recomendado para conjuntos de dados de pequena a média dimensão (ex.: VOC, VisDrone, GlobalWheat). Passa o nome do modelo para o argumento --weights. Os modelos são transferidos automaticamente a partir do lançamento mais recente do YOLOv5.

    python train.py --data custom.yaml --weights yolov5s.pt
    python train.py --data custom.yaml --weights yolov5m.pt
    python train.py --data custom.yaml --weights yolov5l.pt
    python train.py --data custom.yaml --weights yolov5x.pt
    python train.py --data custom.yaml --weights custom_pretrained.pt
  • Começar do zero. Recomendado para conjuntos de dados grandes (ex.: COCO, Objects365, OIv6). Passa o YAML da arquitetura do modelo em que estás interessado, juntamente com um argumento vazio --weights '':

    python train.py --data custom.yaml --weights '' --cfg yolov5s.yaml
    python train.py --data custom.yaml --weights '' --cfg yolov5m.yaml
    python train.py --data custom.yaml --weights '' --cfg yolov5l.yaml
    python train.py --data custom.yaml --weights '' --cfg yolov5x.yaml

Definições de Treino

Antes de modificar qualquer coisa, treina primeiro com as definições padrão para estabelecer uma linha de base de desempenho. Uma lista completa das definições de train.py pode ser encontrada no argparser de train.py.

  • Épocas. Começa com 300 épocas. Se isto causar sobreajuste (overfitting) precocemente, podes reduzir as épocas. Se o sobreajuste não ocorrer após 300 épocas, treina por mais tempo, por exemplo, 600, 1200 épocas, etc.
  • Tamanho da imagem. O COCO treina na resolução nativa de --img 640, embora devido à grande quantidade de pequenos objetos no conjunto de dados, possa beneficiar de treino em resoluções mais elevadas, como --img 1280. Se houver muitos objetos pequenos, conjuntos de dados personalizados beneficiarão de treino na resolução nativa ou superior. Os melhores resultados de inferência são obtidos com o mesmo --img usado no treino; isto é, se treinares com --img 1280, deves também testar e detetar com --img 1280.
  • Tamanho do lote. Usa o maior --batch-size que o teu hardware permitir. Tamanhos de lote pequenos produzem estatísticas de normalização de lote fracas e devem ser evitados. Podes usar --batch-size -1 para selecionar automaticamente o tamanho de lote ideal para o teu GPU.
  • Taxa de aprendizagem. O agendamento padrão da taxa de aprendizagem funciona bem na maioria dos casos. Para uma convergência mais rápida, podes tentar usar o sinalizador --cos-lr para ativar o agendamento de taxa de aprendizagem de cosseno, que reduz gradualmente a taxa de aprendizagem seguindo uma curva de cosseno ao longo das épocas.
  • Aumento de dados. O YOLOv5 inclui várias técnicas de aumento como o mosaico, que combina múltiplas imagens de treino. Para as últimas épocas, considera usar --close-mosaic 10 para desativar o aumento de mosaico, o que pode ajudar a estabilizar o treino.
  • Hiperparâmetros. Os hiperparâmetros padrão estão em hyp.scratch-low.yaml. Recomendamos que treines com os hiperparâmetros padrão primeiro antes de pensar em modificar qualquer um. Em geral, aumentar os hiperparâmetros de aumento reduzirá e atrasará o sobreajuste, permitindo treinos mais longos e um mAP final mais elevado. A redução em hiperparâmetros de ganho de componentes de perda como hyp['obj'] ajudará a reduzir o sobreajuste nesses componentes de perda específicos. Para um método automatizado de otimização destes hiperparâmetros, consulta o nosso Tutorial de Evolução de Hiperparâmetros.
  • Treino de precisão mista. Ativa o treino de precisão mista com --amp para acelerar o treino e reduzir o uso de memória sem sacrificar a precisão do modelo.
  • Treino com múltiplos GPUs. Se tiveres múltiplos GPUs, usa --device 0,1,2,3 para distribuir o treino entre eles, o que pode reduzir significativamente o tempo de treino.
  • Paragem antecipada (Early stopping). Usa --patience 50 para parar o treino se as métricas de validação não melhorarem durante 50 épocas, poupando tempo e prevenindo o sobreajuste.

Técnicas de Otimização Avançadas

  • Transfer learning. Para conjuntos de dados especializados, começa com pesos pré-treinados e descongela camadas gradualmente durante o treino para adaptar o modelo à tua tarefa específica.
  • Poda de modelo. Após o treino, considera podar o teu modelo para remover pesos redundantes e reduzir o tamanho do modelo sem perda significativa de desempenho.
  • Conjunto de modelos (ensemble). Para aplicações críticas, treina múltiplos modelos com diferentes configurações e combina as suas previsões para melhorar a precisão.
  • Aumento em tempo de teste. Ativa TTA durante a inferência com --augment para melhorar a precisão da previsão ao fazer a média dos resultados de versões aumentadas da imagem de entrada.

Leitura Adicional

Se quiseres saber mais, um bom ponto de partida é a 'Receita para Treinar Redes Neuronais' de Karpathy, que tem ótimas ideias para treino que se aplicam amplamente em todos os domínios de ML: https://karpathy.github.io/2019/04/25/recipe/

Para informações mais detalhadas sobre definições e configurações de treino, consulta a documentação de definições de treino da Ultralytics, que fornece explicações abrangentes de todos os parâmetros disponíveis.

Boa sorte 🍀 e diz-nos se tiveres outras dúvidas!

FAQ

Como sei se o meu modelo está com sobreajuste (overfitting)?

O teu modelo pode estar com sobreajuste se a perda de treino continuar a diminuir enquanto a perda de validação começar a aumentar. Monitoriza o mAP de validação - se ele estagnar ou diminuir enquanto a perda de treino continua a melhorar, esse é um sinal de sobreajuste. As soluções incluem adicionar mais dados de treino, aumentar o aumento de dados ou implementar técnicas de regularização.

Qual é o tamanho de lote ideal para treinar YOLOv5?

O tamanho de lote ideal depende da memória do teu GPU. Tamanhos de lote maiores geralmente fornecem melhores estatísticas de normalização de lote e estabilidade de treino. Usa o maior tamanho de lote que o teu hardware consegue suportar sem ficar sem memória. Podes usar --batch-size -1 para determinar automaticamente o tamanho de lote ideal para a tua configuração.

Como posso acelerar o treino do YOLOv5?

Para acelerar o treino, tenta: ativar o treino de precisão mista com --amp, usar múltiplos GPUs com --device 0,1,2,3, colocar o teu conjunto de dados em cache com --cache e otimizar o teu tamanho de lote. Considera também usar uma variante de modelo mais pequena, como o YOLOv5s, se a precisão absoluta não for crítica.

Comentários