Ultralytics YOLOv5 アーキテクチャ
YOLOv5 (v6.0/6.1) は、Ultralytics が開発した強力な物体検出アルゴリズムです。本記事では、YOLOv5 のアーキテクチャ、データ拡張戦略、トレーニング手法、および損失計算技術について深く掘り下げます。この包括的な理解は、監視、自動運転車、画像認識など、様々な分野における物体検出の実践的な応用を改善するのに役立ちます。
モデル構造
YOLOv5 のアーキテクチャは、主に3つの部分で構成されています。
- Backbone: ネットワークの主要な本体です。YOLOv5 の Backbone は、以前のバージョンで使用されていた Darknet アーキテクチャを改良した
CSPDarknet53構造を用いて設計されています。 - Neck: Backbone と Head を繋ぐ部分です。YOLOv5 では
SPPF(Spatial Pyramid Pooling - Fast) とPANet(Path Aggregation Network) 構造が活用されています。 - Head: 最終的な出力を生成する役割を担う部分です。YOLOv5 では、この目的のために
YOLOv3 Headを使用しています。
モデルの構造は下の図の通りです。モデル構造の詳細については、models/yolov5l.yaml を参照してください。

YOLOv5 は、以前のバージョンと比較していくつかの注目すべき改良を導入しています。
- 初期のバージョンで見られた
Focus構造は、6x6 Conv2d構造に置き換えられました。この変更により効率が向上しています #4825。 SPP構造はSPPFに置き換えられました。この変更により、出力を維持したまま処理速度が2倍以上向上しました。
SPP と SPPF の速度をテストするには、次のコードを使用できます。
SPP vs SPPF speed profiling example (click to open)
import time
import torch
import torch.nn as nn
class SPP(nn.Module):
def __init__(self):
"""Initializes an SPP module with three different sizes of max pooling layers."""
super().__init__()
self.maxpool1 = nn.MaxPool2d(5, 1, padding=2)
self.maxpool2 = nn.MaxPool2d(9, 1, padding=4)
self.maxpool3 = nn.MaxPool2d(13, 1, padding=6)
def forward(self, x):
"""Applies three max pooling layers on input `x` and concatenates results along channel dimension."""
o1 = self.maxpool1(x)
o2 = self.maxpool2(x)
o3 = self.maxpool3(x)
return torch.cat([x, o1, o2, o3], dim=1)
class SPPF(nn.Module):
def __init__(self):
"""Initializes an SPPF module with a specific configuration of MaxPool2d layer."""
super().__init__()
self.maxpool = nn.MaxPool2d(5, 1, padding=2)
def forward(self, x):
"""Applies sequential max pooling and concatenates results with input tensor."""
o1 = self.maxpool(x)
o2 = self.maxpool(o1)
o3 = self.maxpool(o2)
return torch.cat([x, o1, o2, o3], dim=1)
def main():
"""Compares outputs and performance of SPP and SPPF on a random tensor (8, 32, 16, 16)."""
input_tensor = torch.rand(8, 32, 16, 16)
spp = SPP()
sppf = SPPF()
output1 = spp(input_tensor)
output2 = sppf(input_tensor)
print(torch.equal(output1, output2))
t_start = time.time()
for _ in range(100):
spp(input_tensor)
print(f"SPP time: {time.time() - t_start}")
t_start = time.time()
for _ in range(100):
sppf(input_tensor)
print(f"SPPF time: {time.time() - t_start}")
if __name__ == "__main__":
main()結果:
True
SPP time: 0.5373051166534424
SPPF time: 0.20780706405639648データ拡張技術
YOLOv5 は、モデルの汎化能力を向上させ、過学習を低減するために様々なデータ拡張技術を採用しています。これらの技術には以下が含まれます。
-
Mosaic Augmentation: 物体検出モデルが様々な物体のスケールや移動にうまく対応できるように、4つのトレーニング画像を1つに統合する画像処理技術です。

-
Copy-Paste Augmentation: 画像からランダムなパッチをコピーして別のランダムに選択された画像に貼り付ける革新的なデータ拡張手法で、効果的に新しいトレーニングサンプルを生成します。

-
Random Affine Transformations: これには、画像のランダムな回転、スケーリング、移動、せん断が含まれます。

-
MixUp Augmentation: 2つの画像の線形結合とそれに関連付けられたラベルをとることで、合成画像を作成する手法です。

-
Albumentations: 幅広い拡張技術をサポートする強力な画像拡張ライブラリです。Albumentations を使用してデータを多様化する方法について詳しく学びましょう。
-
HSV Augmentation: 画像の Hue (色相)、Saturation (彩度)、Value (明度) に対するランダムな変更です。

-
Random Horizontal Flip: 画像をランダムに水平反転させる拡張手法です。

