Link to this sectionカスタムデータセットでYOLOをファインチューニングする方法#
ファインチューニングとは、ランダムな初期化ではなく学習済みの重みから開始することで、新しいクラスを認識できるように事前学習済みモデルを適応させる手法です。何百エポックもゼロから学習させる代わりに、事前学習済みのCOCOの特徴量を活用することで、カスタムデータに対して短時間で収束させることができます。
本ガイドでは、YOLO26をカスタムデータセットでファインチューニングする方法について、基本的な使用法からレイヤーの凍結や2段階トレーニングといった高度なテクニックまでを網羅しています。
Link to this sectionファインチューニングとゼロからの学習(トレーニング)の比較#
事前学習済みモデルは、何百万もの画像からエッジ検出、テクスチャ認識、形状理解といった一般的な視覚的特徴をすでに学習済みです。ファインチューニングによる転移学習はその知識を再利用し、新しいクラスの見え方のみをモデルに教えるため、収束が速く、より少ないデータで済むのです。ゼロからの学習では、その知識をすべて破棄し、ピクセルレベルのパターンからすべてを学習させる必要があるため、大幅に多くのリソースを消費します。
| ファインチューニング | ゼロからの学習 | |
|---|---|---|
| 開始時の重み | COCOで事前学習済み(80クラス) | ランダムな初期化 |
| コマンド | YOLO("yolo26n.pt") | YOLO("yolo26n.yaml") |
| 収束 | 高速 - バックボーンはすでに学習済み | 低速 - すべてのレイヤーをゼロから学習 |
| 必要なデータ量 | 少ない - 事前学習済み特徴量がデータ不足を補う | 多い - モデルがデータセット単体からすべての特徴を学ぶ必要がある |
| 使用場面 | 自然画像を用いたカスタムクラス | COCOと根本的に異なるドメイン(医療、衛星、レーダーなど) |
When a .pt file is loaded with YOLO("yolo26n.pt"), the pretrained weights are stored in the model. Calling .train(data="custom.yaml") after that automatically transfers all compatible weights to the new model architecture, reinitializes any layers that don't match (such as the detection head when the number of classes differs), and begins training. No manual weight loading, layer manipulation, or custom transfer learning code is required.
Link to this section事前学習済み重みの転送の仕組み#
事前学習済みモデルをクラス数の異なるデータセットでファインチューニングする場合(例:COCOの80クラスから5クラスへ)、Ultralyticsは形状を考慮した重みの転送を行います:
- バックボーンとネックは完全に転送 - これらのレイヤーは一般的な視覚的特徴を抽出し、その形状はクラス数に依存しません。
- 検出ヘッドは部分的に再初期化 - 分類出力レイヤー(
cv3、one2one_cv3)はクラス数(80と5)に紐付いた形状であるため、転送できずにランダムに初期化されます。一方、ヘッド内のボックス回帰レイヤー(cv2、one2one_cv2)はクラス数に関係なく固定形状であるため、通常通り転送されます。 - クラス数を変更しても、重みの大部分は転送されます。例えば、YOLO26nをCOCO(80クラス)から5クラスのデータセットにファインチューニングする場合、708個の重みテンソルのうち606個が転送されます。クラス数に依存する分類レイヤーのみが再初期化され、バックボーン、ネック、およびボックス回帰のブランチはそのまま維持されます。
事前学習済みモデルと同じクラス数のデータセット(例:COCO事前学習済み重みを別の80クラスデータセットでファインチューニング)の場合、検出ヘッドを含む重みの100%が転送されます。
Link to this section基本的なファインチューニングの例#
from ultralytics import YOLO
model = YOLO("yolo26n.pt") # load pretrained model
model.train(data="custom.yaml", epochs=50, imgsz=640)Link to this sectionモデルサイズの選択#
大きいモデルは容量が大きい一方で更新すべきパラメータも増えるため、学習データが限られている場合には過学習のリスクが高まります。まずは小さいモデル(YOLO26nまたはYOLO26s)から始め、検証メトリクスが頭打ちになった場合にスケールアップするのが現実的なアプローチです。最適なモデルサイズは、タスクの複雑さ、クラス数、データセットの多様性、およびデプロイ可能なハードウェアによって決まります。利用可能なサイズとパフォーマンスのベンチマークについては、YOLO26モデルページを参照してください。
Link to this sectionオプティマイザと学習率の選択#
デフォルト設定のoptimizer=autoは、トレーニングの総反復回数に基づいてオプティマイザと学習率を自動的に選択します:
- 10,000回未満の反復(小さなデータセットや少ないエポック数):低い自動計算学習率でのAdamW
- 10,000回を超える反復(大規模なデータセット):lr=0.01でのMuSGD(Muon+SGDのハイブリッドオプティマイザ)
ほとんどのファインチューニングタスクにおいて、デフォルト設定で手動調整なしに良好な結果が得られます。以下のような場合には、明示的にオプティマイザを設定することを検討してください:
- トレーニングが不安定(損失のスパイクや発散):より安定した収束のために
optimizer=AdamW, lr0=0.001を試す - 小さなデータセットで大きなモデルをファインチューニングする場合:
lr0=0.001のような低い学習率が、事前学習済みの特徴量を保持するのに役立ちます
optimizer=autoの場合、lr0およびmomentumの値は無視されます。手動で学習率を制御するには、optimizer=SGD, lr0=0.005のようにオプティマイザを明示的に設定してください。
Link to this sectionレイヤーの凍結#
凍結(フリーズ)を行うと、学習中に特定のレイヤーの更新が停止されます。これにより学習が高速化され、モデルの容量に対してデータセットが小さい場合の過学習が抑えられます。
freezeパラメータは整数またはリストを受け付けます。整数freeze=10を指定すると、最初の10レイヤー(インデックス0-9)が凍結され、これはYOLO26のバックボーンのほとんどをカバーします。バックボーンは0-10レイヤーにまたがるため、freeze=10では最後のC2PSAブロック(レイヤー10)はトレーニング可能となります。バックボーン全体を凍結するにはfreeze=11を使用してください。リスト形式では、バックボーンの一部を凍結するためにfreeze=[0, 3, 5]のようにレイヤーインデックスを指定したり、レイヤー内の特定のブランチを細かく制御するためにfreeze=["23.cv2", "23.one2one_cv2"]のようにモジュール名の文字列を指定したりできます(ここでは検出ヘッドのボックス回帰ブランチの両方を指します)。
model.train(data="custom.yaml", epochs=50, freeze=10)適切な凍結の深さは、ターゲットドメインが事前学習済みデータとどれだけ似ているか、および学習データがどれだけ利用可能かによって決まります:
| シナリオ | 推奨 | 根拠 |
|---|---|---|
| 大規模データセット、類似ドメイン | freeze=None(デフォルト) | 過学習させずにすべてのレイヤーを適応させるのに十分なデータがある |
| 小規模データセット、類似ドメイン | freeze=10 | バックボーンの特徴を保持し、トレーニング可能なパラメータを削減する |
| 非常に小さなデータセット | freeze=23 | 検出ヘッドのみを学習させ、過学習のリスクを最小限に抑える |
| COCOから遠いドメイン | freeze=None | バックボーンの特徴がうまく転送されない可能性があるため、再学習が必要 |
凍結の深さはハイパーパラメータとして扱うこともできます。いくつかの値(0、5、10)を試し、検証mAPを比較することは、特定のデータセットに最適な設定を見つけるための実用的な方法です。
Link to this sectionファインチューニングにおける重要なハイパーパラメータ#
ファインチューニングは、ゼロからの学習に比べて必要なハイパーパラメータの調整が一般的に少なくなります。最も重要なパラメータは以下の通りです:
epochs: ファインチューニングはゼロからの学習よりも早く収束します。中程度の値から開始し、検証メトリクスが頭打ちになったらpatienceを使用して早期終了させます。patience: デフォルトの100は長期的な学習用です。これを10-20に減らすことで、すでに収束している学習に時間を無駄に費やすことを防げます。warmup_epochs: デフォルトのウォームアップ(3エポック)では、学習率をゼロから徐々に増加させることで、初期反復時に大きな勾配更新によって事前学習済みの特徴が損なわれるのを防ぎます。ファインチューニングであってもデフォルトを維持することが推奨されます。
トレーニングパラメータの全リストについては、トレーニング構成リファレンスを参照してください。
Link to this section2段階ファインチューニング#
2段階ファインチューニングは、学習を2つのフェーズに分割します。第1段階ではバックボーンを凍結し、ネックとヘッドのみを学習させることで、事前学習済みの特徴を損なうことなく検出レイヤーを新しいクラスに適応させます。第2段階では全レイヤーの凍結を解除し、より低い学習率でモデル全体を学習させ、ターゲットドメインに合わせてバックボーンを微調整します。
このアプローチは、ターゲットドメインが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)Link to this sectionよくある落とし穴#
Link to this sectionモデルが予測を出力しない#
- トレーニングデータが不十分: サンプル数が非常に少ない環境での学習は最も一般的な原因です。データが少なすぎるとモデルは学習できず、汎化もできません。他の原因を調査する前に、クラスごとに十分で多様な例があることを確認してください。
- データセットパスの確認:
data.yaml内の誤ったパスは、無言でラベルをゼロにします。学習前にyolo detect val model=yolo26n.pt data=custom.yamlを実行して、ラベルが正しく読み込まれるかを確認してください。 - 信頼度しきい値の引き下げ: 予測は存在するが除外されている場合は、推論中に
conf=0.1を試してください。 - Verify class count: ensure
ncindata.yamlmatches the actual number of classes in the label files.
Link to this section検証mAPが早期に頭打ちになる#
- データの追加: ファインチューニングは、特に角度、照明、背景が多様な例など、追加のトレーニングデータによって大幅に改善されます。
- クラスバランスの確認: 代表的でないクラスはAPが低くなります。
cls_pwを使用して逆頻度クラス重み付けを適用してください(適度な不均衡にはcls_pw=0.25から開始し、深刻な不均衡には1.0まで上げます)。 - オーグメンテーション(データ拡張)の削減: 非常に小さなデータセットの場合、強力なオーグメンテーションは助けよりも害になることがあります。
mosaic=0.5またはmosaic=0.0を試してください。 - 解像度の向上: 小さな物体があるデータセットでは、詳細を保持するために
imgsz=1280を試してください。
Link to this sectionファインチューニング後に元のクラスでの性能が低下する#
これは破滅的忘却として知られており、新しいデータのみでファインチューニングを行うと、モデルが以前に学習した知識を失う現象です。忘却は、新しいデータと一緒に元のデータセットの画像を含めない限り、ほとんど避けられません。これを軽減するには:
- データセットの結合: ファインチューニング中、新しいクラスと一緒に元のクラスの例を含めてください。これが忘却を防ぐ唯一の信頼できる方法です。
- バックボーンとネックの凍結: バックボーンとネックの両方を凍結して検出ヘッドのみを学習させることは、非常に低い学習率での短いファインチューニングにおいて役立ちます。
- エポック数を減らす: 新しいデータのみでモデルを長く学習させるほど、忘却は増加します。
Link to this sectionよくある質問 (FAQ)#
Link to this sectionYOLOのファインチューニングには何枚の画像が必要ですか?#
固定された最小値はありません。結果はタスクの複雑さ、クラス数、ドメインがCOCOにどれだけ近いかによって異なります。生の数量よりも多様な画像(照明、角度、背景が変化するもの)が重要です。あるもので開始し、検証メトリクスが不十分な場合はスケールアップしてください。
Link to this sectionカスタムデータセットでYOLO26をファインチューニングするにはどうすればよいですか?#
Load a pretrained .pt file and call .train() with the path to a custom data.yaml. Ultralytics automatically handles weight transfer, detection head reinitialization, and optimizer selection. See the Basic Fine-Tuning section for the complete code example.
Link to this sectionファインチューニングしたYOLOモデルが何も検出しないのはなぜですか?#
最も一般的な原因は、data.yaml内の不正なパス(無言でラベルが0になる)、YAML内のncと実際のラベルファイルの不一致、または信頼度しきい値が高すぎることです。トラブルシューティングの完全なチェックリストについては、よくある落とし穴を参照してください。
Link to this sectionファインチューニングのためにどのYOLOレイヤーを凍結すべきですか?#
データセットのサイズとドメインの類似性によって異なります。COCOに近いドメインの小さなデータセットでは、バックボーンを凍結(freeze=10)することで過学習を防げます。COCOと大きく異なるドメインの場合は、全レイヤーを凍結解除(freeze=None)することでバックボーンを適応させることができます。詳細な推奨事項については、レイヤーの凍結を参照してください。
Link to this section新しいクラスでYOLOをファインチューニングする際、破滅的忘却を防ぐにはどうすればよいですか?#
新しいクラスと並行して、トレーニングデータに元のクラスの例を含めてください。それが不可能な場合は、より多くのレイヤーを凍結(freeze=10以上)し、より低い学習率を使用することが事前学習済みの知識を保持するのに役立ちます。詳細については、元のクラスでの性能低下を参照してください。