YOLOv5 하이퍼파라미터 진화#
📚 이 가이드에서는 YOLOv5의 하이퍼파라미터 진화를 설명합니다 🚀. 하이퍼파라미터 진화는 최적화를 위해 유전 알고리즘 (GA)을 사용하는 하이퍼파라미터 최적화 방법입니다.
머신 러닝의 하이퍼파라미터는 학습의 다양한 측면을 제어하며, 최적의 값을 찾는 일은 어려울 수 있습니다. Grid search와 같은 기존 방법은 다음과 같은 이유로 빠르게 처리하기 어려워질 수 있습니다.
- 높은 차원의 검색 공간
- 차원 간 상관관계를 알 수 없음
- 각 지점에서 fitness를 평가하는 데 드는 높은 비용
따라서 유전 알고리즘은 하이퍼파라미터 검색에 적합한 방법입니다.
시작하기 전에#
Python>=3.8.0 환경에서 requirements.txt를 사용하여 리포지토리를 클론하고 설치합니다. 여기에는 PyTorch>=1.8도 포함됩니다. 모델과 데이터셋은 최신 YOLOv5 릴리스에서 자동으로 다운로드됩니다.
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # install1. 하이퍼파라미터 초기화#
YOLOv5에는 다양한 학습 설정에 사용되는 약 30개의 하이퍼파라미터가 있습니다. 이러한 하이퍼파라미터는 /data/hyps 디렉터리의 *.yaml 파일에 정의되어 있습니다. 초기 추정값이 더 좋을수록 최종 결과도 더 좋아지므로, 진화를 시작하기 전에 이러한 값을 적절히 초기화하는 것이 중요합니다. 확실하지 않다면 처음부터 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 정의#
적합도(Fitness)는 당사가 최대화하고자 하는 값입니다. YOLOv5에서는 기본 적합도 함수를 메트릭의 가중치 조합으로 정의합니다. mAP@0.5은 가중치의 10%, mAP@0.5:0.95은 나머지 90%를 기여하며, 정밀도(P)와 재현율(R)은 제외됩니다. 필요에 따라 이를 조정하거나 utils/metrics.py의 기본 적합도 정의를 사용할 수 있습니다(권장). 이 적합도에 따라 어떤 결과가 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. 진화#
진화는 개선하려는 기준 시나리오를 중심으로 수행됩니다. 이 예제의 기준 시나리오는 사전 학습된 YOLOv5s를 사용하여 10개의 epoch 동안 COCO128을 fine-tuning하는 것입니다. 기준 시나리오의 학습 명령은 다음과 같습니다.
python train.py --epochs 10 --data coco128.yaml --weights yolov5s.pt --cache이 시나리오에 특정된 하이퍼파라미터를 진화시키려면 **섹션 1.**에서 정의한 초기값에서 시작하고 **섹션 2.**에서 정의한 fitness를 최대화하도록 --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).
주요 유전 연산자는 **교차(crossover)**와 **변이(mutation)**입니다. 각 세대에서는 모든 개체를 학습시키고 mAP@0.5으로 점수를 매기며, 가장 적합한 엘리트가 부모 풀에 추가된 토너먼트 선택 방식으로 부모를 선택합니다. 그리고 진화가 진행됨에 따라 적응하는 비율로 교차와 변이를 통해 다음 세대를 구축합니다. 결과는 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을 사용합니다.
4. 시각화#
진화가 완료되면 evolve.csv은 utils.plots.plot_evolve()에 의해 evolve.png로 표시되며, 하이퍼파라미터마다 하나의 subplot이 생성되어 fitness(y축)와 하이퍼파라미터 값(x축)의 관계를 보여줍니다. 노란색은 더 높은 농도를 나타냅니다. 수직 분포는 해당 파라미터가 비활성화되어 mutation되지 않음을 나타냅니다. 이는 train.py의 meta dictionary에서 사용자가 선택할 수 있으며, 파라미터를 고정하고 진화하지 않도록 하는 데 유용합니다.

지원 환경#
Ultralytics는 프로젝트를 바로 시작할 수 있도록 CUDA, CUDNN, Python, PyTorch와 같은 필수 종속성이 사전 설치된 다양한 즉시 사용 가능한 환경을 제공합니다.
- 무료 GPU 노트북:
- Google Cloud: GCP 빠른 시작 가이드
- Amazon: AWS 빠른 시작 가이드
- Azure: AzureML 빠른 시작 가이드
- Docker: Docker 빠른 시작 가이드
프로젝트 상태#
이 배지는 모든 YOLOv5 GitHub Actions 지속적 통합 (CI) 테스트가 성공적으로 통과했음을 나타냅니다. 이러한 CI 테스트는 학습, 검증, 추론, 내보내기, 벤치마크 등 여러 주요 측면에서 YOLOv5의 기능과 성능을 엄격하게 점검합니다. 또한 macOS, Windows, Ubuntu에서 일관되고 안정적으로 작동하는지 확인하며, 24시간마다 그리고 새 커밋이 생성될 때마다 테스트를 수행합니다.
FAQ#
각 세대에서는 50명의 개체로 구성된 모집단의 개체당 기본 시나리오를 한 번씩 학습시키므로, 10에폭 COCO128 실행의 300세대는 그러한 단일 실행 비용의 약 15,000배에 달합니다. 기본 시나리오는 짧고 대표성 있게 유지하십시오. 위의 다중 GPU 루프는 하나의 검색을 공유하는 대신 각 GPU에서 독립적인 검색을 시작하므로, 고정된 예산으로 작업하는 경우 프로세스당
--evolve을 낮추십시오.네.
--evolve은 기본적으로 300세대로 설정되어 있습니다. 더 많이 실행하려면--evolve 1000과 같은 숫자를 전달하세요.train.py에 있는meta사전의 해당 항목 첫 번째 값을False로 설정하세요. 제외된 파라미터는 초기값을 유지하며evolve.png에 수직선으로 표시됩니다.저장된 파일을 일반 학습 실행에 전달합니다:
python train.py --hyp runs/evolve/exp/hyp_evolve.yaml --data your.yaml --weights yolov5s.pt.