Link to this sectionЭволюция гиперпараметров для YOLOv5#
📚 В этом руководстве объясняется эволюция гиперпараметров для YOLOv5 🚀. Эволюция гиперпараметров — это метод оптимизации гиперпараметров с использованием генетического алгоритма (GA).
Гиперпараметры в машинном обучении контролируют различные аспекты обучения, и поиск их оптимальных значений может быть непростой задачей. Традиционные методы, такие как сеточный поиск (grid search), быстро становятся неэффективными из-за:
- Высокой размерности пространства поиска
- Неизвестных корреляций между измерениями
- Дороговизны оценки пригодности в каждой точке
Это делает генетические алгоритмы подходящим кандидатом для поиска гиперпараметров.
Link to this sectionПеред началом#
Клонируй репозиторий и установи 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 # installLink to this sectionИнициализация гиперпараметров#
В 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)Link to this sectionОпределение пригодности#
Пригодность (fitness) — это значение, которое мы стремимся максимизировать. В 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)Link to this sectionЭволюция#
Эволюция выполняется для базового сценария, который мы стремимся улучшить. Базовый сценарий в этом примере — тонкая настройка 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/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.
Link to this section4. Визуализация#
evolve.csv строится как evolve.png с помощью utils.plots.plot_evolve() после завершения эволюции, где для каждого гиперпараметра отображается подграфик пригодности (ось Y) по сравнению со значениями гиперпараметра (ось X). Желтый цвет указывает на более высокую концентрацию. Вертикальные распределения указывают на то, что параметр был отключен и не подвергается мутации. Это настраивается пользователем в словаре meta в train.py и полезно для фиксации параметров, чтобы предотвратить их эволюцию.

Link to this sectionПоддерживаемые окружения#
Ultralytics предоставляет ряд готовых к использованию сред, каждая из которых предустановлена с необходимыми зависимостями, такими как CUDA, CUDNN, Python и PyTorch, чтобы ты мог быстро начать свои проекты.
- Бесплатные ноутбуки с GPU:
- Google Cloud: Руководство по быстрому запуску GCP
- Amazon: Руководство по быстрому запуску AWS
- Azure: Руководство по быстрому запуску AzureML
- Docker: Руководство по быстрому запуску Docker
Link to this sectionСтатус проекта#
Этот значок указывает на то, что все тесты непрерывной интеграции (CI) GitHub Actions для YOLOv5 успешно проходят. Эти CI-тесты тщательно проверяют функциональность и производительность YOLOv5 по разным ключевым аспектам: обучение, валидация, инференс, экспорт и бенчмарки. Они обеспечивают стабильную и надежную работу на macOS, Windows и Ubuntu, при этом тесты проводятся каждые 24 часа и при каждом новом коммите.