Caffe學習筆記系列1—在VS2013工程中添加Caffe依賴項
本節主要講解在Caffe編譯成功之後,如何在自己的工程中添加依賴項。對於Caffe如何編譯不再詳述,可參考網上,另外,推薦一個Caffe模型的可視化工具Netscope,鏈接如下:http://ethereon.github.io/netscope/#/editor。本系列文章的目錄如下:
下面切入正題。首先在E盤中建立“Caffe學習筆記系列”文件夾,本系列所有的文章都在該文件夾操作,且均在CPU下操作。假設編譯好的Caffe文件夾取名“CaffeDev”,將該Caffe文件放在“Caffe學習筆記系列”中即可,並且均採用相對路徑。即目錄如下:
其中“CaffeDev”是已經編譯成功的Caffe。
下面詳述具體步驟。
1、建立新的工程CaffeTest1;
2、配置x64_Release編譯模式和x64_Debug編譯模式下的依賴項;
其中,x64_Release編譯模式配置如下:
//===============包含目錄
..\..\CaffeDev\caffe-master\include
..\..\CaffeDev\NugetPackages\boost.1.59.0.0\lib\native\include
..\..\CaffeDev\NugetPackages\gflags.2.1.2.1\build\native\include
..\..\CaffeDev\NugetPackages\glog.0.3.3.0\build\native\include
..\..\CaffeDev\NugetPackages\hdf5-v120-complete.1.8.15.2\lib\native\include
..\..\CaffeDev\NugetPackages\LevelDB-vc120.1.2.0.0\build\native\include
..\..\CaffeDev\NugetPackages\lmdb-v120-clean.0.9.14.0\lib\native\include
..\..\CaffeDev\NugetPackages\OpenBLAS.0.2.14.1\lib\native\include
..\..\CaffeDev\NugetPackages\OpenCV.2.4.10\build\native\include
..\..\CaffeDev\NugetPackages\protobuf-v120.2.6.1\build\native\include
//================庫目錄
..\..\CaffeDev\caffe-master\Build\x64\Release
..\..\CaffeDev\NugetPackages\boost_chrono-vc120.1.59.0.0\lib\native\address-model-64\lib
..\..\CaffeDev\NugetPackages\boost_date_time-vc120.1.59.0.0\lib\native\address-model-64\lib
..\..\CaffeDev\NugetPackages\boost_filesystem-vc120.1.59.0.0\lib\native\address-model-64\lib
..\..\CaffeDev\NugetPackages\boost_system-vc120.1.59.0.0\lib\native\address-model-64\lib
..\..\CaffeDev\NugetPackages\boost_thread-vc120.1.59.0.0\lib\native\address-model-64\lib
..\..\CaffeDev\NugetPackages\gflags.2.1.2.1\build\native\x64\v120\dynamic\Lib
..\..\CaffeDev\NugetPackages\glog.0.3.3.0\build\native\lib\x64\v120\Release\dynamic
..\..\CaffeDev\NugetPackages\hdf5-v120-complete.1.8.15.2\lib\native\lib\x64
..\..\CaffeDev\NugetPackages\LevelDB-vc120.1.2.0.0\build\native\lib\x64\v120\Release
..\..\CaffeDev\NugetPackages\lmdb-v120-clean.0.9.14.0\lib\native\lib\x64
..\..\CaffeDev\NugetPackages\OpenBLAS.0.2.14.1\lib\native\lib\x64
..\..\CaffeDev\NugetPackages\OpenCV.2.4.10\build\native\lib\x64\v120\Release
..\..\CaffeDev\NugetPackages\protobuf-v120.2.6.1\build\native\lib\x64\v120\Release
//==================鏈接器->輸入->附加依賴項
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
//=================預處理器定義
USE_OPENCV
_CRT_SECURE_NO_WARNINGS
CPU_ONLY
_SCL_SECURE_NO_WARNINGS
x64_Debug編譯模式配置如下:
//===================包含目錄
..\..\CaffeDev\caffe-master\include
..\..\CaffeDev\NugetPackages\glog.0.3.3.0\build\native\include
..\..\CaffeDev\NugetPackages\OpenBLAS.0.2.14.1\lib\native\include
..\..\CaffeDev\NugetPackages\OpenCV.2.4.10\build\native\include
..\..\CaffeDev\NugetPackages\boost.1.59.0.0\lib\native\include
..\..\CaffeDev\NugetPackages\gflags.2.1.2.1\build\native\include
..\..\CaffeDev\NugetPackages\hdf5-v120-complete.1.8.15.2\lib\native\include
..\..\CaffeDev\NugetPackages\LevelDB-vc120.1.2.0.0\build\native\include
..\..\CaffeDev\NugetPackages\lmdb-v120-clean.0.9.14.0\lib\native\include
..\..\CaffeDev\NugetPackages\protobuf-v120.2.6.1\build\native\include
//===================庫目錄
..\..\CaffeDev\caffe-master\Build\x64\Debug
..\..\CaffeDev\NugetPackages\OpenCV.2.4.10\build\native\lib\x64\v120\Debug
..\..\CaffeDev\NugetPackages\boost_chrono-vc120.1.59.0.0\lib\native\address-model-64\lib
..\..\CaffeDev\NugetPackages\boost_date_time-vc120.1.59.0.0\lib\native\address-model-64\lib
..\..\CaffeDev\NugetPackages\boost_filesystem-vc120.1.59.0.0\lib\native\address-model-64\lib
..\..\CaffeDev\NugetPackages\boost_system-vc120.1.59.0.0\lib\native\address-model-64\lib
..\..\CaffeDev\NugetPackages\boost_thread-vc120.1.59.0.0\lib\native\address-model-64\lib
..\..\CaffeDev\NugetPackages\gflags.2.1.2.1\build\native\x64\v120\dynamic\Lib
..\..\CaffeDev\NugetPackages\glog.0.3.3.0\build\native\lib\x64\v120\Debug\dynamic
..\..\CaffeDev\NugetPackages\hdf5-v120-complete.1.8.15.2\lib\native\lib\x64
..\..\CaffeDev\NugetPackages\LevelDB-vc120.1.2.0.0\build\native\lib\x64\v120\Debug
..\..\CaffeDev\NugetPackages\lmdb-v120-clean.0.9.14.0\lib\native\lib\x64
..\..\CaffeDev\NugetPackages\OpenBLAS.0.2.14.1\lib\native\lib\x64
..\..\CaffeDev\NugetPackages\protobuf-v120.2.6.1\build\native\lib\x64\v120\Debug
..\..\CaffeDev\NugetPackages\boost_date_time-vc120.1.59.0.0\lib
//====================鏈接器->輸入->附加依賴項
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
//===================預處理器定義
USE_OPENCV
_CRT_SECURE_NO_WARNINGS
CPU_ONLY
_SCL_SECURE_NO_WARNINGS
注意,該模式下可能缺少幾個.dll庫,我碰到的是gflags_nothreadsd.dll、lmdbD.dll、opencv_core2410d.dll、opencv_highgui2410d.dll、opencv_imgproc2410d.dll。直接從編譯好的Caffe裏面拷貝過來即可。
3、編寫測試代碼“head.h”頭文件和主函數“main.cpp”;
頭文件“head.h”代碼如下,主要是註冊一些函數,
#pragma once
#include <caffe/proto/caffe.pb.h>
#include <caffe/common.hpp>
#include <caffe/layer.hpp>
#include<caffe/layer_factory.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>
#include<caffe/layers/data_layer.hpp>
#include<caffe/layers/batch_norm_layer.hpp>
#include<caffe/layers/bias_layer.hpp>
#include<caffe/layers/concat_layer.hpp>
#include<caffe/layers/scale_layer.hpp>
#include<caffe/layers/softmax_loss_layer.hpp>
#include<caffe/layers/accuracy_layer.hpp>
#include<caffe/layers/dummy_data_layer.hpp>
#include<caffe/layers/euclidean_loss_layer.hpp>
#include<caffe/layers/prelu_layer.hpp>
#include<caffe/layers/slice_layer.hpp>
#include<caffe/layers/contrastive_loss_layer.hpp>
#include <caffe/layers/memory_data_layer.hpp>
namespace caffe
{
externINSTANTIATE_CLASS(InputLayer);
externINSTANTIATE_CLASS(InnerProductLayer);
externINSTANTIATE_CLASS(DropoutLayer);
externINSTANTIATE_CLASS(ConvolutionLayer);
REGISTER_LAYER_CLASS(Convolution);
externINSTANTIATE_CLASS(ReLULayer);
REGISTER_LAYER_CLASS(ReLU);
externINSTANTIATE_CLASS(PoolingLayer);
REGISTER_LAYER_CLASS(Pooling);
externINSTANTIATE_CLASS(LRNLayer);
REGISTER_LAYER_CLASS(LRN);
externINSTANTIATE_CLASS(SoftmaxLayer);
REGISTER_LAYER_CLASS(Softmax);
//externINSTANTIATE_CLASS(DataLayer);
//REGISTER_LAYER_CLASS(Data); //===註釋掉,在release模式下會報錯
externINSTANTIATE_CLASS(BatchNormLayer);
externINSTANTIATE_CLASS(BiasLayer);
externINSTANTIATE_CLASS(ConcatLayer);
externINSTANTIATE_CLASS(ScaleLayer);
externINSTANTIATE_CLASS(SoftmaxWithLossLayer);
REGISTER_LAYER_CLASS(SoftmaxWithLoss);
externINSTANTIATE_CLASS(AccuracyLayer);
REGISTER_LAYER_CLASS(Accuracy);
externINSTANTIATE_CLASS(DummyDataLayer);
REGISTER_LAYER_CLASS(DummyData);
externINSTANTIATE_CLASS(EuclideanLossLayer);
REGISTER_LAYER_CLASS(EuclideanLoss);
externINSTANTIATE_CLASS(PReLULayer);
REGISTER_LAYER_CLASS(PReLU);
externINSTANTIATE_CLASS(SliceLayer);
REGISTER_LAYER_CLASS(Slice);
externINSTANTIATE_CLASS(ContrastiveLossLayer);
REGISTER_LAYER_CLASS(ContrastiveLoss);
externINSTANTIATE_CLASS(MemoryDataLayer);
REGISTER_LAYER_CLASS(MemoryData);
}
主函數“main.cpp”代碼如下,
#include <vector>
#include <iostream>
#include <string>
#include <vector>
#include <map>
#include "caffe\common.hpp"
#include "caffe\net.hpp"
#include <caffe/blob.hpp>
#include <caffe/util/io.hpp>//磁盤讀寫
#include <caffe/caffe.hpp>
#include "head.h"
#ifdef USE_OPENCV
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#endif
#include <algorithm>
#include <iosfwd>
#include <memory>
#include <utility>
#ifdef USE_OPENCV
using namespace std;
using namespace caffe;
int main()
{
Blob<float>a;
cout<< "Size: " << a.shape_string() << endl;
a.Reshape(1,2, 3, 4);
cout<< "Size: " << a.shape_string() << endl;
a.Reshape(1,1, 1, 4);
cout<< "Size: " << a.shape_string() << endl;
float*p = a.mutable_cpu_data();
float*q = a.mutable_cpu_diff();
for(int i = 0; i<a.count(); i++)
{
p[i]= i;
q[i]= a.count() - 1 - i;
}
cout<< "L1: " << a.asum_data() << endl;
cout<< "L2: " << a.sumsq_data() << endl;
//a.Update();
//磁盤讀寫
BlobProtobp;
a.ToProto(&bp,true);//a序列化,連帶diff(默認不帶)
WriteProtoToBinaryFile(bp,"a.blob");
BlobProtobp2;
ReadProtoFromBinaryFileOrDie("a.blob",&bp2);
Blob<float>b;
b.FromProto(bp2,true);//從序列化對象中克隆b(連同形狀)
b.Update();
cout<< "L1: " << b.asum_data() << endl;
cout<< "L2: " << b.sumsq_data() << endl;
vector<int>index{ 0, 0, 0, 0};
floatm = b.data_at(index);
cout<< m << endl;
return0;
}
#endif // USE_OPENCV
運行結果如下,從而可以判斷依賴庫是否添加正確,至於代碼具體含義在此不予解釋。
提示:本小節的代碼工程在“Caffe學習筆記系列”文件夾中的“CaffeTest1”文件夾下面。
本小節的代碼鏈接如下:https://pan.baidu.com/s/1x_xbunKYByJogrTczPGUWw 密碼:uoqw