因为自己不想写wrapper,怪麻烦的。所以想求助已经有的成熟的wrapper函数。
之前我是跑通过ECO的VOT测试的。
所以我就前去寻找ECO的wrapper方法,而且STRCF中的run_tracker函数是跟ECO的run_tracker师出同源。所以,想直接借鉴过来使用,但是遇到了一系列问题。
我按照ECO源代码文件夹里的VOT实现函数,照搬到STRCF路径里去,然后按照网上的配置方法配置VOT的工作空间,该路径等等可以看这个博客
但是呢,我这里在运行run_test之后的结果是这样的。
首先第一步,选择视频序列是ping通了的:
然后是后面的报错——tracker executaion interrupted:Did not recieve response
于是我就很无奈了,于是上网搜索到底是什么问题。就搜罗到了两个解决办法:
这里第2点肯定没问题,第1点也是完全按照ECO中wrapper的写法,将运行的工程路径都加完了,为什么还是不行呢?
于是我就卡在这里了!!!
现在我来断掉调试run_test看看ECO和STRCF的区别到底是什么。
前面load视频序列都没问题,现在看看load的tracker有没有问题:
先看看ECO的load的tracker:
tracker =
struct with fields:
identifier: 'ECO'
command: '"D:\MATLAB\bin\matlab.exe" -nodesktop -nosplash -wait -minimize -r "try; diary 'runtime.log'; addpath('E:\OneDrive - sjtu.edu.cn\Tracking\project\2017ECO\ECO-master/VOT_integration/benchmark_wrapper');addpath('D:\vot-toolkit-master\native\mex');benchmark_tracker_wrapper('ECO', 'VOT2016_DEEP_settings', true); catch ex; disp(getReport(ex)); end; quit;"'
directory: 'D:\vot-toolkit-master\workspace\results\ECO'
linkpath: {}
label: 'ECO'
interpreter: 'matlab'
autogenerated: 0
version: []
trax: 1
family: 'ECO'
parameters: [1×1 struct]
environment: {}
metadata: [1×1 struct]
performance: []
再看看我的改进版STRCF即SCRCF的算法tracker:
tracker =
struct with fields:
identifier: 'SCRCF'
command: '"D:\MATLAB\bin\matlab.exe" -nodesktop -nosplash -wait -minimize -r "try; diary 'runtime.log'; addpath('E:\MyPaper\Experiment\SCRCF\VOT_intergration\benchmark_wrapper');addpath('D:\vot-toolkit-master\native\mex');benchmark_tracker_wrapper('SCRCF', 'run_SCRCF', true); catch ex; disp(getReport(ex)); end; quit;"'
directory: 'D:\vot-toolkit-master\workspace\results\SCRCF'
linkpath: {}
label: 'SCRCF'
interpreter: 'matlab'
autogenerated: 0
version: []
trax: 1
family: 'SCRCF'
parameters: [1×1 struct]
environment: {}
metadata: [1×1 struct]
performance: []
对比了以下,也没啥区别
进一步单步调试,找问题出在哪,定位到:
这里是一个c函数,然后就没有办法调试了,所以再看它里面到底是怎么个原理了。
然后断点到catch,continue,记录以下matlab里面的命令行提示“:
Sequence "bag"
CLIENT: Socket opened successfully on port 9090.
CLIENT: Creating process "D:\MATLAB\bin\matlab.exe" -nodesktop -nosplash -wait -minimize -r "try; diary 'runtime.log'; addpath('E:\MyPaper\Experiment\SCRCF\VOT_intergration\benchmark_wrapper');addpath('D:\vot-toolkit-master\native\mex');benchmark_tracker_wrapper('SCRCF', 'run_SCRCF', true); catch ex; disp(getReport(ex)); end; quit;"
CLIENT: Working directory is C:\Users\14551\AppData\Local\Temp\tp03ee9529_015f_4aa0_a2d7_768bc9597405
CLIENT: Starting process
CLIENT: Setting up TraX with TCP socket connection
@@TRAX:hello "trax.image=path;" "trax.region=polygon;" "trax.version=1"
CLIENT: Tracker process ID: 6836
CLIENT: Connection with tracker established.
@@TRAX:initialize "file://D:\\vot-toolkit-master\\workspace\\sequences\\bag\\color\\00000001.jpg" "334.0200,128.3600,438.1900,188.7800,396.3900,260.8300,292.2300,200.4100"
CLIENT: Trying to stop process using protocol.
CLIENT: Flushing streams
CLIENT: Process should be terminated.
CLIENT: Stopping logger.
CLIENT: Tracker exited normally.
CLIENT: Cleaning up.
CLIENT: Stopping logger thread
CLIENT: Stopping watchdog thread
CLIENT: Trying to stop process using protocol.
CLIENT: Closing server socket.
然后继续continue,就报错了:
Tracker execution interrupted: Did not receive response.
Error using traxclient
Did not receive response.
Error in tracker_run (line 77)
data = traxclient(tracker.command, callback, ...
Error in workspace_test (line 53)
tracker_run(tracker, @callback, data);
Error in run_test (line 11)
workspace_test(tracker, sequences);
然后再次放弃ECO中的wrapper方法,然后又去尝试了之前的一个博主的方法,也是csdn上的一个博客,写的就是STRCF算法的配置,包括VOT的配置,它里面自己写了一些wrapper,虽然不完善,但是之前还是调试了一下,解决了一些bug。博客链接。
按照它的步骤将STRCF算法配置了一遍,但是还是怎么都跑不通,报错都是超时了,所以没办法跑。
但是呢,就在刚才,我放弃了跑deep STRCF,选择了run_STRCF(浅层特征的tracker),然后发现就成了。我觉得应该是我自己深度特征那块配置没有配置好,不过不管它的原因了,浅层特征的我就已经够用了。我去看看它的实现方式,看看有没有办法融合到刚刚那个ECO的wrapper里去。因为,毕竟这个博客的方法有一些局限,就是每跑一个视频序列,都得鼠标choose那个序列,就很不方便。
略微看了下,上面那个博客的wrapper在一开始就添加了所有路径,那么我效仿它来添加一次试试。
试了还是同样的错误,不行。
同时,我还在tracker_SCRCF中增加了一行博客里面也有的
tracker_trax = false;
仍然还是不行。
感觉不能再战了。
再次感谢大牛博客
直接套用他的方法,应用到自己的SCRCF算法里面去,用鼠标点把。
鼠标点还是好麻烦呀,有这个时间,我都可以再看两篇论文了。于是我分析了一遍他的wrapper,发现他的vot_wrapper中有这个函数调用
而这个vot_initialize()函数是这样的:
发现就是这个断点出惹的祸,让我每次都要去点。
但是我又不能真的断点调试把他消掉,于是就只能重新再想办法呀。所以我还是得去学习学习ECO的先进wrapper手段。
唉,还是很无力,不能调试 真的是硬伤呀。
还是继续去点鼠标,但是发现这个跑时间比较长的视频序列的时候,就time reached out然后tracker not alive了。再去找之前那个怎么修改时间的博客试试行不行。果然就行了,唉,感谢各位大牛帮忙采坑呀!让我这个菜鸡能够少走很多弯路。
同时,这个修改时间的博客也介绍了其他几个坑,都句句在理,他说让tracker跑视频数据集跑一次节约时间。
然后我再run_experiments里跑到birds1的时候,发现跑着跑着总断掉,于是再去run_test它。
然后run_test可以鼠标一直点到底,但是47帧附近目标是跟丢了的。
搞了半天也没搞明白是怎么回事,但是找到这博客vot2014教程说是可以删除不想跑的视频,所以就改了sequences里面的list。但是并没有那么简单,改完鸟用没有。完全搞不懂它的什么工作空间命令,简直复杂的一批。
正在一筹莫展之际,我想了想,为啥不关掉matlab,重新跑一次,于是那个视频成功地没有load出来。
但是这个鬼办法治标不治本呀,还是有很多视频根本跑不了呀。别慌,我好像记得之前有一篇博客说vot有的视频序列确实跑不通该怎么办。
然而找不到。
然后我又去尝试了一下ECO跑这个数据集,人家跑的就一点问题没有,你说气不气。
那再去试试原版地STRCF呢?
发现STRCF里面其他地视频也有一些这个问题,但是在坚持尝试几次以后,好像它也还是在坚持在matlab地命令行写。这么一看,好像ECO那里也经常有在命令行停顿半天才执行。难道真的是需要坚持跑吗?真的是,坚持就是胜利!
心累,真的要一直点下去吗?我真的尝试很多很多办法了,对不起!
尝试了全局变量存储路径不行,
也尝试了txt文档读取,仍然不行,
最后了,放弃!
直接手动来把!
用鼠标点了一晚上,还麻烦了女朋友帮忙点了一上午(其间我睡觉了,因为熬了通宵)。遇到一个视频序列可能就需要点几十次,点到崩溃。
于是再次尝试用txt文档读取的方案,之前是尝试在vot_wrapper.m中读取当前视频序列的名字,可以读取。然后把这个序列名作为vot_initialize.m输入给到那个video变量。但是无奈,怎么都改变不了。
然后今天想着直接去vot_initialize.m里面去读txt,发现还是没有用。发现压根就不进去vot_initialize.m里面。但是在vot_wrapper里注释vot_initialize()的调用程序就会报错。于是一不做,二不休,直接注释掉vot_initialize(),把里面的代码copy出来到vot_wrapper函数里。
然后就成功了。
但是貌似TCP连接不稳定,总是断了,然后又继续重启。不知道是不是跟读txt有关系,我在想,是不是能够重新启用global的方法呢。
这补充一下。我的txt实现是这样的,先到vot_toolkite中的一个子文件tracker_evaluate.m中去在最前面加上以下代码,目的是记录写下当前视频序列名称:
%把路径存储到电脑一个txt文档中
fid=fopen('D:\vot-toolkit-master\workspace\seqdata.txt','w');%这里的路径随便填,不够建议填到workspace里面去
fprintf(fid,'%s',sequence.name);
fclose(fid);
然后在vot_wrapper.m中读取这个视频序列名称,具体就是修改从vot_initialaize.m中copy过来的代码了,这里我把整个vot_wrapper.m的代码复制过来:
function vot_wrapper(tracker_name, runfile_name, do_cleanup)
% set this to tracker directory
tracker_path = 'C:\Users\14551\Desktop\STRCF-master';
% add paths
addpath(tracker_path);
addpath(fullfile(tracker_path, 'feature_extraction'));
addpath(fullfile(tracker_path, 'feature_extraction\networks'));
addpath(fullfile(tracker_path, 'feature_extraction\lookup_tables'));
addpath(fullfile(tracker_path, 'utils'));
addpath(fullfile(tracker_path, 'implementation'));
addpath(fullfile(tracker_path, 'external_libs'));
% addpath('D:\vot-toolkit-master\workspace');
if nargin < 3
do_cleanup = true;
end
% *************************************************************
% VOT: Always call exit command at the end to terminate Matlab!
% *************************************************************
if do_cleanup
cleanup = onCleanup(@() exit() );
else
[pathstr, ~, ~] = fileparts(mfilename('fullpath'));
cd_ind = strfind(pathstr, filesep());
pathstr = pathstr(1:cd_ind(end)-1);
cleanup = onCleanup(@() cd(pathstr));
end
try
% *************************************************************
% VOT: Set random seed to a different value every time.
% *************************************************************
RandStream.setGlobalStream(RandStream('mt19937ar', 'Seed', sum(clock)));
% **********************************
% VOT: Get initialization data
% **********************************
if ~isempty(getenv('TRAX_MEX'))
addpath(getenv('TRAX_MEX'));
end;
traxserver('setup', 'rectangle', 'path'); %'rectangle', 'polygon' 这个地方怎么都通不过为啥呢,我给你注释掉呢
%调试,找到sequence
vari = who;
for i = 1:length(vari)
disp(['已经进入wrapper,准备选取视频:' vari{i}]);
end
% %读之前存储的路径
% fid=fopen('D:\vot-toolkit-master\workspace\seqdata.txt','r');
% seqName = fgetl(fid);
% fclose(fid);
% [images, region] = vot_initialize();
% disp(['当前路径是:' images{1}]);
%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%注释掉vot_initialize,把里面的代码直接copy过来
% Add paths
setup_paths();
pathstr='E:\MyPaper\Experiment\vot-toolkit-master\sequences\';
% pathstr='D:\data_seq\';
disp(['进入vot_initialize']);
%读之前存储的路径
fid=fopen('D:\vot-toolkit-master\workspace\seqdata.txt','r');
video = fgetl(fid);
fclose(fid);
disp(['当前视频名是:' video]);
% video=choose_video(pathstr)
% read the image file paths
if ~isempty(video)
dirs=dir([pathstr video '\*.jpg']);
images = fullfile([pathstr video '\'], {dirs.name})';
end
% read the region
% 姝ゅ瀵瑰簲polygon鍧愭爣
region = dlmread([pathstr video '\groundtruth.txt']);
region = region(1,:)';
region = double(region);%这里是看的一个博客说的要确保region是double类型的。
% 姝ゅ瀵瑰簲rectangle鍧愭爣
%region = read_vot_regions([pathstr video '\groundtruth.txt']);
%region = region(1,:)';
%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5
results = cell(length(images), 1);
bb_scale = 1;
% If the provided region is a polygon ...
if numel(region) > 4
% Init with an axis aligned bounding box with correct area and center
% coordinate
cx = mean(region(1:2:end));
cy = mean(region(2:2:end));
x1 = min(region(1:2:end));
x2 = max(region(1:2:end));
y1 = min(region(2:2:end));
y2 = max(region(2:2:end));
A1 = norm(region(1:2) - region(3:4)) * norm(region(3:4) - region(5:6));
A2 = (x2 - x1) * (y2 - y1);
s = sqrt(A1/A2);
w = s * (x2 - x1) + 1;
h = s * (y2 - y1) + 1;
else
cx = region(1) + (region(3) - 1)/2;
cy = region(2) + (region(4) - 1)/2;
w = region(3);
h = region(4);
end
init_c = [cx cy];
init_sz = bb_scale * [w h];
im_size = size(imread(images{1}));
im_size = im_size([2 1]);
init_pos = min(max(round(init_c - (init_sz - 1)/2), [1 1]), im_size);
init_sz = min(max(round(init_sz), [1 1]), im_size - init_pos + 1);
seq.s_frames = images;
seq.init_rect = [init_pos, init_sz];
[file_path, file_name_start, file_ext] = fileparts(seq.s_frames{1});
[~, file_name_end, ~] = fileparts(seq.s_frames{end});
seq.path = file_path;
seq.name = 'vot_seq';
seq.ext = file_ext(2:end);
seq.len = length(seq.s_frames);
seq.nz = length(file_name_start);
seq.startFrame = str2num(file_name_start);
seq.endFrame = str2num(file_name_end);
% setup_tracker_paths(tracker_name);
otb_res = eval([runfile_name '(seq, [], []);']);
%convert the results to rectangle format
% otb_res = convert_to_rect(otb_res);
num_frames = numel(images);
for frame = 1:num_frames
bb = otb_res.res(frame,:);
sz = bb(3:4);
c = bb(1:2) + (sz - 1)/2;
new_sz = sz / bb_scale;
new_tl = c - (new_sz - 1)/2;
results{frame} = round([new_tl, new_sz]);
end
% **********************************
% VOT: Output the results
% **********************************
vot_report(results);%这里会报错
vot_save(results);
traxserver('quit'); %閫?嚭
catch err
[wrapper_pathstr, ~, ~] = fileparts(mfilename('fullpath'));
cd_ind = strfind(wrapper_pathstr, filesep());
VOT_path = wrapper_pathstr(1:cd_ind(end));
error_report_path = [VOT_path 'error_reports\'];
if ~exist(error_report_path, 'dir')
mkdir(error_report_path);
end
report_file_name = [error_report_path tracker_name '_' runfile_name datestr(now,'_yymmdd_HHMM') '.mat'];
save(report_file_name, 'err')
rethrow(err);
end
读txt终归有些low,效率应该不高,于是还是考虑全局变量的方法。但是好像声明的全局变量因为不在一个路径下,所以没办法保存。
经历了之前一个多周的调试,再加上昨天一个通宵可算调好了,能让他自己跑起来了。预测跑完所有时间应该要6h左右把。
上面写的也是自己的一个调试过程把,等这段时间忙完,之后闲一点再单独出一篇调试经验!