YOLOv5における凍結層を用いた転移学習#
📚 このガイドでは、transfer learningの実装時にYOLOv5🚀のレイヤーをfreezeする方法について説明します。転移学習は強力なmachine learning (ML)のテクニックであり、ネットワーク全体を最初から再学習させることなく、新しいデータでモデルを素早く再学習させることができます。初期レイヤーの重みを凍結し、後半のレイヤーのパラメータのみを更新することで、計算リソースの要件と学習時間を大幅に削減できます。ただし、このアプローチは最終的なモデルのaccuracyにわずかに影響を与える可能性があります。
始める前に#
まず、YOLOv5のリポジトリをクローンし、requirements.txtに記載されている必要な依存関係をインストールします。Python>=3.8.0環境にPyTorch>=1.8がインストールされていることを確認してください。事前学習済みmodelsおよび必要なdatasetsは、最新のYOLOv5 releaseから自動的にダウンロードされます。
git clone https://github.com/ultralytics/yolov5 # clone repository
cd yolov5
pip install -r requirements.txt # install dependencies層の凍結の仕組み#
neural networkのレイヤーを凍結すると、学習プロセス中にそのパラメータ(重みとバイアス)が更新されないようになります。PyTorchでは、レイヤーのテンソルの requires_grad 属性を False に設定することでこれを実現します。その結果、backpropagation(逆伝播)の際これらのレイヤーの勾配は計算されず、計算量とメモリが節約されます。
YOLOv5がtraining scriptでレイヤーの凍結を実装する方法は以下の通りです:
# 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のアーキテクチャは通常、feature extractionを担当するbackbone(YOLOv5s/m/l/xなどの標準設定ではレイヤー0-9)と、object detectionを実行するヘッド(残りのレイヤー)で構成されます。
# 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 引数を使用して、どのレイヤーを凍結するかを制御できます。この引数は、凍結されていない最初のモジュールのインデックスを指定します。このインデックスより前にあるすべてのモジュールは重みが凍結されます。特定ブロックにどのインデックスが対応しているかを確認する必要がある場合は、 model.model ( nn.Sequential )を使用してモジュールの順序を確認してください。
バックボーンのみの凍結#
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このアプローチは、学習済みの特徴の大部分をそのまま維持しながら、異なる数の出力クラスに合わせてモデルを調整する必要がある場合に便利です。fine-tuningに必要な計算リソースを最小限に抑えることができます。
パフォーマンスの比較#
レイヤー凍結の効果を示すために、公式のCOCO事前学習済みweights(yolov5m.pt)を起点として、Pascal VOC datasetでYOLOv5mを50epochs学習させました。全レイヤーの学習(--freeze 0)、バックボーンの凍結(--freeze 10)、および最後の検出レイヤー以外すべての凍結(--freeze 24)の3つのシナリオを比較しました。
# 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 (mean Average Precision)がわずかに低下する可能性があることが示されました。通常、すべてのレイヤーを学習させると最高の精度が得られ、より多くのレイヤーを凍結すると、パフォーマンスがわずかに低下する代わりに高速な学習が可能になります。
学習中のmAP50の比較
学習中のmAP50-95の比較
*Summary table of performance metrics*
リソースの利用#
より多くのレイヤーを凍結することで、GPUのメモリ要件と全体的な使用率が大幅に削減されます。これにより、限られたハードウェアリソースで作業する際にレイヤー凍結による転移学習が魅力的な選択肢となり、通常よりも大きなモデルの学習や大きな画像サイズの利用が可能になります。
割り当てられたGPUメモリの割合(%)
GPUメモリ使用率(%)
層の凍結を利用すべき場面#
転移学習中に層を凍結することは、いくつかの状況で特に有利です:
- 計算リソースが限られている場合: GPUメモリや処理能力に制約がある場合。
- Small Datasets: ターゲットデータセットが元の事前学習データセットよりも大幅に小さい場合、凍結はoverfitting(過学習)を防ぐのに役立ちます。
- 迅速なプロトタイピング: 既存のモデルを新しいタスクやドメインに素早く適応させて初期評価を行う必要がある場合。
- 類似した特徴ドメイン: 新しいデータセットの低レベルな特徴が、モデルが事前学習されたデータセットの特徴と非常に似ている場合。
転移学習のニュアンスについての詳細はglossary entryを参照し、パフォーマンスを最適化するためにhyperparameter tuningなどの手法を検討してください。
サポートされている環境#
Ultralyticsでは、CUDA、CuDNN、Python、PyTorchなどの必須依存関係が事前インストールされた、すぐに使えるさまざまな環境を提供しています。
- 無料GPUノートブック:
- Google Cloud: GCPクイックスタートガイド
- Amazon: AWS Quickstart Guide
- Azure: AzureML Quickstart Guide
- Docker: Dockerクイックスタートガイド
プロジェクトの状態#
このバッジは、すべてのYOLOv5 GitHub Actions継続的インテグレーション(CI)テストが正常に合格していることを確認するものです。これらのCIテストでは、training、validation、inference、export、benchmarksの主要な操作にわたって、YOLOv5の機能とパフォーマンスが厳密に評価されます。macOS、Windows、Ubuntuで一貫した信頼性の高い動作を保証し、24時間ごとおよび新しいコードがコミットされるたびに自動的に実行されます。