コンテンツにスキップ

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 ディレクトリ。より良い初期推測は、より良い最終結果を生み出すため、進化させる前にこれらの値を適切に初期化することが重要です。不明な場合は、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)は、最大化しようとする値です。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

Evolutionは、改善を目指すベースシナリオについて実行されます。この例のベースシナリオは、事前トレーニング済みの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.

主な遺伝的オペレーターは次のとおりです。 交叉 および mutation(突然変異)。この研究では、突然変異が使用されており、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 train.pyの辞書にあり、パラメータを固定して進化を防ぐのに役立ちます。

evolve

サポートされている環境

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

プロジェクトのステータス

YOLOv5 CI

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



📅 1年前に作成 ✏️ 5ヶ月前に更新

コメント