在windows下使用ncnn部署加速神经网络(以resnet18为例)
首先需要部署NCNN的环境,这里具体看我上一篇博客保姆级在windows环境下部署NCNN环境,就不赘述了。
模型转换
之后我们需要加载pytorch模型并转换为onnx文件,需要python环境下安装pytorch和onnx.
我这里直接使用torchvision来加载模型来演示。
import torch
from torchvision import models
import onnx
device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
print('device', device)
#这里是选择cpu和gpu
model = models.resnet18(pretrained=True)
model = model.eval().to(device)
#将模型的验证加载到device上,注意这里的model是带参数的
#设置一个随机输入
x = torch.randn(1, 3, 256, 256).to(device)
#开始转换
with torch.no_grad():
torch.onnx.export(
model, # 要转换的模型
x, # 模型的任意一组输入
'resnet18_imagenet.onnx', # 导出的 ONNX 文件名
opset_version=11, # ONNX 算子集版本
input_names=['input'], # 输入 Tensor 的名称(自己起名字)
output_names=['output'] # 输出 Tensor 的名称(自己起名字)
)
# 读取 ONNX 模型
onnx_model = onnx.load('resnet18_imagenet.onnx')
# 检查模型格式是否正确
if not onnx.checker.check_model(onnx_model)
print('onnx模型成功加载!')
#打印计算图,可视化
print(onnx.helper.printable_graph(onnx_model.graph))
转换后的onnx文件其实还不够简化,还需要进一步精简,需要用到python的onnxsim
from onnxsim import simplify
import onnx
input_path = "resnet18_imagenet.onnx"#你自己的模型文件
output_path = "resnet18_imagenet_sim.onnx"#精简后的文件保存路径
onnx_model = onnx.load(input_path) # load onnx model
model_simp, check = simplify(onnx_model)
assert check, "Simplified ONNX model could not be validated"
onnx.save(model_simp, output_path)
print('finished exporting onnx')
这样子就得到了精简后的onnx文件:resnet18_imagenet_sim.onnx
之后打开ncnn的转换工具,具体路径在编译完的ncnn工程目录下的\install\bin下,其实可以单独吧这个文件夹下的exe都复制到另外一个文件夹,制作成ncnn转换工具,就像我这样子。
之后把转换后的resnet18_imagenet_sim.onnx复制到该文件夹下,启动cmd,运行
onnx2ncnn.exe resnet18_imagenet_sim.onnx resnet18_imagenet_sim.param resnet18_imagenet_sim.bin
对ncnn文件进行二进制加密和转换成.h文件
ncnn2mem.exe resnet18_imagenet_sim.param resnet18_imagenet_sim.bin resnet18_imagenet_sim.id.h resnet18_imagenet_sim.mem.h
运行之后文件夹下会多出resnet18_imagenet_sim.id.h resnet18_imagenet_sim.mem.h和resnet18_imagenet_sim.param.bin文件
运行demo
打开visual studio,新建一个空项目,加载之前配置好的项目属性表
记得得在这个Release|x64下面导入,并且这个编译选项也保持一致:
引入两个上面生成的resnet18_imagenet_sim.id.h,resnet18_imagenet_sim.bin和resnet18_imagenet_sim.param.bin文件,新建源文件,
打开下面链接,复制yanye_color_all_score_ncnn.cpp到自己的源文件
teach_all/yanye_color_all_score_ncnn.cpp at main · stupid-boy-me/teach_all · GitHub
修改一下那些加载文件啊和头文件,之后运行编译,有下面的界面就基本部署在pc上部署成功了。
预告一下,下一篇博客树莓派下部署NCNN我将讲述如何在树莓派上编译ncnn并部署resnet18。