Toybrick

标题: 输入一个batch数据,RKNN输出是对应的吗?(已解决) [打印本页]

作者: shopping    时间: 2019-10-22 14:40
标题: 输入一个batch数据,RKNN输出是对应的吗?(已解决)
本帖最后由 shopping 于 2019-10-23 16:35 编辑

问一下论坛里的各路大神及技术支持,官方说1.2版本RKNN支持输入一个batch,刚好我也有需要,所以写了一下:
  1. // Start Inference
  2.   rknn_input inputs[2];
  3.   rknn_output outputs[4];
  4.   rknn_tensor_attr outputs_attr[4];

  5.   int ret = 0;
  6.   rknn_context ctx = 0;

  7.   ret = rknn_init(&ctx, pmodel, model_len, RKNN_FLAG_PRIOR_MEDIUM);
  8.   if(ret < 0) {
  9.     printf("rknn_init fail! ret=%d\n", ret);
  10.     return;
  11.   }

  12.   for(int i = 0;i < 4;i++){
  13.       outputs_attr[i].index = i;
  14.       ret = rknn_query(ctx, RKNN_QUERY_OUTPUT_ATTR, &(outputs_attr[i]), sizeof(outputs_attr[i]));
  15.       if(ret < 0) {
  16.           printf("rknn_query fail! ret=%d\n", ret);
  17.           return;
  18.       }
  19.   }

  20.   if (thread_id > sizeof(multi_npu_process_initialized) / sizeof(int) - 1){
  21.       return;
  22.   }
  23.   multi_npu_process_initialized[thread_id] = 1;
  24.   printf("The initialization of NPU Process %d has been completed.\n", thread_id);

  25.   pair<Mat, Mat> pairIndexImage;
  26.   while (true) {
  27.       mtxQueueInput.lock();
  28.       if (queueInput.size() < 2) {
  29.           mtxQueueInput.unlock();
  30.           usleep(20000);
  31.       } else {
  32.               // Get an image from input queue
  33.           pairIndexImage = queueInput.front();  // the same time only allow one pthread operation to change the pairIndexImage .
  34.           queueInput.pop();
  35.           mtxQueueInput.unlock();
  36.       }

  37.       cv::resize(pairIndexImage.first, image_1, cv::Size(img_width, img_height), (0, 0), (0, 0), cv::INTER_LINEAR);
  38.       cv::resize(pairIndexImage.second, image_2, cv::Size(img_width, img_height), (0, 0), (0, 0), cv::INTER_LINEAR);

  39.       inputs[0].index = input_index;
  40.       inputs[0].buf = image_1.data;
  41.       inputs[0].size = img_width * img_height * img_channels;
  42.       inputs[0].pass_through = false;
  43.       inputs[0].type = RKNN_TENSOR_UINT8;
  44.       inputs[0].fmt = RKNN_TENSOR_NHWC;

  45.       inputs[1].index = input_index;
  46.       inputs[1].buf = image_2.data;
  47.       inputs[1].size = img_width * img_height * img_channels;
  48.       inputs[1].pass_through = false;
  49.       inputs[1].type = RKNN_TENSOR_UINT8;
  50.       inputs[1].fmt = RKNN_TENSOR_NHWC;
  51.       ret = rknn_inputs_set(ctx, 2, inputs);
  52.       if(ret < 0) {
  53.           printf("rknn_input_set fail! ret=%d\n", ret);
  54.           return;
  55.       }

  56.       ret = rknn_run(ctx, nullptr);
  57.       if(ret < 0) {
  58.           printf("rknn_run fail! ret=%d\n", ret);
  59.           return;
  60.       }

  61.       outputs[0].want_float = true;
  62.       outputs[0].is_prealloc = false;
  63.       outputs[1].want_float = true;
  64.       outputs[1].is_prealloc = false;

  65.       outputs[2].want_float = true;
  66.       outputs[2].is_prealloc = false;
  67.       outputs[3].want_float = true;
  68.       outputs[3].is_prealloc = false;

  69.       ret = rknn_outputs_get(ctx, 4, outputs, nullptr);
  70.       if(ret < 0) {
  71.           printf("rknn_outputs_get fail! ret=%d\n", ret);
  72.           return;
  73.       }
复制代码
关键是RKNN的输出吧,请问 inputs[0] 是与 outpus[0]、outpus[1]   ,  inputs[1] 是与 outpus[2]、outpus[3]  对应的吗?有需要我可以贴完整代码,方便各位帮忙。

作者: jefferyzhang    时间: 2019-10-23 09:18
理论上是对应的,你是发现了不对应的情况么?
作者: shopping    时间: 2019-10-23 09:59
还没来得及试,npu驱动版本不匹配,先问一下再说。
作者: yuys    时间: 2019-10-24 10:30
请问C/C++接口的教程或示例在哪里呀,我只看到python的接口
作者: shopping    时间: 2019-10-24 10:44
本帖最后由 shopping 于 2019-10-24 10:54 编辑
yuys 发表于 2019-10-24 10:30
请问C/C++接口的教程或示例在哪里呀,我只看到python的接口

你是说算法C++版本?如果是的话,你买板子,板子里没sample demo的吗?http://t.rock-chips.com/forum.php?mod=viewthread&tid=349  sample demo





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