この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
データアナリティクス事業本部の鈴木です。
教師あり学習で画像の物体認識を行う際には、一般的には以下の情報が必要になります。
- 画像
- アノテーションデータ(どこになんの物体が写っているかなど)
公開されているデータセットでは、アノテーションデータがすでに準備されていることも多いですが、新しい問題に取り組む際には、基本的には自分でアノテーションを付ける必要があります。
今回は画像にアノテーションデータとしてバウンディングボックスを付けるために、Computer Vision Annotation Tool (以降、CVAT)を調べたのでご紹介します。
CVATとは
インテルで開発されている、コンピュータビジョンアルゴリズム用のラベリングツールです。
MITライセンスで配布されており、ソースコードはGitHubで公開されています。
ウェブベースのツールで、Dockerでサーバーを起動し、Google Chromeからアクセスして利用できます。
GitHubレポジトリは以下です。
openvinotoolkit/cvat: Powerful and efficient Computer Vision Annotation Tool (CVAT)
使ってみる
ダウンロード・起動
公式のインストールガイドにしたがってインストールしました。
前提としてDockerおよびGoogle Chromeがインストールされている必要があります。
今回は自分のPC上でコンテナを起動し、自分のPCのブラウザでアクセスしました。
私はMac OSを使っているのでMac OS Mojave
の箇所を参考に進めました。
まず、GitHubレポジトリをCloneしました。
git clone https://github.com/opencv/cvat
レポジトリのルートに移動し、docker-composeでCVATを起動しました。このとき、初回は大きめのコンテナイメージをいくつかダウンロードするので、ご注意ください。
# レポジトリのルートに移動
cd cvat
# サーバーの起動
docker-compose up
別のコンソールを立ち上げ、下記コマンドでスーパーユーザーを作成しました。ユーザー名・パスワード、メールアドレスを聞かれるので、入力しました。
docker exec -it cvat bash -ic 'python3 ~/manage.py createsuperuser'
スーパーユーザーが作成できたら、Google Chromeを起動し、localhost:8080
にアクセスしました。
ログインページが表示されます。先ほど作成したユーザーでログインしました。
ログインできるとホーム画面に移ります。
作業を行うためには、プロジェクトとタスクを作成する必要があります。
今回アノテーションしたい画像
今回はスマホに眠っていた、コリンキーと銀杏の写真にアノテーションをつけることにしました。
コリンキーはかぼちゃの一種なのでsquash
、銀杏はginkgo
でラベル付します。
ちなみに、コリンキーの英語名を調べたところ、"Colinky Squash"と出てきたのでラベルもsquash
としました。あれ、pumpkin
じゃないの?と思いますが、(諸説あるようですが、)皮がオレンジ色の種類がpumpkin
で、ほかはsquash
と呼ぶことが多いようです。
プロジェクトの作成
アノテーションをするため、プロジェクトとタスクを作成します。
まず、プロジェクトを作成します。ホーム画面でCreate new project
を押します。
Create a new project
画面が表示されるので、Name
とLabels
を入力します。
Labels
はAdd Label
をクリックすると以下のようになるので、とりあえずLabel name
を入力してDone
を押します。
設定が入力できたら、Submit
ボタンを押します。
これで、プロジェクトが作成できました。
タスクの作成
続いて、各プロジェクトのCreate new task
を押して、タスクを作成します。
Create a new task
画面で、Name
を入力し、Project
を選択します。アノテーションを付けたい画像をSelect files
にドラッグ&ドロップします。
また、よく見るとLabels
が"Project labels will be used"になっており、先ほどプロジェクトで作成したラベルがアノテーションに使えるラベルであることが分かります。
問題なければSubmit
を押します。
アノテーションの実施
タスクの作成ができたので、アノテーションデータを作成します。
タスクからJobのリンクをクリックします。
このように、作業用のUIが表示されます。今回はバウンディングボックスを作成したいので、その操作に絞って説明します。
サイドバーからDraw new rectangle
を選びます。このときに、LabelとDrawing methodを選べます。コリンキーなので、Labelはsquash、Drawing methodはとりあえずBy 2 Points
(長方形の対頂点を選ぶ)にしておきます。
対頂点を選んでバウンディングボックスを作成します。
画像が複数ある場合は、上部のバーから画像を変更できます。
銀杏にもアノテーションを付けてみます。後からアノテーションデータの出力を見たいので、殻がない銀杏はsquashにしておきました。
作業が終わったらSave
を押しておきます。
結果の出力
アノテーション結果を出力します。
Menu
> Export as a dataset
で出力したい形式を選択します。
見て分かる通り、多岐にわたる形式をサポートしています。今回はPASCAL VOC1.1形式
をクリックします。
程なく、zipがダウンロードされます。
zipを解凍すると、以下の構成のデータセットが得られます。特にAnnotationsディレクトリに入っているxmlファイルがアノテーションデータです。元の画像はJPEGImagesに入っていました。
.
├── Annotations
│ ├── ColinkySquash.xml
│ └── Ginkgo.xml
├── ImageSets
│ ├── Action
│ │ └── default.txt
│ ├── Layout
│ │ └── default.txt
│ ├── Main
│ │ ├── background_default.txt
│ │ ├── default.txt
│ │ ├── ginlgo_default.txt
│ │ └── squash_default.txt
│ └── Segmentation
│ └── default.txt
├── JPEGImages
│ ├── ColinkySquash.jpg
│ └── Ginkgo.JPG
└── labelmap.txt
xmlの中身も確認してみます。
Ginkgo.xml
<annotation>
<folder></folder>
<filename>Ginkgo.JPG</filename>
<source>
<database>Unknown</database>
<annotation>Unknown</annotation>
<image>Unknown</image>
</source>
<size>
<width>1088</width>
<height>816</height>
<depth></depth>
</size>
<segmented>0</segmented>
<object>
<name>squash</name>
<occluded>0</occluded>
<bndbox>
<xmin>513.44</xmin>
<ymin>341.66</ymin>
<xmax>679.1</xmax>
<ymax>469.73</ymax>
</bndbox>
</object>
<object>
<name>ginlgo</name>
<occluded>0</occluded>
<bndbox>
<xmin>722.58</xmin>
<ymin>250.01</ymin>
<xmax>869.44</xmax>
<ymax>427.43</ymax>
</bndbox>
</object>
<object>
<name>ginlgo</name>
<occluded>0</occluded>
<bndbox>
<xmin>640.33</xmin>
<ymin>387.48</ymin>
<xmax>827.15</xmax>
<ymax>588.4</ymax>
</bndbox>
</object>
<object>
<name>ginlgo</name>
<occluded>0</occluded>
<bndbox>
<xmin>585.11</xmin>
<ymin>205.37</ymin>
<xmax>750.77</xmax>
<ymax>360.46</ymax>
</bndbox>
</object>
<object>
<name>ginlgo</name>
<occluded>0</occluded>
<bndbox>
<xmin>263.17</xmin>
<ymin>215.94</ymin>
<xmax>418.26</xmax>
<ymax>395.71</ymax>
</bndbox>
</object>
<object>
<name>ginlgo</name>
<occluded>0</occluded>
<bndbox>
<xmin>433.54</xmin>
<ymin>157.19</ymin>
<xmax>594.51</xmax>
<ymax>295.84</ymax>
</bndbox>
</object>
</annotation>
期待した値が入っていることが確認できました。
作業が終わったら、コンテナを終了しておきます。
# レポジトリのルートに移動
cd cvat
# サーバーの終了
docker-compose down
感想
今回は一人で使う前提で、最低限の使い方の紹介をしました。
実際にアノテーションのプロジェクトを実施するときは、アノテーションの仕方の取り決めやタスク割り振りなど、ツールに期待することがたくさんあると思います。
より詳細にCVATを知っていくことで、そのような用途にも余裕で応えてくれる実力を感じます。
GitHubではScreencasts
から、各種使い方の動画を見ることも可能です。併せてご参照ください。