关于ncnn使用多个模型的问题

背景:yolov5部署到android端之后,发现一个模型实现不了全部的功能,初期训练的和后面的标签不一致不过都是yolov5的,感觉可以合并下。这里主要讲述实现加载2个模型,在调用时候动态选择哪个模型

一:Init修改

1:重新定义一个网络

static ncnn::Net yolov51;

2:加载网络参数

yolov51.opt = opt;

3:注册

yolov51.register_custom_layer("YoloV5Focus", YoloV5Focus_layer_creator);

4:加载模型

yolov51.load_param(mgr, "yolov5.param");
yolov51.load_model(mgr, "yolov5.bin");

二:Detect修改(根据输入参数选择使用哪个模型)

1:添加参数

jstring whdetect

2:参数类型转换

const char* chardata = env->GetStringUTFChars(whdetect, 0);
// char* 转 string
std::string str = chardata;

3: 创建构造器

ncnn::Extractor ex1 = yolov51.create_extractor();

4:修改标签类别

static const char* class_names[8];
//通过参数判断使用哪个模型标签
if (str.compare("aaa")!=0)
{
    class_names[0]="1";
    class_names[1]="2";
    class_names[2]="3";
    class_names[3]="4";
    class_names[4]="5";
    class_names[5]="6";
    class_names[6]="7";
    class_names[7]="8";
} else
{
    class_names[0]="1";
    class_names[1]="2";
    class_names[2]="3";
    class_names[3]="4";
    class_names[4]="5";
}

5: 设置输入输出

if (str.compare("aaa")==0)
{
    ex1.set_vulkan_compute(use_gpu);

    ex1.input("images", in_pad);
}else
{
    ex.set_vulkan_compute(use_gpu);

    ex.input("images", in_pad);
}

if (str.compare("aaa")==0)
    ex1.extract("output", out);
else
    ex.extract("output", out);
if (str.compare("aaa")==0)
    ex1.extract("357", out);
else
    ex.extract("357", out);
if (str.compare("aaa")==0)
    ex1.extract("370", out);
else
    ex.extract("370", out);

三 :调用

boolean ret_init = yolov5ncnn.Init(getAssets());
yolov5ncnn.Detect(bitmap, false,"aaa");

猜你喜欢

转载自blog.csdn.net/GZ_public/article/details/127893839