Performing evaluation with VOT toolkit

VOT support

Github vot-toolkit

使用 VOT-toolkit 测评 tensorflow / pytorch 编写的tracker。

环境:

  • Ubuntu16.04
  • Python3.5 (Anaconda)

Setting up the workspace

根据教程,这一步:execute workspace_create command时,直接从仓库里clone的会报错:

1
2
3
4
5
6
7
8
9
10
Warning: "/home/ubuntu/VOT/vot-toolkit/native" not found in path. 
> In rmpath (line 66)
In workspace_create (line 142)
Downloading TraX source from "https://codeload.github.com/votchallenge/trax/zip/master". Please wait ...
Unable to unpack TraX source code.
Error using initialize_native (line 16)
Unable to compile native resources.

Error in workspace_create (line 143)
initialize_native();

直接下载页面上的VOT toolkit with pre-compiled components from BinTray. 不会报错。

这时候会选择tracker的语言,这里最好先选择MATLAB,便于后面的环境测试。根据提示,将 tracker 的标识符设置为 ‘NCC’。后面会生成相关的文件,比如 tracker_NCC.m

Integrating tracker into the VOT toolkit

Maltab

用官方提供的demo进行测试,对于MATLAB版的tracker,主要修改 workspace 下的 tracker_NCC.m 文件,修改完后只有三行有效语句:

1
2
3
4
tracker_label = ['NCC'];
tracker_command = generate_matlab_command('ncc',
{'/home/ubuntu/VOT/vot-toolkit/tracker/examples/matlab'});
tracker_interperter = 'matlab';

简单说明一下:

  1. tracker_label : 作为 tracker 的标识符(名称)
  2. tracker_command : 主要是generate_matlab_command()函数,它的两个参数填写 tracker 的脚本文件名(不带后缀),和脚本文件所在的目录,注意数据格式是 cell。由于先测试官方提供的 tracker —— ncc.m,这里写它的脚本名字和目录
  3. tracker_interperter: 这个参数我还不知道有什么用,实际上随便改也不影响程序的运行。。。

修改好了 tracker_NCC.m 文件后,运行 run_test.m 进行测试(最好事先下载图片序列,将下载的 sequences 文件夹放入vot-workspace中),遇到了问题:

  • Invalid MEX-file

    1
    2
    Tracker execution interrupted: Invalid MEX-file '/home/ubuntu/VOT/vot-toolkit/native/traxclient.mexa64': /usr/local/MATLAB/R2016b/bin/glnxa64/../../sys/os/glnxa64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by /home/ubuntu/VOT/vot-toolkit/native/traxclient.mexa64).
    TraX support not detected.

    参考https://github.com/vlfeat/matconvnet/issues/770

    locate libstdc++ 命令查看libstdc信息,接着:

    1
    2
    3
    4
    5
    cd /usr/local/MATLAB/R2016b/sys/os/glnxa64  #where I installed my matlab
    sudo mv libstdc++.so.6.0.20 bak-libstdc++.so.6.0.20
    sudo mv libstdc++.so.6 bak-libstdc++.so.6
    sudo ln -sf /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21 ./
    sudo ln -sf ./libstdc++.so.6.0.21 ./libstdc++.so.6

    重启matlab即可解决这个错误。

再次运行 run_test.m 很顺利:

1
2
3
4
5
6
7
Choose a sequence:
1 - "bag"
2 - "ball1"
...
59 - "tunnel"
60 - "wiper"
Selected sequence:

选择某一序号之后,可以正常运行,说明环境正常。

Python

上一步的 MATLAB 可以正常运行,说明 TraX 库正常,就可以测试官方提供的 python tracker. 可以直接对上一步workspace 中的文件进行修改,没必要重新创建 workspace (特意选择Python)。

还是修改 workspace 下的 tracker_NCC.m 文件,修改为:

1
2
3
tracker_label = ['NCC'];
tracker_command = generate_python_command('python_ncc',{'/home/ubuntu/VOT/vot-toolkit/tracker/examples/python'});
tracker_interperter = 'python';

