最近更新:微软对CAFFE做了官方支持
1. 依赖
1)需要VS2013+CUDA7.5 或VS2015+CUDA8.0
2)CuDNN,需要注册下载,仅仅是一个库,解压缩就可以了
3)其他依赖项在工程编译时会自动通过NuGet安装
2. 工程配置
首先下载官方维护的CAFFE源码
用notepad++打开caffe-windows/windows/CommonSettings.props.example,修改相关配置:
1)修改<CpuOnlyBuild>为false,<UseCuDNN>为true,<PythonSupport>和<MatlabSupport>看需求改
2)修改<CuDnnPath>为CuDNN的解压路径(解压默认文件夹为cuda,不用包含该级)
3)如果添加了python和matlab支持,修改<PythonDir>和<MatlabDir>
如果添加了python支持,需要pip安装 numpy、scipy、matplotlib、scikit-image、protobuf
使用vs2013打开caffe-windows/windows/Caffe.sln,看libcaffe和test_all有没有成功导入
我的导入失败,因为没找到CUDA 7.5.props,应该是先安装的CUDA再装VS2013导致的问题,参考文章《Windows-7下安装配置Caffe并支持GPU加速》
拷贝CUDA安装目录下的CUDA 6.5.props、CUDA 7.5.targets、CUDA 7.5.xml、Nvda.Build.CudaTasks.v7.5.dll到目录C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\BuildCustomizations
新的错误出现了:未能从程序集。。。Nvda.Build.CudaTasks.v7.5.dll 加载任务
参考文章《CUDA7.5 和VS2013那些事儿》,应该是缺少.net 3.5,于是下载安装,重启机器后终于成功导入
右键libcaffe工程,选择“设为启动项目“。调试->libcaffe 属性->C/C++/常规,“将警告视为错误”改为否
右键libcaffe工程,选择“生成”,会首先通过NuGet还原依赖项,然后开始编译。
在这里我又出错了:alt_sstream_impl.hpp没有生成object文件
应该是编码的问题,解决很简单(参考《windows环境Caffe安装配置步骤(无GPU)及mnist训练》):双击错误,会打开该hpp文件,这时vs已经自动修改编码了,保存下即可
重新编译,成功
编译caffe工程。右击 解决方案->属性->通用属性->启动项目 选定“当前选定内容”,鼠标选定 caffe.cpp ,然后ctrl+f5编译。搞定
----------------------------------------------------------------------我是更新分割线---------------------------------------------------------------------------------
主要内容参考的 windows+caffe+vs2013+cuda6.5配置记录 ,对其中的一些笔误做了修正,遇到了些别的错误,一并解决
1. 依赖库
boost
原文使用的安装包,很方便:boost_1.56_0-msvc-12.0-64.exe
Glog+Gflag+Protobuf+LevelDB+HDF5+LMDB+Openblas
原文提供了一个编译好的包,所有东西一并解决:3rdparty
想起了前两天用cmake一个一个编译的苦逼样。。。给大神们跪一个
cuda
虽然我显卡不支持,但还是需要安装,不然编译不通过
找了个cuda6.5,官方推荐用更新的cuda7.0,没有测试
OpenCV
手头有个OpenCV2.4.1的包,打开一看,仅支持到vc10
只好下了个OpenCV2.4.9
2. 建立Caffe工程
首先当然是下载Caffe的源代码啦
系统环境变量设置
其实可以在VS里通过绝对路径设置的,但不知道为什么,OpenCV如果不设置变量,dll文件死活找不到
我的设置是:PATH: D:\Opencv-2.4.9\opencv\build\x64\vc12\bin;
D:\Opencv-2.4.9\opencv\build;
E:\TestProject\caffe\caffe_windows\caffe-master\3rdparty\3rdparty\bin;
BOOST_156: D:\boost_1_56_0;
PATH的第三项是caffe源代码的路径,在其目录下添加之前下好的3rdparty包
VS2013建立Caffe工程
建立一个win32 console application空项目,位置在哪无所谓,项目路径设置对就可以了
1)项目——属性——C/C++——常规——附加包含目录
caffe源码路径/include;
caffe源码路径/src
caffe源码路径/3rdparty/include;
caffe源码路径/3rdparty;
caffe源码路径/3rdparty/include;
caffe源码路径/3rdparty/include/openblas;
caffe源码路径/3rdparty/include/hdf5;
caffe源码路径/3rdparty/include/lmdb;
caffe源码路径/3rdparty/include/leveldb;
caffe源码路径/3rdparty/include/gflag;
caffe源码路径/3rdparty/include/glog;
caffe源码路径/3rdparty/include/google/protobuf;
2)项目——属性——VC++目录——包含目录
D:\CUDA\NVIDIA GPU Computing Toolkit\CUDA\v6.5\include;
D:\Opencv-2.4.9\opencv\build\include;
D:\Opencv-2.4.9\opencv\build\include\opencv;
D:\Opencv-2.4.9\opencv\build\include\opencv2;
D:\boost_1_56_0
我这里用的绝对路径,也可以用之前设置的环境变量
3)项目——属性——链接器——常规——附加库目录
D:\CUDA\NVIDIA GPU Computing Toolkit\CUDA\v6.5\lib\$(PlatformName);
D:\Opencv-2.4.9\opencv\build\x64\vc12\lib;
D:\boost_1_56_0\lib64-msvc-12.0;
Caffe源码路径\3rdparty\lib;
4)项目——属性——链接器——输入——附加依赖项
Debug添加
opencv_ml249d.lib
opencv_calib3d249d.lib
opencv_contrib249d.lib
opencv_core249d.lib
opencv_features2d249d.lib
opencv_flann249d.lib
opencv_gpu249d.lib
opencv_highgui249d.lib
opencv_imgproc249d.lib
opencv_legacy249d.lib
opencv_objdetect249d.lib
opencv_ts249d.lib
opencv_video249d.lib
opencv_nonfree249d.lib
opencv_ocl249d.lib
opencv_photo249d.lib
opencv_stitching249d.lib
opencv_superres249d.lib
opencv_videostab249d.lib
cudart.lib
cuda.lib
nppi.lib
cufft.lib
cublas.lib
curand.lib
gflagsd.lib
libglog.lib
libopenblas.dll
libprotobufd.lib
libprotoc.lib
leveldbd.lib
lmdbd.lib
libhdf5_D.lib
libhdf5_hl_D.lib
Shlwapi.lib
gflags.lib
libprotobuf.lib
leveldb.lib
lmdb.lib
libhdf5.lib
libhdf5_hl.lib
Release一样,仅是OpenCV的dll去掉后面的d
编译Caffe
1)编译caffe-master\src\caffe下的文件
首先将该目录下的所有cpp文件添加进工程,依次编译每个文件
几个可能的错误:
1. blob.cpp
提示缺少 caffe\proto\caffe.pb.h
下载个GeneratePB.bat,放在caffe-master\scripts目录下,之前下的3rdparty\bin下应该有个protoc.exe
运行bat就生成所需文件了
2. common.cpp
报getpid的错误
添加#include <process.h>
项目——属性——C/C++——预处理器——预处理器定义,添加 _CRT_SECURE_NO_WARNINGS 和 _SCL_SECURE_NO_WARNINGS
在getpid的位置添加(原文漏掉了p,且ifndef写成了ifndef)
<span style="white-space:pre"> </span>#ifndef _MSC_VER
<span style="white-space:pre"> </span>pid = getpid();
<span style="white-space:pre"> </span>#else
<span style="white-space:pre"> </span>pid = _getpid();
<span style="white-space:pre"> </span>#endf
<span style="white-space:pre"> </span>//其实按我的理解,直接将getpid改成_getpid就可以了,后面很多情况我嫌麻烦直接这么干的
3. net.cpp
关于mkdtemp的错误
在io.hpp中添加 #include “mkstemp.h” (原文漏写成了mkstep.h)
在close()的位置添加(原文ifndef写成了ifndef)
<span style="white-space:pre"> </span>#ifndef _MSC_VER
<span style="white-space:pre"> </span>close(fd);
<span style="white-space:pre"> </span>#else
_<span style="white-space:pre"> </span>close(fd);
<span style="white-space:pre"> </span>#endif
在mktemp的位置修改
<span style="white-space:pre"> </span>#ifndef _MSC_VER
<span style="white-space:pre"> </span>char* mkdtemp_result = mkdtemp(temp_dirname_cstr);
<span style="white-space:pre"> </span>#else
<span style="white-space:pre"> </span>errno_t mkdtemp_result = _mktemp_s(temp_dirname_cstr, sizeof(temp_dirname_cstr));
<span style="white-space:pre"> </span>#endif
4. solver.cpp
关于snprintf的错误
添加 #include <cstdio>
添加
<span style="white-space:pre"> </span>#ifdef _MSC_VER
<span style="white-space:pre"> </span>#define snprinf sprintf_s
<span style="white-space:pre"> </span>#endif
2)编译caffe-master\src\layer下的文件
在工程中新建一个layer目录,将路径下所有cpp和cu文件添加进去
右键每个cu文件,点属性,常规-项类型 修改为 CUDA C/C++(如没有这个选项,右键工程名-生成依赖项-生成自定义,弹出框中勾选CUDA)
bnll_layer.cu文件,修改:float kBNLL_THRESHOLD = 50 ——> #define kBNLL_THRESHOLD 50.0
conv_layer.cu和deconv_layer.cu文件,forward_gpu_gemm()函数报错,少了一个参数,添加第4个参数:false
contrastrive_loss_layer.cpp文件,56行(类型不一致的错误)
Dtype dist = std::max(margin - sqrt(dist_sq_.cpu_data()[i]), 0.0);
<span style="white-space:pre"> </span>//改为
<span style="white-space:pre"> </span>Dtype dist = std::max(margin - sqrt(dist_sq_.cpu_data()[i]), Dtype(0.0));
3)编译caffe-master\src\util下的文件
跟layer一样,添加文件进项目,修改cu文件属性
1. io.cpp
ReadProtoFromBinaryFile
O_RDONLY ——> O_RDONLY | O_BINARY
修改所有的open()和close()为_open() 和 _close()
2. math_functions.cpp
添加
<span style="white-space:pre"> </span>#define __builtin_popcount __popcnt
<span style="white-space:pre"> </span>#define __builtin_popcountl __popcnt
3. db_lmdb.cpp(原文为db.cpp)
<span style="white-space:pre"> </span>#ifdef _MSC_VER
<span style="white-space:pre"> </span>#include <direct.h>
<span style="white-space:pre"> </span>#endif
修改CHECK_EQ
<span style="white-space:pre"> </span>#ifdef _MSC_VER
<span style="white-space:pre"> </span>CHECK_EQ(_mkdir(source.c_str()),0)<<”mkdir”<<source<<”failed”;
<span style="white-space:pre"> </span>#else
<span style="white-space:pre"> </span>CHECK_EQ(mkdir(source.c_str(),0744),0)<<”mkidr”<<source<<”failed”;
<span style="white-space:pre"> </span>#endif
4)编译caffe-master\src\proto下的文件
5)其他错误
convert_imageset.cpp:snprintf改为_snprintf,前面加 #include<stdio.h>
extract_features.cpp:shared_ptr用boost::限定,因为现在std也加入了该指针,会造成名称的不确定性错误
生成
将caffe-master\tools下的一个文件作为工程main文件即可生成相应的exe
如:将caffe.cpp作为main.cpp,可以生成caffe.exe,该程序集成了 train,test,device_query,time 4个主要功能
附一张训练mnist的截图:
参考资料
[1] windows+caffe+vs2013+cuda6.5配置记录
[2] VS2013配置Caffe卷积神经网络工具(64位Windows 7)——建立工程
更新
windows配置caffe还是用happynear的版本吧,一步到位,还支持matlab和python接口