コンテンツへスキップ

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

このガイドでは、転移学習を実装する際にYOLOv5 🚀レイヤーをフリーズする方法を説明します。転移学習は、ネットワーク全体を再学習させることなく、新しいデータに対してモデルを素早く再学習させることができる強力なテクニックです。初期重みの一部を凍結し、残りの部分のみを更新することで、計算リソースとトレーニング時間を大幅に削減することができますが、この方法は最終的なモデルの精度に若干の影響を与える可能性があります。

始める前に

レポジトリをクローンし、requirements.txt をPython.8.0環境にインストールします。 PyTorch.8.モデルとデータセットは最新のYOLOv5 リリースから自動的にダウンロードされます。

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

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

ニューラルネットワークのレイヤーをフリーズさせるということは、基本的にレイヤーのパラメーターを学習不可能に設定するということである。これらのレイヤーの勾配はゼロに設定され、バックプロパゲーション中にウェイトが更新されることはない。これはYOLOv55の学習プロセスで以下のように実装されている:

# Freeze
freeze = [f"model.{x}." for x in range(freeze)]  # layers to freeze
for k, v in model.named_parameters():
    v.requires_grad = True  # train all layers
    if any(x in k for x in freeze):
        print(f"freezing {k}")
        v.requires_grad = False

モデル・アーキテクチャの探求

モデルの特定の部分を効果的にフリーズさせるには、レイヤー構造を理解することが役に立つ。すべてのモジュール名は

for k, v in model.named_parameters():
    print(k)

"""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 アーキテクチャは、バックボーン(レイヤー0~9)とヘッド(残りのレイヤー)で構成されている:

# YOLOv5 v6.0 backbone
backbone:
    # [from, number, module, args]
    - [-1, 1, Conv, [64, 6, 2, 2]] # 0-P1/2
    - [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
    - [-1, 3, C3, [128]]
    - [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
    - [-1, 6, C3, [256]]
    - [-1, 1, Conv, [512, 3, 2]] # 5-P4/16
    - [-1, 9, C3, [512]]
    - [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32
    - [-1, 3, C3, [1024]]
    - [-1, 1, SPPF, [1024, 5]] # 9

# YOLOv5 v6.0 head
head:
    - [-1, 1, Conv, [512, 1, 1]]
    - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
    - [[-1, 6], 1, Concat, [1]] # cat backbone P4
    - [-1, 3, C3, [512, False]] # 13
    # ... remaining head layers

冷凍オプション

凍結バックボーンのみ

バックボーン(レイヤー0-9)のみを凍結する。これは、学習した特徴抽出機能を保持したまま、新しいクラスにモデルを適応させるのに便利である:

python train.py --freeze 10

このアプローチは、新しいデータセットが元の学習データと似たような低レベルの特徴を共有しているが、クラスやオブジェクトが異なる場合に特に効果的である。

検出レイヤー以外をフリーズ

Detectモジュールの最終出力畳み込み層を除いてモデル全体をフリーズさせる:

python train.py --freeze 24

このアプローチは、モデルの学習された特徴のほとんどを維持したいが、異なる数のクラスを検出するために適応させる必要がある場合に理想的である。

パフォーマンス比較

YOLOv5mをVOCデータセットに対して、公式COCO事前学習済み重みから開始し、異なる凍結戦略を用いて学習させた:

python train.py --batch 48 --weights yolov5m.pt --data voc.yaml --epochs 50 --cache --img 512 --hyp hyp.finetune.yaml

精度結果

その結果、レイヤーを凍結させることでトレーニングは高速化されるが、最終的な精度はわずかに低下することが示された:

冷凍トレーニングmAP50の結果

冷凍トレーニングmAP50-95の結果

表結果

資源利用

より多くのレイヤーをフリーズさせることで、GPU メモリ要件と使用率が削減されるため、このテクニックはより大きなモデルのトレーニングや、より高解像度の画像を使用する場合に有効です:

トレーニングGPU メモリ割り当て率

トレーニングGPU メモリ使用率

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

転移学習におけるレイヤー凍結は、次のようなシナリオで特に有効である:

  1. 限られた計算リソース:GPU メモリや処理能力に制約がある場合
  2. 小さなデータセット:新しいデータセットが小さすぎて、オーバーフィットせずに完全なモデルを学習できない場合
  3. 迅速な適応:モデルを新しいドメインに迅速に適応させる必要がある場合
  4. 特定のタスクのための微調整:一般的なモデルを特殊なアプリケーションに適応させる場合

転移学習のテクニックとその応用については、転移学習用語集の項目を参照。

対応環境

Ultralytics をはじめとする必要不可欠な依存関係がプリインストールされた、さまざまなすぐに使える環境を提供する。 CUDACUDNNPythonそして PyTorchなどがプリインストールされています。

プロジェクト状況

YOLOv5 CI

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

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

コメント