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.