DETR - Transformer を使用したエンドツーエンドの物体検出の始まり


ディープラーニングのナレッジポイントのまとめ

コラムリンク:
https://blog.csdn.net/qq_39707285/article/details/124005405

此专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器、各种经典算法、各种算法的优化策略Bag of Freebies (BoF)等。


RNNからTransformerシリーズへの注目まで

コラムリンク:
https://blog.csdn.net/qq_39707285/category_11814303.html

此专栏主要介绍RNN、LSTM、Attention、Transformer及其代码实现。


YOLOシリーズのターゲット検出アルゴリズム

コラムリンク:
https://blog.csdn.net/qq_39707285/category_12009356.html

此专栏详细介绍YOLO系列算法,包括官方的YOLOv1、YOLOv2、YOLOv3、YOLOv4、Scaled-YOLOv4、YOLOv7,和YOLOv5,以及美团的YOLOv6,还有PaddlePaddle的PP-YOLO、PP-YOLOv2等,还有YOLOR、YOLOX、YOLOS等。


ビジュアルトランスフォーマー

コラムリンク:
https://blog.csdn.net/qq_39707285/category_12184436.html

此专栏详细介绍各种Visual Transformer,包括应用到分类、检测和分割的多种算法。



DETR
Transformer をエンドツーエンドの物体検出に適用し始めます。論文: 「トランスフォーマーを使用したエンドツーエンドの物体検出」

1 はじめに

この論文では、オブジェクト検出を直接アンサンブル予測問題として取り上げる (つまり、モデルが予測ボックスの座標とカテゴリのセットを直接出力する) オブジェクト検出の新しい方法を提案します。この方法では、検出プロセスが簡素化され、NMS やアンカーなどの手動で設計された多くのコンポーネントが削除されます。これは、これらのコンポーネントがタスクを解決するための事前知識を明らかにエンコードしており、さまざまなタスクに合わせて再設計する必要があるためです。

この論文で提案されたアルゴリズムは DEtection TRansformer (DETR) と呼ばれ、主にセットベースのグローバル損失 (バイナリ マッチングによる強制的に一意な予測) と Transformer エンコーダ/デコーダ アーキテクチャの 2 つの部分で構成されます。学習可能な小さなオブジェクト クエリの固定セットが与えられると、DETR はオブジェクトとグローバル画像コンテキストの間の関係を分析し、最終的な予測セットを並列で直接出力します。他の多くの最新の検出アルゴリズムとは異なり、このアルゴリズムはシンプルであり、他の特殊なライブラリは必要ありません。詳細については、記事の最後にある実装コードを参照してください。

2. 関連知識

このアルゴリズムの構築には、セット予測の 2 部マッチング損失、Transformer に基づくエンコーダ/デコーダ構造、並列デコードおよびターゲット検出方法など、いくつかの分野の知識が必要です。

2.1 Set Prediction(セット予測)

現在、多くのアルゴリズムが直面している最初の困難は、ほぼ重複 (近似の繰り返し) を避けることです。ほとんどのアルゴリズムは、この問題に対処するために NMS を使用しますが、直接セット予測には後処理がありません。セット予測では、冗長なグローバル推論スキームを回避するために、すべての予測要素間の相互作用をモデル化する必要があります。固定サイズのセット予測の場合は、高密度の完全接続ネットワークで十分ですが、コストが高くなります。一般的なアプローチは、リカレント ニューラル ネットワークなどの自己回帰シーケンス モデルを使用することです。すべての場合において、損失関数は予測のさまざまな順列に対して一定のままである必要があります。通常の解決策は、ハンガリーのアルゴリズムに従って損失を設計し、GT と予測の間の 2 部一致を見つけることです。これにより、順列の不変性が強制され、各ターゲット要素が一意に一致することが保証されます。本論文では二部整合損失法を採用する。ただし、これまでのほとんどの研究とは対照的に、この論文では自己回帰モデルを使用せず、並列デコードを備えた Transformer を使用しています。

