pax_global_header 0000666 0000000 0000000 00000000064 14336540625 0014522 g ustar 00root root 0000000 0000000 52 comment=c4e779a9b0fea6630d779925ee006ba95fc539c9
got10k-toolkit-master/ 0000775 0000000 0000000 00000000000 14336540625 0015147 5 ustar 00root root 0000000 0000000 got10k-toolkit-master/.gitignore 0000664 0000000 0000000 00000000156 14336540625 0017141 0 ustar 00root root 0000000 0000000 .*
*.pyc
__pycache__/
data
data/
cache/
results/
reports/
profiles/
venv/
build/
dist/
*.egg-info
!.gitignore
got10k-toolkit-master/LICENSE 0000664 0000000 0000000 00000002041 14336540625 0016151 0 ustar 00root root 0000000 0000000 MIT License
Copyright (c) 2018
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
got10k-toolkit-master/MANIFEST.in 0000664 0000000 0000000 00000000107 14336540625 0016703 0 ustar 00root root 0000000 0000000 include got10k/datasets/uav123.json
include got10k/datasets/lasot.json
got10k-toolkit-master/README.md 0000664 0000000 0000000 00000020351 14336540625 0016427 0 ustar 00root root 0000000 0000000 # GOT-10k Python Toolkit
> UPDATE:
> All common tracking datasets (GOT-10k, OTB, VOT, UAV, TColor, DTB, NfS, LaSOT and TrackingNet) are supported.
> Support VOT2019 (ST/LT/RGBD/RGBT) downloading.
> Fix the randomness in ImageNet-VID ([issue #13](https://github.com/got-10k/toolkit/issues/13)).
_Run experimenets over common tracking benchmarks (code from [siamfc](https://github.com/got-10k/siamfc/blob/master/test.py)):_
This repository contains the official python toolkit for running experiments and evaluate performance on [GOT-10k](http://got-10k.aitestunion.com/) benchmark. The code is written in pure python and is compile-free. Although we support both python2 and python3, we recommend python3 for better performance.
For convenience, the toolkit also provides unofficial implementation of dataset interfaces and tracking pipelines for [OTB (2013/2015)](http://cvlab.hanyang.ac.kr/tracker_benchmark/index.html), [VOT (2013~2018)](http://votchallenge.net), [DTB70](https://github.com/flyers/drone-tracking), [TColor128](http://www.dabi.temple.edu/~hbling/data/TColor-128/TColor-128.html), [NfS (30/240 fps)](http://ci2cv.net/nfs/index.html), [UAV (123/20L)](https://ivul.kaust.edu.sa/Pages/pub-benchmark-simulator-uav.aspx), [LaSOT](https://cis.temple.edu/lasot/) and [TrackingNet](https://tracking-net.org/) benchmarks. It also offers interfaces for [ILSVRC VID](https://image-net.org/challenges/LSVRC/2015/#vid) and [YouTube-BoundingBox](https://research.google.com/youtube-bb/) (comming soon!) datasets.
[GOT-10k](http://got-10k.aitestunion.com/) is a large, high-diversity and one-shot database for training and evaluating generic purposed visual trackers. If you use the GOT-10k database or toolkits for a research publication, please consider citing:
```Bibtex
"GOT-10k: A Large High-Diversity Benchmark for Generic Object Tracking in the Wild."
L. Huang, X. Zhao and K. Huang,
arXiv:1810.11981, 2018.
```
\[[Project](http://got-10k.aitestunion.com/)\]\[[PDF](https://arxiv.org/abs/1810.11981)\]\[[Bibtex](http://got-10k.aitestunion.com/bibtex)\]
## Table of Contents
* [Installation](#installation)
* [Quick Start: A Concise Example](#quick-start-a-concise-example)
* [Quick Start: Jupyter Notebook for Off-the-Shelf Usage](#quick-start-jupyter-notebook-for-off-the-shelf-usage)
* [How to Define a Tracker?](#how-to-define-a-tracker)
* [How to Run Experiments on GOT-10k?](#how-to-run-experiments-on-got-10k)
* [How to Evaluate Performance?](#how-to-evaluate-performance)
* [How to Plot Success Curves?](#how-to-plot-success-curves)
* [How to Loop Over GOT-10k Dataset?](#how-to-loop-over-got-10k-dataset)
* [Issues](#issues)
* [Contributors](#contributors)
### Installation
Install the toolkit using `pip` (recommended):
```bash
pip install --upgrade got10k
```
Stay up-to-date:
```bash
pip install --upgrade git+https://github.com/got-10k/toolkit.git@master
```
Or, alternatively, clone the repository and install dependencies:
```
git clone https://github.com/got-10k/toolkit.git
cd toolkit
pip install -r requirements.txt
```
Then directly copy the `got10k` folder to your workspace to use it.
### Quick Start: A Concise Example
Here is a simple example on how to use the toolkit to define a tracker, run experiments on GOT-10k and evaluate performance.
```Python
from got10k.trackers import Tracker
from got10k.experiments import ExperimentGOT10k
class IdentityTracker(Tracker):
def __init__(self):
super(IdentityTracker, self).__init__(name='IdentityTracker')
def init(self, image, box):
self.box = box
def update(self, image):
return self.box
if __name__ == '__main__':
# setup tracker
tracker = IdentityTracker()
# run experiments on GOT-10k (validation subset)
experiment = ExperimentGOT10k('data/GOT-10k', subset='val')
experiment.run(tracker, visualize=True)
# report performance
experiment.report([tracker.name])
```
To run experiments on [OTB](http://cvlab.hanyang.ac.kr/tracker_benchmark/index.html), [VOT](http://votchallenge.net) or other benchmarks, simply change `ExperimentGOT10k`, e.g., to `ExperimentOTB` or `ExperimentVOT`, and `root_dir` to their corresponding paths for this purpose.
### Quick Start: Jupyter Notebook for Off-the-Shelf Usage
Open [quick_examples.ipynb](https://github.com/got-10k/toolkit/tree/master/examples/quick_examples.ipynb) in [Jupyter Notebook](http://jupyter.org/) to see more examples on toolkit usage.
### How to Define a Tracker?
To define a tracker using the toolkit, simply inherit and override `init` and `update` methods from the `Tracker` class. Here is a simple example:
```Python
from got10k.trackers import Tracker
class IdentityTracker(Tracker):
def __init__(self):
super(IdentityTracker, self).__init__(
name='IdentityTracker', # tracker name
is_deterministic=True # stochastic (False) or deterministic (True)
)
def init(self, image, box):
self.box = box
def update(self, image):
return self.box
```
### How to Run Experiments on GOT-10k?
Instantiate an `ExperimentGOT10k` object, and leave all experiment pipelines to its `run` method:
```Python
from got10k.experiments import ExperimentGOT10k
# ... tracker definition ...
# instantiate a tracker
tracker = IdentityTracker()
# setup experiment (validation subset)
experiment = ExperimentGOT10k(
root_dir='data/GOT-10k', # GOT-10k's root directory
subset='val', # 'train' | 'val' | 'test'
result_dir='results', # where to store tracking results
report_dir='reports' # where to store evaluation reports
)
experiment.run(tracker, visualize=True)
```
The tracking results will be stored in `result_dir`.
### How to Evaluate Performance?
Use the `report` method of `ExperimentGOT10k` for this purpose:
```Python
# ... run experiments on GOT-10k ...
# report tracking performance
experiment.report([tracker.name])
```
When evaluated on the __validation subset__, the scores and curves will be directly generated in `report_dir`.
However, when evaluated on the __test subset__, since all groundtruths are withholded, you will have to submit your results to the [evaluation server](http://got-10k.aitestunion.com/submit_instructions) for evaluation. The `report` function will generate a `.zip` file which can be directly uploaded for submission. For more instructions, see [submission instruction](http://got-10k.aitestunion.com/submit_instructions).
See public evaluation results on [GOT-10k's leaderboard](http://got-10k.aitestunion.com/leaderboard).
## How to Plot Success Curves?
Assume that a list of all performance files (JSON files) are stored in `report_files`, here is an example showing how to plot success curves:
```Python
from got10k.experiments import ExperimentGOT10k
report_files = ['reports/GOT-10k/performance_25_entries.json']
tracker_names = ['SiamFCv2', 'GOTURN', 'CCOT', 'MDNet']
# setup experiment and plot curves
experiment = ExperimentGOT10k('data/GOT-10k', subset='test')
experiment.plot_curves(report_files, tracker_names)
```
The report file of 25 baseline entries can be downloaded from the [Downloads page](http://got-10k.aitestunion.com/downloads). You can also download single report file for each entry from the [Leaderboard page](http://got-10k.aitestunion.com/leaderboard).
### How to Loop Over GOT-10k Dataset?
The `got10k.datasets.GOT10k` provides an iterable and indexable interface for GOT-10k's sequences. Here is an example:
```Python
from PIL import Image
from got10k.datasets import GOT10k
from got10k.utils.viz import show_frame
dataset = GOT10k(root_dir='data/GOT-10k', subset='train')
# indexing
img_file, anno = dataset[10]
# for-loop
for s, (img_files, anno) in enumerate(dataset):
seq_name = dataset.seq_names[s]
print('Sequence:', seq_name)
# show all frames
for f, img_file in enumerate(img_files):
image = Image.open(img_file)
show_frame(image, anno[f, :])
```
To loop over `OTB` or `VOT` datasets, simply change `GOT10k` to `OTB` or `VOT` for this purpose.
### Issues
Please report any problems or suggessions in the [Issues](https://github.com/got-10k/toolkit/issues) page.
### Contributors
- [Lianghua Huang](https://github.com/huanglianghua)
got10k-toolkit-master/examples/ 0000775 0000000 0000000 00000000000 14336540625 0016765 5 ustar 00root root 0000000 0000000 got10k-toolkit-master/examples/quick_examples.ipynb 0000664 0000000 0000000 00001210653 14336540625 0023052 0 ustar 00root root 0000000 0000000 {
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# GOT-10k Python Toolkit\n",
"\n",
"This notebook provides examples on how to use the GOT-10k toolkit."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"ROOT_DIR = '../data/GOT-10k'\n",
"OTB_DIR = '../data/OTB'\n",
"VOT_DIR = '../data/vot2018'\n",
"\n",
"%matplotlib inline\n",
"\n",
"from __future__ import absolute_import, print_function"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Running tracker IdentityTracker on GOT-10k...\n",
"--Sequence 1/180: GOT-10k_Val_000001\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000001/GOT-10k_Val_000001_001.txt\n",
"--Sequence 2/180: GOT-10k_Val_000002\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000002/GOT-10k_Val_000002_001.txt\n",
"--Sequence 3/180: GOT-10k_Val_000003\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000003/GOT-10k_Val_000003_001.txt\n",
"--Sequence 4/180: GOT-10k_Val_000004\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000004/GOT-10k_Val_000004_001.txt\n",
"--Sequence 5/180: GOT-10k_Val_000005\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000005/GOT-10k_Val_000005_001.txt\n",
"--Sequence 6/180: GOT-10k_Val_000006\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000006/GOT-10k_Val_000006_001.txt\n",
"--Sequence 7/180: GOT-10k_Val_000007\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000007/GOT-10k_Val_000007_001.txt\n",
"--Sequence 8/180: GOT-10k_Val_000008\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000008/GOT-10k_Val_000008_001.txt\n",
"--Sequence 9/180: GOT-10k_Val_000009\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000009/GOT-10k_Val_000009_001.txt\n",
"--Sequence 10/180: GOT-10k_Val_000010\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000010/GOT-10k_Val_000010_001.txt\n",
"--Sequence 11/180: GOT-10k_Val_000011\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000011/GOT-10k_Val_000011_001.txt\n",
"--Sequence 12/180: GOT-10k_Val_000012\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000012/GOT-10k_Val_000012_001.txt\n",
"--Sequence 13/180: GOT-10k_Val_000013\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000013/GOT-10k_Val_000013_001.txt\n",
"--Sequence 14/180: GOT-10k_Val_000014\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000014/GOT-10k_Val_000014_001.txt\n",
"--Sequence 15/180: GOT-10k_Val_000015\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000015/GOT-10k_Val_000015_001.txt\n",
"--Sequence 16/180: GOT-10k_Val_000016\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000016/GOT-10k_Val_000016_001.txt\n",
"--Sequence 17/180: GOT-10k_Val_000017\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000017/GOT-10k_Val_000017_001.txt\n",
"--Sequence 18/180: GOT-10k_Val_000018\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000018/GOT-10k_Val_000018_001.txt\n",
"--Sequence 19/180: GOT-10k_Val_000019\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000019/GOT-10k_Val_000019_001.txt\n",
"--Sequence 20/180: GOT-10k_Val_000020\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000020/GOT-10k_Val_000020_001.txt\n",
"--Sequence 21/180: GOT-10k_Val_000021\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000021/GOT-10k_Val_000021_001.txt\n",
"--Sequence 22/180: GOT-10k_Val_000022\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000022/GOT-10k_Val_000022_001.txt\n",
"--Sequence 23/180: GOT-10k_Val_000023\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000023/GOT-10k_Val_000023_001.txt\n",
"--Sequence 24/180: GOT-10k_Val_000024\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000024/GOT-10k_Val_000024_001.txt\n",
"--Sequence 25/180: GOT-10k_Val_000025\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000025/GOT-10k_Val_000025_001.txt\n",
"--Sequence 26/180: GOT-10k_Val_000026\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000026/GOT-10k_Val_000026_001.txt\n",
"--Sequence 27/180: GOT-10k_Val_000027\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000027/GOT-10k_Val_000027_001.txt\n",
"--Sequence 28/180: GOT-10k_Val_000028\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000028/GOT-10k_Val_000028_001.txt\n",
"--Sequence 29/180: GOT-10k_Val_000029\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000029/GOT-10k_Val_000029_001.txt\n",
"--Sequence 30/180: GOT-10k_Val_000030\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000030/GOT-10k_Val_000030_001.txt\n",
"--Sequence 31/180: GOT-10k_Val_000031\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000031/GOT-10k_Val_000031_001.txt\n",
"--Sequence 32/180: GOT-10k_Val_000032\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000032/GOT-10k_Val_000032_001.txt\n",
"--Sequence 33/180: GOT-10k_Val_000033\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000033/GOT-10k_Val_000033_001.txt\n",
"--Sequence 34/180: GOT-10k_Val_000034\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000034/GOT-10k_Val_000034_001.txt\n",
"--Sequence 35/180: GOT-10k_Val_000035\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000035/GOT-10k_Val_000035_001.txt\n",
"--Sequence 36/180: GOT-10k_Val_000036\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000036/GOT-10k_Val_000036_001.txt\n",
"--Sequence 37/180: GOT-10k_Val_000037\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000037/GOT-10k_Val_000037_001.txt\n",
"--Sequence 38/180: GOT-10k_Val_000038\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000038/GOT-10k_Val_000038_001.txt\n",
"--Sequence 39/180: GOT-10k_Val_000039\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000039/GOT-10k_Val_000039_001.txt\n",
"--Sequence 40/180: GOT-10k_Val_000040\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000040/GOT-10k_Val_000040_001.txt\n",
"--Sequence 41/180: GOT-10k_Val_000041\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000041/GOT-10k_Val_000041_001.txt\n",
"--Sequence 42/180: GOT-10k_Val_000042\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000042/GOT-10k_Val_000042_001.txt\n",
"--Sequence 43/180: GOT-10k_Val_000043\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000043/GOT-10k_Val_000043_001.txt\n",
"--Sequence 44/180: GOT-10k_Val_000044\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000044/GOT-10k_Val_000044_001.txt\n",
"--Sequence 45/180: GOT-10k_Val_000045\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000045/GOT-10k_Val_000045_001.txt\n",
"--Sequence 46/180: GOT-10k_Val_000046\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000046/GOT-10k_Val_000046_001.txt\n",
"--Sequence 47/180: GOT-10k_Val_000047\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000047/GOT-10k_Val_000047_001.txt\n",
"--Sequence 48/180: GOT-10k_Val_000048\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000048/GOT-10k_Val_000048_001.txt\n",
"--Sequence 49/180: GOT-10k_Val_000049\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000049/GOT-10k_Val_000049_001.txt\n",
"--Sequence 50/180: GOT-10k_Val_000050\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000050/GOT-10k_Val_000050_001.txt\n",
"--Sequence 51/180: GOT-10k_Val_000051\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000051/GOT-10k_Val_000051_001.txt\n",
"--Sequence 52/180: GOT-10k_Val_000052\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000052/GOT-10k_Val_000052_001.txt\n",
"--Sequence 53/180: GOT-10k_Val_000053\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000053/GOT-10k_Val_000053_001.txt\n",
"--Sequence 54/180: GOT-10k_Val_000054\n",
" Repetition: 1\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000054/GOT-10k_Val_000054_001.txt\n",
"--Sequence 55/180: GOT-10k_Val_000055\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000055/GOT-10k_Val_000055_001.txt\n",
"--Sequence 56/180: GOT-10k_Val_000056\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000056/GOT-10k_Val_000056_001.txt\n",
"--Sequence 57/180: GOT-10k_Val_000057\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000057/GOT-10k_Val_000057_001.txt\n",
"--Sequence 58/180: GOT-10k_Val_000058\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000058/GOT-10k_Val_000058_001.txt\n",
"--Sequence 59/180: GOT-10k_Val_000059\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000059/GOT-10k_Val_000059_001.txt\n",
"--Sequence 60/180: GOT-10k_Val_000060\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000060/GOT-10k_Val_000060_001.txt\n",
"--Sequence 61/180: GOT-10k_Val_000061\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000061/GOT-10k_Val_000061_001.txt\n",
"--Sequence 62/180: GOT-10k_Val_000062\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000062/GOT-10k_Val_000062_001.txt\n",
"--Sequence 63/180: GOT-10k_Val_000063\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000063/GOT-10k_Val_000063_001.txt\n",
"--Sequence 64/180: GOT-10k_Val_000064\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000064/GOT-10k_Val_000064_001.txt\n",
"--Sequence 65/180: GOT-10k_Val_000065\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000065/GOT-10k_Val_000065_001.txt\n",
"--Sequence 66/180: GOT-10k_Val_000066\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000066/GOT-10k_Val_000066_001.txt\n",
"--Sequence 67/180: GOT-10k_Val_000067\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000067/GOT-10k_Val_000067_001.txt\n",
"--Sequence 68/180: GOT-10k_Val_000068\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000068/GOT-10k_Val_000068_001.txt\n",
"--Sequence 69/180: GOT-10k_Val_000069\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000069/GOT-10k_Val_000069_001.txt\n",
"--Sequence 70/180: GOT-10k_Val_000070\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000070/GOT-10k_Val_000070_001.txt\n",
"--Sequence 71/180: GOT-10k_Val_000071\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000071/GOT-10k_Val_000071_001.txt\n",
"--Sequence 72/180: GOT-10k_Val_000072\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000072/GOT-10k_Val_000072_001.txt\n",
"--Sequence 73/180: GOT-10k_Val_000073\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000073/GOT-10k_Val_000073_001.txt\n",
"--Sequence 74/180: GOT-10k_Val_000074\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000074/GOT-10k_Val_000074_001.txt\n",
"--Sequence 75/180: GOT-10k_Val_000075\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000075/GOT-10k_Val_000075_001.txt\n",
"--Sequence 76/180: GOT-10k_Val_000076\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000076/GOT-10k_Val_000076_001.txt\n",
"--Sequence 77/180: GOT-10k_Val_000077\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000077/GOT-10k_Val_000077_001.txt\n",
"--Sequence 78/180: GOT-10k_Val_000078\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000078/GOT-10k_Val_000078_001.txt\n",
"--Sequence 79/180: GOT-10k_Val_000079\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000079/GOT-10k_Val_000079_001.txt\n",
"--Sequence 80/180: GOT-10k_Val_000080\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000080/GOT-10k_Val_000080_001.txt\n",
"--Sequence 81/180: GOT-10k_Val_000081\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000081/GOT-10k_Val_000081_001.txt\n",
"--Sequence 82/180: GOT-10k_Val_000082\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000082/GOT-10k_Val_000082_001.txt\n",
"--Sequence 83/180: GOT-10k_Val_000083\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000083/GOT-10k_Val_000083_001.txt\n",
"--Sequence 84/180: GOT-10k_Val_000084\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000084/GOT-10k_Val_000084_001.txt\n",
"--Sequence 85/180: GOT-10k_Val_000085\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000085/GOT-10k_Val_000085_001.txt\n",
"--Sequence 86/180: GOT-10k_Val_000086\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000086/GOT-10k_Val_000086_001.txt\n",
"--Sequence 87/180: GOT-10k_Val_000087\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000087/GOT-10k_Val_000087_001.txt\n",
"--Sequence 88/180: GOT-10k_Val_000088\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000088/GOT-10k_Val_000088_001.txt\n",
"--Sequence 89/180: GOT-10k_Val_000089\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000089/GOT-10k_Val_000089_001.txt\n",
"--Sequence 90/180: GOT-10k_Val_000090\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000090/GOT-10k_Val_000090_001.txt\n",
"--Sequence 91/180: GOT-10k_Val_000091\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000091/GOT-10k_Val_000091_001.txt\n",
"--Sequence 92/180: GOT-10k_Val_000092\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000092/GOT-10k_Val_000092_001.txt\n",
"--Sequence 93/180: GOT-10k_Val_000093\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000093/GOT-10k_Val_000093_001.txt\n",
"--Sequence 94/180: GOT-10k_Val_000094\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000094/GOT-10k_Val_000094_001.txt\n",
"--Sequence 95/180: GOT-10k_Val_000095\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000095/GOT-10k_Val_000095_001.txt\n",
"--Sequence 96/180: GOT-10k_Val_000096\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000096/GOT-10k_Val_000096_001.txt\n",
"--Sequence 97/180: GOT-10k_Val_000097\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000097/GOT-10k_Val_000097_001.txt\n",
"--Sequence 98/180: GOT-10k_Val_000098\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000098/GOT-10k_Val_000098_001.txt\n",
"--Sequence 99/180: GOT-10k_Val_000099\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000099/GOT-10k_Val_000099_001.txt\n",
"--Sequence 100/180: GOT-10k_Val_000100\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000100/GOT-10k_Val_000100_001.txt\n",
"--Sequence 101/180: GOT-10k_Val_000101\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000101/GOT-10k_Val_000101_001.txt\n",
"--Sequence 102/180: GOT-10k_Val_000102\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000102/GOT-10k_Val_000102_001.txt\n",
"--Sequence 103/180: GOT-10k_Val_000103\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000103/GOT-10k_Val_000103_001.txt\n",
"--Sequence 104/180: GOT-10k_Val_000104\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000104/GOT-10k_Val_000104_001.txt\n",
"--Sequence 105/180: GOT-10k_Val_000105\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000105/GOT-10k_Val_000105_001.txt\n",
"--Sequence 106/180: GOT-10k_Val_000106\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000106/GOT-10k_Val_000106_001.txt\n",
"--Sequence 107/180: GOT-10k_Val_000107\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000107/GOT-10k_Val_000107_001.txt\n",
"--Sequence 108/180: GOT-10k_Val_000108\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000108/GOT-10k_Val_000108_001.txt\n",
"--Sequence 109/180: GOT-10k_Val_000109\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000109/GOT-10k_Val_000109_001.txt\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"--Sequence 110/180: GOT-10k_Val_000110\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000110/GOT-10k_Val_000110_001.txt\n",
"--Sequence 111/180: GOT-10k_Val_000111\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000111/GOT-10k_Val_000111_001.txt\n",
"--Sequence 112/180: GOT-10k_Val_000112\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000112/GOT-10k_Val_000112_001.txt\n",
"--Sequence 113/180: GOT-10k_Val_000113\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000113/GOT-10k_Val_000113_001.txt\n",
"--Sequence 114/180: GOT-10k_Val_000114\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000114/GOT-10k_Val_000114_001.txt\n",
"--Sequence 115/180: GOT-10k_Val_000115\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000115/GOT-10k_Val_000115_001.txt\n",
"--Sequence 116/180: GOT-10k_Val_000116\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000116/GOT-10k_Val_000116_001.txt\n",
"--Sequence 117/180: GOT-10k_Val_000117\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000117/GOT-10k_Val_000117_001.txt\n",
"--Sequence 118/180: GOT-10k_Val_000118\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000118/GOT-10k_Val_000118_001.txt\n",
"--Sequence 119/180: GOT-10k_Val_000119\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000119/GOT-10k_Val_000119_001.txt\n",
"--Sequence 120/180: GOT-10k_Val_000120\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000120/GOT-10k_Val_000120_001.txt\n",
"--Sequence 121/180: GOT-10k_Val_000121\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000121/GOT-10k_Val_000121_001.txt\n",
"--Sequence 122/180: GOT-10k_Val_000122\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000122/GOT-10k_Val_000122_001.txt\n",
"--Sequence 123/180: GOT-10k_Val_000123\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000123/GOT-10k_Val_000123_001.txt\n",
"--Sequence 124/180: GOT-10k_Val_000124\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000124/GOT-10k_Val_000124_001.txt\n",
"--Sequence 125/180: GOT-10k_Val_000125\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000125/GOT-10k_Val_000125_001.txt\n",
"--Sequence 126/180: GOT-10k_Val_000126\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000126/GOT-10k_Val_000126_001.txt\n",
"--Sequence 127/180: GOT-10k_Val_000127\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000127/GOT-10k_Val_000127_001.txt\n",
"--Sequence 128/180: GOT-10k_Val_000128\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000128/GOT-10k_Val_000128_001.txt\n",
"--Sequence 129/180: GOT-10k_Val_000129\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000129/GOT-10k_Val_000129_001.txt\n",
"--Sequence 130/180: GOT-10k_Val_000130\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000130/GOT-10k_Val_000130_001.txt\n",
"--Sequence 131/180: GOT-10k_Val_000131\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000131/GOT-10k_Val_000131_001.txt\n",
"--Sequence 132/180: GOT-10k_Val_000132\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000132/GOT-10k_Val_000132_001.txt\n",
"--Sequence 133/180: GOT-10k_Val_000133\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000133/GOT-10k_Val_000133_001.txt\n",
"--Sequence 134/180: GOT-10k_Val_000134\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000134/GOT-10k_Val_000134_001.txt\n",
"--Sequence 135/180: GOT-10k_Val_000135\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000135/GOT-10k_Val_000135_001.txt\n",
"--Sequence 136/180: GOT-10k_Val_000136\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000136/GOT-10k_Val_000136_001.txt\n",
"--Sequence 137/180: GOT-10k_Val_000137\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000137/GOT-10k_Val_000137_001.txt\n",
"--Sequence 138/180: GOT-10k_Val_000138\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000138/GOT-10k_Val_000138_001.txt\n",
"--Sequence 139/180: GOT-10k_Val_000139\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000139/GOT-10k_Val_000139_001.txt\n",
"--Sequence 140/180: GOT-10k_Val_000140\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000140/GOT-10k_Val_000140_001.txt\n",
"--Sequence 141/180: GOT-10k_Val_000141\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000141/GOT-10k_Val_000141_001.txt\n",
"--Sequence 142/180: GOT-10k_Val_000142\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000142/GOT-10k_Val_000142_001.txt\n",
"--Sequence 143/180: GOT-10k_Val_000143\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000143/GOT-10k_Val_000143_001.txt\n",
"--Sequence 144/180: GOT-10k_Val_000144\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000144/GOT-10k_Val_000144_001.txt\n",
"--Sequence 145/180: GOT-10k_Val_000145\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000145/GOT-10k_Val_000145_001.txt\n",
"--Sequence 146/180: GOT-10k_Val_000146\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000146/GOT-10k_Val_000146_001.txt\n",
"--Sequence 147/180: GOT-10k_Val_000147\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000147/GOT-10k_Val_000147_001.txt\n",
"--Sequence 148/180: GOT-10k_Val_000148\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000148/GOT-10k_Val_000148_001.txt\n",
"--Sequence 149/180: GOT-10k_Val_000149\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000149/GOT-10k_Val_000149_001.txt\n",
"--Sequence 150/180: GOT-10k_Val_000150\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000150/GOT-10k_Val_000150_001.txt\n",
"--Sequence 151/180: GOT-10k_Val_000151\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000151/GOT-10k_Val_000151_001.txt\n",
"--Sequence 152/180: GOT-10k_Val_000152\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000152/GOT-10k_Val_000152_001.txt\n",
"--Sequence 153/180: GOT-10k_Val_000153\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000153/GOT-10k_Val_000153_001.txt\n",
"--Sequence 154/180: GOT-10k_Val_000154\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000154/GOT-10k_Val_000154_001.txt\n",
"--Sequence 155/180: GOT-10k_Val_000155\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000155/GOT-10k_Val_000155_001.txt\n",
"--Sequence 156/180: GOT-10k_Val_000156\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000156/GOT-10k_Val_000156_001.txt\n",
"--Sequence 157/180: GOT-10k_Val_000157\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000157/GOT-10k_Val_000157_001.txt\n",
"--Sequence 158/180: GOT-10k_Val_000158\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000158/GOT-10k_Val_000158_001.txt\n",
"--Sequence 159/180: GOT-10k_Val_000159\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000159/GOT-10k_Val_000159_001.txt\n",
"--Sequence 160/180: GOT-10k_Val_000160\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000160/GOT-10k_Val_000160_001.txt\n",
"--Sequence 161/180: GOT-10k_Val_000161\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000161/GOT-10k_Val_000161_001.txt\n",
"--Sequence 162/180: GOT-10k_Val_000162\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000162/GOT-10k_Val_000162_001.txt\n",
"--Sequence 163/180: GOT-10k_Val_000163\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000163/GOT-10k_Val_000163_001.txt\n",
"--Sequence 164/180: GOT-10k_Val_000164\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000164/GOT-10k_Val_000164_001.txt\n",
"--Sequence 165/180: GOT-10k_Val_000165\n",
" Repetition: 1\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000165/GOT-10k_Val_000165_001.txt\n",
"--Sequence 166/180: GOT-10k_Val_000166\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000166/GOT-10k_Val_000166_001.txt\n",
"--Sequence 167/180: GOT-10k_Val_000167\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000167/GOT-10k_Val_000167_001.txt\n",
"--Sequence 168/180: GOT-10k_Val_000168\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000168/GOT-10k_Val_000168_001.txt\n",
"--Sequence 169/180: GOT-10k_Val_000169\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000169/GOT-10k_Val_000169_001.txt\n",
"--Sequence 170/180: GOT-10k_Val_000170\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000170/GOT-10k_Val_000170_001.txt\n",
"--Sequence 171/180: GOT-10k_Val_000171\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000171/GOT-10k_Val_000171_001.txt\n",
"--Sequence 172/180: GOT-10k_Val_000172\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000172/GOT-10k_Val_000172_001.txt\n",
"--Sequence 173/180: GOT-10k_Val_000173\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000173/GOT-10k_Val_000173_001.txt\n",
"--Sequence 174/180: GOT-10k_Val_000174\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000174/GOT-10k_Val_000174_001.txt\n",
"--Sequence 175/180: GOT-10k_Val_000175\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000175/GOT-10k_Val_000175_001.txt\n",
"--Sequence 176/180: GOT-10k_Val_000176\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000176/GOT-10k_Val_000176_001.txt\n",
"--Sequence 177/180: GOT-10k_Val_000177\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000177/GOT-10k_Val_000177_001.txt\n",
"--Sequence 178/180: GOT-10k_Val_000178\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000178/GOT-10k_Val_000178_001.txt\n",
"--Sequence 179/180: GOT-10k_Val_000179\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000179/GOT-10k_Val_000179_001.txt\n",
"--Sequence 180/180: GOT-10k_Val_000180\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Val_000180/GOT-10k_Val_000180_001.txt\n",
"Evaluating IdentityTracker\n",
"Saving success plots to reports/GOT-10k/IdentityTracker/success_plot.png\n"
]
},
{
"data": {
"image/png": "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\njFJNfRQa9VPR1EehMbNvim4l5Ukko/dGfrrQUT0KPK1RREREyq5IhoyJwGXBu0xOJLDi4c8ulYiI\niEjZFLbLJWb2MtALSDOzDcBfgVgAd3+KwAOQ+gOrgGwCKy6KiIhIORG2kOHug4rY7xSyfLKIiIiU\nD5oOLSIiImGhkCEiIiJhoZAhIiIiYaGQISIiImGhkCEiIiJhoZAhIiIiYaGQISIiImGhkCEiIiJh\noZAhIiIiYaGQISIiImGhkCEiIiJhoZAhIiIiYaGQISIiImGhkCEiIiJhoZAhIiIiYaGQISIiImGh\nkCEiIiJhoZAhIiIiYaGQISIiImGhkCEiIiJhoZAhIiIiYaGQISIiImGhkCEiIiJhoZAhIiIiYaGQ\nISIiImGhkCEiIiJhoZAhIiIiYaGQISIiImGhkCEiIiJhoZAhIiIiYaGQISIiImGhkCEiIiJhoZAh\nIiIiYaGQISIiImGhkCEiIiJhoZAhIiIiYRHWkGFm/cxsuZmtMrM7CtnfwMymmdmXZrbIzPqHsx4R\nEREpOWELGWYWDYwBzgRaAYPMrFWBZncCr7h7e+Bi4Mlw1SMiIiIlK5wjGV2AVe6+xt0PAv8DBhRo\n40Dl4OtUYFMY6xEREZESFBPGY9cF1ud7vwHoWqDNPcAHZnYDkAz0LexAZnYNcA1Aeno6mZmZxV1r\nubN37171UxHUR6FRPxVNfSRSuHCGjFAMAl5w90fM7CTgRTM73t1z8zdy97HAWIAWLVp4r169Sr7S\nMiYzMxP109Gpj0Kjfiqa+kikcOG8XLIRqJ/vfb3gtvyuAl4BcPfZQAKQFsaaREREpISEM2R8DjQz\nswwziyMwsXNigTbfAn0AzOw4AiFjWxhrEhERkRIStpDh7jnAMGAK8BWBu0iWmtlIMzs32OwW4Goz\nWwi8DAxxdz/acbdmO3t/yAlX2SIiIlJMwjonw93fBd4tsO3ufK+XAd1/yTGzc5wBT3zC04M70bRG\nSvEUKiIiIsWuzK34WSspiqzsQ/xmzKe8v2RzpMsRERGRIyhzISMhBt65oQdNaqRw7X/m8+c3F7Nz\n38FIlyUiIiIFlLmQAVCnSiKv/OFEruqRwYTP19ProWk898laDh3OLfrDIiIiUiLKZMgAiI+J5q6z\nW/H+TSfTtn4VRk5aRr9/zuDjr7dQxNxRERERKQFlNmTkaVazEuOv7MK/L+vE4Vznyhfmcemzc1m2\n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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# 1. Quick Start: A Concise Example\n",
"\n",
"from got10k.trackers import Tracker\n",
"from got10k.experiments import ExperimentGOT10k\n",
"\n",
"class IdentityTracker(Tracker):\n",
" \"\"\"Example on how to define a tracker.\n",
"\n",
" To define a tracker, simply override ``init`` and ``update`` methods\n",
" from ``Tracker`` with your own pipelines.\n",
" \"\"\"\n",
" def __init__(self):\n",
" super(IdentityTracker, self).__init__(\n",
" name='IdentityTracker', # name of the tracker\n",
" is_deterministic=True # deterministic (True) or stochastic (False)\n",
" )\n",
" \n",
" def init(self, image, box):\n",
" \"\"\"Initialize your tracking model in the first frame\n",
" \n",
" Arguments:\n",
" image {PIL.Image} -- Image in the first frame.\n",
" box {np.ndarray} -- Target bounding box (4x1,\n",
" [left, top, width, height]) in the first frame.\n",
" \"\"\"\n",
" self.box = box\n",
"\n",
" def update(self, image):\n",
" \"\"\"Locate target in an new frame and return the estimated bounding box.\n",
" \n",
" Arguments:\n",
" image {PIL.Image} -- Image in a new frame.\n",
" \n",
" Returns:\n",
" np.ndarray -- Estimated target bounding box (4x1,\n",
" [left, top, width, height]) in ``image``.\n",
" \"\"\"\n",
" return self.box\n",
"\n",
"if __name__ == '__main__':\n",
" # setup tracker\n",
" tracker = IdentityTracker()\n",
"\n",
" # setup experiment (validation subset)\n",
" experiment = ExperimentGOT10k(\n",
" root_dir=ROOT_DIR, # GOT-10k's root directory\n",
" subset='val', # 'train' | 'val' | 'test'\n",
" result_dir='results', # where to store tracking results\n",
" report_dir='reports' # where to store evaluation reports\n",
" )\n",
"\n",
" # run experiments on GOT-10k\n",
" experiment.run(tracker, visualize=False)\n",
"\n",
" # report performance on GOT-10k (validation subset)\n",
" experiment.report([tracker.name])"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Sequence: GOT-10k_Val_000001\n",
"Sequence length: 60\n",
"Sequence: GOT-10k_Val_000002\n",
"Sequence length: 100\n",
"Sequence: GOT-10k_Val_000003\n",
"Sequence length: 80\n",
"Sequence: GOT-10k_Val_000004\n",
"Sequence length: 91\n",
"Sequence: GOT-10k_Val_000005\n",
"Sequence length: 80\n",
"Sequence: GOT-10k_Val_000006\n",
"Sequence length: 80\n",
"Sequence: GOT-10k_Val_000007\n",
"Sequence length: 100\n",
"Sequence: GOT-10k_Val_000008\n",
"Sequence length: 90\n",
"Sequence: GOT-10k_Val_000009\n",
"Sequence length: 100\n",
"Sequence: GOT-10k_Val_000010\n",
"Sequence length: 99\n",
"Sequence: GOT-10k_Val_000011\n",
"Sequence length: 100\n",
"Sequence: GOT-10k_Val_000012\n",
"Sequence length: 70\n",
"Sequence: GOT-10k_Val_000013\n",
"Sequence length: 100\n",
"Sequence: GOT-10k_Val_000014\n",
"Sequence length: 100\n",
"Sequence: GOT-10k_Val_000015\n",
"Sequence length: 120\n",
"Sequence: GOT-10k_Val_000016\n",
"Sequence length: 100\n",
"Sequence: GOT-10k_Val_000017\n",
"Sequence length: 100\n",
"Sequence: GOT-10k_Val_000018\n",
"Sequence length: 100\n",
"Sequence: GOT-10k_Val_000019\n",
"Sequence length: 100\n",
"Sequence: GOT-10k_Val_000020\n",
"Sequence length: 98\n",
"Sequence: GOT-10k_Val_000021\n",
"Sequence length: 110\n",
"Sequence: GOT-10k_Val_000022\n",
"Sequence length: 100\n",
"Sequence: GOT-10k_Val_000023\n",
"Sequence length: 80\n",
"Sequence: GOT-10k_Val_000024\n",
"Sequence length: 100\n",
"Sequence: GOT-10k_Val_000025\n",
"Sequence length: 110\n",
"Sequence: GOT-10k_Val_000026\n",
"Sequence length: 99\n",
"Sequence: GOT-10k_Val_000027\n",
"Sequence length: 100\n",
"Sequence: GOT-10k_Val_000028\n",
"Sequence length: 150\n",
"Sequence: GOT-10k_Val_000029\n",
"Sequence length: 120\n",
"Sequence: GOT-10k_Val_000030\n",
"Sequence length: 110\n",
"Sequence: GOT-10k_Val_000031\n",
"Sequence length: 100\n",
"Sequence: GOT-10k_Val_000032\n",
"Sequence length: 100\n",
"Sequence: GOT-10k_Val_000033\n",
"Sequence length: 100\n",
"Sequence: GOT-10k_Val_000034\n",
"Sequence length: 80\n",
"Sequence: GOT-10k_Val_000035\n",
"Sequence length: 70\n",
"Sequence: GOT-10k_Val_000036\n",
"Sequence length: 70\n",
"Sequence: GOT-10k_Val_000037\n",
"Sequence length: 80\n",
"Sequence: GOT-10k_Val_000038\n",
"Sequence length: 70\n",
"Sequence: GOT-10k_Val_000039\n",
"Sequence length: 90\n",
"Sequence: GOT-10k_Val_000040\n",
"Sequence length: 70\n",
"Sequence: GOT-10k_Val_000041\n",
"Sequence length: 100\n",
"Sequence: GOT-10k_Val_000042\n",
"Sequence length: 100\n",
"Sequence: GOT-10k_Val_000043\n",
"Sequence length: 100\n",
"Sequence: GOT-10k_Val_000044\n",
"Sequence length: 90\n",
"Sequence: GOT-10k_Val_000045\n",
"Sequence length: 100\n",
"Sequence: GOT-10k_Val_000046\n",
"Sequence length: 100\n",
"Sequence: GOT-10k_Val_000047\n",
"Sequence length: 70\n",
"Sequence: GOT-10k_Val_000048\n",
"Sequence length: 80\n",
"Sequence: GOT-10k_Val_000049\n",
"Sequence length: 80\n",
"Sequence: GOT-10k_Val_000050\n",
"Sequence length: 81\n",
"Sequence: GOT-10k_Val_000051\n",
"Sequence length: 91\n",
"Sequence: GOT-10k_Val_000052\n",
"Sequence length: 101\n",
"Sequence: GOT-10k_Val_000053\n",
"Sequence length: 101\n",
"Sequence: GOT-10k_Val_000054\n",
"Sequence length: 120\n",
"Sequence: GOT-10k_Val_000055\n",
"Sequence length: 71\n",
"Sequence: GOT-10k_Val_000056\n",
"Sequence length: 63\n",
"Sequence: GOT-10k_Val_000057\n",
"Sequence length: 64\n",
"Sequence: GOT-10k_Val_000058\n",
"Sequence length: 70\n",
"Sequence: GOT-10k_Val_000059\n",
"Sequence length: 96\n",
"Sequence: GOT-10k_Val_000060\n",
"Sequence length: 110\n",
"Sequence: GOT-10k_Val_000061\n",
"Sequence length: 101\n",
"Sequence: GOT-10k_Val_000062\n",
"Sequence length: 101\n",
"Sequence: GOT-10k_Val_000063\n",
"Sequence length: 81\n",
"Sequence: GOT-10k_Val_000064\n",
"Sequence length: 81\n",
"Sequence: GOT-10k_Val_000065\n",
"Sequence length: 101\n",
"Sequence: GOT-10k_Val_000066\n",
"Sequence length: 101\n",
"Sequence: GOT-10k_Val_000067\n",
"Sequence length: 70\n",
"Sequence: GOT-10k_Val_000068\n",
"Sequence length: 100\n",
"Sequence: GOT-10k_Val_000069\n",
"Sequence length: 101\n",
"Sequence: GOT-10k_Val_000070\n",
"Sequence length: 90\n",
"Sequence: GOT-10k_Val_000071\n",
"Sequence length: 81\n",
"Sequence: GOT-10k_Val_000072\n",
"Sequence length: 81\n",
"Sequence: GOT-10k_Val_000073\n",
"Sequence length: 91\n",
"Sequence: GOT-10k_Val_000074\n",
"Sequence length: 91\n",
"Sequence: GOT-10k_Val_000075\n",
"Sequence length: 101\n",
"Sequence: GOT-10k_Val_000076\n",
"Sequence length: 90\n",
"Sequence: GOT-10k_Val_000077\n",
"Sequence length: 100\n",
"Sequence: GOT-10k_Val_000078\n",
"Sequence length: 110\n",
"Sequence: GOT-10k_Val_000079\n",
"Sequence length: 100\n",
"Sequence: GOT-10k_Val_000080\n",
"Sequence length: 100\n",
"Sequence: GOT-10k_Val_000081\n",
"Sequence length: 110\n",
"Sequence: GOT-10k_Val_000082\n",
"Sequence length: 90\n",
"Sequence: GOT-10k_Val_000083\n",
"Sequence length: 100\n",
"Sequence: GOT-10k_Val_000084\n",
"Sequence length: 90\n",
"Sequence: GOT-10k_Val_000085\n",
"Sequence length: 100\n",
"Sequence: GOT-10k_Val_000086\n",
"Sequence length: 89\n",
"Sequence: GOT-10k_Val_000087\n",
"Sequence length: 100\n",
"Sequence: GOT-10k_Val_000088\n",
"Sequence length: 101\n",
"Sequence: GOT-10k_Val_000089\n",
"Sequence length: 111\n",
"Sequence: GOT-10k_Val_000090\n",
"Sequence length: 101\n",
"Sequence: GOT-10k_Val_000091\n",
"Sequence length: 81\n",
"Sequence: GOT-10k_Val_000092\n",
"Sequence length: 101\n",
"Sequence: GOT-10k_Val_000093\n",
"Sequence length: 81\n",
"Sequence: GOT-10k_Val_000094\n",
"Sequence length: 91\n",
"Sequence: GOT-10k_Val_000095\n",
"Sequence length: 80\n",
"Sequence: GOT-10k_Val_000096\n",
"Sequence length: 71\n",
"Sequence: GOT-10k_Val_000097\n",
"Sequence length: 70\n",
"Sequence: GOT-10k_Val_000098\n",
"Sequence length: 101\n",
"Sequence: GOT-10k_Val_000099\n",
"Sequence length: 100\n",
"Sequence: GOT-10k_Val_000100\n",
"Sequence length: 101\n",
"Sequence: GOT-10k_Val_000101\n",
"Sequence length: 121\n",
"Sequence: GOT-10k_Val_000102\n",
"Sequence length: 100\n",
"Sequence: GOT-10k_Val_000103\n",
"Sequence length: 390\n",
"Sequence: GOT-10k_Val_000104\n",
"Sequence length: 110\n",
"Sequence: GOT-10k_Val_000105\n",
"Sequence length: 80\n",
"Sequence: GOT-10k_Val_000106\n",
"Sequence length: 161\n",
"Sequence: GOT-10k_Val_000107\n",
"Sequence length: 91\n",
"Sequence: GOT-10k_Val_000108\n",
"Sequence length: 201\n",
"Sequence: GOT-10k_Val_000109\n",
"Sequence length: 81\n",
"Sequence: GOT-10k_Val_000110\n",
"Sequence length: 471\n",
"Sequence: GOT-10k_Val_000111\n",
"Sequence length: 81\n",
"Sequence: GOT-10k_Val_000112\n",
"Sequence length: 131\n",
"Sequence: GOT-10k_Val_000113\n",
"Sequence length: 131\n",
"Sequence: GOT-10k_Val_000114\n",
"Sequence length: 181\n",
"Sequence: GOT-10k_Val_000115\n",
"Sequence length: 81\n",
"Sequence: GOT-10k_Val_000116\n",
"Sequence length: 297\n",
"Sequence: GOT-10k_Val_000117\n",
"Sequence length: 101\n",
"Sequence: GOT-10k_Val_000118\n",
"Sequence length: 201\n",
"Sequence: GOT-10k_Val_000119\n",
"Sequence length: 251\n",
"Sequence: GOT-10k_Val_000120\n",
"Sequence length: 70\n",
"Sequence: GOT-10k_Val_000121\n",
"Sequence length: 131\n",
"Sequence: GOT-10k_Val_000122\n",
"Sequence length: 419\n",
"Sequence: GOT-10k_Val_000123\n",
"Sequence length: 140\n",
"Sequence: GOT-10k_Val_000124\n",
"Sequence length: 181\n",
"Sequence: GOT-10k_Val_000125\n",
"Sequence length: 431\n",
"Sequence: GOT-10k_Val_000126\n",
"Sequence length: 101\n",
"Sequence: GOT-10k_Val_000127\n",
"Sequence length: 101\n",
"Sequence: GOT-10k_Val_000128\n",
"Sequence length: 100\n",
"Sequence: GOT-10k_Val_000129\n",
"Sequence length: 101\n",
"Sequence: GOT-10k_Val_000130\n",
"Sequence length: 91\n",
"Sequence: GOT-10k_Val_000131\n",
"Sequence length: 81\n",
"Sequence: GOT-10k_Val_000132\n",
"Sequence length: 91\n",
"Sequence: GOT-10k_Val_000133\n",
"Sequence length: 101\n",
"Sequence: GOT-10k_Val_000134\n",
"Sequence length: 100\n",
"Sequence: GOT-10k_Val_000135\n",
"Sequence length: 91\n",
"Sequence: GOT-10k_Val_000136\n",
"Sequence length: 121\n",
"Sequence: GOT-10k_Val_000137\n",
"Sequence length: 301\n",
"Sequence: GOT-10k_Val_000138\n",
"Sequence length: 91\n",
"Sequence: GOT-10k_Val_000139\n",
"Sequence length: 101\n",
"Sequence: GOT-10k_Val_000140\n",
"Sequence length: 101\n",
"Sequence: GOT-10k_Val_000141\n",
"Sequence length: 121\n",
"Sequence: GOT-10k_Val_000142\n",
"Sequence length: 91\n",
"Sequence: GOT-10k_Val_000143\n",
"Sequence length: 81\n",
"Sequence: GOT-10k_Val_000144\n",
"Sequence length: 81\n",
"Sequence: GOT-10k_Val_000145\n",
"Sequence length: 101\n",
"Sequence: GOT-10k_Val_000146\n",
"Sequence length: 81\n",
"Sequence: GOT-10k_Val_000147\n",
"Sequence length: 81\n",
"Sequence: GOT-10k_Val_000148\n",
"Sequence length: 81\n",
"Sequence: GOT-10k_Val_000149\n",
"Sequence length: 80\n",
"Sequence: GOT-10k_Val_000150\n",
"Sequence length: 83\n",
"Sequence: GOT-10k_Val_000151\n",
"Sequence length: 60\n",
"Sequence: GOT-10k_Val_000152\n",
"Sequence length: 74\n",
"Sequence: GOT-10k_Val_000153\n",
"Sequence length: 81\n",
"Sequence: GOT-10k_Val_000154\n",
"Sequence length: 81\n",
"Sequence: GOT-10k_Val_000155\n",
"Sequence length: 90\n",
"Sequence: GOT-10k_Val_000156\n",
"Sequence length: 281\n",
"Sequence: GOT-10k_Val_000157\n",
"Sequence length: 81\n",
"Sequence: GOT-10k_Val_000158\n",
"Sequence length: 81\n",
"Sequence: GOT-10k_Val_000159\n",
"Sequence length: 80\n",
"Sequence: GOT-10k_Val_000160\n",
"Sequence length: 81\n",
"Sequence: GOT-10k_Val_000161\n",
"Sequence length: 80\n",
"Sequence: GOT-10k_Val_000162\n",
"Sequence length: 81\n",
"Sequence: GOT-10k_Val_000163\n",
"Sequence length: 90\n",
"Sequence: GOT-10k_Val_000164\n",
"Sequence length: 75\n",
"Sequence: GOT-10k_Val_000165\n",
"Sequence length: 101\n",
"Sequence: GOT-10k_Val_000166\n",
"Sequence length: 100\n",
"Sequence: GOT-10k_Val_000167\n",
"Sequence length: 101\n",
"Sequence: GOT-10k_Val_000168\n",
"Sequence length: 91\n",
"Sequence: GOT-10k_Val_000169\n",
"Sequence length: 91\n",
"Sequence: GOT-10k_Val_000170\n",
"Sequence length: 91\n",
"Sequence: GOT-10k_Val_000171\n",
"Sequence length: 91\n",
"Sequence: GOT-10k_Val_000172\n",
"Sequence length: 211\n",
"Sequence: GOT-10k_Val_000173\n",
"Sequence length: 400\n",
"Sequence: GOT-10k_Val_000174\n",
"Sequence length: 391\n",
"Sequence: GOT-10k_Val_000175\n",
"Sequence length: 271\n",
"Sequence: GOT-10k_Val_000176\n",
"Sequence length: 291\n",
"Sequence: GOT-10k_Val_000177\n",
"Sequence length: 178\n",
"Sequence: GOT-10k_Val_000178\n",
"Sequence length: 261\n",
"Sequence: GOT-10k_Val_000179\n",
"Sequence length: 421\n",
"Sequence: GOT-10k_Val_000180\n",
"Sequence length: 108\n"
]
},
{
"data": {
"image/png": "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\nRgAAAABJRU5ErkJggg==\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# 2. Loop Over GOT-10k\n",
"\n",
"from PIL import Image\n",
"from got10k.datasets import GOT10k\n",
"from got10k.utils.viz import show_frame\n",
"\n",
"# setup dataset\n",
"dataset = GOT10k(ROOT_DIR, subset='val')\n",
"\n",
"# index dataset\n",
"img_files, anno = dataset[10]\n",
"\n",
"# loop over the complete dataset\n",
"for s, (img_files, anno) in enumerate(dataset):\n",
" seq_name = dataset.seq_names[s]\n",
" print('Sequence:', seq_name)\n",
" \n",
" assert len(img_files) == len(anno)\n",
" print('Sequence length:', len(img_files))\n",
" \n",
"# visualize an example\n",
"image = Image.open(img_files[10])\n",
"show_frame(image, anno[10, :])"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\u001b[93m[WARNING]:\n",
"The groundtruths of GOT-10k's test set is withholded.\n",
"You will have to submit your results to\n",
"[http://got-10k.aitestunion.com/]\n",
"to access the performance.\u001b[0m\n",
"Running tracker IdentityTracker on GOT-10k...\n",
"--Sequence 1/180: GOT-10k_Test_000001\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000001/GOT-10k_Test_000001_001.txt\n",
"--Sequence 2/180: GOT-10k_Test_000002\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000002/GOT-10k_Test_000002_001.txt\n",
"--Sequence 3/180: GOT-10k_Test_000003\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000003/GOT-10k_Test_000003_001.txt\n",
"--Sequence 4/180: GOT-10k_Test_000004\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000004/GOT-10k_Test_000004_001.txt\n",
"--Sequence 5/180: GOT-10k_Test_000005\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000005/GOT-10k_Test_000005_001.txt\n",
"--Sequence 6/180: GOT-10k_Test_000006\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000006/GOT-10k_Test_000006_001.txt\n",
"--Sequence 7/180: GOT-10k_Test_000007\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000007/GOT-10k_Test_000007_001.txt\n",
"--Sequence 8/180: GOT-10k_Test_000008\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000008/GOT-10k_Test_000008_001.txt\n",
"--Sequence 9/180: GOT-10k_Test_000009\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000009/GOT-10k_Test_000009_001.txt\n",
"--Sequence 10/180: GOT-10k_Test_000010\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000010/GOT-10k_Test_000010_001.txt\n",
"--Sequence 11/180: GOT-10k_Test_000011\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000011/GOT-10k_Test_000011_001.txt\n",
"--Sequence 12/180: GOT-10k_Test_000012\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000012/GOT-10k_Test_000012_001.txt\n",
"--Sequence 13/180: GOT-10k_Test_000013\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000013/GOT-10k_Test_000013_001.txt\n",
"--Sequence 14/180: GOT-10k_Test_000014\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000014/GOT-10k_Test_000014_001.txt\n",
"--Sequence 15/180: GOT-10k_Test_000015\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000015/GOT-10k_Test_000015_001.txt\n",
"--Sequence 16/180: GOT-10k_Test_000016\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000016/GOT-10k_Test_000016_001.txt\n",
"--Sequence 17/180: GOT-10k_Test_000017\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000017/GOT-10k_Test_000017_001.txt\n",
"--Sequence 18/180: GOT-10k_Test_000018\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000018/GOT-10k_Test_000018_001.txt\n",
"--Sequence 19/180: GOT-10k_Test_000019\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000019/GOT-10k_Test_000019_001.txt\n",
"--Sequence 20/180: GOT-10k_Test_000020\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000020/GOT-10k_Test_000020_001.txt\n",
"--Sequence 21/180: GOT-10k_Test_000021\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000021/GOT-10k_Test_000021_001.txt\n",
"--Sequence 22/180: GOT-10k_Test_000022\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000022/GOT-10k_Test_000022_001.txt\n",
"--Sequence 23/180: GOT-10k_Test_000023\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000023/GOT-10k_Test_000023_001.txt\n",
"--Sequence 24/180: GOT-10k_Test_000024\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000024/GOT-10k_Test_000024_001.txt\n",
"--Sequence 25/180: GOT-10k_Test_000025\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000025/GOT-10k_Test_000025_001.txt\n",
"--Sequence 26/180: GOT-10k_Test_000026\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000026/GOT-10k_Test_000026_001.txt\n",
"--Sequence 27/180: GOT-10k_Test_000027\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000027/GOT-10k_Test_000027_001.txt\n",
"--Sequence 28/180: GOT-10k_Test_000028\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000028/GOT-10k_Test_000028_001.txt\n",
"--Sequence 29/180: GOT-10k_Test_000029\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000029/GOT-10k_Test_000029_001.txt\n",
"--Sequence 30/180: GOT-10k_Test_000030\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000030/GOT-10k_Test_000030_001.txt\n",
"--Sequence 31/180: GOT-10k_Test_000031\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000031/GOT-10k_Test_000031_001.txt\n",
"--Sequence 32/180: GOT-10k_Test_000032\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000032/GOT-10k_Test_000032_001.txt\n",
"--Sequence 33/180: GOT-10k_Test_000033\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000033/GOT-10k_Test_000033_001.txt\n",
"--Sequence 34/180: GOT-10k_Test_000034\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000034/GOT-10k_Test_000034_001.txt\n",
"--Sequence 35/180: GOT-10k_Test_000035\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000035/GOT-10k_Test_000035_001.txt\n",
"--Sequence 36/180: GOT-10k_Test_000036\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000036/GOT-10k_Test_000036_001.txt\n",
"--Sequence 37/180: GOT-10k_Test_000037\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000037/GOT-10k_Test_000037_001.txt\n",
"--Sequence 38/180: GOT-10k_Test_000038\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000038/GOT-10k_Test_000038_001.txt\n",
"--Sequence 39/180: GOT-10k_Test_000039\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000039/GOT-10k_Test_000039_001.txt\n",
"--Sequence 40/180: GOT-10k_Test_000040\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000040/GOT-10k_Test_000040_001.txt\n",
"--Sequence 41/180: GOT-10k_Test_000041\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000041/GOT-10k_Test_000041_001.txt\n",
"--Sequence 42/180: GOT-10k_Test_000042\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000042/GOT-10k_Test_000042_001.txt\n",
"--Sequence 43/180: GOT-10k_Test_000043\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000043/GOT-10k_Test_000043_001.txt\n",
"--Sequence 44/180: GOT-10k_Test_000044\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000044/GOT-10k_Test_000044_001.txt\n",
"--Sequence 45/180: GOT-10k_Test_000045\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000045/GOT-10k_Test_000045_001.txt\n",
"--Sequence 46/180: GOT-10k_Test_000046\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000046/GOT-10k_Test_000046_001.txt\n",
"--Sequence 47/180: GOT-10k_Test_000047\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000047/GOT-10k_Test_000047_001.txt\n",
"--Sequence 48/180: GOT-10k_Test_000048\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000048/GOT-10k_Test_000048_001.txt\n",
"--Sequence 49/180: GOT-10k_Test_000049\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000049/GOT-10k_Test_000049_001.txt\n",
"--Sequence 50/180: GOT-10k_Test_000050\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000050/GOT-10k_Test_000050_001.txt\n",
"--Sequence 51/180: GOT-10k_Test_000051\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000051/GOT-10k_Test_000051_001.txt\n",
"--Sequence 52/180: GOT-10k_Test_000052\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000052/GOT-10k_Test_000052_001.txt\n",
"--Sequence 53/180: GOT-10k_Test_000053\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000053/GOT-10k_Test_000053_001.txt\n",
"--Sequence 54/180: GOT-10k_Test_000054\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000054/GOT-10k_Test_000054_001.txt\n",
"--Sequence 55/180: GOT-10k_Test_000055\n",
" Repetition: 1\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000055/GOT-10k_Test_000055_001.txt\n",
"--Sequence 56/180: GOT-10k_Test_000056\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000056/GOT-10k_Test_000056_001.txt\n",
"--Sequence 57/180: GOT-10k_Test_000057\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000057/GOT-10k_Test_000057_001.txt\n",
"--Sequence 58/180: GOT-10k_Test_000058\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000058/GOT-10k_Test_000058_001.txt\n",
"--Sequence 59/180: GOT-10k_Test_000059\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000059/GOT-10k_Test_000059_001.txt\n",
"--Sequence 60/180: GOT-10k_Test_000060\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000060/GOT-10k_Test_000060_001.txt\n",
"--Sequence 61/180: GOT-10k_Test_000061\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000061/GOT-10k_Test_000061_001.txt\n",
"--Sequence 62/180: GOT-10k_Test_000062\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000062/GOT-10k_Test_000062_001.txt\n",
"--Sequence 63/180: GOT-10k_Test_000063\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000063/GOT-10k_Test_000063_001.txt\n",
"--Sequence 64/180: GOT-10k_Test_000064\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000064/GOT-10k_Test_000064_001.txt\n",
"--Sequence 65/180: GOT-10k_Test_000065\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000065/GOT-10k_Test_000065_001.txt\n",
"--Sequence 66/180: GOT-10k_Test_000066\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000066/GOT-10k_Test_000066_001.txt\n",
"--Sequence 67/180: GOT-10k_Test_000067\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000067/GOT-10k_Test_000067_001.txt\n",
"--Sequence 68/180: GOT-10k_Test_000068\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000068/GOT-10k_Test_000068_001.txt\n",
"--Sequence 69/180: GOT-10k_Test_000069\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000069/GOT-10k_Test_000069_001.txt\n",
"--Sequence 70/180: GOT-10k_Test_000070\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000070/GOT-10k_Test_000070_001.txt\n",
"--Sequence 71/180: GOT-10k_Test_000071\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000071/GOT-10k_Test_000071_001.txt\n",
"--Sequence 72/180: GOT-10k_Test_000072\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000072/GOT-10k_Test_000072_001.txt\n",
"--Sequence 73/180: GOT-10k_Test_000073\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000073/GOT-10k_Test_000073_001.txt\n",
"--Sequence 74/180: GOT-10k_Test_000074\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000074/GOT-10k_Test_000074_001.txt\n",
"--Sequence 75/180: GOT-10k_Test_000075\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000075/GOT-10k_Test_000075_001.txt\n",
"--Sequence 76/180: GOT-10k_Test_000076\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000076/GOT-10k_Test_000076_001.txt\n",
"--Sequence 77/180: GOT-10k_Test_000077\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000077/GOT-10k_Test_000077_001.txt\n",
"--Sequence 78/180: GOT-10k_Test_000078\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000078/GOT-10k_Test_000078_001.txt\n",
"--Sequence 79/180: GOT-10k_Test_000079\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000079/GOT-10k_Test_000079_001.txt\n",
"--Sequence 80/180: GOT-10k_Test_000080\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000080/GOT-10k_Test_000080_001.txt\n",
"--Sequence 81/180: GOT-10k_Test_000081\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000081/GOT-10k_Test_000081_001.txt\n",
"--Sequence 82/180: GOT-10k_Test_000082\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000082/GOT-10k_Test_000082_001.txt\n",
"--Sequence 83/180: GOT-10k_Test_000083\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000083/GOT-10k_Test_000083_001.txt\n",
"--Sequence 84/180: GOT-10k_Test_000084\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000084/GOT-10k_Test_000084_001.txt\n",
"--Sequence 85/180: GOT-10k_Test_000085\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000085/GOT-10k_Test_000085_001.txt\n",
"--Sequence 86/180: GOT-10k_Test_000086\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000086/GOT-10k_Test_000086_001.txt\n",
"--Sequence 87/180: GOT-10k_Test_000087\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000087/GOT-10k_Test_000087_001.txt\n",
"--Sequence 88/180: GOT-10k_Test_000088\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000088/GOT-10k_Test_000088_001.txt\n",
"--Sequence 89/180: GOT-10k_Test_000089\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000089/GOT-10k_Test_000089_001.txt\n",
"--Sequence 90/180: GOT-10k_Test_000090\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000090/GOT-10k_Test_000090_001.txt\n",
"--Sequence 91/180: GOT-10k_Test_000091\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000091/GOT-10k_Test_000091_001.txt\n",
"--Sequence 92/180: GOT-10k_Test_000092\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000092/GOT-10k_Test_000092_001.txt\n",
"--Sequence 93/180: GOT-10k_Test_000093\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000093/GOT-10k_Test_000093_001.txt\n",
"--Sequence 94/180: GOT-10k_Test_000094\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000094/GOT-10k_Test_000094_001.txt\n",
"--Sequence 95/180: GOT-10k_Test_000095\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000095/GOT-10k_Test_000095_001.txt\n",
"--Sequence 96/180: GOT-10k_Test_000096\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000096/GOT-10k_Test_000096_001.txt\n",
"--Sequence 97/180: GOT-10k_Test_000097\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000097/GOT-10k_Test_000097_001.txt\n",
"--Sequence 98/180: GOT-10k_Test_000098\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000098/GOT-10k_Test_000098_001.txt\n",
"--Sequence 99/180: GOT-10k_Test_000099\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000099/GOT-10k_Test_000099_001.txt\n",
"--Sequence 100/180: GOT-10k_Test_000100\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000100/GOT-10k_Test_000100_001.txt\n",
"--Sequence 101/180: GOT-10k_Test_000101\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000101/GOT-10k_Test_000101_001.txt\n",
"--Sequence 102/180: GOT-10k_Test_000102\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000102/GOT-10k_Test_000102_001.txt\n",
"--Sequence 103/180: GOT-10k_Test_000103\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000103/GOT-10k_Test_000103_001.txt\n",
"--Sequence 104/180: GOT-10k_Test_000104\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000104/GOT-10k_Test_000104_001.txt\n",
"--Sequence 105/180: GOT-10k_Test_000105\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000105/GOT-10k_Test_000105_001.txt\n",
"--Sequence 106/180: GOT-10k_Test_000106\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000106/GOT-10k_Test_000106_001.txt\n",
"--Sequence 107/180: GOT-10k_Test_000107\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000107/GOT-10k_Test_000107_001.txt\n",
"--Sequence 108/180: GOT-10k_Test_000108\n",
" Repetition: 1\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000108/GOT-10k_Test_000108_001.txt\n",
"--Sequence 109/180: GOT-10k_Test_000109\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000109/GOT-10k_Test_000109_001.txt\n",
"--Sequence 110/180: GOT-10k_Test_000110\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000110/GOT-10k_Test_000110_001.txt\n",
"--Sequence 111/180: GOT-10k_Test_000111\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000111/GOT-10k_Test_000111_001.txt\n",
"--Sequence 112/180: GOT-10k_Test_000112\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000112/GOT-10k_Test_000112_001.txt\n",
"--Sequence 113/180: GOT-10k_Test_000113\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000113/GOT-10k_Test_000113_001.txt\n",
"--Sequence 114/180: GOT-10k_Test_000114\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000114/GOT-10k_Test_000114_001.txt\n",
"--Sequence 115/180: GOT-10k_Test_000115\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000115/GOT-10k_Test_000115_001.txt\n",
"--Sequence 116/180: GOT-10k_Test_000116\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000116/GOT-10k_Test_000116_001.txt\n",
"--Sequence 117/180: GOT-10k_Test_000117\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000117/GOT-10k_Test_000117_001.txt\n",
"--Sequence 118/180: GOT-10k_Test_000118\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000118/GOT-10k_Test_000118_001.txt\n",
"--Sequence 119/180: GOT-10k_Test_000119\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000119/GOT-10k_Test_000119_001.txt\n",
"--Sequence 120/180: GOT-10k_Test_000120\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000120/GOT-10k_Test_000120_001.txt\n",
"--Sequence 121/180: GOT-10k_Test_000121\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000121/GOT-10k_Test_000121_001.txt\n",
"--Sequence 122/180: GOT-10k_Test_000122\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000122/GOT-10k_Test_000122_001.txt\n",
"--Sequence 123/180: GOT-10k_Test_000123\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000123/GOT-10k_Test_000123_001.txt\n",
"--Sequence 124/180: GOT-10k_Test_000124\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000124/GOT-10k_Test_000124_001.txt\n",
"--Sequence 125/180: GOT-10k_Test_000125\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000125/GOT-10k_Test_000125_001.txt\n",
"--Sequence 126/180: GOT-10k_Test_000126\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000126/GOT-10k_Test_000126_001.txt\n",
"--Sequence 127/180: GOT-10k_Test_000127\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000127/GOT-10k_Test_000127_001.txt\n",
"--Sequence 128/180: GOT-10k_Test_000128\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000128/GOT-10k_Test_000128_001.txt\n",
"--Sequence 129/180: GOT-10k_Test_000129\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000129/GOT-10k_Test_000129_001.txt\n",
"--Sequence 130/180: GOT-10k_Test_000130\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000130/GOT-10k_Test_000130_001.txt\n",
"--Sequence 131/180: GOT-10k_Test_000131\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000131/GOT-10k_Test_000131_001.txt\n",
"--Sequence 132/180: GOT-10k_Test_000132\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000132/GOT-10k_Test_000132_001.txt\n",
"--Sequence 133/180: GOT-10k_Test_000133\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000133/GOT-10k_Test_000133_001.txt\n",
"--Sequence 134/180: GOT-10k_Test_000134\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000134/GOT-10k_Test_000134_001.txt\n",
"--Sequence 135/180: GOT-10k_Test_000135\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000135/GOT-10k_Test_000135_001.txt\n",
"--Sequence 136/180: GOT-10k_Test_000136\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000136/GOT-10k_Test_000136_001.txt\n",
"--Sequence 137/180: GOT-10k_Test_000137\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000137/GOT-10k_Test_000137_001.txt\n",
"--Sequence 138/180: GOT-10k_Test_000138\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000138/GOT-10k_Test_000138_001.txt\n",
"--Sequence 139/180: GOT-10k_Test_000139\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000139/GOT-10k_Test_000139_001.txt\n",
"--Sequence 140/180: GOT-10k_Test_000140\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000140/GOT-10k_Test_000140_001.txt\n",
"--Sequence 141/180: GOT-10k_Test_000141\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000141/GOT-10k_Test_000141_001.txt\n",
"--Sequence 142/180: GOT-10k_Test_000142\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000142/GOT-10k_Test_000142_001.txt\n",
"--Sequence 143/180: GOT-10k_Test_000143\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000143/GOT-10k_Test_000143_001.txt\n",
"--Sequence 144/180: GOT-10k_Test_000144\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000144/GOT-10k_Test_000144_001.txt\n",
"--Sequence 145/180: GOT-10k_Test_000145\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000145/GOT-10k_Test_000145_001.txt\n",
"--Sequence 146/180: GOT-10k_Test_000146\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000146/GOT-10k_Test_000146_001.txt\n",
"--Sequence 147/180: GOT-10k_Test_000147\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000147/GOT-10k_Test_000147_001.txt\n",
"--Sequence 148/180: GOT-10k_Test_000148\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000148/GOT-10k_Test_000148_001.txt\n",
"--Sequence 149/180: GOT-10k_Test_000149\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000149/GOT-10k_Test_000149_001.txt\n",
"--Sequence 150/180: GOT-10k_Test_000150\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000150/GOT-10k_Test_000150_001.txt\n",
"--Sequence 151/180: GOT-10k_Test_000151\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000151/GOT-10k_Test_000151_001.txt\n",
"--Sequence 152/180: GOT-10k_Test_000152\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000152/GOT-10k_Test_000152_001.txt\n",
"--Sequence 153/180: GOT-10k_Test_000153\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000153/GOT-10k_Test_000153_001.txt\n",
"--Sequence 154/180: GOT-10k_Test_000154\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000154/GOT-10k_Test_000154_001.txt\n",
"--Sequence 155/180: GOT-10k_Test_000155\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000155/GOT-10k_Test_000155_001.txt\n",
"--Sequence 156/180: GOT-10k_Test_000156\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000156/GOT-10k_Test_000156_001.txt\n",
"--Sequence 157/180: GOT-10k_Test_000157\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000157/GOT-10k_Test_000157_001.txt\n",
"--Sequence 158/180: GOT-10k_Test_000158\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000158/GOT-10k_Test_000158_001.txt\n",
"--Sequence 159/180: GOT-10k_Test_000159\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000159/GOT-10k_Test_000159_001.txt\n",
"--Sequence 160/180: GOT-10k_Test_000160\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000160/GOT-10k_Test_000160_001.txt\n",
"--Sequence 161/180: GOT-10k_Test_000161\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000161/GOT-10k_Test_000161_001.txt\n",
"--Sequence 162/180: GOT-10k_Test_000162\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000162/GOT-10k_Test_000162_001.txt\n",
"--Sequence 163/180: GOT-10k_Test_000163\n",
" Repetition: 1\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000163/GOT-10k_Test_000163_001.txt\n",
"--Sequence 164/180: GOT-10k_Test_000164\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000164/GOT-10k_Test_000164_001.txt\n",
"--Sequence 165/180: GOT-10k_Test_000165\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000165/GOT-10k_Test_000165_001.txt\n",
"--Sequence 166/180: GOT-10k_Test_000166\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000166/GOT-10k_Test_000166_001.txt\n",
"--Sequence 167/180: GOT-10k_Test_000167\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000167/GOT-10k_Test_000167_001.txt\n",
"--Sequence 168/180: GOT-10k_Test_000168\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000168/GOT-10k_Test_000168_001.txt\n",
"--Sequence 169/180: GOT-10k_Test_000169\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000169/GOT-10k_Test_000169_001.txt\n",
"--Sequence 170/180: GOT-10k_Test_000170\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000170/GOT-10k_Test_000170_001.txt\n",
"--Sequence 171/180: GOT-10k_Test_000171\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000171/GOT-10k_Test_000171_001.txt\n",
"--Sequence 172/180: GOT-10k_Test_000172\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000172/GOT-10k_Test_000172_001.txt\n",
"--Sequence 173/180: GOT-10k_Test_000173\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000173/GOT-10k_Test_000173_001.txt\n",
"--Sequence 174/180: GOT-10k_Test_000174\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000174/GOT-10k_Test_000174_001.txt\n",
"--Sequence 175/180: GOT-10k_Test_000175\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000175/GOT-10k_Test_000175_001.txt\n",
"--Sequence 176/180: GOT-10k_Test_000176\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000176/GOT-10k_Test_000176_001.txt\n",
"--Sequence 177/180: GOT-10k_Test_000177\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000177/GOT-10k_Test_000177_001.txt\n",
"--Sequence 178/180: GOT-10k_Test_000178\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000178/GOT-10k_Test_000178_001.txt\n",
"--Sequence 179/180: GOT-10k_Test_000179\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000179/GOT-10k_Test_000179_001.txt\n",
"--Sequence 180/180: GOT-10k_Test_000180\n",
" Repetition: 1\n",
" Results recorded at results/GOT-10k/IdentityTracker/GOT-10k_Test_000180/GOT-10k_Test_000180_001.txt\n",
"Records saved at ../IdentityTracker.zip\n",
"\u001b[93mLogin and follow instructions on\n",
"http://got-10k.aitestunion.com/submit_instructions\n",
"to upload and evaluate your tracking results\u001b[0m\n"
]
}
],
"source": [
"# 3. Evaluate on Test Set of GOT-10k\n",
"\n",
"tracker = IdentityTracker()\n",
"\n",
"experiment = ExperimentGOT10k(\n",
" root_dir=ROOT_DIR,\n",
" subset='test')\n",
"experiment.run(tracker)\n",
"\n",
"# a \".zip\" file will be generated ready for submission\n",
"# follow the guide to submit your results to\n",
"# http://got-10k.aitestunion.com/\n",
"experiment.report([tracker.name])"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Files already downloaded.\n",
"Warning: ../data/OTB/Human4/groundtruth_rect.1.txt is empty.\n",
"Running tracker IdentityTracker on OTB...\n",
"--Sequence 1/100: Basketball\n",
" Results recorded at results/OTB2015/IdentityTracker/Basketball.txt\n",
"--Sequence 2/100: Biker\n",
" Results recorded at results/OTB2015/IdentityTracker/Biker.txt\n",
"--Sequence 3/100: Bird1\n",
" Results recorded at results/OTB2015/IdentityTracker/Bird1.txt\n",
"--Sequence 4/100: Bird2\n",
" Results recorded at results/OTB2015/IdentityTracker/Bird2.txt\n",
"--Sequence 5/100: BlurBody\n",
" Results recorded at results/OTB2015/IdentityTracker/BlurBody.txt\n",
"--Sequence 6/100: BlurCar1\n",
" Results recorded at results/OTB2015/IdentityTracker/BlurCar1.txt\n",
"--Sequence 7/100: BlurCar2\n",
" Results recorded at results/OTB2015/IdentityTracker/BlurCar2.txt\n",
"--Sequence 8/100: BlurCar3\n",
" Results recorded at results/OTB2015/IdentityTracker/BlurCar3.txt\n",
"--Sequence 9/100: BlurCar4\n",
" Results recorded at results/OTB2015/IdentityTracker/BlurCar4.txt\n",
"--Sequence 10/100: BlurFace\n",
" Results recorded at results/OTB2015/IdentityTracker/BlurFace.txt\n",
"--Sequence 11/100: BlurOwl\n",
" Results recorded at results/OTB2015/IdentityTracker/BlurOwl.txt\n",
"--Sequence 12/100: Board\n",
" Results recorded at results/OTB2015/IdentityTracker/Board.txt\n",
"--Sequence 13/100: Bolt\n",
" Results recorded at results/OTB2015/IdentityTracker/Bolt.txt\n",
"--Sequence 14/100: Bolt2\n",
" Results recorded at results/OTB2015/IdentityTracker/Bolt2.txt\n",
"--Sequence 15/100: Box\n",
" Results recorded at results/OTB2015/IdentityTracker/Box.txt\n",
"--Sequence 16/100: Boy\n",
" Results recorded at results/OTB2015/IdentityTracker/Boy.txt\n",
"--Sequence 17/100: Car1\n",
" Results recorded at results/OTB2015/IdentityTracker/Car1.txt\n",
"--Sequence 18/100: Car2\n",
" Results recorded at results/OTB2015/IdentityTracker/Car2.txt\n",
"--Sequence 19/100: Car24\n",
" Results recorded at results/OTB2015/IdentityTracker/Car24.txt\n",
"--Sequence 20/100: Car4\n",
" Results recorded at results/OTB2015/IdentityTracker/Car4.txt\n",
"--Sequence 21/100: CarDark\n",
" Results recorded at results/OTB2015/IdentityTracker/CarDark.txt\n",
"--Sequence 22/100: CarScale\n",
" Results recorded at results/OTB2015/IdentityTracker/CarScale.txt\n",
"--Sequence 23/100: ClifBar\n",
" Results recorded at results/OTB2015/IdentityTracker/ClifBar.txt\n",
"--Sequence 24/100: Coke\n",
" Results recorded at results/OTB2015/IdentityTracker/Coke.txt\n",
"--Sequence 25/100: Couple\n",
" Results recorded at results/OTB2015/IdentityTracker/Couple.txt\n",
"--Sequence 26/100: Coupon\n",
" Results recorded at results/OTB2015/IdentityTracker/Coupon.txt\n",
"--Sequence 27/100: Crossing\n",
" Results recorded at results/OTB2015/IdentityTracker/Crossing.txt\n",
"--Sequence 28/100: Crowds\n",
" Results recorded at results/OTB2015/IdentityTracker/Crowds.txt\n",
"--Sequence 29/100: Dancer\n",
" Results recorded at results/OTB2015/IdentityTracker/Dancer.txt\n",
"--Sequence 30/100: Dancer2\n",
" Results recorded at results/OTB2015/IdentityTracker/Dancer2.txt\n",
"--Sequence 31/100: David\n",
" Results recorded at results/OTB2015/IdentityTracker/David.txt\n",
"--Sequence 32/100: David2\n",
" Results recorded at results/OTB2015/IdentityTracker/David2.txt\n",
"--Sequence 33/100: David3\n",
" Results recorded at results/OTB2015/IdentityTracker/David3.txt\n",
"--Sequence 34/100: Deer\n",
" Results recorded at results/OTB2015/IdentityTracker/Deer.txt\n",
"--Sequence 35/100: Diving\n",
" Results recorded at results/OTB2015/IdentityTracker/Diving.txt\n",
"--Sequence 36/100: Dog\n",
" Results recorded at results/OTB2015/IdentityTracker/Dog.txt\n",
"--Sequence 37/100: Dog1\n",
" Results recorded at results/OTB2015/IdentityTracker/Dog1.txt\n",
"--Sequence 38/100: Doll\n",
" Results recorded at results/OTB2015/IdentityTracker/Doll.txt\n",
"--Sequence 39/100: DragonBaby\n",
" Results recorded at results/OTB2015/IdentityTracker/DragonBaby.txt\n",
"--Sequence 40/100: Dudek\n",
" Results recorded at results/OTB2015/IdentityTracker/Dudek.txt\n",
"--Sequence 41/100: FaceOcc1\n",
" Results recorded at results/OTB2015/IdentityTracker/FaceOcc1.txt\n",
"--Sequence 42/100: FaceOcc2\n",
" Results recorded at results/OTB2015/IdentityTracker/FaceOcc2.txt\n",
"--Sequence 43/100: Fish\n",
" Results recorded at results/OTB2015/IdentityTracker/Fish.txt\n",
"--Sequence 44/100: FleetFace\n",
" Results recorded at results/OTB2015/IdentityTracker/FleetFace.txt\n",
"--Sequence 45/100: Football\n",
" Results recorded at results/OTB2015/IdentityTracker/Football.txt\n",
"--Sequence 46/100: Football1\n",
" Results recorded at results/OTB2015/IdentityTracker/Football1.txt\n",
"--Sequence 47/100: Freeman1\n",
" Results recorded at results/OTB2015/IdentityTracker/Freeman1.txt\n",
"--Sequence 48/100: Freeman3\n",
" Results recorded at results/OTB2015/IdentityTracker/Freeman3.txt\n",
"--Sequence 49/100: Freeman4\n",
" Results recorded at results/OTB2015/IdentityTracker/Freeman4.txt\n",
"--Sequence 50/100: Girl\n",
" Results recorded at results/OTB2015/IdentityTracker/Girl.txt\n",
"--Sequence 51/100: Girl2\n",
" Results recorded at results/OTB2015/IdentityTracker/Girl2.txt\n",
"--Sequence 52/100: Gym\n",
" Results recorded at results/OTB2015/IdentityTracker/Gym.txt\n",
"--Sequence 53/100: Human2\n",
" Results recorded at results/OTB2015/IdentityTracker/Human2.txt\n",
"--Sequence 54/100: Human3\n",
" Results recorded at results/OTB2015/IdentityTracker/Human3.txt\n",
"--Sequence 55/100: Human4\n",
" Results recorded at results/OTB2015/IdentityTracker/Human4.txt\n",
"--Sequence 56/100: Human5\n",
" Results recorded at results/OTB2015/IdentityTracker/Human5.txt\n",
"--Sequence 57/100: Human6\n",
" Results recorded at results/OTB2015/IdentityTracker/Human6.txt\n",
"--Sequence 58/100: Human7\n",
" Results recorded at results/OTB2015/IdentityTracker/Human7.txt\n",
"--Sequence 59/100: Human8\n",
" Results recorded at results/OTB2015/IdentityTracker/Human8.txt\n",
"--Sequence 60/100: Human9\n",
" Results recorded at results/OTB2015/IdentityTracker/Human9.txt\n",
"--Sequence 61/100: Ironman\n",
" Results recorded at results/OTB2015/IdentityTracker/Ironman.txt\n",
"--Sequence 62/100: Jogging.1\n",
" Results recorded at results/OTB2015/IdentityTracker/Jogging.1.txt\n",
"--Sequence 63/100: Jogging.2\n",
" Results recorded at results/OTB2015/IdentityTracker/Jogging.2.txt\n",
"--Sequence 64/100: Jump\n",
" Results recorded at results/OTB2015/IdentityTracker/Jump.txt\n",
"--Sequence 65/100: Jumping\n",
" Results recorded at results/OTB2015/IdentityTracker/Jumping.txt\n",
"--Sequence 66/100: KiteSurf\n",
" Results recorded at results/OTB2015/IdentityTracker/KiteSurf.txt\n",
"--Sequence 67/100: Lemming\n",
" Results recorded at results/OTB2015/IdentityTracker/Lemming.txt\n",
"--Sequence 68/100: Liquor\n",
" Results recorded at results/OTB2015/IdentityTracker/Liquor.txt\n",
"--Sequence 69/100: Man\n",
" Results recorded at results/OTB2015/IdentityTracker/Man.txt\n",
"--Sequence 70/100: Matrix\n",
" Results recorded at results/OTB2015/IdentityTracker/Matrix.txt\n",
"--Sequence 71/100: Mhyang\n",
" Results recorded at results/OTB2015/IdentityTracker/Mhyang.txt\n",
"--Sequence 72/100: MotorRolling\n",
" Results recorded at results/OTB2015/IdentityTracker/MotorRolling.txt\n",
"--Sequence 73/100: MountainBike\n",
" Results recorded at results/OTB2015/IdentityTracker/MountainBike.txt\n",
"--Sequence 74/100: Panda\n",
" Results recorded at results/OTB2015/IdentityTracker/Panda.txt\n",
"--Sequence 75/100: RedTeam\n",
" Results recorded at results/OTB2015/IdentityTracker/RedTeam.txt\n",
"--Sequence 76/100: Rubik\n",
" Results recorded at results/OTB2015/IdentityTracker/Rubik.txt\n",
"--Sequence 77/100: Shaking\n",
" Results recorded at results/OTB2015/IdentityTracker/Shaking.txt\n",
"--Sequence 78/100: Singer1\n",
" Results recorded at results/OTB2015/IdentityTracker/Singer1.txt\n",
"--Sequence 79/100: Singer2\n",
" Results recorded at results/OTB2015/IdentityTracker/Singer2.txt\n",
"--Sequence 80/100: Skater\n",
" Results recorded at results/OTB2015/IdentityTracker/Skater.txt\n",
"--Sequence 81/100: Skater2\n",
" Results recorded at results/OTB2015/IdentityTracker/Skater2.txt\n",
"--Sequence 82/100: Skating1\n",
" Results recorded at results/OTB2015/IdentityTracker/Skating1.txt\n",
"--Sequence 83/100: Skating2.1\n",
" Results recorded at results/OTB2015/IdentityTracker/Skating2.1.txt\n",
"--Sequence 84/100: Skating2.2\n",
" Results recorded at results/OTB2015/IdentityTracker/Skating2.2.txt\n",
"--Sequence 85/100: Skiing\n",
" Results recorded at results/OTB2015/IdentityTracker/Skiing.txt\n",
"--Sequence 86/100: Soccer\n",
" Results recorded at results/OTB2015/IdentityTracker/Soccer.txt\n",
"--Sequence 87/100: Subway\n",
" Results recorded at results/OTB2015/IdentityTracker/Subway.txt\n",
"--Sequence 88/100: Surfer\n",
" Results recorded at results/OTB2015/IdentityTracker/Surfer.txt\n",
"--Sequence 89/100: Suv\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" Results recorded at results/OTB2015/IdentityTracker/Suv.txt\n",
"--Sequence 90/100: Sylvester\n",
" Results recorded at results/OTB2015/IdentityTracker/Sylvester.txt\n",
"--Sequence 91/100: Tiger1\n",
" Results recorded at results/OTB2015/IdentityTracker/Tiger1.txt\n",
"--Sequence 92/100: Tiger2\n",
" Results recorded at results/OTB2015/IdentityTracker/Tiger2.txt\n",
"--Sequence 93/100: Toy\n",
" Results recorded at results/OTB2015/IdentityTracker/Toy.txt\n",
"--Sequence 94/100: Trans\n",
" Results recorded at results/OTB2015/IdentityTracker/Trans.txt\n",
"--Sequence 95/100: Trellis\n",
" Results recorded at results/OTB2015/IdentityTracker/Trellis.txt\n",
"--Sequence 96/100: Twinnings\n",
" Results recorded at results/OTB2015/IdentityTracker/Twinnings.txt\n",
"--Sequence 97/100: Vase\n",
" Results recorded at results/OTB2015/IdentityTracker/Vase.txt\n",
"--Sequence 98/100: Walking\n",
" Results recorded at results/OTB2015/IdentityTracker/Walking.txt\n",
"--Sequence 99/100: Walking2\n",
" Results recorded at results/OTB2015/IdentityTracker/Walking2.txt\n",
"--Sequence 100/100: Woman\n",
" Results recorded at results/OTB2015/IdentityTracker/Woman.txt\n",
"Saving success plots to reports/OTB2015/IdentityTracker/success_plots.png\n",
"Saving precision plots to reports/OTB2015/IdentityTracker/precision_plots.png\n",
"Files already downloaded.\n",
"Running tracker IdentityTracker on VOT...\n",
"Running supervised experiment...\n",
"--Sequence 1/60: ants1\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/ants1/ants1_001.txt\n",
"--Sequence 2/60: ants3\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/ants3/ants3_001.txt\n",
"--Sequence 3/60: bag\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/bag/bag_001.txt\n",
"--Sequence 4/60: ball1\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/ball1/ball1_001.txt\n",
"--Sequence 5/60: ball2\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/ball2/ball2_001.txt\n",
"--Sequence 6/60: basketball\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/basketball/basketball_001.txt\n",
"--Sequence 7/60: birds1\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/birds1/birds1_001.txt\n",
"--Sequence 8/60: blanket\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/blanket/blanket_001.txt\n",
"--Sequence 9/60: bmx\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/bmx/bmx_001.txt\n",
"--Sequence 10/60: bolt1\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/bolt1/bolt1_001.txt\n",
"--Sequence 11/60: bolt2\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/bolt2/bolt2_001.txt\n",
"--Sequence 12/60: book\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/book/book_001.txt\n",
"--Sequence 13/60: butterfly\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/butterfly/butterfly_001.txt\n",
"--Sequence 14/60: car1\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/car1/car1_001.txt\n",
"--Sequence 15/60: conduction1\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/conduction1/conduction1_001.txt\n",
"--Sequence 16/60: crabs1\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/crabs1/crabs1_001.txt\n",
"--Sequence 17/60: crossing\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/crossing/crossing_001.txt\n",
"--Sequence 18/60: dinosaur\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/dinosaur/dinosaur_001.txt\n",
"--Sequence 19/60: drone_across\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/drone_across/drone_across_001.txt\n",
"--Sequence 20/60: drone_flip\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/drone_flip/drone_flip_001.txt\n",
"--Sequence 21/60: drone1\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/drone1/drone1_001.txt\n",
"--Sequence 22/60: fernando\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/fernando/fernando_001.txt\n",
"--Sequence 23/60: fish1\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/fish1/fish1_001.txt\n",
"--Sequence 24/60: fish2\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/fish2/fish2_001.txt\n",
"--Sequence 25/60: fish3\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/fish3/fish3_001.txt\n",
"--Sequence 26/60: flamingo1\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/flamingo1/flamingo1_001.txt\n",
"--Sequence 27/60: frisbee\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/frisbee/frisbee_001.txt\n",
"--Sequence 28/60: girl\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/girl/girl_001.txt\n",
"--Sequence 29/60: glove\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/glove/glove_001.txt\n",
"--Sequence 30/60: godfather\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/godfather/godfather_001.txt\n",
"--Sequence 31/60: graduate\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/graduate/graduate_001.txt\n",
"--Sequence 32/60: gymnastics1\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/gymnastics1/gymnastics1_001.txt\n",
"--Sequence 33/60: gymnastics2\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/gymnastics2/gymnastics2_001.txt\n",
"--Sequence 34/60: gymnastics3\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/gymnastics3/gymnastics3_001.txt\n",
"--Sequence 35/60: hand\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/hand/hand_001.txt\n",
"--Sequence 36/60: handball1\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/handball1/handball1_001.txt\n",
"--Sequence 37/60: handball2\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/handball2/handball2_001.txt\n",
"--Sequence 38/60: helicopter\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/helicopter/helicopter_001.txt\n",
"--Sequence 39/60: iceskater1\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/iceskater1/iceskater1_001.txt\n",
"--Sequence 40/60: iceskater2\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/iceskater2/iceskater2_001.txt\n",
"--Sequence 41/60: leaves\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/leaves/leaves_001.txt\n",
"--Sequence 42/60: matrix\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/matrix/matrix_001.txt\n",
"--Sequence 43/60: motocross1\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/motocross1/motocross1_001.txt\n",
"--Sequence 44/60: motocross2\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/motocross2/motocross2_001.txt\n",
"--Sequence 45/60: nature\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/nature/nature_001.txt\n",
"--Sequence 46/60: pedestrian1\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/pedestrian1/pedestrian1_001.txt\n",
"--Sequence 47/60: rabbit\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/rabbit/rabbit_001.txt\n",
"--Sequence 48/60: racing\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/racing/racing_001.txt\n",
"--Sequence 49/60: road\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/road/road_001.txt\n",
"--Sequence 50/60: shaking\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/shaking/shaking_001.txt\n",
"--Sequence 51/60: sheep\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/sheep/sheep_001.txt\n",
"--Sequence 52/60: singer2\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/singer2/singer2_001.txt\n",
"--Sequence 53/60: singer3\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/singer3/singer3_001.txt\n",
"--Sequence 54/60: soccer1\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/soccer1/soccer1_001.txt\n",
"--Sequence 55/60: soccer2\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/soccer2/soccer2_001.txt\n",
"--Sequence 56/60: soldier\n",
" Repetition: 1\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" Results recorded at results/VOT2018/IdentityTracker/baseline/soldier/soldier_001.txt\n",
"--Sequence 57/60: tiger\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/tiger/tiger_001.txt\n",
"--Sequence 58/60: traffic\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/traffic/traffic_001.txt\n",
"--Sequence 59/60: wiper\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/wiper/wiper_001.txt\n",
"--Sequence 60/60: zebrafish1\n",
" Repetition: 1\n",
" Results recorded at results/VOT2018/IdentityTracker/baseline/zebrafish1/zebrafish1_001.txt\n",
"Running unsupervised experiment...\n",
"--Sequence 1/60: ants1\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/ants1/ants1_001.txt\n",
"--Sequence 2/60: ants3\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/ants3/ants3_001.txt\n",
"--Sequence 3/60: bag\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/bag/bag_001.txt\n",
"--Sequence 4/60: ball1\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/ball1/ball1_001.txt\n",
"--Sequence 5/60: ball2\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/ball2/ball2_001.txt\n",
"--Sequence 6/60: basketball\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/basketball/basketball_001.txt\n",
"--Sequence 7/60: birds1\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/birds1/birds1_001.txt\n",
"--Sequence 8/60: blanket\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/blanket/blanket_001.txt\n",
"--Sequence 9/60: bmx\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/bmx/bmx_001.txt\n",
"--Sequence 10/60: bolt1\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/bolt1/bolt1_001.txt\n",
"--Sequence 11/60: bolt2\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/bolt2/bolt2_001.txt\n",
"--Sequence 12/60: book\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/book/book_001.txt\n",
"--Sequence 13/60: butterfly\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/butterfly/butterfly_001.txt\n",
"--Sequence 14/60: car1\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/car1/car1_001.txt\n",
"--Sequence 15/60: conduction1\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/conduction1/conduction1_001.txt\n",
"--Sequence 16/60: crabs1\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/crabs1/crabs1_001.txt\n",
"--Sequence 17/60: crossing\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/crossing/crossing_001.txt\n",
"--Sequence 18/60: dinosaur\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/dinosaur/dinosaur_001.txt\n",
"--Sequence 19/60: drone_across\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/drone_across/drone_across_001.txt\n",
"--Sequence 20/60: drone_flip\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/drone_flip/drone_flip_001.txt\n",
"--Sequence 21/60: drone1\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/drone1/drone1_001.txt\n",
"--Sequence 22/60: fernando\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/fernando/fernando_001.txt\n",
"--Sequence 23/60: fish1\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/fish1/fish1_001.txt\n",
"--Sequence 24/60: fish2\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/fish2/fish2_001.txt\n",
"--Sequence 25/60: fish3\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/fish3/fish3_001.txt\n",
"--Sequence 26/60: flamingo1\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/flamingo1/flamingo1_001.txt\n",
"--Sequence 27/60: frisbee\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/frisbee/frisbee_001.txt\n",
"--Sequence 28/60: girl\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/girl/girl_001.txt\n",
"--Sequence 29/60: glove\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/glove/glove_001.txt\n",
"--Sequence 30/60: godfather\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/godfather/godfather_001.txt\n",
"--Sequence 31/60: graduate\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/graduate/graduate_001.txt\n",
"--Sequence 32/60: gymnastics1\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/gymnastics1/gymnastics1_001.txt\n",
"--Sequence 33/60: gymnastics2\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/gymnastics2/gymnastics2_001.txt\n",
"--Sequence 34/60: gymnastics3\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/gymnastics3/gymnastics3_001.txt\n",
"--Sequence 35/60: hand\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/hand/hand_001.txt\n",
"--Sequence 36/60: handball1\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/handball1/handball1_001.txt\n",
"--Sequence 37/60: handball2\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/handball2/handball2_001.txt\n",
"--Sequence 38/60: helicopter\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/helicopter/helicopter_001.txt\n",
"--Sequence 39/60: iceskater1\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/iceskater1/iceskater1_001.txt\n",
"--Sequence 40/60: iceskater2\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/iceskater2/iceskater2_001.txt\n",
"--Sequence 41/60: leaves\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/leaves/leaves_001.txt\n",
"--Sequence 42/60: matrix\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/matrix/matrix_001.txt\n",
"--Sequence 43/60: motocross1\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/motocross1/motocross1_001.txt\n",
"--Sequence 44/60: motocross2\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/motocross2/motocross2_001.txt\n",
"--Sequence 45/60: nature\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/nature/nature_001.txt\n",
"--Sequence 46/60: pedestrian1\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/pedestrian1/pedestrian1_001.txt\n",
"--Sequence 47/60: rabbit\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/rabbit/rabbit_001.txt\n",
"--Sequence 48/60: racing\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/racing/racing_001.txt\n",
"--Sequence 49/60: road\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/road/road_001.txt\n",
"--Sequence 50/60: shaking\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/shaking/shaking_001.txt\n",
"--Sequence 51/60: sheep\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/sheep/sheep_001.txt\n",
"--Sequence 52/60: singer2\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/singer2/singer2_001.txt\n",
"--Sequence 53/60: singer3\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/singer3/singer3_001.txt\n",
"--Sequence 54/60: soccer1\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/soccer1/soccer1_001.txt\n",
"--Sequence 55/60: soccer2\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/soccer2/soccer2_001.txt\n",
"--Sequence 56/60: soldier\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/soldier/soldier_001.txt\n",
"--Sequence 57/60: tiger\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/tiger/tiger_001.txt\n",
"--Sequence 58/60: traffic\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/traffic/traffic_001.txt\n",
"--Sequence 59/60: wiper\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/wiper/wiper_001.txt\n",
"--Sequence 60/60: zebrafish1\n",
" Results recorded at results/VOT2018/IdentityTracker/unsupervised/zebrafish1/zebrafish1_001.txt\n",
"Running real-time experiment...\n",
"--Sequence 1/60: ants1\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/ants1/ants1_001.txt\n",
"--Sequence 2/60: ants3\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/ants3/ants3_001.txt\n",
"--Sequence 3/60: bag\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/bag/bag_001.txt\n",
"--Sequence 4/60: ball1\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/ball1/ball1_001.txt\n",
"--Sequence 5/60: ball2\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/ball2/ball2_001.txt\n",
"--Sequence 6/60: basketball\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" Results recorded at results/VOT2018/IdentityTracker/realtime/basketball/basketball_001.txt\n",
"--Sequence 7/60: birds1\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/birds1/birds1_001.txt\n",
"--Sequence 8/60: blanket\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/blanket/blanket_001.txt\n",
"--Sequence 9/60: bmx\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/bmx/bmx_001.txt\n",
"--Sequence 10/60: bolt1\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/bolt1/bolt1_001.txt\n",
"--Sequence 11/60: bolt2\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/bolt2/bolt2_001.txt\n",
"--Sequence 12/60: book\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/book/book_001.txt\n",
"--Sequence 13/60: butterfly\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/butterfly/butterfly_001.txt\n",
"--Sequence 14/60: car1\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/car1/car1_001.txt\n",
"--Sequence 15/60: conduction1\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/conduction1/conduction1_001.txt\n",
"--Sequence 16/60: crabs1\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/crabs1/crabs1_001.txt\n",
"--Sequence 17/60: crossing\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/crossing/crossing_001.txt\n",
"--Sequence 18/60: dinosaur\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/dinosaur/dinosaur_001.txt\n",
"--Sequence 19/60: drone_across\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/drone_across/drone_across_001.txt\n",
"--Sequence 20/60: drone_flip\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/drone_flip/drone_flip_001.txt\n",
"--Sequence 21/60: drone1\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/drone1/drone1_001.txt\n",
"--Sequence 22/60: fernando\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/fernando/fernando_001.txt\n",
"--Sequence 23/60: fish1\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/fish1/fish1_001.txt\n",
"--Sequence 24/60: fish2\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/fish2/fish2_001.txt\n",
"--Sequence 25/60: fish3\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/fish3/fish3_001.txt\n",
"--Sequence 26/60: flamingo1\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/flamingo1/flamingo1_001.txt\n",
"--Sequence 27/60: frisbee\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/frisbee/frisbee_001.txt\n",
"--Sequence 28/60: girl\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/girl/girl_001.txt\n",
"--Sequence 29/60: glove\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/glove/glove_001.txt\n",
"--Sequence 30/60: godfather\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/godfather/godfather_001.txt\n",
"--Sequence 31/60: graduate\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/graduate/graduate_001.txt\n",
"--Sequence 32/60: gymnastics1\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/gymnastics1/gymnastics1_001.txt\n",
"--Sequence 33/60: gymnastics2\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/gymnastics2/gymnastics2_001.txt\n",
"--Sequence 34/60: gymnastics3\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/gymnastics3/gymnastics3_001.txt\n",
"--Sequence 35/60: hand\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/hand/hand_001.txt\n",
"--Sequence 36/60: handball1\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/handball1/handball1_001.txt\n",
"--Sequence 37/60: handball2\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/handball2/handball2_001.txt\n",
"--Sequence 38/60: helicopter\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/helicopter/helicopter_001.txt\n",
"--Sequence 39/60: iceskater1\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/iceskater1/iceskater1_001.txt\n",
"--Sequence 40/60: iceskater2\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/iceskater2/iceskater2_001.txt\n",
"--Sequence 41/60: leaves\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/leaves/leaves_001.txt\n",
"--Sequence 42/60: matrix\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/matrix/matrix_001.txt\n",
"--Sequence 43/60: motocross1\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/motocross1/motocross1_001.txt\n",
"--Sequence 44/60: motocross2\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/motocross2/motocross2_001.txt\n",
"--Sequence 45/60: nature\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/nature/nature_001.txt\n",
"--Sequence 46/60: pedestrian1\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/pedestrian1/pedestrian1_001.txt\n",
"--Sequence 47/60: rabbit\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/rabbit/rabbit_001.txt\n",
"--Sequence 48/60: racing\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/racing/racing_001.txt\n",
"--Sequence 49/60: road\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/road/road_001.txt\n",
"--Sequence 50/60: shaking\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/shaking/shaking_001.txt\n",
"--Sequence 51/60: sheep\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/sheep/sheep_001.txt\n",
"--Sequence 52/60: singer2\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/singer2/singer2_001.txt\n",
"--Sequence 53/60: singer3\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/singer3/singer3_001.txt\n",
"--Sequence 54/60: soccer1\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/soccer1/soccer1_001.txt\n",
"--Sequence 55/60: soccer2\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/soccer2/soccer2_001.txt\n",
"--Sequence 56/60: soldier\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/soldier/soldier_001.txt\n",
"--Sequence 57/60: tiger\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/tiger/tiger_001.txt\n",
"--Sequence 58/60: traffic\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/traffic/traffic_001.txt\n",
"--Sequence 59/60: wiper\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/wiper/wiper_001.txt\n",
"--Sequence 60/60: zebrafish1\n",
" Results recorded at results/VOT2018/IdentityTracker/realtime/zebrafish1/zebrafish1_001.txt\n",
"Evaluating IdentityTracker\n"
]
},
{
"ename": "AttributeError",
"evalue": "'list' object has no attribute 'copy'",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0mexperiment\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mExperimentVOT\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mroot_dir\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mVOT_DIR\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mversion\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m2018\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[0mexperiment\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrun\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtracker\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvisualize\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 15\u001b[0;31m \u001b[0mexperiment\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreport\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mtracker\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;32m/Users/chris/workspace/got-10k/toolkit/python/got10k/experiments/vot.pyc\u001b[0m in \u001b[0;36mreport\u001b[0;34m(self, tracker_names)\u001b[0m\n\u001b[1;32m 346\u001b[0m \u001b[0mbound\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mImage\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mimg_files\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msize\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 347\u001b[0m seq_ious = [self._calc_iou(b, anno, bound, burnin=True)\n\u001b[0;32m--> 348\u001b[0;31m for b in boxes]\n\u001b[0m\u001b[1;32m 349\u001b[0m \u001b[0mious\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mseq_name\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mseq_ious\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mseq_ious\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 350\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/Users/chris/workspace/got-10k/toolkit/python/got10k/experiments/vot.pyc\u001b[0m in \u001b[0;36m_calc_iou\u001b[0;34m(self, boxes, anno, bound, burnin)\u001b[0m\n\u001b[1;32m 546\u001b[0m \u001b[0;31m# skip initialization frames\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 547\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mburnin\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 548\u001b[0;31m \u001b[0mboxes\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mboxes\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcopy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 549\u001b[0m init_inds = [i for i, box in enumerate(boxes)\n\u001b[1;32m 550\u001b[0m if box == [1.0]]\n",
"\u001b[0;31mAttributeError\u001b[0m: 'list' object has no attribute 'copy'"
]
},
{
"data": {
"image/png": "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\nvv/+e+LjC8+AO3nyZDp06PBHf61iVZrG51/STjJv/T4u6VDX26EYU+4e/3wjm/YeLXlDN7StF8pj\nl7crcbtNmzYxYsQIoqOjCQ4Opm3btgAsXLiQRx99FBGhdevWTJo0iV27dnH11VfTpk0bNm3axPDh\nwxk3bhwTJ04kPT2d+fPnM3v2bG644QZmzZrFxIkTWblyJf379+fee+/loYceYvny5QQEBDBz5kyS\nk5N55JFHioyrd+/enHfeeaxbt45JkyZx++23k5WVxYkTJ3jllVfo3r07ycnJ3HbbbWRmZuLn58f8\n+b9Nq33kyBFuvPFG/va3v9G/f3/GjBlDcnIy2dnZPP/888THxzNs2DBCQ0PZvXs3999/P++//z6P\nP/44kZGRZzxfCxcu5LHHHgPg8ssvZ+HChb+7+6pfvz6bN28utCw2NpaMjAxUlcOHDxMTEwO4kqO3\nVJrEUDPAl7veW01IkB99WpR66A9jTCk9+OCDvPjii/To0YNbbnFNRqeqjBs3joSEBMLCwrj77rv5\n4osvaN++Pfv27SMxMREfHx/atGnDuHHjGD9+PHv27OHhhx8uVPb48ePZtGnTqQv2Dz/8wJw5cxgy\nZAjTp09n+vTpxcZ27rnn8txzzwHwySefEBwczPr167nnnnv45ptvGD9+PPfddx8DBw4kNzf31H57\n9+7lmmuu4emnnyYuLo5XXnmFtm3bMmXKFPbt28d111136g6nadOmvPbaawD06dOnxPN15MgRQkJC\nAAgPD+fQoUPunGZatGjBkSNHaNOmDYcPH2bevHlu7edJlSYxNKkdTJ3oWtw2cyXv3HIenRuGezsk\nY8qNO9/wy9rWrVvp3r074LoQ79mzh9TUVJKTk7niiisAOHbsGK1ataJ9+/a0adOGmjVrAuDr61uq\nY40ePZq//vWvdOnShZo1a1K/fv1it+/ZsycAx48f584772Tr1q34+PiQkpICuO52BgwY8LtYnn/+\nee666y7i4uIAWL9+PStWrGDu3LmA6+J++jHcFRoayrFjx6hVqxZHjhwp9u6ioLfffpvY2FjmzJnD\n9u3bGTp0KCtWrCjVsctapWlj8PURZtzcnahagYyYupxtKeneDsmYKi02NvbUwJX5F6qoqCiaNWvG\n3LlzSUhIICkpiVGjRgFFPxUTEBBATk5OicsbN26MiPD444+fKq84+Rf7efPmUaNGDRITE3n55ZdP\n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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# 4. Run Experiments on OTB and VOT\n",
"\n",
"from got10k.experiments import ExperimentOTB, ExperimentVOT\n",
"\n",
"tracker = IdentityTracker()\n",
"\n",
"# run and evaluate on OTB\n",
"experiment = ExperimentOTB(root_dir=OTB_DIR, version=2015)\n",
"experiment.run(tracker, visualize=False)\n",
"experiment.report([tracker.name])\n",
"\n",
"# run and evaluate on VOT2018\n",
"experiment = ExperimentVOT(root_dir=VOT_DIR, version=2018)\n",
"experiment.run(tracker, visualize=False)\n",
"experiment.report([tracker.name])"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Files already downloaded.\n",
"Warning: ../data/OTB/Human4/groundtruth_rect.1.txt is empty.\n",
"Sequence: Basketball\n",
"Sequence length: 725\n",
"Sequence: Biker\n",
"Sequence length: 142\n",
"Sequence: Bird1\n",
"Sequence length: 408\n",
"Sequence: Bird2\n",
"Sequence length: 99\n",
"Sequence: BlurBody\n",
"Sequence length: 334\n",
"Sequence: BlurCar1\n",
"Sequence length: 742\n",
"Sequence: BlurCar2\n",
"Sequence length: 585\n",
"Sequence: BlurCar3\n",
"Sequence length: 357\n",
"Sequence: BlurCar4\n",
"Sequence length: 380\n",
"Sequence: BlurFace\n",
"Sequence length: 493\n",
"Sequence: BlurOwl\n",
"Sequence length: 631\n",
"Sequence: Board\n",
"Sequence length: 698\n",
"Sequence: Bolt\n",
"Sequence length: 350\n",
"Sequence: Bolt2\n",
"Sequence length: 293\n",
"Sequence: Box\n",
"Sequence length: 1161\n",
"Sequence: Boy\n",
"Sequence length: 602\n",
"Sequence: Car1\n",
"Sequence length: 1020\n",
"Sequence: Car2\n",
"Sequence length: 913\n",
"Sequence: Car24\n",
"Sequence length: 3059\n",
"Sequence: Car4\n",
"Sequence length: 659\n",
"Sequence: CarDark\n",
"Sequence length: 393\n",
"Sequence: CarScale\n",
"Sequence length: 252\n",
"Sequence: ClifBar\n",
"Sequence length: 472\n",
"Sequence: Coke\n",
"Sequence length: 291\n",
"Sequence: Couple\n",
"Sequence length: 140\n",
"Sequence: Coupon\n",
"Sequence length: 327\n",
"Sequence: Crossing\n",
"Sequence length: 120\n",
"Sequence: Crowds\n",
"Sequence length: 347\n",
"Sequence: Dancer\n",
"Sequence length: 225\n",
"Sequence: Dancer2\n",
"Sequence length: 150\n",
"Sequence: David\n",
"Sequence length: 471\n",
"Sequence: David2\n",
"Sequence length: 537\n",
"Sequence: David3\n",
"Sequence length: 252\n",
"Sequence: Deer\n",
"Sequence length: 71\n",
"Sequence: Diving\n",
"Sequence length: 215\n",
"Sequence: Dog\n",
"Sequence length: 127\n",
"Sequence: Dog1\n",
"Sequence length: 1350\n",
"Sequence: Doll\n",
"Sequence length: 3872\n",
"Sequence: DragonBaby\n",
"Sequence length: 113\n",
"Sequence: Dudek\n",
"Sequence length: 1145\n",
"Sequence: FaceOcc1\n",
"Sequence length: 892\n",
"Sequence: FaceOcc2\n",
"Sequence length: 812\n",
"Sequence: Fish\n",
"Sequence length: 476\n",
"Sequence: FleetFace\n",
"Sequence length: 707\n",
"Sequence: Football\n",
"Sequence length: 362\n",
"Sequence: Football1\n",
"Sequence length: 74\n",
"Sequence: Freeman1\n",
"Sequence length: 326\n",
"Sequence: Freeman3\n",
"Sequence length: 460\n",
"Sequence: Freeman4\n",
"Sequence length: 283\n",
"Sequence: Girl\n",
"Sequence length: 500\n",
"Sequence: Girl2\n",
"Sequence length: 1500\n",
"Sequence: Gym\n",
"Sequence length: 767\n",
"Sequence: Human2\n",
"Sequence length: 1128\n",
"Sequence: Human3\n",
"Sequence length: 1698\n",
"Sequence: Human4\n",
"Sequence length: 667\n",
"Sequence: Human5\n",
"Sequence length: 713\n",
"Sequence: Human6\n",
"Sequence length: 792\n",
"Sequence: Human7\n",
"Sequence length: 250\n",
"Sequence: Human8\n",
"Sequence length: 128\n",
"Sequence: Human9\n",
"Sequence length: 305\n",
"Sequence: Ironman\n",
"Sequence length: 166\n",
"Sequence: Jogging.1\n",
"Sequence length: 307\n",
"Sequence: Jogging.2\n",
"Sequence length: 307\n",
"Sequence: Jump\n",
"Sequence length: 122\n",
"Sequence: Jumping\n",
"Sequence length: 313\n",
"Sequence: KiteSurf\n",
"Sequence length: 84\n",
"Sequence: Lemming\n",
"Sequence length: 1336\n",
"Sequence: Liquor\n",
"Sequence length: 1741\n",
"Sequence: Man\n",
"Sequence length: 134\n",
"Sequence: Matrix\n",
"Sequence length: 100\n",
"Sequence: Mhyang\n",
"Sequence length: 1490\n",
"Sequence: MotorRolling\n",
"Sequence length: 164\n",
"Sequence: MountainBike\n",
"Sequence length: 228\n",
"Sequence: Panda\n",
"Sequence length: 1000\n",
"Sequence: RedTeam\n",
"Sequence length: 1918\n",
"Sequence: Rubik\n",
"Sequence length: 1997\n",
"Sequence: Shaking\n",
"Sequence length: 365\n",
"Sequence: Singer1\n",
"Sequence length: 351\n",
"Sequence: Singer2\n",
"Sequence length: 366\n",
"Sequence: Skater\n",
"Sequence length: 160\n",
"Sequence: Skater2\n",
"Sequence length: 435\n",
"Sequence: Skating1\n",
"Sequence length: 400\n",
"Sequence: Skating2.1\n",
"Sequence length: 473\n",
"Sequence: Skating2.2\n",
"Sequence length: 473\n",
"Sequence: Skiing\n",
"Sequence length: 81\n",
"Sequence: Soccer\n",
"Sequence length: 392\n",
"Sequence: Subway\n",
"Sequence length: 175\n",
"Sequence: Surfer\n",
"Sequence length: 376\n",
"Sequence: Suv\n",
"Sequence length: 945\n",
"Sequence: Sylvester\n",
"Sequence length: 1345\n",
"Sequence: Tiger1\n",
"Sequence length: 354\n",
"Sequence: Tiger2\n",
"Sequence length: 365\n",
"Sequence: Toy\n",
"Sequence length: 271\n",
"Sequence: Trans\n",
"Sequence length: 124\n",
"Sequence: Trellis\n",
"Sequence length: 569\n",
"Sequence: Twinnings\n",
"Sequence length: 472\n",
"Sequence: Vase\n",
"Sequence length: 271\n",
"Sequence: Walking\n",
"Sequence length: 412\n",
"Sequence: Walking2\n",
"Sequence length: 500\n",
"Sequence: Woman\n",
"Sequence length: 597\n",
"Files already downloaded.\n",
"Sequence: ants1\n",
"Sequence length: 325\n",
"Sequence: ants3\n",
"Sequence length: 579\n",
"Sequence: bag\n",
"Sequence length: 196\n",
"Sequence: ball1\n",
"Sequence length: 105\n",
"Sequence: ball2\n",
"Sequence length: 41\n",
"Sequence: basketball\n",
"Sequence length: 725\n",
"Sequence: birds1\n",
"Sequence length: 339\n",
"Sequence: blanket\n",
"Sequence length: 225\n",
"Sequence: bmx\n",
"Sequence length: 76\n",
"Sequence: bolt1\n",
"Sequence length: 350\n",
"Sequence: bolt2\n",
"Sequence length: 293\n",
"Sequence: book\n",
"Sequence length: 175\n",
"Sequence: butterfly\n",
"Sequence length: 151\n",
"Sequence: car1\n",
"Sequence length: 742\n",
"Sequence: conduction1\n",
"Sequence length: 345\n",
"Sequence: crabs1\n",
"Sequence length: 160\n",
"Sequence: crossing\n",
"Sequence length: 131\n",
"Sequence: dinosaur\n",
"Sequence length: 326\n",
"Sequence: drone_across\n",
"Sequence length: 147\n",
"Sequence: drone_flip\n",
"Sequence length: 113\n",
"Sequence: drone1\n",
"Sequence length: 355\n",
"Sequence: fernando\n",
"Sequence length: 292\n",
"Sequence: fish1\n",
"Sequence length: 366\n",
"Sequence: fish2\n",
"Sequence length: 310\n",
"Sequence: fish3\n",
"Sequence length: 519\n",
"Sequence: flamingo1\n",
"Sequence length: 1377\n",
"Sequence: frisbee\n",
"Sequence length: 248\n",
"Sequence: girl\n",
"Sequence length: 1500\n",
"Sequence: glove\n",
"Sequence length: 120\n",
"Sequence: godfather\n",
"Sequence length: 366\n",
"Sequence: graduate\n",
"Sequence length: 844\n",
"Sequence: gymnastics1\n",
"Sequence length: 567\n",
"Sequence: gymnastics2\n",
"Sequence length: 240\n",
"Sequence: gymnastics3\n",
"Sequence length: 118\n",
"Sequence: hand\n",
"Sequence length: 267\n",
"Sequence: handball1\n",
"Sequence length: 377\n",
"Sequence: handball2\n",
"Sequence length: 402\n",
"Sequence: helicopter\n",
"Sequence length: 708\n",
"Sequence: iceskater1\n",
"Sequence length: 661\n",
"Sequence: iceskater2\n",
"Sequence length: 707\n",
"Sequence: leaves\n",
"Sequence length: 63\n",
"Sequence: matrix\n",
"Sequence length: 100\n",
"Sequence: motocross1\n",
"Sequence length: 164\n",
"Sequence: motocross2\n",
"Sequence length: 61\n",
"Sequence: nature\n",
"Sequence length: 999\n",
"Sequence: pedestrian1\n",
"Sequence length: 140\n",
"Sequence: rabbit\n",
"Sequence length: 158\n",
"Sequence: racing\n",
"Sequence length: 156\n",
"Sequence: road\n",
"Sequence length: 558\n",
"Sequence: shaking\n",
"Sequence length: 365\n",
"Sequence: sheep\n",
"Sequence length: 251\n",
"Sequence: singer2\n",
"Sequence length: 366\n",
"Sequence: singer3\n",
"Sequence length: 131\n",
"Sequence: soccer1\n",
"Sequence length: 392\n",
"Sequence: soccer2\n",
"Sequence length: 129\n",
"Sequence: soldier\n",
"Sequence length: 138\n",
"Sequence: tiger\n",
"Sequence length: 365\n",
"Sequence: traffic\n",
"Sequence length: 191\n",
"Sequence: wiper\n",
"Sequence length: 341\n",
"Sequence: zebrafish1\n",
"Sequence length: 400\n"
]
}
],
"source": [
"# 5. Loop Over OTB and VOT Datasets\n",
"\n",
"from got10k.datasets import OTB, VOT\n",
"\n",
"def loop_dataset(dataset):\n",
" for s, (img_files, anno) in enumerate(dataset):\n",
" seq_name = dataset.seq_names[s]\n",
" print('Sequence:', seq_name)\n",
" \n",
" assert(len(img_files) == len(anno))\n",
" print('Sequence length:', len(img_files))\n",
"\n",
"# loop over OTB\n",
"dataset = OTB(root_dir=OTB_DIR, version=2015)\n",
"loop_dataset(dataset)\n",
"\n",
"# loop over VOT\n",
"dataset = VOT(root_dir=VOT_DIR, version=2018)\n",
"loop_dataset(dataset)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.13"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
got10k-toolkit-master/examples/quick_examples.py 0000664 0000000 0000000 00000004760 14336540625 0022360 0 ustar 00root root 0000000 0000000 from __future__ import absolute_import, print_function
import fire
from PIL import Image
from got10k.trackers import Tracker, IdentityTracker
from got10k.experiments import ExperimentGOT10k
from got10k.datasets import GOT10k
from got10k.utils.viz import show_frame
ROOT_DIR = 'data/GOT-10k'
def example_track_val_set():
# setup tracker
tracker = IdentityTracker()
# run experiment on validation set
experiment = ExperimentGOT10k(
root_dir=ROOT_DIR,
subset='val',
result_dir='results',
report_dir='reports')
experiment.run(tracker, visualize=False)
# report performance
experiment.report([tracker.name])
def example_track_test_set():
# setup tracker
tracker = IdentityTracker()
# run experiment on test set
experiment = ExperimentGOT10k(
root_dir=ROOT_DIR,
subset='test',
result_dir='results',
report_dir='reports')
experiment.run(tracker, visualize=False)
# a ".zip" file will be generated ready for submission
# follow the guide to submit your results to
# http://got-10k.aitestunion.com/
experiment.report([tracker.name])
def example_plot_curves():
# reports of 25 baseline entries can be downloaded from
# http://got-10k.aitestunion.com/downloads
report_files = [
'reports/GOT-10k/performance_25_entries.json']
tracker_names = [
'SiamFCv2', 'GOTURN', 'CCOT', 'MDNet']
# setup experiment and plot curves
experiment = ExperimentGOT10k('data/GOT-10k', subset='test')
experiment.plot_curves(report_files, tracker_names)
def example_loop_dataset():
# setup dataset
dataset = GOT10k(ROOT_DIR, subset='val')
# loop over the complete dataset
for s, (img_files, anno) in enumerate(dataset):
seq_name = dataset.seq_names[s]
print('Sequence:', seq_name)
for f, img_file in enumerate(img_files):
image = Image.open(img_file)
box = anno[f, :] # (left, top, width, height)
show_frame(image, box, colors='w')
def example_show():
# setup experiment
experiment = ExperimentGOT10k(
root_dir=ROOT_DIR,
subset='test',
result_dir='results',
report_dir='reports')
# visualize tracking results
tracker_names = [
'SiamFCv2', 'GOTURN', 'CCOT', 'MDNet']
experiment.show(tracker_names)
if __name__ == '__main__':
# choose an example function to execute, e.g.,
# > python quick_examples example_loop_dataset
fire.Fire()
got10k-toolkit-master/got10k/ 0000775 0000000 0000000 00000000000 14336540625 0016254 5 ustar 00root root 0000000 0000000 got10k-toolkit-master/got10k/__init__.py 0000664 0000000 0000000 00000000000 14336540625 0020353 0 ustar 00root root 0000000 0000000 got10k-toolkit-master/got10k/datasets/ 0000775 0000000 0000000 00000000000 14336540625 0020064 5 ustar 00root root 0000000 0000000 got10k-toolkit-master/got10k/datasets/__init__.py 0000664 0000000 0000000 00000000634 14336540625 0022200 0 ustar 00root root 0000000 0000000 from __future__ import absolute_import
from .got10k import GOT10k
from .otb import OTB
from .vot import VOT
from .dtb70 import DTB70
from .tcolor128 import TColor128
from .uav123 import UAV123
from .nfs import NfS
from .lasot import LaSOT
from .trackingnet import TrackingNet
from .vid import ImageNetVID
from .davis import DAVIS_Like, DAVIS
from .youtubevos import YouTubeVOS
from .oxuva_dataset import Oxuva
got10k-toolkit-master/got10k/datasets/ctc_dataset.py 0000664 0000000 0000000 00000002112 14336540625 0022710 0 ustar 00root root 0000000 0000000 # Author: Kristyna Janku, structure inspired by "custom_dataset.py"
import glob
import os
import numpy as np
import json
class CTCDataset(object):
def __init__(self, root_dir, name, subset):
super().__init__()
self.root_dir = root_dir
self.name = name
self.subset = subset
annotation_file_path = os.path.join(self.root_dir, "annotation", "SOT", self.name + ".json")
with open(annotation_file_path) as ann:
self.annotation_json = json.load(ann)
self.seq_names = list(self.annotation_json.keys())
assert len(self.seq_names) > 0
print("CTC dataset seqs ", self.seq_names)
def __getitem__(self, index):
assert 0 <= index <= len(self.seq_names)
seq = self.seq_names[index]
imgs = [os.path.join(self.root_dir, "raw_data", self.subset, img) for img in self.annotation_json[seq]['img_names']]
bbox = np.array([float(x) for x in self.annotation_json[seq]['init_rect']])
return imgs, bbox[np.newaxis]
def __len__(self):
return len(self.seq_names)
got10k-toolkit-master/got10k/datasets/custom_dataset.py 0000664 0000000 0000000 00000001676 14336540625 0023467 0 ustar 00root root 0000000 0000000 import glob
import os
import numpy as np
class CustomDataset(object):
def __init__(self, root_dir):
super().__init__()
self.root_dir = root_dir
seqs = sorted(glob.glob(self.root_dir + "/*"))
seqs = [x for x in seqs if os.path.isdir(x)]
self.seq_names = seqs
assert len(seqs) > 0
print("custom dataset seqs", seqs)
def __getitem__(self, index):
assert 0 <= index <= len(self.seq_names)
seq = self.seq_names[index]
imgs = sorted(glob.glob(os.path.join(self.root_dir, seq, "*.jpg")))
gt_file = os.path.join(self.root_dir, seq, "groundtruth.txt")
with open(gt_file) as f:
l = f.readline().strip()
sp = l.split()
assert len(sp) == 4
x, y, w, h = [float(x) for x in sp]
bbox = np.array([x, y, w, h])
return imgs, bbox[np.newaxis]
def __len__(self):
return len(self.seq_names)
got10k-toolkit-master/got10k/datasets/davis.py 0000664 0000000 0000000 00000005374 14336540625 0021555 0 ustar 00root root 0000000 0000000 import os
import glob
import numpy as np
import PIL.Image
from functools import partial
from multiprocessing import Pool
class DAVIS_Like:
def __init__(self, img_dir, ann_dir, seq_names, multiobject=True):
self.img_dir = img_dir
self.ann_dir = ann_dir
self.seq_names = seq_names
self._multiobject = multiobject
def __getitem__(self, index):
r"""
Args:
index (integer or string): Index of a sequence.
Returns:
tuple: (img_files, anno), where ``img_files`` is a list of
file names and ``anno`` is a N x 4 (rectangles) numpy array.
"""
seq_name_maybe_with_obj_id = self.seq_names[index]
sp = seq_name_maybe_with_obj_id.split("__")
seq_name_raw = sp[0]
if len(sp) > 1 and self._multiobject:
obj_id = int(sp[1])
else:
obj_id = None
img_files = sorted(glob.glob(os.path.join(self.img_dir, seq_name_raw, "*.jpg")))
ann_files = [x.replace(self.img_dir, self.ann_dir).replace(".jpg", ".png") for x in img_files]
with Pool(8) as pool:
anno = pool.map(partial(png_to_rect, obj_id=obj_id), ann_files)
anno = np.stack(anno)
assert len(img_files) == len(anno), (len(img_files), len(anno))
assert anno.shape[1] == 4, anno.shape[1]
return img_files, anno
def __len__(self):
return len(self.seq_names)
class DAVIS(DAVIS_Like):
def __init__(self, root_dir, version="2017_val"):
seq_names = []
seq_names_filename = os.path.join(root_dir, "ImageSets", "2017", version + "_ids.txt")
with open(seq_names_filename) as f:
for l in f:
seq_names.append(l.strip())
img_dir = os.path.join(root_dir, "JPEGImages", "480p")
ann_dir = os.path.join(root_dir, "Annotations", "480p")
super().__init__(img_dir, ann_dir, seq_names, multiobject=version != "2016_val")
def png_to_rect(ann_filename, obj_id):
if not os.path.exists(ann_filename):
return np.array([np.nan, np.nan, np.nan, np.nan])
ann = np.array(PIL.Image.open(ann_filename))
if obj_id is None:
ann = (ann > 0).astype(np.uint8)
else:
ann = (ann == obj_id).astype(np.uint8)
if ann.any():
return get_bbox_from_segmentation_mask_xywh(ann)
else:
return np.array([np.nan, np.nan, np.nan, np.nan])
def get_bbox_from_segmentation_mask_xywh(mask):
object_locations = (np.stack(np.where(np.equal(mask, 1))).T[:, :2]).astype(np.int32)
y0 = np.min(object_locations[:, 0])
x0 = np.min(object_locations[:, 1])
y1 = np.max(object_locations[:, 0]) + 1
x1 = np.max(object_locations[:, 1]) + 1
w = x1 - x0
h = y1 - y0
bbox = np.stack([x0, y0, w, h])
return bbox
got10k-toolkit-master/got10k/datasets/dtb70.py 0000664 0000000 0000000 00000004434 14336540625 0021363 0 ustar 00root root 0000000 0000000 from __future__ import absolute_import, print_function
import os
import glob
import numpy as np
import six
class DTB70(object):
"""`DTB70 `_ Dataset.
Publication:
``Visual object tracking for unmanned aerial vehicles: A benchmark and new motion models``,
Y. Wu, J. Lim and M.-H. Yang, IEEE TPAMI 2015.
Args:
root_dir (string): Root directory of dataset where sequence
folders exist.
"""
def __init__(self, root_dir):
super(DTB70, self).__init__()
self.root_dir = root_dir
self._check_integrity(root_dir)
self.anno_files = sorted(glob.glob(
os.path.join(root_dir, '*/groundtruth_rect.txt')))
self.seq_dirs = [os.path.dirname(f) for f in self.anno_files]
self.seq_names = [os.path.basename(d) for d in self.seq_dirs]
def __getitem__(self, index):
r"""
Args:
index (integer or string): Index or name of a sequence.
Returns:
tuple: (img_files, anno), where ``img_files`` is a list of
file names and ``anno`` is a N x 4 (rectangles) numpy array.
"""
if isinstance(index, six.string_types):
if not index in self.seq_names:
raise Exception('Sequence {} not found.'.format(index))
index = self.seq_names.index(index)
img_files = sorted(glob.glob(
os.path.join(self.seq_dirs[index], 'img/*.jpg')))
anno = np.loadtxt(self.anno_files[index], delimiter=',')
assert len(img_files) == len(anno)
assert anno.shape[1] == 4
return img_files, anno
def __len__(self):
return len(self.seq_names)
def _check_integrity(self, root_dir):
seq_names = os.listdir(root_dir)
seq_names = [n for n in seq_names if not n[0] == '.']
if os.path.isdir(root_dir) and len(seq_names) > 0:
# check each sequence folder
for seq_name in seq_names:
seq_dir = os.path.join(root_dir, seq_name)
if not os.path.isdir(seq_dir):
print('Warning: sequence %s not exists.' % seq_name)
else:
# dataset not exists
raise Exception('Dataset not found or corrupted.')
got10k-toolkit-master/got10k/datasets/got10k.py 0000664 0000000 0000000 00000010423 14336540625 0021543 0 ustar 00root root 0000000 0000000 from __future__ import absolute_import, print_function
import os
import glob
import numpy as np
import six
class GOT10k(object):
r"""`GOT-10K `_ Dataset.
Publication:
``GOT-10k: A Large High-Diversity Benchmark for Generic Object
Tracking in the Wild``, L. Huang, X. Zhao and K. Huang, ArXiv 2018.
Args:
root_dir (string): Root directory of dataset where ``train``,
``val`` and ``test`` folders exist.
subset (string, optional): Specify ``train``, ``val`` or ``test``
subset of GOT-10k.
return_meta (string, optional): If True, returns ``meta``
of each sequence in ``__getitem__`` function, otherwise
only returns ``img_files`` and ``anno``.
list_file (string, optional): If provided, only read sequences
specified by the file instead of all sequences in the subset.
"""
def __init__(self, root_dir, subset='test', return_meta=False,
list_file=None, check_integrity=True):
super(GOT10k, self).__init__()
assert subset in ['train', 'val', 'test'], 'Unknown subset.'
self.root_dir = root_dir
self.subset = subset
self.return_meta = False if subset == 'test' else return_meta
if list_file is None:
list_file = os.path.join(root_dir, subset, 'list.txt')
if check_integrity:
self._check_integrity(root_dir, subset, list_file)
with open(list_file, 'r') as f:
self.seq_names = f.read().strip().split('\n')
self.seq_dirs = [os.path.join(root_dir, subset, s)
for s in self.seq_names]
self.anno_files = [os.path.join(d, 'groundtruth.txt')
for d in self.seq_dirs]
def __getitem__(self, index):
r"""
Args:
index (integer or string): Index or name of a sequence.
Returns:
tuple: (img_files, anno) if ``return_meta`` is False, otherwise
(img_files, anno, meta), where ``img_files`` is a list of
file names, ``anno`` is a N x 4 (rectangles) numpy array, while
``meta`` is a dict contains meta information about the sequence.
"""
if isinstance(index, six.string_types):
if not index in self.seq_names:
raise Exception('Sequence {} not found.'.format(index))
index = self.seq_names.index(index)
img_files = sorted(glob.glob(os.path.join(
self.seq_dirs[index], '*.jpg')))
anno = np.loadtxt(self.anno_files[index], delimiter=',')
if self.subset == 'test' and anno.ndim == 1:
assert len(anno) == 4
anno = anno[np.newaxis, :]
else:
assert len(img_files) == len(anno)
if self.return_meta:
meta = self._fetch_meta(self.seq_dirs[index])
return img_files, anno, meta
else:
return img_files, anno
def __len__(self):
return len(self.seq_names)
def _check_integrity(self, root_dir, subset, list_file=None):
assert subset in ['train', 'val', 'test']
if list_file is None:
list_file = os.path.join(root_dir, subset, 'list.txt')
if os.path.isfile(list_file):
with open(list_file, 'r') as f:
seq_names = f.read().strip().split('\n')
# check each sequence folder
for seq_name in seq_names:
seq_dir = os.path.join(root_dir, subset, seq_name)
if not os.path.isdir(seq_dir):
print('Warning: sequence %s not exists.' % seq_name)
else:
# dataset not exists
raise Exception('Dataset not found or corrupted.')
def _fetch_meta(self, seq_dir):
# meta information
meta_file = os.path.join(seq_dir, 'meta_info.ini')
with open(meta_file) as f:
meta = f.read().strip().split('\n')[1:]
meta = [line.split(': ') for line in meta]
meta = {line[0]: line[1] for line in meta}
# attributes
attributes = ['cover', 'absence', 'cut_by_image']
for att in attributes:
meta[att] = np.loadtxt(os.path.join(seq_dir, att + '.label'))
return meta
got10k-toolkit-master/got10k/datasets/lasot.json 0000664 0000000 0000000 00000070051 14336540625 0022104 0 ustar 00root root 0000000 0000000 {
"train": [
"airplane-10",
"airplane-11",
"airplane-12",
"airplane-14",
"airplane-16",
"airplane-17",
"airplane-18",
"airplane-19",
"airplane-2",
"airplane-20",
"airplane-3",
"airplane-4",
"airplane-5",
"airplane-6",
"airplane-7",
"airplane-8",
"basketball-10",
"basketball-12",
"basketball-13",
"basketball-14",
"basketball-15",
"basketball-16",
"basketball-17",
"basketball-18",
"basketball-19",
"basketball-2",
"basketball-20",
"basketball-3",
"basketball-4",
"basketball-5",
"basketball-8",
"basketball-9",
"bear-1",
"bear-10",
"bear-11",
"bear-12",
"bear-13",
"bear-14",
"bear-15",
"bear-16",
"bear-18",
"bear-19",
"bear-20",
"bear-3",
"bear-5",
"bear-7",
"bear-8",
"bear-9",
"bicycle-1",
"bicycle-10",
"bicycle-11",
"bicycle-12",
"bicycle-13",
"bicycle-14",
"bicycle-15",
"bicycle-16",
"bicycle-17",
"bicycle-19",
"bicycle-20",
"bicycle-3",
"bicycle-4",
"bicycle-5",
"bicycle-6",
"bicycle-8",
"bird-1",
"bird-10",
"bird-11",
"bird-12",
"bird-13",
"bird-14",
"bird-16",
"bird-18",
"bird-19",
"bird-20",
"bird-4",
"bird-5",
"bird-6",
"bird-7",
"bird-8",
"bird-9",
"boat-1",
"boat-10",
"boat-11",
"boat-13",
"boat-14",
"boat-15",
"boat-16",
"boat-18",
"boat-19",
"boat-2",
"boat-20",
"boat-5",
"boat-6",
"boat-7",
"boat-8",
"boat-9",
"book-1",
"book-12",
"book-13",
"book-14",
"book-15",
"book-16",
"book-17",
"book-18",
"book-2",
"book-20",
"book-4",
"book-5",
"book-6",
"book-7",
"book-8",
"book-9",
"bottle-10",
"bottle-11",
"bottle-13",
"bottle-15",
"bottle-16",
"bottle-17",
"bottle-19",
"bottle-2",
"bottle-20",
"bottle-3",
"bottle-4",
"bottle-5",
"bottle-6",
"bottle-7",
"bottle-8",
"bottle-9",
"bus-1",
"bus-10",
"bus-11",
"bus-12",
"bus-13",
"bus-14",
"bus-15",
"bus-16",
"bus-18",
"bus-20",
"bus-3",
"bus-4",
"bus-6",
"bus-7",
"bus-8",
"bus-9",
"car-1",
"car-10",
"car-11",
"car-12",
"car-13",
"car-14",
"car-15",
"car-16",
"car-18",
"car-19",
"car-20",
"car-3",
"car-4",
"car-5",
"car-7",
"car-8",
"cat-10",
"cat-11",
"cat-12",
"cat-13",
"cat-14",
"cat-15",
"cat-16",
"cat-17",
"cat-19",
"cat-2",
"cat-4",
"cat-5",
"cat-6",
"cat-7",
"cat-8",
"cat-9",
"cattle-1",
"cattle-10",
"cattle-11",
"cattle-14",
"cattle-15",
"cattle-16",
"cattle-17",
"cattle-18",
"cattle-19",
"cattle-20",
"cattle-3",
"cattle-4",
"cattle-5",
"cattle-6",
"cattle-8",
"cattle-9",
"chameleon-1",
"chameleon-10",
"chameleon-12",
"chameleon-13",
"chameleon-14",
"chameleon-15",
"chameleon-16",
"chameleon-17",
"chameleon-18",
"chameleon-19",
"chameleon-2",
"chameleon-4",
"chameleon-5",
"chameleon-7",
"chameleon-8",
"chameleon-9",
"coin-1",
"coin-10",
"coin-11",
"coin-12",
"coin-13",
"coin-14",
"coin-15",
"coin-16",
"coin-17",
"coin-19",
"coin-2",
"coin-20",
"coin-4",
"coin-5",
"coin-8",
"coin-9",
"crab-1",
"crab-10",
"crab-11",
"crab-13",
"crab-14",
"crab-15",
"crab-16",
"crab-17",
"crab-19",
"crab-2",
"crab-20",
"crab-4",
"crab-5",
"crab-7",
"crab-8",
"crab-9",
"crocodile-1",
"crocodile-11",
"crocodile-12",
"crocodile-13",
"crocodile-15",
"crocodile-16",
"crocodile-17",
"crocodile-18",
"crocodile-19",
"crocodile-2",
"crocodile-20",
"crocodile-5",
"crocodile-6",
"crocodile-7",
"crocodile-8",
"crocodile-9",
"cup-10",
"cup-11",
"cup-12",
"cup-13",
"cup-14",
"cup-15",
"cup-16",
"cup-18",
"cup-19",
"cup-2",
"cup-20",
"cup-3",
"cup-5",
"cup-6",
"cup-8",
"cup-9",
"deer-1",
"deer-11",
"deer-12",
"deer-13",
"deer-15",
"deer-16",
"deer-17",
"deer-18",
"deer-19",
"deer-2",
"deer-20",
"deer-3",
"deer-5",
"deer-6",
"deer-7",
"deer-9",
"dog-10",
"dog-11",
"dog-12",
"dog-13",
"dog-14",
"dog-16",
"dog-17",
"dog-18",
"dog-2",
"dog-20",
"dog-3",
"dog-4",
"dog-5",
"dog-6",
"dog-8",
"dog-9",
"drone-1",
"drone-10",
"drone-11",
"drone-12",
"drone-14",
"drone-16",
"drone-17",
"drone-18",
"drone-19",
"drone-20",
"drone-3",
"drone-4",
"drone-5",
"drone-6",
"drone-8",
"drone-9",
"electricfan-11",
"electricfan-12",
"electricfan-13",
"electricfan-14",
"electricfan-15",
"electricfan-16",
"electricfan-17",
"electricfan-19",
"electricfan-2",
"electricfan-3",
"electricfan-4",
"electricfan-5",
"electricfan-6",
"electricfan-7",
"electricfan-8",
"electricfan-9",
"elephant-10",
"elephant-11",
"elephant-13",
"elephant-14",
"elephant-15",
"elephant-17",
"elephant-19",
"elephant-2",
"elephant-20",
"elephant-3",
"elephant-4",
"elephant-5",
"elephant-6",
"elephant-7",
"elephant-8",
"elephant-9",
"flag-1",
"flag-10",
"flag-11",
"flag-12",
"flag-13",
"flag-14",
"flag-15",
"flag-16",
"flag-17",
"flag-18",
"flag-19",
"flag-20",
"flag-4",
"flag-6",
"flag-7",
"flag-8",
"fox-1",
"fox-10",
"fox-11",
"fox-12",
"fox-13",
"fox-14",
"fox-15",
"fox-16",
"fox-17",
"fox-18",
"fox-19",
"fox-4",
"fox-6",
"fox-7",
"fox-8",
"fox-9",
"frog-1",
"frog-10",
"frog-11",
"frog-12",
"frog-13",
"frog-14",
"frog-15",
"frog-16",
"frog-17",
"frog-18",
"frog-19",
"frog-2",
"frog-5",
"frog-6",
"frog-7",
"frog-8",
"gametarget-10",
"gametarget-11",
"gametarget-12",
"gametarget-14",
"gametarget-15",
"gametarget-16",
"gametarget-17",
"gametarget-18",
"gametarget-19",
"gametarget-20",
"gametarget-3",
"gametarget-4",
"gametarget-5",
"gametarget-6",
"gametarget-8",
"gametarget-9",
"gecko-10",
"gecko-11",
"gecko-12",
"gecko-13",
"gecko-14",
"gecko-15",
"gecko-17",
"gecko-18",
"gecko-2",
"gecko-20",
"gecko-3",
"gecko-4",
"gecko-6",
"gecko-7",
"gecko-8",
"gecko-9",
"giraffe-1",
"giraffe-11",
"giraffe-12",
"giraffe-14",
"giraffe-16",
"giraffe-17",
"giraffe-18",
"giraffe-19",
"giraffe-20",
"giraffe-3",
"giraffe-4",
"giraffe-5",
"giraffe-6",
"giraffe-7",
"giraffe-8",
"giraffe-9",
"goldfish-1",
"goldfish-11",
"goldfish-12",
"goldfish-13",
"goldfish-14",
"goldfish-15",
"goldfish-16",
"goldfish-17",
"goldfish-18",
"goldfish-19",
"goldfish-2",
"goldfish-20",
"goldfish-4",
"goldfish-5",
"goldfish-6",
"goldfish-9",
"gorilla-1",
"gorilla-10",
"gorilla-11",
"gorilla-12",
"gorilla-14",
"gorilla-15",
"gorilla-16",
"gorilla-17",
"gorilla-18",
"gorilla-19",
"gorilla-2",
"gorilla-20",
"gorilla-3",
"gorilla-5",
"gorilla-7",
"gorilla-8",
"guitar-1",
"guitar-11",
"guitar-12",
"guitar-13",
"guitar-14",
"guitar-15",
"guitar-17",
"guitar-18",
"guitar-19",
"guitar-2",
"guitar-20",
"guitar-4",
"guitar-5",
"guitar-6",
"guitar-7",
"guitar-9",
"hand-1",
"hand-10",
"hand-11",
"hand-12",
"hand-13",
"hand-14",
"hand-15",
"hand-17",
"hand-18",
"hand-19",
"hand-20",
"hand-4",
"hand-5",
"hand-6",
"hand-7",
"hand-8",
"hat-10",
"hat-11",
"hat-12",
"hat-13",
"hat-14",
"hat-15",
"hat-16",
"hat-17",
"hat-19",
"hat-20",
"hat-3",
"hat-4",
"hat-6",
"hat-7",
"hat-8",
"hat-9",
"helmet-1",
"helmet-10",
"helmet-12",
"helmet-14",
"helmet-15",
"helmet-16",
"helmet-17",
"helmet-18",
"helmet-2",
"helmet-20",
"helmet-3",
"helmet-4",
"helmet-6",
"helmet-7",
"helmet-8",
"helmet-9",
"hippo-10",
"hippo-11",
"hippo-12",
"hippo-13",
"hippo-14",
"hippo-15",
"hippo-16",
"hippo-17",
"hippo-18",
"hippo-19",
"hippo-2",
"hippo-3",
"hippo-4",
"hippo-5",
"hippo-6",
"hippo-8",
"horse-10",
"horse-11",
"horse-13",
"horse-14",
"horse-16",
"horse-17",
"horse-18",
"horse-19",
"horse-2",
"horse-20",
"horse-3",
"horse-5",
"horse-6",
"horse-7",
"horse-8",
"horse-9",
"kangaroo-1",
"kangaroo-10",
"kangaroo-12",
"kangaroo-13",
"kangaroo-15",
"kangaroo-16",
"kangaroo-17",
"kangaroo-18",
"kangaroo-19",
"kangaroo-20",
"kangaroo-3",
"kangaroo-4",
"kangaroo-6",
"kangaroo-7",
"kangaroo-8",
"kangaroo-9",
"kite-1",
"kite-11",
"kite-12",
"kite-13",
"kite-14",
"kite-16",
"kite-17",
"kite-18",
"kite-19",
"kite-2",
"kite-20",
"kite-3",
"kite-5",
"kite-7",
"kite-8",
"kite-9",
"leopard-10",
"leopard-11",
"leopard-12",
"leopard-13",
"leopard-14",
"leopard-15",
"leopard-17",
"leopard-18",
"leopard-19",
"leopard-2",
"leopard-3",
"leopard-4",
"leopard-5",
"leopard-6",
"leopard-8",
"leopard-9",
"licenseplate-1",
"licenseplate-10",
"licenseplate-11",
"licenseplate-14",
"licenseplate-16",
"licenseplate-17",
"licenseplate-18",
"licenseplate-19",
"licenseplate-2",
"licenseplate-20",
"licenseplate-3",
"licenseplate-4",
"licenseplate-5",
"licenseplate-7",
"licenseplate-8",
"licenseplate-9",
"lion-10",
"lion-11",
"lion-13",
"lion-14",
"lion-15",
"lion-16",
"lion-17",
"lion-18",
"lion-19",
"lion-2",
"lion-3",
"lion-4",
"lion-6",
"lion-7",
"lion-8",
"lion-9",
"lizard-10",
"lizard-11",
"lizard-12",
"lizard-14",
"lizard-15",
"lizard-16",
"lizard-17",
"lizard-18",
"lizard-19",
"lizard-2",
"lizard-20",
"lizard-4",
"lizard-5",
"lizard-7",
"lizard-8",
"lizard-9",
"microphone-1",
"microphone-10",
"microphone-11",
"microphone-12",
"microphone-13",
"microphone-15",
"microphone-17",
"microphone-18",
"microphone-19",
"microphone-20",
"microphone-3",
"microphone-4",
"microphone-5",
"microphone-7",
"microphone-8",
"microphone-9",
"monkey-1",
"monkey-10",
"monkey-11",
"monkey-12",
"monkey-13",
"monkey-14",
"monkey-15",
"monkey-16",
"monkey-18",
"monkey-19",
"monkey-2",
"monkey-20",
"monkey-5",
"monkey-6",
"monkey-7",
"monkey-8",
"motorcycle-10",
"motorcycle-11",
"motorcycle-12",
"motorcycle-13",
"motorcycle-14",
"motorcycle-15",
"motorcycle-16",
"motorcycle-17",
"motorcycle-19",
"motorcycle-2",
"motorcycle-20",
"motorcycle-4",
"motorcycle-5",
"motorcycle-6",
"motorcycle-7",
"motorcycle-8",
"mouse-10",
"mouse-11",
"mouse-12",
"mouse-13",
"mouse-14",
"mouse-15",
"mouse-16",
"mouse-18",
"mouse-19",
"mouse-2",
"mouse-20",
"mouse-3",
"mouse-4",
"mouse-5",
"mouse-6",
"mouse-7",
"person-11",
"person-13",
"person-14",
"person-15",
"person-16",
"person-17",
"person-18",
"person-19",
"person-2",
"person-20",
"person-3",
"person-4",
"person-6",
"person-7",
"person-8",
"person-9",
"pig-1",
"pig-11",
"pig-12",
"pig-14",
"pig-15",
"pig-16",
"pig-17",
"pig-19",
"pig-20",
"pig-3",
"pig-4",
"pig-5",
"pig-6",
"pig-7",
"pig-8",
"pig-9",
"pool-1",
"pool-10",
"pool-11",
"pool-13",
"pool-14",
"pool-16",
"pool-17",
"pool-18",
"pool-19",
"pool-2",
"pool-20",
"pool-4",
"pool-5",
"pool-6",
"pool-8",
"pool-9",
"rabbit-1",
"rabbit-11",
"rabbit-12",
"rabbit-14",
"rabbit-15",
"rabbit-16",
"rabbit-18",
"rabbit-2",
"rabbit-20",
"rabbit-3",
"rabbit-4",
"rabbit-5",
"rabbit-6",
"rabbit-7",
"rabbit-8",
"rabbit-9",
"racing-1",
"racing-11",
"racing-12",
"racing-13",
"racing-14",
"racing-17",
"racing-18",
"racing-19",
"racing-2",
"racing-3",
"racing-4",
"racing-5",
"racing-6",
"racing-7",
"racing-8",
"racing-9",
"robot-10",
"robot-11",
"robot-12",
"robot-13",
"robot-14",
"robot-15",
"robot-16",
"robot-17",
"robot-18",
"robot-2",
"robot-20",
"robot-3",
"robot-4",
"robot-6",
"robot-7",
"robot-9",
"rubicCube-10",
"rubicCube-11",
"rubicCube-12",
"rubicCube-13",
"rubicCube-15",
"rubicCube-16",
"rubicCube-17",
"rubicCube-18",
"rubicCube-2",
"rubicCube-20",
"rubicCube-3",
"rubicCube-4",
"rubicCube-5",
"rubicCube-7",
"rubicCube-8",
"rubicCube-9",
"sepia-1",
"sepia-10",
"sepia-11",
"sepia-12",
"sepia-14",
"sepia-15",
"sepia-17",
"sepia-18",
"sepia-19",
"sepia-2",
"sepia-20",
"sepia-3",
"sepia-4",
"sepia-5",
"sepia-7",
"sepia-9",
"shark-1",
"shark-10",
"shark-11",
"shark-12",
"shark-13",
"shark-14",
"shark-15",
"shark-16",
"shark-17",
"shark-18",
"shark-19",
"shark-20",
"shark-4",
"shark-7",
"shark-8",
"shark-9",
"sheep-1",
"sheep-10",
"sheep-11",
"sheep-12",
"sheep-13",
"sheep-14",
"sheep-15",
"sheep-16",
"sheep-17",
"sheep-18",
"sheep-19",
"sheep-2",
"sheep-20",
"sheep-4",
"sheep-6",
"sheep-8",
"skateboard-1",
"skateboard-10",
"skateboard-11",
"skateboard-12",
"skateboard-13",
"skateboard-14",
"skateboard-15",
"skateboard-17",
"skateboard-18",
"skateboard-2",
"skateboard-20",
"skateboard-4",
"skateboard-5",
"skateboard-6",
"skateboard-7",
"skateboard-9",
"spider-1",
"spider-10",
"spider-11",
"spider-12",
"spider-13",
"spider-15",
"spider-17",
"spider-19",
"spider-2",
"spider-3",
"spider-4",
"spider-5",
"spider-6",
"spider-7",
"spider-8",
"spider-9",
"squirrel-1",
"squirrel-10",
"squirrel-12",
"squirrel-14",
"squirrel-15",
"squirrel-16",
"squirrel-17",
"squirrel-18",
"squirrel-2",
"squirrel-20",
"squirrel-3",
"squirrel-4",
"squirrel-5",
"squirrel-6",
"squirrel-7",
"squirrel-9",
"surfboard-1",
"surfboard-10",
"surfboard-11",
"surfboard-13",
"surfboard-14",
"surfboard-15",
"surfboard-16",
"surfboard-17",
"surfboard-18",
"surfboard-19",
"surfboard-2",
"surfboard-20",
"surfboard-3",
"surfboard-6",
"surfboard-7",
"surfboard-9",
"swing-1",
"swing-11",
"swing-12",
"swing-13",
"swing-15",
"swing-16",
"swing-18",
"swing-19",
"swing-2",
"swing-3",
"swing-4",
"swing-5",
"swing-6",
"swing-7",
"swing-8",
"swing-9",
"tank-1",
"tank-10",
"tank-11",
"tank-12",
"tank-13",
"tank-15",
"tank-17",
"tank-18",
"tank-19",
"tank-2",
"tank-20",
"tank-3",
"tank-4",
"tank-5",
"tank-7",
"tank-8",
"tiger-1",
"tiger-10",
"tiger-11",
"tiger-13",
"tiger-14",
"tiger-15",
"tiger-16",
"tiger-17",
"tiger-19",
"tiger-2",
"tiger-20",
"tiger-3",
"tiger-5",
"tiger-7",
"tiger-8",
"tiger-9",
"train-10",
"train-12",
"train-13",
"train-14",
"train-15",
"train-16",
"train-17",
"train-18",
"train-19",
"train-2",
"train-3",
"train-4",
"train-5",
"train-6",
"train-8",
"train-9",
"truck-1",
"truck-10",
"truck-11",
"truck-12",
"truck-13",
"truck-14",
"truck-15",
"truck-17",
"truck-18",
"truck-19",
"truck-2",
"truck-20",
"truck-4",
"truck-5",
"truck-8",
"truck-9",
"turtle-1",
"turtle-10",
"turtle-11",
"turtle-12",
"turtle-13",
"turtle-14",
"turtle-15",
"turtle-17",
"turtle-18",
"turtle-19",
"turtle-2",
"turtle-20",
"turtle-3",
"turtle-4",
"turtle-6",
"turtle-7",
"umbrella-1",
"umbrella-10",
"umbrella-11",
"umbrella-12",
"umbrella-13",
"umbrella-14",
"umbrella-15",
"umbrella-16",
"umbrella-18",
"umbrella-20",
"umbrella-3",
"umbrella-4",
"umbrella-5",
"umbrella-6",
"umbrella-7",
"umbrella-8",
"volleyball-10",
"volleyball-11",
"volleyball-12",
"volleyball-14",
"volleyball-15",
"volleyball-16",
"volleyball-17",
"volleyball-2",
"volleyball-20",
"volleyball-3",
"volleyball-4",
"volleyball-5",
"volleyball-6",
"volleyball-7",
"volleyball-8",
"volleyball-9",
"yoyo-1",
"yoyo-10",
"yoyo-11",
"yoyo-12",
"yoyo-13",
"yoyo-14",
"yoyo-16",
"yoyo-18",
"yoyo-2",
"yoyo-20",
"yoyo-3",
"yoyo-4",
"yoyo-5",
"yoyo-6",
"yoyo-8",
"yoyo-9",
"zebra-1",
"zebra-11",
"zebra-12",
"zebra-13",
"zebra-15",
"zebra-18",
"zebra-19",
"zebra-2",
"zebra-20",
"zebra-3",
"zebra-4",
"zebra-5",
"zebra-6",
"zebra-7",
"zebra-8",
"zebra-9"
],
"test": [
"airplane-1",
"airplane-9",
"airplane-13",
"airplane-15",
"basketball-1",
"basketball-6",
"basketball-7",
"basketball-11",
"bear-2",
"bear-4",
"bear-6",
"bear-17",
"bicycle-2",
"bicycle-7",
"bicycle-9",
"bicycle-18",
"bird-2",
"bird-3",
"bird-15",
"bird-17",
"boat-3",
"boat-4",
"boat-12",
"boat-17",
"book-3",
"book-10",
"book-11",
"book-19",
"bottle-1",
"bottle-12",
"bottle-14",
"bottle-18",
"bus-2",
"bus-5",
"bus-17",
"bus-19",
"car-2",
"car-6",
"car-9",
"car-17",
"cat-1",
"cat-3",
"cat-18",
"cat-20",
"cattle-2",
"cattle-7",
"cattle-12",
"cattle-13",
"spider-14",
"spider-16",
"spider-18",
"spider-20",
"coin-3",
"coin-6",
"coin-7",
"coin-18",
"crab-3",
"crab-6",
"crab-12",
"crab-18",
"surfboard-12",
"surfboard-4",
"surfboard-5",
"surfboard-8",
"cup-1",
"cup-4",
"cup-7",
"cup-17",
"deer-4",
"deer-8",
"deer-10",
"deer-14",
"dog-1",
"dog-7",
"dog-15",
"dog-19",
"guitar-3",
"guitar-8",
"guitar-10",
"guitar-16",
"person-1",
"person-5",
"person-10",
"person-12",
"pig-2",
"pig-10",
"pig-13",
"pig-18",
"rubicCube-1",
"rubicCube-6",
"rubicCube-14",
"rubicCube-19",
"swing-10",
"swing-14",
"swing-17",
"swing-20",
"drone-13",
"drone-15",
"drone-2",
"drone-7",
"pool-12",
"pool-15",
"pool-3",
"pool-7",
"rabbit-10",
"rabbit-13",
"rabbit-17",
"rabbit-19",
"racing-10",
"racing-15",
"racing-16",
"racing-20",
"robot-1",
"robot-19",
"robot-5",
"robot-8",
"sepia-13",
"sepia-16",
"sepia-6",
"sepia-8",
"sheep-3",
"sheep-5",
"sheep-7",
"sheep-9",
"skateboard-16",
"skateboard-19",
"skateboard-3",
"skateboard-8",
"tank-14",
"tank-16",
"tank-6",
"tank-9",
"tiger-12",
"tiger-18",
"tiger-4",
"tiger-6",
"train-1",
"train-11",
"train-20",
"train-7",
"truck-16",
"truck-3",
"truck-6",
"truck-7",
"turtle-16",
"turtle-5",
"turtle-8",
"turtle-9",
"umbrella-17",
"umbrella-19",
"umbrella-2",
"umbrella-9",
"yoyo-15",
"yoyo-17",
"yoyo-19",
"yoyo-7",
"zebra-10",
"zebra-14",
"zebra-16",
"zebra-17",
"elephant-1",
"elephant-12",
"elephant-16",
"elephant-18",
"goldfish-3",
"goldfish-7",
"goldfish-8",
"goldfish-10",
"hat-1",
"hat-2",
"hat-5",
"hat-18",
"kite-4",
"kite-6",
"kite-10",
"kite-15",
"motorcycle-1",
"motorcycle-3",
"motorcycle-9",
"motorcycle-18",
"mouse-1",
"mouse-8",
"mouse-9",
"mouse-17",
"flag-3",
"flag-9",
"flag-5",
"flag-2",
"frog-3",
"frog-4",
"frog-20",
"frog-9",
"gametarget-1",
"gametarget-2",
"gametarget-7",
"gametarget-13",
"hand-2",
"hand-3",
"hand-9",
"hand-16",
"helmet-5",
"helmet-11",
"helmet-19",
"helmet-13",
"licenseplate-6",
"licenseplate-12",
"licenseplate-13",
"licenseplate-15",
"electricfan-1",
"electricfan-10",
"electricfan-18",
"electricfan-20",
"chameleon-3",
"chameleon-6",
"chameleon-11",
"chameleon-20",
"crocodile-3",
"crocodile-4",
"crocodile-10",
"crocodile-14",
"gecko-1",
"gecko-5",
"gecko-16",
"gecko-19",
"fox-2",
"fox-3",
"fox-5",
"fox-20",
"giraffe-2",
"giraffe-10",
"giraffe-13",
"giraffe-15",
"gorilla-4",
"gorilla-6",
"gorilla-9",
"gorilla-13",
"hippo-1",
"hippo-7",
"hippo-9",
"hippo-20",
"horse-1",
"horse-4",
"horse-12",
"horse-15",
"kangaroo-2",
"kangaroo-5",
"kangaroo-11",
"kangaroo-14",
"leopard-1",
"leopard-7",
"leopard-16",
"leopard-20",
"lion-1",
"lion-5",
"lion-12",
"lion-20",
"lizard-1",
"lizard-3",
"lizard-6",
"lizard-13",
"microphone-2",
"microphone-6",
"microphone-14",
"microphone-16",
"monkey-3",
"monkey-4",
"monkey-9",
"monkey-17",
"shark-2",
"shark-3",
"shark-5",
"shark-6",
"squirrel-8",
"squirrel-11",
"squirrel-13",
"squirrel-19",
"volleyball-1",
"volleyball-13",
"volleyball-18",
"volleyball-19"
]
} got10k-toolkit-master/got10k/datasets/lasot.py 0000664 0000000 0000000 00000007711 14336540625 0021566 0 ustar 00root root 0000000 0000000 from __future__ import absolute_import, print_function
import os
import glob
import json
import numpy as np
import six
class LaSOT(object):
r"""`LaSOT `_ Datasets.
Publication:
``LaSOT: A High-quality Benchmark for Large-scale Single Object Tracking``,
H. Fan, L. Lin, F. Yang, P. Chu, G. Deng, S. Yu, H. Bai,
Y. Xu, C. Liao, and H. Ling., CVPR 2019.
Args:
root_dir (string): Root directory of dataset where sequence
folders exist.
subset (string, optional): Specify ``train`` or ``test``
subset of LaSOT.
"""
def __init__(self, root_dir, subset='test', return_meta=False):
super(LaSOT, self).__init__()
subset = subset.split('_')
assert set(subset).issubset({'train', 'test'}), 'Unknown subset.'
self.root_dir = root_dir
self.subset = subset
self.return_meta = return_meta
self._check_integrity(root_dir)
self.anno_files = sorted(glob.glob(
os.path.join(root_dir, '*/*/groundtruth.txt')))
self.seq_dirs = [os.path.join(
os.path.dirname(f), 'img') for f in self.anno_files]
self.seq_names = [os.path.basename(
os.path.dirname(f)) for f in self.anno_files]
# load subset sequence names
split_file = os.path.join(
os.path.dirname(__file__), 'lasot.json')
with open(split_file, 'r') as f:
splits = json.load(f)
self.seq_names = []
for s in subset:
self.seq_names.extend(splits[s])
# image and annotation paths
self.seq_dirs = [os.path.join(
root_dir, n[:n.rfind('-')], n, 'img')
for n in self.seq_names]
self.anno_files = [os.path.join(
os.path.dirname(d), 'groundtruth.txt')
for d in self.seq_dirs]
def __getitem__(self, index):
r"""
Args:
index (integer or string): Index or name of a sequence.
Returns:
tuple: (img_files, anno) if ``return_meta`` is False, otherwise
(img_files, anno, meta), where ``img_files`` is a list of
file names, ``anno`` is a N x 4 (rectangles) numpy array, while
``meta`` is a dict contains meta information about the sequence.
"""
if isinstance(index, six.string_types):
if not index in self.seq_names:
raise Exception('Sequence {} not found.'.format(index))
index = self.seq_names.index(index)
img_files = sorted(glob.glob(os.path.join(
self.seq_dirs[index], '*.jpg')))
anno = np.loadtxt(self.anno_files[index], delimiter=',')
if self.return_meta:
meta = self._fetch_meta(self.seq_dirs[index])
return img_files, anno, meta
else:
return img_files, anno
def __len__(self):
return len(self.seq_names)
def _check_integrity(self, root_dir):
seq_names = os.listdir(root_dir)
seq_names = [n for n in seq_names if not n[0] == '.']
if os.path.isdir(root_dir) and len(seq_names) > 0:
# check each sequence folder
for seq_name in seq_names:
seq_dir = os.path.join(root_dir, seq_name)
if not os.path.isdir(seq_dir):
print('Warning: sequence %s not exists.' % seq_name)
else:
# dataset not exists
raise Exception('Dataset not found or corrupted.')
def _fetch_meta(self, seq_dir):
seq_dir = os.path.dirname(seq_dir)
meta = {}
# attributes
for att in ['full_occlusion', 'out_of_view']:
att_file = os.path.join(seq_dir, att + '.txt')
meta[att] = np.loadtxt(att_file, delimiter=',')
# nlp
nlp_file = os.path.join(seq_dir, 'nlp.txt')
with open(nlp_file, 'r') as f:
meta['nlp'] = f.read().strip()
return meta
got10k-toolkit-master/got10k/datasets/nfs.py 0000664 0000000 0000000 00000006433 14336540625 0021232 0 ustar 00root root 0000000 0000000 from __future__ import absolute_import, print_function, division
import os
import glob
import numpy as np
import six
class NfS(object):
"""`NfS `_ Dataset.
Publication:
``Need for Speed: A Benchmark for Higher Frame Rate Object Tracking``,
H. K. Galoogahi, A. Fagg, C. Huang, D. Ramanan and S. Lucey, ICCV 2017.
Args:
root_dir (string): Root directory of dataset where sequence
folders exist.
fps (integer): Sequence frame rate. Two options ``30`` and ``240``
are available. Default is 240.
"""
def __init__(self, root_dir, fps=240):
super(NfS, self).__init__()
assert fps in [30, 240]
self.fps = fps
self.root_dir = root_dir
self._check_integrity(root_dir)
self.anno_files = sorted(glob.glob(
os.path.join(root_dir, '*/%d/*.txt' % fps)))
self.seq_names = [
os.path.basename(f)[:-4] for f in self.anno_files]
self.seq_dirs = [os.path.join(
os.path.dirname(f), n)
for f, n in zip(self.anno_files, self.seq_names)]
def __getitem__(self, index):
r"""
Args:
index (integer or string): Index or name of a sequence.
Returns:
tuple: (img_files, anno), where ``img_files`` is a list of
file names and ``anno`` is a N x 4 (rectangles) numpy array.
"""
if isinstance(index, six.string_types):
if not index in self.seq_names:
raise Exception('Sequence {} not found.'.format(index))
index = self.seq_names.index(index)
img_files = sorted(glob.glob(
os.path.join(self.seq_dirs[index], '*.jpg')))
anno = np.loadtxt(self.anno_files[index], dtype=str)
anno = anno[:, 1:5].astype(float) # [left, top, right, bottom]
anno[:, 2:] -= anno[:, :2] # [left, top, width, height]
# handle inconsistent lengths
if not len(img_files) == len(anno):
if abs(len(anno) / len(img_files) - 8) < 1:
anno = anno[0::8, :]
diff = abs(len(img_files) - len(anno))
if diff > 0 and diff <= 1:
n = min(len(img_files), len(anno))
anno = anno[:n]
img_files = img_files[:n]
#assert len(img_files) == len(anno), (len(img_files), len(anno))
if len(img_files) != len(anno):
print("WARNING, len(img_files) != len(anno)!", len(img_files), len(anno))
m = min(len(img_files), len(anno))
img_files = img_files[:m]
anno = anno[:m]
return img_files, anno
def __len__(self):
return len(self.seq_names)
def _check_integrity(self, root_dir):
seq_names = os.listdir(root_dir)
seq_names = [n for n in seq_names if not n[0] == '.']
if os.path.isdir(root_dir) and len(seq_names) > 0:
# check each sequence folder
for seq_name in seq_names:
seq_dir = os.path.join(root_dir, seq_name)
if not os.path.isdir(seq_dir):
print('Warning: sequence %s not exists.' % seq_name)
else:
# dataset not exists
raise Exception('Dataset not found or corrupted.')
got10k-toolkit-master/got10k/datasets/otb.py 0000664 0000000 0000000 00000020252 14336540625 0021223 0 ustar 00root root 0000000 0000000 from __future__ import absolute_import, print_function, unicode_literals
import os
import glob
import numpy as np
import io
import six
from itertools import chain
from ..utils.ioutils import download, extract
class OTB(object):
r"""`OTB `_ Datasets.
Publication:
``Object Tracking Benchmark``, Y. Wu, J. Lim and M.-H. Yang, IEEE TPAMI 2015.
Args:
root_dir (string): Root directory of dataset where sequence
folders exist.
version (integer or string): Specify the benchmark version, specify as one of
``2013``, ``2015``, ``tb50`` and ``tb100``.
download (boolean, optional): If True, downloads the dataset from the internet
and puts it in root directory. If dataset is downloaded, it is not
downloaded again.
"""
__otb13_seqs = ['Basketball', 'Bolt', 'Boy', 'Car4', 'CarDark',
'CarScale', 'Coke', 'Couple', 'Crossing', 'David',
'David2', 'David3', 'Deer', 'Dog1', 'Doll', 'Dudek',
'FaceOcc1', 'FaceOcc2', 'Fish', 'FleetFace',
'Football', 'Football1', 'Freeman1', 'Freeman3',
'Freeman4', 'Girl', 'Ironman', 'Jogging', 'Jumping',
'Lemming', 'Liquor', 'Matrix', 'Mhyang', 'MotorRolling',
'MountainBike', 'Shaking', 'Singer1', 'Singer2',
'Skating1', 'Skiing', 'Soccer', 'Subway', 'Suv',
'Sylvester', 'Tiger1', 'Tiger2', 'Trellis', 'Walking',
'Walking2', 'Woman']
__tb50_seqs = ['Basketball', 'Biker', 'Bird1', 'BlurBody', 'BlurCar2',
'BlurFace', 'BlurOwl', 'Bolt', 'Box', 'Car1', 'Car4',
'CarDark', 'CarScale', 'ClifBar', 'Couple', 'Crowds',
'David', 'Deer', 'Diving', 'DragonBaby', 'Dudek',
'Football', 'Freeman4', 'Girl', 'Human3', 'Human4',
'Human6', 'Human9', 'Ironman', 'Jump', 'Jumping',
'Liquor', 'Matrix', 'MotorRolling', 'Panda', 'RedTeam',
'Shaking', 'Singer2', 'Skating1', 'Skating2', 'Skiing',
'Soccer', 'Surfer', 'Sylvester', 'Tiger2', 'Trellis',
'Walking', 'Walking2', 'Woman']
__tb100_seqs = ['Bird2', 'BlurCar1', 'BlurCar3', 'BlurCar4', 'Board',
'Bolt2', 'Boy', 'Car2', 'Car24', 'Coke', 'Coupon',
'Crossing', 'Dancer', 'Dancer2', 'David2', 'David3',
'Dog', 'Dog1', 'Doll', 'FaceOcc1', 'FaceOcc2', 'Fish',
'FleetFace', 'Football1', 'Freeman1', 'Freeman3',
'Girl2', 'Gym', 'Human2', 'Human5', 'Human7', 'Human8',
'Jogging', 'KiteSurf', 'Lemming', 'Man', 'Mhyang',
'MountainBike', 'Rubik', 'Singer1', 'Skater',
'Skater2', 'Subway', 'Suv', 'Tiger1', 'Toy', 'Trans',
'Twinnings', 'Vase'] + __tb50_seqs
__otb15_seqs = __tb100_seqs
__version_dict = {
2013: __otb13_seqs,
2015: __otb15_seqs,
'otb2013': __otb13_seqs,
'otb2015': __otb15_seqs,
'tb50': __tb50_seqs,
'tb100': __tb100_seqs}
def __init__(self, root_dir, version=2015, download=True, seq_idx=None):
super(OTB, self).__init__()
assert version in self.__version_dict
self.root_dir = root_dir
self.version = version
if download:
self._download(root_dir, version)
self._check_integrity(root_dir, version)
valid_seqs = self.__version_dict[version]
if seq_idx is not None:
valid_seqs = [valid_seqs[seq_idx]]
self.anno_files = sorted(list(chain.from_iterable(glob.glob(
os.path.join(root_dir, s, 'groundtruth*.txt')) for s in valid_seqs)))
# remove empty annotation files
# (e.g., groundtruth_rect.1.txt of Human4)
self.anno_files = self._filter_files(self.anno_files)
self.seq_dirs = [os.path.dirname(f) for f in self.anno_files]
self.seq_names = [os.path.basename(d) for d in self.seq_dirs]
# rename repeated sequence names
# (e.g., Jogging and Skating2)
self.seq_names = self._rename_seqs(self.seq_names)
def __getitem__(self, index):
r"""
Args:
index (integer or string): Index or name of a sequence.
Returns:
tuple: (img_files, anno), where ``img_files`` is a list of
file names and ``anno`` is a N x 4 (rectangles) numpy array.
"""
if isinstance(index, six.string_types):
if not index in self.seq_names:
raise Exception('Sequence {} not found.'.format(index))
index = self.seq_names.index(index)
img_files = sorted(glob.glob(
os.path.join(self.seq_dirs[index], 'img/*.jpg')))
# special sequences
# (visit http://cvlab.hanyang.ac.kr/tracker_benchmark/index.html for detail)
seq_name = self.seq_names[index]
if seq_name.lower() == 'david':
img_files = img_files[300-1:770]
elif seq_name.lower() == 'football1':
img_files = img_files[:74]
elif seq_name.lower() == 'freeman3':
img_files = img_files[:460]
elif seq_name.lower() == 'freeman4':
img_files = img_files[:283]
elif seq_name.lower() == 'diving':
img_files = img_files[:215]
# to deal with different delimeters
with open(self.anno_files[index], 'r') as f:
anno = np.loadtxt(io.StringIO(f.read().replace(',', ' ')))
# modified by Paul
if seq_name.lower() == 'tiger1':
img_files = img_files[5:]
anno = anno[5:]
assert len(img_files) == len(anno)
assert anno.shape[1] == 4
return img_files, anno
def __len__(self):
return len(self.seq_names)
def _filter_files(self, filenames):
filtered_files = []
for filename in filenames:
with open(filename, 'r') as f:
if f.read().strip() == '':
print('Warning: %s is empty.' % filename)
else:
filtered_files.append(filename)
return filtered_files
def _rename_seqs(self, seq_names):
# in case some sequences may have multiple targets
renamed_seqs = []
for i, seq_name in enumerate(seq_names):
if seq_names.count(seq_name) == 1:
renamed_seqs.append(seq_name)
else:
ind = seq_names[:i + 1].count(seq_name)
renamed_seqs.append('%s.%d' % (seq_name, ind))
return renamed_seqs
def _download(self, root_dir, version):
assert version in self.__version_dict
seq_names = self.__version_dict[version]
if not os.path.isdir(root_dir):
os.makedirs(root_dir)
elif all([os.path.isdir(os.path.join(root_dir, s)) for s in seq_names]):
print('Files already downloaded.')
return
url_fmt = 'http://cvlab.hanyang.ac.kr/tracker_benchmark/seq/%s.zip'
for seq_name in seq_names:
seq_dir = os.path.join(root_dir, seq_name)
if os.path.isdir(seq_dir):
continue
url = url_fmt % seq_name
zip_file = os.path.join(root_dir, seq_name + '.zip')
print('Downloading to %s...' % zip_file)
download(url, zip_file)
print('\nExtracting to %s...' % root_dir)
extract(zip_file, root_dir)
return root_dir
def _check_integrity(self, root_dir, version):
assert version in self.__version_dict
seq_names = self.__version_dict[version]
if os.path.isdir(root_dir) and len(os.listdir(root_dir)) > 0:
# check each sequence folder
for seq_name in seq_names:
seq_dir = os.path.join(root_dir, seq_name)
if not os.path.isdir(seq_dir):
print('Warning: sequence %s not exists.' % seq_name)
else:
# dataset not exists
raise Exception('Dataset not found or corrupted. ' +
'You can use download=True to download it.')
got10k-toolkit-master/got10k/datasets/oxuva_dataset.py 0000664 0000000 0000000 00000003300 14336540625 0023301 0 ustar 00root root 0000000 0000000 import os
import numpy as np
import PIL.Image
class Oxuva:
def __init__(self, root_dir, subset="test"):
super().__init__()
self.root_dir = root_dir
self.subset = subset
task_file = os.path.join(root_dir, "tasks", subset + ".csv")
with open(task_file) as f:
import oxuva
self._tasks = oxuva.load_dataset_tasks_csv(f)
self.seq_names = [t[0] + "___" + t[1] for t in self._tasks]
def __getitem__(self, index):
r"""
Args:
index (integer): Index of a sequence.
Returns:
tuple: (img_files, anno), where ``img_files`` is a list of
file names and ``anno`` is a N x 4 (rectangles) numpy array.
"""
seq_name = self.seq_names[index]
k = tuple(seq_name.split("___"))
assert len(k) == 2, k
task = self._tasks[k]
r = task.init_rect
x0 = r["xmin"]
x1 = r["xmax"]
y0 = r["ymin"]
y1 = r["ymax"]
w = x1 - x0
h = y1 - y0
anno_01 = np.array([x0, y0, w, h])
imgs = []
vid = k[0]
for t in range(task.init_time, task.last_time + 1):
img = os.path.join(self.root_dir, self.subset, "images", self.subset, vid, "%06d.jpeg" % t)
imgs.append(img)
w, h = PIL.Image.open(imgs[0]).size
# scale anno with image size...
anno = anno_01 * np.array([w, h, w, h], dtype=np.float32)
return imgs, anno[np.newaxis]
def __len__(self):
return len(self.seq_names)
if __name__ == "__main__":
# test code for dataset
dataset = Oxuva("/globalwork/data/oxuva/")
for imgs, annos in dataset:
print(imgs, annos)
got10k-toolkit-master/got10k/datasets/tcolor128.py 0000664 0000000 0000000 00000006616 14336540625 0022204 0 ustar 00root root 0000000 0000000 from __future__ import absolute_import, print_function
import os
import glob
import numpy as np
import six
from ..utils.ioutils import download, extract
class TColor128(object):
"""`TColor128 `_ Dataset.
Publication:
``Encoding color information for visual tracking: algorithms and benchmark``,
P. Liang, E. Blasch and H. Ling, TIP, 2015.
Args:
root_dir (string): Root directory of dataset where sequence
folders exist.
"""
def __init__(self, root_dir, download=True):
super(TColor128, self).__init__()
self.root_dir = root_dir
if download:
self._download(root_dir)
self._check_integrity(root_dir)
self.anno_files = sorted(glob.glob(
os.path.join(root_dir, '*/*_gt.txt')))
self.seq_dirs = [os.path.dirname(f) for f in self.anno_files]
self.seq_names = [os.path.basename(d) for d in self.seq_dirs]
# valid frame range for each sequence
self.range_files = [glob.glob(
os.path.join(d, '*_frames.txt'))[0]
for d in self.seq_dirs]
def __getitem__(self, index):
r"""
Args:
index (integer or string): Index or name of a sequence.
Returns:
tuple: (img_files, anno), where ``img_files`` is a list of
file names and ``anno`` is a N x 4 (rectangles) numpy array.
"""
if isinstance(index, six.string_types):
if not index in self.seq_names:
raise Exception('Sequence {} not found.'.format(index))
index = self.seq_names.index(index)
# load valid frame range
frames = np.loadtxt(
self.range_files[index], dtype=int, delimiter=',')
img_files = [os.path.join(
self.seq_dirs[index], 'img/%04d.jpg' % f)
for f in range(frames[0], frames[1] + 1)]
# load annotations
anno = np.loadtxt(self.anno_files[index], delimiter=',')
assert len(img_files) == len(anno)
assert anno.shape[1] == 4
return img_files, anno
def __len__(self):
return len(self.seq_names)
def _download(self, root_dir):
if not os.path.isdir(root_dir):
os.makedirs(root_dir)
elif len(os.listdir(root_dir)) > 100:
print('Files already downloaded.')
return
url = 'http://www.dabi.temple.edu/~hbling/data/TColor-128/Temple-color-128.zip'
zip_file = os.path.join(root_dir, 'Temple-color-128.zip')
print('Downloading to %s...' % zip_file)
download(url, zip_file)
print('\nExtracting to %s...' % root_dir)
extract(zip_file, root_dir)
return root_dir
def _check_integrity(self, root_dir):
seq_names = os.listdir(root_dir)
seq_names = [n for n in seq_names if not n[0] == '.']
if os.path.isdir(root_dir) and len(seq_names) > 0:
# check each sequence folder
for seq_name in seq_names:
seq_dir = os.path.join(root_dir, seq_name)
if not os.path.isdir(seq_dir):
print('Warning: sequence %s not exists.' % seq_name)
else:
# dataset not exists
raise Exception('Dataset not found or corrupted. ' +
'You can use download=True to download it.')
got10k-toolkit-master/got10k/datasets/trackingnet.py 0000664 0000000 0000000 00000006002 14336540625 0022745 0 ustar 00root root 0000000 0000000 from __future__ import absolute_import, print_function
import os
import glob
import six
import numpy as np
class TrackingNet(object):
r"""`TrackingNet `_ Datasets.
Publication:
``TrackingNet: A Large-Scale Dataset and Benchmark for Object Tracking in the Wild.``,
M. Muller, A. Bibi, S. Giancola, S. Al-Subaihi and B. Ghanem, ECCV 2018.
Args:
root_dir (string): Root directory of dataset where sequence
folders exist.
subset (string, optional): Specify ``train`` or ``test``
subset of TrackingNet.
"""
def __init__(self, root_dir, subset='test', *args, **kwargs):
super(TrackingNet, self).__init__()
assert subset in ['train', 'test'], 'Unknown subset.'
self.root_dir = root_dir
self.subset = subset
if subset == 'test':
self.subset_dirs = ['TEST']
elif subset == 'train':
self.subset_dirs = ['TRAIN_%d' % c for c in range(12)]
self._check_integrity(root_dir, self.subset_dirs)
self.anno_files = [glob.glob(os.path.join(
root_dir, c, 'anno/*.txt')) for c in self.subset_dirs]
self.anno_files = sorted(sum(self.anno_files, []))
self.seq_dirs = [os.path.join(
os.path.dirname(os.path.dirname(f)),
'frames',
os.path.basename(f)[:-4])
for f in self.anno_files]
self.seq_names = [os.path.basename(d) for d in self.seq_dirs]
def __getitem__(self, index):
r"""
Args:
index (integer or string): Index or name of a sequence.
Returns:
tuple: (img_files, anno), where ``img_files`` is a list of
file names and ``anno`` is a N x 4 (rectangles) numpy array.
"""
if isinstance(index, six.string_types):
if not index in self.seq_names:
raise Exception('Sequence {} not found.'.format(index))
index = self.seq_names.index(index)
img_files = glob.glob(
os.path.join(self.seq_dirs[index], '*.jpg'))
img_files = sorted(img_files, key=lambda x: int(os.path.basename(x)[:-4]))
anno = np.loadtxt(self.anno_files[index], delimiter=',')
# from IPython import embed;embed()
if self.subset=='train':
assert len(img_files) == len(anno)
assert anno.shape[1] == 4
elif self.subset=='test':
assert anno.shape[0] == 4
anno = anno.reshape(-1, 4)
return img_files, anno
def __len__(self):
return len(self.seq_names)
def _check_integrity(self, root_dir, subset_dirs):
# check each subset path
for c in subset_dirs:
subset_dir = os.path.join(root_dir, c)
# check data and annotation folders
for folder in ['anno', 'frames']:
if not os.path.isdir(os.path.join(subset_dir, folder)):
raise Exception('Dataset not found or corrupted.')
got10k-toolkit-master/got10k/datasets/uav123.json 0000664 0000000 0000000 00000044176 14336540625 0022014 0 ustar 00root root 0000000 0000000 {
"UAV123": {
"bike1": {
"start_frame": 1,
"end_frame": 3085,
"folder_name": "bike1"
},
"bike2": {
"start_frame": 1,
"end_frame": 553,
"folder_name": "bike2"
},
"bike3": {
"start_frame": 1,
"end_frame": 433,
"folder_name": "bike3"
},
"bird1_1": {
"start_frame": 1,
"end_frame": 253,
"folder_name": "bird1"
},
"bird1_2": {
"start_frame": 775,
"end_frame": 1477,
"folder_name": "bird1"
},
"bird1_3": {
"start_frame": 1573,
"end_frame": 2437,
"folder_name": "bird1"
},
"boat1": {
"start_frame": 1,
"end_frame": 901,
"folder_name": "boat1"
},
"boat2": {
"start_frame": 1,
"end_frame": 799,
"folder_name": "boat2"
},
"boat3": {
"start_frame": 1,
"end_frame": 901,
"folder_name": "boat3"
},
"boat4": {
"start_frame": 1,
"end_frame": 553,
"folder_name": "boat4"
},
"boat5": {
"start_frame": 1,
"end_frame": 505,
"folder_name": "boat5"
},
"boat6": {
"start_frame": 1,
"end_frame": 805,
"folder_name": "boat6"
},
"boat7": {
"start_frame": 1,
"end_frame": 535,
"folder_name": "boat7"
},
"boat8": {
"start_frame": 1,
"end_frame": 685,
"folder_name": "boat8"
},
"boat9": {
"start_frame": 1,
"end_frame": 1399,
"folder_name": "boat9"
},
"building1": {
"start_frame": 1,
"end_frame": 469,
"folder_name": "building1"
},
"building2": {
"start_frame": 1,
"end_frame": 577,
"folder_name": "building2"
},
"building3": {
"start_frame": 1,
"end_frame": 829,
"folder_name": "building3"
},
"building4": {
"start_frame": 1,
"end_frame": 787,
"folder_name": "building4"
},
"building5": {
"start_frame": 1,
"end_frame": 481,
"folder_name": "building5"
},
"car1_1": {
"start_frame": 1,
"end_frame": 751,
"folder_name": "car1"
},
"car1_2": {
"start_frame": 751,
"end_frame": 1627,
"folder_name": "car1"
},
"car1_3": {
"start_frame": 1627,
"end_frame": 2629,
"folder_name": "car1"
},
"car2": {
"start_frame": 1,
"end_frame": 1321,
"folder_name": "car2"
},
"car3": {
"start_frame": 1,
"end_frame": 1717,
"folder_name": "car3"
},
"car4": {
"start_frame": 1,
"end_frame": 1345,
"folder_name": "car4"
},
"car5": {
"start_frame": 1,
"end_frame": 745,
"folder_name": "car5"
},
"car6_1": {
"start_frame": 1,
"end_frame": 487,
"folder_name": "car6"
},
"car6_2": {
"start_frame": 487,
"end_frame": 1807,
"folder_name": "car6"
},
"car6_3": {
"start_frame": 1807,
"end_frame": 2953,
"folder_name": "car6"
},
"car6_4": {
"start_frame": 2953,
"end_frame": 3925,
"folder_name": "car6"
},
"car6_5": {
"start_frame": 3925,
"end_frame": 4861,
"folder_name": "car6"
},
"car7": {
"start_frame": 1,
"end_frame": 1033,
"folder_name": "car7"
},
"car8_1": {
"start_frame": 1,
"end_frame": 1357,
"folder_name": "car8"
},
"car8_2": {
"start_frame": 1357,
"end_frame": 2575,
"folder_name": "car8"
},
"car9": {
"start_frame": 1,
"end_frame": 1879,
"folder_name": "car9"
},
"car10": {
"start_frame": 1,
"end_frame": 1405,
"folder_name": "car10"
},
"car11": {
"start_frame": 1,
"end_frame": 337,
"folder_name": "car11"
},
"car12": {
"start_frame": 1,
"end_frame": 499,
"folder_name": "car12"
},
"car13": {
"start_frame": 1,
"end_frame": 415,
"folder_name": "car13"
},
"car14": {
"start_frame": 1,
"end_frame": 1327,
"folder_name": "car14"
},
"car15": {
"start_frame": 1,
"end_frame": 469,
"folder_name": "car15"
},
"car16_1": {
"start_frame": 1,
"end_frame": 415,
"folder_name": "car16"
},
"car16_2": {
"start_frame": 415,
"end_frame": 1993,
"folder_name": "car16"
},
"car17": {
"start_frame": 1,
"end_frame": 1057,
"folder_name": "car17"
},
"car18": {
"start_frame": 1,
"end_frame": 1207,
"folder_name": "car18"
},
"group1_1": {
"start_frame": 1,
"end_frame": 1333,
"folder_name": "group1"
},
"group1_2": {
"start_frame": 1333,
"end_frame": 2515,
"folder_name": "group1"
},
"group1_3": {
"start_frame": 2515,
"end_frame": 3925,
"folder_name": "group1"
},
"group1_4": {
"start_frame": 3925,
"end_frame": 4873,
"folder_name": "group1"
},
"group2_1": {
"start_frame": 1,
"end_frame": 907,
"folder_name": "group2"
},
"group2_2": {
"start_frame": 907,
"end_frame": 1771,
"folder_name": "group2"
},
"group2_3": {
"start_frame": 1771,
"end_frame": 2683,
"folder_name": "group2"
},
"group3_1": {
"start_frame": 1,
"end_frame": 1567,
"folder_name": "group3"
},
"group3_2": {
"start_frame": 1567,
"end_frame": 2827,
"folder_name": "group3"
},
"group3_3": {
"start_frame": 2827,
"end_frame": 4369,
"folder_name": "group3"
},
"group3_4": {
"start_frame": 4369,
"end_frame": 5527,
"folder_name": "group3"
},
"person1": {
"start_frame": 1,
"end_frame": 799,
"folder_name": "person1"
},
"person2_1": {
"start_frame": 1,
"end_frame": 1189,
"folder_name": "person2"
},
"person2_2": {
"start_frame": 1189,
"end_frame": 2623,
"folder_name": "person2"
},
"person3": {
"start_frame": 1,
"end_frame": 643,
"folder_name": "person3"
},
"person4_1": {
"start_frame": 1,
"end_frame": 1501,
"folder_name": "person4"
},
"person4_2": {
"start_frame": 1501,
"end_frame": 2743,
"folder_name": "person4"
},
"person5_1": {
"start_frame": 1,
"end_frame": 877,
"folder_name": "person5"
},
"person5_2": {
"start_frame": 877,
"end_frame": 2101,
"folder_name": "person5"
},
"person6": {
"start_frame": 1,
"end_frame": 901,
"folder_name": "person6"
},
"person7_1": {
"start_frame": 1,
"end_frame": 1249,
"folder_name": "person7"
},
"person7_2": {
"start_frame": 1249,
"end_frame": 2065,
"folder_name": "person7"
},
"person8_1": {
"start_frame": 1,
"end_frame": 1075,
"folder_name": "person8"
},
"person8_2": {
"start_frame": 1075,
"end_frame": 1525,
"folder_name": "person8"
},
"person9": {
"start_frame": 1,
"end_frame": 661,
"folder_name": "person9"
},
"person10": {
"start_frame": 1,
"end_frame": 1021,
"folder_name": "person10"
},
"person11": {
"start_frame": 1,
"end_frame": 721,
"folder_name": "person11"
},
"person12_1": {
"start_frame": 1,
"end_frame": 601,
"folder_name": "person12"
},
"person12_2": {
"start_frame": 601,
"end_frame": 1621,
"folder_name": "person12"
},
"person13": {
"start_frame": 1,
"end_frame": 883,
"folder_name": "person13"
},
"person14_1": {
"start_frame": 1,
"end_frame": 847,
"folder_name": "person14"
},
"person14_2": {
"start_frame": 847,
"end_frame": 1813,
"folder_name": "person14"
},
"person14_3": {
"start_frame": 1813,
"end_frame": 2923,
"folder_name": "person14"
},
"person15": {
"start_frame": 1,
"end_frame": 1339,
"folder_name": "person15"
},
"person16": {
"start_frame": 1,
"end_frame": 1147,
"folder_name": "person16"
},
"person17_1": {
"start_frame": 1,
"end_frame": 1501,
"folder_name": "person17"
},
"person17_2": {
"start_frame": 1501,
"end_frame": 2347,
"folder_name": "person17"
},
"person18": {
"start_frame": 1,
"end_frame": 1393,
"folder_name": "person18"
},
"person19_1": {
"start_frame": 1,
"end_frame": 1243,
"folder_name": "person19"
},
"person19_2": {
"start_frame": 1243,
"end_frame": 2791,
"folder_name": "person19"
},
"person19_3": {
"start_frame": 2791,
"end_frame": 4357,
"folder_name": "person19"
},
"person20": {
"start_frame": 1,
"end_frame": 1783,
"folder_name": "person20"
},
"person21": {
"start_frame": 1,
"end_frame": 487,
"folder_name": "person21"
},
"person22": {
"start_frame": 1,
"end_frame": 199,
"folder_name": "person22"
},
"person23": {
"start_frame": 1,
"end_frame": 397,
"folder_name": "person23"
},
"truck1": {
"start_frame": 1,
"end_frame": 463,
"folder_name": "truck1"
},
"truck2": {
"start_frame": 1,
"end_frame": 385,
"folder_name": "truck2"
},
"truck3": {
"start_frame": 1,
"end_frame": 535,
"folder_name": "truck3"
},
"truck4_1": {
"start_frame": 1,
"end_frame": 577,
"folder_name": "truck4"
},
"truck4_2": {
"start_frame": 577,
"end_frame": 1261,
"folder_name": "truck4"
},
"uav1_1": {
"start_frame": 1,
"end_frame": 1555,
"folder_name": "uav1"
},
"uav1_2": {
"start_frame": 1555,
"end_frame": 2377,
"folder_name": "uav1"
},
"uav1_3": {
"start_frame": 2473,
"end_frame": 3469,
"folder_name": "uav1"
},
"uav2": {
"start_frame": 1,
"end_frame": 133,
"folder_name": "uav2"
},
"uav3": {
"start_frame": 1,
"end_frame": 265,
"folder_name": "uav3"
},
"uav4": {
"start_frame": 1,
"end_frame": 157,
"folder_name": "uav4"
},
"uav5": {
"start_frame": 1,
"end_frame": 139,
"folder_name": "uav5"
},
"uav6": {
"start_frame": 1,
"end_frame": 109,
"folder_name": "uav6"
},
"uav7": {
"start_frame": 1,
"end_frame": 373,
"folder_name": "uav7"
},
"uav8": {
"start_frame": 1,
"end_frame": 301,
"folder_name": "uav8"
},
"wakeboard1": {
"start_frame": 1,
"end_frame": 421,
"folder_name": "wakeboard1"
},
"wakeboard2": {
"start_frame": 1,
"end_frame": 733,
"folder_name": "wakeboard2"
},
"wakeboard3": {
"start_frame": 1,
"end_frame": 823,
"folder_name": "wakeboard3"
},
"wakeboard4": {
"start_frame": 1,
"end_frame": 697,
"folder_name": "wakeboard4"
},
"wakeboard5": {
"start_frame": 1,
"end_frame": 1675,
"folder_name": "wakeboard5"
},
"wakeboard6": {
"start_frame": 1,
"end_frame": 1165,
"folder_name": "wakeboard6"
},
"wakeboard7": {
"start_frame": 1,
"end_frame": 199,
"folder_name": "wakeboard7"
},
"wakeboard8": {
"start_frame": 1,
"end_frame": 1543,
"folder_name": "wakeboard8"
},
"wakeboard9": {
"start_frame": 1,
"end_frame": 355,
"folder_name": "wakeboard9"
},
"wakeboard10": {
"start_frame": 1,
"end_frame": 469,
"folder_name": "wakeboard10"
},
"car1_s": {
"start_frame": 1,
"end_frame": 1475,
"folder_name": "car1_s"
},
"car2_s": {
"start_frame": 1,
"end_frame": 320,
"folder_name": "car2_s"
},
"car3_s": {
"start_frame": 1,
"end_frame": 1300,
"folder_name": "car3_s"
},
"car4_s": {
"start_frame": 1,
"end_frame": 830,
"folder_name": "car4_s"
},
"person1_s": {
"start_frame": 1,
"end_frame": 1600,
"folder_name": "person1_s"
},
"person2_s": {
"start_frame": 1,
"end_frame": 250,
"folder_name": "person2_s"
},
"person3_s": {
"start_frame": 1,
"end_frame": 505,
"folder_name": "person3_s"
}
},
"UAV20L": {
"bike1": {
"start_frame": 1,
"end_frame": 3085,
"folder_name": "bike1"
},
"bird1": {
"start_frame": 1,
"end_frame": 2437,
"folder_name": "bird1"
},
"car1": {
"start_frame": 1,
"end_frame": 2629,
"folder_name": "car1"
},
"car3": {
"start_frame": 1,
"end_frame": 1717,
"folder_name": "car3"
},
"car6": {
"start_frame": 1,
"end_frame": 4861,
"folder_name": "car6"
},
"car8": {
"start_frame": 1,
"end_frame": 2575,
"folder_name": "car8"
},
"car9": {
"start_frame": 1,
"end_frame": 1879,
"folder_name": "car9"
},
"car16": {
"start_frame": 1,
"end_frame": 1993,
"folder_name": "car16"
},
"group1": {
"start_frame": 1,
"end_frame": 4873,
"folder_name": "group1"
},
"group2": {
"start_frame": 1,
"end_frame": 2683,
"folder_name": "group2"
},
"group3": {
"start_frame": 1,
"end_frame": 5527,
"folder_name": "group3"
},
"person2": {
"start_frame": 1,
"end_frame": 2623,
"folder_name": "person2"
},
"person4": {
"start_frame": 1,
"end_frame": 2743,
"folder_name": "person4"
},
"person5": {
"start_frame": 1,
"end_frame": 2101,
"folder_name": "person5"
},
"person7": {
"start_frame": 1,
"end_frame": 2065,
"folder_name": "person7"
},
"person14": {
"start_frame": 1,
"end_frame": 2923,
"folder_name": "person14"
},
"person17": {
"start_frame": 1,
"end_frame": 2347,
"folder_name": "person17"
},
"person19": {
"start_frame": 1,
"end_frame": 4357,
"folder_name": "person19"
},
"person20": {
"start_frame": 1,
"end_frame": 1783,
"folder_name": "person20"
},
"uav1": {
"start_frame": 1,
"end_frame": 3469,
"folder_name": "uav1"
}
}
} got10k-toolkit-master/got10k/datasets/uav123.py 0000664 0000000 0000000 00000006674 14336540625 0021474 0 ustar 00root root 0000000 0000000 from __future__ import absolute_import, print_function
import os
import glob
import numpy as np
import six
import json
class UAV123(object):
"""`UAV123 `_ Dataset.
Publication:
``A Benchmark and Simulator for UAV Tracking``,
M. Mueller, N. Smith and B. Ghanem, ECCV 2016.
Args:
root_dir (string): Root directory of dataset where sequence
folders exist.
version (integer or string): Specify the benchmark version, specify as one of
``UAV123`` and ``UAV20L``.
"""
def __init__(self, root_dir, version='UAV123'):
super(UAV123, self).__init__()
assert version.upper() in ['UAV20L', 'UAV123']
self.root_dir = root_dir
self.version = version.upper()
self._check_integrity(root_dir, version)
# sequence meta information
meta_file = os.path.join(
os.path.dirname(__file__), 'uav123.json')
with open(meta_file) as f:
self.seq_metas = json.load(f)
# sequence and annotation paths
self.anno_files = sorted(glob.glob(
os.path.join(root_dir, 'anno/%s/*.txt' % version)))
self.seq_names = [
os.path.basename(f)[:-4] for f in self.anno_files]
self.seq_dirs = [os.path.join(
root_dir, 'data_seq/UAV123/%s' % \
self.seq_metas[version][n]['folder_name'])
for n in self.seq_names]
def __getitem__(self, index):
r"""
Args:
index (integer or string): Index or name of a sequence.
Returns:
tuple: (img_files, anno), where ``img_files`` is a list of
file names and ``anno`` is a N x 4 (rectangles) numpy array.
"""
if isinstance(index, six.string_types):
if not index in self.seq_names:
raise Exception('Sequence {} not found.'.format(index))
index = self.seq_names.index(index)
# valid frame range
start_frame = self.seq_metas[self.version][
self.seq_names[index]]['start_frame']
end_frame = self.seq_metas[self.version][
self.seq_names[index]]['end_frame']
img_files = [os.path.join(
self.seq_dirs[index], '%06d.jpg' % f)
for f in range(start_frame, end_frame + 1)]
# load annotations
anno = np.loadtxt(self.anno_files[index], delimiter=',')
assert len(img_files) == len(anno)
assert anno.shape[1] == 4
return img_files, anno
def __len__(self):
return len(self.seq_names)
def _check_integrity(self, root_dir, version):
# sequence meta information
meta_file = os.path.join(
os.path.dirname(__file__), 'uav123.json')
with open(meta_file) as f:
seq_metas = json.load(f)
seq_names = list(seq_metas[version].keys())
if os.path.isdir(root_dir) and len(os.listdir(root_dir)) > 3:
# check each sequence folder
for seq_name in seq_names:
seq_dir = os.path.join(
root_dir, 'data_seq/UAV123/%s' % \
seq_metas[version][seq_name]['folder_name'])
if not os.path.isdir(seq_dir):
print('Warning: sequence %s not exists.' % seq_name)
else:
# dataset not exists
raise Exception('Dataset not found or corrupted.')
got10k-toolkit-master/got10k/datasets/vid.py 0000664 0000000 0000000 00000013502 14336540625 0021221 0 ustar 00root root 0000000 0000000 from __future__ import absolute_import, print_function
import os
import glob
import six
import numpy as np
import xml.etree.ElementTree as ET
import json
from collections import OrderedDict
class ImageNetVID(object):
r"""`ImageNet Video Image Detection (VID) `_ Dataset.
Publication:
``ImageNet Large Scale Visual Recognition Challenge``, O. Russakovsky,
J. deng, H. Su, etc. IJCV, 2015.
Args:
root_dir (string): Root directory of dataset where ``Data``, and
``Annotation`` folders exist.
subset (string, optional): Specify ``train``, ``val`` or (``train``, ``val``)
subset(s) of ImageNet-VID. Default is a tuple (``train``, ``val``).
cache_dir (string, optional): Directory for caching the paths and annotations
for speeding up loading. Default is ``cache/imagenet_vid``.
"""
def __init__(self, root_dir, subset=('train', 'val'),
cache_dir='cache/imagenet_vid'):
self.root_dir = root_dir
self.cache_dir = cache_dir
if isinstance(subset, str):
assert subset in ['train', 'val']
self.subset = [subset]
elif isinstance(subset, (list, tuple)):
assert all([s in ['train', 'val'] for s in subset])
self.subset = subset
else:
raise Exception('Unknown subset')
# cache filenames and annotations to speed up training
self.seq_dict = self._cache_meta()
self.seq_names = [n for n in self.seq_dict]
def __getitem__(self, index):
r"""
Args:
index (integer or string): Index or name of a sequence.
Returns:
tuple: (img_files, anno), where ``img_files`` is a list of
file names and ``anno`` is a N x 4 (rectangles) numpy array.
"""
if isinstance(index, six.string_types):
seq_name = index
else:
seq_name = self.seq_names[index]
seq_dir, frames, anno_file = self.seq_dict[seq_name]
img_files = [os.path.join(
seq_dir, '%06d.JPEG' % f) for f in frames]
anno = np.loadtxt(anno_file, delimiter=',')
return img_files, anno
def __len__(self):
return len(self.seq_dict)
def _cache_meta(self):
cache_file = os.path.join(self.cache_dir, 'seq_dict.json')
if os.path.isfile(cache_file):
print('Dataset already cached.')
with open(cache_file) as f:
seq_dict = json.load(f, object_pairs_hook=OrderedDict)
return seq_dict
# image and annotation paths
print('Gather sequence paths...')
seq_dirs = []
anno_dirs = []
if 'train' in self.subset:
seq_dirs_ = sorted(glob.glob(os.path.join(
self.root_dir, 'Data/VID/train/ILSVRC*/ILSVRC*')))
anno_dirs_ = [os.path.join(
self.root_dir, 'Annotations/VID/train',
*s.split('/')[-2:]) for s in seq_dirs_]
seq_dirs += seq_dirs_
anno_dirs += anno_dirs_
if 'val' in self.subset:
seq_dirs_ = sorted(glob.glob(os.path.join(
self.root_dir, 'Data/VID/val/ILSVRC2015_val_*')))
anno_dirs_ = [os.path.join(
self.root_dir, 'Annotations/VID/val',
s.split('/')[-1]) for s in seq_dirs_]
seq_dirs += seq_dirs_
anno_dirs += anno_dirs_
seq_names = [os.path.basename(s) for s in seq_dirs]
# cache paths and annotations
print('Caching annotations to %s, ' % self.cache_dir + \
'it may take a few minutes...')
seq_dict = OrderedDict()
cache_anno_dir = os.path.join(self.cache_dir, 'anno')
if not os.path.isdir(cache_anno_dir):
os.makedirs(cache_anno_dir)
for s, seq_name in enumerate(seq_names):
if s % 100 == 0 or s == len(seq_names) - 1:
print('--Caching sequence %d/%d: %s' % \
(s + 1, len(seq_names), seq_name))
anno_files = sorted(glob.glob(os.path.join(
anno_dirs[s], '*.xml')))
objects = [ET.ElementTree(file=f).findall('object')
for f in anno_files]
# find all track ids
track_ids, counts = np.unique([
obj.find('trackid').text for group in objects
for obj in group], return_counts=True)
# fetch paths and annotations for each track id
for t, track_id in enumerate(track_ids):
if counts[t] < 2:
continue
frames = []
anno = []
for f, group in enumerate(objects):
for obj in group:
if not obj.find('trackid').text == track_id:
continue
frames.append(f)
anno.append([
int(obj.find('bndbox/xmin').text),
int(obj.find('bndbox/ymin').text),
int(obj.find('bndbox/xmax').text),
int(obj.find('bndbox/ymax').text)])
anno = np.array(anno, dtype=int)
anno[:, 2:] -= anno[:, :2] - 1
# store annotations
key = '%s.%d' % (seq_name, int(track_id))
cache_anno_file = os.path.join(cache_anno_dir, key + '.txt')
np.savetxt(cache_anno_file, anno, fmt='%d', delimiter=',')
# store paths
seq_dict.update([(key, [
seq_dirs[s], frames, cache_anno_file])])
# store seq_dict
with open(cache_file, 'w') as f:
json.dump(seq_dict, f)
return seq_dict
got10k-toolkit-master/got10k/datasets/vot.py 0000664 0000000 0000000 00000023673 14336540625 0021261 0 ustar 00root root 0000000 0000000 from __future__ import absolute_import, print_function, division
import os
import glob
import numpy as np
import six
import json
import hashlib
from ..utils.ioutils import download, extract
class VOT(object):
r"""`VOT `_ Datasets.
Publication:
``The Visual Object Tracking VOT2017 challenge results``, M. Kristan, A. Leonardis
and J. Matas, etc. 2017.
Args:
root_dir (string): Root directory of dataset where sequence
folders exist.
version (integer, optional): Specify the benchmark version. Specify as
one of 2013~2018. Default is 2017.
anno_type (string, optional): Returned annotation types, chosen as one of
``rect`` and ``corner``. Default is ``rect``.
download (boolean, optional): If True, downloads the dataset from the internet
and puts it in root directory. If dataset is downloaded, it is not
downloaded again.
return_meta (string, optional): If True, returns ``meta``
of each sequence in ``__getitem__`` function, otherwise
only returns ``img_files`` and ``anno``.
list_file (string, optional): If provided, only read sequences
specified by the file.
"""
__valid_versions = [2013, 2014, 2015, 2016, 2017, 2018, 'LT2018',
2019, 'LT2019', 'RGBD2019', 'RGBT2019']
def __init__(self, root_dir, version=2017, anno_type='rect',
download=True, return_meta=False, list_file=None):
super(VOT, self).__init__()
assert version in self.__valid_versions, 'Unsupport VOT version.'
assert anno_type in ['default', 'rect'], 'Unknown annotation type.'
self.root_dir = root_dir
self.version = version
self.anno_type = anno_type
if download:
self._download(root_dir, version)
self.return_meta = return_meta
if list_file is None:
list_file = os.path.join(root_dir, 'list.txt')
self._check_integrity(root_dir, version, list_file)
with open(list_file, 'r') as f:
self.seq_names = f.read().strip().split('\n')
self.seq_dirs = [os.path.join(root_dir, s) for s in self.seq_names]
self.anno_files = [os.path.join(s, 'groundtruth.txt')
for s in self.seq_dirs]
def __getitem__(self, index):
r"""
Args:
index (integer or string): Index or name of a sequence.
Returns:
tuple: (img_files, anno) if ``return_meta`` is False, otherwise
(img_files, anno, meta), where ``img_files`` is a list of
file names, ``anno`` is a N x 4 (rectangles) or N x 8 (corners) numpy array,
while ``meta`` is a dict contains meta information about the sequence.
"""
if isinstance(index, six.string_types):
if not index in self.seq_names:
raise Exception('Sequence {} not found.'.format(index))
index = self.seq_names.index(index)
img_files = sorted(glob.glob(
os.path.join(self.seq_dirs[index], '*.jpg')))
anno = np.loadtxt(self.anno_files[index], delimiter=',')
assert len(img_files) == len(anno)
assert anno.shape[1] in [4, 8]
if self.anno_type == 'rect' and anno.shape[1] == 8:
anno = self._corner2rect(anno)
if self.return_meta:
meta = self._fetch_meta(
self.seq_dirs[index], len(img_files))
return img_files, anno, meta
else:
return img_files, anno
def __len__(self):
return len(self.seq_names)
def _download(self, root_dir, version):
assert version in self.__valid_versions
if not os.path.isdir(root_dir):
os.makedirs(root_dir)
elif os.path.isfile(os.path.join(root_dir, 'list.txt')):
with open(os.path.join(root_dir, 'list.txt')) as f:
seq_names = f.read().strip().split('\n')
if all([os.path.isdir(os.path.join(root_dir, s)) for s in seq_names]):
print('Files already downloaded.')
return
url = 'http://data.votchallenge.net/'
if version in range(2013, 2015 + 1):
# main challenge (2013~2015)
homepage = url + 'vot{}/dataset/'.format(version)
elif version in range(2015, 2019 + 1):
# main challenge (2016~2019)
homepage = url + 'vot{}/main/'.format(version)
elif version.startswith('LT'):
# long-term tracking challenge
year = int(version[2:])
homepage = url + 'vot{}/longterm/'.format(year)
elif version.startswith('RGBD'):
# RGBD tracking challenge
year = int(version[4:])
homepage = url + 'vot{}/rgbd/'.format(year)
elif version.startswith('RGBT'):
# RGBT tracking challenge
year = int(version[4:])
url = url + 'vot{}/rgbtir/'.format(year)
homepage = url + 'meta/'
# download description file
bundle_url = homepage + 'description.json'
bundle_file = os.path.join(root_dir, 'description.json')
if not os.path.isfile(bundle_file):
print('Downloading description file...')
download(bundle_url, bundle_file)
# read description file
print('\nParsing description file...')
with open(bundle_file) as f:
bundle = json.load(f)
# md5 generator
def md5(filename):
hash_md5 = hashlib.md5()
with open(filename, 'rb') as f:
for chunk in iter(lambda: f.read(4096), b""):
hash_md5.update(chunk)
return hash_md5.hexdigest()
# download all sequences
seq_names = []
for seq in bundle['sequences']:
seq_name = seq['name']
seq_names.append(seq_name)
# download channel (color/depth/ir) files
channels = seq['channels'].keys()
seq_files = []
for cn in channels:
seq_url = seq['channels'][cn]['url']
if not seq_url.startswith(('http', 'https')):
seq_url = url + seq_url[seq_url.find('sequence'):]
seq_file = os.path.join(
root_dir,
'{}_{}.zip'.format(seq_name, cn))
if not os.path.isfile(seq_file) or \
md5(seq_file) != seq['channels'][cn]['checksum']:
print('\nDownloading %s...' % seq_name)
download(seq_url, seq_file)
seq_files.append(seq_file)
# download annotations
anno_url = homepage + '%s.zip' % seq_name
anno_file = os.path.join(root_dir, seq_name + '_anno.zip')
if not os.path.isfile(anno_file) or \
md5(anno_file) != seq['annotations']['checksum']:
download(anno_url, anno_file)
# unzip compressed files
seq_dir = os.path.join(root_dir, seq_name)
if not os.path.isfile(seq_dir) or len(os.listdir(seq_dir)) < 10:
print('Extracting %s...' % seq_name)
os.makedirs(seq_dir)
for seq_file in seq_files:
extract(seq_file, seq_dir)
extract(anno_file, seq_dir)
# save list.txt
list_file = os.path.join(root_dir, 'list.txt')
with open(list_file, 'w') as f:
f.write(str.join('\n', seq_names))
return root_dir
def _check_integrity(self, root_dir, version, list_file=None):
assert version in self.__valid_versions
if list_file is None:
list_file = os.path.join(root_dir, 'list.txt')
if os.path.isfile(list_file):
with open(list_file, 'r') as f:
seq_names = f.read().strip().split('\n')
# check each sequence folder
for seq_name in seq_names:
seq_dir = os.path.join(root_dir, seq_name)
if not os.path.isdir(seq_dir):
print('Warning: sequence %s not exists.' % seq_name)
else:
# dataset not exists
raise Exception('Dataset not found or corrupted. ' +
'You can use download=True to download it.')
def _corner2rect(self, corners, center=False):
cx = np.mean(corners[:, 0::2], axis=1)
cy = np.mean(corners[:, 1::2], axis=1)
x1 = np.min(corners[:, 0::2], axis=1)
x2 = np.max(corners[:, 0::2], axis=1)
y1 = np.min(corners[:, 1::2], axis=1)
y2 = np.max(corners[:, 1::2], axis=1)
area1 = np.linalg.norm(corners[:, 0:2] - corners[:, 2:4], axis=1) * \
np.linalg.norm(corners[:, 2:4] - corners[:, 4:6], axis=1)
area2 = (x2 - x1) * (y2 - y1)
scale = np.sqrt(area1 / area2)
w = scale * (x2 - x1) + 1
h = scale * (y2 - y1) + 1
if center:
return np.array([cx, cy, w, h]).T
else:
return np.array([cx - w / 2, cy - h / 2, w, h]).T
def _fetch_meta(self, seq_dir, frame_num):
meta = {}
# attributes
tag_files = glob.glob(os.path.join(seq_dir, '*.label')) + \
glob.glob(os.path.join(seq_dir, '*.tag'))
for f in tag_files:
tag = os.path.basename(f)
tag = tag[:tag.rfind('.')]
meta[tag] = np.loadtxt(f)
# practical
practical_file = os.path.join(seq_dir, 'practical')
if os.path.isfile(practical_file + '.value'):
meta['practical'] = np.loadtxt(practical_file + '.value')
if os.path.isfile(practical_file + '.txt'):
meta['practical_txt'] = np.loadtxt(practical_file + '.txt')
# pad zeros if necessary
for tag, val in meta.items():
if len(val) < frame_num:
meta[tag] = np.pad(
val, (0, frame_num - len(val)), 'constant')
return meta
got10k-toolkit-master/got10k/datasets/youtubevos.py 0000664 0000000 0000000 00000004720 14336540625 0022665 0 ustar 00root root 0000000 0000000 import os
import glob
import numpy as np
import PIL.Image
from .davis import DAVIS_Like, get_bbox_from_segmentation_mask_xywh
class YouTubeVOS(DAVIS_Like):
def __init__(self, root_dir, version="valid", use_all_frames=True):
img_version = version
if use_all_frames:
img_version += "_all_frames"
img_dir = os.path.join(root_dir, img_version, "JPEGImages")
ann_dir = os.path.join(root_dir, version, "Annotations")
seqs = [x.split("/")[-2] for x in sorted(glob.glob(ann_dir + "/*/"))]
seq_names = []
self._start_times_and_ff_masks = []
for seq in seqs:
ids_to_start_time_and_ff_mask = {}
start_annotation_files = sorted(glob.glob(os.path.join(ann_dir, seq, "*.png")))
for start_annotation_file in start_annotation_files:
t = int(start_annotation_file.split("/")[-1].replace(".png", ""))
ann = np.array(PIL.Image.open(start_annotation_file))
ann_ids = np.setdiff1d(np.unique(ann), [0])
for id_ in ann_ids:
if id_ in ids_to_start_time_and_ff_mask:
if t < ids_to_start_time_and_ff_mask[id_][0]:
ids_to_start_time_and_ff_mask[id_] = (t, ann == id_)
else:
ids_to_start_time_and_ff_mask[id_] = (t, ann == id_)
ids = sorted(ids_to_start_time_and_ff_mask.keys())
for id_ in ids:
seq_with_id = seq + "__" + str(id_)
seq_names.append(seq_with_id)
self._start_times_and_ff_masks.append(ids_to_start_time_and_ff_mask[id_])
super().__init__(img_dir, ann_dir, seq_names)
def __getitem__(self, index):
r"""
Args:
index (integer or string): Index of a sequence.
Returns:
tuple: (img_files, anno), where ``img_files`` is a list of
file names and ``anno`` is a N x 4 (rectangles) numpy array.
"""
start_time, ff_mask = self._start_times_and_ff_masks[index]
seq_name = self.seq_names[index]
sp = seq_name.split("__")
img_files = sorted(glob.glob(os.path.join(self.img_dir, sp[0], "*.jpg")))
img_files = [x for x in img_files if int(x.split("/")[-1].replace(".jpg", "")) >= start_time]
anno = np.full((len(img_files), 4), fill_value=np.nan)
anno[0] = get_bbox_from_segmentation_mask_xywh(ff_mask)
return img_files, anno
got10k-toolkit-master/got10k/experiments/ 0000775 0000000 0000000 00000000000 14336540625 0020617 5 ustar 00root root 0000000 0000000 got10k-toolkit-master/got10k/experiments/__init__.py 0000664 0000000 0000000 00000000757 14336540625 0022741 0 ustar 00root root 0000000 0000000 from __future__ import absolute_import
from .got10k import ExperimentGOT10k
from .otb import ExperimentOTB
from .vot import ExperimentVOT
from .dtb70 import ExperimentDTB70
from .uav123 import ExperimentUAV123
from .nfs import ExperimentNfS
from .tcolor128 import ExperimentTColor128
from .lasot import ExperimentLaSOT
from .trackingnet import ExperimentTrackingNet
from .davis import ExperimentDAVIS
from .youtubevos import ExperimentYouTubeVOS
from .oxuva_experiment import ExperimentOxuva
got10k-toolkit-master/got10k/experiments/ctc.py 0000664 0000000 0000000 00000002127 14336540625 0021744 0 ustar 00root root 0000000 0000000 # Kristyna Janku: Modified "custom.py" for usage with "CTCDataset"
from __future__ import absolute_import
import os
from ..datasets.ctc_dataset import CTCDataset
from .otb import ExperimentOTB
class ExperimentCTC(ExperimentOTB):
r"""Experiment pipeline and evaluation toolkit for CTC dataset.
Args:
root_dir (string): Root directory of CTC dataset.
result_dir (string, optional): Directory for storing tracking
results. Default is ``./results``.
report_dir (string, optional): Directory for storing performance
evaluation results. Default is ``./reports``.
"""
def __init__(self, root_dir, name, subset='test',
result_dir='results', report_dir='reports', start_idx=0, end_idx=None):
self.dataset = CTCDataset(root_dir, name, subset)
self.result_dir = os.path.join(result_dir, name)
self.report_dir = os.path.join(report_dir, name)
self.start_idx = start_idx
self.end_idx = end_idx
self.use_confs = False
self.dump_as_csv = False
self.has_groundtruth = False
got10k-toolkit-master/got10k/experiments/custom.py 0000664 0000000 0000000 00000002027 14336540625 0022504 0 ustar 00root root 0000000 0000000 from __future__ import absolute_import
import os
from ..datasets.custom_dataset import CustomDataset
from .otb import ExperimentOTB
class ExperimentCustom(ExperimentOTB):
r"""Experiment pipeline and evaluation toolkit for custom dataset.
Args:
root_dir (string): Root directory of TColor128 dataset.
result_dir (string, optional): Directory for storing tracking
results. Default is ``./results``.
report_dir (string, optional): Directory for storing performance
evaluation results. Default is ``./reports``.
"""
def __init__(self, root_dir,
result_dir='results', report_dir='reports', name='custom', start_idx=0, end_idx=None):
self.dataset = CustomDataset(root_dir)
self.result_dir = os.path.join(result_dir, name)
self.report_dir = os.path.join(report_dir, name)
self.start_idx = start_idx
self.end_idx = end_idx
self.use_confs = False
self.dump_as_csv = False
self.has_groundtruth = False
got10k-toolkit-master/got10k/experiments/davis.py 0000664 0000000 0000000 00000010635 14336540625 0022304 0 ustar 00root root 0000000 0000000 import os
import json
import numpy as np
from got10k.datasets.davis import DAVIS
from got10k.experiments import ExperimentOTB
from got10k.utils.metrics import rect_iou
class ExperimentDAVISLike(ExperimentOTB):
def __init__(self):
self.use_confs = True
def _record(self, record_file, boxes, times, confs):
super()._record(record_file, boxes, times)
# convert confs to string
lines = ['%.4f' % c for c in confs]
lines[0] = '99999.99'
conf_file = record_file.replace(".txt", "_confidence.value")
with open(conf_file, 'w') as f:
f.write(str.join('\n', lines))
def _calc_metrics(self, boxes, anno):
ious = rect_iou(boxes, anno)
# special case
not_present_mask_anno = np.any(np.isnan(anno), axis=1)
not_present_mask_boxes = np.any(np.isnan(boxes), axis=1)
ious[np.logical_or(not_present_mask_anno, not_present_mask_boxes)] = 0.0
ious[np.logical_and(not_present_mask_anno, not_present_mask_boxes)] = 1.0
return ious
def report(self, tracker_names, plot_curves=True):
assert isinstance(tracker_names, (list, tuple))
# assume tracker_names[0] is your tracker
report_dir = os.path.join(self.report_dir, tracker_names[0])
if not os.path.isdir(report_dir):
os.makedirs(report_dir)
report_file = os.path.join(report_dir, 'performance.json')
performance = {}
for name in tracker_names:
print('Evaluating', name)
seq_num = len(self.dataset)
seq_ious = np.zeros((seq_num,))
speeds = np.zeros(seq_num)
performance.update({name: {
'overall': {},
'seq_wise': {}}})
for s, (_, anno) in enumerate(self.dataset):
seq_name = self.dataset.seq_names[s]
record_file = os.path.join(
self.result_dir, name, '%s.txt' % seq_name)
boxes = np.loadtxt(record_file, delimiter=',')
boxes[0] = anno[0]
if not (len(boxes) == len(anno)):
print('warning: %s anno do not match boxes' % seq_name)
assert len(boxes) == len(anno)
conf_file = os.path.join(
self.result_dir, name, '%s_confidence.value' % seq_name)
confs = np.loadtxt(conf_file)
if not (len(boxes) == len(confs)):
print('warning: %s boxes do not match confs' % seq_name)
assert len(boxes) == len(confs)
confs[0] = 99999.99
# remove boxes for which confidence is -1?
#boxes[confs == -1.0, :] = np.nan
ious = self._calc_metrics(boxes, anno)
miou = np.mean(ious[1:-1])
seq_ious[s] = miou
# calculate average tracking speed
time_file = os.path.join(
self.result_dir, name, 'times/%s_time.txt' % seq_name)
if os.path.isfile(time_file):
times = np.loadtxt(time_file)
times = times[times > 0]
if len(times) > 0:
speeds[s] = np.mean(1. / times)
# store sequence-wise performance
performance[name]['seq_wise'].update({seq_name: {
'miou': miou,
'speed_fps': speeds[s] if speeds[s] > 0 else -1}})
miou_total = np.mean(seq_ious)
if np.count_nonzero(speeds) > 0:
avg_speed = np.sum(speeds) / np.count_nonzero(speeds)
else:
avg_speed = -1
# store overall performance
performance[name]['overall'].update({
'miou': miou_total,
'speed_fps': avg_speed})
# report the performance
with open(report_file, 'w') as f:
json.dump(performance, f, indent=4)
return performance
class ExperimentDAVIS(ExperimentDAVISLike):
def __init__(self, root_dir, result_dir='results', report_dir='reports', start_idx=0, end_idx=None,
version="2017_val"):
self.dataset = DAVIS(root_dir, version)
self.result_dir = os.path.join(result_dir, 'DAVIS' + str(version))
self.report_dir = os.path.join(report_dir, 'DAVIS' + str(version))
self.start_idx = start_idx
self.end_idx = end_idx
super().__init__()
got10k-toolkit-master/got10k/experiments/dtb70.py 0000664 0000000 0000000 00000001701 14336540625 0022110 0 ustar 00root root 0000000 0000000 from __future__ import absolute_import
import os
from .otb import ExperimentOTB
from ..datasets import DTB70
class ExperimentDTB70(ExperimentOTB):
r"""Experiment pipeline and evaluation toolkit for DTB70 dataset.
Args:
root_dir (string): Root directory of DTB70 dataset.
result_dir (string, optional): Directory for storing tracking
results. Default is ``./results``.
report_dir (string, optional): Directory for storing performance
evaluation results. Default is ``./reports``.
"""
def __init__(self, root_dir,
result_dir='results', report_dir='reports'):
self.dataset = DTB70(root_dir)
self.result_dir = os.path.join(result_dir, 'DTB70')
self.report_dir = os.path.join(report_dir, 'DTB70')
# as nbins_iou increases, the success score
# converges to the average overlap (AO)
self.nbins_iou = 21
self.nbins_ce = 51
got10k-toolkit-master/got10k/experiments/got10k.py 0000664 0000000 0000000 00000040222 14336540625 0022276 0 ustar 00root root 0000000 0000000 from __future__ import absolute_import, division, print_function
import os
import numpy as np
import glob
import ast
import json
import time
import matplotlib.pyplot as plt
import matplotlib
from PIL import Image
import cv2
from ..datasets import GOT10k
from ..utils.metrics import rect_iou
from ..utils.viz import show_frame
from ..utils.ioutils import compress
class ExperimentGOT10k(object):
r"""Experiment pipeline and evaluation toolkit for GOT-10k dataset.
Args:
root_dir (string): Root directory of GOT-10k dataset where
``train``, ``val`` and ``test`` folders exist.
subset (string): Specify ``train``, ``val`` or ``test``
subset of GOT-10k.
list_file (string, optional): If provided, only run experiments on
sequences specified by this file.
result_dir (string, optional): Directory for storing tracking
results. Default is ``./results``.
report_dir (string, optional): Directory for storing performance
evaluation results. Default is ``./reports``.
"""
def __init__(self, root_dir, subset='val', list_file=None,
result_dir='results', report_dir='reports', use_dataset=True, start_idx=0, end_idx=None):
super(ExperimentGOT10k, self).__init__()
assert subset in ['val', 'test']
self.subset = subset
if use_dataset:
self.dataset = GOT10k(
root_dir, subset=subset, list_file=list_file)
self.result_dir = os.path.join(result_dir, 'GOT-10k')
self.report_dir = os.path.join(report_dir, 'GOT-10k')
self.nbins_iou = 101
self.repetitions = 3
self.start_idx = start_idx
self.end_idx = end_idx
def run(self, tracker, visualize=False, save_video=False):
if self.subset == 'test':
print('\033[93m[WARNING]:\n' \
'The groundtruths of GOT-10k\'s test set is withholded.\n' \
'You will have to submit your results to\n' \
'[http://got-10k.aitestunion.com/]' \
'\nto access the performance.\033[0m')
time.sleep(2)
print('Running tracker %s on GOT-10k...' % tracker.name)
self.dataset.return_meta = False
end_idx = self.end_idx
if end_idx is None:
end_idx = len(self.dataset)
for s in range(self.start_idx, end_idx):
img_files, anno = self.dataset[s]
seq_name = self.dataset.seq_names[s]
print('--Sequence %d/%d: %s' % (
s + 1, len(self.dataset), seq_name))
# run multiple repetitions for each sequence
for r in range(self.repetitions):
# check if the tracker is deterministic
if r > 0 and tracker.is_deterministic:
break
elif r == 3 and self._check_deterministic(
tracker.name, seq_name):
print(' Detected a deterministic tracker, ' +
'skipping remaining trials.')
break
print(' Repetition: %d' % (r + 1))
# skip if results exist
record_file = os.path.join(
self.result_dir, tracker.name, seq_name,
'%s_%03d.txt' % (seq_name, r + 1))
if os.path.exists(record_file):
print(' Found results, skipping', seq_name)
continue
if hasattr(tracker, 'set_video_name'):
tracker.set_video_name(seq_name)
# tracking loop
boxes, times = tracker.track(
img_files, anno[0, :], visualize=visualize)
if hasattr(tracker, 'set_video_name'):
tracker.set_video_name(None)
# record results
self._record(record_file, boxes, times)
# save videos
if save_video:
video_dir = os.path.join(os.path.dirname(os.path.dirname(self.result_dir)),
'videos', 'GOT-10k', tracker.name)
video_file = os.path.join(video_dir, '%s.avi' % seq_name)
if not os.path.isdir(video_dir):
os.makedirs(video_dir)
image = Image.open(img_files[0])
img_W, img_H = image.size
out_video = cv2.VideoWriter(video_file, cv2.VideoWriter_fourcc(*'MJPG'), 10, (img_W, img_H))
for ith, (img_file, pred) in enumerate(zip(img_files, boxes)):
image = Image.open(img_file)
if not image.mode == 'RGB':
image = image.convert('RGB')
img = np.array(image)[:, :, ::-1].copy()
pred = pred.astype(int)
cv2.rectangle(img, (pred[0], pred[1]), (pred[0] + pred[2], pred[1] + pred[3]), self.color['pred'], 2)
if ith < anno.shape[0]:
gt = anno[ith].astype(int)
cv2.rectangle(img, (gt[0], gt[1]), (gt[0] + gt[2], gt[1] + gt[3]), self.color['gt'], 2)
out_video.write(img)
out_video.release()
print(' Videos saved at', video_file)
def report(self, tracker_names, plot_curves=True):
assert isinstance(tracker_names, (list, tuple))
if self.subset == 'test':
pwd = os.getcwd()
# generate compressed submission file for each tracker
for tracker_name in tracker_names:
# compress all tracking results
result_dir = os.path.join(self.result_dir, tracker_name)
os.chdir(result_dir)
save_file = '../%s' % tracker_name
compress('.', save_file)
print('Records saved at', save_file + '.zip')
# print submission guides
print('\033[93mLogin and follow instructions on')
print('http://got-10k.aitestunion.com/submit_instructions')
print('to upload and evaluate your tracking results\033[0m')
# switch back to previous working directory
os.chdir(pwd)
return None
elif self.subset == 'val':
# meta information is useful when evaluation
self.dataset.return_meta = True
# assume tracker_names[0] is your tracker
report_dir = os.path.join(self.report_dir, tracker_names[0])
if not os.path.exists(report_dir):
os.makedirs(report_dir)
report_file = os.path.join(report_dir, 'performance.json')
# visible ratios of all sequences
seq_names = self.dataset.seq_names
covers = {s: self.dataset[s][2]['cover'][1:] for s in seq_names}
performance = {}
for name in tracker_names:
print('Evaluating', name)
ious = {}
times = {}
performance.update({name: {
'overall': {},
'seq_wise': {}}})
for s, (_, anno, meta) in enumerate(self.dataset):
seq_name = self.dataset.seq_names[s]
record_files = glob.glob(os.path.join(
self.result_dir, name, seq_name,
'%s_[0-9]*.txt' % seq_name))
if len(record_files) == 0:
raise Exception('Results for sequence %s not found.' % seq_name)
# read results of all repetitions
boxes = [np.loadtxt(f, delimiter=',') for f in record_files]
assert all([b.shape == anno.shape for b in boxes])
# calculate and stack all ious
bound = ast.literal_eval(meta['resolution'])
seq_ious = [rect_iou(b[1:], anno[1:], bound=bound) for b in boxes]
# only consider valid frames where targets are visible
seq_ious = [t[covers[seq_name] > 0] for t in seq_ious]
seq_ious = np.concatenate(seq_ious)
ious[seq_name] = seq_ious
# stack all tracking times
times[seq_name] = []
time_file = os.path.join(
self.result_dir, name, seq_name,
'%s_time.txt' % seq_name)
if os.path.exists(time_file):
seq_times = np.loadtxt(time_file, delimiter=',')
seq_times = seq_times[~np.isnan(seq_times)]
seq_times = seq_times[seq_times > 0]
if len(seq_times) > 0:
times[seq_name] = seq_times
# store sequence-wise performance
ao, sr, speed, _ = self._evaluate(seq_ious, seq_times)
performance[name]['seq_wise'].update({seq_name: {
'ao': ao,
'sr': sr,
'speed_fps': speed,
'length': len(anno) - 1}})
ious = np.concatenate(list(ious.values()))
times = np.concatenate(list(times.values()))
# store overall performance
ao, sr, speed, succ_curve = self._evaluate(ious, times)
performance[name].update({'overall': {
'ao': ao,
'sr': sr,
'speed_fps': speed,
'succ_curve': succ_curve.tolist()}})
# save performance
with open(report_file, 'w') as f:
json.dump(performance, f, indent=4)
# plot success curves
if plot_curves:
self.plot_curves([report_file], tracker_names)
return performance
def show(self, tracker_names, seq_names=None, play_speed=1):
if seq_names is None:
seq_names = self.dataset.seq_names
elif isinstance(seq_names, str):
seq_names = [seq_names]
assert isinstance(tracker_names, (list, tuple))
assert isinstance(seq_names, (list, tuple))
play_speed = int(round(play_speed))
assert play_speed > 0
self.dataset.return_meta = False
for s, seq_name in enumerate(seq_names):
print('[%d/%d] Showing results on %s...' % (
s + 1, len(seq_names), seq_name))
# load all tracking results
records = {}
for name in tracker_names:
record_file = os.path.join(
self.result_dir, name, seq_name,
'%s_001.txt' % seq_name)
records[name] = np.loadtxt(record_file, delimiter=',')
# loop over the sequence and display results
img_files, anno = self.dataset[seq_name]
for f, img_file in enumerate(img_files):
if not f % play_speed == 0:
continue
image = Image.open(img_file)
boxes = [anno[f]] + [
records[name][f] for name in tracker_names]
show_frame(image, boxes,
legends=['GroundTruth'] + tracker_names,
colors=['w', 'r', 'g', 'b', 'c', 'm', 'y',
'orange', 'purple', 'brown', 'pink'])
def _record(self, record_file, boxes, times):
# record bounding boxes
record_dir = os.path.dirname(record_file)
if not os.path.isdir(record_dir):
os.makedirs(record_dir)
np.savetxt(record_file, boxes, fmt='%.3f', delimiter=',')
while not os.path.exists(record_file):
print('warning: recording failed, retrying...')
np.savetxt(record_file, boxes, fmt='%.3f', delimiter=',')
print(' Results recorded at', record_file)
# record running times
time_file = record_file[:record_file.rfind('_')] + '_time.txt'
times = times[:, np.newaxis]
if os.path.exists(time_file):
exist_times = np.loadtxt(time_file, delimiter=',')
if exist_times.ndim == 1:
exist_times = exist_times[:, np.newaxis]
times = np.concatenate((exist_times, times), axis=1)
np.savetxt(time_file, times, fmt='%.8f', delimiter=',')
def _check_deterministic(self, tracker_name, seq_name):
record_dir = os.path.join(
self.result_dir, tracker_name, seq_name)
record_files = sorted(glob.glob(os.path.join(
record_dir, '%s_[0-9]*.txt' % seq_name)))
if len(record_files) < 3:
return False
records = []
for record_file in record_files:
with open(record_file, 'r') as f:
records.append(f.read())
return len(set(records)) == 1
def _evaluate(self, ious, times):
# AO, SR and tracking speed
ao = np.mean(ious)
sr = np.mean(ious > 0.5)
if len(times) > 0:
# times has to be an array of positive values
speed_fps = np.mean(1. / times)
else:
speed_fps = -1
# success curve
# thr_iou = np.linspace(0, 1, 101)
thr_iou = np.linspace(0, 1, self.nbins_iou)
bin_iou = np.greater(ious[:, None], thr_iou[None, :])
succ_curve = np.mean(bin_iou, axis=0)
return ao, sr, speed_fps, succ_curve
def plot_curves(self, report_files, tracker_names, extension='.png'):
assert isinstance(report_files, list), \
'Expected "report_files" to be a list, ' \
'but got %s instead' % type(report_files)
# assume tracker_names[0] is your tracker
report_dir = os.path.join(self.report_dir, tracker_names[0])
if not os.path.exists(report_dir):
os.makedirs(report_dir)
performance = {}
for report_file in report_files:
with open(report_file) as f:
performance.update(json.load(f))
succ_file = os.path.join(report_dir, 'success_plot'+extension)
key = 'overall'
# filter performance by tracker_names
performance = {k:v for k,v in performance.items() if k in tracker_names}
# sort trackers by AO
tracker_names = list(performance.keys())
aos = [t[key]['ao'] for t in performance.values()]
inds = np.argsort(aos)[::-1]
tracker_names = [tracker_names[i] for i in inds]
# markers
markers = ['-', '--', '-.']
markers = [c + m for m in markers for c in [''] * 10]
matplotlib.rcParams.update({'font.size': 19})
# plot success curves
thr_iou = np.linspace(0, 1, self.nbins_iou)
fig, ax = plt.subplots()
lines = []
legends = []
for i, name in enumerate(tracker_names):
line, = ax.plot(thr_iou,
performance[name][key]['succ_curve'],
markers[i % len(markers)],
linewidth=4,
zorder=performance[name][key]['ao'])
lines.append(line)
if name == "Siam R-CNN (ours)":
legends.append('$\\bf{Siam}$ $\\bf{R}$$\\bf{-}$$\\bf{CNN}$: [%.3f]' % performance[name][key]['ao'])
else:
legends.append('%s: [%.3f]' % (name, performance[name][key]['ao']))
matplotlib.rcParams.update({'font.size': 13.0})
legend = ax.legend(lines, legends, loc='lower left',
bbox_to_anchor=(0., 0.))
matplotlib.rcParams.update({'font.size': 19})
ax.set(xlabel='Overlap threshold',
ylabel='Success rate',
xlim=(0, 1), ylim=(0, 1),
title='Success plots on GOT-10k')
ax.set_title('Success plots on GOT-10k', fontweight='bold')
ax.xaxis.label.set_size(17)
ax.yaxis.label.set_size(17)
ax.grid(True)
fig.tight_layout()
# control ratio
# ax.set_aspect('equal', 'box')
print('Saving success plots to', succ_file)
fig.savefig(succ_file,
bbox_extra_artists=(legend,),
bbox_inches='tight',
dpi=300)
got10k-toolkit-master/got10k/experiments/lasot.py 0000664 0000000 0000000 00000031341 14336540625 0022315 0 ustar 00root root 0000000 0000000 from __future__ import absolute_import
import os
import json
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
from .otb import ExperimentOTB
from ..datasets import LaSOT
from ..utils.metrics import rect_iou, center_error, normalized_center_error
class ExperimentLaSOT(ExperimentOTB):
r"""Experiment pipeline and evaluation toolkit for LaSOT dataset.
Args:
root_dir (string): Root directory of LaSOT dataset.
subset (string, optional): Specify ``train`` or ``test``
subset of LaSOT. Default is ``test``.
return_meta (bool, optional): whether to fetch meta info
(occlusion or out-of-view). Default is ``False``.
result_dir (string, optional): Directory for storing tracking
results. Default is ``./results``.
report_dir (string, optional): Directory for storing performance
evaluation results. Default is ``./reports``.
"""
def __init__(self, root_dir, subset='test', return_meta=False,
result_dir='results', report_dir='reports', start_idx=0, end_idx=None):
# assert subset.upper() in ['TRAIN', 'TEST']
self.dataset = LaSOT(root_dir, subset, return_meta=return_meta)
self.result_dir = os.path.join(result_dir, "LaSOT")
self.report_dir = os.path.join(report_dir, "LaSOT")
# as nbins_iou increases, the success score
# converges to the average overlap (AO)
self.nbins_iou = 21
self.nbins_ce = 51
self.nbins_nce = 51
self.start_idx = start_idx
self.end_idx = end_idx
if self.end_idx is None:
self.end_idx = len(self.dataset)
def report(self, tracker_names):
assert isinstance(tracker_names, (list, tuple))
# assume tracker_names[0] is your tracker
report_dir = os.path.join(self.report_dir, tracker_names[0])
if not os.path.isdir(report_dir):
os.makedirs(report_dir)
report_file = os.path.join(report_dir, 'performance.json')
performance = {}
for name in tracker_names:
print('Evaluating', name)
seq_num = len(self.dataset)
succ_curve = np.zeros((seq_num, self.nbins_iou))
prec_curve = np.zeros((seq_num, self.nbins_ce))
norm_prec_curve = np.zeros((seq_num, self.nbins_nce))
speeds = np.zeros(seq_num)
performance.update({name: {
'overall': {},
'seq_wise': {}}})
for s, (_, anno) in enumerate(self.dataset):
seq_name = self.dataset.seq_names[s]
record_file = os.path.join(
self.result_dir, name, '%s.txt' % seq_name)
boxes = np.loadtxt(record_file, delimiter=',')
boxes[0] = anno[0]
if not (len(boxes) == len(anno)):
# from IPython import embed;embed()
print('warning: %s anno do not match boxes' % seq_name)
len_min = min(len(boxes), len(anno))
boxes = boxes[:len_min]
anno = anno[:len_min]
assert len(boxes) == len(anno)
# TODO: we need to filter out frames where the object is absent
ious, center_errors, norm_center_errors = self._calc_metrics(boxes, anno)
succ_curve[s], prec_curve[s], norm_prec_curve[s] = self._calc_curves(ious, center_errors,
norm_center_errors)
# calculate average tracking speed
time_file = os.path.join(
self.result_dir, name, 'times/%s_time.txt' % seq_name)
if os.path.isfile(time_file):
times = np.loadtxt(time_file)
times = times[times > 0]
if len(times) > 0:
speeds[s] = np.mean(1. / times)
# store sequence-wise performance
performance[name]['seq_wise'].update({seq_name: {
'success_curve': succ_curve[s].tolist(),
'precision_curve': prec_curve[s].tolist(),
'normalized_precision_curve': norm_prec_curve[s].tolist(),
'success_score': np.mean(succ_curve[s]),
'precision_score': prec_curve[s][20],
'normalized_precision_score': np.mean(norm_prec_curve[s]),
'success_rate': succ_curve[s][self.nbins_iou // 2],
'speed_fps': speeds[s] if speeds[s] > 0 else -1}})
succ_curve = np.mean(succ_curve, axis=0)
prec_curve = np.mean(prec_curve, axis=0)
norm_prec_curve = np.mean(norm_prec_curve, axis=0)
succ_score = np.mean(succ_curve)
prec_score = prec_curve[20]
#TODO: this might be wrong
#norm_prec_score = np.mean(norm_prec_curve)
norm_prec_score = norm_prec_curve[20]
succ_rate = succ_curve[self.nbins_iou // 2]
if np.count_nonzero(speeds) > 0:
avg_speed = np.sum(speeds) / np.count_nonzero(speeds)
else:
avg_speed = -1
# store overall performance
performance[name]['overall'].update({
'success_curve': succ_curve.tolist(),
'precision_curve': prec_curve.tolist(),
'normalized_precision_curve': norm_prec_curve.tolist(),
'success_score': succ_score,
'precision_score': prec_score,
'normalized_precision_score': norm_prec_score,
'success_rate': succ_rate,
'speed_fps': avg_speed})
# report the performance
with open(report_file, 'w') as f:
json.dump(performance, f, indent=4)
# plot precision and success curves
self.plot_curves(tracker_names)
return performance
def _calc_metrics(self, boxes, anno):
valid = ~np.any(np.isnan(anno), axis=1)
if len(valid) == 0:
print('Warning: no valid annotations')
return None, None, None
else:
ious = rect_iou(boxes[valid, :], anno[valid, :])
center_errors = center_error(
boxes[valid, :], anno[valid, :])
norm_center_errors = normalized_center_error(
boxes[valid, :], anno[valid, :])
return ious, center_errors, norm_center_errors
def _calc_curves(self, ious, center_errors, norm_center_errors):
ious = np.asarray(ious, float)[:, np.newaxis]
center_errors = np.asarray(center_errors, float)[:, np.newaxis]
norm_center_errors = np.asarray(norm_center_errors, float)[:, np.newaxis]
thr_iou = np.linspace(0, 1, self.nbins_iou)[np.newaxis, :]
thr_ce = np.arange(0, self.nbins_ce)[np.newaxis, :]
thr_nce = np.linspace(0, 0.5, self.nbins_nce)[np.newaxis, :]
bin_iou = np.greater(ious, thr_iou)
bin_ce = np.less_equal(center_errors, thr_ce)
bin_nce = np.less_equal(norm_center_errors, thr_nce)
succ_curve = np.mean(bin_iou, axis=0)
prec_curve = np.mean(bin_ce, axis=0)
norm_prec_curve = np.mean(bin_nce, axis=0)
return succ_curve, prec_curve, norm_prec_curve
def plot_curves(self, tracker_names, extension='.png'):
# assume tracker_names[0] is your tracker
report_dir = os.path.join(self.report_dir, tracker_names[0])
assert os.path.exists(report_dir), \
'No reports found. Run "report" first' \
'before plotting curves.'
report_file = os.path.join(report_dir, 'performance.json')
assert os.path.exists(report_file), \
'No reports found. Run "report" first' \
'before plotting curves.'
# load pre-computed performance
with open(report_file) as f:
performance = json.load(f)
succ_file = os.path.join(report_dir, 'success_plots'+extension)
prec_file = os.path.join(report_dir, 'precision_plots'+extension)
norm_prec_file = os.path.join(report_dir, 'norm_precision_plots'+extension)
key = 'overall'
# markers
markers = ['-', '--', '-.']
markers = [c + m for m in markers for c in [''] * 10]
# filter performance by tracker_names
performance = {k:v for k,v in performance.items() if k in tracker_names}
# sort trackers by success score
tracker_names = list(performance.keys())
succ = [t[key]['success_score'] for t in performance.values()]
inds = np.argsort(succ)[::-1]
tracker_names = [tracker_names[i] for i in inds]
# plot success curves
thr_iou = np.linspace(0, 1, self.nbins_iou)
fig, ax = plt.subplots()
lines = []
legends = []
for i, name in enumerate(tracker_names):
line, = ax.plot(thr_iou,
performance[name][key]['success_curve'],
markers[i % len(markers)])
lines.append(line)
legends.append('%s: [%.3f]' % (name, performance[name][key]['success_score']))
matplotlib.rcParams.update({'font.size': 7.4})
# legend = ax.legend(lines, legends, loc='center left', bbox_to_anchor=(1, 0.5))
legend = ax.legend(lines, legends, loc='lower left', bbox_to_anchor=(0., 0.))
matplotlib.rcParams.update({'font.size': 9})
ax.set(xlabel='Overlap threshold',
ylabel='Success rate',
xlim=(0, 1), ylim=(0, 1),
title='Success plots on LaSOT')
ax.grid(True)
fig.tight_layout()
# control ratio
# ax.set_aspect('equal', 'box')
print('Saving success plots to', succ_file)
fig.savefig(succ_file,
bbox_extra_artists=(legend,),
bbox_inches='tight',
dpi=300)
# sort trackers by precision score
tracker_names = list(performance.keys())
prec = [t[key]['precision_score'] for t in performance.values()]
inds = np.argsort(prec)[::-1]
tracker_names = [tracker_names[i] for i in inds]
# plot precision curves
thr_ce = np.arange(0, self.nbins_ce)
fig, ax = plt.subplots()
lines = []
legends = []
for i, name in enumerate(tracker_names):
line, = ax.plot(thr_ce,
performance[name][key]['precision_curve'],
markers[i % len(markers)])
lines.append(line)
legends.append('%s: [%.3f]' % (name, performance[name][key]['precision_score']))
matplotlib.rcParams.update({'font.size': 7.4})
# legend = ax.legend(lines, legends, loc='center left', bbox_to_anchor=(1, 0.5))
legend = ax.legend(lines, legends, loc='lower right', bbox_to_anchor=(1., 0.))
matplotlib.rcParams.update({'font.size': 9})
ax.set(xlabel='Location error threshold',
ylabel='Precision',
xlim=(0, thr_ce.max()), ylim=(0, 1),
title='Precision plots on LaSOT')
ax.grid(True)
fig.tight_layout()
# control ratio
# ax.set_aspect('equal', 'box')
print('Saving precision plots to', prec_file)
fig.savefig(prec_file, dpi=300)
# added by user
# sort trackers by normalized precision score
tracker_names = list(performance.keys())
prec = [t[key]['normalized_precision_score'] for t in performance.values()]
inds = np.argsort(prec)[::-1]
tracker_names = [tracker_names[i] for i in inds]
# plot normalized precision curves
thr_nce = np.arange(0, self.nbins_nce)
fig, ax = plt.subplots()
lines = []
legends = []
for i, name in enumerate(tracker_names):
line, = ax.plot(thr_nce,
performance[name][key]['normalized_precision_curve'],
markers[i % len(markers)])
lines.append(line)
legends.append('%s: [%.3f]' % (name, performance[name][key]['normalized_precision_score']))
matplotlib.rcParams.update({'font.size': 7.4})
# legend = ax.legend(lines, legends, loc='center left', bbox_to_anchor=(1, 0.5))
legend = ax.legend(lines, legends, loc='lower right', bbox_to_anchor=(1., 0.))
matplotlib.rcParams.update({'font.size': 9})
ax.set(xlabel='Normalized location error threshold',
ylabel='Normalized precision',
xlim=(0, thr_ce.max()), ylim=(0, 1),
title='Normalized precision plots on LaSOT')
ax.grid(True)
fig.tight_layout()
# control ratio
# ax.set_aspect('equal', 'box')
print('Saving normalized precision plots to', norm_prec_file)
fig.savefig(norm_prec_file, dpi=300)
got10k-toolkit-master/got10k/experiments/nfs.py 0000664 0000000 0000000 00000002160 14336540625 0021756 0 ustar 00root root 0000000 0000000 from __future__ import absolute_import
import os
from .otb import ExperimentOTB
from ..datasets import NfS
class ExperimentNfS(ExperimentOTB):
r"""Experiment pipeline and evaluation toolkit for NfS dataset.
Args:
root_dir (string): Root directory of NfS dataset.
result_dir (string, optional): Directory for storing tracking
results. Default is ``./results``.
report_dir (string, optional): Directory for storing performance
evaluation results. Default is ``./reports``.
"""
def __init__(self, root_dir, fps=240,
result_dir='results', report_dir='reports', start_idx=0, end_idx=None):
self.dataset = NfS(root_dir, fps)
self.result_dir = os.path.join(result_dir, 'NfS/%d' % fps)
self.report_dir = os.path.join(report_dir, 'NfS/%d' % fps)
# as nbins_iou increases, the success score
# converges to the average overlap (AO)
self.nbins_iou = 21
self.nbins_ce = 51
self.start_idx = start_idx
self.end_idx = end_idx
self.use_confs = False
self.dump_as_csv = False
got10k-toolkit-master/got10k/experiments/otb.py 0000664 0000000 0000000 00000036125 14336540625 0021764 0 ustar 00root root 0000000 0000000 from __future__ import absolute_import, division, print_function
import os
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
import json
from PIL import Image
from ..datasets import OTB
from ..utils.metrics import rect_iou, center_error
from ..utils.viz import show_frame
class ExperimentOTB(object):
r"""Experiment pipeline and evaluation toolkit for OTB dataset.
Args:
root_dir (string): Root directory of OTB dataset.
version (integer or string): Specify the benchmark version, specify as one of
``2013``, ``2015``, ``tb50`` and ``tb100``. Default is ``2015``.
result_dir (string, optional): Directory for storing tracking
results. Default is ``./results``.
report_dir (string, optional): Directory for storing performance
evaluation results. Default is ``./reports``.
"""
def __init__(self, root_dir, version=2015,
result_dir='results', report_dir='reports', start_idx=0, end_idx=None):
super(ExperimentOTB, self).__init__()
# Kristyna Janku: Changed download to false to work with already downloaded dataset
self.dataset = OTB(root_dir, version, download=False)
self.result_dir = os.path.join(result_dir, 'OTB' + str(version))
self.report_dir = os.path.join(report_dir, 'OTB' + str(version))
# as nbins_iou increases, the success score
# converges to the average overlap (AO)
self.nbins_iou = 21
self.nbins_ce = 51
self.start_idx = start_idx
self.end_idx = end_idx
self.use_confs = False
self.dump_as_csv = False
def run(self, tracker, visualize=False):
print('Running tracker %s on %s...' % (
tracker.name, type(self.dataset).__name__))
end_idx = self.end_idx
if end_idx is None:
end_idx = len(self.dataset)
for s in range(self.start_idx, end_idx):
img_files, anno = self.dataset[s]
seq_name = self.dataset.seq_names[s]
print('--Sequence %d/%d: %s' % (s + 1, len(self.dataset), seq_name))
# skip if results exist
record_file = os.path.join(
self.result_dir, tracker.name, '%s.txt' % seq_name)
if hasattr(self, "dump_as_csv") and self.dump_as_csv:
record_file = record_file.replace(".txt", ".csv").replace("___", "_")
if os.path.exists(record_file):
print(' Found results, skipping', seq_name)
continue
if hasattr(tracker, 'set_video_name'):
tracker.set_video_name(seq_name)
# tracking loop
if hasattr(self, "use_confs") and self.use_confs:
boxes, times, confs = tracker.track(
img_files, anno[0, :], visualize=visualize, use_confidences=True)
if hasattr(self, "has_groundtruth") and not self.has_groundtruth:
pass
else:
assert len(boxes) == len(anno) == len(confs)
else:
boxes, times = tracker.track(
img_files, anno[0, :], visualize=visualize)
if hasattr(self, "has_groundtruth") and not self.has_groundtruth:
pass
else:
assert len(boxes) == len(anno)
if hasattr(tracker, 'set_video_name'):
tracker.set_video_name(None)
# record results
if hasattr(self, 'use_confs') and self.use_confs:
self._record(record_file, boxes, times, confs)
else:
self._record(record_file, boxes, times)
def report(self, tracker_names, plot_curves=True):
assert isinstance(tracker_names, (list, tuple))
# assume tracker_names[0] is your tracker
report_dir = os.path.join(self.report_dir, tracker_names[0])
if not os.path.isdir(report_dir):
os.makedirs(report_dir)
report_file = os.path.join(report_dir, 'performance.json')
performance = {}
for name in tracker_names:
print('Evaluating', name)
seq_num = len(self.dataset)
succ_curve = np.zeros((seq_num, self.nbins_iou))
prec_curve = np.zeros((seq_num, self.nbins_ce))
speeds = np.zeros(seq_num)
performance.update({name: {
'overall': {},
'seq_wise': {}}})
for s, (_, anno) in enumerate(self.dataset):
seq_name = self.dataset.seq_names[s]
record_file = os.path.join(
self.result_dir, name, '%s.txt' % seq_name)
boxes = np.loadtxt(record_file, delimiter=',')
boxes[0] = anno[0]
if not (len(boxes) == len(anno)):
print('warning: %s anno do not match boxes' % seq_name)
len_min = min(len(boxes),len(anno))
boxes = boxes[:len_min]
anno = anno[:len_min]
assert len(boxes) == len(anno)
ious, center_errors = self._calc_metrics(boxes, anno)
succ_curve[s], prec_curve[s] = self._calc_curves(ious, center_errors)
# calculate average tracking speed
time_file = os.path.join(
self.result_dir, name, 'times/%s_time.txt' % seq_name)
if os.path.isfile(time_file):
times = np.loadtxt(time_file)
times = times[times > 0]
if len(times) > 0:
speeds[s] = np.mean(1. / times)
# store sequence-wise performance
performance[name]['seq_wise'].update({seq_name: {
'success_curve': succ_curve[s].tolist(),
'precision_curve': prec_curve[s].tolist(),
'success_score': np.mean(succ_curve[s]),
'precision_score': prec_curve[s][20],
'success_rate': succ_curve[s][self.nbins_iou // 2],
'speed_fps': speeds[s] if speeds[s] > 0 else -1}})
succ_curve = np.mean(succ_curve, axis=0)
prec_curve = np.mean(prec_curve, axis=0)
succ_score = np.mean(succ_curve)
prec_score = prec_curve[20]
succ_rate = succ_curve[self.nbins_iou // 2]
if np.count_nonzero(speeds) > 0:
avg_speed = np.sum(speeds) / np.count_nonzero(speeds)
else:
avg_speed = -1
# store overall performance
performance[name]['overall'].update({
'success_curve': succ_curve.tolist(),
'precision_curve': prec_curve.tolist(),
'success_score': succ_score,
'precision_score': prec_score,
'success_rate': succ_rate,
'speed_fps': avg_speed})
# report the performance
with open(report_file, 'w') as f:
json.dump(performance, f, indent=4)
# plot precision and success curves
if plot_curves:
self.plot_curves(tracker_names)
return performance
def show(self, tracker_names, seq_names=None, play_speed=1):
if seq_names is None:
seq_names = self.dataset.seq_names
elif isinstance(seq_names, str):
seq_names = [seq_names]
assert isinstance(tracker_names, (list, tuple))
assert isinstance(seq_names, (list, tuple))
play_speed = int(round(play_speed))
assert play_speed > 0
for s, seq_name in enumerate(seq_names):
print('[%d/%d] Showing results on %s...' % (
s + 1, len(seq_names), seq_name))
# load all tracking results
records = {}
for name in tracker_names:
record_file = os.path.join(
self.result_dir, name, '%s.txt' % seq_name)
records[name] = np.loadtxt(record_file, delimiter=',')
# loop over the sequence and display results
img_files, anno = self.dataset[seq_name]
for f, img_file in enumerate(img_files):
if not f % play_speed == 0:
continue
image = Image.open(img_file)
boxes = [anno[f]] + [
records[name][f] for name in tracker_names]
show_frame(image, boxes,
legends=['GroundTruth'] + tracker_names,
colors=['w', 'r', 'g', 'b', 'c', 'm', 'y',
'orange', 'purple', 'brown', 'pink'])
def _record(self, record_file, boxes, times, confs=None):
# record bounding boxes
record_dir = os.path.dirname(record_file)
if not os.path.isdir(record_dir):
os.makedirs(record_dir)
np.savetxt(record_file, boxes, fmt='%.3f', delimiter=',')
while not os.path.exists(record_file):
print('warning: recording failed, retrying...')
np.savetxt(record_file, boxes, fmt='%.3f', delimiter=',')
print(' Results recorded at', record_file)
# record confidences (if available)
if confs is not None:
# convert confs to string
lines = ['%.4f' % c for c in confs]
lines[0] = ''
conf_file = record_file.replace(".txt", "_confidence.value")
with open(conf_file, 'w') as f:
f.write(str.join('\n', lines))
# record running times
time_dir = os.path.join(record_dir, 'times')
if not os.path.isdir(time_dir):
os.makedirs(time_dir)
time_file = os.path.join(time_dir, os.path.basename(
record_file).replace('.txt', '_time.txt'))
np.savetxt(time_file, times, fmt='%.8f')
def _calc_metrics(self, boxes, anno):
# can be modified by children classes
ious = rect_iou(boxes, anno)
center_errors = center_error(boxes, anno)
return ious, center_errors
def _calc_curves(self, ious, center_errors):
ious = np.asarray(ious, float)[:, np.newaxis]
center_errors = np.asarray(center_errors, float)[:, np.newaxis]
thr_iou = np.linspace(0, 1, self.nbins_iou)[np.newaxis, :]
thr_ce = np.arange(0, self.nbins_ce)[np.newaxis, :]
bin_iou = np.greater(ious, thr_iou)
bin_ce = np.less_equal(center_errors, thr_ce)
succ_curve = np.mean(bin_iou, axis=0)
prec_curve = np.mean(bin_ce, axis=0)
return succ_curve, prec_curve
def plot_curves(self, tracker_names):
# assume tracker_names[0] is your tracker
report_dir = os.path.join(self.report_dir, tracker_names[0])
assert os.path.exists(report_dir), \
'No reports found. Run "report" first' \
'before plotting curves.'
report_file = os.path.join(report_dir, 'performance.json')
assert os.path.exists(report_file), \
'No reports found. Run "report" first' \
'before plotting curves.'
# load pre-computed performance
with open(report_file) as f:
performance = json.load(f)
succ_file = os.path.join(report_dir, 'success_plots.pdf')
prec_file = os.path.join(report_dir, 'precision_plots.pdf')
key = 'overall'
# markers
markers = ['-', '--', '-.']
markers = [c + m for m in markers for c in [''] * 10]
# sort trackers by success score
tracker_names = list(performance.keys())
succ = [t[key]['success_score'] for t in performance.values()]
inds = np.argsort(succ)[::-1]
tracker_names = [tracker_names[i] for i in inds]
# activate latex text rendering
#matplotlib.rc('text', usetex=True)
matplotlib.rcParams.update({'font.size': 19.0})
# plot success curves
thr_iou = np.linspace(0, 1, self.nbins_iou)
fig, ax = plt.subplots()
lines = []
legends = []
for i, name in enumerate(tracker_names):
line, = ax.plot(thr_iou,
performance[name][key]['success_curve'],
markers[i % len(markers)],
linewidth=4,
zorder=performance[name][key]['success_score'])
lines.append(line)
if name == "Siam R-CNN":
legends.append('$\\bf{Siam}$ $\\bf{R}$$\\bf{-}$$\\bf{CNN}$: [%.3f]' % performance[name][key]['success_score'])
else:
legends.append('%s: [%.3f]' % (name, performance[name][key]['success_score']))
matplotlib.rcParams.update({'font.size': 15.0})
legend = ax.legend(lines, legends, loc='lower left')
matplotlib.rcParams.update({'font.size': 19.0})
#matplotlib.rcParams.update({'font.size': 11})
ax.set(xlabel='Overlap threshold',
ylabel='Success rate',
xlim=(0, 1), ylim=(0, 1),
title='Success plots of OPE')
ax.set_title('Success plots of OPE', fontweight='bold')
ax.xaxis.label.set_size(17)
ax.yaxis.label.set_size(17)
ax.grid(True)
fig.tight_layout()
print('Saving success plots to', succ_file)
fig.savefig(succ_file,
bbox_extra_artists=(legend,),
bbox_inches='tight',
dpi=300)
# sort trackers by precision score
tracker_names = list(performance.keys())
prec = [t[key]['precision_score'] for t in performance.values()]
# modified by Paul: instead use sorting from before so that colors of both plots are consistent
#inds = np.argsort(prec)[::-1]
tracker_names = [tracker_names[i] for i in inds]
# plot precision curves
thr_ce = np.arange(0, self.nbins_ce)
fig, ax = plt.subplots()
lines = []
legends = []
for i, name in enumerate(tracker_names):
line, = ax.plot(thr_ce,
performance[name][key]['precision_curve'],
markers[i % len(markers)],
linewidth=4,
zorder=performance[name][key]['success_score'])
lines.append(line)
if name == "Siam R-CNN":
legends.append('$\\bf{Siam}$ $\\bf{R}$$\\bf{-}$$\\bf{CNN}$: [%.3f]' % performance[name][key]['precision_score'])
else:
legends.append('%s: [%.3f]' % (name, performance[name][key]['precision_score']))
matplotlib.rcParams.update({'font.size': 15.0})
legend = ax.legend(lines, legends, loc='lower right')
matplotlib.rcParams.update({'font.size': 19.0})
#matplotlib.rcParams.update({'font.size': 11})
ax.set(xlabel='Location error threshold',
ylabel='Precision',
xlim=(0, thr_ce.max()), ylim=(0, 1),
title='Precision plots of OPE')
ax.set_title('Precision plots of OPE', fontweight='bold')
ax.xaxis.label.set_size(17)
ax.yaxis.label.set_size(17)
ax.grid(True)
fig.tight_layout()
print('Saving precision plots to', prec_file)
fig.savefig(prec_file, dpi=300)
got10k-toolkit-master/got10k/experiments/oxuva_experiment.py 0000664 0000000 0000000 00000002074 14336540625 0024576 0 ustar 00root root 0000000 0000000 from .otb import ExperimentOTB
from ..datasets import oxuva_dataset
#import oxuva
import os
class ExperimentOxuva(ExperimentOTB):
def __init__(self, root_dir, subset='test', result_dir='results', report_dir='reports', start_idx=0, end_idx=None):
self.dataset = oxuva_dataset.Oxuva(root_dir, subset)
self.result_dir = os.path.join(result_dir, 'Oxuva' + str(subset))
self.report_dir = os.path.join(report_dir, 'Oxuva' + str(subset))
# as nbins_iou increases, the success score
# converges to the average overlap (AO)
self.nbins_iou = 21
self.nbins_ce = 51
self.start_idx = start_idx
self.end_idx = end_idx
#if end_idx is None:
# self.end_idx = 167
self.use_confs = True
#self.dump_as_csv = True
# new approach: dump as default and then postproc with script to get it to right format
self.dump_as_csv = False
self.has_groundtruth = False
#def _record(self, record_file, boxes, times, confs):
#TODO
# oxuva.dump_predictions_csv()
got10k-toolkit-master/got10k/experiments/tcolor128.py 0000664 0000000 0000000 00000002172 14336540625 0022730 0 ustar 00root root 0000000 0000000 from __future__ import absolute_import
import os
from .otb import ExperimentOTB
from ..datasets import TColor128
class ExperimentTColor128(ExperimentOTB):
r"""Experiment pipeline and evaluation toolkit for TColor128 dataset.
Args:
root_dir (string): Root directory of TColor128 dataset.
result_dir (string, optional): Directory for storing tracking
results. Default is ``./results``.
report_dir (string, optional): Directory for storing performance
evaluation results. Default is ``./reports``.
"""
def __init__(self, root_dir,
result_dir='results', report_dir='reports', start_idx=0, end_idx=None):
self.dataset = TColor128(root_dir)
self.result_dir = os.path.join(result_dir, 'TColor128')
self.report_dir = os.path.join(report_dir, 'TColor128')
# as nbins_iou increases, the success score
# converges to the average overlap (AO)
self.nbins_iou = 21
self.nbins_ce = 51
self.start_idx = start_idx
self.end_idx = end_idx
self.use_confs = False
self.dump_as_csv = False
got10k-toolkit-master/got10k/experiments/trackingnet.py 0000664 0000000 0000000 00000004010 14336540625 0023475 0 ustar 00root root 0000000 0000000 from __future__ import absolute_import
import os
import numpy as np
from .otb import ExperimentOTB
from ..datasets import TrackingNet
from ..utils.metrics import rect_iou, center_error
class ExperimentTrackingNet(ExperimentOTB):
r"""Experiment pipeline and evaluation toolkit for TrackingNet dataset.
Only the TEST subset part implemented.
Args:
root_dir (string): Root directory of LaSOT dataset.
subset (string, optional): Specify ``train`` or ``test``
subset of LaSOT. Default is ``test``.
return_meta (bool, optional): whether to fetch meta info
(occlusion or out-of-view). Default is ``False``.
result_dir (string, optional): Directory for storing tracking
results. Default is ``./results``.
report_dir (string, optional): Directory for storing performance
evaluation results. Default is ``./reports``.
"""
def __init__(self, root_dir, subset='test', return_meta=False,
result_dir='results', report_dir='reports', start_idx=0, end_idx=None):
assert subset.upper() in ['TRAIN', 'TEST']
self.dataset = TrackingNet(root_dir, subset, return_meta=return_meta)
self.result_dir = os.path.join(result_dir, "TrackingNet")
self.report_dir = os.path.join(report_dir, "TrackingNet")
# as nbins_iou increases, the success score
# converges to the average overlap (AO)
self.nbins_iou = 21
self.nbins_ce = 51
self.start_idx = start_idx
self.end_idx = end_idx
self.use_confs = False
self.has_groundtruth = False
# def _calc_metrics(self, boxes, anno):
# valid = ~np.any(np.isnan(anno), axis=1)
# if len(valid) == 0:
# print('Warning: no valid annotations')
# return None, None
# else:
# ious = rect_iou(boxes[valid, :], anno[valid, :])
# center_errors = center_error(
# boxes[valid, :], anno[valid, :])
# return ious, center_errors
got10k-toolkit-master/got10k/experiments/uav123.py 0000664 0000000 0000000 00000003273 14336540625 0022217 0 ustar 00root root 0000000 0000000 from __future__ import absolute_import
import os
import numpy as np
from .otb import ExperimentOTB
from ..datasets import UAV123
from ..utils.metrics import rect_iou, center_error
class ExperimentUAV123(ExperimentOTB):
r"""Experiment pipeline and evaluation toolkit for UAV123 dataset.
Args:
root_dir (string): Root directory of UAV123 dataset.
result_dir (string, optional): Directory for storing tracking
results. Default is ``./results``.
report_dir (string, optional): Directory for storing performance
evaluation results. Default is ``./reports``.
"""
def __init__(self, root_dir, version='UAV123',
result_dir='results', report_dir='reports', start_idx=0, end_idx=None):
assert version.upper() in ['UAV123', 'UAV20L']
self.dataset = UAV123(root_dir, version)
self.result_dir = os.path.join(result_dir, version.upper())
self.report_dir = os.path.join(report_dir, version.upper())
# as nbins_iou increases, the success score
# converges to the average overlap (AO)
self.nbins_iou = 21
self.nbins_ce = 51
self.start_idx = start_idx
self.end_idx = end_idx
if end_idx is None:
self.end_idx = 123
self.use_confs = False
def _calc_metrics(self, boxes, anno):
valid = ~np.any(np.isnan(anno), axis=1)
if len(valid) == 0:
print('Warning: no valid annotations')
return None, None
else:
ious = rect_iou(boxes[valid, :], anno[valid, :])
center_errors = center_error(
boxes[valid, :], anno[valid, :])
return ious, center_errors
got10k-toolkit-master/got10k/experiments/vot.py 0000664 0000000 0000000 00000057660 14336540625 0022017 0 ustar 00root root 0000000 0000000 from __future__ import absolute_import, division, print_function
import time
import numpy as np
import os
import glob
import warnings
import json
from PIL import Image
from ..datasets import VOT
from ..utils.metrics import poly_iou
from ..utils.viz import show_frame
class ExperimentVOT(object):
r"""Experiment pipeline and evaluation toolkit for VOT dataset.
Notes:
- The tracking results of three types of experiments ``supervised``
``unsupervised`` and ``realtime`` are compatible with the official
VOT toolkit `.
- TODO: The evaluation function for VOT tracking results is still
under development.
Args:
root_dir (string): Root directory of VOT dataset where sequence
folders exist.
version (integer, optional): Specify the VOT dataset version. Specify as
one of 2013~2018. Default is 2017.
list_file (string, optional): If provided, only run experiments over
sequences specified by the file.
read_image (boolean, optional): If True, return the read PIL image in
each frame. Otherwise only return the image path. Default is True.
experiments (string or tuple): Specify the type(s) of experiments to run.
Default is a tuple (``supervised``, ``unsupervised``, ``realtime``).
result_dir (string, optional): Directory for storing tracking
results. Default is ``./results``.
report_dir (string, optional): Directory for storing performance
evaluation results. Default is ``./reports``.
"""
def __init__(self, root_dir, version=2017,
read_image=True, list_file=None,
experiments=('supervised', 'unsupervised', 'realtime'),
result_dir='results', report_dir='reports', start_idx=0, end_idx=None):
super(ExperimentVOT, self).__init__()
if isinstance(experiments, str):
experiments = (experiments,)
assert all([e in ['supervised', 'unsupervised', 'realtime']
for e in experiments])
self.dataset = VOT(
root_dir, version, anno_type='default',
download=True, return_meta=True, list_file=list_file)
self.experiments = experiments
if version == 'LT2018':
version = '-' + version
self.long_term = True
else:
self.long_term = False
self.read_image = read_image
self.result_dir = os.path.join(result_dir, 'VOT' + str(version))
self.report_dir = os.path.join(report_dir, 'VOT' + str(version))
self.skip_initialize = 5
self.burnin = 10
self.repetitions = 15
self.sensitive = 100
self.nbins_eao = 1500
self.tags = ['camera_motion', 'illum_change', 'occlusion',
'size_change', 'motion_change', 'empty']
self.start_idx = start_idx
self.end_idx = end_idx
if self.end_idx is None:
self.end_idx = len(self.dataset)
def run(self, tracker, visualize=False):
print('Running tracker %s on %s...' % (
tracker.name, type(self.dataset).__name__))
# run all specified experiments
if 'supervised' in self.experiments:
self.run_supervised(tracker, visualize)
if 'unsupervised' in self.experiments:
self.run_unsupervised(tracker, visualize)
if 'realtime' in self.experiments:
self.run_realtime(tracker, visualize)
def run_supervised(self, tracker, visualize=False):
print('Running supervised experiment...')
# loop over the complete dataset
end_idx = self.end_idx
if end_idx is None:
end_idx = len(self.dataset)
for s in range(self.start_idx, end_idx):
img_files, anno, _ = self.dataset[s]
seq_name = self.dataset.seq_names[s]
print('--Sequence %d/%d: %s' % (s + 1, len(self.dataset), seq_name))
# rectangular bounding boxes
anno_rects = anno.copy()
if anno_rects.shape[1] == 8:
anno_rects = self.dataset._corner2rect(anno_rects)
# run multiple repetitions for each sequence
for r in range(self.repetitions):
# check if the tracker is deterministic
if r > 0 and tracker.is_deterministic:
break
elif r == 3 and self._check_deterministic('baseline', tracker.name, seq_name):
print(' Detected a deterministic tracker, ' +
'skipping remaining trials.')
break
print(' Repetition: %d' % (r + 1))
# skip if results exist
record_file = os.path.join(
self.result_dir, tracker.name, 'baseline', seq_name,
'%s_%03d.txt' % (seq_name, r + 1))
if os.path.exists(record_file):
print(' Found results, skipping', seq_name)
continue
# state variables
boxes = []
times = []
failure = False
next_start = -1
# tracking loop
for f, img_file in enumerate(img_files):
image = Image.open(img_file)
if self.read_image:
frame = image
else:
frame = img_file
start_time = time.time()
if f == 0:
# initial frame
tracker.init(frame, anno_rects[0])
boxes.append([1])
elif failure:
# during failure frames
if f == next_start:
failure = False
tracker.init(frame, anno_rects[f])
boxes.append([1])
else:
start_time = np.NaN
boxes.append([0])
else:
# during success frames
box = tracker.update(frame)
iou = poly_iou(anno[f], box, bound=image.size)
if iou <= 0.0:
# tracking failure
failure = True
next_start = f + self.skip_initialize
boxes.append([2])
else:
# tracking succeed
boxes.append(box)
# store elapsed time
times.append(time.time() - start_time)
# visualize if required
if visualize:
if len(boxes[-1]) == 4:
show_frame(image, boxes[-1])
else:
show_frame(image)
# record results
if self.long_term:
self._record(record_file, boxes, times, confs)
else:
self._record(record_file, boxes, times)
def run_unsupervised(self, tracker, visualize=False):
print('Running unsupervised experiment...')
# loop over the complete dataset
end_idx = self.end_idx
if end_idx is None:
end_idx = len(self.dataset)
for s in range(self.start_idx, end_idx):
img_files, anno, _ = self.dataset[s]
seq_name = self.dataset.seq_names[s]
print('--Sequence %d/%d: %s' % (s + 1, len(self.dataset), seq_name))
# skip if results exist
record_file = os.path.join(
self.result_dir, tracker.name, 'unsupervised', seq_name,
'%s_001.txt' % seq_name)
if os.path.exists(record_file):
print(' Found results, skipping', seq_name)
continue
if hasattr(tracker, 'set_video_name'):
tracker.set_video_name(seq_name)
# rectangular bounding boxes
anno_rects = anno.copy()
if anno_rects.shape[1] == 8:
anno_rects = self.dataset._corner2rect(anno_rects)
# tracking loop
if self.long_term:
boxes, times, confs = tracker.track(
img_files, anno_rects[0], visualize=visualize, use_confidences=True)
assert len(boxes) == len(anno) == len(confs)
else:
boxes, times = tracker.track(
img_files, anno_rects[0], visualize=visualize)
assert len(boxes) == len(anno)
if hasattr(tracker, 'set_video_name'):
tracker.set_video_name(None)
# re-formatting
boxes = list(boxes)
boxes[0] = [1]
# record results
if self.long_term:
self._record(record_file, boxes, times, confs)
else:
self._record(record_file, boxes, times)
def run_realtime(self, tracker, visualize=False):
print('Running real-time experiment...')
# loop over the complete dataset
for s, (img_files, anno, _) in enumerate(self.dataset):
seq_name = self.dataset.seq_names[s]
print('--Sequence %d/%d: %s' % (s + 1, len(self.dataset), seq_name))
# skip if results exist
record_file = os.path.join(
self.result_dir, tracker.name, 'realtime', seq_name,
'%s_001.txt' % seq_name)
if os.path.exists(record_file):
print(' Found results, skipping', seq_name)
continue
# rectangular bounding boxes
anno_rects = anno.copy()
if anno_rects.shape[1] == 8:
anno_rects = self.dataset._corner2rect(anno_rects)
# state variables
boxes = []
times = []
next_start = 0
failure = False
failed_frame = -1
total_time = 0.0
grace = 3 - 1
offset = 0
# tracking loop
for f, img_file in enumerate(img_files):
image = Image.open(img_file)
if self.read_image:
frame = image
else:
frame = img_file
start_time = time.time()
if f == next_start:
# during initial frames
tracker.init(frame, anno_rects[f])
boxes.append([1])
# reset state variables
failure = False
failed_frame = -1
total_time = 0.0
grace = 3 - 1
offset = f
elif not failure:
# during success frames
# calculate current frame
if grace > 0:
total_time += 1000.0 / 25
grace -= 1
else:
total_time += max(1000.0 / 25, last_time * 1000.0)
current = offset + int(np.round(np.floor(total_time * 25) / 1000.0))
# delayed/tracked bounding box
if f < current:
box = boxes[-1]
elif f == current:
box = tracker.update(frame)
iou = poly_iou(anno[f], box, bound=image.size)
if iou <= 0.0:
# tracking failure
failure = True
failed_frame = f
next_start = current + self.skip_initialize
boxes.append([2])
else:
# tracking succeed
boxes.append(box)
else:
# during failure frames
if f < current:
# skipping frame due to slow speed
boxes.append([0])
start_time = np.NaN
elif f == current:
# current frame
box = tracker.update(frame)
iou = poly_iou(anno[f], box, bound=image.size)
if iou <= 0.0:
# tracking failure
boxes.append([2])
boxes[failed_frame] = [0]
times[failed_frame] = np.NaN
else:
# tracking succeed
boxes.append(box)
elif f < next_start:
# skipping frame due to failure
boxes.append([0])
start_time = np.NaN
# store elapsed time
last_time = time.time() - start_time
times.append(last_time)
# visualize if required
if visualize:
if len(boxes[-1]) == 4:
show_frame(image, boxes[-1])
else:
show_frame(image)
# record results
self._record(record_file, boxes, times)
def report(self, tracker_names):
assert isinstance(tracker_names, (list, tuple))
# function for loading results
def read_record(filename):
with open(filename) as f:
record = f.read().strip().split('\n')
record = [[float(t) for t in line.split(',')]
for line in record]
return record
# assume tracker_names[0] is your tracker
report_dir = os.path.join(self.report_dir, tracker_names[0])
if not os.path.exists(report_dir):
os.makedirs(report_dir)
report_file = os.path.join(report_dir, 'performance.json')
performance = {}
for name in tracker_names:
print('Evaluating', name)
ious = {}
ious_full = {}
failures = {}
times = {}
masks = {} # frame masks for attribute tags
for s, (img_files, anno, meta) in enumerate(self.dataset):
seq_name = self.dataset.seq_names[s]
# initialize frames scores
frame_num = len(img_files)
ious[seq_name] = np.full(
(self.repetitions, frame_num), np.nan, dtype=float)
ious_full[seq_name] = np.full(
(self.repetitions, frame_num), np.nan, dtype=float)
failures[seq_name] = np.full(
(self.repetitions, frame_num), np.nan, dtype=float)
times[seq_name] = np.full(
(self.repetitions, frame_num), np.nan, dtype=float)
# read results of all repetitions
record_files = sorted(glob.glob(os.path.join(
self.result_dir, name, 'baseline', seq_name,
'%s_[0-9]*.txt' % seq_name)))
boxes = [read_record(f) for f in record_files]
assert all([len(b) == len(anno) for b in boxes])
# calculate frame ious with burnin
bound = Image.open(img_files[0]).size
seq_ious = [self._calc_iou(b, anno, bound, burnin=True)
for b in boxes]
ious[seq_name][:len(seq_ious), :] = seq_ious
# calculate frame ious without burnin
seq_ious_full = [self._calc_iou(b, anno, bound)
for b in boxes]
ious_full[seq_name][:len(seq_ious_full), :] = seq_ious_full
# calculate frame failures
seq_failures = [
[len(b) == 1 and b[0] == 2 for b in boxes_per_rep]
for boxes_per_rep in boxes]
failures[seq_name][:len(seq_failures), :] = seq_failures
# collect frame runtimes
time_file = os.path.join(
self.result_dir, name, 'baseline', seq_name,
'%s_time.txt' % seq_name)
if os.path.exists(time_file):
seq_times = np.loadtxt(time_file, delimiter=',').T
times[seq_name][:len(seq_times), :] = seq_times
# collect attribute masks
tag_num = len(self.tags)
masks[seq_name] = np.zeros((tag_num, frame_num), bool)
for i, tag in enumerate(self.tags):
if tag in meta:
masks[seq_name][i, :] = meta[tag]
# frames with no tags
if 'empty' in self.tags:
tag_frames = np.array([
v for k, v in meta.items()
if not 'practical' in k], dtype=bool)
ind = self.tags.index('empty')
masks[seq_name][ind, :] = \
~np.logical_or.reduce(tag_frames, axis=0)
# concatenate frames
seq_names = self.dataset.seq_names
masks = np.concatenate(
[masks[s] for s in seq_names], axis=1)
ious = np.concatenate(
[ious[s] for s in seq_names], axis=1)
failures = np.concatenate(
[failures[s] for s in seq_names], axis=1)
with warnings.catch_warnings():
# average over repetitions
warnings.simplefilter('ignore', category=RuntimeWarning)
ious = np.nanmean(ious, axis=0)
failures = np.nanmean(failures, axis=0)
# calculate average overlaps and failures for each tag
tag_ious = np.array(
[np.nanmean(ious[m]) for m in masks])
tag_failures = np.array(
[np.nansum(failures[m]) for m in masks])
tag_frames = masks.sum(axis=1)
# remove nan values
tag_ious[np.isnan(tag_ious)] = 0.0
tag_weights = tag_frames / tag_frames.sum()
# calculate weighted accuracy and robustness
accuracy = np.sum(tag_ious * tag_weights)
robustness = np.sum(tag_failures * tag_weights)
# calculate tracking speed
times = np.concatenate([
t.reshape(-1) for t in times.values()])
# remove invalid values
times = times[~np.isnan(times)]
times = times[times > 0]
if len(times) > 0:
speed = np.mean(1. / times)
else:
speed = -1
performance.update({name: {
'accuracy': accuracy,
'robustness': robustness,
'speed_fps': speed}})
# save performance
with open(report_file, 'w') as f:
json.dump(performance, f, indent=4)
print('Performance saved at', report_file)
return performance
def show(self, tracker_names, seq_names=None, play_speed=1,
experiment='supervised'):
if seq_names is None:
seq_names = self.dataset.seq_names
elif isinstance(seq_names, str):
seq_names = [seq_names]
assert isinstance(tracker_names, (list, tuple))
assert isinstance(seq_names, (list, tuple))
assert experiment in ['supervised', 'unsupervised', 'realtime']
play_speed = int(round(play_speed))
assert play_speed > 0
# "supervised" experiment results are stored in "baseline" folder
if experiment == 'supervised':
experiment = 'baseline'
# function for loading results
def read_record(filename):
with open(filename) as f:
record = f.read().strip().split('\n')
record = [[float(t) for t in line.split(',')]
for line in record]
for i, r in enumerate(record):
if len(r) == 4:
record[i] = np.array(r)
elif len(r) == 8:
r = np.array(r)[np.newaxis, :]
r = self.dataset._corner2rect(r)
record[i] = r[0]
else:
record[i] = np.zeros(4)
return record
for s, seq_name in enumerate(seq_names):
print('[%d/%d] Showing results on %s...' % (
s + 1, len(seq_names), seq_name))
# load all tracking results
records = {}
for name in tracker_names:
record_file = os.path.join(
self.result_dir, name, experiment, seq_name,
'%s_001.txt' % seq_name)
records[name] = read_record(record_file)
# loop over the sequence and display results
img_files, anno, _ = self.dataset[seq_name]
if anno.shape[1] == 8:
anno = self.dataset._corner2rect(anno)
for f, img_file in enumerate(img_files):
if not f % play_speed == 0:
continue
image = Image.open(img_file)
boxes = [anno[f]] + [
records[name][f] for name in tracker_names]
show_frame(image, boxes,
legends=['GroundTruth'] + tracker_names,
colors=['w', 'r', 'g', 'b', 'c', 'm', 'y',
'orange', 'purple', 'brown', 'pink'])
def _record(self, record_file, boxes, times, confs=None):
# convert boxes to string
lines = []
for box in boxes:
if len(box) == 1:
lines.append('%d' % box[0])
else:
lines.append(str.join(',', ['%.4f' % t for t in box]))
# record bounding boxes
record_dir = os.path.dirname(record_file)
if not os.path.isdir(record_dir):
os.makedirs(record_dir)
with open(record_file, 'w') as f:
f.write(str.join('\n', lines))
print(' Results recorded at', record_file)
# record confidences (if available)
if confs is not None:
# convert confs to string
lines = ['%.4f' % c for c in confs]
lines[0] = ''
conf_file = record_file.replace(".txt", "_confidence.value")
with open(conf_file, 'w') as f:
f.write(str.join('\n', lines))
# convert times to string
lines = ['%.4f' % t for t in times]
lines = [t.replace('nan', 'NaN') for t in lines]
# record running times
time_file = record_file[:record_file.rfind('_')] + '_time.txt'
if os.path.exists(time_file):
with open(time_file) as f:
exist_lines = f.read().strip().split('\n')
lines = [t + ',' + s for t, s in zip(exist_lines, lines)]
with open(time_file, 'w') as f:
f.write(str.join('\n', lines))
def _check_deterministic(self, exp, tracker_name, seq_name):
record_dir = os.path.join(
self.result_dir, tracker_name, exp, seq_name)
record_files = sorted(glob.glob(os.path.join(
record_dir, '%s_[0-9]*.txt' % seq_name)))
if len(record_files) < 3:
return False
records = []
for record_file in record_files:
with open(record_file, 'r') as f:
records.append(f.read())
return len(set(records)) == 1
def _calc_iou(self, boxes, anno, bound, burnin=False):
# skip initialization frames
if burnin:
boxes = boxes.copy()
init_inds = [i for i, box in enumerate(boxes)
if box == [1.0]]
for ind in init_inds:
boxes[ind:ind + self.burnin] = [[0]] * self.burnin
# calculate polygon ious
ious = np.array([poly_iou(np.array(a), b, bound)
if len(a) > 1 else np.NaN
for a, b in zip(boxes, anno)])
return ious
got10k-toolkit-master/got10k/experiments/youtubevos.py 0000664 0000000 0000000 00000001146 14336540625 0023417 0 ustar 00root root 0000000 0000000 import os
from got10k.datasets.youtubevos import YouTubeVOS
from got10k.experiments.davis import ExperimentDAVISLike
class ExperimentYouTubeVOS(ExperimentDAVISLike):
def __init__(self, root_dir, result_dir='results', report_dir='reports', start_idx=0, end_idx=None,
version="val"):
self.dataset = YouTubeVOS(root_dir, version)
self.result_dir = os.path.join(result_dir, 'YouTubeVOS_' + str(version))
self.report_dir = os.path.join(report_dir, 'YouTubeVOS_' + str(version))
self.start_idx = start_idx
self.end_idx = end_idx
super().__init__()
got10k-toolkit-master/got10k/trackers/ 0000775 0000000 0000000 00000000000 14336540625 0020072 5 ustar 00root root 0000000 0000000 got10k-toolkit-master/got10k/trackers/__init__.py 0000664 0000000 0000000 00000003072 14336540625 0022205 0 ustar 00root root 0000000 0000000 from __future__ import absolute_import
import numpy as np
import time
from PIL import Image
from ..utils.viz import show_frame
class Tracker(object):
def __init__(self, name, is_deterministic=False):
self.name = name
self.is_deterministic = is_deterministic
def init(self, image, box):
raise NotImplementedError()
def update(self, image):
raise NotImplementedError()
def track(self, img_files, box, visualize=False, use_confidences=False):
frame_num = len(img_files)
boxes = np.zeros((frame_num, 4))
boxes[0] = box
if use_confidences:
confs = np.zeros((frame_num,))
times = np.zeros(frame_num)
for f, img_file in enumerate(img_files):
image = Image.open(img_file)
if not image.mode == 'RGB':
image = image.convert('RGB')
start_time = time.time()
if f == 0:
self.init(image, box)
else:
if use_confidences:
b, c = self.update(image, use_confidences=True)
boxes[f, :] = b
confs[f] = c
else:
boxes[f, :] = self.update(image)
times[f] = time.time() - start_time
print(f, len(img_files), time.time() - start_time)
if visualize:
show_frame(image, boxes[f, :])
if use_confidences:
return boxes, times, confs
else:
return boxes, times
from .identity_tracker import IdentityTracker
got10k-toolkit-master/got10k/trackers/identity_tracker.py 0000664 0000000 0000000 00000000535 14336540625 0024013 0 ustar 00root root 0000000 0000000 from __future__ import absolute_import
from . import Tracker
class IdentityTracker(Tracker):
def __init__(self):
super(IdentityTracker, self).__init__(
name='IdentityTracker',
is_deterministic=True)
def init(self, image, box):
self.box = box
def update(self, image):
return self.box
got10k-toolkit-master/got10k/utils/ 0000775 0000000 0000000 00000000000 14336540625 0017414 5 ustar 00root root 0000000 0000000 got10k-toolkit-master/got10k/utils/__init__.py 0000664 0000000 0000000 00000000000 14336540625 0021513 0 ustar 00root root 0000000 0000000 got10k-toolkit-master/got10k/utils/ioutils.py 0000664 0000000 0000000 00000002272 14336540625 0021461 0 ustar 00root root 0000000 0000000 from __future__ import absolute_import, division
import wget
import os
import shutil
import zipfile
import sys
def download(url, filename):
r"""Download file from the internet.
Args:
url (string): URL of the internet file.
filename (string): Path to store the downloaded file.
"""
return wget.download(url, out=filename)
def extract(filename, extract_dir):
r"""Extract zip file.
Args:
filename (string): Path of the zip file.
extract_dir (string): Directory to store the extracted results.
"""
if os.path.splitext(filename)[1] == '.zip':
if not os.path.isdir(extract_dir):
os.makedirs(extract_dir)
with zipfile.ZipFile(filename) as z:
z.extractall(extract_dir)
else:
raise Exception('Unsupport extension {} of the compressed file {}.'.format(
os.path.splitext(filename)[1]), filename)
def compress(dirname, save_file):
"""Compress a folder to a zip file.
Arguments:
dirname {string} -- Directory of all files to be compressed.
save_file {string} -- Path to store the zip file.
"""
shutil.make_archive(save_file, 'zip', dirname)
got10k-toolkit-master/got10k/utils/metrics.py 0000664 0000000 0000000 00000013646 14336540625 0021446 0 ustar 00root root 0000000 0000000 from __future__ import absolute_import, division
import numpy as np
from shapely.geometry import box, Polygon
def center_error(rects1, rects2):
r"""Center error.
Args:
rects1 (numpy.ndarray): An N x 4 numpy array, each line represent a rectangle
(left, top, width, height).
rects2 (numpy.ndarray): An N x 4 numpy array, each line represent a rectangle
(left, top, width, height).
"""
centers1 = rects1[..., :2] + (rects1[..., 2:] - 1) / 2
centers2 = rects2[..., :2] + (rects2[..., 2:] - 1) / 2
errors = np.sqrt(np.sum(np.power(centers1 - centers2, 2), axis=-1))
return errors
def normalized_center_error(rects1, rects2):
r"""Center error normalized by the size of ground truth.
Args:
rects1 (numpy.ndarray): prediction box. An N x 4 numpy array, each line represent a rectangle
(left, top, width, height).
rects2 (numpy.ndarray): ground truth box. An N x 4 numpy array, each line represent a rectangle
(left, top, width, height).
"""
centers1 = rects1[..., :2] + (rects1[..., 2:] - 1) / 2
centers2 = rects2[..., :2] + (rects2[..., 2:] - 1) / 2
errors = np.sqrt(np.sum(np.power((centers1 - centers2)/np.maximum(np.array([[1., 1.]]), rects2[:, 2:]), 2),
axis=-1))
# TODO: in the official toolkit they filter out stuff where the size of ground truth is 0
# let's try it...
# not sure about it...
#valid_mask = (rects2 > 0).all(axis=1)
#errors = errors[valid_mask]
return errors
def rect_iou(rects1, rects2, bound=None):
r"""Intersection over union.
Args:
rects1 (numpy.ndarray): An N x 4 numpy array, each line represent a rectangle
(left, top, width, height).
rects2 (numpy.ndarray): An N x 4 numpy array, each line represent a rectangle
(left, top, width, height).
bound (numpy.ndarray): A 4 dimensional array, denotes the bound
(min_left, min_top, max_width, max_height) for ``rects1`` and ``rects2``.
"""
assert rects1.shape == rects2.shape
if bound is not None:
# bounded rects1
rects1[:, 0] = np.clip(rects1[:, 0], 0, bound[0])
rects1[:, 1] = np.clip(rects1[:, 1], 0, bound[1])
rects1[:, 2] = np.clip(rects1[:, 2], 0, bound[0] - rects1[:, 0])
rects1[:, 3] = np.clip(rects1[:, 3], 0, bound[1] - rects1[:, 1])
# bounded rects2
rects2[:, 0] = np.clip(rects2[:, 0], 0, bound[0])
rects2[:, 1] = np.clip(rects2[:, 1], 0, bound[1])
rects2[:, 2] = np.clip(rects2[:, 2], 0, bound[0] - rects2[:, 0])
rects2[:, 3] = np.clip(rects2[:, 3], 0, bound[1] - rects2[:, 1])
rects_inter = _intersection(rects1, rects2)
areas_inter = np.prod(rects_inter[..., 2:], axis=-1)
areas1 = np.prod(rects1[..., 2:], axis=-1)
areas2 = np.prod(rects2[..., 2:], axis=-1)
areas_union = areas1 + areas2 - areas_inter
eps = np.finfo(float).eps
ious = areas_inter / (areas_union + eps)
ious = np.clip(ious, 0.0, 1.0)
return ious
def _intersection(rects1, rects2):
r"""Rectangle intersection.
Args:
rects1 (numpy.ndarray): An N x 4 numpy array, each line represent a rectangle
(left, top, width, height).
rects2 (numpy.ndarray): An N x 4 numpy array, each line represent a rectangle
(left, top, width, height).
"""
assert rects1.shape == rects2.shape
x1 = np.maximum(rects1[..., 0], rects2[..., 0])
y1 = np.maximum(rects1[..., 1], rects2[..., 1])
x2 = np.minimum(rects1[..., 0] + rects1[..., 2],
rects2[..., 0] + rects2[..., 2])
y2 = np.minimum(rects1[..., 1] + rects1[..., 3],
rects2[..., 1] + rects2[..., 3])
w = np.maximum(x2 - x1, 0)
h = np.maximum(y2 - y1, 0)
return np.stack([x1, y1, w, h]).T
def poly_iou(polys1, polys2, bound=None):
r"""Intersection over union of polygons.
Args:
polys1 (numpy.ndarray): An N x 4 numpy array, each line represent a rectangle
(left, top, width, height); or an N x 8 numpy array, each line represent
the coordinates (x1, y1, x2, y2, x3, y3, x4, y4) of 4 corners.
polys2 (numpy.ndarray): An N x 4 numpy array, each line represent a rectangle
(left, top, width, height); or an N x 8 numpy array, each line represent
the coordinates (x1, y1, x2, y2, x3, y3, x4, y4) of 4 corners.
bound (numpy.ndarray, optional): A 2 dimensional array, denotes the image bound
(width, height) for ``rects1`` and ``rects2``.
"""
assert polys1.ndim in [1, 2]
if polys1.ndim == 1:
polys1 = np.array([polys1])
polys2 = np.array([polys2])
assert len(polys1) == len(polys2)
polys1 = _to_polygon(polys1)
polys2 = _to_polygon(polys2)
if bound is not None:
bound = box(0, 0, bound[0], bound[1])
polys1 = [p.intersection(bound) for p in polys1]
polys2 = [p.intersection(bound) for p in polys2]
eps = np.finfo(float).eps
ious = []
for poly1, poly2 in zip(polys1, polys2):
area_inter = poly1.intersection(poly2).area
area_union = poly1.union(poly2).area
ious.append(area_inter / (area_union + eps))
ious = np.clip(ious, 0.0, 1.0)
return ious
def _to_polygon(polys):
r"""Convert 4 or 8 dimensional array to Polygons
Args:
polys (numpy.ndarray): An N x 4 numpy array, each line represent a rectangle
(left, top, width, height); or an N x 8 numpy array, each line represent
the coordinates (x1, y1, x2, y2, x3, y3, x4, y4) of 4 corners.
"""
def to_polygon(x):
assert len(x) in [4, 8]
if len(x) == 4:
return box(x[0], x[1], x[0] + x[2], x[1] + x[3])
elif len(x) == 8:
return Polygon([(x[2 * i], x[2 * i + 1]) for i in range(4)])
if polys.ndim == 1:
return to_polygon(polys)
else:
return [to_polygon(t) for t in polys]
got10k-toolkit-master/got10k/utils/viz.py 0000664 0000000 0000000 00000005205 14336540625 0020600 0 ustar 00root root 0000000 0000000 from __future__ import absolute_import
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.patches as patches
import matplotlib.colors as mcolors
from PIL import Image
fig_dict = {}
patch_dict = {}
def show_frame(image, boxes=None, fig_n=1, pause=0.001,
linewidth=3, cmap=None, colors=None, legends=None):
r"""Visualize an image w/o drawing rectangle(s).
Args:
image (numpy.ndarray or PIL.Image): Image to show.
boxes (numpy.array or a list of numpy.ndarray, optional): A 4 dimensional array
specifying rectangle [left, top, width, height] to draw, or a list of arrays
representing multiple rectangles. Default is ``None``.
fig_n (integer, optional): Figure ID. Default is 1.
pause (float, optional): Time delay for the plot. Default is 0.001 second.
linewidth (int, optional): Thickness for drawing the rectangle. Default is 3 pixels.
cmap (string): Color map. Default is None.
color (tuple): Color of drawed rectanlge. Default is None.
"""
if isinstance(image, np.ndarray):
image = Image.fromarray(image[..., ::-1])
if not fig_n in fig_dict or \
fig_dict[fig_n].get_size() != image.size[::-1]:
fig = plt.figure(fig_n)
plt.axis('off')
fig.tight_layout()
fig_dict[fig_n] = plt.imshow(image, cmap=cmap)
else:
fig_dict[fig_n].set_data(image)
if boxes is not None:
if not isinstance(boxes, (list, tuple)):
boxes = [boxes]
if colors is None:
colors = ['r', 'g', 'b', 'c', 'm', 'y'] + \
list(mcolors.CSS4_COLORS.keys())
elif isinstance(colors, str):
colors = [colors]
if not fig_n in patch_dict:
patch_dict[fig_n] = []
for i, box in enumerate(boxes):
patch_dict[fig_n].append(patches.Rectangle(
(box[0], box[1]), box[2], box[3], linewidth=linewidth,
edgecolor=colors[i % len(colors)], facecolor='none',
alpha=0.7 if len(boxes) > 1 else 1.0))
for patch in patch_dict[fig_n]:
fig_dict[fig_n].axes.add_patch(patch)
else:
for patch, box in zip(patch_dict[fig_n], boxes):
patch.set_xy((box[0], box[1]))
patch.set_width(box[2])
patch.set_height(box[3])
if legends is not None:
fig_dict[fig_n].axes.legend(
patch_dict[fig_n], legends, loc=1,
prop={'size': 8}, fancybox=True, framealpha=0.5)
plt.pause(pause)
plt.draw()
got10k-toolkit-master/requirements.txt 0000664 0000000 0000000 00000000230 14336540625 0020426 0 ustar 00root root 0000000 0000000 cycler==0.10.0
kiwisolver==1.0.1
matplotlib==3.0.2
numpy==1.15.4
Pillow==5.3.0
pyparsing==2.3.0
python-dateutil==2.7.5
Shapely==1.6.4.post2
six==1.11.0
got10k-toolkit-master/resources/ 0000775 0000000 0000000 00000000000 14336540625 0017161 5 ustar 00root root 0000000 0000000 got10k-toolkit-master/resources/sample_batch_run.jpg 0000664 0000000 0000000 00000613552 14336540625 0023205 0 ustar 00root root 0000000 0000000 JFIF Exif MM * J R( i Z !http://ns.adobe.com/xap/1.0/