カスタムデータセットYOLO 微調整する方法
ファインチューニングとは、ランダムな初期化ではなく、学習済みの重みから開始することで、事前学習済みモデルを新しいクラスを認識できるように調整する手法です。何百エポックにもわたって一から学習させる代わりに、ファインチューニングでは事前学習済みモデルを活用します COCO の特徴量を活用し、カスタムデータに対してわずかな時間で収束させます。
このガイドでは、カスタムデータセットを用いたYOLO26の微調整について、基本的な使い方から、レイヤーの固定や2段階学習といった高度な手法まで解説します。
微調整とゼロからの学習
事前学習済みのモデルは、すでに数百万枚の画像から、エッジ検出、テクスチャ認識、形状の理解といった一般的な視覚的特徴を学習しています。微調整による転移学習では、その知識を再利用し、新しいクラスの外観だけをモデルに学習させるため、収束が速く、必要なデータ量も少なくて済みます。一方、ゼロからの学習では、そうした知識をすべて捨て去り、モデルにピクセルレベルのパターンからすべてを学習させることになるため、はるかに多くのリソースが必要となります。
| ファインチューニング | ゼロからのトレーニング | |
|---|---|---|
| 開始時の重量 | COCO 80クラス)で事前学習済み | ランダム初期化 |
| コマンド | YOLO("yolo26n.pt") | YOLO("yolo26n.yaml") |
| 収束 | より高速 - バックボーンはすでに学習済み | スローモード - すべてのレイヤーがゼロから学習する |
| データ要件 | 下段 - 事前学習済み特徴量により、データ量の少なさを補う | より高度なモデル - データセットのみからすべての特徴を学習しなければならない |
| 使用時期 | 自然の風景を題材にしたカスタムクラス | COCO とは根本的に異なる分野COCO 医療、衛星、レーダー) |
微調整に追加のコードは必要ありません
ある時、 .pt ファイルは読み込まれています YOLO("yolo26n.pt"), 事前学習済みの重みがモデルに保存されます。呼び出す .train(data="custom.yaml") その後、互換性のある重みをすべて新しいモデルアーキテクチャに自動的に転送し、一致しないレイヤー(クラスの数が異なる場合の検出ヘッドなど)を再初期化し、トレーニングを開始します。手動での重みの読み込み、レイヤーの操作、あるいはカスタム転移学習コードは一切必要ありません。
事前学習済み重みの転移の仕組み
事前学習済みのモデルを、クラス数が異なるデータセット(例えば、COCOカスタムクラスへ)で微調整する場合、Ultralytics 形状を考慮した重み転移Ultralytics :
- 背骨と首の転移を完全に適用する――これらの層は一般的な視覚的特徴を抽出しており、その形状はクラスの数に依存しない。
- 検出ヘッドが部分的に再初期化されました - 分類出力層(
cv3,one2one_cv3)はクラス数(80対5)に依存する形状を持つため、転送できず、ランダムに初期化されます。ボックス回帰レイヤー(cv2,one2one_cv2) ヘッダー内の要素は、クラスの数にかかわらず固定された形状を持っているため、通常通り引き継がれます。 - クラス数の変更時には、重みの大部分が引き継がれます。検出ヘッド内の分類固有のレイヤーのみが再初期化され、バックボーン、ネック、およびボックス回帰のブランチはそのまま維持されます。
事前学習済みモデルと同じクラス数を持つデータセット(例えば、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)
yolo detect train model=yolo26n.pt data=path/to/data.yaml epochs=50 imgsz=640
モデルサイズの選択
大規模なモデルは処理能力が高い反面、更新すべきパラメータも多くなるため、学習データが限られている場合、過学習のリスクが高まる可能性があります。まずは小規模なモデル(YOLO26n または YOLO26s)から始め、検証指標が頭打ちになった場合にのみスケールアップするのが現実的なアプローチです。最適なモデルサイズは、タスクの複雑さ、クラス数、データセットの多様性、およびデプロイに利用できるハードウェアによって異なります。 利用可能なサイズや性能ベンチマークについては、YOLO26モデルのページをご覧ください。
最適化アルゴリズムと学習率の選択
デフォルト optimizer=auto この設定では、トレーニングの反復回数に基づいてオプティマイザと学習率を選択します:
- < 10,000 iterations (small datasets or few epochs): AdamW with a low, auto-calculated learning rate
- > 10,000回の反復(大規模データセット):lr=0.01 でのMuSGD(SGD を組み合わせたハイブリッドSGD )
ほとんどの微調整作業では、手動で調整しなくてもデフォルト設定で十分に機能します。以下の場合は、オプティマイザを明示的に設定することを検討してください:
- トレーニングが不安定です (損失が急増または乖離した場合):試してみてください
optimizer=AdamW, lr0=0.001収束をより安定させるために - 小規模なデータセットを用いた大規模モデルの微調整: 学習率を低く設定するなど
lr0=0.001事前学習済み特徴量の維持に役立ちます
自動オプティマイザーは手動設定の lr0 を上書きします
いつ optimizer=auto、 lr0 および momentum 値は無視されます。学習率を手動で制御するには、オプティマイザを明示的に設定してください: optimizer=SGD, lr0=0.005.
凍結層
フリーズを行うと、学習中に特定の層が更新されなくなります。これにより、モデルの容量に比べてデータセットが小さい場合、学習速度が向上し、過学習が抑制されます。
The freeze このパラメータは、整数またはリストのいずれかを受け付けます。整数 freeze=10 最初の10層(0から9まで。これはYOLO26のバックボーンに相当する)を固定します。リストには次のような層インデックスを含めることができます。 freeze=[0, 3, 5] バックボーンの一部を固定する場合、または次のようなモジュール名文字列 freeze=["23.cv2"] レイヤー内の特定のブランチを細かく制御するために。
例
model.train(data="custom.yaml", epochs=50, freeze=10)
model.train(data="custom.yaml", epochs=50, freeze=[0, 1, 2, 3, 4])
# Freeze the box regression branch of the detection head
model.train(data="custom.yaml", epochs=50, freeze=["23.cv2"])
適切なフリーズ深度は、対象ドメインが事前学習済みデータとどの程度類似しているか、および利用可能なトレーニングデータの量によって決まります:
| シナリオ | 推奨事項 | 理由 |
|---|---|---|
| 大規模なデータセット、類似の分野 | freeze=None (既定値) | 過学習を起こさずにすべての層を調整するのに十分なデータ |
| データセットが小さく、分野が類似している | freeze=10 | 主要な機能を維持しつつ、学習可能なパラメータ数を削減する |
| データセットが非常に小さい | freeze=23 | 学習対象は検出ヘッドのみであり、過学習のリスクを最小限に抑える |
| COCOから遠く離れたドメイン | freeze=None | バックボーンの特性はうまく引き継がれない可能性があり、再訓練が必要になる場合があります |
フリーズ深度もハイパーパラメータとして扱うことができます。いくつかの値(0、5、10)を試して、mAP 比較することは、特定のデータセットに最適な設定を見つけるための実用的なmAP 。
微調整のための主要なハイパーパラメータ
微調整は、通常、ゼロから学習させる場合よりもハイパーパラメータの調整が少なくて済みます。最も重要なパラメータは以下の通りです:
epochs: 微調整は、ゼロから学習させるよりも早く収束します。まず適度な値から始め、patience検証指標が横ばいになった時点で早期に中止する。patience: デフォルト値の100は、長時間のトレーニング実行を想定して設定されています。この値を10~20に減らすことで、すでに収束している実行に時間を浪費することを防げます。warmup_epochs: デフォルトのウォームアップ(3エポック)では、学習率がゼロから徐々に増加するため、初期の反復において大きな勾配更新によって事前学習された特徴が損なわれるのを防ぎます。微調整を行う場合でも、デフォルト設定のままにしておくことをお勧めします。
トレーニングパラメータの完全な一覧については、トレーニング構成のリファレンスを参照してください。
2段階の微調整
2段階の微調整では、学習を2つのフェーズに分けて行います。第1段階ではバックボーンを固定し、ネック層とヘッド層のみを学習させることで、事前学習された特徴を損なうことなく、検出層が新しいクラスに適応できるようにします。第2段階ではすべての層の固定を解除し、学習率を下げた状態でモデル全体を学習させることで、ターゲットドメインに合わせてバックボーンを微調整します。
このアプローチは、対象ドメインCOCO 大きく異なる場合COCO 医療画像、航空写真、顕微鏡画像など)に特に有用です。こうした場合、バックボーンの適応が必要になる一方で、すべてを一度に学習させると不安定になる恐れがあります。コールバックベースのアプローチによる自動アンフリーズについては、「バックボーンのフリーズとアンフリーズ」を参照してください。
2段階の微調整
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)
よくある落とし穴
モデルは予測を生成しない
- 学習データの不足:サンプル数が極端に少ない状態で学習を行うことが最も一般的な原因です。データが少なすぎると、モデルは学習も一般化もできません。他の原因を調べる前に、各クラスごとに十分な数の多様な例があることを確認してください。
- データセットのパスを確認する: パスが正しくない
data.yaml何も表示せずに実行する。実行yolo detect val model=yolo26n.pt data=your_data.yamlトレーニングの前に、ラベルが正しく読み込まれることを確認してください。 - 信頼区間の下限値: 予測が存在するにもかかわらず除外されている場合は、次のことを試してみてください
conf=0.1推論時に。 - クラスの数を確認する:確実にする
ncでdata.yamlラベルファイル内の実際のクラス数と一致します。
検証用mAP 早期にmAP
- データを追加する:追加の学習データ、特に角度、照明、背景が異なる多様な例を用いることで、微調整の精度が大幅に向上します。
- クラスのバランスを確認する: 過小評価されているクラスはAPが低くなる。使用
cls_pw逆周波数クラス重み付けを適用するには(以下から開始)cls_pw=0.25軽度から中程度の不均衡の場合は、量を1.0(重度の不均衡の場合)。 - 増強を縮小する: データセットが非常に小さい場合、過度なデータ拡張は逆効果になることがあります。試してみてください
mosaic=0.5またはmosaic=0.0. - 解像度を上げる: 小さなオブジェクトを含むデータセットの場合は、次の方法を試してみてください
imgsz=1280細部を忠実に再現するため。
ファインチューニング後、元のクラスのパフォーマンスが低下する
これは「壊滅的忘却」として知られており、新しいデータのみに基づいて微調整を行うと、モデルは以前に学習した知識を失ってしまう。新しいデータに加えて元のデータセットの画像を含めない限り、この忘却はほぼ避けられない。これを軽減するには:
- データセットを統合する:微調整の際、新しいクラスに加え、元のクラスの例も併せて含める。これが、学習内容の忘却を防ぐ唯一確実な方法である。
- 背骨と首を固定する:背骨と首の両方を固定し、検出ヘッドのみを学習させることで、学習率を非常に低く設定した短時間の微調整実行に役立ちます。
- 学習エポック数を減らす:モデルが新しいデータのみで学習する期間が長くなるほど、学習の忘却は増大する。
よくある質問
YOLO微調整には、何枚の画像が必要ですか?
明確な最低基準はありません。結果は、タスクの複雑さ、クラスの数、および対象ドメインCOCOどの程度類似しているかによって異なります。単純な枚数よりも、より多様な画像(照明、角度、背景が異なるもの)の方が重要です。まずは手元にあるデータから始め、検証指標が不十分な場合はデータを拡張してください。
カスタムデータセットでYOLO26を微調整するにはどうすればよいですか?
事前学習済みのモデルを読み込む .pt ファイルを開いて呼び出す .train() カスタムファイルへのパスを指定して data.yaml.Ultralytics 処理します 体重移動、検出ヘッドの再初期化、およびオプティマイザの選択。詳しくは 基本的な微調整 完全なコード例については、こちらのセクションをご覧ください。
微調整したYOLO が何も検出しないのはなぜですか?
最も一般的な原因は、 data.yaml (これは黙ってラベルをゼロ個生成する)、および nc YAMLファイルや実際のラベルファイルの設定、あるいは信頼度閾値が高すぎる可能性があります。詳しくは よくある落とし穴 トラブルシューティングのチェックリストの全文はこちら。
ファインチューニングのために、どのYOLO 凍結すべきでしょうか?
データセットの規模やドメインの類似度によって異なります。COCOとドメインが類似した小規模なデータセットの場合、バックボーンを固定して(freeze=10) 過学習を防ぐ。COCOとは大きく異なるドメインの場合、すべての層を凍結しないままにすると(freeze=None) により、バックボーンが適応できるようになります。参照 凍結層 詳細な推奨事項については、
新しいYOLO 微調整を行う際、カタストロフィック・フォーゲティングを防ぐにはどうすればよいでしょうか?
トレーニングデータには、新しいクラスに加えて、元のクラスの例も含めてください。それが不可能な場合は、より多くの層を固定して(freeze=10 (またはそれ以上)に設定し、学習率を低く設定することで、事前学習された知識を維持しやすくなります。参照 元のクラスではパフォーマンスが低下する 詳細については。