ビデオアノテーションツールVATICのインストール

ビデオアノテーションツール[VATIC](https://github.com/cvondrick/vatic)のインストールメモ。

VATICについては[DERiVEの紹介記事](http://derivecv.tumblr.com/post/72304469378)で解説されていますが、こんな感じでフレーム単位でビデオアノテーションをするものです。

[![ビデオが開けなかった場合に表示されるテキスト](http://img.youtube.com/vi/ljI5pAowACc/0.jpg)](https://youtu.be/ljI5pAowACc)

## 環境
- ubuntu 16.04 LTS
- Apache 2.4.18
- Python 2.7

## 前準備
VATICのREADME.mdのままでは動かなかったので、[この辺のpdf](http://cs-people.bu.edu/sameki/blog2.pdf
)を参考にして依存ライブラリをインストールする。

```bash:terminal
sudo apt-get update
sudo apt autoremove
sudo apt-get install python-setuptools
sudo apt-get install git
sudo apt-get install build-essential
sudo apt-get install autoconf libtool pkg-config python-opengl python-imaging python-pyrex python-pyside.qtopengl idle-python2.7 qt4-dev-tools qt4-designer libqtgui4 libqtcore4 libqt4-xml libqt4-test libqt4-script libqt4-network libqt4-dbus python-qt4 python-qt4-gl libgle3 python-dev
sudo apt-get -y install apache2
sudo apt-get install libapache2-mod-wsgi
sudo a2enmod wsgi #WSGI有効化
sudo service apache2 restart
sudo apt-get install python-mysqldb
sudo apt-get install mysql-server
sudo easy_install munkres
sudo apt-get install python-pip
pip install --upgrade pip
sudo pip2 install --upgrade parsedatetime
sudo apt-get install libjpeg-dev
pip install -I pillow
sudo ln -s /usr/lib/x86 64-linux-gnu/libjpeg.so /usr/lib
pip install -I pillow
sudo pip install cython==0.20
```

## インストール

### VATIC tool本体

```bash:terminal
mkdir ~/vatic-tool
cd ~/vatic-tool
wget http://mit.edu/vondrick/vatic/vatic-install.sh
chmod +x vatic-install.sh
sh vatic-install.sh
cd vatic
```

### HTTPサーバ設定

Apache設定ファイル（000-default.conf）を編集。
VATICのREADME.mdはApache2.2系なので、結構変えた。

```bash:terminal
sudo vi /etc/apache2/sites-enabled/000-default.conf
```

```apache:000-default.conf
WSGIDaemonProcess www-data python-eggs=/tmp/.python-eggs
WSGIProcessGroup www-data

<VirtualHost *:80>
    ServerName vatic.domain.edu
    DocumentRoot /home/USER/vatic-tool/vatic/public

    WSGIScriptAlias /server /home/USER/vatic-tool/vatic/server.py
    CustomLog /var/log/apache2/access.log combined
    <Directory "/home/USER/vatic-tool/vatic/public">
        Options Indexes FollowSymlinks
        AllowOverride All
        Require all granted
    </Directory>
    <Directory "/home/USER/vatic-tool/vatic">
        <Files server.py>
            Require all granted
        </Files>
    </Directory>
</VirtualHost>
```

headers.loadをコピーして、Apacheを再起動

```bash:terminal
sudo cp /etc/apache2/mods-available/headers.load /etc/apache2/mods-enabled
sudo apache2ctl graceful
```

### SQLサーバ設定

MYSQL設定。VATIC用のDBを作っておく。

```bash:terminal
mysql -u root -p
mysql> create database vatic;
```

### VATIC設定

config.py設定

```bash:terminal
cd ~/vatic-tool/vatic
cp config.py-example config.py
vi config.py
```

```python:config.py
signature   = "" # AWS secret access key
accesskey   = "" # AWS access key ID
sandbox     = True # if true, put on workersandbox.mturk.com
localhost   = "http://localhost/" # your local host
database    = "mysql://root:PASSWORD@localhost/vatic"
geolocation = "" # api key for ipinfodb.com
maxobjects = 25;

# probably no need to mess below this line
import multiprocessing
processes = multiprocessing.cpu_count()

import os.path
import sys
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
```

- セットアップ
 
```bash:terminal
chmod 777 server.py
turkic setup --database
turkic setup --database --reset
turkic setup --public-symlink
```

## 動作確認
VATICツールが見えるようになっているかを確認。
[localhost](http://localhost/)にアクセスすると"Welcome to vatic"が表示されるはず
![welcome_to_vatic.png](https://qiita-image-store.s3.amazonaws.com/0/16986/2ca57b5b-841b-4717-ec3b-0124b4946d69.png "welcome_to_vatic.png")


VATICツールの状態を確認。AWSを使わない場合（オフラインモード）は以下でOK。
 
```bash:terminal
$ turkic status --verify
Configuration:
  Sandbox:     True
  Database:    mysql://root:PASSWORD@localhost/vatic
  Localhost:   http://localhost/

Testing access to Amazon Mechanical Turk... ERROR! Signature or access key missing
Testing access to database server... OK
Testing access to web server... OK
```


## アノテーションタスク開始

以下事例でアノテーションタスクを作成。
- Vimeo からDLしてきた素材[^1]（input_video.mp4） をアノテーション
[^1]: [Vimeo Creative Commons / Public Domain Dedication](https://vimeo.com/creativecommons) を利用
- identifierは"TESTTASK"
- 解像度は640x360に変更
- フレーム長は5000
- AWSを使わないオフラインモード
- アノテーション属性は"Human Car Building"の3種類

(1) mp4を静止画に分割

```bash:terminal
$ turkic extract ~/dat/input_video.mp4 ~/dat/input_video/ --width 640 --height 360
```

(2) 分割した静止画を読み込み

```bash:terminal
$ turkic load TESTTASK ~/dat/input_video/ Human Car Building --offline --length 5000
Checking integrity...
Searching for last frame...
Found 6116 frames.
Binding labels and attributes...
Creating symbolic link...
Creating segments...
Video loaded and ready for publication.
```

(3) タスク発行

```bash:terminal
$ turkic publish --offline
```

(4) アノテーション用のURLにアクセス

```bash:terminal
$ turkic find --id TESTTASK
http://localhost/?id=46&hitId=offline
http://localhost/?id=47&hitId=offline
```

上記サイトにアクセスすると静止画読み込みが始まる
![load_video.png](https://qiita-image-store.s3.amazonaws.com/0/16986/697f0012-3b7e-e21c-885e-7b8d3ed6e02a.png "load_video.png")


(5) アノテーション
New Objectで新規オブジェクトを追加、フレーム補間を活用しながら仕上げる
![annotation.png](https://qiita-image-store.s3.amazonaws.com/0/16986/48d2389d-3285-c042-b996-efccef9b9077.png "annotation.png")


(6) アノテーション結果をダンプ

```bash:terminal
turkic dump TESTTASK -o ~/dat/input_video/output.txt
Dumping video TESTTASK
```

```text:output.txt
0 334 189 387 235 0 1 0 0 "Car"
 :
1 465 187 482 229 0 1 0 0 "Human"
 :
3 256 6 300 68 0 1 0 0 "Building"
```

各カラムの意味は以下の通り。

> 1   Track ID. All rows with the same ID belong to the same path.
> 2   xmin. The top left x-coordinate of the bounding box.
> 3   ymin. The top left y-coordinate of the bounding box.
> 4   xmax. The bottom right x-coordinate of the bounding box.
> 5   ymax. The bottom right y-coordinate of the bounding box.
> 6   frame. The frame that this annotation represents.
> 7   lost. If 1, the annotation is outside of the view screen.
> 8   occluded. If 1, the annotation is occluded.
> 9   generated. If 1, the annotation was automatically interpolated.
> 10  label. The label for this annotation, enclosed in quotation marks.
> 11+ attributes. Each column after this is an attribute.

## トラブルシューティング


**Q.** Web interfaceにアクセスすると"You don't have permission to access / on this server."と表示される
**A.** Apache2.4系は仕様が変わったため、VATICのREADME.md（Apache2.2）のままでは動かない。`/etc/apache2/sites-enabled/000-default.conf`に以下の記述を追加する。
 
```apache:000-default.conf
<Directory "/path/to/vatic/public">
  Require all granted
</Directory>
```

**Q.** Web interfaceにアクセスすると"ServerError"と表示される
**A.** `/etc/apache2/sites-enabled/000-default.conf`に以下の記述を追加する。[関連FAQ](https://github.com/cvondrick/vatic/issues/24)。

```apache:000-default.conf
WSGIScriptAlias /server /path/to/vatic/server.py
```

**Q.** /var/www/.python-eggsにアクセス出来ないと言われる
**A.** コンソールで以下実行。[関連FAQ](https://gijutsutecho.wordpress.com/2015/08/24/vatic%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%AE%E3%82%B3%E3%83%84/)。

```shell-session:terminal
sudo mkdir /var/www/.python-eggs
sudo chown www-data:www-data /var/www/.python-eggs
sudo chmod -R 777 /var/www/.python-eggs
sudo chown www-data:www-data /var/www/.python-eggs
```

**Q.** Web interfaceにどうやってアクセスする?
**A.** `turkic publish`　した際に表示されるアドレスにアクセスする

**Q.** `turkic setup --public-symlink`とすると、`Could not create symlink!`と言われる
**A.** 二回目の実行以降はシンボリックリンクを作成できない。確認のためには`/path/to/vatic/public/turkic`以下のリンクを削除してから実行すれば以下のように表示される。

```shell-session:terminal
Created symblink /usr/local/lib/python2.7/dist-packages/turkic-0.2.5-py2.7.egg/turkic/public to /path/to/vatic/public/turkic
```
    

**Q.** http://localhost/?id=1&hitId=offline にアクセスできるがDownloading the video... 0%でとまる

**A.** `/var/log/apache2/error.log` を確認。自分の場合は以下のエラーが出ており、ディレクトリのアクセス権の問題だった。`turkic extract`でフレームを書き出す先をuser権限のディレクトにすることで解決。

```shell-session:error.log
[Sat Mar 04 16:40:48.626938 2017] [core:error] [pid 3857:tid 140653468055296] [client 127.0.0.1:56708] AH00037: Symbolic link not allowed or link target not accessible: /path/to/vatic/public/frames/identifier, referer: http://localhost/?id=1&hitId=offline
```

## 参考サイト
+ [VATIC : カリフォルニア大Irvine校によるフリーの動画アノテーションツール](http://derivecv.tumblr.com/post/72304469378)
+ [How to Set up VATIC(Video Annotation Tool from Irvine, California)? (pdf)](http://cs-people.bu.edu/sameki/blog2.pdf
)
+ [Vaticのインストールのコツ](https://gijutsutecho.wordpress.com/2015/08/24/vatic%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%AE%E3%82%B3%E3%83%84/)