caffe-windows添加自己的工程

来源:互联网 发布:windows 桌面版qq 编辑:程序博客网 时间:2024/05/18 01:32

本文在博主知乎的地址:https://zhuanlan.zhihu.com/p/28577621

caffe-windows已经编译成功(win7+1080ti+cuda8.0+cudnn5.0+caffe安装),现在需要在自己的工程中使用caffe,经过一阵子的摸索,找到了一个稍微不那么麻烦的方法(不需要复制各种路径),现总结如下:


说明:

1、caffe-windows指的是caffe的根目录

2、添加的工程一般引用libcaffe.lib,Include Directories、Library Directories有一些多余的设置,这个可以参考后面写的一篇博客简单快捷建立自己的caffe工程


step 1、建立新工程

打开caffe解决方案,新建一个空的工程(win32 console application),我新建的工程为my-hed,然后给新建的工程添加已经存在的源文件,我的路径为caffe-windows/examples/my-hed/hed-test.cpp。

step 2、工程属性设置

1、打开工程的属性窗口,找到C/C++/Treat Warning As Errors,将其改为no。

2、打开工程的属性窗口,将配置改为release,平台改为x64,没有x64,则新建一个,在New platform中选择x64即可,因为我的caffe-windows是这样设置并编译的


3、在属性窗口中找到VC++ Directories/Include Directories,首先添加../../include,我这里用的都是相对路径,相对路径的起点为my-hed.vcxproj所在目录,../../include代表caffe-windows/include,其中../代表上一级目录,然后对比classification工程属性添加一些缺少的路径,如$(WindowsSDK_IncludePath)、$(VC_IncludePath),我第二次新建工程时,添加的目录就不一样了,后面也如此操作,添加对应缺少的依赖

4、在属性窗口中找到VC++ Directories/Library Directories,添加$(WindowsSDK_LibraryPath_x64)、$(VC_LibraryPath_x64),这两个路径也是对照caffe的分类工程添加的,添加这两个目录的原因是编译时出现error LNK1181:cannot open input file 'kernel32.lib',这个问题一直没解决,后来即使进行了上述操作,也没能消除该错误,后来突然就编译通过了,不知道什么情况。

5、在属性窗口中找到Linker/Input/Additional Dependencies。添加libcaffe.lib

$(CudaDependencies)

6、这一步解决问题Check failed: registry.count(t ype) == 1 (0 vs. 1) Unknown layer type:
XXXXX(known types: XXXXX )。

第一种办法:在属性窗口中找到Common Properties/References,添加新的引用,选择libcaffe,并设置属性Use Library Dependency Inputs为True,如图所示

这种办法的优点是比较简单,缺点很多:工程只能添加到Caffe.sln中,每次都会重新编译libcaffe,速度很慢。

第二种办法:添加一个.h头文件到工程,将这些Layers包含进来并注册,先贴我的例子

#include <caffe/caffe.hpp>


#include <caffe/layers/input_layer.hpp>

#include <caffe/layers/conv_layer.hpp>

#include <caffe/layers/relu_layer.hpp>

#include <caffe/layers/pooling_layer.hpp>

#include <caffe/layers/crop_layer.hpp>

#include <caffe/layers/sigmoid_layer.hpp>

#include <caffe/layers/deconv_layer.hpp>

#include <caffe/layers/concat_layer.hpp>

#include <caffe/layers/split_layer.hpp>

namespace caffe

{


extern INSTANTIATE_CLASS(InputLayer);

extern INSTANTIATE_CLASS(ConvolutionLayer);

REGISTER_LAYER_CLASS(Convolution);

extern INSTANTIATE_CLASS(ReLULayer);

REGISTER_LAYER_CLASS(ReLU);

extern INSTANTIATE_CLASS(PoolingLayer);

REGISTER_LAYER_CLASS(Pooling);

extern INSTANTIATE_CLASS(CropLayer);

//REGISTER_LAYER_CLASS(Crop);

extern INSTANTIATE_CLASS(SigmoidLayer);

REGISTER_LAYER_CLASS(Sigmoid);

extern INSTANTIATE_CLASS(SigmoidLayer);

//REGISTER_LAYER_CLASS(Sigmoid);

extern INSTANTIATE_CLASS(DeconvolutionLayer);

//REGISTER_LAYER_CLASS(Deconvolution);

extern INSTANTIATE_CLASS(ConcatLayer);

//REGISTER_LAYER_CLASS(Concat);

extern INSTANTIATE_CLASS(SplitLayer);

//REGISTER_LAYER_CLASS(Split);

}

模型用到的Layers都需要包含进来,并扩展extern INSTANTIATE_CLASS(XXXXX),注册的话REGISTER_LAYER_CLASS(XXXXX),可以先都注册,然后根据编译或者运行的重复注册的提示注释掉一些重复的,这个需要慢慢调整。

step 3、修改工程vcxproj文件

1、关闭VS,用编辑器打开my-hed.vcxproj,可以打开classification.vcxproj作为对比

2、添加三个props

<Import Project="..\..\..\NugetPackages\gflags.2.1.2.1\build\native\gflags.props" Condition="Exists('..\..\..\NugetPackages\gflags.2.1.2.1\build\native\gflags.props')" />

