Перейти к содержанию

Эволюция гиперпараметров для YOLOv5

📚 В этом руководстве объясняется эволюция гиперпараметров для YOLOv5 🚀. Эволюция гиперпараметров - это метод оптимизации гиперпараметров с использованием генетического алгоритма (GA) для оптимизации.

Гиперпараметры в машинном обучении контролируют различные аспекты обучения, и поиск оптимальных значений для них может быть сложной задачей. Традиционные методы, такие как поиск по сетке, могут быстро стать неразрешимыми из-за:

  1. Высокоразмерное пространство поиска
  2. Неизвестные корреляции между измерениями
  3. Высокая стоимость оценки пригодности на каждой точке.

Это делает генетические алгоритмы подходящим кандидатом для поиска гиперпараметров.

Прежде чем начать

Клонируйте репозиторий и установите requirements.txt в окружении Python>=3.8.0, включая PyTorch>=1.8. Модели и наборы данных загружаются автоматически из последнего релиза YOLOv5.

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

1. Инициализация гиперпараметров

YOLOv5 имеет около 30 гиперпараметров, используемых для различных настроек обучения. Они определены в *.yaml файлы в /data/hyps каталог. Более удачные начальные предположения дадут лучшие конечные результаты, поэтому важно правильно инициализировать эти значения перед развитием. Если вы сомневаетесь, просто используйте значения по умолчанию, которые оптимизированы для обучения YOLOv5 COCO с нуля.

# 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. Определение функции пригодности

Фитнес — это значение, которое мы стремимся максимизировать. В YOLOv5 мы определяем функцию фитнеса по умолчанию как взвешенную комбинацию метрик: mAP@0.5 вносит 10% веса, а mAP@0.5:0.95 вносит оставшиеся 90%, при этом Точность P и Полнота (Recall) R отсутствует. Вы можете настроить их по своему усмотрению или использовать определение пригодности по умолчанию в utils/metrics.py (рекомендуется).

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. Эволюция

Эволюция выполняется на основе базового сценария, который мы стремимся улучшить. Базовым сценарием в этом примере является точная настройка COCO128 для 10 эпох с использованием предварительно обученной YOLOv5s. Команда обучения для базового сценария:

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

Для развития гиперпараметров специфичный для данного сценария, начиная с наших начальных значений, определенных в Раздел 1., и максимизации пригодности, определенной в Раздел 2., добавьте --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

Настройки эволюции по умолчанию запустят базовый сценарий 300 раз, то есть в течение 300 поколений. Вы можете изменить количество поколений через --evolve аргумент, например: python train.py --evolve 1000.

Основными генетическими операторами являются кроссовер и мутация. В этой работе используется мутация с вероятностью 80% и дисперсией 0,04 для создания нового потомства на основе комбинации лучших родителей из всех предыдущих поколений. Результаты регистрируются в runs/evolve/exp/evolve.csv, и потомок с наивысшей пригодностью сохраняется каждое поколение как 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)

Для достижения наилучших результатов мы рекомендуем не менее 300 поколений эволюции. Обратите внимание, что эволюция, как правило, является дорогостоящей и трудоемкой, поскольку базовый сценарий тренируется сотни раз, что может потребовать сотни или тысячи часов работы GPU.

4. Визуализация

evolve.csv отображается как evolve.png by utils.plots.plot_evolve() после завершения эволюции с одним подграфиком на гиперпараметр, показывающим соответствие (ось y) и значения гиперпараметра (ось x). Желтый цвет указывает на более высокие концентрации. Вертикальные распределения указывают на то, что параметр был отключен и не мутирует. Это выбирается пользователем в meta словарь в train.py и полезен для фиксации параметров и предотвращения их изменения.

evolve

Поддерживаемые среды

Ultralytics предоставляет ряд готовых к использованию сред, каждая из которых предварительно установлена с необходимыми зависимостями, такими как CUDA, CUDNN, Python и PyTorch, чтобы дать старт вашим проектам.

Статус проекта

YOLOv5 CI

Этот значок указывает на то, что все тесты непрерывной интеграции (CI) YOLOv5 GitHub Actions успешно пройдены. Эти тесты CI тщательно проверяют функциональность и производительность YOLOv5 по различным ключевым аспектам: обучение, валидация, вывод, экспорт и бенчмарки. Они обеспечивают стабильную и надежную работу в macOS, Windows и Ubuntu, при этом тесты проводятся каждые 24 часа и при каждом новом коммите.



📅 Создано 1 год назад ✏️ Обновлено 5 месяцев назад

Комментарии