generate_matlab_command() 修改为 generate_python_command(),参数还是对应 python 版的 tracker 文件名和目录,tracker_interperter其实不用修改,但是给他点面子改成 'python'.

运行 run_test.m 试一试,果然出错了!当我 Anaconda 不存在吗?

  • wrong python interpreter

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ...
    CLIENT: Creating process /usr/bin/python -c "import sys; sys.path.append('/home/ubuntu/VOT/vot-toolkit/native/trax/python');sys.path.append('/home/ubuntu/VOT/vot-toolkit/tracker/examples/python'); import python_ncc"
    CLIENT: Working directory is /tmp/tp8b02cd23_8b86_416c_8e82_000ea94a4639
    ...
    Traceback (most recent call last):
    File "<string>", line 1, in <module>
    File "/home/ubuntu/VOT/vot-toolkit/tracker/examples/python/python_ncc.py", line 6, in <module>
    import cv2
    ImportError: No module named cv2
    ...

    但是官方并没有说如何选择 python 解释器。谷歌一下,有线索,根据这条线索,修改tracker_interperter

    1
    tracker_interpreter = '/home/ubuntu/anaconda2/envs/tf15/bin/python';

    还是报同样的错,解释器仍然是/usr/bin/python(早就说 tracker_interpreter 没用了!)。

    也许是版本原因造成这种方法不再适用,但是,观察 generate_python_command.m 文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function command = generate_python_command(script, paths)

    trax_python = get_global_variable('trax_python');
    python_exec = get_global_variable('python');

    % If path to python trax implementatin is set then we attempt to export it to tracker
    if ~isempty(trax_python)
    paths = cat(1, {trax_python}, paths);
    end

    ...

    python_exec不就是解释器么,编程规范真是好东西。修改它肯定可以解决问题。在 workspace 下的 configuration.m 文件中添加一句:

    1
    set_global_variable('python', '/home/ubuntu/anaconda2/envs/tf15/bin/python');

    成功运行。

Conclusion

VOT toolkit 调用 python 版本的 tracker 需要修改 workspace 目录下的两个文件

  1. tracker_NCC.m 中:
    • tracker_command 的函数名和参数
    • tracker_interperter 改为'python'(好像没什么用)
    • 如果 tracker 使用了 CUDA、cuDNN,需要加上tracker_linkpath = {'/usr/local/cuda/lib64','/usr/local/cuda/extras/CUPTI/lib64'}
  2. configuration.m 中:
    • 添加 python 解释器路径:set_global_variable('python', '<interpreter_path>');

由于 Trax 支持了 Python3VOT/trax-master/python/trax 目录下的 python 文件中有以下语句)

1
2
3
4
...
if (sys.version_info > (3, 0)):
xrange = range
...

所以不必特意将 python demo 中的 xrange 改成 range

Analyzing results and generating reports

这一步是作图比较,分析 tracker 的性能。

使用文档 (2018.12.13 - 官方文档和最新的 run_experiments.m 内容有很大出入)

analysis 说明文档

下载其他 trackerresult : Raw results,根据官方文档,放在 vot-workspace 指定的文件夹中 (results),在这个文件夹中,还可以发现前面运行的 demo tracker - NCC ,但是 NCC 文件夹是空的,所以还要运行 run_experiments.m 脚本来生成 NCC 文件夹下的 result 数据(得运行好一会,这其实是Performing evaluation with VOT toolkit 步骤)。

run_experiments.m :

1
2
3
4
5
6
7
8
9
10
11
12
13
% This script can be used to perform a comparative analyis of the experiments
% in the same manner as for the VOT challenge
% You can copy and modify it to create a different analyis

addpath('/home/ubuntu/VOT/vot-toolkit'); toolkit_path; % Make sure that VOT toolkit is in the path

[sequences, experiments] = workspace_load();

% error('Analysis not configured! Please edit run_analysis.m file.'); % Remove this line after proper configuration

trackers = tracker_list('NCC', 'TODO'); % TODO: add more trackers here

workspace_analyze(trackers, sequences, experiments, 'report_NCC', 'Title', 'Report for test');

