Toybrick

楼主: kyo055

RKNN前传报错

kyo055

注册会员

积分
87
11#
 楼主| 发表于 2020-6-12 10:30:40 | 只看该作者
leok 发表于 2020-6-10 08:48
上层python toolkit是开源的。
底层实现和芯片相关。

还是一样会报错,
  1. --> Export RKNN model
  2. done
  3. --> Init runtime environment
  4. W [set_chip_platform_env:187]evaluate model on RK1808
  5. W [op_optimize:333]Split copy 0 tensor.
  6. W [op_optimize:333]Split copy 0 tensor.
  7. W [op_optimize:333]Split copy 0 tensor.
  8. W [op_optimize:333]Split copy 0 tensor.
  9. W [op_optimize:333]Split copy 0 tensor.
  10. W [op_optimize:333]Split copy 0 tensor.
  11. W [op_optimize:333]Split copy 0 tensor.
  12. W [op_optimize:333]Split copy 0 tensor.
  13. W [op_optimize:333]Split copy 0 tensor.
  14. W [op_optimize:333]Split copy 0 tensor.
  15. W [op_optimize:333]Split copy 0 tensor.
  16. W [op_optimize:333]Split copy 0 tensor.
  17. W [op_optimize:333]Split copy 0 tensor.
  18. done
  19. --> Running model
  20. ASSERT in NeuralNet.cpp.decompressKernel(1889): readBias == 0
  21. terminate called after throwing an instance of 'bool'
  22. Aborted (core dumped)
复制代码
回复

使用道具 举报

kyo055

注册会员

积分
87
12#
 楼主| 发表于 2020-6-12 10:51:16 | 只看该作者
leok 发表于 2020-6-10 08:48
上层python toolkit是开源的。
底层实现和芯片相关。

你们这个Conv2d是不是不支持,groups,组卷积操作,对于BatchNorm,是完全支持的吗?还有就是Caffe的 ChannelShuffle操作,这个转换的时候是支持的,那仿真库是同样支持的吗
回复

使用道具 举报

leok

版主

积分
894
13#
发表于 2020-6-12 14:50:25 | 只看该作者
kyo055 发表于 2020-6-10 12:30
你好像只发布了 wheel文件, 但是在里面的转换规则 看不到哦,所以能不能给个转换规则或者C++的仿真库, ...

转换规则只是从一个格式转到另一个格式,对使用者来说意义不大。
回复

使用道具 举报

kyo055

注册会员

积分
87
14#
 楼主| 发表于 2020-6-12 16:45:50 | 只看该作者
leok 发表于 2020-6-12 14:50
转换规则只是从一个格式转到另一个格式,对使用者来说意义不大。

我看了一下  好像都支持 就是PC 仿真的时候 前传报错,纠结啊; 要是NPU不能够使用,就打算采用其他方案了。
回复

使用道具 举报

xsky

中级会员

积分
388
15#
发表于 2020-6-13 17:00:27 | 只看该作者
leok 发表于 2020-6-10 08:48
上层python toolkit是开源的。
底层实现和芯片相关。

toolkit 开源吗,在哪下?
回复

使用道具 举报

kyo055

注册会员

积分
87
16#
 楼主| 发表于 2020-7-8 17:10:13 | 只看该作者
leok 发表于 2020-6-12 14:50
转换规则只是从一个格式转到另一个格式,对使用者来说意义不大。

