deep features for text spotting 在linux,windows上使用

作文本檢測這個方向的同窗應該都知道 deep features for text spotting 這篇ECCV14的文章。linux

用的是Matconvnet這個是深度學習框架來作文本檢測,同時他還提供了代碼:  eccv2014_textspottinggit

不過這個代碼裏的Matconvnet不一樣於原版本Matconvnet,原版本的內容比較全,而這個repository裏的算是閹割版,同時還新加入了幾個cpp,cu文件。。。github

不幸的是,新加入的幾個文件只在mac上有編譯好的mex文件,linux上,windows上都須要本身編譯。接下來就講講如何在linux和windows下編譯這幾個cpp,cu的mex文件。windows

 


 linux 上的編譯方法已經在repository中提到框架

1. Edit matconvnet/Makefile to ensure MEX points to your matlab mex binary. Optinally ENABLE_GPU.
2. cd matconvnet/ && make

已經提供了編譯的模板,主要是要修改好matconvnet/Makefile_Linux中幾個變量的路徑,就能夠直接編譯了。學習

好比 我是Ubuntu上裝的CUDA7.0就修改以下:spa

MEX ?= /usr/local/MATLAB/R2014b/bin/mex
MEXARCH = mexa64
NVCC ?= /usr/local/cuda-7.0/bin/nvcc
ENABLE_GPU = true
MEXOPTS_GPU= $(MEXOPTS) -DENABLE_GPU -L /usr/local/cuda-7.0/targets/x86_64-linux/lib -lcudart -lcublas -lcudadevrt -f matlab/src/mex_CUDA_glnxa64.sh

而後重命名Makefile_linux爲Makefile,而後 cd matconvnet/,而後 makecode

這裏提供我編譯好的 .mexa64文件,:linux_version 。     注意:我在Ubuntu下用cuda7.0編譯的,matlab版本是2014b。orm

把這些mex文件放在 matconvnet\matlab\mex下就能跑整個代碼了。blog

 

 


 linux下用仍是有點不方便,接下來主要講一下windows下的編譯

說來慚愧,原本想本身看明白makefile,而後逐個逐個編譯的,可是在不知道nvcc和mex這兩編譯器該怎麼個順序,用啥編譯參數,後來只能偷懶了。

Makefile裏面說道了,主要是編譯一下幾個文件

cpp_src:=matlab/src/bits/im2col.cpp
cpp_src+=matlab/src/bits/pooling.cpp
cpp_src+=matlab/src/bits/normalize.cpp
mex_src:=matlab/src/gconv.cu
mex_src+=matlab/src/gpool.cu
mex_src+=matlab/src/gnormalize.cu
mex_src+=matlab/src/gsepconv.cu
mex_src+=matlab/src/gsepconv2.cu
cpp_src+=matlab/src/bits/im2col_gpu.cu
cpp_src+=matlab/src/bits/pooling_gpu.cu
cpp_src+=matlab/src/bits/normalize_gpu.cu

用過通用版的Matconvnet會有記得那邊的windows編譯很方便很簡單,因此就直接用那邊的程序編譯了。

首先去下載一個通用版本的 Matconvnet : 通用版Matconvnet

而後用他提供的 matconvnet-master\matlab\vl_compilenn.m 進行編譯,修改 vl_compilenn 這個文件裏面 185來行的代碼,本來是這樣:

if opts.enableGpu, ext = 'cu' ; else ext='cpp' ; end
lib_src{end+1} = fullfile(root,'matlab','src','bits',['data.' ext]) ;
lib_src{end+1} = fullfile(root,'matlab','src','bits',['datamex.' ext]) ;
lib_src{end+1} = fullfile(root,'matlab','src','bits',['nnconv.' ext]) ;
lib_src{end+1} = fullfile(root,'matlab','src','bits',['nnfullyconnected.' ext]) ;
lib_src{end+1} = fullfile(root,'matlab','src','bits',['nnsubsample.' ext]) ;
lib_src{end+1} = fullfile(root,'matlab','src','bits',['nnpooling.' ext]) ;
lib_src{end+1} = fullfile(root,'matlab','src','bits',['nnnormalize.' ext]) ;
lib_src{end+1} = fullfile(root,'matlab','src','bits',['nnbnorm.' ext]) ;
lib_src{end+1} = fullfile(root,'matlab','src','bits',['nnbias.' ext]) ;
mex_src{end+1} = fullfile(root,'matlab','src',['vl_nnconv.' ext]) ;
mex_src{end+1} = fullfile(root,'matlab','src',['vl_nnconvt.' ext]) ;
mex_src{end+1} = fullfile(root,'matlab','src',['vl_nnpool.' ext]) ;
mex_src{end+1} = fullfile(root,'matlab','src',['vl_nnnormalize.' ext]) ;
mex_src{end+1} = fullfile(root,'matlab','src',['vl_nnbnorm.' ext]) ;

