Evolução de Hiperparâmetros para YOLOv5
📚 Este guia explica a evolução de hiperparâmetros para YOLOv5 🚀. A evolução de hiperparâmetros é um método de Otimização de Hiperparâmetros que utiliza um Algoritmo Genético (GA) para otimização.
Os hiperparâmetros em aprendizado de máquina controlam vários aspectos do treinamento, e encontrar valores ideais para eles pode ser um desafio. Métodos tradicionais como buscas em grade podem rapidamente se tornar intratáveis devido a:
- O espaço de busca de alta dimensão
- Correlações desconhecidas entre as dimensões
- Natureza dispendiosa de avaliar a adequação em cada ponto
Isto torna os algoritmos genéticos um candidato adequado para pesquisas de hiperparâmetros.
Antes de Começar
Clone o repositório e instale os requirements.txt num ambiente Python>=3.8.0, incluindo PyTorch>=1.8. Os modelos e os conjuntos de dados são descarregados automaticamente a partir da última versão do YOLOv5.
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # install
1. Inicializar Hiperparâmetros
O YOLOv5 tem cerca de 30 hiperparâmetros usados para várias configurações de treino. Estes são definidos em *.yaml
ficheiros no /data/hyps
diretório. Melhores palpites iniciais produzirão melhores resultados finais, por isso é importante inicializar esses valores corretamente antes de evoluir. Em caso de dúvida, simplesmente use os valores padrão, que são otimizados para o treinamento YOLOv5 COCO do zero.
# YOLOv5 🚀 by Ultralytics, AGPL-3.0 license
# Hyperparameters for low-augmentation COCO training from scratch
# python train.py --batch 64 --cfg yolov5n6.yaml --weights '' --data coco.yaml --img 640 --epochs 300 --linear
# See tutorials for hyperparameter evolution https://github.com/ultralytics/yolov5#tutorials
lr0: 0.01 # initial learning rate (SGD=1E-2, Adam=1E-3)
lrf: 0.01 # final OneCycleLR learning rate (lr0 * lrf)
momentum: 0.937 # SGD momentum/Adam beta1
weight_decay: 0.0005 # optimizer weight decay 5e-4
warmup_epochs: 3.0 # warmup epochs (fractions ok)
warmup_momentum: 0.8 # warmup initial momentum
warmup_bias_lr: 0.1 # warmup initial bias lr
box: 0.05 # box loss gain
cls: 0.5 # cls loss gain
cls_pw: 1.0 # cls BCELoss positive_weight
obj: 1.0 # obj loss gain (scale with pixels)
obj_pw: 1.0 # obj BCELoss positive_weight
iou_t: 0.20 # IoU training threshold
anchor_t: 4.0 # anchor-multiple threshold
# anchors: 3 # anchors per output layer (0 to ignore)
fl_gamma: 0.0 # focal loss gamma (efficientDet default gamma=1.5)
hsv_h: 0.015 # image HSV-Hue augmentation (fraction)
hsv_s: 0.7 # image HSV-Saturation augmentation (fraction)
hsv_v: 0.4 # image HSV-Value augmentation (fraction)
degrees: 0.0 # image rotation (+/- deg)
translate: 0.1 # image translation (+/- fraction)
scale: 0.5 # image scale (+/- gain)
shear: 0.0 # image shear (+/- deg)
perspective: 0.0 # image perspective (+/- fraction), range 0-0.001
flipud: 0.0 # image flip up-down (probability)
fliplr: 0.5 # image flip left-right (probability)
mosaic: 1.0 # image mosaic (probability)
mixup: 0.0 # image mixup (probability)
copy_paste: 0.0 # segment copy-paste (probability)
2. Definir Fitness
Fitness é o valor que procuramos maximizar. No YOLOv5, definimos uma função de fitness padrão como uma combinação ponderada de métricas: mAP@0.5
contribui com 10% do peso e mAP@0.5:0.95
contribui com os 90% restantes, com Precisão P
e Recall R
ausente. Você pode ajustá-los como achar melhor ou usar a definição de fitness padrão em utils/metrics.py (recomendado).
def fitness(x):
"""Return model fitness as the sum of weighted metrics [P, R, mAP@0.5, mAP@0.5:0.95]."""
w = [0.0, 0.0, 0.1, 0.9] # weights for [P, R, mAP@0.5, mAP@0.5:0.95]
return (x[:, :4] * w).sum(1)
3. Evoluir
A evolução é realizada sobre um cenário base que buscamos aprimorar. O cenário base neste exemplo é o ajuste fino do COCO128 por 10 épocas usando o YOLOv5s pré-treinado. O comando de treinamento do cenário base é:
python train.py --epochs 10 --data coco128.yaml --weights yolov5s.pt --cache
Para evoluir os hiperparâmetros específico para este cenário, começando com nossos valores iniciais definidos em Seção 1., e maximizando o fitness definido em Seção 2., adicione --evolve
:
# Single-GPU
python train.py --epochs 10 --data coco128.yaml --weights yolov5s.pt --cache --evolve
# Multi-GPU with delay
for i in {0..7}; do
sleep $((30 * i)) # 30-second delay (optional)
echo "Starting GPU $i..."
nohup python train.py --epochs 10 --data coco128.yaml --weights yolov5s.pt --cache --device $i --evolve > "evolve_gpu_$i.log" &
done
# Continuous training (use with caution)
# for i in {0..7}; do
# sleep $((30 * i)) # 30-second delay (optional)
# echo "Starting continuous training on GPU $i..."
# (
# while true; do
# python train.py --epochs 10 --data coco128.yaml --weights yolov5s.pt --cache --device $i --evolve > "evolve_gpu_$i.log"
# done
# ) &
# done
As configurações de evolução padrão executarão o cenário base 300 vezes, ou seja, por 300 gerações. Você pode modificar as gerações através do --evolve
argumento, ou seja, python train.py --evolve 1000
.
Os principais operadores genéticos são crossover e mutação. Neste trabalho, a mutação é usada, com uma probabilidade de 80% e uma variância de 0,04 para criar novos descendentes com base em uma combinação dos melhores pais de todas as gerações anteriores. Os resultados são registrados em runs/evolve/exp/evolve.csv
, e a prole com a maior aptidão é salva a cada geração como runs/evolve/hyp_evolved.yaml
:
# YOLOv5 Hyperparameter Evolution Results
# Best generation: 287
# Last generation: 300
# metrics/precision, metrics/recall, metrics/mAP_0.5, metrics/mAP_0.5:0.95, val/box_loss, val/obj_loss, val/cls_loss
# 0.54634, 0.55625, 0.58201, 0.33665, 0.056451, 0.042892, 0.013441
lr0: 0.01 # initial learning rate (SGD=1E-2, Adam=1E-3)
lrf: 0.2 # final OneCycleLR learning rate (lr0 * lrf)
momentum: 0.937 # SGD momentum/Adam beta1
weight_decay: 0.0005 # optimizer weight decay 5e-4
warmup_epochs: 3.0 # warmup epochs (fractions ok)
warmup_momentum: 0.8 # warmup initial momentum
warmup_bias_lr: 0.1 # warmup initial bias lr
box: 0.05 # box loss gain
cls: 0.5 # cls loss gain
cls_pw: 1.0 # cls BCELoss positive_weight
obj: 1.0 # obj loss gain (scale with pixels)
obj_pw: 1.0 # obj BCELoss positive_weight
iou_t: 0.20 # IoU training threshold
anchor_t: 4.0 # anchor-multiple threshold
# anchors: 3 # anchors per output layer (0 to ignore)
fl_gamma: 0.0 # focal loss gamma (efficientDet default gamma=1.5)
hsv_h: 0.015 # image HSV-Hue augmentation (fraction)
hsv_s: 0.7 # image HSV-Saturation augmentation (fraction)
hsv_v: 0.4 # image HSV-Value augmentation (fraction)
degrees: 0.0 # image rotation (+/- deg)
translate: 0.1 # image translation (+/- fraction)
scale: 0.5 # image scale (+/- gain)
shear: 0.0 # image shear (+/- deg)
perspective: 0.0 # image perspective (+/- fraction), range 0-0.001
flipud: 0.0 # image flip up-down (probability)
fliplr: 0.5 # image flip left-right (probability)
mosaic: 1.0 # image mosaic (probability)
mixup: 0.0 # image mixup (probability)
copy_paste: 0.0 # segment copy-paste (probability)
Recomendamos um mínimo de 300 gerações de evolução para obter melhores resultados. Observe que a evolução é geralmente cara e demorada, pois o cenário base é treinado centenas de vezes, possivelmente exigindo centenas ou milhares de horas de GPU.
4. Visualizar
evolve.csv
é plotado como evolve.png
por utils.plots.plot_evolve()
após o término da evolução, com um subgráfico por hiperparâmetro mostrando a aptidão (eixo y) versus os valores do hiperparâmetro (eixo x). Amarelo indica concentrações mais altas. As distribuições verticais indicam que um parâmetro foi desativado e não sofre mutação. Isso é selecionável pelo usuário no meta
dicionário em train.py, e é útil para corrigir parâmetros e impedir que evoluam.
Ambientes suportados
A Ultralytics oferece uma variedade de ambientes prontos para uso, cada um pré-instalado com dependências essenciais como CUDA, CUDNN, Python e PyTorch, para dar o pontapé inicial em seus projetos.
- Notebooks GPU Gratuitos:
- Google Cloud: Guia de Início Rápido do GCP
- Amazon: Guia de Início Rápido AWS
- Azure: Guia de Início Rápido AzureML
- Docker: Guia de Início Rápido do Docker
Estado do Projeto
Este selo indica que todos os testes de Integração Contínua (CI) das Ações do GitHub YOLOv5 estão sendo aprovados com sucesso. 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.