1. 程式人生 > >Windows下基於VS2013呼叫caffe的C++介面

Windows下基於VS2013呼叫caffe的C++介面

   同事用VGG16訓練了一個人臉識別的網路,我想試試C++介面,這裡做一下記錄。

    參考文章如下:

    按照參考文章的步驟,先用VS2013新建一個工程,將D:\caffe-master\examples\cpp_classification\classificaton.cpp拷貝到工程目錄中,然後配置工程。我的caffe依賴庫安裝在D盤,如下圖所示:


我使用GPU,所以我的配置如下:

Release下

包含目錄:

D:\caffe-master\include
D:\caffe-master\include\caffe
D:\caffe-master\include\caffe\proto
D:\NugetPackages\boost.1.59.0.0\lib\native\include
D:\NugetPackages\gflags.2.1.2.1\build\native\include
D:\NugetPackages\glog.0.3.3.0\build\native\include
D:\NugetPackages\protobuf-v120.2.6.1\build\native\include
D:\NugetPackages\OpenBLAS.0.2.14.1\lib\native\include
D:\NugetPackages\OpenCV.2.4.10\build\native\include
D:\NugetPackages\LevelDB-vc120.1.2.0.0\build\native\include
D:\NugetPackages\lmdb-v120-clean.0.9.14.0\lib\native\include
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\include

庫目錄:

D:\caffe-master\Build\x64\Release
D:\NugetPackages\boost_date_time-vc120.1.59.0.0\lib\native\address-model-64\lib
D:\NugetPackages\boost_filesystem-vc120.1.59.0.0\lib\native\address-model-64\lib
D:\NugetPackages\boost_thread-vc120.1.59.0.0\lib\native\address-model-64\lib
D:\NugetPackages\boost_system-vc120.1.59.0.0\lib\native\address-model-64\lib
D:\NugetPackages\boost_chrono-vc120.1.59.0.0\lib\native\address-model-64\lib
D:\NugetPackages\glog.0.3.3.0\build\native\lib\x64\v120\Release\dynamic
D:\NugetPackages\protobuf-v120.2.6.1\build\native\lib\x64\v120\Release
D:\NugetPackages\OpenBLAS.0.2.14.1\lib\native\lib\x64
D:\NugetPackages\hdf5-v120-complete.1.8.15.2\lib\native\lib\x64
D:\NugetPackages\OpenCV.2.4.10\build\native\lib\x64\v120\Release
D:\NugetPackages\gflags.2.1.2.1\build\native\x64\v120\dynamic\Lib
D:\NugetPackages\LevelDB-vc120.1.2.0.0\build\native\lib\x64\v120\Release 
D:\NugetPackages\lmdb-v120-clean.0.9.14.0\lib\native\lib\x64  
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\lib\x64

附加依賴項:

opencv_core2410.lib 
opencv_highgui2410.lib  
opencv_imgproc2410.lib  
caffe.lib  
libcaffe.lib 
gflags.lib 
libglog.lib  
libopenblas.dll.a 
libprotobuf.lib  
leveldb.lib  
lmdb.lib 
hdf5.lib  
hdf5_hl.lib  
libboost_date_time-vc120-mt-s-1_59.lib  
libboost_filesystem-vc120-mt-s-1_59.lib
cublas.lib  
cuda.lib  
cublas_device.lib  
cudnn.lib  
cudadevrt.lib  
cudart.lib  
cudart_static.lib    
cufft.lib  
cufftw.lib  
curand.lib  
cusolver.lib  
cusparse.lib  
nppc.lib  
nppi.lib  
npps.lib  
nvblas.lib  
nvcuvid.lib  
nvrtc.lib

Debug下

包含目錄:

