콘텐츠로 건너뛰기

YOLOv5 위한 하이퍼파라미터 진화

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

머신러닝의 하이퍼파라미터는 학습의 다양한 측면을 제어하며, 이에 대한 최적의 값을 찾는 것은 어려운 일이 될 수 있습니다. 그리드 검색과 같은 기존 방식은 다음과 같은 이유로 인해 금방 문제가 될 수 있습니다:

  1. 고차원 검색 공간
  2. 차원 간의 알 수 없는 상관 관계
  3. 각 지점에서 적합성을 평가하는 데 비용이 많이 듭니다.

따라서 유전 알고리즘은 하이퍼파라미터 검색에 적합한 후보입니다.

시작하기 전에

리포지토리를 복제하고 요구사항.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 디렉토리에 저장합니다. 초기 추측이 정확할수록 최종 결과가 더 좋으므로 진화하기 전에 이러한 값을 적절하게 초기화하는 것이 중요합니다. 확실하지 않은 경우 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. 진화

진화는 개선하고자 하는 기본 시나리오에 대해 수행됩니다. 이 예의 기본 시나리오는 사전 학습된 YOLOv5를 사용하여 10개의 에포크에 대해 COCO128을 미세 조정하는 것입니다. 기본 시나리오 훈련 명령은 다음과 같습니다:

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/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 by utils.plots.plot_evolve() 진화가 완료된 후 하이퍼파라미터당 하나의 하위 플롯으로 적합도(y축) 대 하이퍼파라미터 값(x축)을 표시합니다. 노란색은 더 높은 농도를 나타냅니다. 수직 분포는 매개변수가 비활성화되어 변이되지 않았음을 나타냅니다. 이는 사용자가 meta 딕셔너리를 추가할 수 있으며, 매개변수를 수정하고 진화하는 것을 방지하는 데 유용합니다.

진화

지원 환경

Ultralytics 는 바로 사용할 수 있는 다양한 환경을 제공하며, 각 환경에는 다음과 같은 필수 종속성이 사전 설치되어 있습니다. CUDA, CUDNN, Python, 및 PyTorch와 같은 필수 종속 요소를 설치하여 프로젝트를 시작할 수 있습니다.

프로젝트 상태

YOLOv5 CI

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

📅1 년 전 생성됨 ✏️ 업데이트됨 12 일 전

댓글