モデル 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 パラメーターを使用すると、1つのベース YAML から複数のモデルサイズを生成できます。たとえば、yolo26n.yaml を読み込むと、Ultralytics はベースの yolo26.yaml を読み取り、n のスケーリング係数(depth=0.50、width=0.25)を適用して nano バリアントを構築します。
データセットで別の 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 | モジュールタイプ | 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 モジュールディレクトリで定義されています。次の表には、カテゴリ別によく使用されるモジュールを示します。ソースコードには、さらに多くのモジュールがあります。
基本操作#
| モジュール | 目的 | ソース | 引数 |
|---|---|---|---|
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, 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] |
Detect | YOLO 検出ヘッド | 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- 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,
)カスタムモジュールの統合#
ソースコードの変更#
ソースコードを変更する方法は、カスタムモジュールを統合するうえで最も柔軟ですが、難しい場合があります。カスタムモジュールを定義して使用するには、次の手順に従ってください。
-
クイックスタートガイドの Git clone 方法を使用して、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 -
parse_model()内のbase_modulesにモジュールを追加します。このセット内のモジュールは、入力チャンネルと出力チャンネルを自動的に受け取ります。base_modules = frozenset( { # Existing modules... CustomBlock, } ) -
モデル 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]]
head:
- [-1, 1, Classify, [nc]]Classify は、内部ですでに適応的平均プーリングを実行します。
ベストプラクティス#
アーキテクチャ設計のヒント#
シンプルに始める: カスタマイズする前に、実績のあるアーキテクチャから始めます。既存の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ヘッドを使用する
複雑なヘッドを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}")手順ごとの検証
- 最小構成から始める: まず、可能な限りシンプルなアーキテクチャでテストします
- 段階的に追加する: レイヤーごとに複雑さを構築します
- 次元を確認する: チャネルと空間サイズの互換性を検証します
- スケーリングを検証する: 異なるモデルスケール(
n、s、m)でテストします
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の場合は、デバッグのヒントの提案に従って問題を特定します。