Toybrick

标题: 同一个模型,python下模型初始化成果,c++下失败 [打印本页]

作者: liuliu    时间: 2019-7-10 21:59
标题: 同一个模型,python下模型初始化成果,c++下失败
同一个模型,python加载没有问题,使用c++去做init的时候出问题同一套c++代码,加载官方提供的mobilenet没有问题,加载这个模型出问题
c++代码如下
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include <stdlib.h>
  4. #include <fstream>
  5. #include <iostream>
  6. #include <algorithm>
  7. #include <queue>
  8. #include <sys/time.h>

  9. #include "rknn_api.h"
  10. #include "opencv2/core/core.hpp"
  11. #include "opencv2/imgproc/imgproc.hpp"
  12. #include "opencv2/highgui/highgui.hpp"

  13. using namespace std;

  14. int main(int argc, char** argv)
  15. {
  16.     const char *img_path = "../tmp/stand-06_13_02-01374.jpg";
  17.     const char *model_path = "../tmp/rensnet50.rknn";

  18.     const int output_elems = 2;

  19.     const int img_width = 224;
  20.     const int img_height = 224;
  21.     const int img_channels = 3;

  22.     const int input_index = 0;      // node name "input"  输入输出节点的索引??
  23.     const int output_index = 0;     // node name "MobilenetV1/Predictions/Reshape_1"

  24.     // Load image
  25.     cv::Mat img = cv::imread(img_path, 1);
  26.     if(!img.data) {
  27.         printf("cv::imread %s fail!\n", img_path);
  28.         return -1;
  29.     }
  30.     if(img.cols != img_width || img.rows != img_height)
  31.         cv::resize(img, img, cv::Size(img_width, img_height), (0, 0), (0, 0), cv::INTER_LINEAR);

  32.     //BGR->RGB
  33.     //cv::cvtColor(img, img, cv::COLOR_BGR2RGB);

  34.     // Load model
  35.     FILE *fp = fopen(model_path, "rb");
  36.     if(fp == NULL) {
  37.         printf("fopen %s fail!\n", model_path);
  38.         return -1;
  39.     }
  40.     fseek(fp, 0, SEEK_END);  //重定位流(数据流/文件)上的文件内部位置指针
  41.     int model_len = ftell(fp); //函数 ftell() 用于得到文件位置指针当前位置相对于文件首的偏移字节数
  42.     void *model = malloc(model_len);
  43.     fseek(fp, 0, SEEK_SET); //SEEK_SET开头-0,SEEK_CUR当前位置-1,SEEK_END结束-2
  44.     if(model_len != fread(model, 1, model_len, fp)) { //权重读到model中
  45.         printf("fread %s fail!\n", model_path);
  46.         free(model);
  47.         return -1;
  48.     }

  49.     // Start Inference
  50.     rknn_input inputs[1]; //输入结构体,index,buf:指向数据的指针,size,pass_through:数据是否需要转换,type:数据的类型,fmt:数据的格式
  51.     rknn_output outputs[1]; //want_float,is_prealloc,index,buf,size
  52.     rknn_tensor_attr output0_attr; //index,n_dims,dims,name,n_elems,size,fmt:NCHW-NHWC,type,qnt_type,f1,zp,scale

  53.     int ret = 0;
  54.     rknn_context ctx = 0; //模型的对象?

  55.     ret = rknn_init(&ctx, model, model_len, RKNN_FLAG_PRIOR_MEDIUM | RKNN_FLAG_COLLECT_PERF_MASK); //中优先级,打开测试开关
  56.     if(ret < 0) {
  57.         printf("rknn_init fail! ret=%d\n", ret);
  58.         goto Error;
  59.     }

  60.     output0_attr.index = 0; //设置
  61.     ret = rknn_query(ctx, RKNN_QUERY_OUTPUT_ATTR, &output0_attr, sizeof(output0_attr)); //查询ctx对象输出属性
  62.     if(ret < 0) {
  63.         printf("rknn_query fail! ret=%d\n", ret);
  64.         goto Error;
  65.     }

  66.     inputs[0].index = input_index; //这个索引搞得不是很清楚
  67.     inputs[0].buf = img.data; //装载数据
  68.     inputs[0].size = img_width * img_height * img_channels; //占内存大小
  69.     inputs[0].pass_through = false;
  70.     inputs[0].type = RKNN_TENSOR_UINT8;
  71.     inputs[0].fmt = RKNN_TENSOR_NHWC;
  72.     ret = rknn_inputs_set(ctx, 1, inputs); //对象,输入的个数,输入的数组
  73.     if(ret < 0) {
  74.         printf("rknn_input_set fail! ret=%d\n", ret);
  75.         goto Error;
  76.     }

  77.     ret = rknn_run(ctx, nullptr);
  78.     if(ret < 0) {
  79.         printf("rknn_run fail! ret=%d\n", ret);
  80.         goto Error;
  81.     }

  82.     outputs[0].want_float = true;
  83.     outputs[0].is_prealloc = false;
  84.     ret = rknn_outputs_get(ctx, 1, outputs, nullptr); //从ctx中将output取出
  85.     if(ret < 0) {
  86.         printf("rknn_outputs_get fail! ret=%d\n", ret);
  87.         goto Error;
  88.     }

  89.     // Process output
  90.     if(outputs[0].size == output0_attr.n_elems * sizeof(float))
  91.     {

  92.         for(int i = 0;i <output0_attr.n_elems;i++){
  93.             std::cout << "outputs " << i << " : " << ((float*)outputs[0].buf)[i] << std::endl;
  94.         }
  95.         std::cout << "outputs[0].size : "  << outputs[0].size << std::endl;
  96.         std::cout << "outputs0_attr.n_elems : "  <<  output0_attr.n_elems << std::endl;
  97.     }
  98.     else
  99.     {
  100.         printf("rknn_outputs_get fail! get output_size = [%d], but expect %u!\n",
  101.                outputs[0].size, (uint32_t)(output0_attr.n_elems * sizeof(float)));
  102.     }

  103.     rknn_outputs_release(ctx, 1, outputs);

  104.     Error:
  105.     if(ctx > 0)         rknn_destroy(ctx);
  106.     if(model)           free(model);
  107.     if(fp)              fclose(fp);
  108.     return 0;
  109. }
复制代码
报错
[toybrick@localhost build]$ ./resnet50
rknn_init fail! ret=-6

查看库版本
[toybrick@localhost tmp]$  rpm -aq rknn-api npuservice
npuservice-1.0.3-1.rockchip.fc28.aarch64
rknn-api-0.9.5-2.rockchip.fc28.aarch64

根据这个帖子http://t.rock-chips.com/forum.php?mod=viewthread&tid=445&highlight=rknn%5C_init%2Bfail%21%2Bret%3D-6
[toybrick@localhost tmp]$ sudo dnf clean all
0 files removed
[toybrick@localhost tmp]$ sudo dnf update -y
Error: Failed to synchronize cache for repo 'fedora-modular'

更新报错,这个错误解决不了
模型是我在keras上训练得到的.h5,转成了pb文件,在转成.rknn文件,模型在python接口是没有问题的,c++就出错
为什么呢
请大神回答

作者: zhangzj    时间: 2019-7-15 09:04
链接开发板的rknn_api.so,不要链接代码里面自带的rknn_api.so,可能会有匹配问题。




欢迎光临 Toybrick (https://t.rock-chips.com/) Powered by Discuz! X3.3