同事用VGG16训练了一个人脸识别的网络,我想试试C++接口,这里做一下记录。
参考文章如下:
https://blog.csdn.net/xjz18298268521/article/details/61921357
https://blog.csdn.net/jiongnima/article/details/70197866
https://blog.csdn.net/qq_14845119/article/details/52541622
按照参考文章的步骤,先用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模式下运行出错了,如下所示,现在还没有解决,求高手指点迷津,谢谢。