深度學習有多厲害,就業前景有多開闊,我想每個學習計算機的人都能有所體會。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支持的深度學習框架。