背景说明:前段时间电脑刚装了GPU,最近想起来之前是用CPU跑的HCF代码,想试试使用GPU运行的效果,结果遇到很多问题,经过各种努力和尝试,终于跑通了(PS:我下载的HCF代码是不带尺度估计的作者最早公布的代码)。
一、代码下载:
https://github.com/jbhuang0604/CF2/tree/4b895b516b2d73fc83174439729d2157902c9d63,下载完解压。
二、下载预训练模型:
http://www.vlfeat.org/matconvnet/models/imagenet-vgg-verydeep-19.mat,这个预训练模型大概有500多M,下载完成把文件拷贝到/CF2/model中。
三、使用CPU编译matconvnet:
直接运行demo.m,CPU编译matconvnet一般不会出什么问题,但你可能会遇到以下错误:
引用了不存在的字段 'filters'。
出错 vl_simplenn (line 153)
res(i+1).x = vl_nnconv(res(i).x, l.filters, l.biases, 'pad', l.pad, 'stride', l.stride) ;
...
经过调试后发现 l 这个结构体里面确实没有filters和biases这两个字段,而是用weights来表示的,l.weights{1}相当于l.filters,l.weight{2}相当于l.biases,所以解决方案是:把l.filters改成l.weights{1},l.biases改成l.weights{2}。
四、在CPU上运行HCF代码:
由于HCF代码默认是使用CPU跑的,所以无需更改参数,直接运行run_tracker.m即可显示跟踪界面窗口。至此,成功使用CPU运行HCF代码。
五、使用GPU编译matconvnet:
先介绍下我的运行环境:win10+matlab2018a+vs2015+cuda9.1。
既然要用GPU跑,肯定先把matconvnet用GPU编译一下,需要在matlab命令行窗口执行以下命令:
vl_compilenn('enableGpu', true, 'cudaRoot', 'C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.1');
等待十几秒后,又报了一个错:
错误使用 mex
'D:\matlab\workspace\test\CF2\external\matconvnet\matlab\mex\vl_nnconv.mexw64' 使用了 '-R2018a' 进行编译并与
'-R2017b' 链接在一起。 有关详细信息,请参阅 MEX 文件使用了一个 API 进行编译并与另一个 API 链接在一起。
我估计HCF代码中自带的matconvnet版本比较旧,而网上大部分解决方案是针对版本比较新的matconvnet的,所以不太适用。我的解决方案是:
修改代码179行:
mex_opts = {'-largeArrayDims'};
改为:
mex_opts = {'-lmwblas'};
再次执行上面的GPU编译命令即可成功编译。
五、在GPU上运行HCF代码:
运行run_tracker.m之前,先修改run_tracker.m中第31行的enableGPU的默认值,将false改为true,然后运行run_tracker.m。
这时候你会发现还是报错,主要错误如下:
错误使用 vl_nnconv
DATA and FILTERS are not both CPU or GPU arrays.
...
解决方案:将vl_simplenn.m中第149行l = net.layers{i} ;的后面加入以下代码:
if gpuMode && strcmp(l.type, 'conv')
l.weights{1} = gpuArray(l.weights{1});
l.weights{2} = gpuArray(l.weights{2});
end
就像这样:
这时再运行run_tracker.m就可以看到熟悉的跟踪界面窗口啦!