Annotationツール比較

# Annotationツール
SSDやYOLOなど種々の物体検出のアルゴリズムがありますが、それらを自分の関心のある問題に適用しようと思うと、問題に合わせた教師データにより学習する必要があります。そして、そのためには教師データを用意する必要があるわけですが、それを行うAnnotationツールはというと、
[List of manual image annotation tools - Wikipedia](https://en.wikipedia.org/wiki/List_of_manual_image_annotation_tools)
たくさんあります。どれがいいのだろう、、と思い、いくつか実際に試してみました。

まず、それぞれのツールのgithubレポジトリで、スターの数、コミット数、最新コミット日時等を見て、以下をピックアップしました。

1. [tzutalin/labelImg: LabelImg is a graphical image annotation tool and label object bounding boxes in images](https://github.com/tzutalin/labelImg)
    * ★ 3825, Watch 208, Fork 1438 (as of 2018/7/4)
    * 292 commits, last commit on 2018/6/15.
2. [Labelbox/Labelbox: The most versatile data labeling platform for training expert AI.](https://github.com/Labelbox/Labelbox)
    * ★ 461, Watch 25, Fork 73 (as of 2018/7/4)
    * 571 commits, last commit on 2018/6/28.
3. [Microsoft/VoTT: Visual Object Tagging Tool: An electron app for building end to end Object Detection Models from Images and Videos.](https://github.com/Microsoft/VoTT/)
    * ★ 527, Watch 46, Fork 122 (as of 2018/7/4)
    * 410 commits, last commit on 2018/5/17.
4. [annotorious/annotorious: Image Annotation for the Web - Annotorious Core Library](https://github.com/annotorious/annotorious)
    * ★ 471, Watch 48, Fork 127 (as of 2018/7/4)
    * 589 commits, last commit on 2018/5/14.
5.  [Visual Geometry Group / via · GitLab](https://gitlab.com/vgg/via/)
    * ★ 29 (as of 2018/7/4)
    * 478 commits, last commit on 2018/6/15.
6. [virajmavani/semi-auto-image-annotation-tool: Anno-Mage: A Semi Automatic Image Annotation Tool which helps you in annotating images by suggesting you annotations for 80 object classes using a pre-trained model](https://github.com/virajmavani/semi-auto-image-annotation-tool) (上記のリストにはないけど、見かけて気になったので)
    * ★ 166, Watch 9, Fork 29 (as of 2018/7/4)
    * 42 commits, last commit on 2018/6/15.

## 比較
主に、主観に基づく比較です。
(2019.2.1追記) 以前VoTTを試したときはうまく動作しなかったが、別のPCで試したところ、正常に使えたので、コメントを修正。
### 1. [labelImg](https://github.com/tzutalin/labelImg)
* アプリタイプ: コマンド起動またはDesktopアプリ
* LICENSE: MIT
* 入力フォーマット: ローカルファイル
* 出力フォーマット: `PascalVOC`及び`YOLO`フォーマット
* コメント: アイコン付きアプリにするために、少し戸惑った。

       ```bash
   pyenv uninstall 3.6.5
   env PYTHON_CONFIGURE_OPTS="--enable-framework" pyenv install 3.6.5
   pip install virtualenv
       ```
* UI所感: 過不足のない感じで使いやすい。矩形領域選択時に出る補助線が良い。画像端まで選択すると、`truncated`フィールドを1にしてくれる。クラスのインクリメンタルサーチもできて便利。ショートカットキーも便利。
<img width="1369" alt="スクリーンショット 2018-07-05 0.44.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/46493/e06005ed-fbb8-d95e-a5f6-35975085f44f.png">

### 2. [Labelbox](https://github.com/Labelbox/Labelbox)
* アプリタイプ: Webサービス
* LICENSE: Apache-2.0
* 入力フォーマット: ローカルファイル、クラウド(URIのリストで指定する)
* 出力フォーマット: 独自形式。レポジトリにあるツールで`PacaslVOC`, `COCO`形式に変換できる。
* UI所感: マテリアルデザインベース。作り込んであるけど、使いこなすには慣れが必要そうな印象。フロントエンドUIが3種類用意されていて、そのうちの1つがAnnotation用になっている。ただしポリゴンで領域を指定する形式。独自にUIを作成して追加できる。
<img width="1346" alt="スクリーンショット 2018-07-03 13.28.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/46493/a347d90a-fa93-fa7b-acda-03e7df168754.png">

### 3. [VoTT](https://github.com/Microsoft/VoTT/)
* アプリタイプ: Electronアプリ
* LICENSE: MIT
* 入力フォーマット: ローカルファイル
* 出力フォーマット: `PascalVOC`, `YOLO`, `TFRecord`を含むいくつかの形式。
* コメント: <strike>maxOS High Sierra上で動かしていて、はじめの方でボタンが反応しなくて進めなくなった。<br></strike> (2019.2.1追記) 試せていないが、アクティブラーニングが利用できる。学習済みモデルの用意などのハードルを超えれば、大きな作業効率化が図れそう。
* UI所感: <strike>進めなかったので未確認。`Continue`を押しても何も反応せず。</strike><br> (2019.2.1追記) 全体的にUIがきれいで使いやすい印象を受ける。矩形選択時に補助線がある。各種ショートカットキーが定義されているため、効率よくアノテーションができる。ただし、ラベルへのショートカットの割り当ては10個までのため、それ以上のラベルがある場合は、カーソルで選択する必要がある。また、クラス数が多くなると(表示領域で3行を超すぐらい)、ラベルの表示領域に入り切らなくなり、選択が困難になる。<img width="1108" alt="スクリーンショット 2019-02-01 14.50.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/46493/0f924fca-7924-74c4-f686-ff0184802d84.png">


### 4. [annotorious](https://github.com/annotorious/annotorious)
* アプリタイプ: Webアプリ
* LINCENSE: MIT
* 入力フォーマット: HTML内に`<img>`タグで指定。
* 出力フォーマット: そのままでは出力されない。[JavaScript API](https://github.com/annotorious/annotorious/wiki/JavaScript-API#annoaddhandlertype-handler)で提供されている`onAnnotationCreated(annotation)`などで、出力処理を書く必要がありそう。
* コメント: UIだけのようなので、画像データの供給や、出力を自分で実装しないといけない。また、プロジェクトが現在unsupportedになっている。
* UI所感: シンプルで、編集や削除はしやすい。
<img width="776" alt="スクリーンショット 2018-07-05 0.48.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/46493/3fe01e52-96a1-db99-d5ea-4b383a56baf9.png">

### 5. [via](https://gitlab.com/vgg/via/)
* アプリタイプ: Web
* LICENSE: BSD 2-Clause “Simplified” License
* 入力フォーマット: ローカルファイル、URL、URIのリストファイル。ワイルドカードで多数のローカルファイルを選択すると、読み込むまでに時間がかかった。
* 出力フォーマット: 独自形式のJSON
* UI所感: 必要な機能は揃っているが、使いにくさを感じた。クラスの登録が手間。領域が画像からはみ出すと選択されないため、手ではみ出さないように調整しないといけない。
<img width="1245" alt="スクリーンショット 2018-07-05 0.50.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/46493/66ea5d73-dea3-af3a-dd76-2addf6018d45.png">

### 6. [semi-auto-image-annotation-tool](https://github.com/virajmavani/semi-auto-image-annotation-tool)
* アプリタイプ: コマンドで起動
* LICENSE: Apache-2.0
* 入力フォーマット: ローカルファイル
* 出力フォーマット: 独自形式(`path, x1, y1, x2, y2,category`)
* コメント: Deep Learningでオブジェクトの推定ができる。
* UI所感: 使いにくさを感じた。画像境界のチェックがされない。saveボタンを押すと、追記保存されるため、重複する。
<img width="1116" alt="スクリーンショット 2018-07-05 0.52.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/46493/72bb2104-7ede-4e33-2462-c7f87ba38208.png">


## まとめ
今回比較した中では、`labelImg`が最も良かったです:sparkles: 適度にシンプルかつ必要な機能は揃っていて、効率よくAnnotationができそうに感じました。PascalVOCで出力できるのを探していたので、その点でも良いです。Webベースだと個人的にはもっと良かったです。ポリゴンでAnnotationしたい場合は向かなそうです。

その次に良さそうと思ったのは`via`です。UIが微妙に使いにくく感じましたが、必要な機能は揃っている感じでした。PascalVOC等のフォーマットへは、自分で変換する処理を書かないといけなそうです。

(2019.2.1追記) `VoTT`を試すことができましたが、UIがきれいで非常に良かったです。クラス数があまり多くなければ、こちらのほうが効率よく作業できるかも。

`Labelbox`は、UIの独自開発も視野に入れて、ガッツリ使い込む場合には良いのかもしれないと感じました。ただその場合は、有料プランで使うことになりそうです。

以上、Annotationツールの比較でした。参考になれば幸いです。