Эволюция гиперпараметров для YOLOv5
📚 В этом руководстве рассказывается об эволюции гиперпараметров для YOLOv5 🚀. Эволюция гиперпараметров - это метод оптимизации гиперпараметров с использованием генетического алгоритма (ГА) для оптимизации.
Гиперпараметры в машинном обучении контролируют различные аспекты обучения, и поиск оптимальных значений для них может оказаться непростой задачей. Традиционные методы, такие как поиск по сетке, могут быстро стать неразрешимыми из-за:
- Высокоразмерное пространство поиска
- Неизвестные корреляции между измерениями
- Дорогостоящий характер оценки пригодности в каждой точке
Это делает генетические алгоритмы подходящим кандидатом для поиска гиперпараметров.
Прежде чем начать
Клонируйте репо и установите файл 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
и Отзыв 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. Команда обучения базового сценария следующая:
Для эволюции гиперпараметров характерные для данного сценария, начиная с наших начальных значений, определенных в Раздел 1.и максимизируя пригодность, определенную в Раздел 2., append --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
на utils.plots.plot_evolve()
после завершения эволюции с одной подплощадкой на гиперпараметр, показывающей соотношение фитнеса (ось y) и значений гиперпараметров (ось x). Желтый цвет указывает на более высокую концентрацию. Вертикальные распределения указывают на то, что параметр отключен и не мутирует. Это можно выбрать в меню meta
словарь в train.py, и он полезен для фиксации параметров и предотвращения их изменения.
Поддерживаемые среды
Ultralytics предоставляет ряд готовых к использованию окружений, в каждом из которых предустановлены такие необходимые зависимости, как CUDA, CUDNN, Python, и PyTorchдля запуска ваших проектов.
- Бесплатные блокноты GPU:
- Google Облако: Руководство по быстрому запуску GCP
- Amazon: Руководство по быстрому запуску AWS
- Azure: Руководство по быстрому запуску AzureML
- Docker: Руководство по быстрому запуску Docker
Статус проекта
Этот значок означает, что все тесты непрерывной интеграции (CI) YOLOv5 GitHub Actions успешно пройдены. Эти CI-тесты тщательно проверяют функциональность и производительность YOLOv5 по различным ключевым аспектам: обучение, валидация, вывод, экспорт и контрольные показатели. Они обеспечивают стабильную и надежную работу на macOS, Windows и Ubuntu, причем тесты проводятся каждые 24 часа и при каждом новом коммите.