モデル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はポーズモデルに適用されます。[N, 2]は(x, y)キーポイント用、[N, 3]は(x, y, visibility)用です。
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, 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]- PyTorchモジュール:
'nn.'で始まる名前 →torch.nn名前空間 - TorchVision操作:
'ops.'で始まる名前 →torchvision.ops名前空間 - Ultralytics モジュール: その他のすべての名前 → インポートを介してグローバル名前空間へ
モジュールインポートチェーン
標準モジュールは、tasks.py 内でのインポートを通じて利用可能になります。
from ultralytics.nn.modules import ( # noqa: F401
SPPF,
C2f,
Conv,
Detect,
# ... many more modules
Index,
TorchVision,
)カスタムモジュールの統合
ソースコードの変更
ソースコードを変更することは、カスタムモジュールを統合する最も汎用性の高い方法ですが、注意が必要です。カスタムモジュールを定義して使用するには、以下の手順に従ってください。
-
クイックスタートガイド の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 -
Handle special arguments (if needed) inside
parse_model()inultralytics/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:]] -
モデルの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つずつ追加し、次の変更に進む前にそれが機能することを確認してください。
チャネルを監視する: 接続されたレイヤー間でチャネルの次元が一致していることを確認します。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}")ステップバイステップの検証
- 最小限で始める: 最初に最も単純なアーキテクチャでテストします
- 段階的に追加する: レイヤーごとに複雑さを構築します
- 次元をチェックする: チャネルと空間サイズの互換性を確認します
- スケーリングを検証する: 異なるモデルスケール (
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数が表示されるはずです。ゼロであれば、デバッグのヒント の提案に従って問題を特定してください。