Toybrick

楼主: troy

基于C语言 RKNN多线程框架

nopattern

注册会员

积分
162
发表于 2019-8-8 16:19:23 | 显示全部楼层
请教一下,和python 调用相比,能快多少?
回复

使用道具 举报

troy

版主

积分
2346
 楼主| 发表于 2019-9-5 11:54:34 | 显示全部楼层
代码上传至github仓库
回复

使用道具 举报

shopping

中级会员

积分
410
发表于 2019-9-16 15:03:05 | 显示全部楼层
这样说,我 mobilenet-ssd 提高至 30fps 有救了?
回复

使用道具 举报

Devin

中级会员

积分
452
发表于 2020-1-2 14:33:30 | 显示全部楼层
shopping 发表于 2019-9-16 15:03
这样说,我 mobilenet-ssd 提高至 30fps 有救了?

请问你实测多少帧啊,谢谢!
回复

使用道具 举报

shopping

中级会员

积分
410
发表于 2020-1-7 20:53:47 | 显示全部楼层
本帖最后由 shopping 于 2020-1-7 20:55 编辑
Devin 发表于 2020-1-2 14:33
请问你实测多少帧啊,谢谢!

如果是单路视频输入,30帧可以达到。因为我们领导要求的是双路视频流输入,目前测试时双路视频流数据处理,每路大概在10帧左右,我们是隔帧送数据入npu推理的。之前尝试过4个线程送数据给npu推理,发现直接卡住不动,3个线程也不行,两个线程才勉强能跑。
回复

使用道具 举报

Mr.Tang

中级会员

积分
236
发表于 2020-5-6 19:03:54 | 显示全部楼层
struct rknn_out_data {
        float *out[8];
};
有问题请教您,我不是很懂c,看到你这个代码,我想把我的rknn模型换上去,以为只改后处理就行了,但是post_process函数中的数组长度对不上,我的模型只有一个输出,float *predictions = (float *)out_data->out;我改成这样打印出的sizeof只有80,和我python输出的结果差很多
回复

使用道具 举报

troy

版主

积分
2346
 楼主| 发表于 2020-5-7 09:03:22 | 显示全部楼层
Mr.Tang 发表于 2020-5-6 19:03
struct rknn_out_data {
        float *out[8];
};

建议可以先把demo的逻辑先理一下。
框架部分,即common部分代码不需要改动,框架会去自动查询模型有几个输出,float *out[8];代表最多支持8个输出数组。out_data->out[0]存放的是第0个数组的指针(记住是数组指针,空间是由框架分配的),你的后处理的数据应该是
  1. float *predictions = (float *)out_data->out[0]
复制代码
才对!!!然后对predictions的内容打印出来跟Python对比即可。
回复

使用道具 举报

Mr.Tang

中级会员

积分
236
发表于 2020-5-7 09:37:40 | 显示全部楼层
本帖最后由 Mr.Tang 于 2020-5-7 11:48 编辑
troy 发表于 2020-5-7 09:03
建议可以先把demo的逻辑先理一下。
框架部分,即common部分代码不需要改动,框架会去自动查询模型有几个 ...

谢谢,还有问题需要请教在python中你们rknn的api输出的维度一般都是1*n,c输出的维度是怎样的格式,没有找到对应的文档说明。

我试着用下面的代码输出了,求和和python对比,现在的问题是这个n如何设置,我找了几个你们c的demo发现输出的output.size是python输出的4倍,你们的demo里好像是把n设置成python的+1这个地方有点疑问了?
float sum = 0;
for (int i = 0; i < n; ++i) {
        float value;
        value = predictions;
        sum += value;
//            printf("%f\n",value);
//            printf("%d\n",i);
        }
        printf("==================\n");
printf("run over, sum is %f\n",sum);
回复

使用道具 举报

troy

版主

积分
2346
 楼主| 发表于 2020-5-7 11:59:38 | 显示全部楼层
Mr.Tang 发表于 2020-5-7 09:37
谢谢,还有问题需要请教在python中你们rknn的api输出的维度一般都是1*n,c输出的维度是怎样的格式,没有找 ...

输出的维度是由模型决定的,需要自己去看模型的输出,这个框架,只把输出当成一维数组,具体如何解析是模型决定,而不是RKNN决定。
output.size只是表示buff的大小,并不是数组的个数。输出是4倍,应该是我这个框架指定了输出类型为float,主要是因为有些模型输出是float16的类型,而C语言中没有对应的数据类型,因此设置模型输出类型为float,占用的是8个字节,所以看到会有4倍的差距。
回复

使用道具 举报

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

本版积分规则

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


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