MatConvNet主页上的toolbox已经进行了多次更新,按照toolbox主页上提供的编译方法已经可以直接在windows上进行编译了,无需按照博文下面这么复杂的步骤了。
最近修改成了一个可以直接通过Matlab编译的Windows端的CPU版本,就不需要下面这么复杂的编译步骤了,里面已经包含了编译好的mexw64的动态链接文件,可以先尝试是否可以运行,如不能最好重新编译一下。
可以在这个链接进行下载:
vlfeat工具包发布了他们的Deep Learning
的工具包MatConvNet,由于目前只提供了Linux和Mac上可以编译通过的版本,该工具包的主页是:http://www.vlfeat.org/matconvnet/,并且提供几个已经训练好的CNN网络模型。
经过一上午的小修改,终于将这个工具包的成功的编译可以在Windows底下可以运行的CPU版本。对于GPU的版本由于需要Matlab
2014版本,而本人的Matlab是2012版本,所以就没有继续去进行编译。还有另外一个原因,对于大规模的训练CNN网络,一般都是放在Linux服务器上进行训练的,所以对于平常只使用已经训练好的模型,进行测试实验,仅使用CPU基本就已经够用了。
个人的已经修改好的VS2010的工程文件,可以在这个链接进行下载:
在使用的过程中需要对一些包含include,
lib的路径进行修改。
以及编译好的mex文件
可以直接下载拷贝到:"matconvnet-1.0-beta7\matlab\mex"目录下
如果需要自己一步一步进行实现,可以参考下面的步骤。
简单介绍一下我使用的环境是VS2010 + Matlab 2012a , 64位win7系统。
具体的编译过程如下:
1.
使用VS2010创建一个MFC的DLL工程
将"matconvnet-1.0-beta7\matlab\src"目录底下的所有文件及文件夹拷贝到我们新建的VS工程文件目录底下。
(1)在工程名字上右键,选择最下面的Properties, 点击最顶上的Configuration
Manager按钮, Active solution platform新建一个x64,并选择Release。
(2) Properties ->
Configuration Properties -> General -> Target Extension改为
.mexw64
(3) Properties ->
Configuration Properties -> C/C++ -> Additional Include
Directories添加
$(matlabroot)\extern\include
其中$(matlabroot)是你电脑上matlab的安装路径
可以在电脑的环境变量中新建一个matlabroot变量,指向matlab的安装目录
(4)Properties ->
Configuration Properties -> Linker -> Additional
Dependencies中添加
$(matlabroot)\extern\lib\win64\microsoft\libmx.lib
$(matlabroot)\extern\lib\win64\microsoft\libmex.lib
$(matlabroot)\extern\lib\win64\microsoft\libmat.lib
$(matlabroot)\extern\lib\win64\microsoft\libmwblas.lib
(5)点击Source目录下的
*.def文件,
EXPORTS 改为 EXPORTS mexFunction
2.
编译vl_nnconv.cu ,
vl_nnnormalize.cu
, vl_nnpool.cu
对于这三个文件,采用单独的方式一个一个进行编译。
首先编译 vl_nnconv.cu, Source Files上右键 Add -> Existing Items 添加
vl_nnconv.cu,后缀名改为.cpp,
并将Project的名字改为vl_nnconv。
其次是编译 vl_nnnormalize.cu, Source Files上右键 Add
-> Existing Items 添加 vl_nnnormalize.cu,后缀名改为.cpp,
vl_nnconv.cpp上右键 Remove, 并将Project的名字改为vl_nnnormalize。
最后是编译vl_nnpool.cu, Source Files上右键 Add -> Existing Items
添加vl_nnpool.cu,后缀名改为.cpp,vl_nnnormalize.cpp上右键
Remove, 并将Project的名字改为vl_nnpool。
编译过程中出现的错误:
(1). 对于bits文件夹里面的每一个cpp文件,记得在开始的部分加上#include
"stdafx.h"
(2).
(3). 对于bits\normalize.cpp(352): error C2219:
syntax error : type qualifier must be after
'*',直接将restrict移动动*之后。
3.
编译vl_imreadjpeg
最后是编译vl_imreadjpeg.c这个文件,首先将MFC
DLL的工程的名字重命名为“vl_imreadjpeg",并将vl_imreadjpeg.c的后缀名改为.cpp, 并添加
#include "stdafx.h"
需要libjpeg和pthread的支持
(1)对于libjpeg我是直接拷贝了opencv中的libjpeg的里面的所有文件,链接:http://pan.baidu.com/s/1o6LpSAA 密码:bvng
将整个文件夹拷贝到整个工程的文件目录底下,VS的工程上右键 Add -> New
Filter 输入(libjpeg), 然后在libjpeg上右键 Add ->
Existing Item将libjpeg文件底下的所有文件都添加进来,但需要Remove掉jmemansi.c这一个文件。选中libjpeg底下所有的.c文件,右键 Properties
-> C/C++ -> Precompiled Header
->Precompiled Header 选中“Not Using Precompiled
Headers”
Properties ->
Configuration Properties -> C/C++ -> Additional Include
Directories添加
D:\Toolbox\pthreads-w32-2-9-1-release\Pre-built.2\include
Properties ->
Configuration Properties -> Linker -> Additional
Dependencies中添加
D:\Toolbox\pthreads-w32-2-9-1-release\Pre-built.2\lib\x64\pthreadVC2.lib
将蓝色部分改为对应的目录。
在编译的过程中可能会出现的一些错误及修改方法。
(1) 对于错误>bits\pooling.cpp(52): error C2589: '(' : illegal
token on right side of '::'
,主要是有std::max与系统中max宏冲突,将std::max加上括号(std::max)。
以及文件中的std::min改为(std::min)。
(2) >vl_imreadjpeg.cpp(157): error C3861: 'snprintf': identifier
not found, 将snprintf改为_snprintf
(3) >vl_imreadjpeg.cpp(325): error C2440: '=' : cannot
convert from 'void *' to 'Reader *',
readers[r] = malloc(sizeof(Reader)) ;
在malloc加上相应的指针类型强制转换。readers[r] = (Reader*)malloc(sizeof(Reader)) ;
对于几处相应的错误采用同样的处理方法。
(4) >vl_imreadjpeg.cpp(211): error C2219: syntax error :
type qualifier must be after '*'
JSAMPROW __restrict scanline = scanlines[dy]
+ 3*x ;
改为 JSAMPLE FAR * __restrict scanline =
scanlines[dy] + x ;
4.
最后就是进行测试了:
(1)将编译好的vl_imreadjpeg.mexw64, vl_imreadjpeg.mexw64,
vl_nnnormalize.mexw64, vl_nnpool.mexw64复制到“matconvnet-1.0-beta7\matlab\mex"目录底下
(2) 进入toolbox的matlab目录,运行vl_setupnn.m, 然后再输入vl_test_nnlayers命令如果可以正确运行那么就说明编译成功。
(3)在"examples"目录下运行“cnn_imagenet_minimal.m”,会自动下载VGG实验室已经训练好的一个模型,下载过程可能需要一段时间。
测试这张图片“pepper.png”,可以看到图片上的输出结果“Bell Pepper, Score
0.704”
对于其他更加具体的使用,请参考“example”目录的例子,以及工具包的主页的参考手册。