Эволюция гиперпараметров для YOLOv5#
📚 В этом руководстве объясняется эволюция гиперпараметров для YOLOv5 🚀. Эволюция гиперпараметров — это метод оптимизации гиперпараметров с использованием генетического алгоритма (GA) для оптимизации.
Гиперпараметры в машинном обучении управляют различными аспектами обучения, и поиск их оптимальных значений может быть сложной задачей. Традиционные методы, такие как перебор по сетке, быстро становятся практически невыполнимыми из-за:
- Большого пространства поиска
- Неизвестных корреляций между измерениями
- Высокой стоимости вычисления приспособленности в каждой точке
Это делает генетические алгоритмы подходящим вариантом для поиска гиперпараметров.
Перед началом#
Клонируй репозиторий и установи 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 # install1. Инициализация гиперпараметров#
В 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. Определение приспособленности#
Fitness — это значение, которое мы стремимся максимизировать. В YOLOv5 мы определяем функцию fitness по умолчанию как взвешенную комбинацию метрик: mAP@0.5 составляет 10% веса, а mAP@0.5:0.95 составляет оставшиеся 90%, при этом точность (P) и полнота (R) отсутствуют. Ты можешь настроить их по своему усмотрению или использовать определение fitness по умолчанию в utils/metrics.py (рекомендуется). Этот fitness определяет, какой результат сохраняется в hyp_evolve.yaml; сам генетический алгоритм ранжирует родителей и элиту только по mAP@0.5, поэтому изменение этих весов не меняет выбор родителей.
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 поколений, и каждое поколение обучает базовый сценарий один раз для каждого из 50 индивидов в популяции. Ты можешь изменить количество поколений с помощью аргумента --evolve, то есть python train.py --evolve 1000.
Основными генетическими операторами являются скрещивание и мутация. Каждое поколение обучает каждого индивида и оценивает его по mAP@0.5, выбирает родителей с помощью турнирного отбора с добавлением наиболее приспособленных элитных особей в пул родителей и создает следующую популяцию посредством скрещивания и мутации с адаптивными по мере развития эволюции коэффициентами. Результаты записываются в runs/evolve/exp/evolve.csv, а потомство с наибольшим fitness сохраняется каждое поколение как 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)Для достижения наилучших результатов мы рекомендуем выполнять эволюцию не менее чем за 300 поколений. Обрати внимание, что эволюция, как правило, является ресурсоемкой и трудоемкой, поскольку базовый сценарий обучается тысячи раз, что может потребовать сотен или тысяч часов работы GPU.
После завершения эволюции используй найденные настройки повторно, указав сохраненный файл при запуске обучения, например python train.py --hyp runs/evolve/exp/hyp_evolve.yaml --data your.yaml --weights yolov5s.pt.
4. Визуализация#
evolve.csv отображается в виде evolve.png с помощью utils.plots.plot_evolve() после завершения эволюции: для каждого гиперпараметра строится отдельный график, на котором показана приспособленность (ось y) в зависимости от значений гиперпараметра (ось x). Желтый цвет обозначает более высокую концентрацию. Вертикальные распределения указывают, что параметр отключен и не мутирует. Это можно настроить в словаре meta в train.py; такая настройка полезна для фиксации параметров и предотвращения их эволюции.

Поддерживаемые среды#
Ultralytics предоставляет набор готовых к использованию окружений, каждое из которых предварительно оснащено основными зависимостями, такими как CUDA, CUDNN, Python и PyTorch, чтобы ты мог сразу приступить к своим проектам.
- Бесплатные блокноты с GPU:
- Google Cloud: краткое руководство по GCP
- Amazon: краткое руководство по AWS
- Azure: краткое руководство по AzureML
- Docker: Краткое руководство по Docker
Статус проекта#
Этот значок показывает, что все тесты непрерывной интеграции (CI) в GitHub Actions YOLOv5 успешно проходят. Эти тесты CI тщательно проверяют функциональность и производительность YOLOv5 по нескольким ключевым направлениям: обучение, валидация, инференс, экспорт и бенчмарки. Они обеспечивают стабильную и надежную работу на macOS, Windows и Ubuntu; тесты выполняются каждые 24 часа и при каждом новом коммите.
Часто задаваемые вопросы#
Каждое поколение обучает базовый сценарий один раз для каждого индивида в популяции из 50 участников, поэтому 300 поколений 10-эпохового запуска COCO128 обходятся примерно в 15 000 раз дороже одного такого запуска. Делай базовый сценарий коротким и репрезентативным. Цикл с несколькими GPU, описанный выше, запускает независимый поиск на каждом GPU, а не разделяет один поиск, поэтому уменьшай
--evolveна каждый процесс, если ты работаешь в рамках фиксированного бюджета.Да. Значение
--evolveпо умолчанию составляет 300 поколений; передай такое число, как--evolve 1000, чтобы запустить больше.Установи первое значение его записи в словаре
metaвtrain.pyнаFalse. Исключенные параметры сохраняют свое первоначальное значение и отображаются в виде вертикальных линий вevolve.png.Передай сохраненный файл в обычный запуск обучения:
python train.py --hyp runs/evolve/exp/hyp_evolve.yaml --data your.yaml --weights yolov5s.pt.