SiameseFC: Luca Bertinetto, Jack Valmadre, João F. Henriques, Andrea Vedaldi, Philip H.S. Torr. "Fully-Convolutional Siamese Networks for Object Tracking." ECCV workshop (2016).
吴毅老师的【OTB benchmark】,只能在windows下运行,mac和linux无缘咯。
我已经尽我所能写的尽量详细了。
相关下载
将孪生网络用于跟踪,2016年发表在ECCV上的文章。
项目主页在这里。论文下载在这里。
GitHub源码下载
OTB benchmark下载链接,所需要的测试序列也从这个网站上下载。
下载算法源码
- 从Github上将整个算法克隆下来,按照github上这部分对源码进行修改。安装需要的环境。
Tracking only
注意到需要的环境了嘛!!!
- GPU
- CUDA drivers
- cuDNN
- Matlab
- MatCovNet(v1.0-beta20)
要注意版本匹配的问题: - 通过在matlab中输入gpuDevice()的输出,可以了解自己GPU的情况,下载对应的cuda版本。
- cuda版本对应了matlab版本:
我的配置是matlab R2016a + Visual Studio 2013 + cuda7.5 + cuDnn v5.1.这个版本是完全对应正确的,可以工作。
cuda-matlab版本对应
matlab官方文件也指出可以使用更新版本的cuda,需要自己配置。
-
将下载好的源码文件夹改名为SiamFC,放到【benchmark v_1.0】-->【trackers】
SiamFC放置位置 -
下载matconvnet v_1.0-beta20后,解压为matconvnet放到SiamFC,下载的模型【2016-8-17.net.mat】放到【SiamFC】-->【net
s】下。
模型位置
MATLAB编译
matlab中输入命令顺序在下面:
>>> cd SiamFC
>>> adddpath matlab
>>> mex -setup C++
>>> vl_compilenn('enableGpu',true)
matlab里面会有这样的显示:
mex编译
我在运行第四步命令之后出现下面的警告:
警告
不过没有关系,编译继续,而且最后还会成功的!只要版本对了。我的GPU很弱,GEFORCE 710M 笔记本。所以得用低版本的cuda。
运行SiamFC需要做的修改
一、 按照github上作者的要求改之后,再做下面的修改。
将【SiamFC】-->【tracking】下的run_tracker.m文件复制到【SiamFC】下,并重命名为SiamFC.m。
修改后SiamFC.m中的内容:
function results = run_SiamFC(seq, res_path, bSaveImage)
% RUN_TRACKER is the external function of the tracker - does initialization and calls tracker.m
addpath(genpath('./tracking/'));
startup;
%% Parameters that should have no effect on the result.
params.video = seq.path;
params.visualization = false;
params.gpus = 1;
%% Parameters that should be recorded.
% params.foo = 'blah';
if bSaveImage
imwrite(frame2im(getframe(gcf)),[res_path num2str(frame) '.jpg']);
end
%% Call the main tracking function
bboxes = tracker(params);
seq.res = bboxes;
results.res = bboxes;
result.type = 'rect';
end
上面文件的文件最后四行是为了让benchmark找到tracker的结果。
第二个修改文件,tracking文件夹下的tracker.m的第55行
[imgFiles, targetPosition, targetSize] = load_video_info( p.video);
第三个需要修改的文件:load_video_info.m
% -------------------------------------------------------------------------------------------------
function [imgs, pos, target_sz] = load_video_info(video_path)
%LOAD_VOT_VIDEO_INFO
% Loads all the relevant information for the video in the given path:
% the list of image files (cell array of strings), initial position
% (1x2), target size (1x2), the ground truth information for precision
% calculations (Nx4, for N frames), and the path where the images are
% located. The ordering of coordinates and sizes is always [y, x].
%
% Joao F. Henriques, 2014
% http://www.isr.uc.pt/~henriques/
% -------------------------------------------------------------------------------------------------
%full path to the video's files
% panchen
% if base_path(end) ~= '/' && base_path(end) ~= '\',
% base_path(end+1) = '/';
% end
% video_path = [base_path video];
%load ground truth from text file
ground_truth = csvread([video_path 'groundtruth_rect.txt']);
region = ground_truth(1, :);
[cx, cy, w, h] = get_axis_aligned_BB(region);
pos = [cy cx]; % centre of the bounding box
target_sz = [h w];
%load all jpg files in the folder
img_files = dir([video_path '*.jpg']);
assert(~isempty(img_files), 'No image files to load.')
img_files = sort({img_files.name});
%eliminate frame 0 if it exists, since frames should only start at 1
img_files(strcmp('00000000.jpg', img_files)) = [];
img_files = strcat(video_path, img_files);
% read all frames at once
imgs = vl_imreadjpeg(img_files,'numThreads', 12);
end
需要将下载好的数据中的groundtruth_rect.txt文件放到/img文件夹下面。
这个视频序列比较特别,CarScale视频序列的groundtruth_rect文件需要注意,SiamFC读不出来,需要将文件里的tab转换为‘,’。
数据准备,benckmark中的修改
utils文件夹下面有两个文件需要修改,关于使用的tracker和测试序列。
- configSeqs.m
- configTrackers.m
一、configSeqs.m
设置测试序列的访问路径,绝对路径。
function seqs=configSeqs
seqIVT={struct('name','Skater','path','C:\benchmark\Skater\img\','startFrame',1,'endFrame',160,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
struct('name','Jump','path','C:\benchmark\Jump\img\','startFrame',1,'endFrame',122,'nz',4,'ext','jpg','init_rect', [0,0,0,0])};
seqs = seqIVT;
注意 startFrame和 endFrame都要作相应修改。
二、configTrackers.m
function trackers=configTrackers
trackers1={struct('name','SiamFC','namePaper','SiamFC')};
trackers = trackers1
到这里应该就差不多了,我就可以成功运行了。现在记录下来觉得好像没改什么东西,但是真的很辛苦的,都是一点点debug,看变量数据结构,一步步的运行才知道了问题出在哪里,真的是各种问题!一定要好好记录一下,如果能再对需要的人有帮助就好啦。
网友评论