opencv系列文章之使用dnn模塊調用tensorflow、Caffe和Torch/PyTorch深度學習模型

深度學習有多厲害,就業前景有多開闊,我想每個學習計算機的人都能有所體會。Caffe、Tensorflow、Pytorch、Keras、mxnet等等深度學習框架,給了深度學習開發人員極大的方便,但他們部署起來卻依舊較難!OpenCV自3.1版本其就在contrib中加入了DNN模塊。到3.3版本時,將DNN模塊由contrib提升到了正式代碼塊中。該DNN模塊支持加載訓練好的模型(即:這些模型需要實現在Caffe、TensorFlow、Torch/PyTorch等深度學習框架中提取訓練好),並執行前向傳播過程(即預測)。

本機硬件和軟件資源如下:

 

1.編譯帶有DNN模塊的opencv源碼

參考文章鏈接:https://blog.csdn.net/weixin_39928773/article/details/103709184

參考文章鏈接https://blog.csdn.net/mangobar/article/details/80459866

1.1 下載opencv和opencv_contrib源碼文件

opencv4.3地址:https://codeload.github.com/opencv/opencv/zip/4.3.0

opencv_contrib4.3地址:https://codeload.github.com/opencv/opencv_contrib/zip/4.3.0

1.2 使用cmake編譯gpu版本opencv

首先確認你裝了適合你電腦版本的cuda,cudnn等。

然後,在opencv的源碼根目錄下新建output文件夾,將opencv_contrib4.3放入其中。

然後使用cmake軟件進行編譯,設置如下,configure後選擇的你編譯後opencv的使用平臺。完成後如下圖所示(很多紅色)

然後添加OPENCV_EXTRA_MODULES_PATH的信息,這個路徑就是你下載的opencv_contrib源碼解壓後存放的文件夾中的modules文件夾路徑。我把它放到了output文件夾內,所以在CMake中的OPENCV_EXTRA_MODULES_PATH中就填寫D:/opencv-4.3.0/output/opencv_contrib-4.3.0。

注意事項:

1.搜索test,帶test的都不勾選。

2.搜索java,帶java的都不勾選。

 

2.準備深度學習算法模型文件

 

3.在opencv中導入模型並進行預測

3.1 導入caffe模型

參考使用文章鏈接:https://blog.csdn.net/zziahgf/article/details/90706693

#include <opencv2/dnn.hpp>
using namespace cv::dnn;

string protoFile = "D:\\qt5.12.0\\usrfile\\hand_reg\\caffe_models\\pose_deploy.prototxt";//caffe的模型基礎信息
string weightsFile = "D:\\qt5.12.0\\usrfile\\hand_reg\\caffe_models\\pose_iter_102000.caffemodel";//caffe的模型文件,後綴名caffemodel

Net net = readNetFromCaffe(protoFile, weightsFile);//caffe模型文件
Mat inpBlob = blobFromImage(frame, 1.0 / 255, Size(inWidth, inHeight), Scalar(0, 0, 0), false, false);//將圖片縮放爲模型訓練時的圖片大小
net.setInput(inpBlob);//將圖片輸入caffe模型
Mat output = net.forward();//進行caffe模型預測

3.2 導入tensorflow模型

參考鏈接:https://blog.csdn.net/hust_bochu_xuchao/article/details/79428759

tensorflow的ckpt文件轉pb文件參考文章鏈接:https://panjinquan.blog.csdn.net/article/details/82218092

#include <opencv2/dnn.hpp>
using namespace cv::dnn;

String weights = "nn.pb";//tensorflow的模型文件,後綴名pb,如果輸出的是ckpt文件,還需要轉爲pb文件
dnn::Net net = cv::dnn::readNetFromTensorflow(weights);//讀入tensorflow模型文件
Mat img = imread(files[i], 1);//準備模型輸入圖片
Mat inputBlob = dnn::blobFromImage(img, 0.00390625f, Size(256, 256), Scalar(), false,false); //將圖片縮放爲模型訓練時的圖片大小
net.setInput(inputBlob, "data");//將圖片輸入tensorflow模型
Mat pred = net.forward("fc2/prob");//進行tensorflow模型預測

 

4.參考資料

4.1 查看opencv支持的深度學習框架

鏈接:https://github.com/opencv/opencv/wiki/Deep-Learning-in-OpenCV

進入opencv的github頁面,點擊wiki。

點擊右側目錄欄的Deep Learning in opencv,即可看到當前opencv dnn支持的深度學習框架。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章