Toybrick

關於 rknn-api 的問題

nijiwu

注册会员

积分
95
楼主
发表于 2020-4-5 19:11:12    查看: 8188|回复: 1 | [复制链接]    打印 | 只看该作者
本帖最后由 nijiwu 于 2020-4-5 19:12 编辑


為了做測試,我用TF build了一個XOR的model.pb,並且轉成model.rknn,用rknn-api run在Android上。有一個小問題想請問,從第二次開始rknn_run之後透過rknn_outputs_get取的的結果,都是上一次的input data的結果。init後第一次都很正常。是否會是哪裏我有疏忽或是理解錯誤??
Logat以及Sorce code如下.....

04-04 09:21:08.385 I/rkhello ( 7299): rknn_init success!
04-04 09:21:09.387 V/rkhello ( 7299): postDelayed
04-04 09:21:10.044 E/rkhello ( 7299): run_xor
04-04 09:21:10.044 E/rkhello ( 7299): rknn_inputs=0
04-04 09:21:10.045 E/rkhello ( 7299): rknn_inputs=0
04-04 09:21:10.045 E/rkhello ( 7299): rknn_input_set success! ret=0
04-04 09:21:10.045 E/rkhello ( 7299): rknn_run success! ret=0
04-04 09:21:10.053 E/rkhello ( 7299): rknn_outputs_get=0.010529
04-04 09:21:10.054 V/rkhello ( 7299): outputs 0 0:0.010528564
04-04 09:21:12.684 E/rkhello ( 7299): run_xor
04-04 09:21:12.684 E/rkhello ( 7299): rknn_inputs=0
04-04 09:21:12.684 E/rkhello ( 7299): rknn_inputs=1
04-04 09:21:12.684 E/rkhello ( 7299): rknn_input_set success! ret=0
04-04 09:21:12.684 E/rkhello ( 7299): rknn_run success! ret=0
04-04 09:21:12.684 E/rkhello ( 7299): rknn_outputs_get=0.010529
04-04 09:21:12.685 V/rkhello ( 7299): outputs 0 0:0.010528564
04-04 09:21:14.569 E/rkhello ( 7299): run_xor
04-04 09:21:14.569 E/rkhello ( 7299): rknn_inputs=0
04-04 09:21:14.569 E/rkhello ( 7299): rknn_inputs=1
04-04 09:21:14.569 E/rkhello ( 7299): rknn_input_set success! ret=0
04-04 09:21:14.569 E/rkhello ( 7299): rknn_run success! ret=0
04-04 09:21:14.569 E/rkhello ( 7299): rknn_outputs_get=0.995605
04-04 09:21:14.569 V/rkhello ( 7299): outputs 0 0:0.99560547

bool run_xor(char *inData, float *y0) {

    LOGE("run_xor");

    LOGE("rknn_inputs=%d\n", (char*)inData[0]);
    LOGE("rknn_inputs=%d\n", (char*)inData[1]);

    rknn_input inputs[1];
    inputs[0].index = input_index;
    inputs[0].buf = inData;
    inputs[0].size = 2;
    inputs[0].pass_through = false;
    inputs[0].type = RKNN_TENSOR_INT8;
    inputs[0].fmt = RKNN_TENSOR_NCHW;
    int ret = rknn_inputs_set(ctx, 1, inputs);
    if(ret < 0) {
        LOGE("rknn_input_set fail! ret=%d\n", ret);
        return false;
    }
    LOGE("rknn_input_set success! ret=%d\n", ret);

    ret = rknn_run(ctx, nullptr);
    if(ret < 0) {
        LOGE("rknn_run fail! ret=%d\n", ret);
        return false;
    }
    LOGE("rknn_run success! ret=%d\n", ret);

    rknn_output outputs[1];

    outputs[0].want_float = true;
    outputs[0].is_prealloc = true;
    outputs[0].index = output_index0;
    outputs[0].buf = y0;
    outputs[0].size = 1*sizeof(float);

    ret = rknn_outputs_get(ctx, 1, outputs, nullptr);
    if(ret < 0) {
        LOGE("rknn_outputs_get fail! ret=%d\n", ret);
        return false;
    }

    float* output = (float*)outputs[0].buf;
    LOGE("rknn_outputs_get=%f\n", *output);

    rknn_outputs_release(ctx, 1, outputs);

    return true;
}

回复

使用道具 举报

jefferyzhang

版主

积分
13580
沙发
发表于 2020-4-6 08:30:55 | 只看该作者
请查看api文档:3.1.1 rknn_init & rknn_init2, 因为默认是异步模式,返回的是上一帧结果。改为同步模式返回就是当前帧结果。

RKNN_FLAG_ASYNC_MASK:打开异步模式。打开之后,rknn_outputs_get 将不会阻塞
太久,因为它直接返回的上一帧的推理结果(第一帧的推理结果除外),这将显著提高 单线程模式下的推理帧率,但代价是 rknn_outputs_get 返回的不是当前帧的推理结果。 但当 rknn_run 和 rknn_outputs_get 不在同一个线程时,则无需打开该异步模式。


同步模式适合写多线程程序,异步模式方便用户写单线程程序。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

产品中心 购买渠道 开源社区 Wiki教程 资料下载 关于Toybrick


快速回复 返回顶部 返回列表