NMSRotated

バージョン名: NMSRotated-13

カテゴリー: ソートと最大化

簡単な説明: NMSRotated は、予測されたスコアを持つ回転ボックスの非最大抑制を実行します。

詳細な説明: NMSRotated は通常の非最大抑制を実行しますが、IoU の値は、対応する角度だけ回転された境界ボックスに対して計算されます。

一般的なアルゴリズムを以下に説明します。

  1. B = [b_0,...,b_n] を初期検出ボックスのリスト、S = [s_0,...,s_N] を対応するスコアのリストとします。

  2. D = [] を結果として得られるボックスの初期収集とします。

  3. B が空の場合は、ステップ 8 に進みます。

  4. 最もスコアの高いボックスを選択してください。例えば、それがスコア s のボックス b であるとします。

  5. B から b を削除します。

  6. スコア sscore_threshold 以上の場合は、bD に追加します。それ以外はステップ 8 に進みます。

  7. B の各入力ボックス b_i と対応するスコア s_i に対して、s_i = s_i * func(rotated_iou(b_i, b)) を設定し、ステップ 3 に進みます。

  8. D を返します。これは、対応するスコア S のコレクション、および D の要素の数です。

ここで、func(rotated_iou(b_i, b)) = 1 if rotated_iou(b_i, b) <= iou_threshold else 0 です。

2 つの境界ボックス B1B2 がある場合、rotated_iou(B1, B2) を計算するのに次の手順が実行されます。

  1. clockwise 属性で指定された方向に従って、回転した頂点、つまりラジアン単位の対応する角度で変換された各ボックスの 4 つの角の (x, y) 座標を計算します。

  2. B1B2 のエッジ間のすべての交点を見つけます。それらを intersection_points に追加します。

  3. B2 のエリア内で B1 のすべてのコーナーを検索し、B1 のエリア内で B2 のすべてのコーナーを検索します。それらを intersection_points に追加します。

  4. intersection_points で記述される多角形の intersection_area を計算します (Sholeace の式を参照)。

  5. union_area (B1B2 の共通領域)、union_area = B1_area + B2_area を計算します。

  6. ユニオン rotated_iou = intersection_area / (union_area - intersection_area) の交差を返します。

このアルゴリズムは、各バッチ要素の各クラスに独立して適用されます。各クラスの出力ボックスの合計数は、max_output_boxes_per_class を超えてはなりません。

属性:

  • sort_result_descending

    • 説明: sort_result_descending は、選択したボックスをバッチ間で並べ替える必要があるかどうか指定するフラグです。

    • 値の範囲: true または false

      • true - 選択したボックスをバッチ間で並べ替えます。

      • false - 選択したボックスをバッチ間で並べ替えません (ボックスはクラスごとに並べ替えられます)。

    • タイプ: ブール値

    • デフォルト値: true

    • 必須: いいえ

  • output_type

    • 説明: 出力テンソルのタイプ

    • 値の範囲: “i64” または “i32”

    • タイプ: 文字列

    • デフォルト値: “i64”

    • 必須: いいえ

  • clockwise

    • 説明: 角度の方向

    • 値の範囲: true または false

      • true - 角度の正の値は時計回り (clockwise) です。

      • false - 角度の正の値は反時計回り (counterclockwise) です。

    • タイプ: ブール値

    • デフォルト値: true

    • 必須: いいえ

入力:

  • 1: boxes - タイプ T および形状 [num_batches, num_boxes, 5] のテンソル。ボックスデータは、[x_center, y_center, width, height, angle]、中心の座標、幅 (x)、高さ (y)、およびラジアン単位の角度として指定されます。必須。

  • 2: scores - タイプ T およびボックススコアを持つ形状 [num_batches, num_classes, num_boxes] のテンソル。必須。

  • 3: max_output_boxes_per_class - クラスごとに選択されるボックスの最大数を指定する T_MAX_BOXES タイプのスカラーテンソル。必須。

  • 4: iou_threshold - 和集合しきい値を超える交差を指定する T_THRESHOLDS タイプのスカラーテンソル。必須。

  • 5: score_threshold - 処理を考慮するボックスの最小スコアを指定する、タイプ T_THRESHOLDS の 1 要素を持つスカラーまたは 1D テンソル。必須。

出力:

  • 1: selected_indices - タイプ output_type および形状 [number of selected boxes, 3] のテンソル。選択されたボックスに関する情報はトリプレット [batch_index, class_index, box_index] として含まれます。

  • 2: selected_scores - タイプ T_THRESHOLDS および形状 [number of selected boxes, 3] のテンソル。選択された各ボックスのスコアに関する情報がトリプレット [batch_index, class_index, box_score] として含まれます。

  • 3: valid_outputs - 選択されたボックスの総数を表すタイプ output_type の 1 要素を持つ 1D テンソル。

動的出力テンソルをサポートしないプラグインは、選択可能なボックスの数の上限である形状 [min(num_boxes, max_output_boxes_per_class) * num_batches * num_classes, 3]selected_indices テンソルと selected_scores テンソルを生成します。実際に選択されたボックスに続く出力テンソル要素は、値 -1 で埋められます。

タイプ:

  • T: 浮動小数点タイプ。

  • T_MAX_BOXES: 整数タイプ。

  • T_THRESHOLDS: 浮動小数点タイプ。

例:

<layer ... type="NMSRotated" ... >
    <data sort_result_descending="true" output_type="i64" clockwise="true"/>
    <input>
        <port id="0">
            <dim>3</dim>
            <dim>100</dim>
            <dim>5</dim>
        </port>
        <port id="1">
            <dim>3</dim>
            <dim>5</dim>
            <dim>100</dim>
        </port>
        <port id="2"/> <!-- 10 -->
        <port id="3"/>
        <port id="4"/>
    </input>
    <output>
        <port id="6" precision="I64">
            <dim>150</dim> <!-- min(100, 10) * 3 * 5 -->
            <dim>3</dim>
        </port>
        <port id="7" precision="FP32">
            <dim>150</dim> <!-- min(100, 10) * 3 * 5 -->
            <dim>3</dim>
        </port>
        <port id="8" precision="I64">
            <dim>1</dim>
        </port>
    </output>
</layer>