天天看點

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加載訓練好的模型和網絡

繼續閱讀