<Import Project="..\..\..\NugetPackages\glog.0.3.3.0\build\native\glog.props" Condition="Exists('..\..\..\NugetPackages\glog.0.3.3.0\build\native\glog.props')" />

<Import Project="..\..\..\NugetPackages\OpenCV.2.4.10\build\native\OpenCV.props" Condition="Exists('..\..\..\NugetPackages\OpenCV.2.4.10\build\native\OpenCV.props')" />

NugetPackages文件夹和caffe-windows同目录。

3、添加CommonSettings.props

<ImportGroup Label="PropertySheets" Condition="Exists('$(SolutionDir)\CommonSettings.props')">

<Import Project="$(SolutionDir)\CommonSettings.props" />

</ImportGroup>

4、添加NugetPackage相关的依赖

首先将classification/packages.config复制到my-hed工程目录,然后添加如下

<ItemGroup>

<None Include="packages.config" />

</ItemGroup>

<ImportGroup Label="ExtensionTargets">

<Import Project="..\..\..\NugetPackages\OpenCV.2.4.10\build\native\OpenCV.targets" Condition="Exists('..\..\..\NugetPackages\OpenCV.2.4.10\build\native\OpenCV.targets')" />

<Import Project="..\..\..\NugetPackages\OpenBLAS.0.2.14.1\build\native\openblas.targets" Condition="Exists('..\..\..\NugetPackages\OpenBLAS.0.2.14.1\build\native\openblas.targets')" />

<Import Project="..\..\..\NugetPackages\glog.0.3.3.0\build\native\glog.targets" Condition="Exists('..\..\..\NugetPackages\glog.0.3.3.0\build\native\glog.targets')" />

<Import Project="..\..\..\NugetPackages\hdf5-v120-complete.1.8.15.2\build\native\hdf5-v120.targets" Condition="Exists('..\..\..\NugetPackages\hdf5-v120-complete.1.8.15.2\build\native\hdf5-v120.targets')" />

<Import Project="..\..\..\NugetPackages\gflags.2.1.2.1\build\native\gflags.targets" Condition="Exists('..\..\..\NugetPackages\gflags.2.1.2.1\build\native\gflags.targets')" />

<Import Project="..\..\..\NugetPackages\boost_chrono-vc120.1.59.0.0\build\native\boost_chrono-vc120.targets" Condition="Exists('..\..\..\NugetPackages\boost_chrono-vc120.1.59.0.0\build\native\boost_chrono-vc120.targets')" />

<Import Project="..\..\..\NugetPackages\boost_date_time-vc120.1.59.0.0\build\native\boost_date_time-vc120.targets" Condition="Exists('..\..\..\NugetPackages\boost_date_time-vc120.1.59.0.0\build\native\boost_date_time-vc120.targets')" />

<Import Project="..\..\..\NugetPackages\boost_filesystem-vc120.1.59.0.0\build\native\boost_filesystem-vc120.targets" Condition="Exists('..\..\..\NugetPackages\boost_filesystem-vc120.1.59.0.0\build\native\boost_filesystem-vc120.targets')" />

<Import Project="..\..\..\NugetPackages\boost_system-vc120.1.59.0.0\build\native\boost_system-vc120.targets" Condition="Exists('..\..\..\NugetPackages\boost_system-vc120.1.59.0.0\build\native\boost_system-vc120.targets')" />

<Import Project="..\..\..\NugetPackages\boost.1.59.0.0\build\native\boost.targets" Condition="Exists('..\..\..\NugetPackages\boost.1.59.0.0\build\native\boost.targets')" />

<Import Project="..\..\..\NugetPackages\boost_thread-vc120.1.59.0.0\build\native\boost_thread-vc120.targets" Condition="Exists('..\..\..\NugetPackages\boost_thread-vc120.1.59.0.0\build\native\boost_thread-vc120.targets')" />

<Import Project="..\..\..\NugetPackages\boost_python2.7-vc120.1.59.0.0\build\native\boost_python-vc120.targets" Condition="Exists('..\..\..\NugetPackages\boost_python2.7-vc120.1.59.0.0\build\native\boost_python-vc120.targets')" />

<Import Project="..\..\..\NugetPackages\protobuf-v120.2.6.1\build\native\protobuf-v120.targets" Condition="Exists('..\..\..\NugetPackages\protobuf-v120.2.6.1\build\native\protobuf-v120.targets')" />

<Import Project="..\..\..\NugetPackages\LevelDB-vc120.1.2.0.0\build\native\LevelDB-vc120.targets" Condition="Exists('..\..\..\NugetPackages\LevelDB-vc120.1.2.0.0\build\native\LevelDB-vc120.targets')" />

<Import Project="..\..\..\NugetPackages\lmdb-v120-clean.0.9.14.0\build\native\lmdb-v120-clean.targets" Condition="Exists('..\..\..\NugetPackages\lmdb-v120-clean.0.9.14.0\build\native\lmdb-v120-clean.targets')" />

</ImportGroup>

step 4、右击工程,编译

如果没有问题,应该能编译通过,有问题的话,根据错误提示解决吧


参考的文献

【caffe-Windows】添加工程-以classification为例 - 程序园

How to include Caffe to Visual Studio 2013?

Neil Z. SHAO's Blog