Skip to main content

カスタムデータセットでYOLOをファインチューニングする方法

ファインチューニングとは、ランダムな初期化ではなく、学習済みの重みから開始することで、新しいクラスを認識するように事前学習済みモデルを適応させる手法です。何百エポックもかけてゼロから学習する代わりに、ファインチューニングは事前学習済みのCOCO特徴を活用し、わずかな時間でカスタムデータに適応(収束)させます。

本ガイドでは、カスタムデータセットにおけるYOLO26のファインチューニングについて、基本的な使用方法から、レイヤーの凍結(layer freezing)2段階トレーニング.

ファインチューニングとゼロからの学習(Training from Scratch)の比較

事前学習済みモデルは、何百万もの画像からエッジ検出、テクスチャ認識、形状理解といった一般的な視覚的特徴をすでに学習しています。バックボーンのフリーズと解除ファインチューニングを通じることでその知識を再利用し、モデルに新しいクラスがどのように見えるかだけを教えるため、収束が速く、より少ないデータで済みます。ゼロからの学習ではこれらすべてを破棄し、ピクセルレベルのパターンからすべてを強制的に学習させる必要があるため、大幅に多くのリソースを要します。

ファインチューニングゼロからの学習
開始時の重みCOCO(80クラス)で事前学習済みランダムな初期化
コマンドYOLO("yolo26n.pt")YOLO("yolo26n.yaml")
収束高速 - バックボーンは学習済み低速 - すべてのレイヤーをゼロから学習
データ要件低 - 事前学習済みの特徴がデータの少なさを補う高 - モデルがデータセットからすべての特徴を学習する必要がある
推奨されるケース自然画像を用いたカスタムクラスCOCOと根本的に異なるドメイン(医療、衛星、レーダー)
ファインチューニングに追加のコードは不要です

ファイルが.ptで読み込まれると、事前学習済みの重みがモデルに保存されます。その後YOLO("yolo26n.pt")を呼び出すと、互換性のあるすべての重みが新しいモデルアーキテクチャに自動的に転送され、一致しないレイヤー(クラス数が異なる場合の検出ヘッドなど)が再初期化されて学習が開始されます。手動での重みの読み込み、レイヤーの操作、またはカスタムの転移学習用コードは不要です。.train(data="custom.yaml")手動での重みの読み込み、レイヤー操作、または転移学習用のカスタムコードは一切不要です。

事前学習済みの重み転送の仕組み

事前学習済みモデルをクラス数の異なるデータセット(例えばCOCOの80クラスから5つのカスタムクラスへ)でファインチューニングする場合、Ultralyticsは形状を考慮した重み転送を行います:

  1. バックボーンとネックの完全転送 - これらのレイヤーは一般的な視覚的特徴を抽出し、その形状はクラス数に依存しません。
  2. 検出ヘッドの部分的な再初期化 - 分類出力レイヤー(cv3, one2one_cv3)はクラス数(80対5)に応じた形状を持つため、転送できずランダムに初期化されます。ヘッド内のボックス回帰レイヤー(cv2, one2one_cv2)はクラス数に関係なく形状が固定されているため、通常通り転送されます。
  3. 重みの大部分は転送されますクラス数を変更する場合でも、再初期化されるのは検出ヘッド内の分類固有レイヤーのみであり、バックボーン、ネック、およびボックス回帰ブランチはそのまま保持されます。

事前学習済みモデルと同じクラス数のデータセット(例えば、COCO事前学習済み重みを別の80クラスデータセットでファインチューニングする場合)では、検出ヘッドを含む重みの100%が転送されます。

基本的なファインチューニングの例

from ultralytics import YOLO

model = YOLO("yolo26n.pt")  # load pretrained model
model.train(data="path/to/data.yaml", epochs=50, imgsz=640)

モデルサイズの選択

大きなモデルは容量が大きい一方で更新すべきパラメータも多いため、トレーニングデータが限られている場合には過学習のリスクが高まる可能性があります。まずは小さなモデル(YOLO26nやYOLO26s)から始め、検証メトリクスがプラトー(停滞)に達した場合にのみスケールアップするのが実用的なアプローチです。最適なモデルサイズはタスクの複雑さ、クラス数、データセットの多様性、およびデプロイ用のハードウェアに依存します。利用可能なサイズとパフォーマンスのベンチマークについては、完全なYOLO26モデルページを参照してください。

オプティマイザーと学習率の選択

デフォルトのoptimizer=auto設定では、総トレーニング反復回数に基づいてオプティマイザーと学習率が選択されます:

  • 10,000回未満の反復(小規模データセットや少ないエポック数):自動計算された低い学習率のAdamW
  • 10,000回以上の反復(大規模データセット):MuSGD(ハイブリッド型のMuon+SGDオプティマイザー)、lr=0.01

