モデルYAML設定ガイド

モデルYAML設定ファイルは、Ultralyticsニューラルネットワークのアーキテクチャ設計図として機能します。これは、レイヤーの接続方法、各モジュールが使用するパラメータ、そしてネットワーク全体が異なるモデルサイズにわたってどのようにスケーリングされるかを定義します。

Model YAML configuration workflow.

設定構造

モデル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 only
  • nc はモデルが予測するクラス数を設定します。
  • scales は、モデルの深さ、幅、および最大チャンネル数を調整して、異なるサイズ(nanoからextra-largeまで)のバリエーションを生成するための複合スケーリング係数を定義します。
  • kpt_shape はポーズモデルに適用されます。[N, 2](x, y) キーポイント用、[N, 3](x, y, visibility) 用です。
`scales` で冗長性を削減

scales パラメータを使用すると、単一のベースYAMLから複数のモデルサイズを生成できます。たとえば、yolo26n.yaml を読み込むと、Ultralyticsはベースの yolo26.yaml を読み込み、n スケーリング係数(depth=0.50, width=0.25)を適用してnanoバリアントを構築します。

`nc` と `kpt_shape` はデータセットに依存します

データセットで異なる nckpt_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モジュールタイプConvC2fTorchVisionDetect
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[]

複合ブロック

モジュール目的ソース引数
C2f2つの畳み込みを備えた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]
DetectYOLO検出ヘッドhead.py[nc, anchors, ch]
モジュール一覧(全リスト)

これは利用可能なモジュールの一部です。モジュールの全リストとそのパラメータについては、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[4:]) if "ops." in m else globals()[m]
  1. PyTorchモジュール: 'nn.' で始まる名前 → torch.nn 名前空間
  2. TorchVision操作: 'ops.' で始まる名前 → torchvision.ops 名前空間
  3. Ultralytics モジュール: その他のすべての名前 → インポートを介してグローバル名前空間へ

モジュールインポートチェーン

標準モジュールは、tasks.py 内でのインポートを通じて利用可能になります。

from ultralytics.nn.modules import (  # noqa: F401
    SPPF,
    C2f,
    Conv,
    Detect,
    # ... many more modules
    Index,
    TorchVision,
)

カスタムモジュールの統合

ソースコードの変更

ソースコードを変更することは、カスタムモジュールを統合する最も汎用性の高い方法ですが、注意が必要です。カスタムモジュールを定義して使用するには、以下の手順に従ってください。

  1. クイックスタートガイド のGitクローン方法を使用して、Ultralytics を開発モードでインストールします。

  2. 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)
  3. ultralytics/nn/modules/__init__.py 内でパッケージレベルでモジュールを公開します。

    from .block import CustomBlock  # noqa makes CustomBlock available as ultralytics.nn.modules.CustomBlock
  4. ultralytics/nn/tasks.py 内でインポートに追加します。

    from ultralytics.nn.modules import CustomBlock  # noqa
  5. Handle special arguments (if needed) inside parse_model() in ultralytics/nn/tasks.py:

    # 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:]]
  6. モデルのYAMLでモジュールを使用します。

    # custom_model.yaml
    nc: 1
    backbone:
        - [-1, 1, CustomBlock, [64]]
    head:
        - [-1, 1, Classify, [nc]]
  7. フォワードパスが機能することを確認するために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]] # 7

TorchVision バックボーンモデル

# 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つずつ追加し、次の変更に進む前にそれが機能することを確認してください。

チャネルを監視する: 接続されたレイヤー間でチャネルの次元が一致していることを確認します。1つのレイヤーの出力チャネル (c2) は、シーケンス内の次のレイヤーの入力チャネル (c1) と一致する必要があります。

スキップ接続を使用する: [[-1, N], 1, Concat, [1]] パターンを活用して特徴の再利用を行います。これらの接続は勾配フローを助け、モデルが異なるスケールの特徴を組み合わせることを可能にします。

適切にスケーリングする: 計算上の制約に基づいてモデルのスケールを選択してください。エッジデバイスにはナノ (n)、バランスの取れたパフォーマンスにはスモール (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}")

ステップバイステップの検証

  1. 最小限で始める: 最初に最も単純なアーキテクチャでテストします
  2. 段階的に追加する: レイヤーごとに複雑さを構築します
  3. 次元をチェックする: チャネルと空間サイズの互換性を確認します
  4. スケーリングを検証する: 異なるモデルスケール (n, s, m) でテストします

FAQ

モデルのクラス数を変更するにはどうすればよいですか?

YAMLファイルの上部にある nc パラメータを、データセットのクラス数に合わせて設定します。

nc: 5 # 5 classes

モデルのYAMLでカスタムバックボーンを使用できますか?

はい。TorchVision バックボーンを含むサポートされているモジュールを使用するか、独自のカスタムモジュールを定義して、カスタムモジュールの統合 の説明に従ってインポートすることができます。

モデルを異なるサイズ (ナノ、スモール、ミディアムなど) にスケーリングするにはどうすればよいですか?

YAMLの scales セクション を使用して、深さ、幅、および最大チャネル数のスケーリング係数を定義します。ベースのYAMLファイルを読み込み、ファイル名の末尾にスケールを追加(例: yolo26n.yaml)すると、モデルは自動的にこれらを適用します。

[from, repeats, module, args] フォーマットはどういう意味ですか?

このフォーマットは各レイヤーがどのように構築されるかを指定します。

  • from: 入力ソース
  • repeats: モジュールを繰り返す回数
  • module: レイヤータイプ
  • args: モジュールの引数

チャネル不一致エラーのトラブルシューティング方法は?

あるレイヤーの出力チャネルが、次のレイヤーの期待される入力チャネルと一致しているか確認します。print(model.model.model) を使用してモデルのアーキテクチャを検査してください。

利用可能なモジュールとその引数のリストはどこにありますか?

利用可能なすべてのモジュールとその引数については、ultralytics/nn/modules ディレクトリ のソースコードを確認してください。

カスタムモジュールをYAML構成に追加するにはどうすればよいですか?

ソースコードでモジュールを定義し、ソースコードの変更 で示されているようにインポートし、YAMLファイル内で名前を指定して参照します。

カスタムYAMLで事前学習済みウェイトを使用できますか?

はい、model.load("path/to/weights") を使用して、事前学習済みのチェックポイントからウェイトを読み込むことができます。ただし、一致するレイヤーのウェイトのみが正常に読み込まれます。

モデル構成を検証するにはどうすればよいですか?

model.info() を使用して、FLOPs数がゼロでないかを確認します。有効なモデルであれば、ゼロ以外のFLOPs数が表示されるはずです。ゼロであれば、デバッグのヒント の提案に従って問題を特定してください。

コメント