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