コンテンツへスキップ

YOLOv5凍結レイヤーによる転移学習

このガイドでは、フリーズする方法について説明します。 YOLOv5レイヤーを凍結する方法を説明します。転移学習は強力な機械学習(ML)手法で、ネットワーク全体をゼロから再トレーニングすることなく、新しいデータに対してモデルを素早く再トレーニングすることができます。初期層の重みを凍結し、それ以降の層のパラメータのみを更新することで、計算リソース要件と学習時間を大幅に削減することができます。ただし、この方法は最終的なモデルの精度に若干の影響を与える可能性があります。

始める前に

まず、YOLOv5 リポジトリをクローンし、必要な依存関係を requirements.txt.を持っていることを確認する。 Python.8.0 環境 PyTorch.8 をインストールしました。トレーニング済み モデル と要求された。 データセット は、最新のYOLOv5自動的にダウンロードされます。 リリース.

git clone https://github.com/ultralytics/yolov5 # clone repository
cd yolov5
pip install -r requirements.txt # install dependencies

レイヤー・フリージングの仕組み

で冷凍保存する場合 ニューラルネットワークこの場合、学習プロセス中にパラメータweights and biases)が更新されないようにします。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 引数で指定する。この引数は、最初の フローズン このインデックスより前のモジュールはウェイトが凍結される。

凍結バックボーンのみ

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

このアプローチは、学習した特徴の大部分はそのままに、異なる数の出力クラスに対してモデルを調整する必要がある場合に便利です。微調整に必要な計算資源が最も少なくて済みます。

パフォーマンス比較

凍結層の効果を説明するために、YOLOv5mを次のようにトレーニングした。 パスカル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比較

異なる冷凍戦略を比較したmAP50-95のトレーニング結果 トレーニング中のmAP50-95比較

パフォーマンス結果をまとめた表 パフォーマンス・メトリクスのサマリー表

資源利用

より多くのレイヤーを凍らせることで GPUメモリ要件と全体の使用率を大幅に削減します。このため、限られたハードウェアリソースで作業する場合、凍結レイヤーを使用した転移学習は魅力的なオプションとなり、他の方法で可能な場合よりも大きなモデルのトレーニングや大きな画像サイズを使用することができます。

トレーニング中のGPU メモリ割り当て率 GPU メモリの割り当て(%)

トレーニング中のGPU メモリ使用率 GPU 使用率(%)

レイヤー・フリージングの使用時期

転移学習中のレイヤーフリーズは、いくつかの状況で特に有利である:

  1. 限られた計算リソース:GPU メモリや処理能力に制約がある場合。
  2. 小さなデータセット:ターゲット・データセットが元の事前学習データセットよりかなり小さい場合、フリーズすることでオーバーフィッティングを防ぐことができる。
  3. ラピッドプロトタイピング:既存のモデルを新しいタスクやドメインに素早く適応させ、初期評価を行う必要がある場合。
  4. 類似した特徴ドメイン:新しいデータセットの低レベル特徴量が、モデルが事前にトレーニングしたデータセットの特徴量と非常に類似している場合。

用語集では、転移学習のニュアンスについて詳しく説明し、パフォーマンスを最適化するためのハイパーパラメータ・チューニングのようなテクニックを検討します。

対応環境

Ultralytics 、以下のような必要不可欠な依存関係を持つ様々なすぐに使える環境を提供します。 CUDACuDNNPythonおよび PyTorchがプリインストールされています。

プロジェクト状況

YOLOv5 継続的インテグレーションの状況

このバッジは、すべてのYOLOv5 GitHub Actions継続的インテグレーション(CI)テストが正常にパスしていることを確認するものです。これらのCIテストは、トレーニング検証推論エクスポートベンチマークといった主要なオペレーションにわたって、YOLOv5 5の機能とパフォーマンスを厳密に評価します。これらのテストは、macOS、Windows、Ubuntu上で一貫した信頼性の高い動作を保証し、24時間ごとに、新しいコードのコミットごとに自動的に実行されます。

📅作成:1年前 ✏️更新 15日前

コメント