注意,这个文件的内容已经和官方教程上很不一样了 (2018.12.13),所以不能参考官方教程。

进入 tracker_list() 函数,发现:

1
2
3
4
5
% This functions checks each argument if it is a valid file and openes it as a text file of comma and new line separated tracker identifiers. If an argument is not a file then it is considered an identifier.
%
% Examples:
%
% trackers = tracker_list('trackers.txt', 'NCC'); % Load tracker identifiers from file trackers.txt and add a tracker NCC

改写为:

1
trackers = tracker_list('trackers.txt', 'NCC');

这里 trackers.txt 文件定义了需要对比的其它 tracker,可以从我们下载的 results 中选择,如果在 trackers.txt 中这样写:

1
2
TCNN
DFT

就是拿第二个参数 'NCC' 所代表的 trackerTCNN, DFT 这两个 tracker 对比,这三个 tracker 的测试结果数据都应该在 result 文件夹下以各自名字命名的文件夹中 (NCC 文件夹中内容是运行脚本得到的,另外两个是我们下载的)。

有如下错误,说明程序把 'trackers.txt' 当做了一个 tracker 根据上面 tracker_list() 函数中的注释,可以知道是因为没有把 results 文件夹添加到路径中。

1
2
Error using tracker_load (line 56)
Error: trackers.txt is not a valid tracker identifier.

results 添加到路径中 (Matlab 右击这个目录),由于当前路径是在 vot-workspace 中, trackers.txtresults 目录中,所以,还得修改一下:

1
trackers = tracker_list('./results/trackers.txt', 'NCC');

可以运行 run_analysis.m 了,成功在 reports 目录下生成了数据。

但是中间有:

1
2
WARNING: No configuration for tracker TCNN found
WARNING: No configuration for tracker DFT found

tracker_load.m 产生的,应该是因为不存在 tracker_TCNN.mtracker_DFT.m,并不影响结果。

官网上还有个提示:

To speed up the analysis, some intermediate results are cached. If you plan to re-run the analysis, make sure that you delete the appropriate files in the vot-workspace/cache directory).

不知道 appropriate files 指的到底是啥,所以就没管它。

Conclusion

运行 run_analysis.m 生成对比数据:

  1. 运行 run_experiments.m 生成 your tracker result (默认保存在 vot-workspace/results 中,以 tracker identifier 命名的文件夹)

  2. results 文件夹添加到 MATLAB 路径中

  3. 需要修改文件中的 tracker_list(),修改完成后应该是:

    1
    2
    3
    4
    5
    6
    7
    addpath('/home/ubuntu/VOT/vot-toolkit'); toolkit_path; 

    [sequences, experiments] = workspace_load();

    trackers = tracker_list('./results/trackers.txt', 'NCC');

    workspace_analyze(trackers, sequences, experiments, 'report_NCC', 'Title', 'Report for vot2016');

    tracker_list() 第一个参数是 trackers.txt 文件的路径,第二个参数是自己的 tracker identifier(应该可以不要这个参数,生成 VOT trackers 的对比)。

Apply your tracker

按照模板来写 python 文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import vot
import sys
import time

handle = vot.VOT("rectangle")
selection = handle.region() # selection is bbox

# Process the first frame
imagefile = handle.frame() # imagefile is frame path (here is the first frame)
if not imagefile:
sys.exit(0)

# init your tracker if necessary
# your_tracker.init(imagefile, selection)

while True:
imagefile = handle.frame() # imagefile is frame path
if not imagefile:
break

# TODO:
# new_selection, confidence = your_tracker.predict(imagefile)

handle.report(new_selection, confidence)

