opencv:Load Caffe framework models

来源:互联网 发布:linux ntp漏洞 编辑:程序博客网 时间:2024/04/27 21:13

这个是怎么编译扩展包的呢?

首先在here下载两个包:opencv_contrib和opencv ,

然后按照正常的方法把opencv编译好:

这里的opencv必须要这个链接的版本,我试了一下自己的版本是不可以编译的。

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. cd opencv  
  2. mkdir build  
  3. cd build  
  4. cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_TBB=ON -D BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_V4L=ON -D INSTALL_C_EXAMPLES=ON -D INSTALL_PYTHON_EXAMPLES=ON -D BUILD_EXAMPLES=ON -D WITH_QT=OFF -D WITH_OPENGL=OFF -D BUILD_TIFF=ON ..  
  5. make -j4  
  6. sudo make install  
  7. sudo sh -c 'echo "/usr/local/lib" > /etc/ld.so.conf.d/opencv.conf'  
  8. sudo ldconfig  
  9. echo "OpenCV ready to be used"  
先编译安装了opencv然后就是将扩展包编译一下,中途编译时间挺长的。耐心等待...........................

扩展包contrib可以直接命令,也可使用cmake-gui编译,cmake-gui的使用参考opencv_contrib的read.md。

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. $ cd ~/opencv_caffe/build_opencv  
  2. $ cmake -DOPENCV_EXTRA_MODULES_PATH=~/opencv_caffe/opencv_contrib/modules ~/opencv_caffe/opencv-master  
  3. $ make -j8  
编译完成,中途如果有什么错误可以留言,一起探讨。

然后就是dnn文件加下面的caffe模型加载了。还没有完成linux下面的实现,win7下面实现已经完成。

