Yolov8 に基づく野外煙検知 (5): Gold-YOLO、すべての YOLO をはるかに上回っています | Huawei Noah NeurIPS23

 

目次

 

1.Yolov8の紹介

2. 山火事の煙データセットの概要

3.ゴールドヨーロ

3.1gold-yolo が yolov8 に導入されました

3.2 gold-yolo が yolov8 に参加

4. トレーニング結果の分析

5.シリーズ


1.Yolov8の紹介

         Ultralytics YOLOv8 は、Ultralytics が開発した YOLO ターゲット検出および画像セグメンテーション モデルの最新バージョンです。YOLOv8 は、これまでの YOLO の成功を基盤とし、パフォーマンスと柔軟性をさらに向上させるための新機能と改善を導入した最先端の最先端 (SOTA) モデルです。大規模なデータセットでトレーニングでき、CPU から GPU まで、さまざまなハードウェア プラットフォームで実行できます。

具体的な改善点は以下の通りです。

  1. Backbone : CSP のアイデアを引き続き使用していますが、YOLOv5 の C3 モジュールが C2f モジュールに置き換えられ、さらなる軽量化が実現されています。同時に、YOLOv8 では YOLOv5 や他のアーキテクチャで使用されている SPPF モジュールが引き続き使用されています。

  2. PAN-FPN : YOLOv8 が依然として PAN の考え方を使用していることは間違いありませんが、YOLOv5 と YOLOv8 の構造図を比較すると、YOLOv8 は YOLOv5 の PAN-FPN アップサンプリング段階での畳み込み構造を削除していることがわかります、C3 も削除されます。モジュールは C2f モジュールに置き換えられます。

  3. 分離頭: 何か違う匂いがしますか? はい、YOLOv8 は分離ヘッドに移行します。

  4. アンカーフリー: YOLOv8 は以前のアンカーベースを放棄し、アンカーフリーのアイデアを使用しました。

  5. 損失関数: YOLOv8 は、VFL 損失を分類損失として使用し、DFL 損失 + CIOU 損失を分類損失として使用します。

  6. サンプル マッチング: YOLOv8 は、以前の IOU マッチングまたは一方的な比例割り当て方法を放棄し、代わりに Task-Aligned Assigner マッチング方法を使用します。

フレームワーク図はリンクで提供されています: YOLOv8 モデル構造の概要 · Issue #189 · Ultralytics/ultralytics · GitHub

2. 山火事の煙データセットの概要

データセットのサイズは 737 画像、train:val:test は 7:2:1 にランダムに割り当てられ、カテゴリ: 煙

3.ゴールドヨーロ

リンク: https://arxiv.org/pdf/2309.11331.pdf 

コード: https://github.com/huawei-noah/Efficient-Computing/tree/master/Detection/Gold-YOLO

部署: ファーウェイ・ノアの方舟研究所 

理論的な部分については、「YOLOシリーズを超えて!」を参照してください。ファーウェイ、効率的なリアルタイム目標検出器「Gold-YOLO」を提案 - Zhihu 

従来のYOLOの問題点

検出モデルでは、通常、さまざまなレベルの一連の特徴が最初にバックボーンを通じて抽出されます。FPN はこのバックボーンの特徴を利用して、対応する融合構造を構築します。非レベルの特徴には、さまざまなサイズのオブジェクトの位置情報が含まれています。これらの特徴は、含まれる情報は異なりますが、これらの機能が相互に統合されると、不足している情報を補い合い、各レベルでの情報の豊富さが向上し、ネットワークのパフォーマンスが向上します。

元の FPN 構造では、レイヤーごとのプログレッシブ情報融合モードにより、隣接するレイヤーの情報を完全に融合できますが、レイヤー間の情報融合にも問題が生じます。レイヤー間の情報がインタラクティブに融合される場合、直接接続がないため、インタラクティブ チャネルは統合のための「仲介者」として機能する中間層にのみ依存できるため、ある程度の情報が失われます。これまでの多くの研究でこの問題に注目しており、その解決策は通常、ショートカットを追加してパスを追加し、情報の流れを強化することです。

要約: 現在の YOLO シリーズ モデルは通常、情報融合に FPN のような手法を使用していますが、この構造では層を越えた情報を融合する際に情報損失が発生するという問題があります。この問題に対応して、私たちは、グローバルな視点でさまざまなレベルの機能を統合および分散して、より包括的な完全に効率的な情報インタラクションと、融合メカニズムを構築し、GD メカニズムに基づいて Gold-YOLO を構築しました。COCO データセットでは、当社の Gold-YOLO は既存の YOLO シリーズを上回り、精度と速度の曲線で SOTA を達成します。

 

新しい情報の相互作用および融合メカニズムが提案されています: Information Gather-and-Distribute Mechanism (情報収集および配布メカニズム)このメカニズムは、異なるレベルの機能をグローバルに融合することでグローバルな情報を取得し、異なるレベルの機能にグローバルな情報を注入することで、効率的な情報の相互作用と融合を実現します。GD メカニズムは、遅延を大幅に増加させることなくネック部分の情報融合能力を大幅に強化し、異なるサイズのオブジェクトのモデルの検出能力を向上させます。 

 Gold-YOLO では、さまざまなサイズのオブジェクトを検出し、精度と速度を比較するモデルのニーズに応えて、情報を融合するために 2 つの GD ブランチを構築しました。低レベルの情報集約分散ブランチ (Low-GD) と、高レベル 情報収集分配ブランチ (High-GD) は、畳み込みと変換にそれぞれ基づいて特徴情報を抽出および融合します。

 実験結果:

 対応するアブレーション実験は、Gold-YOLO のさまざまな分岐と構造がモデルの精度と速度に及ぼす影響を調査するために実施されました。