2.2 トランスフォーマーと並列デコード

Transformerの紹介はこちらの記事を参考にしてください。アテンション メカニズムは、入力シーケンス全体からの情報を集約するニューラル ネットワーク層です。Transformer は、シーケンスの各要素をスキャンし、シーケンス全体からの情報を集約することによって更新する、非ローカル ニューラル ネットワーク (非ローカル NN) に似たセルフ アテンション レイヤーを導入します。アテンションベースのモデルの主な利点の 1 つは、グローバルな計算と完全なメモリであるため、RNN よりも長いシーケンスに適しています。

Transformer は最初に自己回帰モデルで使用され、次に初期のシーケンスツーシーケンス モデルで使用され、出力トークンを 1 つずつ生成します。ただし、その推論コストは高く (出力長に比例し、バッチ処理が困難)、この論文では、Transformer と並列デコードを組み合わせて、計算コストとアンサンブル予測に必要なグローバル計算を実行する能力との間の適切なトレードオフを実現します。 。

2.3 物体の検出

私たちのモデルでは、アンカーの代わりに入力画像に対する絶対ボックス予測を使用して検出セットを直接予測することで、手動の設計プロセスが削除され、検出プロセスが簡素化されます。

  1. セットベースの損失
    初期の深層学習モデルでは、さまざまな予測間の関係は畳み込み層または全結合層でのみモデル化されており、手動で設計された NMS 後処理によってパフォーマンスを向上させることができます。最近の検出器は、GT と予測の間で非固有の割り当てルールを使用し、NMS を使用します。
    学習可能な NMS メソッドとリレーショナル ネットワークは、異なる予測間の関係に対する注意を明示的にモデル化します。これらは直接アンサンブル損失を使用し、後処理ステップを必要としません。ただし、これらの方法では、提案ボックスの座標など、他の手動で作成されたコンテキスト機能を使用して、検出間の関係を効果的にモデル化しますが、この論文では、モデルにエンコードされた事前知識を減らすためのソリューションを模索しています。

  2. サイクル検出器
    この論文に最も近いアプローチは、オブジェクト検出とインスタンス セグメンテーションのためのエンドツーエンドのアンサンブル予測です。この論文と同様に、彼らは CNN アクティベーションを備えたエンコーダ/デコーダ アーキテクチャに基づく 2 部マッチング損失を使用して、一連の境界ボックスを直接生成します。ただし、これらの手法は小規模なデータセットでのみ評価されており、最新のベンチマークに対して評価されていません。特に、これらは自己回帰モデル (より正確には RNN) に基づいているため、並列デコードに Transformer を利用しません。

3. DETRモデル

検出における直接アンサンブル予測には 2 つのコンポーネントが重要です: (1) 予測と GT の間の一意の一致を強制するアンサンブル予測損失、(2) オブジェクトのセットを (1 パスで) 予測し、それらの関係を調整する モデル化されたアーキテクチャ。全体の構造図は次のとおりです。
ここに画像の説明を挿入

3.1 ターゲット検出セットの予測損失

DETR は、デコーダの 1 回のパスで N 個の予測の固定サイズのセットを推論します。ここで、N は画像内のオブジェクトの数よりも大幅に大きくなります。トレーニングにおける主な困難の 1 つは、GT に従って予測されたオブジェクト (カテゴリ、位置、サイズ) をスコアリングすることです。この論文の損失は、予測オブジェクトと GT オブジェクトの間で最良の 2 部一致を生成し、特定のオブジェクト (境界ボックス) に対して最適化する損失です。

