CVATのセットアップ方法

CVATはオープンソースで使える画像のアノテーションツールです。様々な形式のアノテーションデータを出力することができます。自分でサーバーを立てると全ての機能を無料で使えるので自前のサーバーで運用するのがオススメです。もちろん、有料ですがCVAT側に全てを管理してもらう場合は安心感があります。今回は、CVATの自前での立ち上げ方について解説していきます。

https://www.cvat.ai/

## Dockerのインストール

以下のサイトからインストーラをダウンロードしてDocker Desktopをインストールします。

https://www.docker.com/products/docker-desktop/

以下のようなウィンドウが出てくればOKです。ちなみにサインインする必要はありません。

![DockerDesktop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/773995/de7d2a1e-e325-7079-5e63-ef37626cea59.png)

Windowsの方はDokcerをインストトールする前にWSLを設定してください。

## CVATのインストール

https://docs.cvat.ai/docs/administration/basics/installation/

CVATをインストールする前にgitがまだインストールされていない方はインストールしてください。

https://git-scm.com/book/ja/v2/%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%82%8B-Git%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB

まず、Terminalを開いてCVATをダウンロードしたいフォルダまで移動します。

```terminal
cd <フォルダのパス>
```

GitHubリポジトリからCVATをダウンロードします。この時、タグを指定しないとデフォルトではdevブランチのものを使うことになってしまうので、`Tags`にあるバージョンを指定します。今回は`v2.12.1`を使用します。また、フォルダを軽くするために、ダウンロードするコミットの深さを1にしています。

```terminal
git clone https://github.com/cvat-ai/cvat -b <タグ> --depth 1
```

クローンが終わったら、バージョンをわかりやすくするためにフォルダ名を変えておきます。

 ```terminal
 mv cvat cvat_v2.12.1
 ```

次にCVATフォルダに移動します。

```terminal
cd cvat_v2.12.1
```

サーバーとして運用したい場合は先に環境変数`CVAT_HOST`にサーバーのIPアドレスをセットします。

```terminal
export CVAT_HOST=<IPアドレス>
```

CVATフォルダ内で以下のコマンドを実行するとコンテナが立ち上がります。

```terminal
docker compose up -d
```

ブラウザで

[http://localhost:8080](http://localhost:8080)

または、

http://<サーバーのIPアドレス>:8080

にアクセスすると次の画面が表示されます。

![スクリーンショット 2024-05-04 17.50.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/773995/408c308b-76e3-8288-15aa-620227e045ec.png)

左上の「Create an account」を押して適当なアカウントを作成します。

これで準備完了です。DockerDesktopを使っている場合は、ポチポチとコンテナのオンオフができるので、使いたい時はコンテナを立ち上げて、終わったらストップさせます。

本格的にサーバーとして運用する場合はスーパーユーザーを以下のコマンドを走らせて作成し、それでまずはログインします。

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

## 自動アノテーションのセットアップ

https://docs.cvat.ai/docs/administration/advanced/installation_automatic_annotation/

CVATはYOLOなどを読み込んで自動でアノテーションしてくれる機能があります。以下ではそのセットアップ方法について解説します。

::: note warn
さまざまなOSで試行したところ、Linux以外では今のところ上手く行きませんでした。Windows、Macの方はご注意ください。
:::

### nuctlのセットアップ

まず、コンテナを落としておきます。

```bash
docker compose down
```
続いて、以下のファイルを開いて4行目を確認します。

`components/serverless/docker-compose.serverless.yml`

```docker compose :docker-compose.serverless.yml
services:
  nuclio:
    container_name: nuclio
    image: quay.io/nuclio/dashboard:1.11.24-amd64
(以下省略)
```

`1.11.24-amd64`となっているのでこれにあうバージョン(1.11.24)の`nuctl`をダウンロードします。

```bash
wget https://github.com/nuclio/nuclio/releases/download/<バージョン>/nuctl-<バージョン>-linux-amd64
```

ダウンロードが完了したら`/usr/local/bin/nuctl`に移動させます。

```bash
sudo mv nuctl-<バージョン>-linux-amd64 /usr/local/bin/nuctl
sudo chmod +x /usr/local/bin/nuctl   
```

以下のコマンドでエラーが出なければOKです。

```bash
nuctl
```

### AIモデルのセットアップ

デフォルトでアノテーションに使えるのモデルのリストは以下に記載されています。

https://docs.cvat.ai/docs/getting_started/overview/#automated-labeling

今回はYOLOv7をセットアップするので、上記のリストの「YOLOv7」をクリックすると、

https://github.com/cvat-ai/cvat/tree/develop/serverless/onnx/WongKinYiu/yolov7/nuclio

に飛びます。

これのURLの`serveless`から`nuclio`の前までを切り出して（ここ`YOLOv7`では：`serverless/onnx/WongKinYiu/yolov7`）（`SAM`の場合は`serverless/pytorch/facebookresearch/sam`）

CPUでアノテーションする場合は

```bash
./serverless/deploy_cpu.sh <切り出したURL>
```

GPUを活用する場合は

```bash
./serverless/deploy_gpu.sh <切り出したURL>
```

を実行するとAIモデルのセットアップが完了します。(終了するまで時間がかかります)

::: note 
~~GPUを使用したい場合は以下のようにセットアップすると良いみたいですが、私の環境ではエラーを吐かずに正常に設定完了するものの、GPUが使われている感じがしませんでした。~~

```bash
nuctl create project cvat
nuctl deploy --project-name cvat \
  --path serverless/onnx/WongKinYiu/yolov7/nuclio \
  --triggers '{"myHttpTrigger": {"maxWorkers": 1}}' \
  --resource-limit nvidia.com/gpu=1
```
参考：https://qiita.com/wakaba130/items/879b5e996e7eb3699ec9
:::

### コンテナの起動

続いて、以下のコマンドでコンテナを起動します。

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

コンテナを落としたい場合は以下のコマンドを使用します。

```bash
docker compose -f docker-compose.yml -f components/serverless/docker-compose.serverless.yml down
```

### テスト

この動画でどんな感じに検出されるのか最後に試してみました。

[https://pixabay.com/ja/videos/%E3%82%B8%E3%83%A5%E3%83%8D%E3%83%BC%E3%83%96-%E3%82%B9%E3%82%A4%E3%82%B9-%E9%89%84%E9%81%93%E9%A7%85-44510/](https://pixabay.com/ja/videos/%E3%82%B8%E3%83%A5%E3%83%8D%E3%83%BC%E3%83%96-%E3%82%B9%E3%82%A4%E3%82%B9-%E9%89%84%E9%81%93%E9%A7%85-44510/)

Jobの右下の「Actions」から「Automatic annotation」を選択して、
人と乗り物を検出するように設定して、

![スクリーンショット 2024-05-08 18.08.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/773995/98f037c6-08c7-e92b-4d77-ec36bbd2ee0f.png)

自動アノテーションを走らせると、

![スクリーンショット 2024-05-08 17.54.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/773995/00cecee5-26d3-0b4b-5569-8eb011e5afda.png)

以下のような感じになりました。

![画面収録 2024-05-08 18.01.58 (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/773995/f3922b24-b5fb-c714-7377-39af265eacbc.gif)

オリジナルのAIモデルを載せたい場合については次の記事に書いています。

https://qiita.com/hbk24/items/db310a922435ea70a831