トレーニング戦略
YOLOv5 は、モデルのパフォーマンスを向上させるためにいくつかの高度なトレーニング戦略を適用しています。それらには以下が含まれます。
- Multiscale Training: トレーニングプロセス中、入力画像は元のサイズの0.5倍から1.5倍の範囲でランダムに再スケーリングされます。
- AutoAnchor: この戦略は、カスタムデータ内の正解ボックスの統計的特性に合わせて、事前のアンカーボックスを最適化します。
- Warmup and Cosine LR Scheduler: モデルのパフォーマンスを向上させるために学習率を調整する手法です。
- Exponential Moving Average (EMA): トレーニングプロセスを安定させ、汎化誤差を低減するために、過去のステップにおけるパラメータの平均を使用する戦略です。
- Mixed Precision Training: 半精度フォーマットで演算を実行し、メモリ使用量を削減して計算速度を向上させる手法です。
- Hyperparameter Evolution: 最適なパフォーマンスを達成するためにハイパーパラメータを自動的に調整する戦略です。ハイパーパラメータのチューニングについて詳しく学びましょう。
追加機能
4.1 損失の計算
YOLOv5 の損失は、3つの個別の損失コンポーネントの組み合わせとして計算されます。
- Classes Loss (BCE Loss): Binary Cross-Entropy 損失。分類タスクの誤差を測定します。
- Objectness Loss (BCE Loss): 別の Binary Cross-Entropy 損失。特定のグリッドセル内に物体が存在するかどうかを検出する際の誤差を計算します。
- Location Loss (CIoU Loss): Complete IoU 損失。グリッドセル内での物体の位置合わせにおける誤差を測定します。
全体の損失関数は以下のように表されます。
4.2 損失のバランス
3つの予測レイヤー (P3, P4, P5) の Objectness 損失は、重み付けが異なります。バランスウェイトはそれぞれ [4.0, 1.0, 0.4] です。このアプローチにより、異なるスケールでの予測が合計損失に適切に寄与することが保証されます。
4.3 グリッド感度の排除
YOLOv5 アーキテクチャは、以前の YOLO バージョンと比較して、ボックス予測戦略にいくつかの重要な変更を加えています。YOLOv2 および YOLOv3 では、ボックス座標は最後のレイヤーの活性化を使用して直接予測されていました。
しかし、YOLOv5 では、ボックス座標を予測するための式が更新され、グリッド感度が低減され、モデルが無限のボックス寸法を予測することを防ぐようになりました。
予測されたバウンディングボックスを計算するための修正された式は以下の通りです。
スケーリング前後で中心点のオフセットを比較します。中心点のオフセット範囲は (0, 1) から (-0.5, 1.5) に調整されています。したがって、オフセットは容易に 0 または 1 になることができます。
調整前後の高さと幅のスケーリング比 (アンカーに対する相対比) を比較します。元の yolo/darknet ボックス方程式には重大な欠陥がありました。幅と高さは単に out=exp(in) であるため完全に制限されておらず、危険です。これにより、勾配の暴走、不安定性、NaN 損失、そして最終的にはトレーニングの完全な失敗につながる可能性があります。詳細については、このイシューを参照してください。
4.4 ターゲットの構築
YOLOv5 におけるターゲット構築プロセスは、トレーニング効率とモデルの精度にとって不可欠です。これには、出力マップ内の適切なグリッドセルに正解ボックスを割り当て、適切なアンカーボックスと一致させることが含まれます。
このプロセスは以下のステップに従います。
- 正解ボックスの寸法と各アンカーテンプレートの寸法の比率を計算します。
- 計算された比率がしきい値内にある場合、正解ボックスを対応するアンカーと一致させます。
- 中心点オフセットの修正により、正解ボックスが複数のアンカーに割り当てられる可能性があることを念頭に置き、一致したアンカーを適切なセルに割り当てます。中心点オフセットの範囲が (0, 1) から (-0.5, 1.5) に調整されているため、追加のマッチングが可能になっています。
このように、ターゲット構築プロセスにより、各正解物体がトレーニングプロセス中に適切に割り当てられ、マッチングされることが保証され、YOLOv5 はより効果的に物体検出タスクを学習できます。
結論
YOLOv5 は、リアルタイム物体検出の進化における有意義なステップを表しています。そのアーキテクチャの選択、トレーニング戦略、およびエンジニアリングの改良は、初期の YOLO バージョンと比較して強力なパフォーマンスと効率を実現します。
YOLOv5 の主な強化点には、動的アーキテクチャの使用、広範なデータ拡張技術、革新的なトレーニング戦略、および損失計算とターゲット構築プロセスにおける重要な調整が含まれます。これらのすべてのイノベーションは、YOLO モデルのトレードマークである高い速度を維持しつつ、物体検出の精度と効率を大幅に向上させます。