% CPU-specific files
lib_src{end+1} = fullfile(root,'matlab','src','bits','impl','im2row_cpu.cpp') ;
lib_src{end+1} = fullfile(root,'matlab','src','bits','impl','subsample_cpu.cpp') ;
lib_src{end+1} = fullfile(root,'matlab','src','bits','impl','copy_cpu.cpp') ;
lib_src{end+1} = fullfile(root,'matlab','src','bits','impl','pooling_cpu.cpp') ;
lib_src{end+1} = fullfile(root,'matlab','src','bits','impl','normalize_cpu.cpp') ;
lib_src{end+1} = fullfile(root,'matlab','src','bits','impl','bnorm_cpu.cpp') ;
lib_src{end+1} = fullfile(root,'matlab','src','bits','impl','tinythread.cpp') ;

% GPU-specific files
if opts.enableGpu
  lib_src{end+1} = fullfile(root,'matlab','src','bits','impl','im2row_gpu.cu') ;
  lib_src{end+1} = fullfile(root,'matlab','src','bits','impl','subsample_gpu.cu') ;
  lib_src{end+1} = fullfile(root,'matlab','src','bits','impl','copy_gpu.cu') ;
  lib_src{end+1} = fullfile(root,'matlab','src','bits','impl','pooling_gpu.cu') ;
  lib_src{end+1} = fullfile(root,'matlab','src','bits','impl','normalize_gpu.cu') ;
  lib_src{end+1} = fullfile(root,'matlab','src','bits','impl','bnorm_gpu.cu') ;
  lib_src{end+1} = fullfile(root,'matlab','src','bits','datacu.cu') ;
end

改爲這樣:

if opts.enableGpu, ext = 'cu' ; else ext='cpp' ; end
mex_src{end+1} = fullfile(root,'matlab','src',['gconv.' ext]) ; mex_src{end+1} = fullfile(root,'matlab','src',['gnormalize.' ext]) ; mex_src{end+1} = fullfile(root,'matlab','src',['gpool.' ext]) ; mex_src{end+1} = fullfile(root,'matlab','src',['gsepconv.' ext]) ; mex_src{end+1} = fullfile(root,'matlab','src',['gsepconv2.' ext]) % CPU-specific files lib_src{end+1} = fullfile(root,'matlab','src','bits','im2col.cpp') ; lib_src{end+1} = fullfile(root,'matlab','src','bits','pooling.cpp') ; lib_src{end+1} = fullfile(root,'matlab','src','bits','normalize.cpp') ; % GPU-specific files if opts.enableGpu   lib_src{end+1} = fullfile(root,'matlab','src','bits','im2col_gpu.cu') ;   lib_src{end+1} = fullfile(root,'matlab','src','bits','pooling_gpu.cu') ;   lib_src{end+1} = fullfile(root,'matlab','src','bits','normalize_gpu.cu') ; end

而後把 matconvnet-max-version\matlab\src\ 下 5個.cu文件 gconv.cu gnormalize.cu gpool.cu gsepconv.cu gsepconv2.cu ,還有 matconvnet-max-version\matlab\src\bits下的全部文件(除了mexutils.h),分別拷貝到拷貝到 matconvnet-master\matlab\src\ 和 matconvnet-master\matlab\src\bits下。

把vl_compilenn裏的 opts.enableImreadJpeg 改成false, 其餘不變。

matlab切換到 vl_compilenn.m根目錄,如下列參數運行 

vl_compilenn('enableGpu', true, ...
'cudaRoot', 'C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.5', ...
'cudaMethod', 'nvcc')
'cudaRoot'設置爲你windows上裝CUDA的位置就行。

 而後在mex目錄下面就有.mexw64文件了。 就這麼簡單。

這裏給我本身編譯的  : window64位cuda6.5

 環境: x64,matlab2014b,cuda 6.5

相關文章
相關標籤/搜索