創建新的C++工程來調用Caffe對圖片進行識別


  前段時間一直在跑Caffe訓練數據。之前用訓練好的caffemodel對圖片進行分類都是用的命令行指令,於是就想着自己新建一個工程來調用caffe,結合classification的代碼來對圖片進行分類。上網查閱了很多資料,最詳細的一篇就是:http://blog.csdn.net/qq_14845119/article/details/52541622#reply。

一、步驟描述

  我今天寫這篇的主要目的是為了加深自己的記憶和理解,大部分都是參考上面給出的博客的內容。具體分為以下三個步驟
(1)添加包含目錄、庫目錄和鏈接->輸入

(2)將$\caffe\examples\cpp_classsification\classification.cpp復制到新建的工程,並添加

(3)對classification.cpp進行修改,添加相應的deploy.prototxt,*.caffemodel,mean.binaryproto,synset_words.txt,*jpg,進行分類。

 

二、步驟詳解 

 現在對以上三個步驟進行詳解:

1、由於我只進行了Debug模式下的編譯,具體Release模式下的包含目錄、庫目錄和鏈接->輸入添加請參考上面的鏈接。

具體的配置和環境是:VS2013,Win64,CPU環境

包含目錄:

 庫目錄:

鏈接->輸入:

caffe.lib
compute_image_mean.lib
convert_imageset.lib
convert_mnist_data.lib
libcaffe.lib
opencv_highgui2410d.lib
opencv_imgproc2410d.lib
opencv_objdetect2410d.lib
opencv_core2410d.lib
opencv_ml2410d.lib
libboost_date_time-vc120-mt-gd-1_59.lib
libboost_filesystem-vc120-mt-gd-1_59.lib
libboost_system-vc120-mt-gd-1_59.lib
libglogD.lib
hdf5.lib
hdf5_cpp.lib
hdf5_f90cstub.lib
hdf5_fortran.lib
hdf5_hl.lib
hdf5_hl_cpp.lib
hdf5_hl_f90cstub.lib
hdf5_hl_fortran.lib
hdf5_tools.lib
szip.lib
zlib.lib
LevelDbD.lib
lmdbD.lib
libprotobufD.lib
libopenblas.dll.a
gflags_nothreadsd.lib
gflagsd.lib

ps:將NugetPackages根目錄下的glog,LevelDB,protobuf目錄中lib下面的debug目錄中相應的lib后面都加上D重命名了一下,為了和Release模式區分。

2、根據上面的操作,就已經完成了包含目錄、庫目錄和鏈接->輸入的添加。下面對復制過來的classification.cpp進行修改:

由於電腦沒有GPU,所以在程序第一行添加:

#define USE_OPENCV 1
#define CPU_ONLY 1

在main()函數中做如下修改:

下面就可以進行編譯啦。

 

三、編譯中會出現的錯誤

 (1)錯誤形式:

解決辦法:

工程屬性頁:c/c++->命令行,輸入-D_SCL_SECURE_NO_WARNINGS 

(2)錯誤形式:

解決辦法:將$\NugetPackages\OpenCV.2.4.10\build\native\bin\x64\v120\Debug文件夾下的opencv_core2410d.dll文件拷貝到新建的工程$\TestClassificationByCaffe\x64\Debug文件夾內即可。

如果遇到缺少.dll的情況,去NugetPackages下搜索相應的.dll文件,拷貝到新建的工程下即可。

 (3)錯誤形式:

解決方法:在工程中添加一個head.h文件,輸入如下程序:

#include "caffe/common.hpp"  
#include "caffe/layers/input_layer.hpp"  
#include "caffe/layers/inner_product_layer.hpp"  
#include "caffe/layers/dropout_layer.hpp"  
#include "caffe/layers/conv_layer.hpp"  
#include "caffe/layers/relu_layer.hpp"  
#include "caffe/layers/pooling_layer.hpp"  
#include "caffe/layers/lrn_layer.hpp"  
#include "caffe/layers/softmax_layer.hpp"  

namespace caffe
{

    extern INSTANTIATE_CLASS(InputLayer);
    extern INSTANTIATE_CLASS(InnerProductLayer);
    extern INSTANTIATE_CLASS(DropoutLayer);
    extern INSTANTIATE_CLASS(ConvolutionLayer);
    REGISTER_LAYER_CLASS(Convolution);
    extern INSTANTIATE_CLASS(ReLULayer);
    REGISTER_LAYER_CLASS(ReLU);
    extern INSTANTIATE_CLASS(PoolingLayer);
    REGISTER_LAYER_CLASS(Pooling);
    extern INSTANTIATE_CLASS(LRNLayer);
    REGISTER_LAYER_CLASS(LRN);
    extern INSTANTIATE_CLASS(SoftmaxLayer);
    REGISTER_LAYER_CLASS(Softmax);

}

然后在classification.cpp中輸入#include "head.h"即可。

但是:此時有可能出下類似下面的這種錯誤:

這表明Layer Convolution重復注冊了,只需要把head.h中的REGISTER_LAYER_CLASS(Convolution)注釋掉即可,其他層同樣如此。

我的就是全部注釋:

(4)錯誤形式:

解決辦法:將$\NugetPackages\gflags.2.1.2.1\build\native\x64\v120\dynamic\Lib目錄下的8個文件全部復制到工程目錄下即可。

 

PS:本文僅用來對自己昨天的學習內容進行一個總結和記憶概括,並加入了自己實際情況遇到的一些錯誤,希望能給其他人也帶來一定幫助。再次感謝http://blog.csdn.net/qq_14845119/article/details/52541622#reply作者給我的指導。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM