Ultralytics YOLOv5アーキテクチャ
YOLOv5(v6.0/6.1)は、Ultralyticsによって開発された強力な物体検出アルゴリズムです。この記事では、YOLOv5のアーキテクチャ、データ拡張戦略、トレーニング方法論、損失計算手法について詳しく解説します。この包括的な理解は、監視、自動運転車、画像認識など、さまざまな分野での物体検出の実用的な応用を改善するのに役立ちます。
1. モデル構造
YOLOv5 のアーキテクチャは、主に3つの部分で構成されています。
- バックボーン:これはネットワークの主要な部分です。YOLOv5の場合、バックボーンはを使用して設計されています。
CSPDarknet53
構造に置き換えられました。これは、以前のバージョンで使用されていた Darknet アーキテクチャを改良したものです。 - ネック:この部分は、バックボーンとヘッドを接続します。YOLOv5では、
SPPF
(Spatial Pyramid Pooling - Fast)とPANet
(Path Aggregation Network)構造が利用されています。 - 頭:この部分は、最終的な出力を生成します。YOLOv5は、
YOLOv3 Head
この目的のために。
モデルの構造を以下の図に示します。モデル構造の詳細については、以下をご覧ください。 yolov5l.yaml
.
YOLOv5は、前身と比較していくつかの注目すべき改善を導入しています。
- The
Focus
構造は、以前のバージョンにあったものですが、代わりに6x6 Conv2d
構造が使用されるようになりました。この変更により効率が向上します。 #4825. - The
SPP
構造に置き換えられました。SPPF
この変更により、処理速度が2倍以上になり、同じ出力が維持されます。
速度をテストするには SPP
および SPPF
、次のコードを使用できます。
SPP vs SPPF の速度プロファイリングの例(クリックして開く)
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
2. データ拡張テクニック
YOLOv5は、モデルの汎化能力を向上させ、過学習を軽減するために、さまざまなデータ拡張手法を採用しています。これらの手法には以下が含まれます。
-
モザイクオーグメンテーション: 複数の学習画像を1つに結合する画像処理技術であり、物体検出モデルがさまざまな物体のスケールや平行移動をより適切に処理できるようにします。
-
コピー&ペーストによるデータ拡張:画像からランダムなパッチをコピーし、別のランダムに選択された画像に貼り付ける革新的なデータ拡張手法で、効果的に新しいトレーニングサンプルを生成します。
-
ランダムアフィン変換: これには、画像のランダムな回転、スケーリング、平行移動、およびせん断が含まれます。
-
MixUp Augmentation:2つの画像とそれらに関連付けられたラベルの線形結合を取得して、合成画像を作成する方法。
-
Albumentations: 多種多様な拡張テクニックをサポートする、画像拡張のための強力なライブラリ。Albumentations拡張の使用に関する詳細をご覧ください。
-
HSVオーグメンテーション: 画像の色相(Hue)、彩度(Saturation)、明度(Value)にランダムな変更を加えます。
-
ランダム水平反転: 画像を水平方向にランダムに反転させるデータ拡張手法。
3. 学習戦略
YOLOv5は、モデルの性能を向上させるために、いくつかの高度なトレーニング戦略を適用しています。
- マルチスケールトレーニング: 入力画像は、トレーニングプロセス中に元のサイズの0.5〜1.5倍の範囲でランダムにリスケールされます。
- AutoAnchor: この戦略は、カスタムデータ内の正解ボックスの統計的特性に合わせて、事前アンカーボックスを最適化します。
- ウォームアップとコサインLRスケジューラ: モデルのパフォーマンスを向上させるために学習率を調整する方法。
- 指数移動平均 (EMA): トレーニングプロセスを安定させ、汎化誤差を減らすために、過去のステップにおけるパラメータの平均を使用する戦略。
- 混合精度学習: メモリ使用量を削減し、計算速度を向上させるために、半精度形式で演算を実行する方法です。
- ハイパーパラメータ最適化: 最適なパフォーマンスを達成するために、ハイパーパラメータを自動的に調整する戦略です。ハイパーパラメータ調整の詳細はこちら。
4. 追加機能
4.1 損失の計算
YOLOv5 の損失は、3 つの個別の損失コンポーネントの組み合わせとして計算されます。
- クラス損失(BCE Loss): Binary Cross-Entropy損失は、分類タスクのエラーを測定します。
- Objectness Loss (BCE Loss): もう1つのBinary Cross-Entropy損失で、特定のグリッドセルにオブジェクトが存在するかどうかを検出する際のエラーを計算します。
- 位置損失(CIoU Loss): Complete IoU lossは、グリッドセル内のオブジェクトの位置特定の誤差を測定します。
全体の損失関数は以下のように表されます。
4.2 バランス損失
3つの予測レイヤーのobjectness損失(P3
, P4
, P5
)の重み付けが異なります。バランスの重みは [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のボックスの寸法と、各アンカーテンプレートの寸法の比率を計算します。
- 計算された比率が閾値内であれば、正解ボックスを対応するアンカーと一致させます。
- 修正された中心点オフセットにより、グラウンドトゥルースボックスが複数のアンカーに割り当てられる可能性があることを念頭に置いて、一致したアンカーを適切なセルに割り当てます。中心点のオフセット範囲が(0, 1)から(-0.5, 1.5)に調整されるため、GT Boxはより多くのアンカーに割り当てることができます。
このようにして、ビルドターゲットプロセスは、各グラウンドトゥルースオブジェクトがトレーニングプロセス中に適切に割り当てられ、照合されることを保証し、YOLOv5がオブジェクト検出のタスクをより効果的に学習できるようにします。
結論
結論として、YOLOv5は、リアルタイム物体検出モデルの開発における重要な一歩です。さまざまな新機能、拡張機能、およびトレーニング戦略を組み込むことにより、パフォーマンスと効率においてYOLOファミリーの以前のバージョンを上回っています。
YOLOv5の主な機能強化には、動的アーキテクチャの使用、広範なデータ拡張技術、革新的なトレーニング戦略、および損失の計算とターゲットの構築プロセスにおける重要な調整が含まれます。これらのすべてのイノベーションは、YOLOモデルのトレードマークである高速性を維持しながら、オブジェクト検出の精度と効率を大幅に向上させます。