Link to this sectionUltralytics YOLOv5 アーキテクチャ#
YOLOv5 (v6.0/6.1) は、Ultralytics が開発した強力な物体検出アルゴリズムです。本記事では、YOLOv5 のアーキテクチャ、データ拡張戦略、学習手法、および損失計算技術について詳細に解説します。この包括的な理解は、監視システム、自動運転車両、画像認識など、さまざまな分野での物体検出の実践的な適用を改善するのに役立ちます。
Link to this sectionモデル構造#
YOLOv5 のアーキテクチャは主に3つのパーツで構成されています。
- Backbone: ネットワークの主要部分です。YOLOv5 のバックボーンには、以前のバージョンで使用されていた Darknet アーキテクチャを改良した
CSPDarknet53構造が採用されています。 - Neck: バックボーンとヘッドを接続する部分です。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.20780706405639648Link to this sectionデータ拡張手法#
YOLOv5 は、モデルの汎化能力を向上させ、過学習を低減するために、さまざまなデータ拡張手法を採用しています。これらの手法には以下が含まれます。
-
Mosaic Augmentation: 4つの学習画像を1枚に組み合わせる画像処理手法で、物体検出モデルがさまざまなオブジェクトのスケールや平行移動にうまく対応できるようにします。

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

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

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

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

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

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