ほとんどのファインチューニングタスクにおいて、デフォルト設定で手動調整なしに良好な結果が得られます。手動でオプティマイザーを設定することを検討すべきケースは以下の通りです:

  • トレーニングが不安定(損失が急上昇または発散する場合):より安定した収束のためにoptimizer=AdamW, lr0=0.001を試してください。
  • 小規模データセットで大型モデルをファインチューニングする場合:より低い学習率(lr0=0.001など)は、事前学習済みの特徴を維持するのに役立ちます。
自動オプティマイザーは手動のlr0をオーバーライドします

が使用される場合、Ultralyticsは自動的に長期間の学習(通常は10000イテレーション以上)に対してoptimizer=auto 関数は 'path/to/last.pt' ファイルに保存された状態を使用して、中断された箇所からトレーニングを継続します。もし lr0momentum値は無視されます。学習率を手動で制御するには、オプティマイザーを明示的に設定してください:optimizer=SGD, lr0=0.005.

レイヤーの凍結

凍結により、トレーニング中に特定のレイヤーが更新されるのを防ぎます。これにより、トレーニングが高速化され、モデル容量に対してデータセットが小さい場合の過学習が低減されます。

このfreezeパラメータは整数またはリストを受け付けます。整数freeze=10は最初の10レイヤー(0から9、YOLO26ではバックボーンに相当)を凍結します。リストにはfreeze=[0, 3, 5]のようなレイヤーインデックスや、freeze=["23.cv2"]のようなモジュール名文字列を含めることで、レイヤー内の特定のブランチを細かく制御できます。

model.train(data="custom.yaml", epochs=50, freeze=10)

適切な凍結深度は、ターゲットドメインが事前学習データとどの程度似ているか、および利用可能なトレーニングデータの量に依存します:

SyncBatchNormを使用すべき場合推奨根拠
大規模データセット、類似ドメインfreeze=None (デフォルト)過学習せずに全レイヤーを適応させるのに十分なデータ
小規模データセット、類似ドメインfreeze=10バックボーンの特徴を保持し、学習可能なパラメータを削減
非常に小規模なデータセットfreeze=23検出ヘッドのみをトレーニングし、過学習リスクを最小化
ドメインがCOCOから大きく乖離freeze=Noneバックボーンの特徴がうまく転送されない可能性があるため、再学習が必要

凍結深度はハイパーパラメータとして扱うこともできます。いくつかの値(0, 5, 10)を試し、検証mAPを比較することが、特定のデータセットに最適な設定を見つける実用的な方法です。

ファインチューニングの主要なハイパーパラメータ

ファインチューニングは通常、ゼロからの学習よりもハイパーパラメータの調整が少なくて済みます。最も重要なパラメータは以下の通りです:

  • epochs: ファインチューニングはゼロからの学習よりも速く収束します。中程度の値から始め、patienceを使用して検証メトリクスがプラトーに達したら早期終了させます。
  • patience: デフォルトの100は長期トレーニング用に設計されています。これを10〜20に減らすことで、すでに収束した実行に時間を無駄に費やすことを防げます。
  • warmup_epochs: デフォルトのウォームアップ(3エポック)では、学習率をゼロから徐々に増加させます。これにより、初期の反復で大きな勾配更新が発生して事前学習済みの特徴が損なわれるのを防ぎます。ファインチューニングであってもデフォルトの維持が推奨されます。

トレーニングパラメータの完全なリストについては、トレーニング構成のリファレンス.

を参照してください。

2段階のファインチューニング

2段階ファインチューニングでは、トレーニングを2つのフェーズに分けます。最初の段階ではバックボーンを凍結してネックとヘッドのみをトレーニングし、事前学習済みの特徴を損なうことなく検出レイヤーを新しいクラスに適応させます。2番目の段階では、すべてのレイヤーの凍結を解除し、低い学習率でモデル全体をトレーニングしてターゲットドメイン向けにバックボーンを洗練させます。IoU 0.5:0.95におけるmAP.

このアプローチは、ターゲットドメインがCOCOと大きく異なる場合(医療画像、航空画像、顕微鏡画像など)に特に有効です。このような場合、バックボーンに適応が必要なものの、すべてを同時にトレーニングすると不安定になる可能性があるためです。
from ultralytics import YOLO

# Stage 1: freeze backbone, train head and neck
model = YOLO("yolo26n.pt")
model.train(data="custom.yaml", epochs=20, freeze=10, name="stage1", exist_ok=True)

