论文Sparselet Models for Efficient Multiclass Object Detection的源码环境配置
声明:论文对应源码的运行环境为Linux,本文的配置是在Linux下,中文运行环境应该也行,还有待研究试验。
论文对应的源码下载地址为:https://github.com/rksltnl/sparselet-release1
除此之外,还需要下载INRIA的spams-matlab,下载地址为:http://spams-devel.gforge.inria.fr/downloads.html
选择V2.3的Matlab版本,高级版本我试的时候用不了,其下载地址为:http://spams-devel.gforge.inria.fr/hitcounter2.php?file=32609/spams-matlab-v2.3-svn2013-06-20.tar.gz,还需要下载安装的有Intel的编译器,我已经下载了一个月的试用版,下载地址为:http://pan.baidu.com/s/1jGEbLqA,2013年的,其对应的Matlab版本需要是2014年的
环境配置:
1、将解压后的源码和spams-matlab文件放到同一个目录下,打开Matlab,进入到spams-matlab目录,运行compile命令,无错误的编译完成
2、解压Intel的编译器,安装,安装过程很简单,顺序执行即可,在Intel的编译器安装完成之后,需要配置运行环境变量,在当前用户目录下打开.bashrc,即在~/目录下打开.bashrc文件,加入
source /opt/intel/composerxe/bin/compilervars.sh intel64
语句,source 目录 intel64中间的目录需要根据intel编译器安装目录调节,主要是找bin目录下的compilervars.sh文件,否则按照源码中的readme文件过程中运行python语句会有错误,配置后重新打开shell,
输入export命令,发现LD_LIBRARY_PATH,如图,就成功了,否则,可能需要重启系统
3、修改源码下的sparselets文件夹下的compile_blas_singleTH.py文件,修改
<span style="font-size:18px;"><span style="font-size:18px;">mex_filename = filename + '_singleTH.' + "mexa64"</span></span>
为:
<span style="font-size:18px;"><span style="font-size:18px;">mex_filename = filename + "<span style="font-family:Helvetica,Tahoma,Arial,sans-serif;">.</span>mexa64"</span></span>
修改<span style="font-size:18px;"><span style="font-size:18px;">matlab_path = "/Applications/MATLAB_R2011b.app"
mkl_path = "/Users/song/Documents/Workspace/intel64"<span style="font-family:Helvetica,Tahoma,Arial,sans-serif;">
</span></span></span>
将这两个目录修改为自己的安装目录,例如我的是
<span style="font-size:18px;"><span style="font-size:18px;">matlab_path = "/usr/local/MATLAB/R2014b"
mkl_path = "/opt/intel/composer_xe_2013/mkl"</span></span>
matlab_path是你的Matlab安装之后的目录,mkl_path是Intel编译器安装后的mkl的目录,我们主要是使用intel的MKL库
修改link_string语句,将其中的libmkl_intel_lp64.a,libmkl_sequential.a,libmkl_core.a前的目录都改为自己的对应目录,本文的系统都指64位系统,32位系统可能需要对应的修改,自己试一下
<span style="font-size:18px;"><span style="font-size:18px;">link_string = "g++ -O -pthread -shared -o " + "\"" + mex_filename + "\" " + \
obj_filename + " /Users/song/Documents/Workspace/intel64/libmkl_intel_lp64.a"+\
" /Users/song/Documents/Workspace/intel64/libmkl_sequential.a /Users/song/Documents/Workspace/intel64/libmkl_core.a"+\
" -lpthread"+\
" -L/Applications/MATLAB_R2011b.app/bin/maci64 -lmx -lmex -lmat -lm -lgomp"
</span></span>
修改后的我自己的是:
<span style="font-size:18px;"><span style="font-size:18px;">link_string = "g++ -O -pthread -shared -o " + "\"" + mex_filename + "\" " + \
obj_filename + " /opt/intel/composer_xe_2013.5.192/mkl/lib/intel64/libmkl_intel_lp64.a"+\
" /opt/intel/composer_xe_2013.5.192/mkl/lib/intel64/libmkl_sequential.a"+\
" /opt/intel/composer_xe_2013.5.192/mkl/lib/intel64/libmkl_core.a"+\
" -lpthread"+\
" -L/usr/local/MATLAB/R2014b/bin/glnxa64 -lmx -lmex -lmat -lm -lgomp"
</span></span>
对于matrix_sparse_ATB_csc_parsed_float.cc也需要进行修改,因为其中的mkl_scscmm函数与intel2013版的MKL库中的函数写法不一致,这是版本问题,将
<span style="font-size:18px;">extern "C"{
void mkl_scscmm_(char* chn, ptrdiff_t* m, ptrdiff_t* n, ptrdiff_t* k, \
float* alpha, char* matdescra, float* val, int* indx, \
int* pntrb, int* pntre, \
float* b, ptrdiff_t* ldb, float* beta, float* c, ptrdiff_t* ldc);
};</span>
改为
<span style="font-size:18px;">extern "C"{
void mkl_scscmm(char *transa, MKL_INT *m, MKL_INT *n, MKL_INT *k, float *alpha, \
char *matdescra, float *val, MKL_INT *indx, MKL_INT *pntrb, \
MKL_INT *pntre, float *b, MKL_INT *ldb, float *beta, float *c, MKL_INT *ldc);
};</span>
将
<span style="font-size:18px;"> ptrdiff_t m = (ptrdiff_t)A_dims[0];
ptrdiff_t k = (ptrdiff_t)A_dims[1];
ptrdiff_t n = (ptrdiff_t)mxGetM(prhs[4]);</span>
改为
<span style="font-size:18px;">int m = (ptrdiff_t)A_dims[0];
int k = (ptrdiff_t)A_dims[1];
int n = (ptrdiff_t)mxGetM(prhs[4]);</span>
在#include下加上
<span style="font-size:18px;">#ifndef MKL_INT
#define MKL_INT int
#endif</span>
将
mkl_scscmm_(chn, &m, &n, &k, &one, matdescra, A_val, ja, &ia[0], &ia[1], \
B, &n, &zero, C_out, &n);
改为
mkl_scscmm(chn, &m, &n, &k, &one, matdescra, A_val, ja, &ia[0], &ia[1], \
B, &n, &zero, C_out, &n);
完成后,在shell下进入sparselets目录输入命令:
<span style="font-size:18px;"><span style="font-size:18px;">进入到的目录:ltc@ltcpc:~/sparselets/sparselet-release1-master/sparselets$
<span style="font-family:Helvetica,Tahoma,Arial,sans-serif;">命令:</span> python compile_blas_singleTH.py matrix_sparse_ATB_csc_parsed_float.cc
</span></span>
运行后没报错误,有warning没事,linux系统中需要安装了python,成功后可在sparselets目录下看到matrix_sparse_ATB_csc_parsed_float.mexa64文件
4、进入到源码目录,运行compile,在运行compile文件之前,需要将compile.m中
<span style="font-size:18px;"><span style="font-size:18px;"> eval([mexcmd ' gdetect/fconv_sse_single_thread.cc -o fconv']);
eval([mexcmd ' gdetect/fconv_var_dim.cc -o fconv_var_dim']);</span></span>
改为<span style="font-size:18px;"><span style="font-size:18px;"> eval([mexcmd ' gdetect/fconv_sse_single_thread.cc -output fconv']);
eval([mexcmd ' gdetect/fconv_var_dim.cc -output fconv_var_dim']);<span style="font-family:Helvetica,Tahoma,Arial,sans-serif;">
</span></span></span>
主要是将-o改为-output,将
<span style="font-size:18px;"><span style="font-size:18px;"> eval([mexcmd ' gdetect/post_pad_floatin_doubleout.cc']);</span></span>
改为
<span style="font-size:18px;"><span style="font-size:18px;"> eval([mexcmd ' gdetect/post_pad.cc']);</span></span>
运行compile,无报错
5、修改voc_config.m文件,将BASE_DIR改为自己的源码的目录
<span style="font-size:18px;"><span style="font-size:18px;">BASE_DIR = '/home/ltc/sparselets/sparselet-release1-master';</span></span>
6、运行demo_detection之前,先运行startup,然后再运行demo_detection,运行无报错,运行成功。