D:\caffe-master\include
D:\caffe-master\include\caffe
D:\caffe-master\include\caffe\proto
D:\NugetPackages\boost.1.59.0.0\lib\native\include
D:\NugetPackages\gflags.2.1.2.1\build\native\include
D:\NugetPackages\glog.0.3.3.0\build\native\include
D:\NugetPackages\OpenBLAS.0.2.14.1\lib\native\include
D:\NugetPackages\OpenCV.2.4.10\build\native\include
D:\NugetPackages\protobuf-v120.2.6.1\build\native\include
D:\NugetPackages\LevelDB-vc120.1.2.0.0\build\native\include
D:\NugetPackages\lmdb-v120-clean.0.9.14.0\lib\native\include
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\include

庫目錄:

D:\caffe-master\Build\x64\Debug
D:\NugetPackages\boost_date_time-vc120.1.59.0.0\lib\native\address-model-64\lib
D:\NugetPackages\boost_filesystem-vc120.1.59.0.0\lib\native\address-model-64\lib
D:\NugetPackages\boost_system-vc120.1.59.0.0\lib\native\address-model-64\lib
D:\NugetPackages\boost_thread-vc120.1.59.0.0\lib\native\address-model-64\lib
D:\NugetPackages\boost_chrono-vc120.1.59.0.0\lib\native\address-model-64\lib
D:\NugetPackages\glog.0.3.3.0\build\native\lib\x64\v120\Debug\dynamic
D:\NugetPackages\protobuf-v120.2.6.1\build\native\lib\x64\v120\Debug
D:\NugetPackages\OpenBLAS.0.2.14.1\lib\native\lib\x64  
D:\NugetPackages\hdf5-v120-complete.1.8.15.2\lib\native\lib\x64  
D:\NugetPackages\OpenCV.2.4.10\build\native\lib\x64\v120\Debug
D:\NugetPackages\gflags.2.1.2.1\build\native\x64\v120\dynamic\Lib
D:\NugetPackages\LevelDB-vc120.1.2.0.0\build\native\lib\x64\v120\Debug 
D:\NugetPackages\lmdb-v120-clean.0.9.14.0\lib\native\lib\x64
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\lib\x64

附加依賴項:

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  
libglog.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 
LevelDb.lib 
lmdbD.lib  
libprotobuf.lib  
libopenblas.dll.a  
gflags_nothreadsd.lib  
gflagsd.lib 
cublas.lib  
cuda.lib  
cublas_device.lib  
cudnn.lib  
cudadevrt.lib  
cudart.lib  
cudart_static.lib    
cufft.lib  
cufftw.lib  
curand.lib  
cusolver.lib  
cusparse.lib  
nppc.lib  
nppi.lib  
npps.lib  
nvblas.lib  
nvcuvid.lib  
nvrtc.lib

下一步在  C/C++->前處理器->前處理器定義  新增:_CRT_SECURE_NO_WARNINGS

 接著修改classificaton.cpp,主要是修改main函式,我修改後如下:

int main(int argc, char** argv) {


  ::google::InitGoogleLogging(argv[0]);


  string model_file = "VGG_FACE_deploy.prototxt";
  string trained_file = "model_iter_10000.caffemodel";
  string mean_file    = "face-mean.binaryproto";
  string label_file   = "synset_words.txt";
  string file = "val\\01477.jpg";


  Classifier classifier(model_file, trained_file, mean_file, label_file);


  std::cout << "---------- Prediction for "
            << file << " ----------" << std::endl;


  cv::Mat img = cv::imread(file, -1);
  CHECK(!img.empty()) << "Unable to decode image " << file;
  std::vector<Prediction> predictions = classifier.Classify(img);


  /* Print the top N predictions. */
  for (size_t i = 0; i < predictions.size(); ++i) {
    Prediction p = predictions[i];
    std::cout << std::fixed << std::setprecision(4) << p.second << " - \""
              << p.first << "\"" << std::endl;
  }


  getchar();
  return 0;
}

另外參考文章裡的head.h也是要加上的,不然會出錯。

編譯沒問題就可以執行程式了,我的在Release下結果如下:


可以看到一開始有兩個warning,我去查了一下,大部分都說這個不影響結果,具體參考下面連結

有一點奇怪的是,我的程式在Debug模式下執行出錯了,如下所示,現在還沒有解決,求高手指點迷津,謝謝。