モデルYAML構成ガイド#
モデルYAML構成ファイルは、Ultralyticsニューラルネットワークのアーキテクチャの設計図として機能します。これは、レイヤーの接続方法、各モジュールが使用するパラメータ、そしてネットワーク全体が異なるモデルサイズ全体にわたってどのようにスケーリングされるかを定義します。
構成構造#
モデルYAMLファイルは、アーキテクチャを定義するために連携する3つの主要セクションで構成されています。
パラメータセクション#
この parameters セクションでは、モデルのグローバル特性とスケーリング動作を指定します。
# Parameters
nc: 80 # number of classes
scales: # compound scaling constants [depth, width, max_channels]
n: [0.50, 0.25, 1024] # nano: shallow layers, narrow channels
s: [0.50, 0.50, 1024] # small: shallow depth, standard width
m: [0.50, 1.00, 512] # medium: moderate depth, full width
l: [1.00, 1.00, 512] # large: full depth and width
x: [1.00, 1.50, 512] # extra-large: maximum performance
kpt_shape: [17, 3] # pose models onlyncは、モデルが予測するクラス数を設定します。scalesは、モデルの深度、幅、最大チャンネル数を調整して、さまざまなサイズバリエーション(nano から extra-large まで)を生成する複合スケーリング係数を定義します。kpt_shapeはポーズモデルに適用されます。(x, y)個のキーポイントの場合は[N, 2]に、または(x, y, visibility)の場合は[N, 3]にすることができます。
scales パラメータを使用すると、単一のベース YAML から複数のモデルサイズを生成できます。たとえば、yolo26n.yaml をロードすると、Ultralytics はベースの yolo26.yaml を読み込み、n スケーリング係数(depth=0.50、width=0.25)を適用して nano バリエーションを構築します。
データセットで異なる nc または kpt_shape が指定されている場合、Ultralytics はランタイム時にモデル設定を自動的にオーバーライドし、データセットの YAML と一致させます。
バックボーンとヘッドのアーキテクチャ#
モデルアーキテクチャは、バックボーン(特徴抽出)とヘッド(タスク固有)のセクションで構成されています。
backbone:
# [from, repeats, module, args]
- [-1, 1, Conv, [64, 3, 2]] # 0: Initial convolution
- [-1, 1, Conv, [128, 3, 2]] # 1: Downsample
- [-1, 3, C2f, [128, True]] # 2: Feature processing
head:
- [-1, 1, nn.Upsample, [None, 2, nearest]] # 6: Upsample
- [[-1, 2], 1, Concat, [1]] # 7: Skip connection
- [-1, 3, C2f, [256]] # 8: Process features
- [[8], 1, Detect, [nc]] # 9: Detection layerレイヤー仕様形式#
すべてのレイヤーは一貫したパターンに従います: [from, repeats, module, args]
| コンポーネント | 目的 | 例 |
|---|---|---|
| from | 入力接続 | -1 (前段)、6 (レイヤー 6)、[4, 6, 8] (マルチ入力) |
| repeats | 繰り返し数 | 1 (単一)、3 (3 回繰り返し) |
| module | モジュールタイプ | Conv, C2f, TorchVision, Detect |
| args | モジュールの引数 | [64, 3, 2] (チャンネル、カーネル、ストライド) |
接続パターン#
from フィールドは、ネットワーク全体で柔軟なデータフローパターンを作成します:
- [-1, 1, Conv, [64, 3, 2]] # Takes input from previous layerレイヤーは 0 から始まるインデックスで指定されます。負のインデックスは前のレイヤーを参照し(-1 = 前のレイヤー)、正のインデックスはその位置によって特定のレイヤーを参照します。
モジュールの繰り返し#
repeats パラメータは、より深いネットワークセクションを作成します:
- [-1, 3, C2f, [128, True]] # Creates 3 consecutive C2f blocks
- [-1, 1, Conv, [64, 3, 2]] # Single convolution layer実際の繰り返し数は、モデルサイズ構成の深さスケーリング係数によって乗算されます。
利用可能なモジュール#
モジュールは機能ごとに整理されており、Ultralytics modules directory で定義されています。次のテーブルは、カテゴリ別に一般的に使用されるモジュールを示しており、ソースコードには他にも多くのモジュールが用意されています:
基本的な操作#
| モジュール | 目的 | ソース | 引数 |
|---|---|---|---|
Conv | 畳み込み + BatchNorm + 活性化 | conv.py | [out_ch, kernel, stride, pad, groups] |
nn.Upsample | 空間アップサンプリング | PyTorch | [size, scale_factor, mode] |
nn.Identity | パススルー操作 | PyTorch | [] |
複合ブロック#
| モジュール | 目的 | ソース | 引数 |
|---|---|---|---|
C2f | 2つの畳み込みを備えたCSPボトルネック | block.py | [out_ch, shortcut, expansion] |
SPPF | 空間ピラミッドプーリング(高速) | block.py | [out_ch, kernel_size] |
Concat | チャネル単位の連結 | conv.py | [dimension] |
専門モジュール#
| モジュール | 目的 | ソース | 引数 |
|---|---|---|---|
TorchVision | 任意のtorchvisionモデルを読み込み | block.py | [out_ch, model_name, weights, unwrap, truncate, split] |
Index | リストから特定のテンソルを抽出 | block.py | [out_ch, index] |
Detect | YOLO検出ヘッド | head.py | [nc] |
これは利用可能なモジュールの一部を表しています。モジュールの全リストとそのパラメータについては、modules directory を確認してください。
高度な機能#
TorchVisionの統合#
TorchVision モジュールにより、任意の TorchVision model をバックボーンとしてシームレスに統合できます:
from ultralytics import YOLO
# Model with ConvNeXt backbone
model = YOLO("convnext_backbone.yaml")
results = model.train(data="coco8.yaml", epochs=100)マルチスケール検出用の中間特徴マップを取得するには、最後のパラメータを True に設定します。
特徴選択のためのIndexモジュール#
複数の特徴マップを出力するモデルを使用する場合、Indexモジュールは特定の出力を選択します。
backbone:
- [-1, 1, TorchVision, [768, convnext_tiny, DEFAULT, True, 2, True]] # Multi-output
head:
- [0, 1, Index, [192, 4]] # Select 4th feature map (192 channels)
- [0, 1, Index, [384, 6]] # Select 6th feature map (384 channels)
- [0, 1, Index, [768, 8]] # Select 8th feature map (768 channels)
- [[1, 2, 3], 1, Detect, [nc]] # Multi-scale detectionモジュール解決システム#
Ultralyticsがどのようにモジュールを検索しインポートするかを理解することは、カスタマイズにおいて非常に重要です。
モジュール検索プロセス#
Ultralytics は parse_model で 3 階層システムを使用します:
# Core resolution logic
m = (
getattr(torch.nn, m[3:])
if "nn." in m
else getattr(torchvision.ops, m[16:])
if "torchvision.ops." in m
else globals()[m]
)- PyTorch モジュール:
'nn.'で始まる名前 →torch.nn名前空間 - TorchVision 操作:
'torchvision.ops.'で始まる名前 →torchvision.ops名前空間 - Ultralyticsモジュール: その他のすべての名前 → インポート経由でグローバル名前空間
モジュールインポートチェーン#
標準モジュールは、tasks.py でのインポートを通じて利用可能になります:
from ultralytics.nn.modules import ( # noqa: F401
SPPF,
C2f,
Conv,
Detect,
# ... many more modules
Index,
TorchVision,
)カスタムモジュールの統合#
ソースコードの変更#
ソースコードの変更はカスタムモジュールを統合する最も柔軟な方法ですが、難易度が高い場合があります。カスタムモジュールを定義して使用するには、以下の手順に従ってください。
-
Quickstart guide の Git クローン方法を使用して、開発モードで Ultralytics をインストールします。
-
ultralytics/nn/modules/block.pyでモジュールを定義します:class CustomBlock(nn.Module): """Custom block with Conv-BatchNorm-ReLU sequence.""" def __init__(self, c1, c2): """Initialize CustomBlock with input and output channels.""" super().__init__() self.layers = nn.Sequential(nn.Conv2d(c1, c2, 3, 1, 1), nn.BatchNorm2d(c2), nn.ReLU()) def forward(self, x): """Forward pass through the block.""" return self.layers(x) -
ultralytics/nn/modules/__init__.pyでパッケージレベルでモジュールを公開します:from .block import CustomBlock # noqa makes CustomBlock available as ultralytics.nn.modules.CustomBlock -
ultralytics/nn/tasks.pyのインポートに追加します:from ultralytics.nn.modules import CustomBlock # noqa -
ultralytics/nn/tasks.py内のparse_model()で(必要な場合)特殊な引数を処理します:# Add this condition in the parse_model() function if m is CustomBlock: c1, c2 = ch[f], args[0] # input channels, output channels args = [c1, c2, *args[1:]] -
モデルYAMLでモジュールを使用します。
# custom_model.yaml nc: 1 backbone: - [-1, 1, CustomBlock, [64]] head: - [-1, 1, Classify, [nc]] -
フォワードパスが機能することを確認するためにFLOPsをチェックします。
from ultralytics import YOLO model = YOLO("custom_model.yaml", task="classify") model.info() # should print non-zero FLOPs if working
設定例#
基本的な検出モデル#
# Simple YOLO detection model
nc: 80
scales:
n: [0.33, 0.25, 1024]
backbone:
- [-1, 1, Conv, [64, 3, 2]] # 0-P1/2
- [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
- [-1, 3, C2f, [128, True]] # 2
- [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
- [-1, 6, C2f, [256, True]] # 4
- [-1, 1, SPPF, [256, 5]] # 5
head:
- [-1, 1, Conv, [256, 3, 1]] # 6
- [[6], 1, Detect, [nc]] # 7TorchVisionバックボーンモデル#
# ConvNeXt backbone with YOLO head
nc: 80
backbone:
- [-1, 1, TorchVision, [768, convnext_tiny, DEFAULT, True, 2, True]]
head:
- [0, 1, Index, [192, 4]] # P3 features
- [0, 1, Index, [384, 6]] # P4 features
- [0, 1, Index, [768, 8]] # P5 features
- [[1, 2, 3], 1, Detect, [nc]] # Multi-scale detection分類モデル#
# Simple classification model
nc: 1000
backbone:
- [-1, 1, Conv, [64, 7, 2, 3]]
- [-1, 1, nn.MaxPool2d, [3, 2, 1]]
- [-1, 4, C2f, [64, True]]
- [-1, 1, Conv, [128, 3, 2]]
- [-1, 8, C2f, [128, True]]
- [-1, 1, nn.AdaptiveAvgPool2d, [1]]
head:
- [-1, 1, Classify, [nc]]ベストプラクティス#
アーキテクチャ設計のヒント#
シンプルに開始する: カスタマイズする前に、実績のあるアーキテクチャから始めます。既存のYOLO設定をテンプレートとして使用し、ゼロから構築するのではなく、段階的に変更を加えます。
段階的にテストする: 各変更ステップを検証します。カスタムモジュールを一度に1つずつ追加し、機能することを確認してから次の変更に進みます。
チャンネルの監視: 接続されたレイヤー間でチャンネルの次元が一致していることを確認します。あるレイヤーの出力チャンネル(c2)は、シーケンス内の次のレイヤーの入力チャンネル(c1)と一致している必要があります。
スキップ接続の使用: [[-1, N], 1, Concat, [1]] パターンで特徴の再利用を活用します。これらの接続は勾配の流れを助け、モデルが異なるスケールの特徴を組み合わせることを可能にします。
適切なスケーリング: 計算上の制約に基づいてモデルのスケールを選択します。エッジデバイスには nano(n)、バランスの取れたパフォーマンスには small(s)、最大の精度にはより大きなスケール(m、l、x)を使用します。
パフォーマンスに関する考慮事項#
深度と幅: 深いネットワークは複数の変換レイヤーを通じて複雑な階層的特徴を捉えますが、幅の広いネットワークは各レイヤーでより多くの情報を並行して処理します。タスクの複雑さに基づいてこれらをバランスさせます。
スキップ接続: トレーニング中の勾配フローを改善し、ネットワーク全体で特徴の再利用を可能にします。消失勾配を防ぐため、より深いアーキテクチャでは特に重要です。
ボトルネックブロック: モデルの表現力を維持しながら計算コストを削減します。C2f のようなモジュールは、特徴学習能力を維持しながら、標準の畳み込みよりも少ないパラメータを使用します。
マルチスケール特徴: 同一画像内の異なるサイズのオブジェクトを検出するために不可欠です。異なるスケールで複数の検出ヘッドを持つFeature Pyramid Network(FPN)パターンを使用します。
トラブルシューティング#
一般的な問題#
| 問題 | 原因 | 解決策 |
|---|---|---|
KeyError: 'ModuleName' | モジュールがインポートされていません | tasks.py のインポートに追加する |
| チャンネル次元の不一致 | 誤った args の指定 | 入出力チャンネルの互換性を確認します |
AttributeError: 'int' object has no attribute | 引数の型が間違っています | 正しい引数の型についてモジュールのドキュメントを確認します |
| モデルの構築に失敗します | 無効な from 参照 | 参照されたレイヤーが存在することを確認します |
デバッグのヒント#
カスタムアーキテクチャを開発する際、体系的なデバッグが早期の問題特定に役立ちます。
テストにIdentity Headを使用する
バックボーンの問題を切り分けるために、複雑なヘッドを nn.Identity に置き換えます:
nc: 1
backbone:
- [-1, 1, CustomBlock, [64]]
head:
- [-1, 1, nn.Identity, []] # Pass-through for debuggingこれにより、バックボーンの出力を直接検査できます。
import torch
from ultralytics import YOLO
model = YOLO("debug_model.yaml")
output = model.model(torch.randn(1, 3, 640, 640))
print(f"Output shape: {output.shape}") # Should match expected dimensionsモデルアーキテクチャの検査
FLOPsカウントをチェックし、各レイヤーを出力することも、カスタムモデル設定の問題をデバッグするのに役立ちます。有効なモデルであれば、FLOPsカウントはゼロ以外の値になるはずです。ゼロの場合、フォワードパスに問題がある可能性が高いです。シンプルなフォワードパスを実行すると、発生している正確なエラーが表示されるはずです。
from ultralytics import YOLO
# Build model with verbose output to see layer details
model = YOLO("debug_model.yaml", verbose=True)
# Check model FLOPs. Failed forward pass causes 0 FLOPs.
model.info()
# Inspect individual layers
for i, layer in enumerate(model.model.model):
print(f"Layer {i}: {layer}")段階的な検証
- 最小限で開始: まずは最もシンプルなアーキテクチャでテストします
- 段階的に追加: レイヤーごとに複雑さを構築します
- 次元を確認: チャンネルと空間サイズの互換性を検証します
- スケーリングの検証: 異なるモデルスケール(
n、s、m)でテストします
よくある質問 (FAQ)#
YAML ファイルの先頭に
ncパラメータを設定して、データセットのクラス数に合わせます。nc: 5 # 5 classesはい。TorchVision バックボーンを含むサポートされている任意のモジュールを使用するか、独自のカスタムモジュールを定義して、Custom Module Integration で説明されているようにインポートできます。
YAML 内の
scalesセクションを使用して、深度、幅、および最大チャンネルのスケーリング係数を定義します。ファイル名の末尾にスケールを追加してベース YAML ファイルをロードすると、モデルはこれらを自動的に適用します(例:yolo26n.yaml)。この形式は、各レイヤーがどのように構築されるかを指定します。
from: 入力ソースrepeats: モジュールを繰り返す回数module: レイヤータイプargs: モジュールの引数
あるレイヤーの出力チャンネルが次のレイヤーの期待される入力チャンネルと一致していることを確認します。モデルのアーキテクチャを検査するには
print(model.model.model)を使用します。利用可能なすべてのモジュールとその引数については、
ultralytics/nn/modulesディレクトリのソースコードを確認してください。ソースコードでモジュールを定義し、Source Code Modification に示されているようにインポートし、YAML ファイル内で名前で参照します。
はい、
model.load("path/to/weights")を使用して、事前学習済みチェックポイントからウェイトをロードできます。ただし、一致するレイヤーのウェイトのみが正常にロードされます。model.info()を使用して、FLOPs のカウントがゼロでないかどうかを確認します。有効なモデルは、ゼロ以外の FLOPs カウントを示す必要があります。ゼロである場合は、Debugging Tips の提案に従って問題を見つけてください。