最近在研究SiamRPN,究其根本,CNN依托于AlexNet骨架,所以花些功夫研究以下SiamFC代码,将其阶段性复现。
关于GPU显卡配置、cudn和cudnn安装可以参考Ubuntu16.0下安装显卡驱动、 cuda10.0 、cudnn的活生生案例
[可参考官方教程](http://www.vlfeat.org/matconvnet/)
%% 编译安装MatConvNet工具箱
mex -setup,mex -setup C++ %绑定C++编译器
% 将matlab工作路径切换到./MatConvNet,在该工作空间下输入:
addpath matlab %添加搜索路径
vl_compilenn %编译工具箱-一般编译(使用cpu)(注:一般在这行会报错,可用以下代码替换:vl_compilenn('EnableImreadJpeg',false))
vl_setupnn %启动工具箱
% 以下两种方式二选一即可
vl_compilenn('enableGpu',true) %使用cuda编译,编译速度一般
vl_compilenn('enableGpu',true,'cudaRoot','/usr/local/cuda-10.0','cudaMethod','nvcc','enableCudnn',true,'cudnnRoot','local/cudnn5') %使用cudnn编译(具体相应的路径名根据自身实际情况进行设置)
%% 测试
vl_testnn %测试cpu编译成功
vl_testnn('gpu',true) %测试GPU编译成功
注意:以上对MatConvNet的配置均在MatConvNet所在的工作目录下进行
run_tracker('vot15_bag',1)
注意:对于一些关键路径的修改,可根据报错提示进行相对应的修改,关于stats.mat文件,可以参考SiamFCdemo运行所需stats.mat文件,下载后放到相对应的文件路径即可;最后运行以上一句代码即可。
[2019/3/2 写]
看到一个相对比较良心的代码复现博文[论文复现] Fully-Convolutional Siamese Networks for Object Tracking可作为参考;
[2019/3/3 更]
MatConvNet是什么;
MatConvNet函数文档;
[2019/3/4 更]
突然警醒到:深度学习的关键所在在于神经网络的训练过程,你所搭建的自己的architecture一旦形成,需要利用相应的数据集进行训练,得到真正属于自己的architecture的权重参数,这才是end to end的真谛吧。
所以就有了接下来的工作,balabalabala…
关于配置问题,参见上面的[Training only]部分,在这里需要指出的是Matconvnet的版本问题,本人用的是v1.0-beta25版本,而Siamfc原作者当初用的是v1.0-beta20版本(Matconvnet工具箱下载链接),在tracking阶段,两者均可,但是,在训练阶段,可能由于版本的原因,会弹出一些很痛心的bug…诸如此图(ps:如果你到了这一步,你真的就离成功不远了,我真的是费了九牛二虎之力才到了这一步,奈何我是如此之菜…)
关于解决方案,先别着急,等到了这一步自会说;
上图为step-by-step instructions步骤;【1】中链接为ILSVRC官网下载链接,但是需要注册,如果对官网所给的数据集并不是了解的话,建议使用这个直截了当的链接——ILSVRC2015_VID数据集下载链接,直接点击下载即可,一共89.6G;
【3】中要求做的是将VID中的validation和train数据集合并为一个,并将相应的5个文件夹的名称改为a,b,c,d,e;
【4】中按要求运行即可,
【5】中要求对每个视频的每一帧图片进行相应的处理(合并了一些信息),这一步骤耗费了大约一周的时间,持续不断的运行,5个matlab并行处理,全是泪…
【6】中对图片中的object进行操作,但是按要求运行并没有什么卵用,空的,不知道哪里出了问题,所以基于【7】以上步骤做的工作全部作废,一周的运行化为泡影…
所以,作此总结:
使用谷歌浏览器直接下载imdb_video.mat即可,给出的【4-7】的操作只为了得到一个它,所以直接下载它即可;
【8】中搞不懂它在做些什么;
【9】中需要做的是复制ILSVRC2015文件夹的tree结构供后续【10】中作crop得到的图片存储用,按照给定的要求做即可,这里以Ubuntu为例(过程可作参考,结合自身理解后期记录,可能会有错误,但能够有些帮助,知道相应的指令能够完成怎样的操作):
#将当前路径下的文件夹的tree结构存储到dirs.txt
find . -type d >dirs.txt
#新建一个文件夹ILSVRC2015_
mkdir ILSVRC2015_
cd ILSVRC2015_ | cp ../ILSVRC2015/dirs.txt ./
# 从dirs.txt产生相应的目录
xargs mkdir -p
【10】中运行save_crops.m;这里虽然他那样讲,但是实际并不能够达到效果,会出现一些bugs,以下可以作为参考:
% load imdb_video.mat
imdb_video = load('/home/db/Subject/SiamFC/v1/siamese-fc/cfnet_imdb_video_2016-10.mat')
% run save_crop
% -imdb_video这里用imdb_video.imdb_video,你查看导入的imdb_video即能明白为啥这么做;
% v_1:1;v_end:4417;一共4417组VID,对其全部进行crop操作
% root_original:你存放ILSVRC2015的路径;root_crops:crop后存放的图片路径
%save_crops(imdb_video,v_1,v_end, root_original, root_crops)
save_crops(imdb_video.imdb_video,1,4417,'/home/db/Subject/SiamFC/v1/siamese-fc/ILSVRC2015', '/media/db/ZZXin EXT/ILSVRC2015_')
【11】中可以按照要求做,忘记自己run的还是直接下载的,建议还是用原作者给的吧
至此,对图片的原始数据预处理工作全部完成;
%% 编译安装MatConvNet工具箱
mex -setup,mex -setup C++ %绑定C++编译器
% 将matlab工作路径切换到./MatConvNet,在该工作空间下输入:
addpath matlab %添加搜索路径
vl_compilenn %编译工具箱-一般编译(使用cpu)(注:一般在这行会报错,可用以下代码替换:vl_compilenn('EnableImreadJpeg',false))
vl_setupnn %启动工具箱
% 以下两种方式二选一即可
vl_compilenn('enableGpu',true) %使用cuda编译,编译速度一般
vl_compilenn('enableGpu',true,'cudaRoot','/usr/local/cuda-10.0','cudaMethod','nvcc','enableCudnn',true,'cudnnRoot','local/cudnn5') %使用cudnn编译(具体相应的路径名根据自身实际情况进行设置)
%% 测试
vl_testnn %测试cpu编译成功
vl_testnn('gpu',true) %测试GPU编译成功
注:该脚本的运行路径是在Matconvnet文件夹下;
% 这里是到crop后的ILSVRC2015_crops的路径,要涵盖全,一直到train/下
% opts.rootDataDir = '/path/to/ILSVRC2015_crops/Data/VID/train/';
opts.rootDataDir = '/media/db/ZZXin EXT/ILSVRC2015_/Data/VID/train';
% 一直到imdb_video.mat的路径
%opts.imdbVideoPath = '/path/to/imdb_video.mat';
opts.imdbVideoPath = '/home/db/Subject/SiamFC/v1/siamese-fc/cfnet_imdb_video_2016-10.mat';
% 一直到imageStats.mat的路径
%opts.imageStatsPath = '/path/to/imageStats.mat';
opts.imageStatsPath = '/home/db/Subject/SiamFC/v1/siamese-fc/cfnet_ILSVRC2015.stats.mat';
# 运行training主程序
run_experiment(imdb_video.imdb_video)
至此,大工告成了么?
并没有,还记得最初的那个bug么?
解决方案
将BatchNorm.m中的第32行的参数‘moments’整行删除掉,并将第33行% obj.moments=[ ]注释掉;
至此,完工。
[2019/4/29 写]