Toybrick

[C++ API] 如何使用rknn_init初始化多个模型

nevin007

注册会员

积分
127
发表于 2019-3-5 15:34:56    查看: 25412|回复: 24 | [复制链接]    打印 | 显示全部楼层
本帖最后由 nevin007 于 2019-3-7 17:39 编辑

rknn_init初始化模型时间长,当需要运行2个以上模型的时候,应该是将所有的模型统一做初始化。

但是我试着初始化两个rknn模型,使用C++API,定义两个context,运行时会报错:load model done.
rknn_init fail! ret=-6
即第一个模型可以初始化成功,第二个模型会初始化失败!
--------------------------------------------------------------------------------------------------------------

回复中有说使用Python_API可以同时初始化多个模型,我试了下确实可以,但是使用C++_API确实不行...
希望官方能确认下是使用的问题还是C++_API的问题,非常感谢!


回复

使用道具 举报

seedlin

注册会员

积分
54
发表于 2019-3-5 17:50:25 | 显示全部楼层
车牌识别的那个人写的就是2个模型同时运行的,你init必须是2个对象,你不会只创建一个rknn对象,然后init两次吧。
def load_model(modle_path):
        # Create RKNN object
        rknn = RKNN()

        print("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX")
        print('-->loading model')
        rknn.load_rknn(modle_path)
        print('loading model done')

        # init runtime environment
        print('--> Init runtime environment')
        ret = rknn.init_runtime()
        if ret != 0:
                print('Init runtime environment failed')
                exit(ret)
        print('done')
        print("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX")
        return rknn
回复

使用道具 举报

nevin007

注册会员

积分
127
 楼主| 发表于 2019-3-5 18:01:13 | 显示全部楼层
seedlin 发表于 2019-3-5 17:50
车牌识别的那个人写的就是2个模型同时运行的,你init必须是2个对象,你不会只创建一个rknn对象,然后init两 ...

我用的是c++的API,在init前好像只有加载rknn模型的操作
回复

使用道具 举报

elooon

注册会员

积分
139
发表于 2019-3-5 19:54:53 | 显示全部楼层
nevin007 发表于 2019-3-5 18:01
我用的是c++的API,在init前好像只有加载rknn模型的操作

你是只分配了一个rknn_context变量,然后对这个变量执行了两次init?
回复

使用道具 举报

nevin007

注册会员

积分
127
 楼主| 发表于 2019-3-6 09:57:55 | 显示全部楼层
elooon 发表于 2019-3-5 19:54
你是只分配了一个rknn_context变量,然后对这个变量执行了两次init?


int load_model(std::vector<const char *>& net,
                std::vector<rknn_context> &ctx)
{
    FILE *fp;
    int model_len=0;
    int ret = 0;
    rknn_context context=0;
    rknn_context context_2=0;

    // load rknn model1
    fp = fopen(net[0], "rb");
    if(fp == NULL) {
        printf("fopen %s fail!\n", net[0]);
        return -1;
    }
    fseek(fp, 0, SEEK_END);
    model_len = ftell(fp);               
    model_net_1 = malloc(model_len);         
    fseek(fp, 0, SEEK_SET);
    if(model_len != fread(model_net_1, 1, model_len, fp)) {
        printf("fread %s fail!\n", net[0]);
        free(model_net_1);
        return -1;
    }
    printf("model_len:%d\n",model_len);

    // rknn_init
    ret = rknn_init(&context, model_net_1, model_len, RKNN_FLAG_PRIOR_MEDIUM);                    
    if(ret < 0) {
        printf("rknn_init fail! ret=%d\n", ret);
        source_release(context, model_net_1);
        return -1;
    }
    ctx.push_back(context);
    printf("[debug] ctx[0]:%ld\n",context);
    fclose(fp);
    model_len = 0;


    // load rknn model2
    fp = fopen(net[1], "rb");
    if(fp == NULL) {
        printf("fopen %s fail!\n", net[1]);
        return -1;
    }
    fseek(fp, 0, SEEK_END);
    model_len = ftell(fp);               
    model_net_2 = malloc(model_len);         
    fseek(fp, 0, SEEK_SET);
    if(model_len != fread(model_net_2, 1, model_len, fp)) {
        printf("fread %s fail!\n", net[1]);
        free(model_net_2);
        return -1;
    }
    printf("model_len:%d\n",model_len);

    // rknn_init
    ret = rknn_init(&context_2, model_net_2, model_len, RKNN_FLAG_PRIOR_MEDIUM);                    
    if(ret < 0) {
        printf("rknn_init fail! ret=%d\n", ret);
        source_release(context_2, model_net_2);
        return -1;
    }
    ctx.push_back(context_2);
    printf("[debug] ctx[1]:%ld\n",context_2);
    fclose(fp);

    free(model_net_1);
    free(model_net_2);
    return 0;
}




我定义了2个context,运行后错误信息如下:
model_len:17347
[debug] ctx[0]:416131600
model_len:17350
rknn_init fail! ret=-6
ctx.size:1

只能注册一个模型...


回复

使用道具 举报

yhc

注册会员

积分
177
发表于 2019-3-6 10:25:28 | 显示全部楼层
请问单独初始化第二个模型可以吗
回复

使用道具 举报

nevin007

注册会员

积分
127
 楼主| 发表于 2019-3-6 10:30:45 | 显示全部楼层
yhc 发表于 2019-3-6 10:25
请问单独初始化第二个模型可以吗

可以的,单独运行上半部分或者下半部分都没有问题
回复

使用道具 举报

yhc

注册会员

积分
177
发表于 2019-3-6 10:51:35 | 显示全部楼层
-6是报RKNN_ERR_MODEL_INVALID,17350确定是第二个模型的大小是吗,有没有读错文件什么的呢
回复

使用道具 举报

nevin007

注册会员

积分
127
 楼主| 发表于 2019-3-6 11:39:46 | 显示全部楼层
本帖最后由 nevin007 于 2019-3-6 11:45 编辑
yhc 发表于 2019-3-6 10:51
-6是报RKNN_ERR_MODEL_INVALID,17350确定是第二个模型的大小是吗,有没有读错文件什么的呢 ...

是的,模型我都单独运行过,没有问题...不会是同时只能有一个ctx吧...
灰掉上半部分,初始化下半部分是正常的:
model_len:17350
[debug] ctx[1]:595593744
ctx.size:1

就是不能两个同时初始化...

回复

使用道具 举报

protossw512

中级会员

积分
252
发表于 2019-3-7 11:40:54 | 显示全部楼层
nevin007 发表于 2019-3-6 11:39
是的,模型我都单独运行过,没有问题...不会是同时只能有一个ctx吧...
灰掉上半部分,初始化下半部分是正 ...

你好,你在c++运行的时候有发现c++下面跑模型比python下面慢么?
回复

使用道具 举报

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

本版积分规则

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


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