y を使用して GT ターゲット セットを表します。y ^ = { y ^ i } i = 1 N \hat y = \{\hat y_i\}^N_{i=1}y^={ y^私は}i = 1N予測のセットを表します。N は画像内のオブジェクトの数より大きく、合計数が N になるように (オブジェクトなし、⊘)y で埋められます。これら 2 つのセット間の 2 部一致を見つけるには、N 個の要素σ ∈ ð N \sigma \in \eth_Nの組み合わせを検索します。pðN,一致コスト:
ここに画像の説明を挿入
matchζ match ( yi , y ^ σ ( i ) ) \zeta_{match}(y_i,\hat y_{\sigma(i)})gマッチ_ _ _( y私はy^σ ( i ))是GTyi y_iy私はそして位置はσ ( i ) \sigma(i)ですσ ( i )の予測間のペアワイズ マッチング コストこの最適な割り当ては、ハンガリーのアルゴリズムを使用して効率的に計算できます。
マッチング コストでは、カテゴリ予測と、予測と GT ボックス間の類似性の両方が考慮されます。GT セットの各要素 i は、yi = ( ci , bi ) y_i=(c_i,b_i)y私は=( c私はb私は),其中 c i c_i c私ははターゲット クラス ラベル (⊘ の場合もあります)、bi ∈ [ 0 , 1 ] 4 b_i \in[0,1]^4b私は[ 0 ,1 ]4は、GT ボックスの中心座標と、画像サイズに対するその高さと幅を定義するベクトルです。位置σ ( i ) \sigma(i)σ ( i )予測、ci c_ic私はクラス確率はp ^ σ ( i ) ( ci ) \hat p_{\sigma(i)}(c_i)として定義されます。p^σ ( i )( c私は)、予測フレームはb ^ σ ( i ) \hat b_{\sigma(i)}b^σ ( i )これらのシンボルにより、 ζ match ( yi , y ^ σ ( i ) ) \zeta_{match}(y_i,\hat y_{\sigma(i)}) が定義されますgマッチ_ _ _( y私はy^σ ( i ))等しい: 一致を
ここに画像の説明を挿入
見つけるこのプロセスは、提案ボックスまたはアンカーを GT オブジェクトに一致させるために最新の検出器で使用されるヒューリスティック割り当てルールと同じ役割を果たします。主な違いは、重複のない直接セット予測では 1 対 1 の一致を見つける必要があることです。

2 番目のステップでは、損失関数を計算します。これは、前のステップで一致したすべてのペアのハンガリー損失です。この論文で定義される損失は、通常のオブジェクト検出器の損失、つまりカテゴリ予測の負の対数尤度およびボックス損失の線形結合に似ています。ここで、
ここに画像の説明を挿入
σ ^ \hat \sigmap^は、最初のステップ (式 1) で計算された最適な割り当てです。実際には、対数確率項の重み付けci = ⊘ c_i=⊘c私は=カテゴリのバランスをとるために、10 x 10 で割ります。ターゲットと ⊘ の間のマッチング コストは予測に依存しないことに注意してください。これは、この場合コストが一定であることを意味します。マッチングコストでは、確率p ^ σ ( i ) ( ci ) \hat p_{\sigma(i)}(c_i) をp^σ ( i )( c私は)対数確率の代わりに。これにより、クラス予測子はζ box ( ⋅ , ⋅ ) \zeta_{box}(·,·) にgボックス_ _( ⋅、⋅)相応です。

