Ultralytics YOLOv5 アーキテクチャ#
YOLOv5(v6.0/6.1)は、Ultralyticsが開発した強力な物体検出アルゴリズムです。本記事では、YOLOv5のアーキテクチャ、データ拡張戦略、トレーニング手法、損失計算技術について詳しく説明します。この包括的な理解は、監視、自動運転車、画像認識など、さまざまな分野で物体検出を実際に適用する際に役立ちます。
1. モデル構造#
YOLOv5のアーキテクチャは、次の3つの主要部分で構成されています。
- Backbone: ネットワークの主要部分です。YOLOv5では、以前のバージョンで使用されていたDarknetアーキテクチャを変更した
CSPDarknet53構造を使用してBackboneを設計しています。 - 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
from torch import 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()result:
True
SPP time: 0.5373051166534424
SPPF time: 0.207807064056396482. データ拡張技術#
YOLOv5では、モデルの汎化性能を高め、過学習を抑制するために、さまざまなデータ拡張技術を使用しています。これらの技術には次のものがあります。
-
Mosaic Augmentation: 4枚のトレーニング画像を1枚に組み合わせる画像処理技術で、物体検出モデルがさまざまな物体スケールや移動に適切に対応できるよう促します。

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

-
Random Affine Transformations: 画像のランダムな回転、スケーリング、移動、せん断を行います。

-
MixUp Augmentation: 2枚の画像とそれぞれに対応するラベルの線形結合によって合成画像を作成する手法です。

-
Albumentations: 多種多様なデータ拡張技術をサポートする強力な画像拡張ライブラリです。Albumentationsのデータ拡張の使用について詳しく説明しています。
-
HSV Augmentation: 画像の色相、彩度、明度をランダムに変更します。

-
Random Horizontal Flip: 画像を水平方向にランダム反転するデータ拡張手法です。

3. トレーニング戦略#
YOLOv5では、モデルの性能を向上させるために、複数の高度なトレーニング戦略を適用しています。これには次のものがあります。
- Multiscale Training: トレーニング中、入力画像を元のサイズの0.5~1.5倍の範囲でランダムにリスケールします。
- AutoAnchor: カスタムデータ内のGround Truthボックスの統計的特性に合うように、初期アンカーボックスを最適化する戦略です。
- Warmup and Cosine LR Scheduler: モデルの性能を向上させるために学習率を調整する手法です。
- 指数移動平均 (EMA): 過去のステップにおけるパラメーターの平均を使用してトレーニングプロセスを安定させ、汎化誤差を低減する戦略です。
- Mixed Precision Training: 半精度形式で演算を実行し、メモリ使用量を削減しながら計算速度を向上させる手法です。
- Hyperparameter Evolution: 最適な性能を実現するためにハイパーパラメーターを自動調整する戦略です。ハイパーパラメーターのチューニングについて詳しく説明しています。
4. 追加機能#
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 Lossには、それぞれ異なる重みが付けられます。バランスウェイトはそれぞれ[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損失、最終的にはトレーニングの完全な失敗につながる可能性があり危険です。詳細についてはこのIssueを参照してください。
4.4 ターゲットの構築#
YOLOv5のターゲット構築プロセスは、トレーニングの効率とモデルの精度にとって重要です。出力マップ内の適切なグリッドセルにGround Truthボックスを割り当て、適切なアンカーボックスとマッチングします。
このプロセスは次の手順で実行します。
- Ground Truthボックスの寸法と各アンカーテンプレートの寸法の比率を計算します。
- 計算された比率がしきい値以内の場合、Ground Truthボックスを対応するアンカーとマッチングします。
- マッチしたアンカーを適切なセルに割り当てます。改訂された中心点オフセットにより、中心点オフセットの範囲が(0, 1)から(-0.5, 1.5)に調整され、追加のマッチングが可能になるため、1つのGround Truthボックスを複数のアンカーに割り当てられる点に注意してください。
このように、ターゲット構築プロセスにより、各Ground Truthオブジェクトがトレーニング中に適切に割り当てられ、マッチングされます。これにより、YOLOv5は物体検出タスクをより効果的に学習できます。
まとめ#
YOLOv5は、リアルタイム物体検出の進化における意義深い一歩を示しています。そのアーキテクチャの選択、トレーニング戦略、エンジニアリング上の改良により、以前のYOLOバージョンと比較して高い性能と効率を実現しています。
YOLOv5の主な強化点には、動的アーキテクチャの採用、幅広いデータ拡張技術、革新的なトレーニング戦略に加え、損失計算とターゲット構築プロセスにおける重要な調整が含まれます。これらすべての革新により、YOLOモデルの特徴である高い速度を維持しながら、物体検出の精度と効率が大幅に向上します。