YOLO Vision 2026:

YOLOv5のハイパーパラメータ進化#

📚 このガイドでは、YOLOv5のハイパーパラメータ進化について説明します 🚀。ハイパーパラメータ進化は、遺伝的アルゴリズム(GA)を使用したハイパーパラメータ最適化の手法です。

機械学習におけるハイパーパラメータはトレーニングのさまざまな側面を制御しますが、その最適値を見つけることは難しい場合があります。グリッドサーチのような従来の方法では、次のような理由からすぐに処理が困難になる可能性があります。

  1. 高次元の探索空間
  2. 各次元間の未知の相関関係
  3. 各ポイントでの適合度評価にかかるコストの高さ

このため、遺伝的アルゴリズムはハイパーパラメータ探索に適した手法となります。

始める前に#

リポジトリをクローンし、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

ハイパーパラメータの初期化#

YOLOv5には、さまざまなトレーニング設定で使用される約30個のハイパーパラメータがあります。これらは /data/hyps ディレクトリ内の *.yaml ファイルで定義されています。初期の推測値が優れているほど最終的な結果も良くなるため、進化させる前にこれらの値を適切に初期化することが重要です。疑問がある場合は、COCOからのスクラッチ訓練におけるYOLOv5向けに最適化されたデフォルト値をそのまま使用してください。

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

適合度の定義#

フィットネスは、最大化を目指す値です。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)

進化の実行#

進化は、改善を目指すベースのシナリオを基準に実行されます。この例でのベースシナリオは、事前学習済みの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 で変更できます。

主な遺伝的オペレータは交叉突然変異です。この作業では、すべての世代からの最良の親の組み合わせに基づいて新しい子孫を作成するために、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)。

4. 可視化#

進化の完了後、utils.plots.plot_evolve() によって evolve.csvevolve.png としてプロットされます。サブプロットごとに、ハイパーパラメータの値(x軸)に対する適応度(y軸)が表示されます。黄色は高濃度を示します。垂直方向の分布は、パラメータが無効化されており変異しないことを示しています。これは train.py 内の meta 辞書でユーザーが選択可能であり、パラメータを固定して進化を防ぐのに役立ちます。

YOLOv5 hyperparameter evolution fitness results

サポートされている環境#

Ultralytics は、プロジェクトを迅速に開始できるように、CUDACUDNNPythonPyTorch などの必須依存関係が事前にインストールされた、すぐに使用できるさまざまな環境を提供しています。

プロジェクトの状態#

YOLOv5 CI

このバッジは、すべての YOLOv5 GitHub Actions 継続的インテグレーション(CI)テストが正常に合格していることを示しています。これらの CI テストは、学習検証推論エクスポートベンチマークの主要な側面全体で、YOLOv5 の機能とパフォーマンスを厳格にチェックします。これらは、24 時間ごとおよび新しいコミットごとにテストが実施され、macOS、Windows、Ubuntu での一貫した信頼性の高い動作を保証します。

コメント