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

# Priorbox

根据输入的特征图尺寸、步长和预设的候选框配置，逐元素计算先验框（Prior Boxes），通常用于目标检测模型。

该算子遍历特征图的每一个网格中心点，并围绕该中心点生成一系列具有不同尺寸和宽高比的候选框。生成的坐标 `[xmin, ymin, xmax, ymax]` 经过归一化处理。

输入：

  - fmap_h - 当前特征图的高度。

  - fmap_w - 当前特征图的宽度。

  - step_h - 计算先验框在原图上坐标时的垂直缩放比例。

  - step_w - 计算先验框在原图上坐标时的水平缩放比例。

  - offset - 中心点偏移量，通常为0.5，表示取网格的正中心。

  - min_sizes - 定义基础先验框尺寸的浮点数数组。

  - min_sizes_size - `min_sizes` 数组的长度。

  - max_sizes - 可选的浮点数数组，用于生成额外的正方形先验框。

  - max_sizes_size - `max_sizes` 数组的长度。

  - different_aspect_ratios - 定义不同宽高比的浮点数数组。

  - different_aspect_ratios_size - `different_aspect_ratios` 数组的长度。

  - core_mask - 核掩码 (仅共享存储版本需要)。

输出：

  - output - 用于存储最终生成的先验框坐标的数组。

  - output_size - 指向一个整数的指针，函数执行后，该整数将记录写入 `output` 数组的浮点数总数。

支持平台：

  `6678` `7004`

备注

- 6678支持fp32类型。

- 7004支持fp16和fp32类型。

共享存储版本:

int fp_priorbox_s(int fmap_h, int fmap_w, float step_h, float step_w, float offset, float *min_sizes, int min_sizes_size, float *max_sizes, int max_sizes_size, float *different_aspect_ratios, int different_aspect_ratios_size, float *output, int *output_size, int core_mask)

int hp_priorbox_s(int fmap_h, int fmap_w, half step_h, half step_w, half offset, half *min_sizes, int min_sizes_size, half *max_sizes, int max_sizes_size, half *different_aspect_ratios, int different_aspect_ratios_size, half *output, int *output_size, int core_mask)

C调用示例：

     1#include "priorbox.h"
     2
     3int main() {
     4    // DDR memory pointers
     5    float *min_sizes = (float *)0xA0000000;
     6    float *max_sizes = (float *)0xA0001000;
     7    float *ratios = (float *)0xA0002000;
     8    float *output = (float *)0xB0000000;
     9    int output_size = 0;
    10
    11    // Parameters
    12    int fmap_h = 19, fmap_w = 19;
    13    float step_h = 16.0f, step_w = 16.0f;
    14    float offset = 0.5f;
    15    int min_sizes_size = 1;
    16    int max_sizes_size = 1;
    17    int ratios_size = 2;
    18    int core_mask = 0xff;
    19
    20    // (假设 min_sizes, max_sizes, ratios 已在DDR中填充数据)
    21
    22    fp_priorbox_s(fmap_h, fmap_w, step_h, step_w, offset, min_sizes, min_sizes_size, max_sizes, max_sizes_size, ratios, ratios_size, output, &output_size, core_mask);
    23
    24    return 0;
    25}

私有存储版本:

int fp_priorbox_p(int fmap_h, int fmap_w, float step_h, float step_w, float offset, float *min_sizes, int min_sizes_size, float *max_sizes, int max_sizes_size, float *different_aspect_ratios, int different_aspect_ratios_size, float *output, int *output_size)

int hp_priorbox_p(int fmap_h, int fmap_w, half step_h, half step_w, half offset, half *min_sizes, int min_sizes_size, half *max_sizes, int max_sizes_size, half *different_aspect_ratios, int different_aspect_ratios_size, half *output, int *output_size)

C调用示例：

     1#include "priorbox.h"
     2
     3int main() {
     4    // L2 memory arrays
     5    float min_sizes_data[] = {30.0f};
     6    float max_sizes_data[] = {60.0f};
     7    float ratios_data[] = {2.0f, 0.5f};
     8    float output_data[4 * 19 * 19 * (1 + 1 + 2)]; // 足够大的空间
     9    int output_size = 0;
    10
    11    // Parameters
    12    int fmap_h = 19, fmap_w = 19;
    13    float step_h = 16.0f, step_w = 16.0f;
    14    float offset = 0.5f;
    15
    16    fp_priorbox_p(fmap_h, fmap_w, step_h, step_w, offset, min_sizes_data, 1, max_sizes_data, 1, ratios_data, 2, output_data, &output_size);
    17
    18    return 0;
    19}