主要内容参考的 windows+caffe+vs2013+cuda6.5配置记录 ,对其中的一些笔误做了修正,遇到了些别的错误,一并解决
原文使用的安装包,很方便:boost_1.56_0-msvc-12.0-64.exe
原文提供了一个编译好的包,所有东西一并解决:3rdparty
想起了前两天用cmake一个一个编译的苦逼样。。。给大神们跪一个
虽然我显卡不支持,但还是需要安装,不然编译不通过
找了个cuda6.5,官方推荐用更新的cuda7.0,没有测试
手头有个OpenCV2.4.1的包,打开一看,仅支持到vc10
只好下了个OpenCV2.4.9
首先当然是下载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包
建立一个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
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>#endif4. 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>#endif2)编译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 __popcnt3. 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>#endif4)编译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接口