YOLOv5での凍結レイヤーを使用した転移学習
📚 このガイドでは、YOLOv5のfreezeレイヤーを実装して転移学習を行う方法について解説します。転移学習は、ネットワーク全体を最初から再学習させることなく、新しいデータでモデルを迅速に再学習させることができる強力な機械学習(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
レイヤーのtensorの属性を 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
引数で、トレーニングコマンドで使用します。この引数は、最初の unfrozen(アンフローズン) モジュール。このインデックスより前のすべてのモジュールの重みは固定されます。
バックボーンのみをフリーズ
バックボーン全体(レイヤー 0 から 9)をフリーズするには、モデルを新しいオブジェクトクラスに適応させながら、COCO のような大規模なデータセットから学習した一般的な特徴抽出機能を保持する場合によく行われます。
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
このアプローチは、学習済みの機能の大部分をそのまま維持しながら、主に異なる数の出力クラスに合わせてモデルを調整する必要がある場合に役立ちます。ファインチューニングに必要な計算リソースが最も少なくなります。
パフォーマンス比較
レイヤーのフリーズの効果を示すために、YOLOv5m を Pascal VOCデータセット 50の場合 エポックス公式のCOCO事前学習済みから開始 重み (yolov5m.pt
)。すべてのレイヤーをトレーニングする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 hyp.finetune.yaml --freeze 10
精度結果
この結果は、レイヤーをフリーズするとトレーニングが大幅に加速する可能性があるものの、最終的なmAP(平均適合率)がわずかに低下する可能性があることを示しています。一般に、すべてのレイヤーをトレーニングすると最高の精度が得られますが、より多くのレイヤーをフリーズすると、パフォーマンスが低下する可能性がある代わりに、より高速なトレーニングが実現します。
トレーニング中のmAP50比較
トレーニング中のmAP50-95比較
パフォーマンス指標の概要表
リソース使用率
より多くのレイヤーをフリーズすると、GPU メモリ要件と全体的な使用率が大幅に低下します。これにより、フリーズされたレイヤーを使用した転移学習は、限られたハードウェアリソースで作業する場合に魅力的なオプションとなり、より大きなモデルのトレーニングや、通常よりも大きな画像サイズの使用が可能になります。
GPU メモリ割り当て率 (%)
GPU 使用率 (%)
レイヤーの凍結を使用する場合
転移学習におけるレイヤーの凍結は、特に次のような状況で有利です。
- 限られた計算リソース: GPUメモリまたは処理能力に制約がある場合。
- 小規模なデータセット:ターゲットデータセットが元の事前トレーニングデータセットよりも大幅に小さい場合、凍結は過学習を防ぐのに役立ちます。
- 迅速なプロトタイピング:既存のモデルを新しいタスクまたはドメインに迅速に適応させて初期評価を行う必要がある場合。
- 類似した特徴ドメイン: 新しいデータセット内の低レベルの特徴が、モデルの事前学習に使用されたデータセットの特徴と非常に類似している場合。
転移学習のニュアンスについては、用語集のエントリで詳しく調べ、パフォーマンスを最適化するためのハイパーパラメータ調整などの手法を検討してください。
サポートされている環境
Ultralytics は、CUDA、CuDNN、Python、PyTorch などの必須の依存関係がプリインストールされた、さまざまなすぐに使用できる環境を提供しています。
- 無料の GPU Notebooks:
- Google Cloud:GCPクイックスタートガイド
- Amazon: AWS クイックスタートガイド
- Azure: AzureML クイックスタートガイド
- Docker: Dockerクイックスタートガイド
プロジェクトのステータス
このバッジは、すべてのYOLOv5 GitHub Actions継続的インテグレーション(CI)テストが正常に合格していることを確認するものです。これらのCIテストは、主要な操作(トレーニング、検証、推論、エクスポート、およびベンチマーク)にわたるYOLOv5の機能とパフォーマンスを厳密に評価します。macOS、Windows、Ubuntuでの一貫した信頼性の高い動作を保証し、24時間ごと、および新しいコードコミットごとに自動的に実行されます。