背景: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");