Salta para o conteúdo

Evolução dos hiperparâmetros

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 (AG) para a otimização.

Os hiperparâmetros em ML controlam vários aspectos do treino, e encontrar valores óptimos para eles pode ser um desafio. Os métodos tradicionais, como as pesquisas em grelha, podem tornar-se rapidamente intratáveis devido: 1) à elevada dimensão do espaço de pesquisa; 2) às correlações desconhecidas entre as dimensões; e 3) à natureza dispendiosa da avaliação da aptidão em cada ponto, o que torna o AG um candidato adequado para pesquisas de hiperparâmetros.

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

1. Inicializa os hiperparâmetros

YOLOv5 tem cerca de 30 hiperparâmetros utilizados para várias definições de treino. Estes são definidos em *.yaml ficheiros na pasta /data/hyps diretório. Se tiveres uma melhor estimativa inicial, obterás melhores resultados finais, pelo que é importante inicializar estes valores corretamente antes de evoluir. Em caso de dúvida, utiliza simplesmente os valores por defeito, que estão optimizados para YOLOv5 COCO training from scratch.

# 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. Define Fitness

A aptidão é o valor que procuramos maximizar. Em YOLOv5 , definimos uma função de adequação 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 restantes 90%, com Precisão P e Recall R ausente. Podes ajustá-las como achares melhor ou usar a definição de fitness predefinida em utils/metrics.py (recomendado).

def fitness(x):
    # Model fitness as a weighted combination of metrics
    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. Evolui

A evolução é efectuada sobre um cenário de base que procuramos melhorar. O cenário de base neste exemplo é o ajuste fino do COCO128 para 10 épocas usando YOLOv5s pré-treinados. O comando de treino do cenário base é:

python train.py --epochs 10 --data coco128.yaml --weights yolov5s.pt --cache

Para fazer evoluir os hiperparâmetros específico para este cenáriopartindo dos nossos valores iniciais definidos em Secção 1.e maximizando a aptidão definida em Secção 2., anexa --evolve:

# Single-GPU
python train.py --epochs 10 --data coco128.yaml --weights yolov5s.pt --cache --evolve

# Multi-GPU
for i in 0 1 2 3 4 5 6 7; do
  sleep $(expr 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

# Multi-GPU bash-while (not recommended)
for i in 0 1 2 3 4 5 6 7; do
  sleep $(expr 30 \* $i) &&  # 30-second delay (optional)
  echo 'Starting GPU '$i'...' &&
  "$(while true; do nohup python train.py... --device $i --evolve 1 > evolve_gpu_$i.log; done)" &
done

Com as definições de evolução por defeito, executa o cenário base 300 vezes, ou seja, 300 gerações. Podes modificar as gerações através do botão --evolve argumento, ou seja python train.py --evolve 1000.

Os principais operadores genéticos são crossover e mutação. Neste trabalho é utilizada a mutação, com uma probabilidade de 80% e uma variância de 0,04, para criar novos descendentes com base numa combinação dos melhores pais de todas as gerações anteriores. Os resultados são registados em runs/evolve/exp/evolve.csve a descendência de maior aptidão é guardada em 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 os melhores resultados. Nota que a evolução é geralmente dispendiosa e demorada, uma vez que o cenário de base é treinado centenas de vezes, exigindo possivelmente centenas ou milhares de horas de GPU.

4. Visualiza

evolve.csv é representado como evolve.png por utils.plots.plot_evolve() depois de terminada a evolução, com uma subparcela por hiperparâmetro mostrando a aptidão (eixo dos y) versus os valores dos hiperparâmetros (eixo dos x). O amarelo indica concentrações mais elevadas. As distribuições verticais indicam que um parâmetro foi desativado e não sofre mutação. Isto é selecionável pelo utilizador na opção meta em train.py, e é útil para fixar parâmetros e evitar que evoluam.

evoluir

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.

Estado do projeto

YOLOv5 CI

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.



Criado em 2023-11-12, Atualizado em 2023-12-03
Autores: glenn-jocher (2)

Comentários