# ROIPooling — MindSpore Signal+ 使用手册 alpha 文档

# ROIPooling

对输入特征图按指定 ROI (Region of Interest) 进行池化操作，将每个 ROI 区域划分为固定大小的池化单元，并取每个通道的最大值输出。

\[ \begin{align}\begin{aligned}\text{pooled\_height} = \left\lceil \frac{\text{roi\_end\_h} - \text{roi\_start\_h} + 1}{\text{pooled\_height}} \right\rceil\\\text{pooled\_width} = \left\lceil \frac{\text{roi\_end\_w} - \text{roi\_start\_w} + 1}{\text{pooled\_width}} \right\rceil\\\text{pooled\_output}[i,j,c] = \max_{h,w \in \text{bin}(i,j)} \text{input}[\text{roi\_start\_h}+h, \text{roi\_start\_w}+w, c]\end{aligned}\end{align} \]

其中:

- ( text{bin}(i,j) ) 表示第 (i) 行、第 (j) 列池化单元对应的输入特征图区域。

- (c) 表示通道索引。

输入：

  - in_ptr - 输入特征图地址。

  - input_n - 输入批大小。

  - input_h - 输入高度。

  - input_w - 输入宽度。

  - input_c - 输入通道数。

  - num_rois - ROI 数量。

  - scale - ROI 缩放因子。

  - pooled_height - 池化输出高度。

  - pooled_width - 池化输出宽度。

  - roi - ROI 坐标数组，格式为 [batch_index, x1, y1, x2, y2]。

  - core_mask - 核掩码（仅适用于共享存储版本）。

输出：

  - out_ptr - 池化输出地址。

  - max_c - 每通道最大值缓冲区，用于计算池化结果。

支持平台：

  `FT78NE` `MT7004`

备注

- FT78NE 支持fp, int8

- MT7004 支持hp, fp

共享存储版本:

void fp_roipooling_s(int input_n, int input_h, int input_w, int input_c, int num_rois, float scale, int pooled_height, int pooled_width, const float *in_ptr, float *out_ptr, const float *roi, float *max_c, int core_mask)

void hp_roipooling_s(int input_n, int input_h, int input_w, int input_c, int num_rois, float scale, int pooled_height, int pooled_width, const half *in_ptr, half *out_ptr, const half *roi, half *max_c, int core_mask)

void i8_roipooling_s(int input_n, int input_h, int input_w, int input_c, int num_rois, float scale, int pooled_height, int pooled_width, const int8_t *in_ptr, int8_t *out_ptr, const float *roi, int8_t *max_c, int core_mask)

C调用示例：

     1#include <stdio.h>
     2#include <roipooling.h>
     3
     4int main() {
     5    float *input = (float *)0xA0000000;    // 输入在DDR空间
     6    float *output = (float *)0xC0000000;
     7    float max_c[64];                        // 通道数假设为64
     8    float roi[10*5];                         // 10个ROI示例
     9    int num_rois = 10;
    10    int core_mask = 0xff;
    11
    12    fp_roipooling_s(1, 32, 32, 64, num_rois, 1.0f, 7, 7, input, output, roi, max_c, core_mask);
    13    return 0;
    14}

私有存储版本:

void fp_roipooling_p(int input_n, int input_h, int input_w, int input_c, int num_rois, float scale, int pooled_height, int pooled_width, const float *in_ptr, float *out_ptr, const float *roi, float *max_c)

void hp_roipooling_p(int input_n, int input_h, int input_w, int input_c, int num_rois, float scale, int pooled_height, int pooled_width, const half *in_ptr, half *out_ptr, const half *roi, half *max_c)

void i8_roipooling_p(int input_n, int input_h, int input_w, int input_c, int num_rois, float scale, int pooled_height, int pooled_width, const int8_t *in_ptr, int8_t *out_ptr, const float *roi, int8_t *max_c)

C调用示例：

     1#include <stdio.h>
     2#include <roipooling.h>
     3
     4int main() {
     5    float *input = (float *)0x10810000;    // 输入在L2空间
     6    float *output = (float *)0x10820000;
     7    float max_c[64];
     8    float roi[10*5];
     9    int num_rois = 10;
    10
    11    fp_roipooling_p(1, 32, 32, 64, num_rois, 1.0f, 7, 7, input, output, roi, max_c);
    12    return 0;
    13}