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

# CropAndResize

从输入图像Tensor中提取切片并调整其大小。仅支持双线性插值方法。

输入：

  - src - 输入数据的地址。

  - box_idx - boxes的索引，box_idx[i]的值表示第i个框的图像的值。

  - boxes - 第i行表示box_index[i]图像区域的坐标，并且坐标[y1,x1,y2,x2]是归一化后的值。归一化后的坐标值y，映射到图像y*(image_height-1)处，因此归一化后的图像高度范围为[0,1]，映射到实际图像高度范围为[0,image_height-1]。我们允许y1>y2，在这种情况下，视为原始图像的上下翻转变换。宽度尺寸的处理类似。坐标取值允许在[0,1]范围之外，在这种情况下，我们使用extrapolation_value外插值进行补齐。

  - param - 算子计算所需参数的结构体。其各成员见下述。

  - extrapolation_value - 外插值。

  - core_mask - 核掩码。

CropAndResizeParameter定义：

     1typedef struct CropAndResizeParameter {
     2    int* input_shape_; // 输入张量形状
     3    int* output_shape_; // 输出张量形状
     4    int* x_lefts_; // 用于存储预处理结果
     5    int* x_rights_; // 用于存储预处理结果
     6    int* y_tops_; // 用于存储预处理结果
     7    int* y_bottoms_; // 用于存储预处理结果
     8    void* x_weights_; // 用于存储预处理结果
     9    void* y_weights_; // 用于存储预处理结果
    10    void* line_buffers_; // 用于存储中间结果
    11} CropAndResizeParameter;

输出：

  - output - 输出地址。

支持平台：

  `FT78NE` `MT7004`

备注

- FT78NE 支持int8, fp32

- MT7004 支持fp16, fp32

共享/私有存储版本:

void i8_crop_and_resize_anycore(int8_t *src, int8_t *dst, int *box_idx, float *boxes, CropAndResizeParameter *param, float extrapolation_value, int core_mask)

void hp_crop_and_resize_anycore(half *src, half *dst, int *box_idx, float *boxes, CropAndResizeParameter *param, float extrapolation_value, int core_mask)

void fp_crop_and_resize_anycore(float *src, float *dst, int *box_idx, float *boxes, CropAndResizeParameter *param, half extrapolation_value, int core_mask)

私有及共享空间版本均使用这些函数。

C调用示例：

     1void TestCropAndResizeSMCFp32(int* input_shape, int* output_shape, float* inp_boxes, int32_t* inp_box_idx, float extrapolation_value, int core_mask) {
     2    int core_id = get_core_id();
     3    int core_num = GetCoreNum(core_mask);
     4    int logic_core_id = GetLogicCoreId(core_mask, core_id);
     5    float* input = (float*)0x88000000; // 测试私有空间时地址设置在私有空间内即可
     6    float* output = (float*)0x89000000;
     7    float* boxes = (float*)0x8A000000;
     8    int* box_idx = (int*)0x8B000000;
     9    CropAndResizeParameter* param = (CropAndResizeParameter*)0x8C000000;
    10    if (logic_core_id == 0) {
    11        memcpy(boxes, inp_boxes, sizeof(float) * output_shape[0] * 4);
    12        memcpy(box_idx, inp_box_idx, sizeof(int) * output_shape[0]);
    13        param->input_shape_ = (int*)0x8D000000;
    14        memcpy(param->input_shape_, input_shape, sizeof(int) * 4);
    15        param->output_shape_ = (int*)0x8E000000;
    16        memcpy(param->output_shape_, output_shape, sizeof(int) * 4);
    17        param->line_buffers_ = (void*)0x8F000000;
    18        param->x_lefts_ = (int*)0x90000000;
    19        param->x_rights_ = (int*)0x91000000;
    20        param->y_bottoms_ = (int*)0x92000000;
    21        param->y_tops_ = (int*)0x93000000;
    22        param->x_weights_ = (void*)0x94000000;
    23        param->y_weights_ = (void*)0x95000000;
    24        PrepareCropAndResizeBilinear(param->input_shape_, boxes, param->output_shape_, param->y_bottoms_, param->y_tops_,
    25                                        param->x_lefts_, param->x_rights_, param->y_weights_, param->x_weights_); // 做预处理
    26    }
    27    sys_bar(0, core_num); // 初始化参数完成后进行同步
    28    fp_crop_and_resize_anycore(input, output, box_idx, boxes, param, extrapolation_value, core_mask);
    29}
    30
    31void main(){
    32    int input_shape[4] = {1, 4, 4, 4};
    33    int output_shape[4] = {1, 8, 8, 4};
    34    float boxes[4] = {0, 0, 0.5, 0.5};
    35    int box_idx[1] = {0};
    36    int core_mask = 0b1111; // 测试单核时核掩码设置为0b0001即可
    37    float extrapolation_value = 0.5;
    38    TestCropAndResizeSMCFp32(input_shape, output_shape, boxes, box_idx, extrapolation_value, core_mask);
    39}