コンテンツへスキップ

Ultralytics YOLOv5 建築

YOLOv5 (v6.0/6.1)は、Ultralytics によって開発された強力な物体検出アルゴリズムである。この記事では、YOLOv5 アーキテクチャ、データ補強戦略、トレーニング方法論、損失計算技術について深く掘り下げる。この包括的な理解は、監視、自律走行車、画像認識など、様々な分野での物体検出の実用的なアプリケーションを向上させるのに役立ちます。

1.モデルの構造

YOLOv5のアーキテクチャは3つの主要部分から構成されている:

  • バックボーン:これはネットワークの本体である。YOLOv5 の場合、バックボーンは New CSP-Darknet53 これは、以前のバージョンで使われていたダークネット・アーキテクチャを改良したものだ。
  • ネック:背骨と頭をつなぐ部分。YOLOv5 、 SPPF そして New CSP-PAN の構造を利用している。
  • ヘッド:YOLOv5 。 YOLOv3 Head そのためである。

モデルの構造を下の画像に示す。モデルの構造の詳細は yolov5l.yaml.

yolov5

YOLOv5 は、前作と比較していくつかのマイナーチェンジを導入している:

  1. について Focus 構造体は、以前のバージョンでは 6x6 Conv2d 構造になっている。この変更により効率が向上した。 #4825.
  2. について 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 は、モデルの汎化能力を向上させ、オーバーフィッティングを減らすために、様々なデータ補強技術を採用している。これらのテクニックには以下が含まれる:

  • モザイク補強:物体検出モデルが様々な物体のスケールや平行移動にうまく対応できるように、4枚の学習画像を1枚に合成する画像処理技術。

    モザイク

  • コピー・ペースト補強:画像からランダムなパッチをコピーし、ランダムに選んだ別の画像に貼り付けることで、効果的に新しい学習サンプルを生成する革新的なデータ補強手法。

    コピーペースト

  • ランダムなアフィン変換:これには、画像のランダムな回転、拡大縮小、平行移動、剪断が含まれます。

    ランダム・アフィン

  • MixUpオーグメンテーション:2つの画像と関連するラベルを線形結合して合成画像を作成する方法。

    混合

  • Albumentations:画像補強のための強力なライブラリで、さまざまな補強技術をサポートしています。

  • HSVオーグメンテーション:画像の色相、彩度、値をランダムに変化させる。

    hsv

  • ランダム水平反転:画像をランダムに水平方向に反転させる増強法。

    水平フリップ

3.トレーニング戦略

YOLOv5 は、モデルのパフォーマンスを向上させるために、いくつかの洗練されたトレーニング戦略を適用している。それらには以下のようなものがある:

  • マルチスケール学習:入力画像は、学習過程で元のサイズの0.5倍から1.5倍の範囲でランダムに拡大縮小される。
  • AutoAnchor:このストラテジーは、事前アンカー・ボックスを、カスタム・データのグランド・トゥルース・ボックスの統計的特性に一致するように最適化します。
  • ウォームアップとコサインLRスケジューラ:モデルの性能を向上させるために学習速度を調整する方法。
  • 指数移動平均(EMA):学習プロセスを安定させ、汎化誤差を減らすために、過去のステップのパラメータの平均を使用する戦略。
  • 混合精度トレーニング:半精度フォーマットで演算を行い、メモリ使用量を減らし、計算速度を向上させる方法。
  • ハイパーパラメータの進化:最適なパフォーマンスを達成するためにハイパーパラメータを自動的に調整する戦略。

4.追加機能

4.1 損失を計算する

YOLOv5 の損失は、3つの個々の損失成分の組み合わせとして計算される:

  • クラス損失(BCE損失):バイナリ・クロスエントロピー損失は、分類タスクの誤差を測定します。
  • オブジェクトネス損失(BCE Loss):もう一つのバイナリクロスエントロピー損失は、特定のグリッドセルにオブジェクトが存在するかどうかを検出する際の誤差を計算します。
  • 位置ロス(CIoUロス):完全なIoUロスで、グリッドセル内のオブジェクトをローカライズする際の誤差を測定する。