3.1gold-yolo が yolov8 に導入されました

3.2 gold-yolo が yolov8 に参加

コアコード:

class Attention(torch.nn.Module):
    def __init__(self, dim, key_dim, num_heads, attn_ratio=4):
        super().__init__()
        self.num_heads = num_heads
        self.scale = key_dim ** -0.5
        self.key_dim = key_dim
        self.nh_kd = nh_kd = key_dim * num_heads  # num_head key_dim
        self.d = int(attn_ratio * key_dim)
        self.dh = int(attn_ratio * key_dim) * num_heads
        self.attn_ratio = attn_ratio

        self.to_q = Conv(dim, nh_kd, 1, act=False)
        self.to_k = Conv(dim, nh_kd, 1, act=False)
        self.to_v = Conv(dim, self.dh, 1, act=False)

        self.proj = torch.nn.Sequential(nn.ReLU6(), Conv(self.dh, dim, act=False))

    def forward(self, x):  # x (B,N,C)
        B, C, H, W = get_shape(x)

        qq = self.to_q(x).reshape(B, self.num_heads, self.key_dim, H * W).permute(0, 1, 3, 2)
        kk = self.to_k(x).reshape(B, self.num_heads, self.key_dim, H * W)
        vv = self.to_v(x).reshape(B, self.num_heads, self.d, H * W).permute(0, 1, 3, 2)

        attn = torch.matmul(qq, kk)
        attn = attn.softmax(dim=-1)  # dim = k

        xx = torch.matmul(attn, vv)

        xx = xx.permute(0, 1, 3, 2).reshape(B, self.dh, H, W)
        xx = self.proj(xx)
        return xx


class top_Block(nn.Module):

    def __init__(self, dim, key_dim, num_heads, mlp_ratio=4., attn_ratio=2., drop=0.,
                 drop_path=0.):
        super().__init__()
        self.dim = dim
        self.num_heads = num_heads
        self.mlp_ratio = mlp_ratio

        self.attn = Attention(dim, key_dim=key_dim, num_heads=num_heads, attn_ratio=attn_ratio)

        # NOTE: drop path for stochastic depth, we shall see if this is better than dropout here
        self.drop_path = DropPath(drop_path) if drop_path > 0. else nn.Identity()
        mlp_hidden_dim = int(dim * mlp_ratio)
        self.mlp = Mlp(in_features=dim, hidden_features=mlp_hidden_dim, drop=drop)

    def forward(self, x1):
        x1 = x1 + self.drop_path(self.attn(x1))
        x1 = x1 + self.drop_path(self.mlp(x1))
        return x1


class TopBasicLayer(nn.Module):
    def __init__(self, embedding_dim, ouc_list, block_num=2, key_dim=8, num_heads=4,
                 mlp_ratio=4., attn_ratio=2., drop=0., attn_drop=0., drop_path=0.):
        super().__init__()
        self.block_num = block_num

        self.transformer_blocks = nn.ModuleList()
        for i in range(self.block_num):
            self.transformer_blocks.append(top_Block(
                embedding_dim, key_dim=key_dim, num_heads=num_heads,
                mlp_ratio=mlp_ratio, attn_ratio=attn_ratio,
                drop=drop, drop_path=drop_path[i] if isinstance(drop_path, list) else drop_path))
        self.conv = nn.Conv2d(embedding_dim, sum(ouc_list), 1)

    def forward(self, x):
        # token * N
        for i in range(self.block_num):
            x = self.transformer_blocks[i](x)
        return self.conv(x)


class AdvPoolFusion(nn.Module):
    def forward(self, x):
        x1, x2 = x
        if torch.onnx.is_in_onnx_export():
            self.pool = onnx_AdaptiveAvgPool2d
        else:
            self.pool = nn.functional.adaptive_avg_pool2d

        N, C, H, W = x2.shape
        output_size = np.array([H, W])
        x1 = self.pool(x1, output_size)

        return torch.cat([x1, x2], 1)

コアコード:

ネットワーク全体での YOLOv8 の最初の激しい増加: Gold-YOLO、はるかに先を行き、すべての YOLO を上回る | Huawei Noah NeurIPS23_AI Little Monster のブログ - CSDN ブログ

 4. トレーニング結果の分析

訓練結果は以下の通りです。

元の [email protected] 0.839 が 0.954 に改善されました 

YOLOv8-goldYOLO summary: 359 layers, 6015123 parameters, 0 gradients, 11.9 GFLOPs
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 25/25 [00:06<00:00,  3.84it/s]
                   all        199        199       0.88       0.93      0.954      0.555

5.シリーズ

1) Yolov8 に基づく野煙検知

2) Yolov8 に基づく現場煙検知 (2): 多次元共同注意モジュール MCA | 2023.9 の最新リリース

3) Yolov8 に基づく野煙検出 (3): 激しい成長を達成するための動的なスネーク畳み込み | ICCV2023

4) Yolov8 (4) に基づく野外煙検知: Channel Priority Convolution Attendant (CPCA) | 2023 年の中国科学院の最新出版物 

5)   Yolov8 (5) に基づく野煙検知: Gold-YOLO、すべての YOLO を上回り、はるかに先を行く

おすすめ

転載: blog.csdn.net/m0_63774211/article/details/133293738