モデルのYAMLコンフィギュレーション
モデルYAML設定ファイルは、Ultralytics ニューラルネットワークのアーキテクチャーの青写真の役割を果たします。レイヤーの接続方法、各モジュールが使用するパラメータ、異なるモデルサイズに対してネットワーク全体がどのようにスケールするかを定義します。
構成構造
モデルのYAMLファイルはアーキテクチャを定義するために連携する3つの主要なセクションに編成されます。
パラメーターセクション
パラメータセクションでは、モデルのグローバルな特性とスケーリング動作を指定する:
# 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
モデルの深さ、幅、最大チャンネルを調整する複合スケーリング係数を定義し、異なるサイズのバリエーション(ナノから特大まで)を生成します。kpt_shape
はポーズモデルに適用される。それは次のようなものだ。[N, 2]
対象(x, y)
キーポイントまたは[N, 3]
対象(x, y, visibility)
.
で冗長性を減らす scales
The scales
パラメーターによって1つの基底 YAML から複数のモデルサイズを生成できます。たとえば yolo11n.yaml
Ultralytics ベースを読み取る yolo11.yaml
を適用する。 n
スケーリング・ファクター (depth=0.50
, width=0.25
)を使ってナノバリアントを作る。
nc
および kpt_shape
はデータセットに依存する
データセットが異なる 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] (マルチ入力) |
リピート | 繰り返し回数 | 1 (シングル)、 3 (3回繰り返す) |
モジュール | モジュールタイプ | Conv , C2f , TorchVision , Detect |
アーギュ | モジュール引数 | [64, 3, 2] (チャンネル、カーネル、ストライド) |
コネクション・パターン
The from
フィールドは、ネットワーク全体に柔軟なデータフローパターンを作り出します:
- [-1, 1, Conv, [64, 3, 2]] # Takes input from previous layer
- [[-1, 6], 1, Concat, [1]] # Combines current layer with layer 6
- [[4, 6, 8], 1, Detect, [nc]] # Detection head using 3 feature scales
レイヤーインデックス
レイヤーのインデックスは 0 から始まります。-1
= 正のインデックスは、その位置によって特定のレイヤーを参照する。
モジュールの繰り返し
The repeats
パラメータは、より深いネットワークセクションを作成する:
- [-1, 3, C2f, [128, True]] # Creates 3 consecutive C2f blocks
- [-1, 1, Conv, [64, 3, 2]] # Single convolution layer
実際の繰り返し回数には、モデルサイズの設定から深さのスケーリング係数が掛けられる。
利用可能なモジュール
モジュールは機能ごとに整理され、Ultralytics モジュールディレクトリに定義されています。以下の表は、よく使用されるモジュールをカテゴリ別に示したものです:
基本操作
モジュール | 目的 | ソース | 引数 |
---|---|---|---|
Conv |
畳み込み+バッチノルム+活性化 | conv.py | [out_ch, kernel, stride, pad, groups] |
nn.Upsample |
空間アップサンプリング | PyTorch | [size, scale_factor, mode] |
nn.Identity |
パススルー・オペレーション | PyTorch | [] |
複合ブロック
モジュール | 目的 | ソース | 引数 |
---|---|---|---|
C2f |
2つの畳み込みによるCSPボトルネック | ブロック.パイ | [out_ch, shortcut, expansion] |
SPPF |
空間ピラミッド・プーリング(高速) | ブロック.パイ | [out_ch, kernel_size] |
Concat |
チャンネル単位の連結 | conv.py | [dimension] |
専門モジュール
モジュール | 目的 | ソース | 引数 |
---|---|---|---|
TorchVision |
任意のトーチビジョンモデルをロードする | ブロック.パイ | [out_ch, model_name, weights, unwrap, truncate, split] |
Index |
リストから特定のtensor 取り出す | ブロック.パイ | [out_ch, index] |
Detect |
YOLO 検出ヘッド | head.py | [nc, anchors, ch] |
モジュール一覧
これは利用可能なモジュールのサブセットである。モジュールの全リストとパラメータについては、modulesディレクトリを参照してください。
高度な機能
トーチビジョンの統合
TorchVisionモジュールは、あらゆるTorchVisionモデルをバックボーンとしてシームレスに統合することができます:
from ultralytics import YOLO
# Model with ConvNeXt backbone
model = YOLO("convnext_backbone.yaml")
results = model.train(data="coco8.yaml", epochs=100)
backbone:
- [-1, 1, TorchVision, [768, convnext_tiny, DEFAULT, True, 2, False]]
head:
- [-1, 1, Classify, [nc]]
パラメータの内訳:
768
:期待される出力チャンネルconvnext_tiny
:モデル・アーキテクチャ (使用可能モデル)DEFAULT
:事前に訓練された重みを使用True
:分類ヘッドを取り外す2
:最後の2つのレイヤーを切り捨てるFalse
:単一のtensor 返す(リストではない)
マルチスケールの特徴
最後のパラメータを True
マルチスケール検出のための中間特徴マップを得る。
特徴選択のためのインデックス・モジュール
複数のフィーチャーマップを出力するモデルを使用する場合、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 、以下の3層システムを採用している。 parse_model
:
# 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
名前空間 - トーチビジョン事業:で始まる名前
'ops.'
→torchvision.ops
名前空間 - Ultralytics モジュール:他のすべての名前 → imports によるグローバル名前空間
モジュール・インポート・チェーン
標準モジュールは tasks.py
:
from ultralytics.nn.modules import ( # noqa: F401, E501
SPPF,
C2f,
Conv,
Detect,
# ... many more modules
Index,
TorchVision,
)
カスタムモジュールの統合
ソースコードの修正
ソースコードを変更することは、カスタムモジュールを統合する最も汎用的な方法ですが、厄介な場合があります。カスタムモジュールを定義して使用するには、以下の手順に従ってください:
-
モジュールを定義する で
ultralytics/nn/modules/block.py
:class CustomBlock(nn.Module): def __init__(self, c1, c2): super().__init__() self.layers = nn.Sequential(nn.Conv2d(c1, c2, 3, 1, 1), nn.BatchNorm2d(c2), nn.ReLU()) def forward(self, x): 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()
でultralytics/nn/tasks.py
:elif 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]]
-
FLOPをチェックし、フォワードパスが機能していることを確認する:
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
トーチビジョンバックボーンモデル
# 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]]
パターンがある。これらの接続は勾配の流れを助け、モデルが異なるスケールの特徴を組み合わせることを可能にする。
適切な規模:計算上の制約に基づいてモデルスケールを選択します。ナノスケール(n
)、エッジ・デバイスは小型(s
)でバランスの取れたパフォーマンスを実現し、より大きなスケール(m
, l
, x
)の精度を最大限に高める。
パフォーマンスに関する考察
深さ対幅:深いネットワークは複数の変換レイヤーを通して複雑な階層的特徴を捉え、幅の広いネットワークは各レイヤーでより多くの情報を並列処理する。タスクの複雑さに応じて、これらのバランスをとりましょう。
接続をスキップ:トレーニング中の勾配フローを改善し、ネットワーク全体で特徴の再利用を可能にする。勾配の消失(vanishing gradients)を防ぐため、深いアーキテクチャでは特に重要です。
ボトルネック・ブロック:モデルの表現力を維持しながら計算コストを削減。以下のようなモジュール C2f
は、特徴学習能力を維持しながら、標準的な畳み込みよりも少ないパラメータを使用する。
マルチスケール機能:同一画像内の異なるサイズの物体を検出するために不可欠。異なるスケールで複数の検出ヘッドを持つ特徴ピラミッドネットワーク(FPN)パターンを使用します。
トラブルシューティング
よくある問題
問題点 | 原因 | ソリューション |
---|---|---|
KeyError: 'ModuleName' |
モジュールがインポートされていない | 追加 tasks.py 輸入品 |
チャンネル寸法の不一致 | 不正解 args スペック |
入出力チャンネルの互換性を確認する |
AttributeError: 'int' object has no attribute |
引数の型が間違っている | 引数の型が正しいかどうか、モジュールのドキュメントをチェックする |
モデルのビルドに失敗 | 無効 from 参照 |
参照レイヤーが存在することを確認する |
デバッグのヒント
カスタム・アーキテクチャを開発する場合、体系的なデバッグは問題の早期発見に役立つ:
アイデンティティ・ヘッドをテストに使用する
複雑なヘッドを 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
)
よくある質問
モデル内のクラス数を変更するには?
を設定する。 nc
パラメーターをYAMLファイルの先頭に追加します。
nc: 5 # 5 classes
モデルYAMLでカスタムバックボーンを使うことはできますか?
TorchVisionバックボーンを含むサポートされているモジュール、または独自のカスタムモジュールを定義し、カスタムモジュールの統合で説明されているようにインポートすることができます。
さまざまなサイズ(ナノ、スモール、ミディアムなど)に対応するにはどうすればよいですか?
以下を使用します scales
セクション をYAMLに追加して、深度、幅、最大チャンネルのスケーリング係数を定義します。スケールをファイル名に追加したベースYAMLファイルをロードするとき、モデルは自動的にこれらを適用します (例、 yolo11n.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カウントがゼロでないことを示すはずである。ゼロの場合は デバッグのヒント を使って問題を見つける。