Toybrick

C++版的API不如python版的

candela4rk

注册会员

积分
91
楼主
发表于 2020-6-2 10:40:28    查看: 9304|回复: 4 | [复制链接]    打印 | 只看该作者
我用相同的yolov3模型和相同的阈值0.5,得到的结果C++版的不如python版的:有差不多4%的图片,C++有更多的漏检和误检。
我分析了一幅漏检了棒球的图发现,C++得到的概率是0.14,python是0.52,这是为什么?
回复

使用道具 举报

jefferyzhang

版主

积分
13580
沙发
发表于 2020-6-2 11:45:09 | 只看该作者
1. python最终调用的就是c的api
2. c api更灵活,有更多的参数需要设置,你的问题9成是因为哪里没配置,用了默认值送了进去而已。
3. c api核对下输入输出的node type, 通道顺序之类的。
4. 核对c api版本是不是和NPU驱动匹配,python的自带一套c api,但你的c api就不一定是用的哪个版本了
回复

使用道具 举报

candela4rk

注册会员

积分
91
板凳
 楼主| 发表于 2020-6-2 16:22:23 | 只看该作者
jefferyzhang 发表于 2020-6-2 11:45
1. python最终调用的就是c的api
2. c api更灵活,有更多的参数需要设置,你的问题9成是因为哪里没配置,用 ...
  1. rknn_input_output_num io_num;
  2.     ret = rknn_query(ctx, RKNN_QUERY_IN_OUT_NUM, &io_num, sizeof(io_num));
  3.     cout << io_num.n_input << endl;
  4.     cout << io_num.n_output << endl;
  5.     rknn_tensor_attr input_attrs[io_num.n_input];
  6.     memset(input_attrs, 0, sizeof(input_attrs));
  7.     cout << "INPUT : \n";
  8.     for (int i = 0; i < io_num.n_input; i++) {
  9.         input_attrs[i].index = i;
  10.         ret = rknn_query(ctx, RKNN_QUERY_INPUT_ATTR, &(input_attrs[i]),sizeof(rknn_tensor_attr));
  11.         cout << input_attrs[i].n_dims << "   " << input_attrs[i].n_elems << "  ";
  12.         for(int j = 0; j < input_attrs[i].n_dims; ++j) {
  13.             cout << input_attrs[i].dims[j] << "*";
  14.         }
  15.         if(input_attrs[i].fmt == RKNN_TENSOR_NCHW)
  16.             cout << "NCHW" << endl;
  17.         else if(input_attrs[i].fmt == RKNN_TENSOR_NHWC)
  18.             cout << "NHWC" << endl;
  19.     }
  20.     rknn_tensor_attr outputs_attr[io_num.n_output];
  21.     memset(outputs_attr, 0, sizeof(outputs_attr));
  22.     cout << "OUTPUT : \n";
  23.     for (int i = 0; i < io_num.n_output; ++i)
  24.     {
  25.         outputs_attr[i].index = i;
  26.         rknn_query(ctx, RKNN_QUERY_OUTPUT_ATTR, &(outputs_attr[i]), sizeof(outputs_attr[i]));
  27.         cout << outputs_attr[i].n_dims << "   " << outputs_attr[i].n_elems << endl;
  28.     }
复制代码

输出是:
1
3
INPUT :
4   150528  224*224*3*1*NCHW
OUTPUT :
4   12495
4   49980
4   199920
我的设置是
  1. // set input
  2.         rknn_input inputs[1];
  3.         memset(inputs, 0, sizeof(inputs));
  4.         inputs[0].index = 0;
  5.         inputs[0].buf = img.data;
  6.         inputs[0].size = image_size * image_size * 3;
  7.         inputs[0].pass_through = false;
  8.         inputs[0].type = RKNN_TENSOR_UINT8;
  9.         inputs[0].fmt = RKNN_TENSOR_NHWC;
  10.         ret = rknn_inputs_set(ctx, 1, inputs);
  11.         if (ret < 0)
  12.         {
  13.             printf("rknn_input_set fail! ret=%d\n", ret);
  14.             goto Error;
  15.         }
  16.         // get result
  17.         ret = rknn_run(ctx, nullptr);
  18.         if (ret < 0)
  19.         {
  20.             printf("rknn_run fail! ret=%d\n", ret);
  21.             goto Error;
  22.         }
  23.         rknn_output outputs[3];
  24.         memset(outputs, 0, sizeof(outputs));
  25.         outputs[0].want_float = true;
  26.         outputs[0].is_prealloc = false;
  27.         outputs[1].want_float = true;
  28.         outputs[1].is_prealloc = false;
  29.         outputs[2].want_float = true;
  30.         outputs[2].is_prealloc = false;
  31.         ret = rknn_outputs_get(ctx, 3, outputs, nullptr);
复制代码

有什么需要改的吗?还有其他参数需要配置吗?教程里就这些了。
inputs[0].fmt我设置成NCHW就什么也检测不出来了,所以 inputs[0].fmt和input_attrs.fmt没关系,和实际输入有关系?
回复

使用道具 举报

leok

版主

积分
894
地板
发表于 2020-6-2 17:23:14 | 只看该作者

可以这样尝试分析:
1、python和c预处理结果是否一致;
2、推理结果是否一致;
3、如果上述2个结果都一致的情况下,再去比对后处理;
回复

使用道具 举报

candela4rk

注册会员

积分
91
5#
 楼主| 发表于 2020-6-2 17:49:50 | 只看该作者
leok 发表于 2020-6-2 17:23
可以这样尝试分析:
1、python和c预处理结果是否一致;
2、推理结果是否一致;

1、推理前都只是读图片和转RGB
2、推理结果不一样,就说棒球那个,判断框有没有物体的置信度python是0.116,C++是  -0.348
回复

使用道具 举报

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

本版积分规则

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


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