天天看点

C++部署pytorch模型(中)

在C++部署pytorch模型(上)中我们已经将所有准备工作做好,今天开始利用opencv部署网络。

利用opencv加载训练好的模型和网络

参考链接:

OpenCV4.0 运行快速风格迁移(Torch)

opencv官方文档

OpenCV加载Pytorch模型出现Unsupported Lua type 解决方法

将模型从PYTORCH导出到ONNX并使用ONNX RUNTIME运行(官网链接)

这个方法算是一个比较常用的方法,而且可以用到许多深度学习框架上面:

根据opencv官方文档中的说明,可以支持以下框架:Caffe,Darknet,Onnx,Tensorflow,Torch等。但是很可惜,没有我用的pytoch,但是根据第三个参考链接中的方法,可以利用ONNX实现曲线救国。首先利用保存模型方法3所示的办法,将网络和参数保存为对应的格式。然后使用opencv提供的

Net cv::dnn::readNetFromONNX ( const String & onnxFile )

函数读取保存好的网络。代码实现如下:

//测试opencv加载pytorch模型
#include <opencv2/dnn.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
using namespace cv;
using namespace cv::dnn;
#include <fstream>
#include <iostream>
#include <cstdlib>
using namespace std;


int main()
{
	String modelFile = "./torch.onnx";
	String imageFile = "./dog.jpg";

	dnn::Net net = cv::dnn::readNetFromONNX(modelFile); //读取网络和参数
	
	Mat image = imread(imageFile); // 读取测试图片
	cv::cvtColor(image, image, cv::COLOR_BGR2RGB);
	Mat inputBolb = blobFromImage(image, 0.00390625f, Size(32, 32), Scalar(), false, false); //将图像转化为正确输入格式

	net.setInput(inputBolb); //输入图像

	Mat result = net.forward(); //前向计算

	cout << result << endl;
}


           

上述代码就是对第一个参考链接的代码进行了简化,且将输入网络的模型从torch改成ONNX格式。

运行结果如下:

如果需要部署其他深度学习框架的网络,执行步骤基本类似。

利用pytorch官方提供的LibTorch加载训练好的模型和网络

继续阅读