RKNPUTools does not show tensor name

Dear all,

I am trying to port my ONNX model to RK1808 using RKNPUTools but faced one problem: I cannot get name of input/output tensor.

I created a simple APP to list input/output tensor attributes but tensor’s names are empty for sample models(ssd/modbilenet) and my model.

#include <stdint.h>
#include <stdlib.h>
#include <fstream>
#include <iostream>
#include <sys/time.h>

#include "rknn_api.h"

using namespace std;

void print_tensor_attr(const rknn_tensor_attr* attr) {
    printf("rknn_tensor_attr : {\n"
            "index: %u\n"
            "n_dims: %u\n", attr->index, attr->n_dims);
    printf("dims: {");
    for (uint32_t d = 0; d < attr->n_dims; d++) {
        printf("%u, ", attr->dims[d]);
    }
    printf("}\n");
    printf("name: %s\n"
            "n_elems: %u\n"
            "size: %u\n"
            "fmt: %s\n"
            "type: %s\n"
            "qnt_type: %s\n"
            "fl: %d\n"
            "zp: %u\n"
            "scale: %f\n"
            "}\n", attr->name, attr->n_elems, attr->size, attr->fmt == RKNN_TENSOR_NCHW ? "NCHW" : "NHWC",
            "Please Implement", "Please Implement", (int)(attr->fl), attr->zp, attr->scale);
}

int main(int argc, char** argv)
{
    if (argc != 2) {
        printf("Usage: this_app path-to-model\n");
        return -1;
    }
    const char *model_path = argv[1];
    // Load model
    FILE *fp = fopen(model_path, "rb");
    if(fp == NULL) {
        printf("fopen %s fail!\n", model_path);
        return -1;
    }
    fseek(fp, 0, SEEK_END);
    int model_len = ftell(fp);
    void *model = malloc(model_len);
    fseek(fp, 0, SEEK_SET);
    if(model_len != fread(model, 1, model_len, fp)) {
        printf("fread %s fail!\n", model_path);
        free(model);
        return -1;
    }

    // Start Inference
    rknn_input_output_num io_num;
    rknn_tensor_attr attr;

    int ret = 0;
    rknn_context ctx = 0;

    ret = rknn_init(&ctx, model, model_len, RKNN_FLAG_PRIOR_MEDIUM);
    if(ret < 0) {
        printf("rknn_init fail! ret=%d\n", ret);
        goto Error;
    }

    ret = rknn_query(ctx, RKNN_QUERY_IN_OUT_NUM, &io_num, sizeof(io_num));
    if(ret < 0) {
        printf("rknn_query RKNN_QUERY_IN_OUT_NUM fail! ret=%d\n", ret);
        goto Error;
    }

    for (uint32_t i = 0; i < io_num.n_input; i++) {
        attr.index = i;
        ret = rknn_query(ctx, RKNN_QUERY_INPUT_ATTR, &attr, sizeof(attr));
        if(ret < 0) {
            printf("rknn_query RKNN_QUERY_INPUT fail! ret=%d\n", ret);
            goto Error;
        }
        printf("%u-th input tensor\n", i);
        print_tensor_attr(&attr);
    }

    for (uint32_t i = 0; i < io_num.n_output; i++) {
        attr.index = i;
        ret = rknn_query(ctx, RKNN_QUERY_OUTPUT_ATTR, &attr, sizeof(attr));
        if(ret < 0) {
            printf("rknn_query RKNN_QUERY_OUTPUT fail! ret=%d\n", ret);
            goto Error;
        }
        printf("%u-th output tensor\n", i);
        print_tensor_attr(&attr);
    }

Error:
    if(ctx)             rknn_destroy(ctx);
    if(model)           free(model);
    if(fp)              fclose(fp);
    return 0;
}

The output for mobilenet is here:

[root@rk1808:/APP]# ./rknn_query_tensors ./tmp/mobilenet_v1-tf.rknn 
D RKNNAPI: ==============================================
D RKNNAPI: RKNN VERSION:
D RKNNAPI:   API: 1.3.0 (c5654ea build: 2019-12-25 14:12:00)
D RKNNAPI:   DRV: 1.3.1 (6ebb4d7 build: 2020-01-02 09:37:58)
D RKNNAPI: ==============================================
0-th input tensor
rknn_tensor_attr : {
index: 0
n_dims: 3
dims: {224, 224, 3, }
name: 
n_elems: 150528
size: 150528
fmt: NCHW
type: Please Implement
qnt_type: Please Implement
fl: 0
zp: 115
scale: 0.018317
}
0-th output tensor
rknn_tensor_attr : {
index: 0
n_dims: 1
dims: {1001, }
name: 
n_elems: 1001
size: 2002
fmt: NCHW
type: Please Implement
qnt_type: Please Implement
fl: 0
zp: 0
scale: 1.000000
}

Since my model have multiple inputs and outputs and some of them has the exactly same property except for name, I need the information.

Thank you for your corporation.