Ultralytics YOLO27:

モデル 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 はポーズモデルに適用されます。(x, y) キーポイントの場合は [N, 2](x, y, visibility) の場合は [N, 3] にできます。
`scales` で冗長性を削減する

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

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

データセットで別の nc または kpt_shape が指定されている場合、Ultralytics は実行時にモデル設定を自動的に上書きし、データセット YAML に合わせます。

バックボーンとヘッドのアーキテクチャ#

モデルアーキテクチャは、バックボーン(特徴抽出)セクションとヘッド(タスク固有)セクションで構成されます。

nc: 80

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]] # 3: Upsample
    - [[-1, 0], 1, Concat, [1]] # 4: Spatially compatible skip connection
    - [-1, 3, C2f, [256]] # 5: Process features
    - [[5], 1, Detect, [nc]] # 6: Detection layer

レイヤーインデックスはバックボーンとヘッド全体で連続し、連結する特徴マップは一致する空間次元を持つ必要があります。

レイヤー指定形式#

すべてのレイヤーは、次の一貫したパターンに従います: [from, repeats, module, args]

コンポーネント目的
from入力接続-1(前のレイヤー)、6(レイヤー6)、[4, 6, 8](複数入力)
repeats繰り返し回数1(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 モジュールディレクトリで定義されています。次の表には、カテゴリ別によく使用されるモジュールを示します。ソースコードには、さらに多くのモジュールがあります。

基本操作#

モジュール目的ソース引数
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, groups, 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リストから特定のテンソルを抽出するconv.py[out_ch, index]
DetectYOLO 検出ヘッドhead.py[nc]
モジュール完全一覧

これは利用可能なモジュールの一部です。モジュールとそのパラメーターの完全な一覧については、モジュールディレクトリを確認してください。

高度な機能#

TorchVision 統合#

TorchVision モジュールを使用すると、任意の TorchVision モデルをバックボーンとしてシームレスに統合できます。

from ultralytics import YOLO

# Model with ConvNeXt backbone
model = YOLO("convnext_backbone.yaml")
results = model.train(data="imagenet10", epochs=100)
マルチスケール特徴

最後のパラメーターを True に設定すると、マルチスケール検出用の中間特徴マップを取得できます。

特徴選択用の Index モジュール#

複数の特徴マップを出力するモデルを使用する場合、Index モジュールで特定の出力を選択します。

nc: 80

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 m.startswith("nn.")
    else getattr(__import__("torchvision").ops, m[16:])
    if m.startswith("torchvision.ops.")
    else globals()[m]
)  # get module
  1. PyTorch モジュール: 'nn.' で始まる名前 → torch.nn 名前空間
  2. TorchVision 操作: '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 clone 方法を使用して、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. parse_model() 内の base_modulesモジュールを追加します。このセット内のモジュールは、入力チャンネルと出力チャンネルを自動的に受け取ります。

    base_modules = frozenset(
        {
            # Existing modules...
            CustomBlock,
        }
    )
  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]]

head:
    - [-1, 1, Classify, [nc]]

Classify は、内部ですでに適応的平均プーリングを実行します。

ベストプラクティス#

アーキテクチャ設計のヒント#

シンプルに始める: カスタマイズする前に、実績のあるアーキテクチャから始めます。既存のYOLO設定をテンプレートとして使用し、ゼロから構築するのではなく、段階的に変更します。

段階的にテストする: 各変更を手順ごとに検証します。一度に1つのカスタムモジュールを追加し、次の変更に進む前に正常に動作することを確認します。

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

スキップ接続を使用する: [[-1, N], 1, Concat, [1]]パターンで特徴量を再利用します。これらの接続により勾配フローが改善され、モデルは異なるスケールの特徴量を組み合わせられます。

適切にスケーリングする: 計算リソースの制約に基づいてモデルのスケールを選択します。エッジデバイスにはnano(n)、バランスの取れた性能にはsmall(s)、最大精度にはより大きなスケール(mlx)を使用します。

パフォーマンスに関する考慮事項#

深さと幅: 深いネットワークは複数の変換レイヤーを通じて複雑な階層的特徴を捉える一方、幅の広いネットワークは各レイヤーでより多くの情報を並列処理します。タスクの複雑さに応じて、これらのバランスを調整します。

スキップ接続: 学習中の勾配フローを改善し、ネットワーク全体で特徴量を再利用できるようにします。勾配消失を防ぐため、より深いアーキテクチャでは特に重要です。

ボトルネックブロック: モデルの表現力を維持しながら、計算コストを削減します。C2fのようなモジュールは、標準的な畳み込みより少ないパラメータで、特徴学習能力を維持します。

マルチスケール特徴: 同じ画像内で異なるサイズのオブジェクトを検出するために不可欠です。異なるスケールに複数の検出ヘッドを配置したFeature Pyramid Network(FPN)パターンを使用します。

トラブルシューティング#

よくある問題#

問題原因ソリューション
KeyError: 'ModuleName'モジュールがインポートされていないtasks.pyのインポートに追加します
チャネル次元の不一致argsの指定が正しくない入力チャネルと出力チャネルの互換性を確認します
AttributeError: 'int' object has no attribute引数の型が正しくない正しい引数の型についてモジュールのドキュメントを確認します
モデルの構築に失敗するfromの参照が無効参照先のレイヤーが存在することを確認します

デバッグのヒント#

カスタムアーキテクチャを開発する際は、体系的なデバッグによって問題を早期に特定できます。

テストにIdentityヘッドを使用する

複雑なヘッドを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", task="detect")
output = model.model(torch.randn(1, 3, 640, 640))
print(f"Output shape: {output.shape}")  # Should match expected dimensions

モデルアーキテクチャの検査

FLOPs数を確認し、各レイヤーを出力することも、カスタムモデル設定の問題のデバッグに役立ちます。有効なモデルではFLOPs数が0以外になるはずです。0の場合は、forward passに問題がある可能性があります。単純なforward passを実行すると、発生している正確なエラーを確認できます。

from ultralytics import YOLO

# Build model with verbose output to see layer details
model = YOLO("debug_model.yaml", task="detect", 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. スケーリングを検証する: 異なるモデルスケール(nsm)でテストします

FAQ#

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

    nc: 5 # 5 classes
  • はい。サポートされている任意のモジュールを使用できます。これにはTorchVisionバックボーンや、独自のカスタムモジュールを定義し、カスタムモジュールの統合で説明されている方法でインポートすることも含まれます。

  • YAMLのscalesセクションを使用して、深さ、幅、最大チャネル数のスケーリング係数を定義します。ベースYAMLファイルを、ファイル名にスケールを付加した状態(例: yolo26n.yaml)で読み込むと、モデルがこれらを自動的に適用します。

  • この形式では、各レイヤーの構築方法を指定します。

    • from: 入力ソース
    • repeats: モジュールを繰り返す回数
    • module: レイヤーの種類
    • args: モジュールの引数
  • あるレイヤーの出力チャネルが、次のレイヤーで想定される入力チャネルと一致していることを確認します。print(model.model.model)を使用して、モデルのアーキテクチャを検査します。

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

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

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

  • model.info()を使用して、FLOPs数が0以外であることを確認します。有効なモデルでは、FLOPs数が0以外になるはずです。0の場合は、デバッグのヒントの提案に従って問題を特定します。

コメント