Evolución de los hiperparámetros de YOLOv5
📚 Esta guía explica la evolución de hiperparámetros para YOLOv5 🚀. La evolución de hiperparámetros es un método de Optimización de Hi perparámetros que utiliza un Algoritmo Genético (AG) para la optimización.
En el aprendizaje automático, los hiperparámetros controlan varios aspectos de la formación, y encontrar los valores óptimos puede ser todo un reto. Los métodos tradicionales, como las búsquedas en cuadrículas, pueden volverse intratables rápidamente debido a:
- El espacio de búsqueda de alta dimensión
- Correlaciones desconocidas entre las dimensiones
- Carácter costoso de la evaluación de la aptitud en cada punto
Esto convierte a los algoritmos genéticos en un candidato adecuado para la búsqueda de hiperparámetros.
Antes de empezar
Clonar repo e instalar requirements.txt en a Python>=3.8.0 incluyendo PyTorch>=1.8. Los modelos y conjuntos de datos se descargan automáticamente de la últimaversión de YOLOv5 .
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # install
1. Inicializar los hiperparámetros
YOLOv5 tiene unos 30 hiperparámetros que se utilizan para diversos ajustes de entrenamiento. Éstos se definen en *.yaml
archivos en el /data/hyps
directorio. Mejores conjeturas iniciales producirán mejores resultados finales, por lo que es importante inicializar estos valores correctamente antes de evolucionar. En caso de duda, utilice simplemente los valores por defecto, que están optimizados para YOLOv5 COCO formación desde cero.
# 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
La aptitud es el valor que buscamos maximizar. En YOLOv5 definimos una función de aptitud por defecto como una combinación ponderada de métricas: mAP@0.5
aporta el 10% del peso y mAP@0.5:0.95
aporta el 90% restante, con Precisión P
y Recall R
ausente. Puede ajustarlos a su gusto o utilizar la definición de fitness por defecto en 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. Evolucionar
La evolución se realiza sobre un escenario base que se intenta mejorar. El escenario base en este ejemplo es el ajuste fino de COCO128 durante 10 épocas utilizando YOLOv5 preentrenado. El comando de entrenamiento del escenario base es:
Para evolucionar los hiperparámetros específicas para este escenariopartiendo de nuestros valores iniciales definidos en Sección 1.y maximizar la aptitud definida en Sección 2.añadir --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
Los ajustes de evolución por defecto ejecutarán el escenario base 300 veces, es decir, durante 300 generaciones. Puede modificar las generaciones mediante el botón --evolve
es decir python train.py --evolve 1000
.
Los principales operadores genéticos son cruce y mutación. En este trabajo se utiliza la mutación, con una probabilidad del 80% y una varianza de 0,04 para crear nuevos descendientes basados en una combinación de los mejores progenitores de todas las generaciones anteriores. Los resultados se registran en runs/evolve/exp/evolve.csv
y la descendencia más apta se salva en cada generación 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 un mínimo de 300 generaciones de evolución para obtener los mejores resultados. Tenga en cuenta que la evolución suele ser cara y requiere mucho tiempo, ya que el escenario base se entrena cientos de veces, lo que posiblemente requiera cientos o miles de horas de GPU .
4. Visualice
evolve.csv
se representa como evolve.png
por utils.plots.plot_evolve()
tras finalizar la evolución con un subgrupo por hiperparámetro que muestra la aptitud (eje y) frente a los valores del hiperparámetro (eje x). El amarillo indica concentraciones más altas. Las distribuciones verticales indican que un parámetro ha sido desactivado y no muta. Esto puede seleccionarlo el usuario en el menú meta
en train.py, y es útil para fijar parámetros y evitar que evolucionen.
Entornos compatibles
Ultralytics proporciona una serie de entornos listos para usar, cada uno de ellos preinstalado con dependencias esenciales como CUDACUDNN, Pythony PyTorchpara poner en marcha sus proyectos.
- Cuadernos gratuitos GPU:
- Google Nube: Guía de inicio rápido de GCP
- Amazon: Guía de inicio rápido de AWS
- Azure: Guía de inicio rápido de AzureML
- Docker: Guía de inicio rápido de Docker
Estado del proyecto
Este distintivo indica que todas las pruebas de integración continua (IC) deYOLOv5 GitHub Actions se han superado con éxito. Estas pruebas de IC comprueban rigurosamente la funcionalidad y el rendimiento de YOLOv5 en varios aspectos clave: formación, validación, inferencia, exportación y puntos de referencia. Garantizan un funcionamiento coherente y fiable en macOS, Windows y Ubuntu, con pruebas realizadas cada 24 horas y en cada nueva confirmación.