Ultralytics YOLOv5 アーキテクチャ#
YOLOv5 (v6.0/6.1) は Ultralytics によって開発された強力な物体検出アルゴリズムです。この記事では、YOLOv5 のアーキテクチャ、data augmentation 戦略、トレーニング手法、および損失計算技術について詳しく解説します。この包括的な理解は、監視、自動運転、image recognition などのさまざまな分野における物体検出の実践的な応用の向上に役立ちます。
モデル構造#
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
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()結果:
True
SPP time: 0.5373051166534424
SPPF time: 0.20780706405639648データ拡張手法#
YOLOv5 は、モデルの汎化能力を向上させ、overfitting を削減するためにさまざまなデータ拡張技術を採用しています。これらの技術には以下が含まれます。
-
Mosaic Augmentation: object detection モデルがさまざまなオブジェクトのスケールや移動に対処しやすくなるように、4 つのトレーニング画像を 1 つに結合する画像処理技術です。

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

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

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

-
Albumentations: 多様な拡張技術をサポートする強力な画像拡張ライブラリです。using Albumentations augmentations の詳細をご覧ください。
-
HSV Augmentation: 画像の色相 (Hue)、彩度 (Saturation)、明度 (Value) に対するランダムな変更です。

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

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