YOLOv5でのフリーズしたレイヤーを使用した転移学習#
📚 このガイドでは、転移学習 🚀 を実装する際に YOLOv5 のレイヤーをフリーズする方法を説明します。転移学習は、ネットワーク全体を最初から再学習することなく、新しいデータでモデルを迅速に再トレーニングできる強力な 機械学習 (ML) 技術です。初期レイヤーの重みをフリーズし、後続レイヤーのパラメーターのみを更新することで、計算リソースの要件とトレーニング時間を大幅に削減できます。ただし、このアプローチでは最終モデルの 精度 にわずかな影響が生じる可能性があります。
開始する前に#
まず、YOLOv5リポジトリをクローンし、requirements.txt に記載されている必要な依存関係をインストールします。Python>=3.8.0 環境に PyTorch>=1.8 がインストールされていることを確認してください。事前学習済み モデル と必要な データセット は、最新のYOLOv5 リリース から自動的にダウンロードされます。
git clone https://github.com/ultralytics/yolov5 # clone repository
cd yolov5
pip install -r requirements.txt # install dependenciesレイヤーのフリーズの仕組み#
ニューラルネットワーク のレイヤーをフリーズすると、トレーニング中にそのパラメーター(重みとバイアス)が更新されなくなります。PyTorchでは、レイヤーのテンソルの requires_grad 属性を False に設定することで実現します。その結果、バックプロパゲーション 中にこれらのレイヤーの勾配が計算されなくなり、計算量とメモリを節約できます。
YOLOv5では、次の トレーニングスクリプト でレイヤーのフリーズを実装しています。
# Freeze specified layers
freeze = [f"model.{x}." for x in range(freeze)] # Define layers to freeze based on module index
for k, v in model.named_parameters():
v.requires_grad = True # Ensure all parameters are initially trainable
if any(x in k for x in freeze):
print(f"Freezing layer: {k}")
v.requires_grad = False # Disable gradient calculation for frozen layersモデルアーキテクチャの確認#
どのレイヤーをフリーズするかを決定するには、YOLOv5モデルの構造を理解することが重要です。次のPythonスニペットを使用して、すべてのモジュールの名前とパラメーターを確認できます。
# Assuming 'model' is your loaded YOLOv5 model instance
for name, param in model.named_parameters():
print(name)
"""
Example Output:
model.0.conv.conv.weight
model.0.conv.bn.weight
model.0.conv.bn.bias
model.1.conv.weight
model.1.bn.weight
model.1.bn.bias
model.2.cv1.conv.weight
model.2.cv1.bn.weight
...
"""YOLOv5アーキテクチャは通常、特徴抽出 を担う バックボーン(YOLOv5s/m/l/xなどの標準構成ではレイヤー0~9)と、物体検出 を実行するヘッド(残りのレイヤー)で構成されます。
# Example YOLOv5 v6.0 backbone structure
backbone:
# [from, number, module, args]
- [-1, 1, Conv, [64, 6, 2, 2]] # Layer 0: Initial convolution (P1/2 stride)
- [-1, 1, Conv, [128, 3, 2]] # Layer 1: Downsampling convolution (P2/4 stride)
- [-1, 3, C3, [128]] # Layer 2: C3 module
- [-1, 1, Conv, [256, 3, 2]] # Layer 3: Downsampling convolution (P3/8 stride)
- [-1, 6, C3, [256]] # Layer 4: C3 module
- [-1, 1, Conv, [512, 3, 2]] # Layer 5: Downsampling convolution (P4/16 stride)
- [-1, 9, C3, [512]] # Layer 6: C3 module
- [-1, 1, Conv, [1024, 3, 2]]# Layer 7: Downsampling convolution (P5/32 stride)
- [-1, 3, C3, [1024]] # Layer 8: C3 module
- [-1, 1, SPPF, [1024, 5]] # Layer 9: Spatial Pyramid Pooling Fast
# Example YOLOv5 v6.0 head structure
head:
- [-1, 1, Conv, [512, 1, 1]] # Layer 10
- [-1, 1, nn.Upsample, [None, 2, "nearest"]] # Layer 11
- [[-1, 6], 1, Concat, [1]] # Layer 12: Concatenate with backbone P4 (from layer 6)
- [-1, 3, C3, [512, False]] # Layer 13: C3 module
# ... subsequent head layers for feature fusion and detectionフリーズのオプション#
トレーニングコマンドの --freeze 引数を使用して、どのレイヤーをフリーズするかを制御できます。この引数は、最初のフリーズされないモジュールのインデックスを指定します。このインデックスより前のすべてのモジュールでは、重みがフリーズされます。特定のブロックに対応するインデックスを確認する必要がある場合は、nn.Sequential(model.model)を使用してモジュールの順序を確認してください。
バックボーンのみをフリーズする#
大規模なデータセットである COCO から学習した一般的な特徴抽出能力を維持しながら、モデルを新しい物体クラスに適応させる場合によく使われる、バックボーン全体(レイヤー0~9)をフリーズするには、次のようにします。
python train.py --weights yolov5m.pt --data your_dataset.yaml --freeze 10この戦略は、対象データセットが元のトレーニングデータ(例:COCO)と類似した低レベルの視覚的特徴(エッジやテクスチャ)を共有している一方で、異なる物体カテゴリを含む場合に効果的です。
最終検出レイヤー以外をすべてフリーズする#
ネットワークのほぼ全体をフリーズし、最終出力の畳み込みレイヤー(Detect モジュールの一部で、通常は最終モジュールです。例:YOLOv5sのモジュール24)のみをトレーニング可能な状態にするには、次のようにします。
python train.py --weights yolov5m.pt --data your_dataset.yaml --freeze 24このアプローチは、学習済みの特徴の大部分を維持しながら、主に異なる数の出力クラスに合わせてモデルを調整する必要がある場合に役立ちます。ファインチューニング に必要な計算リソースを最小限に抑えられます。
性能比較#
レイヤーのフリーズの効果を示すため、公式のCOCO事前学習済み 重み(yolov5m.pt)を初期値として、Pascal VOCデータセット でYOLOv5mを50 エポック トレーニングしました。3つのシナリオを比較しました:すべてのレイヤーをトレーニング(--freeze 0)、バックボーンをフリーズ(--freeze 10)、最終検出レイヤー以外をすべてフリーズ(--freeze 24)。
# Example command for training with backbone frozen
python train.py --batch 48 --weights yolov5m.pt --data voc.yaml --epochs 50 --cache --img 512 --hyp data/hyps/hyp.VOC.yaml --freeze 10精度の結果#
結果から、レイヤーをフリーズするとトレーニングを大幅に高速化できる一方で、最終的な mAP(平均適合率) がわずかに低下する可能性があることがわかります。通常、すべてのレイヤーをトレーニングすると最高の精度が得られますが、より多くのレイヤーをフリーズすると、パフォーマンスが低下する可能性がある代わりにトレーニングを高速化できます。
トレーニング中のmAP50の比較
トレーニング中のmAP50-95の比較
*Summary table of performance metrics*
リソース使用率#
より多くのレイヤーをフリーズすると、GPU メモリの要件と全体的な使用率が大幅に低下します。そのため、限られたハードウェアリソースで作業する場合、フリーズしたレイヤーを使用した転移学習は魅力的な選択肢となり、通常では難しい大規模なモデルのトレーニングや、より大きな画像サイズの使用が可能になります。
割り当てられたGPUメモリ(%)
GPU使用率(%)
レイヤーのフリーズを使用するタイミング#
転移学習中のレイヤーのフリーズは、特に次のような状況で有効です。
- 限られた計算リソース:GPUメモリや処理能力に制約がある場合です。
- 小規模なデータセット:対象データセットが元の事前トレーニングデータセットより大幅に小さい場合、フリーズによって 過学習 の防止に役立ちます。
- 迅速なプロトタイピング:初期評価のために、既存のモデルを新しいタスクやドメインに迅速に適応させる必要がある場合です。
- 類似した特徴ドメイン:新しいデータセットの低レベル特徴が、モデルの事前学習に使用されたデータセットの特徴と非常によく似ている場合です。
用語集の項目 で転移学習の詳細を確認し、パフォーマンスを最適化するために ハイパーパラメータチューニング などの手法を検討してください。
サポート対象の環境#
Ultralyticsは、CUDA、CuDNN、Python、PyTorch などの必須依存関係があらかじめインストールされた、すぐに使用できるさまざまな環境を提供しています。
- 無料のGPUノートブック:
- Google Cloud: GCPクイックスタートガイド
- Amazon: AWSクイックスタートガイド
- Azure: AzureMLクイックスタートガイド
- Docker: Docker クイックスタートガイド
プロジェクトのステータス#
このバッジは、すべての YOLOv5 GitHub Actions 継続的インテグレーション (CI) テストに正常に合格していることを示します。これらのCIテストでは、トレーニング、検証、推論、エクスポート、ベンチマーク という主要な操作におけるYOLOv5の機能とパフォーマンスを厳密に評価します。これにより、macOS、Windows、Ubuntuで一貫性と信頼性の高い動作が保証されます。テストは24時間ごと、および新しいコードコミットごとに自動的に実行されます。