├── vot
├── report
│ ├── tests.py
│ ├── commands.tex
│ ├── report.js
│ ├── report.css
│ ├── video.py
│ ├── latex.py
│ ├── html.py
│ ├── common.py
│ └── table.js
├── version.py
├── dataset
│ ├── cow.png
│ ├── dummy.py
│ ├── trackingnet.py
│ └── got10k.py
├── stack
│ ├── tests
│ │ ├── basic.yaml
│ │ ├── multiobject.yaml
│ │ └── segmentation.yaml
│ ├── vots2023.yaml
│ ├── vots2024
│ │ ├── main.yaml
│ │ ├── votst.yaml
│ │ └── votstval.yaml
│ ├── vots2025
│ │ ├── main.yaml
│ │ ├── votst.yaml
│ │ ├── realtime.yaml
│ │ └── votstval.yaml
│ ├── otb50.yaml
│ ├── otb100.yaml
│ ├── vot2019
│ │ ├── rgbd.yaml
│ │ ├── rgbtir.yaml
│ │ ├── longterm.yaml
│ │ └── shortterm.yaml
│ ├── vot2020
│ │ ├── rgbd.yaml
│ │ ├── rgbtir.yaml
│ │ ├── longterm.yaml
│ │ └── shortterm.yaml
│ ├── vot2021
│ │ ├── rgbd.yaml
│ │ ├── longterm.yaml
│ │ └── shortterm.yaml
│ ├── vot2016
│ │ ├── tir.yaml
│ │ └── rgb.yaml
│ ├── vot2015
│ │ ├── tir.yaml
│ │ └── rgb.yaml
│ ├── vot2013.yaml
│ ├── vot2014.yaml
│ ├── vot2022
│ │ ├── depth.yaml
│ │ ├── rgbd.yaml
│ │ ├── longterm.yaml
│ │ ├── shortterm.yaml
│ │ └── shorttermbox.yaml
│ ├── vot2018
│ │ ├── longterm.yaml
│ │ └── shortterm.yaml
│ ├── vot2017.yaml
│ ├── tests.py
│ └── __init__.py
├── __main__.py
├── analysis
│ ├── tests.py
│ └── failures.py
├── tracker
│ ├── tests.py
│ ├── dummy.py
│ └── results.py
├── utilities
│ ├── io.py
│ ├── migration.py
│ ├── data.py
│ ├── net.py
│ └── notebook.py
├── experiment
│ ├── helpers.py
│ ├── multistart.py
│ └── transformer.py
├── workspace
│ ├── tests.py
│ └── __init__.py
├── region
│ ├── __init__.py
│ └── tests.py
└── __init__.py
├── data
└── aliases
│ ├── downloader.json
│ ├── report.json
│ ├── indexer.json
│ ├── loader.json
│ ├── experiment.json
│ ├── transformer.json
│ └── analysis.json
├── docs
├── tutorials
│ ├── report.rst
│ ├── integration.rst
│ ├── jupyter.rst
│ ├── stack.rst
│ ├── workspace.rst
│ ├── cli.rst
│ └── dataset.rst
├── api
│ ├── stack.rst
│ ├── experiment.rst
│ ├── tracker.rst
│ ├── region.rst
│ ├── report.rst
│ ├── dataset.rst
│ ├── utilities.rst
│ └── analysis.rst
├── requirements.txt
├── api.rst
├── tutorials.rst
├── index.rst
├── overview.rst
├── conf.py
└── Makefile
├── .gitignore
├── MANIFEST.in
├── requirements.txt
├── .readthedocs.yaml
├── setup.py
└── README.md
/vot/report/tests.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/aliases/downloader.json:
--------------------------------------------------------------------------------
1 | {
2 |
3 | }
--------------------------------------------------------------------------------
/docs/tutorials/report.rst:
--------------------------------------------------------------------------------
1 | Customizing reports
2 | ===================
--------------------------------------------------------------------------------
/vot/version.py:
--------------------------------------------------------------------------------
1 | """
2 | Toolkit version
3 | """
4 | __version__ = '0.7.4'
5 |
--------------------------------------------------------------------------------
/docs/tutorials/integration.rst:
--------------------------------------------------------------------------------
1 | Tracker integration
2 | ===================
3 |
4 |
--------------------------------------------------------------------------------
/vot/dataset/cow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/votchallenge/toolkit/HEAD/vot/dataset/cow.png
--------------------------------------------------------------------------------
/docs/api/stack.rst:
--------------------------------------------------------------------------------
1 | Stack module
2 | ============
3 |
4 | .. automodule:: vot.stack
5 | :members:
--------------------------------------------------------------------------------
/docs/api/experiment.rst:
--------------------------------------------------------------------------------
1 | Experiment module
2 | ================
3 |
4 | .. automodule:: vot.experiment
5 | :members:
--------------------------------------------------------------------------------
/docs/requirements.txt:
--------------------------------------------------------------------------------
1 | sphinx==5.3.0
2 | sphinx_rtd_theme==1.1.1
3 | readthedocs-sphinx-search==0.3.2
4 | recommonmark==0.7.1
--------------------------------------------------------------------------------
/docs/tutorials/jupyter.rst:
--------------------------------------------------------------------------------
1 | Interactive analysis in Jupyter notebooks
2 | =========================================
3 |
4 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .vscode
2 | __pycache__
3 | venv/
4 | .idea/
5 | MANIFEST
6 | *.pyc
7 | dist/
8 | *.egg-info
9 | _build
10 | build
--------------------------------------------------------------------------------
/data/aliases/report.json:
--------------------------------------------------------------------------------
1 | {
2 | "table" : "vot.report.common.StackAnalysesTable",
3 | "plots" : "vot.report.common.StackAnalysesPlots"
4 | }
--------------------------------------------------------------------------------
/data/aliases/indexer.json:
--------------------------------------------------------------------------------
1 | {
2 | "default": "vot.dataset.common.list_sequences",
3 | "tackingnet": "vot.dataset.trackingnet.list_sequences"
4 | }
--------------------------------------------------------------------------------
/data/aliases/loader.json:
--------------------------------------------------------------------------------
1 | {
2 | "default": "vot.dataset.common.read_sequence",
3 |
4 |
5 | "legacy": "vot.dataset.read_legacy_sequence"
6 | }
--------------------------------------------------------------------------------
/vot/stack/tests/basic.yaml:
--------------------------------------------------------------------------------
1 | title: VOT Basic Test Stack
2 | url: http://www.votchallenge.net/
3 | dataset: https://data.votchallenge.net/toolkit/test.zip
4 | experiments:
5 | baseline:
6 | type: unsupervised
7 | repetitions: 1
--------------------------------------------------------------------------------
/vot/stack/vots2023.yaml:
--------------------------------------------------------------------------------
1 | title: VOTS2023 Challenge Stack
2 | dataset: https://data.votchallenge.net/vots2023/dataset/description.json
3 | experiments:
4 | baseline:
5 | type: unsupervised
6 | repetitions: 1
7 | multiobject: True
--------------------------------------------------------------------------------
/MANIFEST.in:
--------------------------------------------------------------------------------
1 | include requirements.txt
2 | include README.md
3 | recursive-include vot/stack/ *.yaml
4 | include vot/dataset/*.png
5 | include vot/dataset/*.jpg
6 | include vot/report/*.css
7 | include vot/report/*.js
8 | include vot/report/*.tex
9 |
--------------------------------------------------------------------------------
/vot/stack/vots2024/main.yaml:
--------------------------------------------------------------------------------
1 | title: VOTS2024 Challenge Stack
2 | dataset: https://data.votchallenge.net/vots2023/dataset/description.json
3 | experiments:
4 | baseline:
5 | type: unsupervised
6 | repetitions: 1
7 | multiobject: True
--------------------------------------------------------------------------------
/vot/stack/vots2024/votst.yaml:
--------------------------------------------------------------------------------
1 | title: VOTS2024 ST Challenge Stack
2 | dataset: https://data.votchallenge.net/vots2024/vost/description.json
3 | experiments:
4 | baseline:
5 | type: unsupervised
6 | repetitions: 1
7 | multiobject: True
--------------------------------------------------------------------------------
/vot/stack/vots2025/main.yaml:
--------------------------------------------------------------------------------
1 | title: VOTS2025 Challenge Stack
2 | dataset: https://data.votchallenge.net/vots2023/dataset/description.json
3 | experiments:
4 | baseline:
5 | type: unsupervised
6 | repetitions: 1
7 | multiobject: True
8 |
--------------------------------------------------------------------------------
/vot/stack/vots2025/votst.yaml:
--------------------------------------------------------------------------------
1 | title: VOTST2025 Challenge Stack
2 | dataset: https://data.votchallenge.net/vots2024/vost/description.json
3 | experiments:
4 | baseline:
5 | type: unsupervised
6 | repetitions: 1
7 | multiobject: True
8 |
--------------------------------------------------------------------------------
/data/aliases/experiment.json:
--------------------------------------------------------------------------------
1 | {
2 | "unsupervised": "vot.experiment.multirun.UnsupervisedExperiment",
3 | "supervised": "vot.experiment.multirun.SupervisedExperiment",
4 |
5 | "multistart": "vot.experiment.multistart.MultiStartExperiment"
6 | }
--------------------------------------------------------------------------------
/data/aliases/transformer.json:
--------------------------------------------------------------------------------
1 | {
2 | "singleobject" : "vot.experiment.transformer.SingleObject",
3 | "redetection": "vot.experiment.transformer.Redetection",
4 | "ignore": "vot.experiment.transformer.IgnoreObjects",
5 | "downsample": "vot.experiment.transformer.Downsample"
6 | }
--------------------------------------------------------------------------------
/vot/__main__.py:
--------------------------------------------------------------------------------
1 | """ This module is a shortcut for the CLI interface so that it can be run as a "vot" module. """
2 |
3 | # Just a shortcut for the CLI interface so that it can be run as a "vot" module.
4 |
5 | from vot.utilities.cli import main
6 |
7 | if __name__ == '__main__':
8 | main()
9 |
--------------------------------------------------------------------------------
/vot/stack/otb50.yaml:
--------------------------------------------------------------------------------
1 | title: OTB50 dataset experiment stack
2 | url: http://cvlab.hanyang.ac.kr/tracker_benchmark/index.html
3 | dataset: otb50
4 | experiments:
5 | baseline:
6 | type: unsupervised
7 | analyses:
8 | - type: average_accuracy
9 | name: accuracy
10 | burnin: 1
--------------------------------------------------------------------------------
/vot/stack/otb100.yaml:
--------------------------------------------------------------------------------
1 | title: OTB100 dataset experiment stack
2 | url: http://cvlab.hanyang.ac.kr/tracker_benchmark/index.html
3 | dataset: otb100
4 | experiments:
5 | baseline:
6 | type: unsupervised
7 | analyses:
8 | - type: average_accuracy
9 | name: accuracy
10 | burnin: 1
--------------------------------------------------------------------------------
/docs/tutorials/stack.rst:
--------------------------------------------------------------------------------
1 | Creating a new experiment stack
2 | ===============================
3 |
4 | The experiment stack is a collection of experiments that are run on the dataset. It is described by a YAML file that may be provided in the toolkit installation or created by the user manually in the workspace.
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/docs/api/tracker.rst:
--------------------------------------------------------------------------------
1 | Tracker module
2 | ==============
3 |
4 | .. automodule:: vot.tracker
5 | :members:
6 |
7 | TraX protocol module
8 | --------------------
9 |
10 | .. automodule:: vot.tracker.trax
11 | :members:
12 |
13 | Results module
14 | --------------
15 |
16 | .. automodule:: vot.tracker.results
17 | :members:
18 |
19 |
--------------------------------------------------------------------------------
/vot/stack/vot2019/rgbd.yaml:
--------------------------------------------------------------------------------
1 | title: VOT-RGBD2019 challenge
2 | dataset: http://data.votchallenge.net/vot2019/rgbd/description.json
3 | url: http://www.votchallenge.net/vot2019/
4 | experiments:
5 | rgbd-unsupervised:
6 | type: unsupervised
7 | repetitions: 1
8 | analyses:
9 | - type: average_tpr
10 | - type: pr_curve
11 | - type: f_curve
--------------------------------------------------------------------------------
/vot/stack/vot2020/rgbd.yaml:
--------------------------------------------------------------------------------
1 | title: VOT-RGBD2020 challenge
2 | dataset: http://data.votchallenge.net/vot2019/rgbd/description.json
3 | url: http://www.votchallenge.net/vot2020/
4 | experiments:
5 | rgbd-unsupervised:
6 | type: unsupervised
7 | repetitions: 1
8 | analyses:
9 | - type: average_tpr
10 | - type: pr_curve
11 | - type: f_curve
--------------------------------------------------------------------------------
/vot/stack/vot2021/rgbd.yaml:
--------------------------------------------------------------------------------
1 | title: VOT-RGBD2021 challenge
2 | dataset: http://data.votchallenge.net/vot2019/rgbd/description.json
3 | url: http://www.votchallenge.net/vot2021/
4 | experiments:
5 | rgbd-unsupervised:
6 | type: unsupervised
7 | repetitions: 1
8 | analyses:
9 | - type: average_tpr
10 | - type: pr_curve
11 | - type: f_curve
--------------------------------------------------------------------------------
/vot/stack/vot2016/tir.yaml:
--------------------------------------------------------------------------------
1 | title: VOT-TIR2016 challenge
2 | dataset: https://data.votchallenge.net/vot2016/tir/description.json
3 | url: https://www.votchallenge.net/vot2016/
4 | experiments:
5 | baseline:
6 | type: supervised
7 | repetitions: 15
8 | skip_initialize: 5
9 | analyses:
10 | - type: supervised_average_ar
11 | sensitivity: 30
12 |
--------------------------------------------------------------------------------
/vot/stack/vots2025/realtime.yaml:
--------------------------------------------------------------------------------
1 | title: VOTS2025-RT Challenge Stack
2 | dataset: https://data.votchallenge.net/vots2023/dataset/description.json
3 | experiments:
4 | baseline:
5 | type: unsupervised
6 | repetitions: 1
7 | multiobject: True
8 | realtime:
9 | type: unsupervised
10 | repetitions: 1
11 | multiobject: True
12 | realtime:
13 | grace: 3
14 |
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | vot-trax>=4.0.1
2 | tqdm>=4.37
3 | numpy>=1.16
4 | opencv-python>=4.0
5 | six
6 | pylatex>=1.3
7 | jsonschema>=3.2
8 | pyYAML>=5.3
9 | matplotlib>=3.0
10 | Pillow>=7.0
11 | numba>=0.47
12 | requests>=2.22
13 | colorama>=0.4.3
14 | packaging>=20
15 | dominate>=2.5
16 | cachetools>=4.1
17 | bidict>=0.19
18 | phx-class-registry>=5.0
19 | attributee>=0.1.8
20 | lazy-object-proxy>=1.9
--------------------------------------------------------------------------------
/vot/stack/vot2015/tir.yaml:
--------------------------------------------------------------------------------
1 | title: VOT-TIR2015 challenge
2 | dataset: http://www.cvl.isy.liu.se/research/datasets/ltir/version1.0/ltir_v1_0_8bit.zip
3 | url: http://www.votchallenge.net/vot2015/
4 | experiments:
5 | baseline:
6 | type: supervised
7 | repetitions: 15
8 | skip_initialize: 5
9 | analyses:
10 | - type: supervised_average_ar
11 | sensitivity: 30
12 |
--------------------------------------------------------------------------------
/docs/api/region.rst:
--------------------------------------------------------------------------------
1 | Region module
2 | ============
3 |
4 | .. automodule:: vot.region
5 | :members:
6 |
7 | Shapes
8 | ------
9 |
10 | .. automodule:: vot.region.shapes
11 | :members:
12 |
13 | Raster utilities
14 | ----------------
15 |
16 | .. automodule:: vot.region.raster
17 | :members:
18 |
19 | IO functions
20 | ------------
21 |
22 | .. automodule:: vot.region.io
23 | :members:
--------------------------------------------------------------------------------
/docs/api/report.rst:
--------------------------------------------------------------------------------
1 | Report module
2 | =============
3 |
4 | .. automodule:: vot.report
5 | :members:
6 |
7 | .. automodule:: vot.report.common
8 | :members:
9 |
10 | HTML report generation
11 | ----------------------
12 |
13 | .. automodule:: vot.report
14 | :members:
15 |
16 | LaTeX report generation
17 | -----------------------
18 |
19 | .. automodule:: vot.report.latex
20 | :members:
21 |
22 |
--------------------------------------------------------------------------------
/vot/stack/vot2013.yaml:
--------------------------------------------------------------------------------
1 | title: VOT2013 challenge
2 | url: http://www.votchallenge.net/vot2013/
3 | dataset: http://data.votchallenge.net/vot2013/dataset/description.json
4 | deprecated: True
5 | experiments:
6 | baseline:
7 | type: supervised
8 | repetitions: 15
9 | skip_initialize: 5
10 | analyses:
11 | - type: supervised_average_ar
12 | sensitivity: 30
13 | # TODO: missing experiments
14 |
15 |
--------------------------------------------------------------------------------
/vot/stack/vot2014.yaml:
--------------------------------------------------------------------------------
1 | title: VOT2014 challenge
2 | dataset: http://data.votchallenge.net/vot2014/dataset/description.json
3 | url: http://www.votchallenge.net/vot2014/
4 | deprecated: True
5 | experiments:
6 | baseline:
7 | type: supervised
8 | repetitions: 15
9 | skip_initialize: 5
10 | analyses:
11 | - type: supervised_average_ar
12 | sensitivity: 30
13 | - type: cumulative_failures
14 | # TODO: region noise
--------------------------------------------------------------------------------
/docs/api.rst:
--------------------------------------------------------------------------------
1 | Documentation
2 | =============
3 |
4 | The API section contains the generated documentation of individual structures and functions from source code docstrings.
5 |
6 | .. toctree::
7 | :maxdepth: 2
8 |
9 | api/analysis
10 | api/dataset
11 | api/report
12 | api/experiment
13 | api/region
14 | api/stack
15 | api/tracker
16 | api/utilities
17 |
18 | Configuration
19 | -------------
20 |
21 | .. automodule:: vot
22 | :members:
--------------------------------------------------------------------------------
/vot/stack/vot2019/rgbtir.yaml:
--------------------------------------------------------------------------------
1 | title: VOT-RGBTIR2019 challenge
2 | dataset: http://data.votchallenge.net/vot2019/rgbtir/meta/description.json
3 | url: http://www.votchallenge.net/vot2019/
4 | experiments:
5 | baseline:
6 | type: multistart
7 | realtime:
8 | grace: 3
9 | analyses:
10 | - type: multistart_average_ar
11 | - type: multistart_eao_score
12 | low: 115
13 | high: 755
14 | - type: multistart_eao_curve
15 | high: 755
--------------------------------------------------------------------------------
/vot/stack/vot2020/rgbtir.yaml:
--------------------------------------------------------------------------------
1 | title: VOT-RGBTIR2020 challenge
2 | dataset: http://data.votchallenge.net/vot2020/rgbtir/meta/description.json
3 | url: http://www.votchallenge.net/vot2020/
4 | experiments:
5 | baseline:
6 | type: multistart
7 | realtime:
8 | grace: 3
9 | analyses:
10 | - type: multistart_average_ar
11 | - type: multistart_eao_score
12 | low: 115
13 | high: 755
14 | - type: multistart_eao_curve
15 | high: 755
--------------------------------------------------------------------------------
/vot/stack/vot2015/rgb.yaml:
--------------------------------------------------------------------------------
1 | title: VOT2015 challenge
2 | dataset: http://data.votchallenge.net/vot2015/dataset/description.json
3 | url: http://www.votchallenge.net/vot2015/
4 | experiments:
5 | baseline:
6 | type: supervised
7 | repetitions: 15
8 | skip_initialize: 5
9 | analyses:
10 | - type: supervised_average_ar
11 | sensitivity: 30
12 | - type: supervised_eao_score
13 | low: 108
14 | high: 371
15 | - type: supervised_eao_curve
--------------------------------------------------------------------------------
/vot/stack/vot2022/depth.yaml:
--------------------------------------------------------------------------------
1 | title: VOT-D2022 challenge
2 | dataset: https://data.votchallenge.net/vot2022/depth/description.json
3 | url: https://www.votchallenge.net/vot2022/
4 | experiments:
5 | baseline:
6 | type: multistart
7 | analyses:
8 | - type: multistart_eao_score
9 | name: eaoscore
10 | low: 115
11 | high: 755
12 | - type: multistart_eao_curve
13 | name: eaocurve
14 | high: 755
15 | - type: multistart_average_ar
16 | name: ar
17 |
--------------------------------------------------------------------------------
/vot/stack/vot2022/rgbd.yaml:
--------------------------------------------------------------------------------
1 | title: VOT-RGBD2022 challenge
2 | dataset: https://data.votchallenge.net/vot2022/rgbd/description.json
3 | url: https://www.votchallenge.net/vot2022/
4 | experiments:
5 | baseline:
6 | type: multistart
7 | analyses:
8 | - type: multistart_eao_score
9 | name: eaoscore
10 | low: 115
11 | high: 755
12 | - type: multistart_eao_curve
13 | name: eaocurve
14 | high: 755
15 | - type: multistart_average_ar
16 | name: ar
17 |
--------------------------------------------------------------------------------
/vot/report/commands.tex:
--------------------------------------------------------------------------------
1 | \newcommand{\DefineTracker}[3]{%
2 | \expandafter\newcommand\csname trk-\detokenize{#1}-\detokenize{#2}\endcsname{#3}%
3 | }%
4 | \newcommand{\Tracker}[2]{\csname trk-\detokenize{#1}-\detokenize{#2}\endcsname}%
5 | \makeatletter%
6 | \newcommand{\replunderscores}[1]{\expandafter\@repl@underscores#1_\relax}
7 | \def\@repl@underscores#1_#2\relax{%
8 | \ifx \relax #2\relax
9 | #1%
10 | \else
11 | #1%
12 | \textunderscore
13 | \@repl@underscores#2\relax
14 | \fi
15 | }
16 | \makeatother%
--------------------------------------------------------------------------------
/docs/tutorials.rst:
--------------------------------------------------------------------------------
1 | Tutorials
2 | =========
3 |
4 | The main purpose of the toolkit is to facilitate tracker evaluation for VOT challenges and benchmarks. But there are many other
5 | ways that the toolkit can be used and extended. The following tutorials are provided to help you get started with the toolkit.
6 |
7 | .. toctree::
8 | :maxdepth: 1
9 |
10 | tutorials/cli
11 | tutorials/workspace
12 | tutorials/integration
13 | tutorials/evaluation
14 | tutorials/dataset
15 | tutorials/stack
16 | tutorials/report
17 | tutorials/jupyter
18 |
--------------------------------------------------------------------------------
/docs/api/dataset.rst:
--------------------------------------------------------------------------------
1 | Dataset module
2 | ==============
3 |
4 | .. automodule:: vot.dataset
5 | :members:
6 |
7 | .. automodule:: vot.dataset.common
8 | :members:
9 |
10 | Extended dataset support
11 | ------------------------
12 |
13 | Many datasets are supported by the toolkit using special adapters.
14 |
15 | ### OTB
16 |
17 | .. automodule:: vot.dataset.otb
18 | :members:
19 |
20 | ### GOT10k
21 |
22 | .. automodule:: vot.dataset.got10k
23 | :members:
24 |
25 | ### TrackingNet
26 |
27 | .. automodule:: vot.dataset.trackingnet
28 | :members:
29 |
--------------------------------------------------------------------------------
/vot/stack/vot2018/longterm.yaml:
--------------------------------------------------------------------------------
1 | title: VOT-LT2018 challenge
2 | dataset: http://data.votchallenge.net/vot2018/longterm/description.json
3 | url: http://www.votchallenge.net/vot2018/
4 | experiments:
5 | longterm:
6 | type: unsupervised
7 | repetitions: 1
8 | analyses:
9 | - type: average_tpr
10 | name: average_tpr
11 | - type: pr_curve
12 | - type: f_curve
13 | redetection:
14 | type: unsupervised
15 | transformers:
16 | - type: redetection
17 | length: 200
18 | initialization: 5
19 | padding: 2
20 | scaling: 3
21 |
--------------------------------------------------------------------------------
/vot/stack/vot2019/longterm.yaml:
--------------------------------------------------------------------------------
1 | title: VOT-LT2019 challenge
2 | dataset: http://data.votchallenge.net/vot2019/longterm/description.json
3 | url: http://www.votchallenge.net/vot2019/
4 | experiments:
5 | longterm:
6 | type: unsupervised
7 | repetitions: 1
8 | analyses:
9 | - type: average_tpr
10 | name: average_tpr
11 | - type: pr_curve
12 | - type: f_curve
13 | redetection:
14 | type: unsupervised
15 | transformers:
16 | - type: redetection
17 | length: 200
18 | initialization: 5
19 | padding: 2
20 | scaling: 3
21 |
--------------------------------------------------------------------------------
/vot/stack/vot2020/longterm.yaml:
--------------------------------------------------------------------------------
1 | title: VOT-LT2020 challenge
2 | dataset: http://data.votchallenge.net/vot2019/longterm/description.json
3 | url: http://www.votchallenge.net/vot2020/
4 | experiments:
5 | longterm:
6 | type: unsupervised
7 | repetitions: 1
8 | analyses:
9 | - type: average_tpr
10 | name: average_tpr
11 | - type: pr_curve
12 | - type: f_curve
13 | redetection:
14 | type: unsupervised
15 | transformers:
16 | - type: redetection
17 | length: 200
18 | initialization: 5
19 | padding: 2
20 | scaling: 3
21 |
--------------------------------------------------------------------------------
/vot/stack/vot2021/longterm.yaml:
--------------------------------------------------------------------------------
1 | title: VOT-LT2021 challenge
2 | dataset: http://data.votchallenge.net/vot2019/longterm/description.json
3 | url: http://www.votchallenge.net/vot2021/
4 | experiments:
5 | longterm:
6 | type: unsupervised
7 | repetitions: 1
8 | analyses:
9 | - type: average_tpr
10 | name: average_tpr
11 | - type: pr_curve
12 | - type: f_curve
13 | redetection:
14 | type: unsupervised
15 | transformers:
16 | - type: redetection
17 | length: 200
18 | initialization: 5
19 | padding: 2
20 | scaling: 3
21 |
--------------------------------------------------------------------------------
/vot/stack/vot2022/longterm.yaml:
--------------------------------------------------------------------------------
1 | title: VOT-LT2022 challenge
2 | dataset: https://data.votchallenge.net/vot2022/lt/description.json
3 | url: https://www.votchallenge.net/vot2022/
4 | experiments:
5 | longterm:
6 | type: unsupervised
7 | repetitions: 1
8 | analyses:
9 | - type: average_tpr
10 | name: average_tpr
11 | - type: pr_curve
12 | - type: f_curve
13 | redetection:
14 | type: unsupervised
15 | transformers:
16 | - type: redetection
17 | length: 200
18 | initialization: 5
19 | padding: 2
20 | scaling: 3
21 |
--------------------------------------------------------------------------------
/vot/stack/tests/multiobject.yaml:
--------------------------------------------------------------------------------
1 | title: VOTS2023 Test Stack
2 | dataset: https://data.votchallenge.net/vots2023/test/description.json
3 | experiments:
4 | baseline:
5 | type: unsupervised
6 | repetitions: 1
7 | multiobject: True
8 | analyses:
9 | - type: average_accuracy
10 | name: Quality
11 | burnin: 0
12 | ignore_unknown: False
13 | weighted: False
14 | - type: average_success_plot
15 | name: Quality plot
16 | burnin: 0
17 | ignore_unknown: False
18 | - type: longterm_ar
19 | name: AR
20 | - type: average_quality_auxiliary
21 | name: Auxiliary
--------------------------------------------------------------------------------
/vot/stack/vot2016/rgb.yaml:
--------------------------------------------------------------------------------
1 | title: VOT2016 challenge
2 | dataset: https://data.votchallenge.net/vot2016/main/description.json
3 | url: https://www.votchallenge.net/vot2016/
4 | experiments:
5 | baseline:
6 | type: supervised
7 | repetitions: 15
8 | skip_initialize: 5
9 | analyses:
10 | - type: supervised_average_ar
11 | sensitivity: 30
12 | - type: cumulative_failures
13 | - type: supervised_eao_score
14 | low: 108
15 | high: 371
16 | - type: supervised_eao_curve
17 | unsupervised:
18 | type: unsupervised
19 | repetitions: 1
20 | analyses:
21 | - type: average_accuracy
22 |
--------------------------------------------------------------------------------
/vot/analysis/tests.py:
--------------------------------------------------------------------------------
1 | """ Unit tests for analysis module. """
2 |
3 |
4 | import unittest
5 |
6 | class Tests(unittest.TestCase):
7 | """ Unit tests for analysis module. """
8 |
9 | def test_perfect_accuracy(self):
10 | import numpy as np
11 |
12 | from vot.region import Rectangle, Special
13 | from vot.analysis.accuracy import gather_overlaps
14 |
15 | trajectory = [Rectangle(0, 0, 100, 100)] * 30
16 | groundtruth = [Rectangle(0, 0, 100, 100)] * 30
17 |
18 | trajectory[0] = Special(1)
19 |
20 | overlaps, _ = gather_overlaps(trajectory, groundtruth)
21 |
22 | self.assertEqual(np.mean(overlaps), 1)
--------------------------------------------------------------------------------
/.readthedocs.yaml:
--------------------------------------------------------------------------------
1 | # .readthedocs.yaml
2 | # Read the Docs configuration file
3 | # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
4 |
5 | # Required
6 | version: 2
7 |
8 | # Set the version of Python and other tools you might need
9 | build:
10 | os: ubuntu-22.04
11 | tools:
12 | python: "3.11"
13 |
14 | # Build documentation in the docs/ directory with Sphinx
15 | sphinx:
16 | configuration: docs/conf.py
17 |
18 | # We recommend specifying your dependencies to enable reproducible builds:
19 | # https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html
20 | python:
21 | install:
22 | - requirements: docs/requirements.txt
23 | - requirements: requirements.txt
--------------------------------------------------------------------------------
/vot/tracker/tests.py:
--------------------------------------------------------------------------------
1 | """ Unit tests for the tracker module. """
2 |
3 | import unittest
4 |
5 | from ..dataset.dummy import generate_dummy
6 | from ..tracker.dummy import DummyTracker
7 |
8 | class TestStacks(unittest.TestCase):
9 | """Tests for the stacks module."""
10 |
11 | def test_tracker_test(self):
12 | """Test tracker runtime with dummy sequence and dummy tracker."""
13 |
14 | tracker = DummyTracker
15 | sequence = generate_dummy(10)
16 |
17 | with tracker.runtime(log=False) as runtime:
18 | runtime.initialize(sequence.frame(0), sequence.groundtruth(0))
19 | for i in range(1, len(sequence)):
20 | runtime.update(sequence.frame(i))
21 |
--------------------------------------------------------------------------------
/docs/api/utilities.rst:
--------------------------------------------------------------------------------
1 | Utilities module
2 | ===============
3 |
4 | .. automodule:: vot.utilities
5 | :members:
6 |
7 | CLI
8 | ---
9 |
10 | .. automodule:: vot.utilities.cli
11 | :members:
12 |
13 | Data
14 | ----
15 |
16 | .. automodule:: vot.utilities.data
17 | :members:
18 |
19 | Drawing
20 | -------
21 |
22 | .. automodule:: vot.utilities.draw
23 | :members:
24 |
25 | Input/Output
26 | ------------
27 |
28 | .. automodule:: vot.utilities.io
29 | :members:
30 |
31 |
32 | Migration
33 |
34 | .. automodule:: vot.utilities.migration
35 | :members:
36 |
37 | Network
38 | --------
39 |
40 | .. automodule:: vot.utilities.net
41 | :members:
42 |
43 | Notebook
44 | --------
45 |
46 | .. automodule:: vot.utilities.notebook
47 | :members:
--------------------------------------------------------------------------------
/vot/stack/tests/segmentation.yaml:
--------------------------------------------------------------------------------
1 | title: VOT Segmentation testing
2 | url: http://www.votchallenge.net/
3 | dataset: http://box.vicos.si/tracking/vot20_test_dataset.zip
4 | experiments:
5 | baseline:
6 | type: multistart
7 | analyses:
8 | - type: multistart_average_ar
9 | - type: multistart_eao_score
10 | low: 100
11 | high: 300
12 | realtime:
13 | type: multistart
14 | realtime:
15 | grace: 3
16 | analyses:
17 | - type: multistart_average_ar
18 | - type: multistart_eao_score
19 | low: 100
20 | high: 300
21 | redetection:
22 | type: multistart
23 | transformers:
24 | - type: redetection
25 | length: 200
26 | initialization: 5
27 | padding: 2
28 | scaling: 3
--------------------------------------------------------------------------------
/vot/stack/vots2024/votstval.yaml:
--------------------------------------------------------------------------------
1 | title: VOTS2024 ST Challenge Validation Stack
2 | dataset: https://data.votchallenge.net/vots2024/vost-val/description.json
3 | experiments:
4 | baseline:
5 | type: unsupervised
6 | repetitions: 1
7 | multiobject: True
8 | analyses:
9 | - type: average_accuracy
10 | name: Quality
11 | burnin: 0
12 | ignore_unknown: False
13 | weighted: False
14 | filter_tag: evaluation
15 | - type: average_success_plot
16 | name: Quality plot
17 | burnin: 0
18 | ignore_unknown: False
19 | filter_tag: evaluation
20 | - type: longterm_ar
21 | name: AR
22 | filter_tag: evaluation
23 | - type: average_quality_auxiliary
24 | name: Auxiliary
25 | filter_tag: evaluation
--------------------------------------------------------------------------------
/vot/stack/vots2025/votstval.yaml:
--------------------------------------------------------------------------------
1 | title: VOTS2025 ST Challenge Validation Stack
2 | dataset: https://data.votchallenge.net/vots2024/vost-val/description.json
3 | experiments:
4 | baseline:
5 | type: unsupervised
6 | repetitions: 1
7 | multiobject: True
8 | analyses:
9 | - type: average_accuracy
10 | name: Quality
11 | burnin: 0
12 | ignore_unknown: False
13 | weighted: False
14 | filter_tag: evaluation
15 | - type: average_success_plot
16 | name: Quality plot
17 | burnin: 0
18 | ignore_unknown: False
19 | filter_tag: evaluation
20 | - type: longterm_ar
21 | name: AR
22 | filter_tag: evaluation
23 | - type: average_quality_auxiliary
24 | name: Auxiliary
25 | filter_tag: evaluation
26 |
--------------------------------------------------------------------------------
/vot/tracker/dummy.py:
--------------------------------------------------------------------------------
1 | """ Dummy tracker for testing purposes. """
2 |
3 | from __future__ import absolute_import
4 | import os
5 | from sys import path
6 | import time
7 |
8 | def _main():
9 | """ Dummy tracker main function for testing purposes."""
10 | from trax import Image, Region, Server, TraxStatus
11 |
12 | objects = None
13 | with Server([Region.RECTANGLE], [Image.PATH]) as server:
14 | while True:
15 | request = server.wait()
16 | if request.type in [TraxStatus.QUIT, TraxStatus.ERROR]:
17 | break
18 | if request.type == TraxStatus.INITIALIZE:
19 | objects = request.objects
20 | server.status(objects)
21 | time.sleep(0.1)
22 |
23 | if __name__ == '__main__':
24 | _main()
25 | else:
26 | from . import Tracker
27 |
28 | DummyTracker = Tracker("dummy", __file__, "vot.tracker.dummy", "traxpython", paths=[])
29 |
30 |
--------------------------------------------------------------------------------
/vot/stack/vot2019/shortterm.yaml:
--------------------------------------------------------------------------------
1 | title: VOT-ST2019 challenge
2 | dataset: http://data.votchallenge.net/vot2019/main/description.json
3 | url: http://www.votchallenge.net/vot2019/
4 | experiments:
5 | baseline:
6 | type: supervised
7 | repetitions: 15
8 | skip_initialize: 5
9 | analyses:
10 | - type: supervised_average_ar
11 | sensitivity: 30
12 | - type: supervised_eao_score
13 | low: 46
14 | high: 291
15 | - type: supervised_eao_curve
16 | realtime:
17 | type: supervised
18 | realtime:
19 | grace: 3
20 | repetitions: 1
21 | skip_initialize: 5
22 | analyses:
23 | - type: supervised_average_ar
24 | sensitivity: 30
25 | - type: supervised_eao_score
26 | low: 46
27 | high: 291
28 | - type: supervised_eao_curve
29 | unsupervised:
30 | type: unsupervised
31 | repetitions: 1
32 | analyses:
33 | - type: average_accuracy
--------------------------------------------------------------------------------
/vot/stack/vot2018/shortterm.yaml:
--------------------------------------------------------------------------------
1 | title: VOT-ST2018 challenge
2 | dataset: http://data.votchallenge.net/vot2018/main/description.json
3 | url: http://www.votchallenge.net/vot2018/
4 | experiments:
5 | baseline:
6 | type: supervised
7 | repetitions: 15
8 | skip_initialize: 5
9 | analyses:
10 | - type: supervised_average_ar
11 | sensitivity: 30
12 | - type: supervised_eao_score
13 | low: 100
14 | high: 356
15 | - type: supervised_eao_curve
16 | realtime:
17 | type: supervised
18 | realtime:
19 | grace: 3
20 | repetitions: 1
21 | skip_initialize: 5
22 | analyses:
23 | - type: supervised_average_ar
24 | sensitivity: 30
25 | - type: supervised_eao_score
26 | low: 100
27 | high: 356
28 | - type: supervised_eao_curve
29 | unsupervised:
30 | type: unsupervised
31 | repetitions: 1
32 | analyses:
33 | - type: average_accuracy
--------------------------------------------------------------------------------
/docs/tutorials/workspace.rst:
--------------------------------------------------------------------------------
1 | Workspace details
2 | =================
3 |
4 | A workspace is the top-level container for all of your data, experiments, and artifacts. The CLI can only manipulate a limited subset of the workspace's properties, more can be achieved by looking at its structure and files.
5 |
6 | Structure
7 | ---------
8 |
9 | The workspace is a directory with the following structure:
10 |
11 | * sequences/ - a directory containing all the sequences in the workspace
12 | * results/ - a directory containing all the results in the workspace
13 | * cache/ - a directory containing all the cache in the workspace
14 | * analysis/ - a directory containing all the analysis in the workspace
15 |
16 | Configuration
17 | -------------
18 |
19 | The workspace has a configuration file called `config.yaml` that contains all the configuration for the workspace. This file is usually automatically generated by the CLI, but can also be edited manually or even created from scratch.
--------------------------------------------------------------------------------
/docs/index.rst:
--------------------------------------------------------------------------------
1 | Welcome to the VOT Toolkit documentation
2 | ========================================
3 |
4 | The VOT toolkit is the official evaluation tool for the `Visual Object Tracking (VOT) challenge `_.
5 | It is written in Python 3 language. The toolkit is designed to be easy to use and to have broad support for various trackers,
6 | datasets and evaluation measures.
7 |
8 | Contributions and development
9 | -----------------------------
10 |
11 | The VOT toolkit is developed by the VOT Committee, primarily by `Luka Čehovin Zajc `_ and the tracking community as an open-source project (GPLv3 license).
12 |
13 | Contributions to the VOT toolkit are welcome, the preferred way to do it is by submitting an issue or a pull requests on `GitHub `_.
14 |
15 | Index
16 | -----
17 |
18 | .. toctree::
19 | :maxdepth: 1
20 |
21 | overview
22 | tutorials
23 | api
24 |
25 |
--------------------------------------------------------------------------------
/docs/api/analysis.rst:
--------------------------------------------------------------------------------
1 | Analysis module
2 | ===============
3 |
4 | The analysis module contains classes that implement various performance analysis methodologies. It also contains a parallel runtime with caching capabilities that
5 | enables efficient execution of large-scale evaluations.
6 |
7 | .. automodule:: vot.analysis
8 | :members:
9 |
10 | .. automodule:: vot.analysis.processor
11 | :members:
12 |
13 | Accuracy analysis
14 | -----------------
15 |
16 | .. automodule:: vot.analysis.accuracy
17 | :members:
18 |
19 | Failure analysis
20 | ----------------
21 |
22 | .. automodule:: vot.analysis.failures
23 | :members:
24 |
25 | Long-term measures
26 | ------------------
27 |
28 | .. automodule:: vot.analysis.longterm
29 | :members:
30 |
31 | Multi-start measures
32 | --------------------
33 |
34 | .. automodule:: vot.analysis.multistart
35 | :members:
36 |
37 | Supervision analysis
38 | --------------------
39 |
40 | .. automodule:: vot.analysis.supervised
41 | :members:
--------------------------------------------------------------------------------
/vot/stack/vot2017.yaml:
--------------------------------------------------------------------------------
1 | title: VOT2017 challenge
2 | dataset: http://data.votchallenge.net/vot2017/main/description.json
3 | url: http://www.votchallenge.net/vot2017/
4 | experiments:
5 | baseline:
6 | type: supervised
7 | repetitions: 15
8 | skip_initialize: 5
9 | analyses:
10 | - type: supervised_average_ar
11 | sensitivity: 30
12 | - type: cumulative_failures
13 | - type: supervised_eao_score
14 | low: 100
15 | high: 356
16 | - type: supervised_eao_curve
17 | realtime:
18 | type: supervised
19 | realtime:
20 | grace: 3
21 | repetitions: 1
22 | skip_initialize: 5
23 | analyses:
24 | - type: supervised_average_ar
25 | sensitivity: 30
26 | - type: cumulative_failures
27 | - type: supervised_eao_score
28 | low: 100
29 | high: 356
30 | - type: supervised_eao_curve
31 | unsupervised:
32 | type: unsupervised
33 | repetitions: 1
34 | analyses:
35 | - type: average_accuracy
--------------------------------------------------------------------------------
/vot/stack/vot2020/shortterm.yaml:
--------------------------------------------------------------------------------
1 | title: VOT-ST2020 challenge
2 | dataset: https://data.votchallenge.net/vot2020/shortterm/description.json
3 | url: http://www.votchallenge.net/vot2020/
4 | experiments:
5 | baseline:
6 | type: multistart
7 | analyses:
8 | - type: multistart_eao_score
9 | name: eaoscore
10 | low: 115
11 | high: 755
12 | - type: multistart_eao_curve
13 | name: eaocurve
14 | high: 755
15 | - type: multistart_average_ar
16 | name: ar
17 | realtime:
18 | type: multistart
19 | realtime:
20 | grace: 3
21 | analyses:
22 | - type: multistart_eao_score
23 | name: eaoscore
24 | low: 115
25 | high: 755
26 | - type: multistart_eao_curve
27 | name: eaocurve
28 | high: 755
29 | - type: multistart_average_ar
30 | name: ar
31 | unsupervised:
32 | type: unsupervised
33 | repetitions: 1
34 | analyses:
35 | - type: average_accuracy
36 | name: accuracy
37 | burnin: 1
--------------------------------------------------------------------------------
/vot/stack/vot2021/shortterm.yaml:
--------------------------------------------------------------------------------
1 | title: VOT-ST2021 challenge
2 | dataset: https://data.votchallenge.net/vot2021/shortterm/description.json
3 | url: http://www.votchallenge.net/vot2021/
4 | experiments:
5 | baseline:
6 | type: multistart
7 | analyses:
8 | - type: multistart_eao_score
9 | name: eaoscore
10 | low: 115
11 | high: 755
12 | - type: multistart_eao_curve
13 | name: eaocurve
14 | high: 755
15 | - type: multistart_average_ar
16 | name: ar
17 | realtime:
18 | type: multistart
19 | realtime:
20 | grace: 3
21 | analyses:
22 | - type: multistart_eao_score
23 | name: eaoscore
24 | low: 115
25 | high: 755
26 | - type: multistart_eao_curve
27 | name: eaocurve
28 | high: 755
29 | - type: multistart_average_ar
30 | name: ar
31 | unsupervised:
32 | type: unsupervised
33 | repetitions: 1
34 | analyses:
35 | - type: average_accuracy
36 | name: accuracy
37 | burnin: 1
--------------------------------------------------------------------------------
/vot/stack/vot2022/shortterm.yaml:
--------------------------------------------------------------------------------
1 | title: VOT-ST2021 segmentation challenge
2 | dataset: https://data.votchallenge.net/vot2022/sts/description.json
3 | url: https://www.votchallenge.net/vot2022/
4 | experiments:
5 | baseline:
6 | type: multistart
7 | analyses:
8 | - type: multistart_eao_score
9 | name: eaoscore
10 | low: 115
11 | high: 755
12 | - type: multistart_eao_curve
13 | name: eaocurve
14 | high: 755
15 | - type: multistart_average_ar
16 | name: ar
17 | realtime:
18 | type: multistart
19 | realtime:
20 | grace: 3
21 | analyses:
22 | - type: multistart_eao_score
23 | name: eaoscore
24 | low: 115
25 | high: 755
26 | - type: multistart_eao_curve
27 | name: eaocurve
28 | high: 755
29 | - type: multistart_average_ar
30 | name: ar
31 | unsupervised:
32 | type: unsupervised
33 | repetitions: 1
34 | analyses:
35 | - type: average_accuracy
36 | name: accuracy
37 | burnin: 1
--------------------------------------------------------------------------------
/vot/stack/vot2022/shorttermbox.yaml:
--------------------------------------------------------------------------------
1 | title: VOT-ST2022 bounding-box challenge
2 | dataset: https://data.votchallenge.net/vot2022/stb/description.json
3 | url: https://www.votchallenge.net/vot2022/
4 | experiments:
5 | baseline:
6 | type: multistart
7 | analyses:
8 | - type: multistart_eao_score
9 | name: eaoscore
10 | low: 115
11 | high: 755
12 | - type: multistart_eao_curve
13 | name: eaocurve
14 | high: 755
15 | - type: multistart_average_ar
16 | name: ar
17 | realtime:
18 | type: multistart
19 | realtime:
20 | grace: 3
21 | analyses:
22 | - type: multistart_eao_score
23 | name: eaoscore
24 | low: 115
25 | high: 755
26 | - type: multistart_eao_curve
27 | name: eaocurve
28 | high: 755
29 | - type: multistart_average_ar
30 | name: ar
31 | unsupervised:
32 | type: unsupervised
33 | repetitions: 1
34 | analyses:
35 | - type: average_accuracy
36 | name: accuracy
37 | burnin: 1
--------------------------------------------------------------------------------
/vot/stack/tests.py:
--------------------------------------------------------------------------------
1 | """Tests for the experiment stack module."""
2 |
3 | import unittest
4 | import yaml
5 |
6 | from vot.workspace import NullStorage
7 | from vot.stack import Stack, list_integrated_stacks, resolve_stack
8 |
9 | class NoWorkspace:
10 | """Empty workspace, does not save anything
11 | """
12 |
13 | @property
14 | def storage(self):
15 | """Returns the storage object for the workspace. """
16 | return NullStorage()
17 |
18 | class TestStacks(unittest.TestCase):
19 | """Tests for the experiment stack utilities
20 | """
21 |
22 | def test_stacks(self):
23 | """Test loading integrated stacks
24 | """
25 |
26 | stacks = list_integrated_stacks()
27 | for stack_name in stacks:
28 | try:
29 | with open(resolve_stack(stack_name), 'r') as fp:
30 | stack_metadata = yaml.load(fp, Loader=yaml.BaseLoader)
31 | Stack(stack_name, NoWorkspace(), **stack_metadata)
32 | except Exception as e:
33 | self.fail("Stack {}: {}".format(stack_name, e))
--------------------------------------------------------------------------------
/docs/tutorials/cli.rst:
--------------------------------------------------------------------------------
1 | Using the CLI
2 | ===============
3 |
4 | The CLI is a simple command line interface that allows you to interact with the toolkit for the most common tasks. It is a good starting point for new users. The CLI supports the following commands:
5 |
6 | - `initialize` - Initialize a new workspace
7 | - `test` - Run integration tests for a tracker
8 | - `evaluate` - Run the evaluation stack
9 | - `analyze` - Analyze the results
10 | - `pack` - Package results for submission to the evaluation server (used for competition submissions)
11 |
12 | To access the CLI, run `vot` or `python -m vot ` in the terminal. The CLI supports the `--help` option to display help for each command.
13 |
14 | Workspace initialization
15 | ------------------------
16 |
17 | To initialize a new workspace, run the following command:
18 |
19 | ```
20 | vot initialize
21 | ```
22 |
23 | This will create a new workspace in the specified directory.
24 |
25 | Integration tests
26 | -----------------
27 |
28 | To run integration tests for a tracker, run the following command:
29 |
30 | ```
31 | vot test
32 | ```
--------------------------------------------------------------------------------
/vot/report/report.js:
--------------------------------------------------------------------------------
1 |
2 | function get_tracker_id(el) {
3 | var id = $(el).attr("id");
4 | var index = id.lastIndexOf("_");
5 | return parseInt(id.substring(index+1));
6 | }
7 |
8 | function update_selected(el) {
9 |
10 | var selected = $("tr.selected");
11 | if (selected.length == 0) {
12 | $("g.tracker").removeClass("blurred");
13 | } else {
14 | $("g.tracker").addClass("blurred");
15 |
16 | selected.each(function (i, el) {
17 | var tracker = $(el).data("tracker");
18 | $("g.tracker_" + tracker).removeClass("blurred");
19 | });
20 | }
21 |
22 | }
23 |
24 | $(function() {
25 |
26 | var trackerNames={};
27 |
28 | $("td[id^='legend_']").each(function (i, el) {
29 | var tracker = get_tracker_id(el);
30 | $(el).addClass("tracker");
31 | trackerNames[tracker] = $(el).children("span").text();
32 | $(el).parent().click(function () {
33 | $(this).toggleClass("selected");
34 | update_selected();
35 | }).data("tracker", tracker);
36 | });
37 |
38 | $("g[id^='report_']").each(function (i, el) {
39 | var tracker = get_tracker_id(el);
40 | $(el).addClass("tracker tracker_" + tracker);
41 | $(el).find("path").after($("").text(trackerNames[tracker]));
42 | });
43 |
44 | $("table.overview-table").stupidtable();
45 |
46 |
47 |
48 |
49 |
50 | });
--------------------------------------------------------------------------------
/data/aliases/analysis.json:
--------------------------------------------------------------------------------
1 | {
2 | "accuracy": "vot.analysis.accuracy.SequenceAccuracy",
3 | "average_accuracy": "vot.analysis.accuracy.AverageAccuracy",
4 | "success_plot": "vot.analysis.accuracy.SuccessPlot",
5 | "average_success_plot": "vot.analysis.accuracy.AverageSuccessPlot",
6 |
7 | "failures": "vot.analysis.failures.FailureCount",
8 | "cumulative_failures": "vot.analysis.failures.CumulativeFailureCount",
9 |
10 | "pr_curves": "vot.analysis.longterm.PrecisionRecallCurves",
11 | "pr_curve": "vot.analysis.longterm.PrecisionRecallCurve",
12 | "f_curve": "vot.analysis.longterm.FScoreCurve",
13 | "average_tpr": "vot.analysis.longterm.PrecisionRecall",
14 | "quality_auxiliary": "vot.analysis.longterm.QualityAuxiliary",
15 | "average_quality_auxiliary": "vot.analysis.longterm.AverageQualityAuxiliary",
16 | "longterm_ar": "vot.analysis.longterm.AccuracyRobustness",
17 |
18 | "multistart_ar": "vot.analysis.multistart.AccuracyRobustness",
19 | "multistart_average_ar": "vot.analysis.multistart.AverageAccuracyRobustness",
20 | "multistart_fragments": "vot.analysis.multistart.MultiStartFragments",
21 | "multistart_eao_curves": "vot.analysis.multistart.EAOCurves",
22 | "multistart_eao_curve": "vot.analysis.multistart.EAOCurve",
23 | "multistart_eao_score": "vot.analysis.multistart.EAOScore",
24 |
25 | "supervised_ar": "vot.analysis.supervised.AccuracyRobustness",
26 | "supervised_average_ar": "vot.analysis.supervised.AverageAccuracyRobustness",
27 | "supervised_eao_curve": "vot.analysis.supervised.EAOCurve",
28 | "supervised_eao_score": "vot.analysis.supervised.EAOScore"
29 | }
--------------------------------------------------------------------------------
/vot/utilities/io.py:
--------------------------------------------------------------------------------
1 |
2 | import json
3 | import yaml
4 | import collections
5 | import datetime
6 | import numpy as np
7 |
8 | from vot.utilities.data import Grid
9 |
10 | class JSONEncoder(json.JSONEncoder):
11 | """ JSON encoder for internal types. """
12 |
13 | def default(self, o):
14 | """ Default encoder. """
15 | if isinstance(o, Grid):
16 | return list(o)
17 | elif isinstance(o, datetime.date):
18 | return o.strftime('%Y/%m/%d')
19 | elif isinstance(o, np.ndarray):
20 | return o.tolist()
21 | else:
22 | return super().default(o)
23 |
24 | class YAMLEncoder(yaml.Dumper):
25 | """ YAML encoder for internal types."""
26 |
27 | def represent_tuple(self, data):
28 | """ Represents a tuple. """
29 | return self.represent_list(list(data))
30 |
31 |
32 | def represent_object(self, o):
33 | """ Represents an object. """
34 | if isinstance(o, Grid):
35 | return self.represent_list(list(o))
36 | elif isinstance(o, datetime.date):
37 | return o.strftime('%Y/%m/%d')
38 | elif isinstance(o, np.ndarray):
39 | return self.represent_list(o.tolist())
40 | else:
41 | return super().represent_object(o)
42 |
43 | YAMLEncoder.add_representer(collections.OrderedDict, YAMLEncoder.represent_dict)
44 | YAMLEncoder.add_representer(tuple, YAMLEncoder.represent_tuple)
45 | YAMLEncoder.add_representer(Grid, YAMLEncoder.represent_object)
46 | YAMLEncoder.add_representer(np.ndarray,YAMLEncoder.represent_object)
47 | YAMLEncoder.add_multi_representer(np.integer, YAMLEncoder.represent_int)
48 | YAMLEncoder.add_multi_representer(np.inexact, YAMLEncoder.represent_float)
--------------------------------------------------------------------------------
/vot/experiment/helpers.py:
--------------------------------------------------------------------------------
1 | """ Helper classes for experiments."""
2 |
3 | from vot.dataset import Sequence
4 | from vot.region import RegionType
5 |
6 | def _objectstart(sequence: Sequence, id: str):
7 | """Returns the first frame where the object appears in the sequence."""
8 | trajectory = sequence.object(id)
9 | return [x is None or x.type == RegionType.SPECIAL for x in trajectory].index(False)
10 |
11 | class MultiObjectHelper(object):
12 | """Helper class for multi-object sequences. It provides methods for querying active objects at a given frame."""
13 |
14 | def __init__(self, sequence: Sequence):
15 | """Initialize the helper class.
16 |
17 | Args:
18 | sequence (Sequence): The sequence to be used.
19 | """
20 | self._sequence = sequence
21 | self._ids = list(sequence.objects())
22 | start = [_objectstart(sequence, id) for id in self._ids]
23 | self._ids = sorted(zip(start, self._ids), key=lambda x: x[0])
24 |
25 | def new(self, position: int):
26 | """Returns a list of objects that appear at the given frame.
27 |
28 | Args:
29 | position (int): The frame number.
30 |
31 | Returns:
32 | [list]: A list of object ids.
33 | """
34 | return [x[1] for x in self._ids if x[0] == position]
35 |
36 | def objects(self, position: int):
37 | """Returns a list of objects that are active at the given frame.
38 |
39 | Args:
40 | position (int): The frame number.
41 |
42 | Returns:
43 | [list]: A list of object ids.
44 | """
45 | return [x[1] for x in self._ids if x[0] <= position]
46 |
47 | def all(self):
48 | """Returns a list of all objects in the sequence.
49 |
50 | Returns:
51 | [list]: A list of object ids.
52 | """
53 | return [x[1] for x in self._ids]
--------------------------------------------------------------------------------
/vot/workspace/tests.py:
--------------------------------------------------------------------------------
1 | """Tests for workspace related methods and classes."""
2 |
3 | import logging
4 | import tempfile
5 | import unittest
6 | from vot import get_logger
7 | from vot.workspace.storage import Cache, LocalStorage
8 |
9 | from vot.workspace import Workspace, NullStorage
10 |
11 | class TestStacks(unittest.TestCase):
12 | """Tests for workspace related methods
13 | """
14 |
15 | def test_void_storage(self):
16 | """Test if void storage works
17 | """
18 |
19 | storage = NullStorage()
20 |
21 | with storage.write("test.data") as handle:
22 | handle.write("test")
23 |
24 | self.assertIsNone(storage.read("test.data"))
25 |
26 | def test_local_storage(self):
27 | """Test if local storage works
28 | """
29 |
30 | with tempfile.TemporaryDirectory() as testdir:
31 | storage = LocalStorage(testdir)
32 |
33 | with storage.write("test.txt") as handle:
34 | handle.write("Test")
35 |
36 | self.assertTrue(storage.isdocument("test.txt"))
37 |
38 | # TODO: more tests
39 |
40 | def test_workspace_create(self):
41 | """Test if workspace creation works
42 | """
43 |
44 | get_logger().setLevel(logging.WARN) # Disable progress bar
45 |
46 | default_config = dict(stack="tests/basic", registry=["./trackers.ini"])
47 |
48 | with tempfile.TemporaryDirectory() as testdir:
49 | Workspace.initialize(testdir, default_config, download=True)
50 | Workspace.load(testdir)
51 |
52 | def test_cache(self):
53 | """Test if local storage cache works
54 | """
55 |
56 | with tempfile.TemporaryDirectory() as testdir:
57 |
58 | cache = Cache(LocalStorage(testdir))
59 |
60 | self.assertFalse("test" in cache)
61 |
62 | cache["test"] = 1
63 |
64 | self.assertTrue("test" in cache)
65 |
66 | self.assertTrue(cache["test"] == 1)
67 |
68 | del cache["test"]
69 |
70 | self.assertRaises(KeyError, lambda: cache["test"])
--------------------------------------------------------------------------------
/setup.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 |
3 | from os.path import join, dirname, abspath, isfile
4 | from setuptools import find_packages, setup
5 | import json
6 |
7 | this_directory = abspath(dirname(__file__))
8 | with open(join(this_directory, 'README.md'), encoding='utf-8') as f:
9 | long_description = f.read()
10 |
11 | install_requires = []
12 | if isfile(join(this_directory, "requirements.txt")):
13 | with open(join(this_directory, "requirements.txt"), encoding='utf-8') as f:
14 | install_requires = f.readlines()
15 |
16 | __version__ = "0.0.0"
17 |
18 | exec(open(join(dirname(__file__), 'vot', 'version.py')).read())
19 |
20 | entrypoints = {
21 | 'console_scripts': ['vot=vot.utilities.cli:main'],
22 | }
23 |
24 | for r in ["analysis", "downloader", "experiment", "indexer", "loader", "transformer"]:
25 | registry = join(this_directory, "data", "aliases", r + ".json")
26 | if isfile(registry):
27 | try:
28 | with open(registry, encoding='utf-8') as f:
29 | data = json.load(f)
30 |
31 | entrypoints['vot_' + r] = ["%s=%s" % (k, ":".join(v.rsplit(".", 1))) for k, v in data.items()]
32 | except Exception:
33 | pass
34 |
35 | setup(name='vot-toolkit',
36 | version=__version__,
37 | description='Perform visual object tracking experiments and analyze results',
38 | long_description=long_description,
39 | long_description_content_type='text/markdown',
40 | author='Luka Cehovin Zajc',
41 | author_email='luka.cehovin@gmail.com',
42 | url='https://github.com/votchallenge/toolkit',
43 | packages=find_packages(),
44 | install_requires=install_requires,
45 | include_package_data=True,
46 | classifiers=[
47 | "Programming Language :: Python :: 3",
48 | "License :: OSI Approved :: GNU General Public License v3 (GPLv3)",
49 | "Operating System :: OS Independent",
50 | "Development Status :: 4 - Beta",
51 | "Intended Audience :: Science/Research",
52 | ],
53 | python_requires='>=3.7',
54 | entry_points=entrypoints,
55 | extras_require = {
56 | 'jupyter': ["ipywidgets", "jupyter", "itables"],
57 | },
58 | )
59 |
60 |
--------------------------------------------------------------------------------
/vot/report/report.css:
--------------------------------------------------------------------------------
1 |
2 | body {
3 | font-family:'Gill Sans', 'Gill Sans MT', Calibri, 'Trebuchet MS', sans-serif;
4 | background-color: #f8f8f8;
5 | }
6 |
7 | #wrapper {
8 | padding: 50px 20px 40px 20px;
9 | background-color: white;
10 | border-left: #dadada 1px solid;
11 | border-right: #dadada 1px solid;
12 | }
13 |
14 | #index {
15 | position:fixed;
16 | top: 0;
17 | left: 0;
18 | width: 100%;
19 | height: 50px;
20 | }
21 |
22 | #index h2 {
23 | display: none;
24 | }
25 |
26 | #index ol {
27 | list-style-type: none;
28 | padding: 0 20px;
29 | margin: 0;
30 | background-color: rgba(230, 230, 230, 0.9);
31 | border: 1px solid #e1e1e1;
32 | height: 50px;
33 | }
34 |
35 | #index li {
36 | display: inline-block;
37 | text-align: center;
38 | line-height: 50px;
39 | height: 50px;
40 | padding: 0 10px;
41 | }
42 |
43 | #index li a {
44 | text-decoration: none;
45 | color: #428BCA;
46 | font-weight: bold;
47 | font-size: larger;
48 | }
49 |
50 | #index li:hover {
51 | background-color: #428BCA;
52 | }
53 |
54 | #index li:hover a {
55 | color: white;
56 | }
57 |
58 | @media screen and (min-width: 1024px) {
59 | #index ol {
60 | width: 984px;
61 | margin: 0 auto;
62 | }
63 |
64 | #wrapper {
65 | width: 984px;
66 | margin: 0 auto;
67 | }
68 | }
69 |
70 | @media screen and (max-width: 1024px) {
71 |
72 | #index {
73 | width: 100%;
74 | }
75 |
76 | #wrapper {
77 | width: 100%;
78 | height: auto;
79 | }
80 | }
81 |
82 | #metadata {
83 | list-style-type: none;
84 | padding: 0;
85 | }
86 |
87 | #metadata li {
88 | margin-bottom: 10px;
89 | }
90 |
91 | #metadata li span {
92 | font-weight: bold;
93 | }
94 |
95 | #footer {
96 | text-align: center;
97 | margin-top: 20px;
98 | color: gray;
99 | font-size: smaller;
100 | }
101 |
102 | #footer a {
103 | color: #428BCA;
104 | text-decoration: none;
105 | }
106 |
107 | td span {
108 | vertical-align: super;
109 | }
110 |
111 | .first {
112 | font-weight: bold;
113 | color: red;
114 | }
115 |
116 | .second {
117 | font-weight: bold;
118 | color: green;
119 | }
120 |
121 | .third {
122 | font-weight: bold;
123 | color: blue;
124 | }
125 |
126 | table.pure-table-striped tbody tr:hover td {
127 | background-color: #ebebeb;
128 | }
129 |
130 | table.pure-table-striped tbody tr.selected td {
131 | background-color: #dadada;
132 | }
133 |
134 | table.pure-table-striped tbody tr.selected td span {
135 | font-weight: bold;
136 | }
137 |
138 | table.overview-table td svg {
139 | width: 1em;
140 | height: 1em;
141 | }
142 |
143 | g.blurred {
144 | opacity: 0.2;
145 | }
146 |
147 | div.graph {
148 | display: inline-block;
149 | }
150 |
151 | div.graph p {
152 | text-align: center;
153 | }
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 | The VOT evaluation toolkit
3 | ==========================
4 |
5 | [](https://vot-toolkit.readthedocs.io/en/latest/?badge=latest)
6 | [](https://badge.fury.io/py/vot-toolkit)
7 |
8 | This repository contains the official evaluation toolkit for the [Visual Object Tracking (VOT) challenge](http://votchallenge.net/). This is the official version of the toolkit, implemented in Python 3 language. If you are looking for the old Matlab version, you can find an archived repository [here](https://github.com/votchallenge/toolkit-legacy).
9 |
10 | For more detailed informations consult the documentation available [here](http://vot-toolkit.readthedocs.io/). You can also subscribe to the VOT [mailing list](https://liste.arnes.si/mailman3/lists/votchallenge.lists.arnes.si/) to receive news about challenges and important software updates or join our [support form](https://groups.google.com/forum/?hl=en#!forum/votchallenge-help) to ask questions.
11 |
12 | Developers
13 | ----------
14 |
15 | The VOT toolkit is developed and maintained by [Luka Čehovin Zajc](https://vicos.si/lukacu) with the help of the VOT innitiative members and the VOT community.
16 |
17 | Contributors:
18 |
19 | * [Luka Čehovin Zajc](https://vicos.si/lukacu), University of Ljubljana
20 | * [Alan Lukežič](https://vicos.si/people/alan_lukezic/), University of Ljubljana
21 | * Yan Song, Tampere University
22 |
23 | Acknowledgements
24 | ----------------
25 |
26 | The development of this package was supported by Slovenian research agency (ARRS) projects Z2-1866 and J2-316.
27 |
28 | License
29 | -------
30 |
31 | Copyright (C) 2024 Luka Čehovin Zajc and the [VOT Challenge innitiative](http://votchallenge.net/).
32 |
33 | This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
34 |
35 | This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
36 |
37 | You should have received a copy of the GNU General Public License along with this program. If not, see .
38 |
39 | Enquiries, Question and Comments
40 | --------------------------------
41 |
42 | If you have any further enquiries, question, or comments, please refer to the contact information link on the [VOT homepage](http://votchallenge.net/). If you would like to file a bug report or a feature request, use the [Github issue tracker](https://github.com/votchallenge/toolkit/issues). **The issue tracker is for toolkit issues only**, if you have a problem with tracker integration or any other questions, please use our [support forum](https://groups.google.com/forum/?hl=en#!forum/votchallenge-help).
43 |
--------------------------------------------------------------------------------
/docs/overview.rst:
--------------------------------------------------------------------------------
1 | Overview
2 | ========
3 |
4 | The toolkit is organized as a modular collection of classes and methods with several modules that address different aspects of the performance evaluation problem.
5 |
6 | Key concepts
7 | ------------
8 |
9 | Key concepts that are used throughout the toolkit are:
10 |
11 | * **Dataset** - a collection of sequences that is used for performance evaluation. A dataset is a collection of **sequences**.
12 | * **Sequence** - a sequence of frames with correspoding ground truth annotations for one or more objects. A sequence is a collection of **frames**.
13 | * **Tracker** - a tracker is an algorithm that takes frames from a sequence as input (one by one) and produces a set of **trajectories** as output.
14 | * **Experiment** - an experiment is a method that applies a tracker to a given sequence in a specific way.
15 | * **Analysis** - an analysis is a set of **measures** that are used to evaluate the performance of a tracker (compare predicted trajectories to groundtruth).
16 | * **Stack** - a stack is a collection of **experiments** and **analyses** that are performed on a given dataset.
17 | * **Workspace** - a workspace is a collection of experiments and analyses that are performed on a given dataset.
18 | * **Report** - a report is a representation of a list of analyses for a given experiment stack.
19 |
20 | Tracker support
21 | ---------------
22 |
23 | The toolkit supports various ways of interacting with a tracking methods. Primary manner (at the only supported at the moment) is using the TraX protocol.
24 | The toolkit provides a wrapper for the TraX protocol that allows to use any tracker that supports the protocol. Other ways of interacting with a tracker can be added in the future.
25 |
26 | Dataset support
27 | ---------------
28 |
29 | The toolkit is capable of using any dataset that is provided in the official format or by registering a custom loaders.
30 | The toolkit format is a simple directory structure that contains a set of sequences. Each sequence is a directory that contains a set of frames and a groundtruth file.
31 | The groundtruth file is a text file that contains one line per frame. Each line contains the bounding box of the object in the frame in the format `x,y,w,h`. The toolkit format is used by the toolkit itself and by the VOT challenges.
32 |
33 | Performance methodology support
34 | -------------------------------
35 |
36 | Various performance measures and visualzatons are implemented, most of them were used in VOT challenges.
37 |
38 | * **Accuracy** - the accuracy measure is the overlap between the predicted and groundtruth bounding boxes. The overlap is measured using the intersection over union (IoU) measure.
39 | * **Robustness** - the robustness measure is the number of failures of the tracker. A failure is defined as the overlap between the predicted and groundtruth bounding boxes being less than a certain threshold.
40 | * **Expected Average Overlap** - the expected average overlap (EAO) is a measure that combines accuracy and robustness into a single measure. The EAO is computed as the area under the accuracy-robustness curve.
41 | * **Expected Overlap** - the expected overlap (EO) is a measure that combines accuracy and robustness into a single measure. The EO is computed as the area under the accuracy-robustness curve.
42 |
--------------------------------------------------------------------------------
/docs/tutorials/dataset.rst:
--------------------------------------------------------------------------------
1 | Datasets
2 | ========
3 |
4 | The easiest way to use the VOT toolkit is by using one of the integrated stacks that also provides a dataset. Everything is provided, and you just select a stack.
5 | However, you can also use the toolkit with your own dataset. This document shows how to do this.
6 |
7 | Background
8 | ----------
9 |
10 | When loading an existing workspace, the toolkit will attempt to load anything that is available in the sequences subdirectory (by default this is `sequences`). The loading process is divided into two
11 | steps, first an indexer will scan the directory for sequences and return the list of available sequences. Then, the sequence loader will load the sequence metadata into the appropriate structure.
12 |
13 | This allows you some flexibility, you can organize your sequences in the format that the toolkit uses by default, or you can provide your own indexer and/or loader that will load the sequences from your custom format.
14 | The toolkit comes with several loaders integrated, e.g. it can load sequences in formats for OTB, GoT10k, LaSOT, and TrackingNet. You can also provide your own loader, if you have a custom format and do not want to change it.
15 |
16 | Default dataset format
17 | ----------------------
18 |
19 | The default dataset format is a directory with subdirectories for each sequence, accompanied by a `list.txt` file that contains the list of sequences.
20 |
21 | Each sequence directory contains the following units:
22 |
23 | - Metadata (`sequence`): A file with sequence metadata in INI (key-value) format. The metadata also defines which channels are available for the sequence.
24 | - Channels (usually `color`, `depth`, `ir`): Directories with images for each channel. The images are enumerated with a frame number and an extension that indicates the image format.
25 | - Annotations (either `groundtruth.txt` or `groundtruth_