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

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