ncnn加载模型的几种方式
一、常用转换工具
在ncnn库编译完成后,在bin目录下有很多工具, 编译可参考ncnn编译与安装
- onnx2ncnn
利用ncnn库的./onnx2ncnn 工具进行转换
onnx2ncnn *.onnx *.param *.bin
转换时如果报以下错误提示 ,则利用onnxsim库先对onnx模型进行简化再转成ncnn
python -m onnxsim tooth.onnx tooth_sim.onnx
Shape not supported yet!
Gather not supported yet!
Unsupported unsqueeze axes !
Unknown data type 0
- ncnnoptimize
对ncnn模型中部分算子进行合并优化等,onnx的reshape和resize算子优化参考: https://zhuanlan.zhihu.com/p/93017149
ncnnoptimize *.param *.bin new.param new.bin flag
其中flag为0指fp32, 为1指fp16
- ncnn2mem
将ncnn模型中的可见字符去除,执行以下命令可生成*.param.bin 和两个静态数组的代码文件
ncnn2mem *.param *.bin *.id.h *.mem.h
- 合并param和bin文件
cat *.param.bin *.bin > *_all.bin
二、加载方式
-
原始param和bin
ncnn::Net net; net.load_param("*.param"); net.load_model("*.bin");
-
二进制param.bin和bin
ncnn::Net net; net.load_param_bin("*.param.bin"); net.load_model("*.bin");
-
加载数据模型
#include "*.mem.h" ncnn::Net net; net.load_param(*_param_bin); net.load_model(*_bin);
-
加载合并后bin
这种方式需要参考*.id.h更换输入输出为blobs对应的数字#include "net.h" FILE* fp = fopen("*-all.bin", "rb"); net.load_param_bin(fp); net.load_model(fp); fclose(fp);