CVATの自動アノテーション機能を使ってみた

## 人生初投稿！  
初めてQiitaに投稿をします．もし間違い等あれば，ご指摘していただけると幸いです．

## 自動アノテーション(auto annotation)とは?  
あらかじめ用意していたデータベースから，システムが画像におけるメタデータを自動で付与してくれる機能のことを指します．[CVAT](https://github.com/openvinotoolkit/cvat)ではそれをAIで実現しており，yoloといったモデルを使用して，自動で画像や動画のアノテーションを行なってくれます．
なお、2021年8月時点での最新Releaseバージョン1.5を使用しています．ネット上の日本語での記事を検索したところ，バージョン1.2に関しての記事しかありませんでした．1.5と1.2ではCVATの起動方法が大幅に変更されているので，最新版を使用されたい方はこちらの記事をご参考ください.  

## 記事の内容  
- CVATの起動と使い方
- CVATの自動アノテーションを試す
- オンライン版お試しCVAT  

## 環境  
MacBook Pro Core i7
VS Code
Docker version 20.10.8

既にdockerがPCにインストールされていることを前提としています．もしまだの方はDocker Desktopをインストールしてください． 
Dockerを使用するので、WindowsでもLinuxでも同様の手順でCVATを使用することができます.
後述しますが，何故かWindowsでは自動アノテーションがうまく起動しませんでした...

## GitHubのレポジトリをクローンする  

```bash
git clone https://github.com/openvinotoolkit/cvat/tree/release-1.5.0
```

GitHub Desktopを使用する場合は 「current repository ▼」 👉 「Add ▼」 👉 「Clone Repository」 👉 「URL」タブで`https://github.com/openvinotoolkit/cvat/tree/release-1.5.0`を入力してcloneボタンをクリックしてください．  


## [CVAT](https://github.com/openvinotoolkit/cvat)の初期設定をする  

vs codeでdocker-compose.ymlを以下のように変更してください．アノテーションしたい画像を入れたディレクトリ(フォルダ)をあらかじめ設定しておくことで作業がしやすくなるので．`'/Users/○×□'`を自身の環境に合わせて設定してください．

#### Mac(おそらくLinuxも)
```yaml
services:
  ...
  cvat:
    ...
    volumes:
      - cvat_data:/home/django/data
      - cvat_keys:/home/django/keys
      - cvat_logs:/home/django/logs
      - cvat_share:/home/django/share  #追加
...
volumes:
  ...
  cvat_share:
    driver_opts:
      type: none
      device: '/Users/○×□'  # マウントしたいディレクトリ
      o: bind

```  

#### Windows  

```yaml
services:
  ...
  cvat:
    ...
    volumes:
      - cvat_data:/home/django/data
      - cvat_keys:/home/django/keys
      - cvat_logs:/home/django/logs
      - C:\Users\○×□:/home/django/share  #マウントしたいフォルダ

```

## CVATの立ち上げ  

フォルダを指定した後，CVATを起動します．  

```bash  
docker-compose -f docker-compose.yml -f components/serverless/docker-compose.serverless.yml up -d
```  

コンテナがすべて立ち上がれば成功です．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579608/507bda2f-852d-5d2c-e45d-0137e437548d.png)

## CVATのセットアップ

以下のコードを入力してください．ここではDjangoのスーパユーザの作成を行なっています．email addressの登録はreturn(enter)を押してパスしてもらって大丈夫です．
  
入力したユーザ名とパスワードは後で使用するので，覚えておいてください．  

```bash  
docker exec -it cvat bash -ic 'python3 ~/manage.py createsuperuser'
```  

これでセットアップは完了です．

## CVATを触ってみる  
#### タスク作成  
http://localhost:8080/
にアクセスしてください．
以下のような画面が出てくるので，先ほど設定したユーザネームとパスワードでログインしてください．  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579608/f9105df8-4707-9903-1f38-00b06caaab2d.png)

ログインした後このようなトップページが出てくるので，
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579608/ee60742f-9db2-93ad-b767-c5c87a5aa4dc.png)  
`+ Create new task`をクリックしてタスクを作成します．
NameやLabelsを設定していきます．Labelの色はしっかりと設定しておいた方が後のアノテーションがしやすくなります．  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579608/ad0e53db-a1d2-c1f5-2259-14b15ecfd631.png)  

また，アノテーションに使用する画像は先ほどマウントしたフォルダ(ディレクトリ)から取得するので，`Connected file share`をクリックし，使用画像に☑を入れてください．  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579608/d2986d9c-9fbf-b68d-cc79-8676ee102184.png)

全ての項目を設定し終えた後，`submit`ボタンをクリックします．  
このポップアップが右側に出現すると，タスク作成は完了です．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579608/47579140-d2eb-543d-f643-f2dc5771f4ca.png)

#### アノテーションをしてみる  
では一度アノテーションを手動でしてみましょう．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579608/a47c888c-1bec-7414-ae0d-1f5c3afa7040.png)  

Jobsの`job#1`をクリックしてください．  
この□にカーソルを持っていくと，下の画像のようなポップアップがでます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579608/71bc8a19-e48e-813c-c7fc-4438cef71572.png)  

