Windows下基於VS2013呼叫caffe的C++介面
阿新 • • 發佈:2019-02-09
同事用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模式下執行出錯了,如下所示,現在還沒有解決,求高手指點迷津,謝謝。