spams----稀疏建模工具箱在MATLAB下的安装编译

SPAMS 是一个为解决各种稀疏估计问题的开源优化工具箱,http://spamsdevel.gforge.inria.fr/index.html ,简单介绍下功能:字典学习与矩阵分解,解决稀疏分解,解决结构化稀疏分解问题。

由于这个工具箱给出的是c++代码,所以需要编译才能最终使用。也正因为如此,这个工具箱实现的算法在执行时是很快的,而且可以移植到各种平台使用。这个工具箱网上很多人有提到,都说编译时出现问题,我的电脑也不例外,下面稍微总结一下它的安装及使用情况。

我的电脑环境:win7 64位,matlab2012b,VS2013

对于安装,下载安装包,解压到一个文件夹,如下图,解压后有不少文件、文件夹,其中的doc_spams.pdf是一个详尽的使用说明,介绍了各个函数接口如何使用(每个函数都有一个测试文件供测试,在test_release文件夹中)。在HOW_TO_INSTALL.txt中有简单说明,啰嗦了半天就是说使用compile.m进行文件编译,对于不同的计算机,配置都在这个文件中调整,所以使用matlab打开compile.m文件前130行是用来做配置的,作者也很贴心啊,第131、132行有如下提示,意思就是130行以后,不懂不要乱动。

第一步:导入matlab—set path 
执行命令:mex -setup 

第二步:修改compile.m

以下是截图,大家对应自己的来。


保存compile.m文件。

按上面的过程配置好后,运行compile.m,执行编译。编译过程顺利完成,那恭喜你有一台好电脑;如果出错,也恭喜你,和我的情况一样。我的出错提示是说mexStochasticProx.cpp文件编译时失败,然后是给出失败的各种错误用法。对此网上找了半天没找到好的解决办法,所以折中的办法就是不编译这些不知道哪里出问题的文件,其实这些文件也不常用(因为对我而言,根本不知道这个函数是干啥的)。个人感觉这个工具箱好的地方也在此,一个文件对应一个函数接口,一个文件不编译,对其他函数接口无影响(貌似是这样)。如何不编译呢?就是在compile.m中找到相应行注释掉,如我的电脑上mexStochasticProx.cpp编译失败,那就把它注释掉。另外还出错了这三个,也注释掉。

%     '-I./linalg/ -I./prox/ prox/mex/mexGroupStructOfString.cpp',

%     '-I./linalg/ -I./prox/ prox/mex/mexReadGroupStruct.cpp',

%    '-I./linalg/ -I./prox/ prox/mex/mexSimpleGroupTree.cpp',

编译完没再出错,就可以使用了。 另外,真正使用时,调用工具箱函数可能会报错,说函数无法执行之类,这是因为,compile.m文件的最后把src_release文件夹中各函数接口的帮助文件(与函数同名,里面全是注释,作为帮助信息)也拷贝到了build文件夹中,由于.m文件和.mexw32同名,matlab可能去执行.m文件去了(一般是优先执行.mexw32文件的,可能跟matlab版本有关,执行优先级不同)。所以报错就可以把build文件夹中与.mexw32同名的.m文件直接删掉,没报则不用管。

测试

% test_TrainDL_GJ.m:测试mexTrainDL函数
clc
clear
close all
I=double(imread('./data/lena.png'))/255;
I = imresize(I, 0.25); % 图片太大,运行时间过长,所以缩放一下
X=im2col(I,[8 8],'sliding'); % extract 8 x 8 patches
X=X-repmat(mean(X),[size(X,1) 1]); % 减均值
X=X ./ repmat(sqrt(sum(X.^2)),[size(X,1) 1]); % 标准化
param.K=256;  % learns a dictionary with 100 elements
param.lambda=0.15;
param.numThreads=-1; % number of threads
param.batchsize=400;
param.verbose=false;
param.iter=100;  % 迭代次数,原始是1000,效果好但时间过长,这里减为100
tic
D = mexTrainDL(X,param);
t=toc;
fprintf('time of computation for Dictionary Learning: %f\n',t);
fprintf('Evaluating cost function...\n');
alpha=mexLasso(X,D,param);
R=mean(0.5*sum((X-D*alpha).^2)+param.lambda*sum(abs(alpha)));
ImD=displayPatches(D);
imagesc(ImD);
colormap('gray');
fprintf('objective function: %f\n',R);
此测试又是对lena做处理,实现字典学习,结果如下





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章