ここで`Shape`をクリックすると，アノテーションモードになります．囲んでみると，以下のようにアノテーションをすることができます．  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579608/93561bc3-8f1d-5da3-70a9-f398e692c967.png)

ですが，手動で全画像をアノテーションをするのはきつく，CVATの意味がありません！  
では，本題の自動アノテーションを設定してみましょう．

## CVATの自動アノテーション機能をオンにする  


yolo-v3を使用して自動アノテーションを使用しました．  

ローカルにnuclioを導入します．  
`https://github.com/nuclio/nuclio/releases/tag/1.5.16`からPCの環境に応じてダウンロードしてください．  
なお，nuclioのバージョンは docker-compose.serverless.ymlのnuclioのバージョンと合わせてください．

```
nuctl-1.5.16-darwin-amd64   #Mac
nuctl-1.5.16-linux-amd64    #Windows
nuctl-1.5.16-windows-amd64  #Linux
```

#### Mac (Linux)
```
sudo chmod +x nuctl-1.5.16-linux-amd64
sudo ln -sf $(pwd)/nuctl-1.5.16-linux-amd64 /usr/local/bin/nuctl
```

#### Windows
色々試してみましたが，上手くいきませんでした．Windowsの方はWSL2でDockerを動かしており，Hyper-Vの方では試していません．GitHubのissueを探してみると，[同様の問題が発生している方](https://github.com/nuclio/nuclio/issues/1821#issuecomment-712827660)がいらっしゃいました...   

ここで`cvat`というプロジェクトを作ります．(`cvat`という名前以外はCVATでは使用できませんでした)  

```
nuctl create project cvat
```
もし上手くいかない場合は，http://localhost:8070/ にアクセスしてGUIでプロジェクトを作成してください．

ここでは，yolo-v3モデルをぶちこみます．

```bash
nuctl deploy --project-name cvat \
  --path serverless/openvino/omz/public/yolo-v3-tf/nuclio \
  --volume $(pwd)/serverless/common:/opt/nuclio/common \
  --platform local
```
私の場合ここでエラーが発生し，コンテナの立ち上げができませんでした．原因を探ってみると，コンテナが0番ポートに割り当てられていたようなので，`serverless/openvino/omz/public/yolo-v3-tf/nuclio/function.yaml`ファイルにポート番号を追加しました．ポート番号は任意の番号で大丈夫(?)だと思います．
(どうやらこれは[バグ](https://github.com/nuclio/nuclio/issues/2158)らしく，nuclioの方では既に修正済みのようですが，CVATが旧バージョンを使用している事が起因して発生しているようです．早く修正バージョンがリリースされるといいですね...)

```yaml
  triggers:
    myHttpTrigger:
      maxWorkers: 2
      kind: 'http'
      workerAvailabilityTimeoutMilliseconds: 10000
      attributes:
        port: 55952   #追加
        maxRequestBodySize: 33554432 # 32MB
```

すると，上手くいきました．  
CVATを立ち上げ，リロードをしてみると `Projects` `Tasks` の横に `Models` が出現しました．それをクリックしてみると，以下のように `YOLO v3` が表示されています．  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579608/de5365f2-9dd7-4b99-01a3-16102246659d.png)

では，先程のアノテーション画面に戻ります．左のバーをみると，AI Toolsが追加されていることがわかります．
`Detectors`から`YOLO v3`を選択してください．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579608/bf46bcd0-45e0-2f61-2596-4e1105085f2a.png)

例ではマリトッツォを自動アノテーションで検出してみます．マリトッツォはどちらかというとケーキのような見た目なので，yoloのケーキ検出機能を使って，マリトッツォのアノテーションを行ってみます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579608/c582e4b7-cc9f-76a8-642c-ed0113428a2e.png)

アノテーションを行うと，見事マリトッツォがアノテーションされていました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579608/8ac00d2b-cbb3-7dba-82a1-462a6a4bac0d.png)
 
この自動アノテーションは一枚ずつ行うこともできますが，まとめてアノテーションすることもできます．`Tasks`を開いて，`Actions`ボタンをクリック→`Automatic annotation`をクリックするとそのタスク内の全画像の自動アノテーションが始まります．  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579608/5fe90480-3397-772f-3b71-408130665628.png)


## オンライン版  
CVATを一度お試しで使ってみたい，という方向けにオンラインdemo版が用意されています．環境構築が出来なかった！ という方はこちらでCVATを体験できます．    

https://cvat.org/

## 最後に  
CVATの自動アノテーションはとても楽ですね．**物体検出**の他に**セグメンテーション**も行うことができます．今までは全て手動でしなければいけなかったのですが，CVATで大幅に時間短縮ができます．特にセグメンテーションは何回もマウスをポチポチすることになるので，この手間が削減されるのはとても助かります．

この記事が面白いなと思ったらLGTMよろしくお願いします！  

今後も記事を書いていきますので，そちらの方も見て頂ければ幸いです😄

## 参照  
[CVAT](https://github.com/openvinotoolkit/cvat)
[CVAT Docs](https://openvinotoolkit.github.io/cvat/docs/)