콘텐츠로 건너뛰기

YOLOv5용 하이퍼파라미터 진화

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

머신 러닝의 하이퍼파라미터는 훈련의 다양한 측면을 제어하며, 이에 대한 최적의 값을 찾는 것은 어려울 수 있습니다. 그리드 검색과 같은 기존 방법은 다음과 같은 이유로 인해 빠르게 다루기 어려워질 수 있습니다.

  1. 고차원 검색 공간
  2. 차원 간의 알려지지 않은 상관 관계
  3. 각 지점에서 적합성을 평가하는 데 드는 높은 비용

이것은 유전자 알고리즘을 하이퍼파라미터 검색에 적합한 후보로 만듭니다.

시작하기 전에

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 디렉토리. 더 나은 초기 추측은 더 나은 최종 결과를 생성하므로 진화하기 전에 이러한 값을 적절하게 초기화하는 것이 중요합니다. 확실하지 않은 경우 Ultralytics 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. 진화

개선을 추구하는 기본 시나리오를 중심으로 진화가 이루어집니다. 이 예제의 기본 시나리오는 사전 훈련된 YOLOv5s를 사용하여 COCO128을 10 epoch 동안 미세 조정하는 것입니다. 기본 시나리오 훈련 명령어는 다음과 같습니다.

python train.py --epochs 10 --data coco128.yaml --weights yolov5s.pt --cache

하이퍼파라미터 Evolution 방법 이 시나리오에 특화됨, 에서 정의된 초기 값에서 시작하여 섹션 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

기본 Evolution 설정은 기본 시나리오를 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() 진화가 완료되면 하이퍼파라미터별로 fitness(y축) 대 하이퍼파라미터 값(x축)을 보여주는 하위 플롯이 표시됩니다. 노란색은 농도가 높음을 나타냅니다. 수직 분포는 파라미터가 비활성화되어 변이되지 않음을 나타냅니다. 이는 train.py의 'dictionary'에서 사용자가 선택할 수 있으며, 파라미터를 고정하고 변이를 방지하는 데 유용합니다. meta train.py의 딕셔너리에서 사용자가 선택할 수 있으며, 파라미터를 고정하고 변이를 방지하는 데 유용합니다.

발전

지원되는 환경

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

프로젝트 상태

YOLOv5 CI

이 배지는 모든 YOLOv5 GitHub Actions 지속적 통합(CI) 테스트가 성공적으로 통과되었음을 나타냅니다. 이러한 CI 테스트는 학습, 유효성 검사, 추론, 내보내기벤치마크와 같은 다양한 주요 측면에서 YOLOv5의 기능과 성능을 엄격하게 검사합니다. macOS, Windows 및 Ubuntu에서 일관되고 안정적인 작동을 보장하며, 테스트는 24시간마다 그리고 새로운 커밋마다 수행됩니다.



📅 1년 전에 생성됨 ✏️ 5개월 전에 업데이트됨

댓글