简单快捷建立自己的caffe工程

来源:互联网 发布:官网淘宝店铺装修模板 编辑:程序博客网 时间:2024/06/07 20:43

建立caffe工程需要的依赖比较多,手动添加太麻烦?!我们不妨换个视角,编译caffe_windows工程时,好像没添加依赖的路径(当然了,第一次编译下载比较慢),工程就编译好了,现在我们来解析下caffe_windows的工程设置文件,并一步一步建立了自己的工程,如果想看在caffe_windows中添加自己的工程,可以参考我的另外一篇文章caffe-windows添加自己的工程。

说明:

1、caffe_windows指的是caffe的根目录

2、先抛出结论,要在工程中使用caffe源码,最好是封装好导出dll使用,这样最简单快捷。

3、以下建立工程的路径、命名都只供参考,可以根据自己的实际情况更改。

4、我会建立一个win32控制台程序,并在其中使用caffe源码。我在MFC中直接使用caffe源码,编译的问题解决之后,点击运行就出现停止运行的情况,由于是MFC程序,不像控制台程序可以在cmd窗口中运行能看到错误提示。如果想在MFC、QT中使用,可以将caffe源码封装导出dll使用,导出方法,可以看我的一片文章简单快捷解决caffe源代码在其他工程(MFC、QT、win32)中调用的问题,在MFC、QT、win32控制台程序中调用dll的工程就比较简单,不需要caffe相关附加依赖库。


废话不多说,开始行动。

Step 1:首先建立工程,并复制相关文件

1、建立一个文件夹my_caffe_project

2、在VS2013中建立一个控制台程序my_caffe,位置在my_caffe_project下

3、将caffe_windows目录下的Build复制到my_caffe_project下,将caffe_windows目录下的include复制到my_caffe_project下并改名caffe_include,将caffe_windows同级目录下的NugetPackages复制到my_caffe_project下。

Step 2:修改工程属性

1、将caffe_windows\windows下的CommonSettings.props、CommonSettings.targets、nuget.config复制到my_caffe.sln同级目录下,用文本编辑器打开CommonSettings.props,找到开头<BuildDir>这一行,改为

<BuildDir>$(SolutionDir)..\Build</BuildDir>

这句话是设置编译路径,我们的程序需要用到其中的一些依赖,后面会用到。打开nuget.config文件,将

<add key="repositoryPath" value="..\..\NugetPackages" />

改为

<add key="repositoryPath" value="..\NugetPackages" />

改过之后的意思是nuget依赖包在上一级目录中,编译的时候检测到已下载nuget依赖包,则不会重复下载。

2、将caffe_windows\windows\classification\packages.config复制到my_caffe_project\my_caffe\my_caffe下,并在关闭工程的情况下同时打开my_caffe_project\my_caffe\my_caffe\my_caffe.vcxproj、caffe_windows\windows\classification\classification.vcxproj

首先将classification.vcxproj中以下三行复制到my_caffe.vcxproj中,并进行修改。

修改前:

<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')" />
修改后:
<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')" />

这三行大概是导入一些依赖的设置,我也不太懂,如果工程不直接使用源码,可以根据情况删减,以下类似。

其次找到以下几行,复制,这几行是导入设置信息

<ImportGroup Label="PropertySheets" Condition="Exists('$(SolutionDir)\CommonSettings.props')">    <Import Project="$(SolutionDir)\CommonSettings.props" />  </ImportGroup>
最后,找到以下几行,复制并修改(目录相对关系改为..\..\)。

修改后;

<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>

3、打开工程,设置属性

首先,在属性窗口中找到VC++ Directories/Include Directories,分别添加三个路径

$(SolutionDir)..\caffe_include
$(SolutionDir)..\caffe_include\caffe\proto

.\

第三个是包含当前目录(my_caffe.vcxproj文件所在的目录),我的caffe代码放在这个目录。

其次,在属性窗口中找到VC++ Directories/Library Directories,添加

$(SolutionDir)..\Build

这个是包含所需要的库。

最后,在属性窗口中找到Linker/Input/Additional Dependencies。添加

libcaffe.lib
$(CudaDependencies)

Step 3,编写程序,编译

博主发现一个很尴尬的问题,当我把caffe写成.h、.cpp两个文件在控制台中使用,编译成功后在cmd窗口运行,提示说重复注册

这里我就觉得很奇怪,以前导出dll使用没有任何问题,那既然提示了,我就把这一行注释掉

然后编译再运行,会提示其他层也重复注册,我把其他层也注释掉了,后面就提示,未知层

由于之前我在caffe_windows中添加过控制台程序,并且也能正常运行,当时把caffe有关源码都放在main函数所在的.cpp中,然后照这个思路修改,果然又可以用了


目前不知道这个是什么原因,大家可以一起讨论。


可能出现的问题:

1、多次出现Treat Warning As Errors,不光要改工程的属性(找到C/C++/Treat Warning As Errors,将其改为no),而且要更改工程所有.cpp(可能是和caffe有关的cpp)的属性(右键属性,找到C/C++/Treat Warning As Errors,将其改为no


2、包含路径设置了,但是程序去没有识别,可能是工程的编译版本与当前的解决方案的版本不一致,虽然问题很小,但是我遇到过几次了


工程属性1和工程属性2都要更改到解决方案属性一致。


总结

要在工程中使用caffe源码,最好是封装好导出dll使用,这样最简单快捷。

原创粉丝点击