关于NanoTrack在RK3588平台的C++实现的问题

您好,向您请教关于NanoTrack在RK3588平台的C++实现出现的问题。我参考NanoTrack原作者的C++代码和您使用libtorch的代码写了使用rknn模型的代码,但是在解析输出的结果时出现问题预测的目标框位置差距很大而且从第二帧开始预测框就不对了,想询问解决的办法!可以有偿~

rknn_input zf_xf[2];
    memset(zf_xf, 0, sizeof(zf_xf));
    zf_xf[0].index = 0;
    zf_xf[0].size = zf[0].size;
    zf_xf[0].pass_through = 0;   
    zf_xf[0].type = RKNN_TENSOR_FLOAT32;
    zf_xf[0].fmt = RKNN_TENSOR_NHWC;
    zf_xf[0].buf = zf[0].buf;

    zf_xf[1].index = 1;
    zf_xf[1].size = xf[0].size;
    zf_xf[1].pass_through = 0;
    zf_xf[1].type = RKNN_TENSOR_FLOAT32;
    zf_xf[1].fmt = RKNN_TENSOR_NHWC;
    zf_xf[1].buf = xf[0].buf;
    
    rknn_inputs_set(net_head, 2, zf_xf);

    rknn_run(net_head, NULL);

    rknn_output outputs[2];
    memset(outputs, 0, sizeof(outputs));
    for (auto & output : outputs) {
        output.want_float = 1;
        output.is_prealloc = 0;
    }
    rknn_outputs_get(net_head, 2, outputs, NULL);

    std::vector<float> cls_score_sigmoid;


    float* cls_score_data = (float*)outputs[0].buf;
    //print_rknn(cls_score_data, "cls_score_rknn_cpp.txt");
    float* bbox_pred_data = (float*)outputs[1].buf;
    print_rknn(bbox_pred_data, "bbox_pred_rknn_cpp.txt");            
    /* debug */

    cls_score_sigmoid.clear();

    int cols = cfg.score_size;
    int rows = cfg.score_size;

    for (int i = 0; i < cols*rows; i++)   //16x16
    {        
        cls_score_sigmoid.push_back(sigmoid(cls_score_data[i]));
    }

    std::vector<float> pred_x1(cols*rows, 0), pred_y1(cols*rows, 0), pred_x2(cols*rows, 0), pred_y2(cols*rows, 0);

    float* bbox_pred_data1 = (float*)outputs[1].buf;
    float* bbox_pred_data2 = (float*)outputs[1].buf + cols*rows;
    float* bbox_pred_data3 = (float*)outputs[1].buf + 2*cols*rows;
    float* bbox_pred_data4 = (float*)outputs[1].buf + 3*cols*rows;
    
    for (int i=0; ifor (int j=0; j[i*cols + j] = this->grid_to_search_x[i*cols + j] - bbox_pred_data1[i*cols + j];
            pred_y1[i*cols + j] = this->grid_to_search_y[i*cols + j] - bbox_pred_data2[i*cols + j];
            pred_x2[i*cols + j] = this->grid_to_search_x[i*cols + j] + bbox_pred_data3[i*cols + j];
            pred_y2[i*cols + j] = this->grid_to_search_y[i*cols + j] + bbox_pred_data4[i*cols + j];
        }
    }

上面是使用rknn的C api的格式设置好的输入输出

你把他那个连接发给我看看

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:

您好,根据您提供的代码,目标框位置差距很大的问题可能是由于以下原因导致的:

1. 模型输出格式不正确:在您的代码中,您使用了 `rknn_outputs_get` 函数来获取模型输出,但您并没有指定输出张量的格式和大小,这可能导致输出张量的格式与您期望的不同。您需要确保输出张量的格式和大小与您期望的相同。
2. 解析输出数据的方式不正确:在您的代码中,您使用了四个指针来获取预测框的位置信息,但是您并没有检查这些指针是否正确地指向了输出张量的不同部分。您需要检查这些指针的值是否正确,并确保它们指向了正确的输出数据。
3. 输入数据不正确:在您的代码中,您将输入数据设置为两个张量,但您没有说明这些张量的大小和格式。您需要确保输入张量的大小和格式与您的模型期望的相同。
4. 程序逻辑错误:在您的代码中,可能存在一些逻辑错误,导致预测结果不正确。您需要仔细检查代码逻辑,确保每个部分都正确。

针对以上问题,您可以尝试以下解决方法:

1. 在使用 `rknn_outputs_get` 函数获取输出数据之前,您可以使用 `rknn_query` 函数查询输出张量的格式和大小,并根据查询结果来设置输出张量的格式和大小。
2. 您可以使用 `outputs[1].size` 来获取输出张量的大小,并根据输出张量的大小来计算指针的偏移量,从而获取预测框的位置信息。
3. 您需要确保输入张量的大小和格式与您的模型期望的相同。您可以使用 `rknn_query` 函数查询输入张量的格式和大小,并根据查询结果来设置输入张量的格式和大小。
4. 您需要仔细检查代码逻辑,并确保每个部分都正确。

希望这些提示对您有所帮助。如果您需要更多帮助,请提供更多的代码和错误信息,以便更好地帮助您。

如果以上回答对您有所帮助,点击一下采纳该答案~谢谢