Ir al contenido

Evoluci贸n de los hiperpar谩metros

馃摎 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.

Los hiperpar谩metros en ML controlan varios aspectos del entrenamiento, y encontrar valores 贸ptimos para ellos puede ser un reto. Los m茅todos tradicionales, como la b煤squeda en cuadr铆culas, pueden volverse r谩pidamente intratables debido a: 1) la elevada dimensi贸n del espacio de b煤squeda; 2) las correlaciones desconocidas entre las dimensiones; y 3) la costosa naturaleza de la evaluaci贸n de la aptitud en cada punto, lo que convierte al AG 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. En este ejemplo, el escenario base es el ajuste de COCO128 durante 10 茅pocas utilizando YOLOv5 preentrenado. El comando de entrenamiento del escenario base es:

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

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
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

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.csvy 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.

evolucionar

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.

Estado del proyecto

YOLOv5 CI

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.

Creado hace 1 a帽o 鉁忥笍 Actualizado hace 1 mes

Comentarios