YOLO Vision 2026:

YOLOv5 하이퍼파라미터 진화#

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

머신 러닝의 하이퍼파라미터는 학습의 다양한 측면을 제어하며, 최적의 값을 찾는 일은 어려울 수 있습니다. Grid search와 같은 기존 방법은 다음과 같은 이유로 빠르게 처리하기 어려워질 수 있습니다.

  1. 높은 차원의 검색 공간
  2. 차원 간 상관관계를 알 수 없음
  3. 각 지점에서 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 # 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에서는 다음 metric의 가중 조합으로 기본 fitness 함수를 정의합니다. mAP@0.5이 가중치의 10%를 차지하고 mAP@0.5:0.95이 나머지 90%를 차지하며, 정밀도 (P)재현율 (R)은 포함되지 않습니다. 필요에 따라 이러한 값을 조정하거나 utils/metrics.py의 기본 fitness 정의를 사용할 수 있습니다(권장).

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회, 즉 300세대 동안 실행합니다. --evolve 인수를 통해 세대 수를 수정할 수 있습니다. 예를 들어 python train.py --evolve 1000로 설정합니다.

주요 유전 연산자는 crossovermutation입니다. 이 작업에서는 mutation을 사용하며, 80%의 확률과 0.04의 분산으로 이전 모든 세대에서 가장 우수한 부모들의 조합을 기반으로 새로운 자손 개체를 생성합니다. 결과는 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.csvutils.plots.plot_evolve()에 의해 evolve.png로 표시되며, 하이퍼파라미터마다 하나의 subplot이 생성되어 fitness(y축)와 하이퍼파라미터 값(x축)의 관계를 보여줍니다. 노란색은 더 높은 농도를 나타냅니다. 수직 분포는 해당 파라미터가 비활성화되어 mutation되지 않음을 나타냅니다. 이는 train.py의 meta dictionary에서 사용자가 선택할 수 있으며, 파라미터를 고정하고 진화하지 않도록 하는 데 유용합니다.

YOLOv5 하이퍼파라미터 진화 fitness 결과

지원 환경#

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

프로젝트 상태#

YOLOv5 CI

이 배지는 모든 YOLOv5 GitHub Actions 지속적 통합 (CI) 테스트가 성공적으로 통과했음을 나타냅니다. 이러한 CI 테스트는 학습, 검증, 추론, 내보내기, 벤치마크 등 여러 주요 측면에서 YOLOv5의 기능과 성능을 엄격하게 점검합니다. 또한 macOS, Windows, Ubuntu에서 일관되고 안정적으로 작동하는지 확인하며, 24시간마다 그리고 새 커밋이 생성될 때마다 테스트를 수행합니다.

댓글