ROIPooling
=================



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

.. math::

    \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]

其中:

- \( \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``

.. note::
    - FT78NE 支持fp, int8
    - MT7004 支持hp, fp

**共享存储版本:**

.. c:function:: 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)
.. c:function:: 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)
.. c:function:: 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调用示例：**

.. code-block:: c
    :linenos:
    :emphasize-lines: 12

    #include <stdio.h>
    #include <roipooling.h>

    int main() {
        float *input = (float *)0xA0000000;    // 输入在DDR空间
        float *output = (float *)0xC0000000;
        float max_c[64];                        // 通道数假设为64
        float roi[10*5];                         // 10个ROI示例
        int num_rois = 10;
        int core_mask = 0xff;

        fp_roipooling_s(1, 32, 32, 64, num_rois, 1.0f, 7, 7, input, output, roi, max_c, core_mask);
        return 0;
    }


**私有存储版本:**

.. c:function:: 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)
.. c:function:: 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)
.. c:function:: 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调用示例：**

.. code-block:: c
    :linenos:
    :emphasize-lines: 11

    #include <stdio.h>
    #include <roipooling.h>

    int main() {
        float *input = (float *)0x10810000;    // 输入在L2空间
        float *output = (float *)0x10820000;
        float max_c[64];
        float roi[10*5];
        int num_rois = 10;

        fp_roipooling_p(1, 32, 32, 64, num_rois, 1.0f, 7, 7, input, output, roi, max_c);
        return 0;
    }
