Saltar 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 no 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) ao espaço de pesquisa de elevada dimensão; 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çar

Clonar repo e instalar 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 recentede YOLOv5 .

git clone https://github.com/ultralytics/yolov5  # clone
cd yolov5
pip install -r requirements.txt  # install

1. Inicializar 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 no /data/hyps diretório. Melhores suposições iniciais produzirão melhores resultados finais, por isso é importante inicializar esses valores corretamente antes de evoluir. Em caso de dúvida, basta utilizar os valores predefinidos, que sã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. Definir aptidão física

A aptidão é o valor que procuramos maximizar. Em YOLOv5 , definimos uma função de aptidão predefinida 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. Pode ajustá-las como achar melhor ou utilizar a definição de fitness predefinida 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 é 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 de base é:

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

Para fazer evoluir os hiperparâmetros específico para este cenário, partindo dos nossos valores iniciais definidos em Secção 1.e maximizando a aptidão definida em Secção 2., anexar --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

As definições de evolução predefinidas executam 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 melhores resultados. Note-se que a evolução é geralmente dispendiosa e morosa, uma vez que o cenário de base é treinado centenas de vezes, exigindo possivelmente centenas ou milhares de GPU horas.

4. Visualize

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 impedir a sua evolução.

evoluir

Ambientes suportados

Ultralytics fornece uma gama de ambientes prontos a utilizar, cada um pré-instalado com dependências essenciais, tais como CUDA, CUDNN, Python, e PyTorchpara dar início aos seus projectos.

Estado do projeto

YOLOv5 IC

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.

📅C riado há 1 ano ✏️ Atualizado há 1 mês

Comentários