看上去很简单,需要注意几点:

  1. 先进入 vot-toolkit 目录下面运行一遍 toolkit_path.m, 然后再进入 vot-workspace 目录运行别的,我也不知道是不是一定需要这步。
  1. 确保 vot.py 能被正确导入(该文件在 vot-toolkit/tracker/examples/python 目录中 ),路径要确保都能正确的添加(python - import , matlab - path)。

  2. 因为我用到了 CUDA、cuDNN,需要在 tracker_your.m 中加上tracker_linkpath = {'/usr/local/cuda/lib64','/usr/local/cuda/extras/CUPTI/lib64'}.

  3. 如果 tracker 没有 confidence 输出,可以不写, .report() 有默认参数。

  4. 关于 selection 的数据格式,参考 vot.py 中的代码,可以发现它是 namedtuple代表左上角点坐标、宽、高,必须将输出按对应格式修改后放入 selection 中,比如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # Rectangle = collections.namedtuple('Rectangle', ['x', 'y', 'width', 'height'])

    # bbox is a list: [x0, y0, x1, y1]
    bbox = tracker.track('the_object', imageRGB)

    selection = selection._replace(x=bbox[0],
    y=bbox[1],
    width=(bbox[2] - bbox[0]),
    height=(bbox[3] - bbox[1]))

    同理,如果你的 tracker 接收的不是 namedtuple 类型数据,也要在循环之前将它转换为合适的数据类型送入你的 track().

运行 run_test.m ,如果官方 demo 运行成功,自己的 tracker 不成功的话,先确定是不是文件路径的原因,留意MATLAB 的报错信息。还可以在 python 文件中用 print 语句简单调试看看,内容会在 MATLAB 命令窗口输出。

run_test.m 运行成功后,就可以运行 run_experiments.m、 run_analysis.mtracker 进行分析比较了。

注意

python文件中的路径问题

在python_tracker.py文件中调用其他位置的模块,需要添加路径,比如:

1
2
3
4
5
6
7
8
9
import vot
import sys
import cv2
import os.path

# make sure the paths you need are append
basedir = os.path.dirname(__file__)
sys.path.append(os.path.abspath(os.path.join(basedir, os.path.pardir)))
from siamfc_tracker import TrackerSiamFC

pytorch问题

出现错误:

1
2
3
4
5
  File "/home/ubuntu/anaconda2/envs/pytorch/lib/python3.6/site-packages/torch/__init__.py", line 84, in <module>
from torch._C import *
RuntimeError: stoi
CLIENT: Timeout reached. Stopping tracker process ...
CLIENT: Flushing streams

即在import torch部分出现错误,在MATLAB命令行执行:

1
system('/home/ubuntu/anaconda2/envs/pytorch/bin/python -c "import torch"')

出现同样错误。

参考#7082,在命令行执行:

1
system('env -i /home/ubuntu/anaconda2/envs/pytorch/bin/python -c "import torch"')

不会报错,则将vot-toolkit中相关的命令前面加上env -i即可,在 tracker_load.m 中加上中间一行代码:

1
2
3
4
5
6
7
8
9
10
if ~isascii(tracker.command)
warning('Tracker command contains non-ASCII characters. This may cause problems.');
end;

% add this line, 32 is space's ascii.
tracker.command = strcat('env -i', 32, tracker.command);

if ~isempty(tracker.command) && ~tracker_test(tracker)
error('Tracker has not passed the TraX support test.');
end

因为tracker_load.m是vot-toolkit的各个workspace公用文件,所以当使用tensorflow版的tracker的时候要把这一行去掉!

由于我使用的是conda提供的cuda工具,所以不加如下内容也可以:

1
tracker_linkpath = {'/usr/local/cuda/lib64','/usr/local/cuda/extras/CUPTI/lib64'}

参考

run_experiments时,不进行重复测试

建议在run_experiments中的[sequences, experiments] = workspace_load();后面添加一句experiments{1,1}.parameters.repetitions = 1,让跟踪器在每个视频上只运行一遍

超时问题

如果你的跟踪器初始化超过30秒,这个工具运行是会报错的,原因在vot-toolkit-master\tracker目录下的tracker_run.m文件中.

修改timeout = get_global_variable('trax_timeout', 30);中的30即可


----------over----------


文章标题:Performing evaluation with VOT toolkit

文章作者:Ge垚

发布时间:2018年11月21日 - 12:11

最后更新:2019年06月02日 - 08:06

原始链接:http://geyao1995.com/fight_against_vot_toolkit/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。