Link to this sectionEvolução de hiperparâmetros para o YOLOv5#
📚 Este guia explica a evolução de hiperparâmetros para o YOLOv5 🚀. A evolução de hiperparâmetros é um método de Otimização de Hiperparâmetros que utiliza um Algoritmo Genético (AG) para otimização.
Os hiperparâmetros em machine learning controlam vários aspetos do treino, e encontrar valores ideais para eles pode ser um desafio. Métodos tradicionais, como pesquisas em grelha, podem tornar-se rapidamente impraticáveis devido a:
- O espaço de pesquisa de alta dimensionalidade
- Correlações desconhecidas entre as dimensões
- A natureza dispendiosa da avaliação da aptidão em cada ponto
Isto torna os algoritmos genéticos um candidato adequado para pesquisas de hiperparâmetros.
Link to this sectionAntes de começar#
Clona o repositório e instala o requirements.txt num ambiente Python>=3.8.0, incluindo PyTorch>=1.8. Modelos e datasets são descarregados automaticamente a partir do release mais recente do YOLOv5.
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # installLink to this section1. Inicializa os Hiperparâmetros#
O YOLOv5 tem cerca de 30 hiperparâmetros usados para várias definições de treino. Estes estão definidos em ficheiros *.yaml no diretório /data/hyps. Melhores estimativas iniciais produzirão melhores resultados finais, por isso é importante inicializar estes valores corretamente antes de evoluir. Em caso de dúvida, utiliza simplesmente os valores predefinidos, que estão otimizados para o treino 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)Link to this section2. Define a Aptidão#
A aptidão é o valor que procuramos maximizar. No 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) ausentes. Podes ajustar estes valores como achares melhor ou utilizar a definição de aptidão 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)Link to this section3. Evolui#
A evolução é realizada sobre um cenário base que procuramos melhorar. O cenário base neste exemplo é o fine-tuning do COCO128 durante 10 épocas usando o YOLOv5s pré-treinado. O comando de treino do cenário base é:
python train.py --epochs 10 --data coco128.yaml --weights yolov5s.pt --cachePara evoluir hiperparâmetros específicos para este cenário, começando a partir dos nossos valores iniciais definidos na Secção 1., e maximizando a aptidão definida na Secção 2., acrescenta --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
# ) &
# doneAs definições de evolução predefinidas executarão o cenário base 300 vezes, ou seja, durante 300 gerações. Podes modificar as gerações através do argumento --evolve, por exemplo, python train.py --evolve 1000.
Os principais operadores genéticos são crossover e mutação. Neste trabalho, a mutação é utilizada, com uma probabilidade de 80% e uma variância de 0,04 para criar nova descendência com base numa combinação dos melhores progenitores de todas as gerações anteriores. Os resultados são registados em runs/evolve/exp/evolve.csv, e a descendência com maior aptidão é guardada a cada geração como runs/evolve/exp/hyp_evolve.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 base é treinado centenas de vezes, podendo exigir centenas ou milhares de horas de GPU.
Quando a evolução terminar, reutiliza as definições descobertas apontando o treino para o ficheiro guardado, por exemplo python train.py --hyp runs/evolve/exp/hyp_evolve.yaml --data your.yaml --weights yolov5s.pt.
Link to this sectionVisualizar#
evolve.csv é traçado como evolve.png pelo utils.plots.plot_evolve() após a conclusão da evolução, com um subgráfico por hiperparâmetro mostrando a aptidão (eixo y) vs. os valores dos hiperparâmetros (eixo x). O amarelo indica maiores concentrações. As distribuições verticais indicam que um parâmetro foi desativado e não sofre mutação. Isto é selecionável pelo utilizador no dicionário meta em train.py, e é útil para fixar parâmetros e evitar que evoluam.

Link to this sectionAmbientes suportados#
A Ultralytics fornece uma gama de ambientes prontos a utilizar, cada um pré-instalado com dependências essenciais, tais como CUDA, CUDNN, Python e PyTorch, para dar início aos teus projetos.
- Notebooks de GPU Gratuitos:
- Google Cloud: Guia de Início Rápido do GCP
- Amazon: Guia de Início Rápido da AWS
- Azure: Guia de Início Rápido do AzureML
- Docker: Guia de Início Rápido do Docker
Link to this sectionStatus do projeto#
Este selo indica que todos os testes de Integração Contínua (CI) das GitHub Actions do YOLOv5 estão a passar com sucesso. Estes testes de CI verificam rigorosamente a funcionalidade e o desempenho do YOLOv5 em vários aspetos chave: treino, validação, inferência, exportação e benchmarks. Garantem um funcionamento consistente e fiável no macOS, Windows e Ubuntu, com testes realizados a cada 24 horas e a cada novo commit.