这会在板端调试啥信息都正确,但是结果全是0,是怎么回事呢?
  1. 2017-08-05 23:04:05.362 20048-20233/com.rockchip.gpadc.ssddemo E/rkssd4j: 查找的设备[0]: type=USB_DEVICE, id=0123456789ABCDEF
  2. 2017-08-05 23:04:09.608 20048-20233/com.rockchip.gpadc.ssddemo E/rkssd4j: model input num: 1, output num: 1
  3. 2017-08-05 23:04:26.675 20048-20233/com.rockchip.gpadc.ssddemo E/rkssd4j: model input[0] : , dim: 4, fmt: 0, type: 3, qnt_type: 2

  4. # 测试代码
  5. std::string lands_model_path = "/data/user/0/com.rockchip.gpadc.ssddemo/cache/shuffle-stage.rknn";
  6.     FILE *fp_lands = fopen(lands_model_path.c_str(), "rb");
  7.     if(fp_lands == NULL) {
  8.         LOGE("fopen %s fail!\n", lands_model_path.c_str());
  9.         return;
  10.     }
  11.     fseek(fp_lands, 0, SEEK_END);
  12.     int lands_model_len = ftell(fp_lands);
  13.     void *lands_model = malloc(lands_model_len);
  14.     fseek(fp_lands, 0, SEEK_SET);
  15.     if(lands_model_len != fread(lands_model, 1, lands_model_len, fp_lands)) {
  16.         LOGE("fread %s fail!\n", lands_model_path.c_str());
  17.         free(lands_model);
  18.         fclose(fp_lands);
  19.         return;
  20.     }

  21.     fclose(fp_lands);

  22.     // RKNN_FLAG_ASYNC_MASK: enable async mode to use NPU efficiently.
  23.     rknn_context lands_ctx = 0;
  24.     int lands_ret = rknn_init(&lands_ctx, lands_model, lands_model_len, RKNN_FLAG_PRIOR_HIGH);
  25.     free(lands_model);
  26.     if(lands_ret < 0) {
  27.         LOGE("rknn_init shuffle_stage landmarks fail! ret=%d\n", ret);
  28.         return;
  29.     }
  30.     // 查询sdk版本信息
  31.     rknn_sdk_version version;
  32.     lands_ret = rknn_query(lands_ctx, RKNN_QUERY_SDK_VERSION, &version,
  33.                      sizeof(rknn_sdk_version));
  34.     LOGE("api version: %s\n", version.api_version);
  35.     LOGE("driver version: %s\n", version.drv_version);

  36.     // 查找设备
  37.     rknn_devices_id devids;
  38.     ret = rknn_find_devices (&devids);
  39.     LOGE("查找设备: n_devices = %d\n", devids.n_devices);
  40.     for(int i=0; i<devids.n_devices; i++) {
  41.         LOGE("查找的设备[%d]: type=%s, id=%s\n", i, devids.types[i], devids.ids[i]);
  42.     }

  43.     // 查询输入Tensor的属性
  44.     rknn_input_output_num io_num;
  45.     ret = rknn_query(lands_ctx, RKNN_QUERY_IN_OUT_NUM, &io_num, sizeof(io_num));
  46.     if(ret < 0) {
  47.         LOGE("rknn_query fail! ret=%d\n", ret);
  48.     }
  49.     LOGE("model input num: %d, output num: %d\n", io_num.n_input, io_num.n_output);

  50.     // 查询Input的Tensor属性
  51.     rknn_tensor_attr input_attrs[io_num.n_input];
  52.     memset(input_attrs, 0, sizeof(input_attrs));
  53.     for (int i = 0; i < io_num.n_input; i++) {
  54.         input_attrs[i].index = i;
  55.         ret = rknn_query(lands_ctx, RKNN_QUERY_INPUT_ATTR, &(input_attrs[i]),
  56.                          sizeof(rknn_tensor_attr));
  57.         LOGE("model input[%d] : %s, dim: %d, fmt: %d, type: %d, qnt_type: %d \n", i, \
  58.         input_attrs[i].name, input_attrs[i].n_dims, input_attrs[i].fmt, input_attrs[i].type,\
  59.         input_attrs[i].qnt_type);
  60.         // 打印各维度值就是shape
  61.     }

  62.     // 查询Ouput的Tensor属性
  63.     rknn_tensor_attr output_attrs[io_num.n_output];
  64.     memset(output_attrs, 0, sizeof(output_attrs));
  65.     for (int i = 0; i < io_num.n_output; i++) {
  66.         output_attrs[i].index = i;
  67.         ret = rknn_query(lands_ctx, RKNN_QUERY_OUTPUT_ATTR, &(output_attrs[i]),
  68.                          sizeof(rknn_tensor_attr));
  69.         LOGE("model output[%d] : %s, dim: %d, fmt: %d, type: %d, qnt_type: %d \n", i, \
  70.         output_attrs[i].name, output_attrs[i].n_dims, output_attrs[i].fmt, output_attrs[i].type,\
  71.         output_attrs[i].qnt_type);
  72.     }

  73.     // 设置输入
  74.     /// 1. 读取图像作为BGR输入 112x112x3 NHWC格式
  75.     std::string lands_img_path = "/data/user/0/com.rockchip.gpadc.ssddemo/cache/npu_test_lands.png";
  76.     cv::Mat img = cv::imread(lands_img_path.c_str());
  77.     /// 2. 将图像传入RKNN_INPUT_TENSOR
  78.     rknn_input inputs[io_num.n_input];
  79.     memset(inputs, 0, sizeof(inputs));
  80.     for (uint32_t i = 0; i < io_num.n_input; i++){
  81.         inputs[i].index = i;
  82.         inputs[i].type = RKNN_TENSOR_UINT8;
  83.         inputs[i].size = (uint32_t)img.cols*img.rows*img.channels();
  84.         inputs[i].pass_through = (uint8_t)false;     // 非直通模式,将当前数据类型传递到模型中,并在模型内部转换;
  85.         inputs[i].fmt = RKNN_TENSOR_NHWC;
  86.         inputs[i].buf = img.data;
  87.     }
  88.     ret = rknn_inputs_set(lands_ctx, io_num.n_input, inputs);

  89.     // 运行rknn模型
  90.     ret = rknn_run(lands_ctx, NULL);
  91.     if(ret != RKNN_SUCC){
  92.         LOGE("rknn_run fail! ret=%d\n", ret);
  93.     }
  94.     // 获取rknn结果信息
  95.     rknn_output outputs[io_num.n_output];
  96.     memset(outputs, 0, sizeof(outputs));
  97.     for (int i = 0; i < io_num.n_output; i++) {
  98.         outputs[i].want_float = (uint8_t)true;
  99.         outputs[i].is_prealloc = (uint8_t)false;
  100.     }
  101.     ret = rknn_outputs_get(lands_ctx, io_num.n_output, outputs, NULL);

  102.     // 绘制人脸图像并保存人脸结果
  103.     float *pf_src = (float *)outputs[0].buf;
  104.     for (int i = 0; i < output_attrs[0].dims[2]; ++i) {
  105.         float x = pf_src[2*i];
  106.         float y = pf_src[2*i + 1];
  107.         float x_w = x * img.cols;
  108.         float y_h = y * img.rows;
  109.         cv::circle(img,cv::Point(x_w, y_h),2, cv::Scalar(0,0,255),1, 8);
  110.     }
  111.     std::string lands_img_out = "/data/user/0/com.rockchip.gpadc.ssddemo/cache/npu_res_lands.png";
  112.     cv::imwrite(lands_img_out.c_str(), img);

  113.     // 释放输出结果的内存
  114.     ret = rknn_outputs_release(lands_ctx, io_num.n_output, outputs);

  115.     // 释放模型
  116.     rknn_destroy(lands_ctx);
  117. 2017-08-05 23:04:26.675 20048-20233/com.rockchip.gpadc.ssddemo E/rkssd4j: model output[0] : , dim: 4, fmt: 0, type: 3, qnt_type: 2
复制代码


其中输出全是0,能分析一下 怎么回事吗?
回复

使用道具 举报

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

本版积分规则

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


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