在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格式。
运行结果如下:
如果需要部署其他深度学习框架的网络,执行步骤基本类似。