YOLOアーキテクチャの解説:YOLOv3からYOLO26まで#
すべての Ultralytics YOLO モデルは、特徴量を抽出するバックボーン、スケール間で特徴量を統合するネック、ボックスとクラスを予測するヘッドの 3 つのステージから構築されています。本ガイドでは、各ステージを構成するモジュールと、YOLOv3 から YOLO26 にかけてそれらがどのように変化したかを文書化し、ultralytics/cfg/models/ 内の設定ファイルにおける定義から ultralytics/nn/modules/ 内のモジュールクラスに至るまで、すべてのコンポーネントを追跡します。
各モデルは、YAML ファイル内でレイヤーの順序付きリストとして宣言的に定義されます。すべてのレイヤーは [from, repeats, module, args] 形式(どのレイヤーから入力を受け取るか、モジュールの繰り返し回数、レイヤーのクラス(Conv、C3k2、SPPF、Detect、…)、およびそのコンストラクタ引数)に従います。モデル YAML 設定ガイドには、この形式(repeats や args がバリアントの深さおよび幅の倍率に応じてどのようにスケーリングされるかを含む)に加え、モジュール解決システム全体が詳細に記載されています。本ガイドでは、モジュールそのものと、バージョン間での変更点に焦点を当てます。
3つのステージ#
すべてのUltralytics YOLOモデルは、以下の3つの連続したステージを通じて画像を処理し、それぞれが明確な役割を担っています。
| ステージ | 役割 | 出力 |
|---|---|---|
| バックボーン | 入力画像から複数の解像度で特徴を抽出する | ストライド8、16、32(P3、P4、P5)における特徴マップ |
| ネック | スケール間で特徴を融合し、小さなオブジェクトと大きなオブジェクトの両方にコンテキストを持たせる | マルチスケール融合特徴マップ |
| ヘッド | 融合された特徴からバウンディングボックスとクラススコアを予測する | アンカーポイントごとの検出 |
基本単位は Conv ブロック(conv.py 内で定義)であり、2D 畳み込み、バッチ正規化、および SiLU 活性化が順番に適用されます。以下のより大きなモジュールはすべて、Conv ブロックを組み合わせて構築されています。
アーキテクチャ図#
各バージョンは同じ backbone → neck → head の骨組みを維持しつつ、特定のステージを変更しています。以下のタブはバージョンごとの構造を示しています。バックボーンとネックのステージは ultralytics/cfg/models/ の設定に従いますが、YOLOv3 と YOLOv5 のヘッドは、実際のパッケージ設定が提供するアンカーフリーの u バリアントヘッドではなく、元のアンカーベースの形式で描画されています。タブを順に確認することで、各世代で何が追加されたかがわかります。要するに、その進化の過程は次のとおりです。YOLOv3 は FPN のみを使用したアンカーベースの検出器です。YOLOv5 はボトムアップの PAN パスと SPPF を追加します。YOLOv8 は、アンカーフリーの DFL ヘッドを持つ C2f ブロックに切り替えます。YOLO11 は C2PSA のアテンションと C3k2 ブロックを挿入します。そして YOLO26 は SPPF の残差を追加し、ヘッドを NMS フリーおよび DFL フリーにします。ノードの色はドキュメントの図の規則に従っています。緑色が入力、青色がバックボーン、スレート色が空間プーリングとアテンション、オレンジ色がネック、紫色がヘッドと出力です。
flowchart TD
IN[Input 640x640]:::start --> ST[Conv stem<br/>5x stride-2 down to P1-P5]:::proc
ST --> BB[Darknet-53 backbone<br/>stacked Bottleneck]:::proc
BB --> FPN[Neck FPN only<br/>top-down Upsample + Concat]:::decide
FPN --> HD[Detect head<br/>3 scales, anchor-based]:::out
HD --> O[Predictions + NMS]:::out
classDef start fill:#4CAF50,color:#fff
classDef proc fill:#2196F3,color:#fff
classDef decide fill:#FF9800,color:#fff
classDef out fill:#9C27B0,color:#fffYOLOv3 および YOLOv5 の図は、元のアンカーベースのヘッドを示しています。ultralytics パッケージには、アンカーフリーの YOLOv3u および YOLOv5u の設定(Darknet-53 および C3 バックボーンに YOLOv8 の Detect ヘッドを組み合わせたもの)が同梱されており、これらは検出ヘッドで説明されています。
バックボーンブロック:Bottleneck → C3 → C2f → C3k2#
バックボーンは、ストライド 2 の Conv ダウンサンプリングレイヤーの間に、繰り返しの CSP(Cross-Stage Partial)ブロックを積み重ねます。この繰り返しのブロックこそが、バージョン間で最も変化した部分です。以下のすべてのブロックは block.py に存在し、c1/c2 は入力/出力チャネル、c = 0.5 * c2 は隠れ層の幅です。
Bottleneck (YOLOv3)#
基本単位は Bottleneck であり、2 つの Conv レイヤー(デフォルトのカーネルは (3, 3))からなり、shortcut=True と c1 == c2 が一致する場合にはオプションの残差加算が行われます。YOLOv3 の Darknet-53 バックボーンは、CSP 分割を行わずにこれらを直接積み重ね、3 つのスケール(ストライド 8、16、32)で検出を行います。
C3 (YOLOv5)#
YOLOv5 の C3 は、入力を 2 つの 1x1 畳み込みに分割します。cv1 は n 個の連続する Bottleneck ブロック(カーネルは順に (1, 1)、次に (3, 3))に供給され、cv2 はそれらをバイパスします。2 つのパスは連結され、3 番目の 1x1 Conv によって統合されます。
def forward(self, x):
# C3: bottleneck path m(cv1(x)) concatenated with bypass cv2(x), then fused by cv3
return self.cv3(torch.cat((self.m(self.cv1(x)), self.cv2(x)), 1))融合用畳み込みに到達するのは最終的なボトルネック出力のみであるため、cv3 は 2 つの特徴量マップを確認します。
C2f (YOLOv8)#
YOLOv8 の C2f(「2 つの畳み込みを持つ CSP ボトルネック、より高速」)は、融合用畳み込みに到達する特徴量を変更します。
cv1 = Conv(c1, 2 * c, 1)の後、chunk(2)が出力を 2 つのcチャネルテンソルに分割します。n個のBottleneck(c, c)ブロック(カーネルは(3, 3)、(3, 3))が順次実行され、それぞれ前のブロックの出力が入力されます。- すべての
n + 2中間テンソルが連結され、cv2 = Conv((2 + n) * c, c2, 1)によって統合されます。
C3 が 2 つの特徴量マップを融合用畳み込みに渡すのに対し、C2f は n + 2 個を渡します。すべての段階的なボトルネック出力が再利用されます。
C3k2 (YOLO11およびYOLO26)#
YOLO11 および YOLO26 は C3k2 を使用します。これは C2f のサブクラスであり、繰り返し単位をスワップします。n 個のブロックのそれぞれは、コンストラクタのフラグに応じて以下のように変化します。
- 通常の
Bottleneck(デフォルト、c3k=False)、 C3kブロック(c3k=True) — 設定可能なカーネルサイズを持つC3バリアント、またはBottleneck+PSABlockのペア(attn=True)。
2番目の YAML 引数で c3k を設定します。例えば、[-1, 2, C3k2, [512, True]] は出力チャネル数が 512 の C3k2 モジュールを1つ構築します。その内部ブロックは (c3k=True 以降の) C3k です。CSP モジュールの場合、repeats フィールド (ここでは 2 であり、バリアントの深さ倍率によってスケーリングされる前) は、個別のモジュールを積み重ねるのではなく、ブロック内の内部繰り返し回数になります。
空間プーリング:SPP → SPPF#
バックボーンの終わりには、空間ピラミッドプーリングブロックが受容野を拡大します。YOLOv5 は、元のマルチカーネル SPP を SPPF(Spatial Pyramid Pooling - Fast)に置き換えました。これは、1 つの MaxPool2d(kernel_size=5, stride=1, padding=2) を連続して n = 3 回適用し、入力と 3 つすべてのプーリング出力を連結して 1x1 Conv で統合するものです。これは数学的に SPP(k=(5, 9, 13)) と同等ですが、チェインされた 5x5 プールがより大きなカーネルの受容野をカバーするため、より低コストです。
YOLO26 はショートカットフラグ(SPPF, [1024, 5, 3, True])を渡します。最も深いレイヤーでの c1 == c2 == 1024 に伴い、SPPF は残差接続(return y + x)を追加します。
空間アテンション:C2PSA (YOLO11以降)#
YOLO11 は SPPF の後に C2PSA を追加しました。これは CSP ブロックであり、そのアクティブなブランチは n PSABlock (位置感応型アテンション) モジュールのスタックです。cv1 = Conv(c1, 2 * c, 1) が特徴量を分割し、半分が PSABlock スタックを通過し、cv2 = Conv(2 * c, c1, 1) が結合を融合します。各 PSABlock はマルチヘッド アテンション とそれに続く2層のフィードフォワードネットワーク (Conv(c, 2 * c, 1) → Conv(2 * c, c, 1)) を適用し、それぞれに残差接続を持ちます。YOLO26 は同じ C3k2 + C2PSA バックボーンを維持します。
ネック:FPN + PAN#
ネックは、トップダウンの Feature Pyramid Network(FPN)とそれに続くボトムアップの Path Aggregation Network(PAN)を使用して、バックボーンの P3/P4/P5 特徴量マップを統合します。YAML のヘッドセクションにおいて、FPN は nn.Upsample + Concat(意味情報を高解像度に伝播する)であり、PAN はストライド 2 の Conv + Concat(局所化情報を上方向に送り返す)です。
# YOLO11 head (FPN top-down, then PAN bottom-up)
- [-1, 1, nn.Upsample, [None, 2, "nearest"]]
- [[-1, 6], 1, Concat, [1]] # cat backbone P4
- [-1, 2, C3k2, [512, False]] # 13
# ... second upsample + concat to P3 ...
- [-1, 1, Conv, [256, 3, 2]]
- [[-1, 13], 1, Concat, [1]] # cat head P4 (PAN)
- [-1, 2, C3k2, [512, False]] # 19ネックはその世代のバックボーンブロック(YOLOv5 では C3、YOLOv8 では C2f、YOLO11 および YOLO26 では C3k2)を再利用するため、各マージポイントはバックボーンが使用しているのと同じモジュールを実行します。統合された 3 つの出力がヘッドに供給されます。YOLOv3 は例外であり、そのネックはトップダウンの FPN のみ(YAML ヘッドにはストライド 2 のダウンサンプリングがない)であり、YOLOv5 が導入したボトムアップの PAN パスがありません。
検出ヘッド:アンカーベース → アンカーフリー → NMSフリー#
ヘッドは、統合された 3 つの特徴量マップを検出タスクの予測に変換します。その設計は、アンカーベースからアンカーフリー、そして NMS フリーへと、バージョンごとに変化してきました。
アンカーフリー、デカップルド Detect#
元の YOLOv3 および YOLOv5 は、アンカーベースのカップルドヘッド(事前定義されたアンカーボックスと、ボックスおよびクラス予測用の共有ブランチ)を使用していました。独立した ultralytics/yolov3 および ultralytics/yolov5 リポジトリはそのアンカーベースの設計を維持しています。メインの ultralytics パッケージには代わりにアンカーフリーの YOLOv3u および YOLOv5u バリアントが同梱されています(Darknet-53 および C3 バックボーンに YOLOv8 のアンカーフリー Detect ヘッドを組み合わせたもの)。ここで文書化されている yolov3.yaml および yolov5.yaml の設定は、過去の設計ではなく、これら u バリアントです。
Detect ヘッド(head.py)はアンカーフリーかつデカップルドです。ピラミッドのレベルごとに 2 つの並列ブランチを実行し、アンカーボックスに対してではなく、グリッドポイント上で直接予測を行います。
- ボックスブランチ(
cv2):Conv(x, c2, 3)→Conv(c2, c2, 3)→Conv2d(c2, 4 * reg_max, 1)。 - クラスブランチ(
cv3): YOLO11 および YOLO26 では、2 つの深度方向分離可能ブロック(DWConv+1x1 Conv)→Conv2d(c3, nc, 1)。YOLOv8 ではレガシーバリアントである 2 つの3x3 Convレイヤー →Conv2d(c3, nc, 1)が使用されます。
したがって、各アンカーポイントは no = nc + 4 * reg_max の出力を行います。事前定義されたアンカーを削除することで、調整が必要なハイパーパラメータからアンカーボックスのサイズとアスペクト比が除外されます。
Distribution Focal Loss (DFL)#
YOLOv8 および YOLO11 は、4 つのボックス座標のそれぞれを単一のスカラーではなく、reg_max = 16 ビンの分布(Generalized Focal Loss からの積分形式)として回帰します。DFL モジュールは 4 * reg_max のボックスチャネルを (4, reg_max) に変形し、reg_max ビンにわたるソフトマックスを適用し、ソフトマックス確率で重み付けされた各ビンインデックスの期待値(各ビンインデックスにソフトマックス確率を掛け、合計したもの)を予測座標として取得します。これは固定の 1x1 畳み込みとして実装されており、その重みはビンインデックス arange(reg_max) であるため、加重和は単一の内積となります。
YOLO26:NMSフリー、DFLフリー#
YOLO26 は、ヘッドが直接読み取る 2 つの YAML パラメータを設定します。
end2end: True—Detectは、そのブランチを 1 対 1 のヘッド(one2one_cv2/one2one_cv3)にディープコピーし、オブジェクトごとに 1 つの予測を生成することで、非最大値抑制(NMS)の後処理ステップを排除します。エクスポートおよび移行の詳細については、エンドツーエンド検出ガイドを参照してください。reg_max: 1— 1 つのビンを使用する場合、self.dflはnn.Identity()およびno = nc + 4になり、ヘッドは座標を直接回帰し、エクスポートされた ONNX グラフには DFL 操作が現れません。
YOLO26の論文で報告されているように、YOLO26 は5つのモデルサイズ (n/s/m/l/x) 全体で、T4 TensorRT のレイテンシが 1.7〜11.8 ms のとき、COCO で 40.9〜57.5 mAP に達します。
バージョン別概要#
| バージョン | バックボーンブロック | 空間プーリング | アテンション | 検出ヘッド | DFL |
|---|---|---|---|---|---|
| YOLOv3 | Darknet-53(Bottleneck) | 基本設定になし | なし | オリジナル: アンカーベース; u バリアント: アンカーフリー | なし / あり(u) |
| YOLOv5 | C3(CSP) | SPPF | なし | オリジナル: アンカーベース; u バリアント: アンカーフリー | なし / あり(u) |
| YOLOv8 | C2f | SPPF | なし | アンカーフリー、デカップリング | あり(reg_max=16) |
| YOLO11 | C3k2 | SPPF | C2PSA | アンカーフリー、デカップリング | あり(reg_max=16) |
| YOLO26 | C3k2 | SPPF + ショートカット | C2PSA | アンカーフリー、NMS フリー(end2end) | 削除済み(reg_max=1) |
モデルごとの詳細、パフォーマンス表、および使用例については、YOLOv3、YOLOv5、YOLOv8、YOLO11、および YOLO26 の個別のページを参照してください。
アーキテクチャを自分で調査する#
model.info() メソッドは、レイヤー、パラメータ、および FLOPs のサマリーを出力し、解析されたモジュールリストは model.model.model で利用可能です。
from ultralytics import YOLO
# Load a pretrained model
model = YOLO("yolo11n.pt")
# Fuse Conv + BatchNorm layers so counts match the published specs
model.fuse()
# Print a summary: layers, parameters, gradients, GFLOPs
model.info()
# Inspect the detection head (the last module in the network)
head = model.model.model[-1]
print(type(head).__name__, "| reg_max:", head.reg_max, "| end2end:", head.end2end)スニペットを 3 つの世代にわたって実行すると、変更点が数値として示されます。これらは ultralytics パッケージからの実際の融合モデル出力であり、各モデルページで公開されているパラメータおよび FLOPs の数と一致しています。
| モデル | レイヤー | パラメータ | GFLOPs | reg_max | end2end | DFLレイヤー |
|---|---|---|---|---|---|---|
| YOLOv8n | 72 | 3,151,904 | 8.7 | 16 | False | DFL |
| YOLO11n | 100 | 2,616,248 | 6.5 | 16 | False | DFL |
| YOLO26n | 122 | 2,408,932 | 5.4 | 1 | True | Identity |
YOLO26n は、reg_max=1、end2end=True、および Identity DFL レイヤーを報告します。これらは、NMS フリーかつ DFL フリーのヘッドのアーキテクチャ上の特徴です。
パラメータ数と FLOPs の値は fused モデル (model.fuse()) の値として報告されています。これは、各 Conv とその バッチ正規化 レイヤーを統合するものです。これは公開されている仕様と一致しており、新しく読み込まれたチェックポイントでは、統合する前はわずかに高い数値が報告されます。
結論#
バージョン間で、YOLO アーキテクチャは一度に1つのステージを変更しました。バックボーンは Darknet-53 から、C2PSA アテンションを備えた CSP ベースの C3、C2f、および C3k2 ブロックに移行しました。ネックはその FPN + PAN 構造を維持しながら SPP が SPPF になり、ヘッドはアンカーベースからアンカーフリーへ、そして YOLO26 の NMS フリー、DFL フリーのエンドツーエンド設計へと移行しました。
カスタムアーキテクチャを定義するには、モデル YAML 設定ガイドを参照するか、モデルページでモデルを比較してください。質問がある場合は、GitHub または Discord でお問い合わせください。
よくある質問 (FAQ)#
YOLOモデルには、ストライド8、16、32で画像から特徴を抽出するバックボーン、FPNとPANを使用してスケール間でそれらの特徴を融合するネック、そしてバウンディングボックスとクラススコアを予測するヘッドがあります。YOLOv3からYOLO26までのすべてのUltralytics YOLOモデルは、この3ステージ設計に従っています。
C2f(YOLOv8) は、古いC3が 2 つしか渡さないのに対し、融合畳み込みの前に内部のすべてのBottleneck(n + 2特徴マップ) の出力を連結する CSP ブロックです。C3k2(YOLO11 および YOLO26) はC2fのサブクラスであり、c3kフラグが設定されている場合に、各BottleneckをC3kブロック (設定可能なカーネルサイズを持つC3バリアント) に置き換えることができます。どちらもblock.pyで定義されています。YOLO11 は YOLOv8 に対して 3 つの構造的変更を行っています。
C2fのバックボーンとネックブロックをC3k2に置き換え、SPPFの後にC2PSA自己注意ブロックを挿入し、ヘッドの分類ブランチをより軽量な深度方向分離可能畳み込みに切り替えています。どちらもreg_max=16DFL 回帰を備えた同じアンカーフリーで分離されたDetectヘッドを維持しているため、検出インターフェースを再設計するのではなく、変更によってパラメータ数と FLOPs の数が削減され、精度が向上しています。現代の Ultralytics YOLO モデルはアンカーフリーです。YOLOv8、YOLO11、および YOLO26 は、ボックス回帰と分類のための独立したブランチを持つ、アンカーフリーのデカップルド
Detectヘッドを使用しています。元の YOLOv3 および YOLOv5 はアンカーベースでしたが、Ultralytics はそれらを YOLOv3u および YOLOv5u バリアントとして提供しており、その設定では YOLOv8 と同じアンカーフリーヘッドが使用されています。はい。レイヤーYOLO26 は
end2end=Trueを設定し、これによりDetectにオブジェクトごとに 1 つの予測を生成する 1 対 1 のヘッドが与えられ、初期のモデルで必要とされていた非最大値抑制の後処理ステップが削除されます。詳細については、エンドツーエンド検出ガイドを参照してください。DFL は、単一のスカラーを予測するのではなく、各ボックス座標を
reg_maxビン(YOLOv8 および YOLO11 ではデフォルトで 16)にわたるソフトマックス分布として回帰し、期待値を座標として採用します。YOLO26 はreg_max=1を設定するため、DFL レイヤーは恒等演算になり、ヘッドは座標を直接回帰し、エクスポートされた ONNX または TensorRT グラフに DFL オペレーションは現れません。Python でモデルをロードし、レイヤー、パラメータ、および GFLOPs のサマリーを表示するために
model.info()を呼び出します。解析されたレイヤーはmodel.model.modelにあります。たとえば、model.model.model[-1]はDetectヘッドであり、reg_maxやend2endなどの属性を公開しています。完全なアーキテクチャは、モデルのYAML 設定ファイルで定義されています。