记录一下使用OTB过程遇到的一些问题。
刚刚拿到这个toolkit,一开始以为可以直接跑了,发现其实最好的是把你的tracker弄成一个exe放到它的trackers文件夹底下,然后跑main_running 就可以了,但是一般现在都用Python写了,如何打包,如何搞到Matlab中确实太麻烦。所以我就开始了我的探索,说实话可能对很多人来讲我遇到的问题很弱智,但是我就是不会啊!!哭/(ㄒoㄒ)/~~。
把自己的结果存下来
我能想到的解决方法就是把自己的结果存成OTB里面要用的.mat形式,Python的scipy库就能做这个事,把文件输出成.mat的。这一步是不是看着很简单,只要:
import scipy as scio
scio.savemat(result_path_mat, Mat) #Mat就是要输出的结果
这个时候问题就来了,不知道matlab里面的数据结构是啥样的,所以我就把里面已有的OPE文件中的.mat输出了一下:
[array([[(array([[ 70, 51, 107, 87],
[ 70, 51, 107, 87],
[ 69, 52, 108, 87],
[ 69, 50, 107, 87],
[ 67, 50, 109, 88],
[ 66, 49, 109, 88],
[ 65, 49, 110, 89],
[ 63, 49, 111, 90],
[ 62, 49, 112, 91],
[ 61, 49, 112, 91],
[ 61, 49, 112, 91],
[ 61, 48, 113, 91],
[ 61, 48, 113, 91],
[ 61, 48, 113, 91],
[ 61, 48, 113, 91],
[ 61, 48, 113, 91],
[ 60, 48, 113, 91],
[ 60, 48, 113, 91],
[ 60, 48, 113, 91],
[ 60, 48, 113, 91]], dtype=uint8), array(['rect'], dtype='<U4'), array([[7.62746]]), array([[20]], dtype=uint8), array([[1]], dtype=uint8), array([[1]], dtype=uint8))]],
dtype=[('res', 'O'), ('type', 'O'), ('fps', 'O'), ('len', 'O'), ('annoBegin', 'O'), ('startFrame', 'O')])]
是不是很强,其实就是一个五维的numpy数组???因为操作实在太骚了,观察到matlab其实需要的就是一个封装后的cell,一个cell中又有六个属性:
所以最终的解决方法,是先把你的数据搞成一个字典,,然后再把这个字典赋给一个numpy数组就可以了:
Mat = {'res': list(regions), 'type': 'rect', 'fps': f/toc, 'len': len(regions), 'annoBegin': 1, 'startFrame': 1}
M = np.array([Mat])
一定不能漏掉Mat外面那个中括号,不然就会功亏一篑,那个中括号就能把Mat直接封装成一个1*1的array,然后在Matlab里面就会被读成cell了
(害的我搞了一下午的numpy结构体,感觉自己真的太菜了)
这样基本就OK了,只要把你的结果放好,然后配置啥的都没问题的话,用perfPlot.m函数就可以画出来啦~我还没测完,所以估计后续还会更新
画出来的OPE两个曲线与原始论文不一样
在perfPlot里面需要自己修改参数:
% metricTypeSet = {'error', 'overlap'}; %error->threshold , overlap->AUC
metricTypeSet = {'error'};
evalTypeSet = { 'OPE'};
% rankingType = 'AUC';%AUC, threshold
rankingType = 'threshold';
其实就是error要对应threshold,然后overlap要对应AUC。
(我跑出来的DAT的结果还没有MDNe好,怕是还是哪里配错了?)
附
SiamFC中转mat的一小段代码:
for video in all_videos:
p.video = video
print("Processing %s ... " % p.video)
bbox_result, fps = run_tracker(p)
# saving tracking results as mat
if p.bbox_output:
Mat = {'res': list(bbox_result), 'type': 'rect', 'fps': fps, 'len': len(bbox_result), 'annoBegin': 1, 'startFrame': 1}
M = np.array([Mat])
Mat2 = {'__header__': 'b', '__version__': 1.0, '__globals__': [], 'results': M}
scio.savemat(p.bbox_output_path_mat+p.video + '_SiamFC.mat', Mat2)
txt转mat文件代码见github https://github.com/gagajian/txt_to_mat-OTB-