# Stage 2: unfreeze all, fine-tune with lower lr
model = YOLO("runs/detect/stage1/weights/best.pt")
model.train(data="custom.yaml", epochs=30, lr0=0.001, name="stage2", exist_ok=True)

2段階ファインチューニング

よくある落とし穴

  • モデルが予測を出力しない不十分なトレーニングデータ
  • : 非常に少数のサンプルでトレーニングすることが最も一般的な原因です。データが少なすぎるとモデルは学習も汎化もできません。他の原因を調査する前に、クラスごとに十分で多様な例があることを確認してください。: data.yaml は、警告なしにラベルがゼロになる可能性があります。トレーニングの前に yolo detect val model=yolo26n.pt data=your_data.yaml を実行して、ラベルが正しく読み込まれていることを確認してください。
  • 信頼度しきい値の引き下げ: 予測は存在するものの除外されている場合は、推論中に conf=0.1 を試してください。
  • クラス数の確認: nc内のdata.yaml がラベルファイル内の実際のクラス数と一致していることを確認してください。

検証用 mAP が早期に頭打ちになる

  • データの追加: ファインチューニングは、追加のトレーニングデータ(特に多様な角度、照明、背景を持つ例)によって大幅に改善されます。
  • クラスバランスの確認: 代表例が少ないクラスは AP が低くなります。 cls_pw を使用して逆頻度クラス重み付けを適用してください(適度な不均衡には cls_pw=0.25 から始め、深刻な不均衡には 1.0 に増やしてください)。
  • オーグメンテーションの削減: 非常に小さなデータセットの場合、強力なオーグメンテーションは逆効果になる可能性があります。 mosaic=0.5mosaic=0.0.
  • 解像度の引き上げ: 小さなオブジェクトを含むデータセットの場合は、imgsz=1280 を試して詳細を保持してください。

ファインチューニング後に元のクラスのパフォーマンスが低下する

これは破滅的忘却として知られています。新しいデータのみでファインチューニングを行うと、モデルは以前学習した知識を失います。元のデータセットの画像を新しいデータと一緒に含めない限り、忘却はほぼ避けられません。これを軽減するには:

  • データセットの統合: ファインチューニング中に、元のクラスの例を新しいクラスと一緒に含めます。これが忘却を防ぐ唯一の確実な方法です。
  • バックボーンとネックのフリーズ: バックボーンとネックの両方をフリーズして検出ヘッドのみをトレーニングすることは、非常に低い学習率での短いファインチューニング実行に役立ちます。
  • エポック数の削減: 新しいデータのみでモデルをトレーニングする時間が長くなるほど、忘却が進行します。

FAQ

YOLOをファインチューニングするには何枚の画像が必要ですか?

固定された最小値はありません。結果はタスクの複雑さ、クラス数、およびドメインが COCO にどれだけ近いかによって異なります。生データ量よりも、多様な画像(照明、角度、背景のバリエーション)が重要です。手持ちのデータから始め、検証メトリクスが不十分な場合はスケールアップしてください。

カスタムデータセットで YOLO26 をファインチューニングするにはどうすればよいですか?

事前学習済みの .pt ファイルを読み込み、カスタム .train() へのパスを指定して data.yaml を呼び出します。Ultralytics は自動的に 重みの転送、検出ヘッドの再初期化、およびオプティマイザの選択を処理します。完全なコード例については 基本ファインチューニング セクションを参照してください。

ファインチューニングした YOLO モデルが何も検出しないのはなぜですか?

最も一般的な原因は、data.yaml 内の誤ったパス(警告なしにラベルがゼロになる)、YAML 内の nc と実際のラベルファイル間の不一致、または信頼度しきい値が高すぎることです。トラブルシューティングの全チェックリストについては 2段階ファインチューニング を参照してください。

ファインチューニングのためにどの YOLO レイヤーをフリーズすべきですか?

これはデータセットのサイズとドメインの類似性によって異なります。COCO に近いドメインの小さなデータセットの場合は、バックボーン (freeze=10) をフリーズすると過学習を防げます。COCO と大きく異なるドメインの場合は、すべてのレイヤーをフリーズしない (freeze=None) ことで、バックボーンを適応させることができます。詳細な推奨事項については レイヤーの凍結 を参照してください。

新しいクラスで YOLO をファインチューニングする際、破滅的忘却を防ぐにはどうすればよいですか?

トレーニングデータに新しいクラスと一緒に元のクラスの例を含めてください。それが不可能な場合は、より多くのレイヤー (freeze=10 以上) をフリーズし、低い学習率を使用することで、事前学習済みの知識を保持できます。詳しくは 元のクラスでパフォーマンスが低下する を確認してください。

コメント