前段時間一直在跑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作者給我的指導。