Toybrick

关于android ssd demo无法运行的问题【已解决】

zach

新手上路

积分
35
楼主
发表于 2022-6-9 10:48:05    查看: 2523|回复: 1 | [复制链接]    打印 | 只看该作者
本帖最后由 zach 于 2022-6-16 12:59 编辑

我使用下面的代码来加载模型
  1. void create(int inputSize, int channel, int numResult, int numClasses, char *mParamPath) {
  2.         img_width = inputSize;
  3.         img_height = inputSize;
  4.         img_channels = channel;

  5.         int ret = 0;
  6.         int model_len = 0;
  7.         unsigned char *model = nullptr;

  8.         // Load RKNN Model
  9.         LOGE("Loading model: %s", mParamPath);
  10.         model = load_model(mParamPath, &model_len);

  11.         LOGE("rknn_init ...");
  12.         ret = rknn_init(&ctx, model, model_len, 0, NULL);
  13.         if (ret < 0) {
  14.             LOGE("rknn_init fail! ret=%d\n", ret);
  15.             return;
  16.         }

  17.         // Get Model Input Output Info
  18.         ret = rknn_query(ctx, RKNN_QUERY_IN_OUT_NUM, &io_num, sizeof(io_num));
  19.         if (ret != RKNN_SUCC) {
  20.             LOGE("rknn_query fail! ret=%d\n", ret);
  21.             return;
  22.         }
  23.         LOGE("model input num: %d, output num: %d\n", io_num.n_input, io_num.n_output);

  24.         LOGE("input tensors:\n");
  25.         rknn_tensor_attr input_attrs[io_num.n_input];
  26.         memset(input_attrs, 0, sizeof(input_attrs));
  27.         for (int i = 0; i < io_num.n_input; i++) {
  28.             input_attrs[i].index = i;
  29.             ret = rknn_query(ctx, RKNN_QUERY_INPUT_ATTR, &(input_attrs[i]),
  30.                              sizeof(rknn_tensor_attr));
  31.             if (ret != RKNN_SUCC) {
  32.                 LOGE("rknn_query fail! ret=%d\n", ret);
  33.                 return;
  34.             }
  35.             printRKNNTensor(&(input_attrs[i]));
  36.         }

  37.         LOGE("output tensors:\n");
  38.         rknn_tensor_attr output_attrs[io_num.n_output];
  39.         memset(output_attrs, 0, sizeof(output_attrs));
  40.         for (int i = 0; i < io_num.n_output; i++) {
  41.             output_attrs[i].index = i;
  42.             ret = rknn_query(ctx, RKNN_QUERY_OUTPUT_ATTR, &(output_attrs[i]),
  43.                              sizeof(rknn_tensor_attr));
  44.             if (ret != RKNN_SUCC) {
  45.                 LOGE("rknn_query fail! ret=%d\n", ret);
  46.                 return;
  47.             }
  48.             printRKNNTensor(&(output_attrs[i]));
  49.         }

  50.         created = true;
  51.     }
复制代码



下面是报错信息
  1. 2021-09-16 22:44:12.122 2506-2560/com.rockchip.gpadc.ssddemo E/rkssd4j: Loading model: /data/user/0/com.rockchip.gpadc.ssddemo/cache/ssd_inception_v2.rknn
  2. 2021-09-16 22:44:12.183 2506-2560/com.rockchip.gpadc.ssddemo E/rkssd4j: rknn_init ...
  3. 2021-09-16 22:44:12.188 2506-2560/com.rockchip.gpadc.ssddemo E/RKNN_API: nnapi error: unable to open function ARKNN_destory_mem
  4. 2021-09-16 22:44:12.189 2506-2560/com.rockchip.gpadc.ssddemo E/RKNN_API: nnapi error: unable to open function ARKNN_create_mem
  5. 2021-09-16 22:44:12.189 2506-2560/com.rockchip.gpadc.ssddemo E/RKNN_API: nnapi error: unable to open function ARKNN_set_io_mem
  6. 2021-09-16 22:44:12.190 2506-2560/com.rockchip.gpadc.ssddemo E/neuralnetworks@ndk_bridge: ARKNN_client_create 0
  7. 2021-09-16 22:44:12.254 2506-2560/com.rockchip.gpadc.ssddemo E/neuralnetworks@ndk_bridge: Client init failed!
  8. 2021-09-16 22:44:12.254 2506-2560/com.rockchip.gpadc.ssddemo E/neuralnetworks@ndk_bridge: Ret Successfully!
  9. 2021-09-16 22:44:12.257 2506-2560/com.rockchip.gpadc.ssddemo E/rkssd4j: rknn_query fail! ret=-7
  10. 2021-09-16 22:44:12.257 2506-2560/com.rockchip.gpadc.ssddemo E/rkssd4j: run_ssd: create hasn't successful!
  11. 2021-09-16 22:44:12.259 2506-2560/com.rockchip.gpadc.ssddemo I/chatty: uid=10131(com.rockchip.gpadc.ssddemo) Thread-3 identical 1 line
  12. 2021-09-16 22:44:12.280 2506-2560/com.rockchip.gpadc.ssddemo E/rkssd4j: run_ssd: create hasn't successful!
复制代码
时间没有校准,请忽略时间。
so库我使用的是 <sdk>/rknpu2/Android/librknn_api/arm64_v8a中的 librknn_api_android.so和librknnrt.so  相关的头文件我也移植到了工程中。
模型使用的是  <sdk>/rknpu2/examples/rknn_ssd_demo/model/ssd_inception_v2.rknn


从日志看,程序卡在了rknn_query, 查看文档-7表示传入的rknn_context无效,然后我打印了context,看起来也是有值的
  1. E/rkssd4j: rknn_init ctx: 479969337520, model len: 32003278
复制代码

请问这个该如何解决?研究好几天了  非常感谢!



已解决: 需要增加编译选项:
ADD_DEFINITIONS(-DANDROID_PLATFORM=android-21 -DANDROID_NDK -DDISABLE_IMPORTGL -DANDROID_TOOLCHAIN=clang -DANDROID_STL=gnustl_static)




回复

使用道具 举报

zach

新手上路

积分
35
沙发
 楼主| 发表于 2022-6-9 11:31:52 | 只看该作者
本帖最后由 zach 于 2022-6-9 15:29 编辑

还有一点令我困惑的是 <sdk>\rknpu2\Android\librknn_api\arm64-v8a 目录下的 librknn_api.so 打开之后是一个文本文件, 直接使用demo工程编译,可以成功编译,也能正常运行, 这是为什么
回复

使用道具 举报

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

本版积分规则

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


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