境界ボックスの損失:マッチング コストとハンガリー損失の 2 番目の部分は、
境界ボックスのスコアを表すζ box ( ⋅ ) \zeta_{box}(·)です。gボックス_ _( ボックスをΔwrtとして予測する多くの検出器とは異なり、私たちは直接予測を行います。このアプローチは実装を簡素化しますが、損失の相対的なサイズに問題が生じます。最も一般的に使用される l1 損失は、相対誤差が似ていても、小さいボックスと大きいボックスではスケールが異なります。この問題を軽減するために、l1 損失と一般化 IoU 損失の線形結合である ζ box ( ⋅ , ⋅ ) \zeta_{box}(·,·) を使用します。gボックス_ _( ⋅、⋅)はスケール不変です。全体として、損失はζ box ( bi , b ^ σ ( i ) ) \zeta_{box}(b_i,\hat b_{\sigma(i)}) です。gボックス_ _( b私はb^σ ( i )),定义为:
ここに画像の説明を挿入
其中 λ i o u , λ L 1 ∈ ℜ \lambda_{iou},\lambda_{L_1} \in \Re あなたL1はハイパーパラメータです。これら 2 つの損失は、バッチ内のオブジェクトの数によって正規化されます。

3.2 DETR の構造

3.2.1 バックボーン

入力画像サイズ: ximg ∈ ℜ 3 × H 0 × W 0 x_{img} \in \Re^{3×H_0×W_0}バツ3 ×高さ0× W0畳み込みバックボーンを通じて低解像度の特徴マップを生成します: f ∈ ℜ C × H × W f \in \Re^{C×H×W}fC × H × W、C は 2048 に設定され、H 、 W = H 0 32 、 W 0 32 H,W= \frac {H_0}{32},\frac {W_0}{32}H W=32H032W0

3.2.2 トランスエンコーダ

まず、1x1 畳み込みにより、特徴マップ f のチャネル次元が C からより小さい次元 d に削減され、新しい特徴マップz 0 ∈ ℜ d × H × W z_0 \in \Re^{d×H×W } が得られます。z0d × H × W の場合、エンコーダは入力としてシーケンスを予期するため、z0 の空間次元は 1 次元に折りたたまれ、d × H × W d×H×Wd×H×Wの機能マップ。各エンコーダ層には、マルチヘッド セルフ アテンション モジュールとフィードフォワード ネットワーク (FFN) で構成される標準アーキテクチャがあります。Transformer 構造は変換不変であるため、各注目層の入力に追加される固定位置エンコーディングによって補足されます。

3.2.3 トランスデコーダ

デコーダは、Transformer の標準アーキテクチャに従い、マルチヘッド セルフ アテンションとエンコーダ デコーダ アテンション メカニズムを使用して、サイズ d の N 個の埋め込みを変換します。各デコーダ層が N 個のターゲットを並行してデコードするオリジナルの Transformaer とは異なり、Vaswani らは出力シーケンスを一度に 1 要素ずつ予測する自己回帰モデルを使用しています。デコーダも順列不変であるため、異なる結果を生成するには N 個の入力埋め込みが異なっていなければなりません。これらの入力埋め込みは、ターゲット クエリと呼ばれる学習された位置エンコーディングであり、エンコーダーと同様に各注目層の入力に追加されます。デコーダは、N 個のターゲット クエリを出力埋め込みに変換します。これらは、フィードフォワード ネットワーク (次のサブセクションで説明) によってボックス座標とクラス ラベルに独立してデコードされ、N 個の最終予測が得られます。これらの埋め込みに対する自己注意とエンコーダとデコーダの注意により、モデルはそれらの間のペアごとの関係を使用して、画像全体をコンテキストとして使用しながら、すべてのオブジェクトについてグローバルに推論します。

3.2.4 予測フィードフォワード ネットワーク (FFN)

最終的な予測は、ReLU 活性化関数と隠れ次元 d を備えた 3 層パーセプトロンと線形投影層によって計算されます。FFN は入力画像ボックスの正規化された中心座標、高さ、幅を予測し、線形層はソフトマックス関数を使用してクラス ラベルを予測します。N 個の境界ボックスの固定サイズのセットが予測されるため (N は通常、画像内の実際のオブジェクトの数よりもはるかに大きい)、オブジェクトが検出されない場合に使用する追加の特別なクラス ラベル ⊘ が必要です。このクラスは、標準のオブジェクト検出方法における「バックグラウンド」クラスと同様の役割を果たします。

3.2.5 補助復号損失

この論文では、トレーニング中にデコーダで補助損失を使用すると、特にモデルが各クラスの正しいターゲット桁を出力するのに役立つことがわかりました。予測 FFN およびハンガリー損失は、各デコーダー層の後に追加されます。すべての予測 FFN はパラメーターを共有します。追加の共有レイヤ仕様は、さまざまなデコーダ レイヤからの予測 FFN の入力を正規化するために使用されます。
ここに画像の説明を挿入

3.3 DETRの詳細構造

以下の図は、DETR で使用される変数 Transformer と、各注目層で渡される位置エンコーディングの詳細を示しています。CNN バックボーンからの画像特徴は、空間位置エンコーディングとともに、Transformer エンコーダーを通じて各マルチヘッド セルフ アテンション レイヤーのクエリとキーに追加されます。次に、デコーダはクエリ (クエリ、最初は 0 に設定)、出力位置エンコーディング (ターゲット クエリ)、およびエンコーダ メモリを受け取り、複数のマルチヘッド セルフ アテンションとデコーダ - エンコーダ アテンションの最終的なコレクションを通じて、予測クラス ラベルと境界ボックスを生成します。 。第1デコーダ層の第1セルフアテンション層はスキップすることができる。

4 結論

この論文では、直接セット予測のための Transformer と二部マッチング損失に基づく物体検出システムの新しい設計である DETR を提案します。この方法は、困難な COCO データセットで最適化された Faster R-CNN と同等の結果を達成します。DETR は実装が簡単で、パノプティック セグメンテーションに簡単に拡張できる柔軟なアーキテクチャを備えており、競争力のある結果が得られます。さらに、Faster R-CNN と比較して、大きなオブジェクトに対するパフォーマンスが大幅に向上しており、自己注意によるグローバル情報の処理から恩恵を受ける可能性があります。
この新しく設計された検出器は、特に小さなオブジェクトのトレーニング、最適化、パフォーマンスの点で新たな課題ももたらします。

5. コードを実装する

import torch
from torch import nn
from torchvision.models import resnet50


class DETR(nn.Module):
    def __init__(self, num_classes, hidden_dim, nheads, num_encoder_layers, num_decoder_layers):
        super().__init__()
        # We take only convolutional layers from ResNet-50 model
        self.backbone = nn.Sequential(*list(resnet50(pretrained=False).children())[:-2])
        self.conv = nn.Conv2d(2048, hidden_dim, 1)
        self.transformer = nn.Transformer(hidden_dim, nheads, num_encoder_layers, num_decoder_layers)
        self.linear_class = nn.Linear(hidden_dim, num_classes + 1)
        self.linear_bbox = nn.Linear(hidden_dim, 4)
        self.query_pos = nn.Parameter(torch.rand(100, hidden_dim))
        self.row_embed = nn.Parameter(torch.rand(50, hidden_dim // 2))
        self.col_embed = nn.Parameter(torch.rand(50, hidden_dim // 2))

    def forward(self, inputs):
        x = self.backbone(inputs)
        h = self.conv(x)
        H, W = h.shape[-2:]
        pos = torch.cat([
            self.col_embed[:W].unsqueeze(0).repeat(H, 1, 1),
            self.row_embed[:H].unsqueeze(1).repeat(1, W, 1), ], dim=-1).flatten(0, 1).unsqueeze(1)
        h = self.transformer(pos + h.flatten(2).permute(2, 0, 1), self.query_pos.unsqueeze(1))
        return self.linear_class(h), self.linear_bbox(h).sigmoid()


if __name__ == "__main__":
    detr = DETR(num_classes=91, hidden_dim=256, nheads=8, num_encoder_layers=6, num_decoder_layers=6)
    detr.eval()
    inputs = torch.randn(1, 3, 800, 1200)
    logits, bboxes = detr(inputs)
    print(logits.shape)
    print(bboxes.shape)

おすすめ

転載: blog.csdn.net/qq_39707285/article/details/128849450