全体的な損失関数は次のように描かれる:

損失

4.2 バランス・ロス

3つの予測レイヤーのオブジェクトネス損失(P3, P4, P5)の重みが異なる。バランスの重みは [4.0, 1.0, 0.4] をそれぞれ用いている。このアプローチにより、異なるスケールでの予測が総損失に適切に寄与することが保証される。

obj_loss

4.3 グリッドの感度をなくす

YOLOv5 YOLOYOLOv2とYOLOv3では、ボックス座標は最後の層の活性化を使って直接予測されていた。

b_x b_y b_w b_h

YOLOv5 グリッド計算

しかし、YOLOv5 では、ボックス座標の予測式が更新され、グリッドの感度を下げ、モデルが境界のないボックス寸法を予測するのを防いでいる。

予測バウンディングボックスを計算するための改訂された公式は以下の通りである:

bx によって bw ベー

スケーリング前後の中心点オフセットを比較する。中心点オフセットの範囲は(0, 1)から(-0.5, 1.5)まで調整される。したがって、オフセットは簡単に0または1になる。

YOLOv5 グリッドスケーリング

調整前と調整後の高さと幅のスケーリング比(アンカーに対する相対値)を比較してください。オリジナルのyolo/darknetボックス方程式には重大な欠陥がある。幅と高さは、単純にout=exp(in)であるため、完全に束縛されていない。これは、勾配の暴走、不安定性、NaN損失、そして最終的にはトレーニングの完全な損失につながる可能性があり、危険である。

YOLOv5 無限のスケーリング

4.4 ビルド・ターゲット

YOLOv5 、学習効率とモデルの精度を向上させるために重要なのがビルドターゲットプロセスである。これは、出力マップの適切なグリッドセルにグランドトゥルースボックスを割り当て、適切なアンカーボックスとマッチングさせることを含む。

このプロセスは次のようなステップを踏む:

  • グランドトゥルースのボックス寸法と各アンカーテンプレートの寸法の比率を計算する。

rw

アールエイチ

アールダブリューマックス

ルーマックス

マックス

一致

YOLOv5 IoU計算

  • 計算された比率が閾値以内であれば、グランドトゥルースのボックスを対応するアンカーとマッチさせる。

YOLOv5 グリッドオーバーラップ

  • 一致したアンカーを適切なセルに割り当てる。中心点オフセットの修正により、1つのグラウンドトゥルース・ボックスが複数のアンカーに割り当てられることに留意する。中心点オフセットの範囲は(0, 1)から(-0.5, 1.5)に調整されている。GTボックスはより多くのアンカーに割り当てることができる。

YOLOv5 アンカー選択

こうすることで、ビルド・ターゲット・プロセスは、各グラウンド・トゥルース・オブジェクトがトレーニング・プロセス中に適切に割り当てられ、マッチングされることを保証し、YOLOv5 、オブジェクト検出のタスクをより効果的に学習できるようになる。

結論

結論として、YOLOv5 は、リアルタイムの物体検出モデルの開発における重要な前進である。様々な新機能、機能強化、学習ストラテジーを取り入れることで、性能と効率において、YOLO ファミリーの旧バージョンを凌駕している。

YOLOv5 の主な強化点には、動的アーキテクチャの使用、広範なデータ補強技術、革新的な学習戦略、および計算損失とターゲット構築プロセスの重要な調整が含まれます。これらの技術革新により、YOLO モデルの特徴である高速性を維持しながら、物体検出の精度と効率が大幅に向上しました。



Created 2023-11-12, Updated 2024-06-19
Authors: ambitious-octopus (1), glenn-jocher (9), sergiuwaxmann (1)

コメント