《腾讯NCNN框架的模型转换x86/君正MIPS嵌入式编译及量化推理》详细教程

1.在Ubuntu上编译运行ncnn

1)编译ncnn x86 linux

// ubuntu安装依赖
sudo apt install build-essential git cmake libprotobuf-dev protobuf-compiler libomp-dev libvulkan-dev vulkan-tools libopencv-dev
// 下载ncnn以及三方库
git clone https://github.com/Tencent/ncnn.git
git submodule update --init
// 编译
cd ncnn
mkdir -p build
cd build
cmake -DCMAKE_BUILD_TYPE=Release -DNCNN_VULKAN=ON -DNCNN_BUILD_EXAMPLES=ON ..
make -j$(nproc)

在这里插入图片描述

// 安装到install文件夹
make install prefix=./install

检查一下install文件夹里是不是生成了bin,include和lib
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2)测试ncnn x86 linux

上面我们编译的时候打开了-DNCNN_BUILD_EXAMPLES=ON,所以这里就用编译好的例子试一下,由于squeezenet提供了权重文件,所以直接测这个。
在这里插入图片描述
把权重文件复制到build/examples里
在这里插入图片描述
我们可以看一下squeezent.cpp里,ncnn需要加载.bin和.param模型文件,所以放到同一文件夹。
在这里插入图片描述
然后运行

cd build/examples
./squeezenet ../../images/256-ncnn.png

在这里插入图片描述
运行成功!

2. 模型转换

这里用pytorch onnx来举例子,简单的模型可以用ncnn编译好的bin来直接转换。

1)onnx

在这里插入图片描述

./onnx2ncnn a.onnx a.param a.bin

这边的param就是模型的结构描述文件,bin是模型的具体权重
如果不行尝试使用onnx-simplifier先处理一下模型

onnxsim a.onnx a_sim.onnx

然后再转换a_sim.onnx,这里不多赘述,自行尝试。

2)pnnx

如果我们直接从onnx转换到ncnn的模型经常会出现不兼容不能完全转换的情况,所以我们这边直接使用pnnx来进行模型转换。

PyTorch Neural Network eXchange
pnnx github
PyTorch Neural Network eXchange(PNNX) is an open standard for PyTorch model interoperability. PNNX provides an open model format for PyTorch. It defines computation graph as well as high level operators strictly matches PyTorch.

我们以efficientnet为例
链接: https://github.com/lukemelas/EfficientNet-PyTorch

import torch
from torchsummary import summary
from efficientnet_pytorch import EfficientNet

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

# 初始化模型
model = EfficientNet.from_pretrained('efficientnet-b0', advprop=True, num_classes=10)
model.to(device)
# 加载训练好的权重
params_dict = torch.load(r"best.pth")
# 如果训练的时候是多卡使用DataParallel来训的需要用.module.state_dict()得到权重dict
model.load_state_dict(params_dict.module.state_dict())

summary(model, (3, 416, 416))
# efficientnet训练时候用了memory efficient swish激活,导出的时候换成普通swich提高兼容性
model.set_swish(memory_efficient=False)
# model_pt = torch.save(model_pt)

model.eval()

dummy_in = torch.randn(1, 3, 416, 416, requires_grad=True).to(device)
# 导出torchscript权重
mod 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值