作文本檢測這個方向的同窗應該都知道 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