YOLO Vision 2026:

YOLOv5 하이퍼파라미터 진화#

📚 이 가이드는 YOLOv5 🚀의 **하이퍼파라미터 진화(hyperparameter evolution)**에 대해 설명합니다. 하이퍼파라미터 진화는 최적화를 위해 유전 알고리즘(GA)을 사용하는 하이퍼파라미터 최적화 방법입니다.

머신러닝의 하이퍼파라미터는 학습의 다양한 측면을 제어하며, 최적의 값을 찾는 것은 어려울 수 있습니다. 그리드 서치(grid search)와 같은 전통적인 방법은 다음 이유로 인해 금방 다루기 어려워질 수 있습니다.

  1. 고차원 검색 공간
  2. 차원 간의 알려지지 않은 상관관계
  3. 각 지점에서의 적합도(fitness) 평가 비용이 높음

이러한 이유로 유전 알고리즘이 하이퍼파라미터 검색을 위한 적합한 후보가 됩니다.

시작하기 전에#

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개의 하이퍼파라미터가 있습니다. 이들은 /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의 기본 적합도 정의를 사용할 수 있습니다(권장).

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. 진화(Evolve)#

진화는 개선하고자 하는 베이스 시나리오를 중심으로 수행됩니다. 이 예제의 베이스 시나리오는 사전 학습된 YOLOv5s를 사용하여 COCO128을 10개의 에폭 동안 파인튜닝하는 것입니다. 베이스 시나리오 학습 명령어는 다음과 같습니다:

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).

주요 유전 연산자는 **교차(crossover)**와 **돌연변이(mutation)**입니다. 이 작업에서는 모든 이전 세대의 가장 좋은 부모들의 조합을 기반으로 새로운 자손을 생성하기 위해 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).

시각화#

evolve.csv은 진화가 완료된 후 각 하이퍼파라미터당 하나의 서브플롯으로 적합도(y축) 대 하이퍼파라미터 값(x축)을 보여주며 utils.plots.plot_evolve()에 의해 evolve.png로 플롯됩니다. 노란색은 더 높은 농도를 나타냅니다. 수직 분포는 파라미터가 비활성화되어 변이되지 않음을 나타냅니다. 이는 train.py의 meta 딕셔너리에서 사용자가 선택할 수 있으며, 파라미터를 고정하고 진화하지 못하도록 방지하는 데 유용합니다.

YOLOv5 hyperparameter evolution fitness results

지원되는 환경#

Ultralytics는 프로젝트를 빠르게 시작할 수 있도록 CUDA, CUDNN, Python, PyTorch와 같은 필수 종속성이 미리 설치된 다양한 즉시 사용 가능한 환경을 제공합니다.

프로젝트 상태#

YOLOv5 CI

이 배지는 모든 YOLOv5 GitHub Actions CI(Continuous Integration) 테스트가 성공적으로 통과되었음을 나타냅니다. 이 CI 테스트들은 학습, 검증, 추론, 내보내기, 벤치마크 등 다양한 핵심 측면에서 YOLOv5의 기능과 성능을 엄격하게 확인합니다. 테스트는 24시간마다 그리고 새로운 커밋이 발생할 때마다 수행되며 macOS, Windows, Ubuntu에서 일관되고 안정적인 작동을 보장합니다.

댓글