Specify NonMaxSuppression-9 (#10729)
* define_NMS-9_specification * default value as true for soft-nms-supressed-by-iou * soft nms support * comments apply
This commit is contained in:
1 parent
bff9769dd2
commit
fca2595293
2 files changed
+124
No files matched your search
@@ -119,6 +119,7 @@
|
||||
NonMaxSuppression-3 <openvino_docs_ops_sort_NonMaxSuppression_3>
|
||||
NonMaxSuppression-4 <openvino_docs_ops_sort_NonMaxSuppression_4>
|
||||
NonMaxSuppression-5 <openvino_docs_ops_sort_NonMaxSuppression_5>
|
||||
NonMaxSuppression-9 <openvino_docs_ops_sort_NonMaxSuppression_9>
|
||||
NonZero-3 <openvino_docs_ops_condition_NonZero_3>
|
||||
NormalizeL2-1 <openvino_docs_ops_normalization_NormalizeL2_1>
|
||||
NotEqual-1 <openvino_docs_ops_comparison_NotEqual_1>
|
||||
|
||||
@@ -0,0 +1,123 @@
|
||||
# NonMaxSuppression {#openvino_docs_ops_sort_NonMaxSuppression_9}
|
||||
|
||||
**Versioned name**: *NonMaxSuppression-9*
|
||||
|
||||
**Category**: *Sorting and maximization*
|
||||
|
||||
**Short description**: *NonMaxSuppression* performs non maximum suppression of the boxes with predicted scores.
|
||||
|
||||
**Detailed description**: *NonMaxSuppression* performs non maximum suppression algorithm as described below:
|
||||
|
||||
1. Let `B = [b_0,...,b_n]` be the list of initial detection boxes, `S = [s_0,...,s_N]` be the list of corresponding scores.
|
||||
2. Let `D = []` be an initial collection of resulting boxes.
|
||||
3. If `B` is empty then go to step 8.
|
||||
4. Take the box with highest score. Suppose that it is the box `b` with the score `s`.
|
||||
5. Delete `b` from `B`.
|
||||
6. If the score `s` is greater or equal than `score_threshold` then add `b` to `D` else go to step 8.
|
||||
7. For each input box `b_i` from `B` and the corresponding score `s_i`, set `s_i = s_i * func(IOU(b_i, b))` and go to step 3.
|
||||
8. Return `D`, a collection of the corresponding scores `S`, and the number of elements in `D`.
|
||||
|
||||
Here `func(iou) = 1 if iou <= iou_threshold else 0` when `soft_nms_sigma == 0`, else `func(iou) = exp(-0.5 * iou * iou / soft_nms_sigma)`.
|
||||
|
||||
This algorithm is applied independently to each class of each batch element. The total number of output boxes for each
|
||||
class must not exceed `max_output_boxes_per_class`.
|
||||
|
||||
**Attributes**:
|
||||
|
||||
* *box_encoding*
|
||||
|
||||
* **Description**: *box_encoding* specifies the format of boxes data encoding.
|
||||
* **Range of values**: "corner" or "center"
|
||||
* *corner* - the box data is supplied as `[y1, x1, y2, x2]` where `(y1, x1)` and `(y2, x2)` are the coordinates of any diagonal pair of box corners.
|
||||
* *center* - the box data is supplied as `[x_center, y_center, width, height]`.
|
||||
* **Type**: string
|
||||
* **Default value**: "corner"
|
||||
* **Required**: *no*
|
||||
|
||||
* *sort_result_descending*
|
||||
|
||||
* **Description**: *sort_result_descending* is a flag that specifies whenever it is necessary to sort selected boxes across batches or not.
|
||||
* **Range of values**: true of false
|
||||
* *true* - sort selected boxes across batches.
|
||||
* *false* - do not sort selected boxes across batches (boxes are sorted per class).
|
||||
* **Type**: boolean
|
||||
* **Default value**: true
|
||||
* **Required**: *no*
|
||||
|
||||
* *output_type*
|
||||
|
||||
* **Description**: the output tensor type
|
||||
* **Range of values**: "i64" or "i32"
|
||||
* **Type**: string
|
||||
* **Default value**: "i64"
|
||||
* **Required**: *no*
|
||||
|
||||
**Inputs**:
|
||||
|
||||
* **1**: `boxes` - tensor of type *T* and shape `[num_batches, num_boxes, 4]` with box coordinates. **Required.**
|
||||
|
||||
* **2**: `scores` - tensor of type *T* and shape `[num_batches, num_classes, num_boxes]` with box scores. **Required.**
|
||||
|
||||
* **3**: `max_output_boxes_per_class` - scalar or 1D tensor with 1 element of type *T_MAX_BOXES* specifying maximum number of boxes to be selected per class. Optional with default value 0 meaning select no boxes.
|
||||
|
||||
* **4**: `iou_threshold` - scalar or 1D tensor with 1 element of type *T_THRESHOLDS* specifying intersection over union threshold. Optional with default value 0 meaning keep all boxes.
|
||||
|
||||
* **5**: `score_threshold` - scalar or 1D tensor with 1 element of type *T_THRESHOLDS* specifying minimum score to consider box for the processing. Optional with default value 0.
|
||||
|
||||
* **6**: `soft_nms_sigma` - scalar or 1D tensor with 1 element of type *T_THRESHOLDS* specifying the sigma parameter for Soft-NMS; see [Bodla et al](https://arxiv.org/abs/1704.04503.pdf). Optional with default value 0.
|
||||
|
||||
**Outputs**:
|
||||
|
||||
* **1**: `selected_indices` - tensor of type *output_type* and shape `[number of selected boxes, 3]` containing information about selected boxes as triplets `[batch_index, class_index, box_index]`.
|
||||
|
||||
* **2**: `selected_scores` - tensor of type *T_THRESHOLDS* and shape `[number of selected boxes, 3]` containing information about scores for each selected box as triplets `[batch_index, class_index, box_score]`.
|
||||
|
||||
* **3**: `valid_outputs` - 1D tensor with 1 element of type *output_type* representing the total number of selected boxes.
|
||||
|
||||
Plugins which do not support dynamic output tensors produce `selected_indices` and `selected_scores` tensors of shape `[min(num_boxes, max_output_boxes_per_class) * num_batches * num_classes, 3]` which is an upper bound for the number of possible selected boxes. Output tensor elements following the really selected boxes are filled with value -1.
|
||||
|
||||
**Types**
|
||||
|
||||
* *T*: floating-point type.
|
||||
|
||||
* *T_MAX_BOXES*: integer type.
|
||||
|
||||
* *T_THRESHOLDS*: floating-point type.
|
||||
|
||||
|
||||
**Example**
|
||||
|
||||
```xml
|
||||
<layer ... type="NonMaxSuppression" ... >
|
||||
<data box_encoding="corner" sort_result_descending="1" output_type="i64"/>
|
||||
<input>
|
||||
<port id="0">
|
||||
<dim>3</dim>
|
||||
<dim>100</dim>
|
||||
<dim>4</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"/>
|
||||
<port id="5"/>
|
||||
</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>
|
||||
```
|
||||
Reference in new issue
Block a user