Caffe学习笔记系列1—在VS2013工程中添加Caffe依赖项

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章