caffe_googlenet.cpp:

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #include <opencv2/dnn.hpp>  
  2. #include <opencv2/imgproc.hpp>  
  3. #include <opencv2/highgui.hpp>  
  4. using namespace cv;  
  5. using namespace cv::dnn;  
  6.   
  7. #include <fstream>  
  8. #include <iostream>  
  9. #include <cstdlib>  
  10. using namespace std;  
  11.   
  12. /* Find best class for the blob (i. e. class with maximal probability) */  
  13. void getMaxClass(dnn::Blob &probBlob, int *classId, double *classProb)  
  14. {  
  15.     Mat probMat = probBlob.matRefConst().reshape(1, 1); //reshape the blob to 1x1000 matrix  
  16.     Point classNumber;  
  17.   
  18.     minMaxLoc(probMat, NULL, classProb, NULL, &classNumber);  
  19.     *classId = classNumber.x;  
  20. }  
  21.   
  22. std::vector<String> readClassNames(const char *filename = "synset_words.txt")  
  23. {  
  24.     std::vector<String> classNames;  
  25.   
  26.     std::ifstream fp(filename);  
  27.     if (!fp.is_open())  
  28.     {  
  29.         std::cerr << "File with classes labels not found: " << filename << std::endl;  
  30.         exit(-1);  
  31.     }  
  32.   
  33.     std::string name;  
  34.     while (!fp.eof())  
  35.     {  
  36.         std::getline(fp, name);  
  37.         if (name.length())  
  38.             classNames.push_back( name.substr(name.find(' ')+1) );  
  39.     }  
  40.   
  41.     fp.close();  
  42.     return classNames;  
  43. }  
  44.   
  45. int main(int argc, char **argv)  
  46. {  
  47.     String modelTxt = "bvlc_googlenet.prototxt";  
  48.     String modelBin = "bvlc_googlenet.caffemodel";  
  49.     String imageFile = (argc > 1) ? argv[1] : "space_shuttle.jpg";  
  50.   
  51.     //! [Create the importer of Caffe model]  
  52.     Ptr<dnn::Importer> importer;  
  53.     try                                     //Try to import Caffe GoogleNet model  
  54.     {  
  55.         importer = dnn::createCaffeImporter(modelTxt, modelBin);  
  56.     }  
  57.     catch (const cv::Exception &err)        //Importer can throw errors, we will catch them  
  58.     {  
  59.         std::cerr << err.msg << std::endl;  
  60.     }  
  61.     //! [Create the importer of Caffe model]  
  62.   
  63.     if (!importer)  
  64.     {  
  65.         std::cerr << "Can't load network by using the following files: " << std::endl;  
  66.         std::cerr << "prototxt:   " << modelTxt << std::endl;  
  67.         std::cerr << "caffemodel: " << modelBin << std::endl;  
  68.         std::cerr << "bvlc_googlenet.caffemodel can be downloaded here:" << std::endl;  
  69.         std::cerr << "http://dl.caffe.berkeleyvision.org/bvlc_googlenet.caffemodel" << std::endl;  
  70.         exit(-1);  
  71.     }  
  72.   
  73.     //! [Initialize network]  
  74.     dnn::Net net;  
  75.     importer->populateNet(net);  
  76.     importer.release();                     //We don't need importer anymore  
  77.     //! [Initialize network]  
  78.   
  79.     //! [Prepare blob]  
  80.     Mat img = imread(imageFile);  
  81.     if (img.empty())  
  82.     {  
  83.         std::cerr << "Can't read image from the file: " << imageFile << std::endl;  
  84.         exit(-1);  
  85.     }  
  86.   
  87.     resize(img, img, Size(224, 224));       //GoogLeNet accepts only 224x224 RGB-images  
  88.     dnn::Blob inputBlob = dnn::Blob(img);   //Convert Mat to dnn::Blob image batch  
  89.     //! [Prepare blob]  
  90.   
  91.     //! [Set input blob]  
  92.     net.setBlob(".data", inputBlob);        //set the network input  
  93.     //! [Set input blob]  
  94.   
  95.     //! [Make forward pass]  
  96.     net.forward();                          //compute output  
  97.     //! [Make forward pass]  
  98.   
  99.     //! [Gather output]  
  100.     dnn::Blob prob = net.getBlob("prob");   //gather output of "prob" layer  
  101.   
  102.     int classId;  
  103.     double classProb;  
  104.     getMaxClass(prob, &classId, &classProb);//find the best class  
  105.     //! [Gather output]  
  106.   
  107.     //! [Print results]  
  108.     std::vector<String> classNames = readClassNames();  
  109.     std::cout << "Best class: #" << classId << " '" << classNames.at(classId) << "'" << std::endl;  
  110.     std::cout << "Probability: " << classProb * 100 << "%" << std::endl;  
  111.     //! [Print results]  
  112.   
  113.     return 0;  
  114. //main  
关于cpp文件的一些解释

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. 1、首先下载GoogLeNet model files: bvlc_googlenet.prototxt and bvlc_googlenet.caffemodel  
  2.   
  3.     和 ILSVRC2012类名: synset_words.txt.  
  4.   
  5.  2、导入一个caffe模型接口  
  6.       
  7.     Ptr<dnn::Importer> importer;  
  8.     try //Try to import Caffe GoogleNet model  
  9.     {  
  10.     importer = dnn::createCaffeImporter(modelTxt, modelBin);  
  11.     }  
  12.     catch (const cv::Exception &err) //Importer can throw errors, we will catch them  
  13.     {  
  14.     std::cerr << err.msg << std::endl;  
  15.     }  
  16. 3、通过接口创建和初始化网络  
  17.     dnn::Net net;  
  18.     importer->populateNet(net);  
  19.     importer.release(); //We don't need importer anymore  
  20.   
  21. 4、读取一张图片并转换到blob数据存储  
  22.     Mat img = imread(imageFile);  
  23.     if (img.empty())  
  24.     {  
  25.     std::cerr << "Can't read image from the file: " << imageFile << std::endl;  
  26.     exit(-1);  
  27.     }  
  28.     resize(img, img, Size(224, 224)); //GoogLeNet accepts only 224x224 RGB-images  
  29.     dnn::Blob inputBlob = dnn::Blob(img); //Convert Mat to dnn::Blob image batch  
  30.     首先我们resize图片和变换通道顺序,得到224x224x3的图片,然后转换为1x2x224x224的4维blob类型的数据  
  31.   
  32.  5、将blob输入到网络  
  33.     net.setBlob(".data", inputBlob); //set the network input  
  34.   
  35.     In bvlc_googlenet.prototxt the network input blob named as "data", therefore this blob labeled as ".data" in opencv_dnn API.  
  36.     Other blobs labeled as "name_of_layer.name_of_layer_output".  
  37.   
  38.  6、进行前向传播  
  39.     net.forward(); //compute output  
  40.   
  41.  During the forward pass output of each network layer is computed, but in this example we need output from "prob" layer only.  
  42.   
  43.  7、获取概率值  
  44.     dnn::Blob prob = net.getBlob("prob"); //gather output of "prob" layer  
  45.     int classId;  
  46.     double classProb;  
  47.     getMaxClass(prob, &classId, &classProb);//find the best class  
  48.     We put the output of "prob" layer, which contain probabilities for each of 1000 ILSVRC2012 image classes, to the prob blob. And find the index of element with maximal value in this one. This index correspond to the class of the image.  
  49.   
  50.  8、输出结果  
  51.     std::vector<String> classNames = readClassNames();  
  52.     std::cout << "Best class: #" << classId << " '" << classNames.at(classId) << "'" << std::endl;  
  53.     std::cout << "Probability: " << classProb * 100 << "%" << std::endl;  
  54.     For our image we get:  
  55.   
  56.         Best class: #812 'space shuttle'  
  57.   
  58.         Probability: 99.6378%  

====================================================================================================================================

由于前一段时间比较忙,没来得及完成现在搞定了。记录一下:

之前编译opencv_contrib是在linux下面,每次都会找不到dnn.hpp?很郁闷按照官网教程编译了2天还是不可以,为什么呢?

后来现在被迫在window7下面配置一下了,毕竟官网也是在win7下面的,正好我的win7下面也没有配置caffe,可以试试能否成功。。。。。。。

我的配置环境(win7+opencv3.0+cmake3.3+opencv_contrib+VS2013旗舰版)

因为opencv3.0默认安装中没有加入SIFT、SURF等点特征检测,opencv3的contrib库中才有此方法,欢迎大家与我讨论其他opencv方面的问题。

一、下载安装准备

  • opencv3.0.0 下载        Opencv for Windows:http://opencv.org/downloads.html
  • OpenCV_contrib 下载                                :https://github.com/Itseez/opencv_contrib
  • cmake_gui下载   Windows (Win32 Installer):http://www.cmake.org/download/

  下载对应版本的以上软件:opencv3.0.0可以直接解压,我的路径为D:\opencv3,解压完成后会生成D:\opencv3\opencv的目录形式。

  cmake_gui 软件直接安装。OK,现在准备工作就绪。

二、利用CMake编译opencv和opencv_contrib库

  1. 打开cmake_gui.
  2. 把opencv/source文件夹中的CMakeLists.txt文件直接拖入cmake_gui中,where is the source code自动选择opencv的安装目录为D:\opencv3\opencv\source.
  3. 更改where to build the binaries 目录,即我们将要编译的目录,我的是:D:\opencv3\opencv\Mybuild
  4. 点击configure,点击确定,选择默认编译器,点击finish。cmake将开始进行编译,如果一切顺利将最后显示Configure Done!表明我们configure完成,在出现的红色区域内找到OPENCV,子目录中找到OPENCV_EXTRA_MODULES_PATH,设置它的值为opencv_contrib/modules的绝对路径,在这里我的设置为D:\opencv3\opencv\sources\modules\opencv_contrib\modules(之前把opencv_contrib放在source文件夹外面,编译不成功,所以这里只介绍我的方法)。
  5. 可以再红色区域内再次去掉BUILD_OPENCV 和WITH_CUDA等有些硬件不支持的库,再次点击configure,正常情况会成功显示Configure Done! 然后点击Generate生成。

三、利用VS编译Debug和Release库

  1. 打开D:\opencv3\opencv\mybuild目录下的OpenCV.sln
  2. 在CMake Target中找到 INSTALL ,在Debug和Release的条件中分别右键选择build,生成debug和release库,这个过程大概持续10-20分钟。
  3. 我们会在D:\opencv3\opencv\Mybuild\install文件夹中看到这几个文件目录(生成的一定是x86因为我之前不知道怎么回事,每次自动生成的x64然后后面就出错了,如果想编译x64也是勉强能使用的,遇到“无法找到“XXX.exe”的调试信息,或者调试信息不匹配。未使用调试信息生成二进制文件。”下面可以试一下)
       {
首先打开菜单 项目->项目属性页  
        1。选择 配置属性->链接器->调试->生成调试信息 改为 是  
        2。选择 配置属性->C/C++ ->常规->调试信息格式 改为 用于“编辑并继续”的程序数据库(/ZI)  

        3。选择 配置属性->C/C++ ->优化->优化 改为 禁用(/Od)  

      }

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. --bin  
  2. --etc  
  3. --include  
  4.    --opencv  
  5.    --opencv2  
  6. --x86  
  7.   --vc10  
  8.      --bin  
  9.      --lib  
  10.      --staticlib  
  11. --LICENSE  
  12. --OpenCVConfig.cmake  
  13. --OpenCVConfig-version.cmake  

四、Windows和VS中配置Opencv3

  1. 添加环境变量PATH D:\opencv3\opencv\Mybuild\install\x86\vc10\bin ,记得多个需要用分号(;)隔开。
  2. 任意建立一个新的工程,打开视图(View)->Other Windows->Property Manager。点击Debug,双击Microsoft.Cpp.Win32.user,在其中设置:(以下设置完成之后,重复2的操作,选择Release,同样方式设置Microsoft.Cpp.Win32.user)
    1. VC++目录-->包含目录,添加:
      • D:\opencv3\opencv\Mybuild\install\include
      • D:\opencv3\opencv\Mybuild\install\include\opencv
      • D:\opencv3\opencv\Mybuild\install\include\opencv2
    2. VC++目录-->库目录,添加:
              D:\opencv3\opencv\Mybuild\install\x86\vc12\lib
    3. 链接器-->输入-->附加依赖项,添加:(里面那个库编译过不去可以删除添加,只要你需要的功能还在就行,Itseez也声明,所有的库不一定编译过去)

opencv_aruco300d.lib
opencv_bgsegm300d.lib
opencv_bioinspired300d.lib
opencv_calib3d300d.lib
opencv_ccalib300d.lib
opencv_core300d.lib
opencv_dnn300d.lib
opencv_face300d.lib
opencv_features2d300d.lib
opencv_flann300d.lib
opencv_highgui300d.lib
opencv_imgcodecs300d.lib
opencv_imgproc300d.lib
opencv_line_descriptor300d.lib
opencv_ml300d.lib
opencv_objdetect300d.lib
opencv_optflow300d.lib
opencv_photo300d.lib
opencv_reg300d.lib
opencv_rgbd300d.lib
opencv_saliency300d.lib
opencv_shape300d.lib
opencv_stereo300d.lib
opencv_stitching300d.lib
opencv_superres300d.lib
opencv_surface_matching300d.lib
opencv_video300d.lib
opencv_videoio300d.lib
opencv_videostab300d.lib
opencv_xfeatures2d300d.lib
opencv_ximgproc300d.lib
opencv_xobjdetect300d.lib
opencv_xphoto300d.lib
opencv_aruco300.lib
opencv_bgsegm300.lib
opencv_bioinspired300.lib
opencv_calib3d300.lib
opencv_ccalib300.lib
opencv_core300.lib
opencv_dnn300.lib
opencv_face300.lib
opencv_features2d300.lib
opencv_flann300.lib
opencv_highgui300.lib
opencv_imgcodecs300.lib
opencv_imgproc300.lib
opencv_line_descriptor300.lib
opencv_ml300.lib
opencv_objdetect300.lib
opencv_optflow300.lib
opencv_photo300.lib
opencv_reg300.lib
opencv_rgbd300.lib
opencv_saliency300.lib
opencv_shape300.lib
opencv_stereo300.lib
opencv_stitching300.lib
opencv_superres300.lib
opencv_surface_matching300.lib
opencv_video300.lib
opencv_videoio300.lib
opencv_videostab300.lib
opencv_xfeatures2d300.lib
opencv_ximgproc300.lib
opencv_xobjdetect300.lib
opencv_xphoto300.lib

五、遇到相关问题及解决方法
”无法启动此程序,因为计算机中丢失opencv_core300.dll或opencv_core300d.dll。请尝试重新安装改程序已解决此问题“

解决:只将该dll文件拷贝到C:\Windows\System32或者C:\Windows\SysWOW64是不行的,执行:regsvr32 C:\Windows\System32\opencv_core300d.dll,会报错。我是把dll文件拷贝到C:\Windows\SysWOW64中执行 regsvr32 C:\Windows\SysWOW64\opencv_core300d.dll就好了。

ippicv

解决:如果中途遇到下载失败,可以百度相应的版本,然后去github上下载,然后放在download里面就可以了。

我的项目中cpp代码:

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #include "stdafx.h"  
  2. #include <opencv2/dnn.hpp>  
  3. #include <opencv2/imgproc.hpp>  
  4. #include <opencv2/highgui.hpp>  
  5. using namespace cv;  
  6. using namespace cv::dnn;  
  7.   
  8. #include <fstream>  
  9. #include <iostream>  
  10. #include <cstdlib>  
  11. using namespace std;  
  12.   
  13. /* Find best class for the blob (i. e. class with maximal probability) */  
  14. void getMaxClass(dnn::Blob &probBlob, int *classId, double *classProb)  
  15. {  
  16.     Mat probMat = probBlob.matRefConst().reshape(1, 1); //reshape the blob to 1x1000 matrix  
  17.     Point classNumber;  
  18.   
  19.     minMaxLoc(probMat, NULL, classProb, NULL, &classNumber);  
  20.     *classId = classNumber.x;  
  21. }  
  22.   
  23. std::vector<String> readClassNames(const char *filename = "D:\\loadcaffe_model\\opencv3\\opencv\\sources\\modules\\opencv_contrib\\modules\\dnn\\samples\\synset_words.txt")  
  24. {  
  25.     std::vector<String> classNames;  
  26.   
  27.     std::ifstream fp(filename);  
  28.     if (!fp.is_open())  
  29.     {  
  30.         std::cerr << "File with classes labels not found: " << filename << std::endl;  
  31.         exit(-1);  
  32.     }  
  33.   
  34.     std::string name;  
  35.     while (!fp.eof())  
  36.     {  
  37.         std::getline(fp, name);  
  38.         if (name.length())  
  39.             classNames.push_back(name.substr(name.find(' ') + 1));  
  40.     }  
  41.   
  42.     fp.close();  
  43.     return classNames;  
  44. }  
  45.   
  46. int main(int argc, char **argv)  
  47. {  
  48.     String modelTxt = "D:\\loadcaffe_model\\opencv3\\opencv\\sources\\modules\\opencv_contrib\\modules\\dnn\\samples\\bvlc_googlenet.prototxt";  
  49.     String modelBin = "D:\\loadcaffe_model\\opencv3\\opencv\\sources\\modules\\opencv_contrib\\modules\\dnn\\samples\\bvlc_googlenet.caffemodel";  
  50.     String imageFile = (argc > 1) ? argv[1] : "D:\\loadcaffe_model\\opencv3\\opencv\\sources\\modules\\opencv_contrib\\modules\\dnn\\samples\\space_shuttle.jpg";  
  51.   
  52.     //! [Create the importer of Caffe model]  
  53.     Ptr<dnn::Importer> importer;  
  54.     try                                     //Try to import Caffe GoogleNet model  
  55.     {  
  56.         importer = dnn::createCaffeImporter(modelTxt, modelBin);  
  57.     }  
  58.     catch (const cv::Exception &err)        //Importer can throw errors, we will catch them  
  59.     {  
  60.         std::cerr << err.msg << std::endl;  
  61.     }  
  62.     if (!importer)  
  63.     {  
  64.         std::cerr << "Can't load network by using the following files: " << std::endl;  
  65.         std::cerr << "prototxt:   " << modelTxt << std::endl;  
  66.         std::cerr << "caffemodel: " << modelBin << std::endl;  
  67.         std::cerr << "bvlc_googlenet.caffemodel can be downloaded here:" << std::endl;  
  68.         std::cerr << "http://dl.caffe.berkeleyvision.org/bvlc_googlenet.caffemodel" << std::endl;  
  69.         exit(-1);  
  70.     }  
  71.     //! [Initialize network]  
  72.     dnn::Net net;  
  73.     importer->populateNet(net);  
  74.     importer.release();                     //We don't need importer anymore  
  75.     Mat img = imread(imageFile);  
  76.     if (img.empty())  
  77.     {  
  78.         std::cerr << "Can't read image from the file: " << imageFile << std::endl;  
  79.         exit(-1);  
  80.     }  
  81.     resize(img, img, Size(224, 224));       //GoogLeNet accepts only 224x224 RGB-images  
  82.     dnn::Blob inputBlob = dnn::Blob(img);   //Convert Mat to dnn::Blob image batch  
  83.   
  84.     net.setBlob(".data", inputBlob);        //set the network input  
  85.   
  86.     net.forward();                          //compute output  
  87.     dnn::Blob prob = net.getBlob("prob");   //gather output of "prob" layer  
  88.   
  89.     int classId;  
  90.     double classProb;  
  91.     getMaxClass(prob, &classId, &classProb);//find the best class  
  92.     //! [Gather output]  
  93.   
  94.     //! [Print results]  
  95.     std::vector<String> classNames = readClassNames();  
  96.     std::cout << "Best class: #" << classId << " '" << classNames.at(classId) << "'" << std::endl;  
  97.     std::cout << "Probability: " << classProb * 100 << "%" << std::endl;  
  98.     //! [Print results]  
  99.     system("PAUSE");  
  100.     return 0;  
  101. //main  
下面是我测试加载的结果:


0 0
原创粉丝点击