クラウドで簡単画像アノテーション ～vol.1 Google Compute EngineにCVATを構築しよう！

![スクリーンショット 2023-12-14 200539.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3641067/f6b5fe7c-0b3a-c39c-c2b0-e84f1678c145.png)

## はじめに

初めまして！京セラコミュニケーションシステム 寳来（ほうらい）（@kccs_teruya-horai）です。

突然ですが、みなさんは __CVAT__ をご存知でしょうか？
これは Intel が開発したコンピュータービジョン向け（つまりは画像）のアノテーションツールで、その取り回しの良さから画像認識AIに用いる学習データセットの作成などに広く用いられています。

本記事では、この CVAT を __Google Cloud の Compute Engine で作成した Linux 仮想マシンに構築__ する方法  をご紹介します。

https://www.cvat.ai/

:::note warn
本記事は 2023 年 12 月ごろに作成しております。
よって、引用している文章などはこの時点での最新となります。ご了承ください。
:::

## 完成イメージ

Google Cloud の Compute Engine よりVMインスタンスを作成、その中に Docker の環境を構築し、コンテナに CVAT をインストールします。
インスタンスに構築した CVAT はローカルPCのブラウザから簡単にアクセスすることができます。

![0-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3641067/a3d65b20-ca2a-8cbe-0791-9c3e3f6c18ed.png)

## この記事の対象者

- 画像認識AIの導入を考えており、学習データとなる画像データは用意したが、アノテーション作業ができていないという方

- アノテーション作業を行うにあたっての情報共有や進捗管理をより柔軟に行いたい方

- Google Cloud に興味がある方

## なぜ、クラウドにCVATを構築するのか？

昨今のAI技術の発展は目覚ましく、DXを進めるにあたってこれらの技術の導入を考えておられる方も多くいらっしゃるのではないでしょうか？

とくに、画像の物体認識をAIで行おうとすると
- 画像
- アノテーションデータ（画像中のどこに何が写っているかといった情報）

がAIに学習させる学習データとして必要となってきます。

#### アノテーションの例
![0-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3641067/513e75b6-f1d5-79ad-f142-cf4f6a94f932.png)

ところで、良質な画像認識AIモデルの構築の成否は __良質な学習データが収集できたか否かでその大部分が決まる__ と言っても過言ではありません。
ここでいう学習データの質においては、「適切な画像が用いられているか？」というのはもちろん、「アノテーションが正しく行われているか？」という点も重要な要素になってきます。

単純作業と思われがちな画像へのアノテーション作業ですが、AIモデル構築においては非常に重要な工程であり、複数人でプロジェクトを進める場合はアノテーションの基準といった情報共有はしっかりと行った上で取り組むべきと言えるでしょう。

本記事では、このアノテーション作業を簡単に行うことができるツールである CVAT をクラウド上に構築する方法をご紹介します。
ローカルPCではなく __クラウド上にアノテーション環境を構築__ することで、アノテーション作業においてより円滑な情報共有ができるようになります。

## 前提

Google Cloud の利用開始がまだの方は以下サイトより利用登録を行うことができます。

:::note info
［参照］公式サイト・ドキュメント
  [無料トライアルと無料枠](https://cloud.google.com/free)
　　上記サイトの「無料で開始」ボタンから登録が可能
  [Google Cloud の無料プログラム](https://cloud.google.com/free/docs/free-cloud-features)
　　Google Cloudの無料プログラムの詳細を確認できます
:::

## 1. インスタンスの設定

### 1-1. VMインスタンスの構築

ここでは、Google Compute Engine で Ubuntu 20.04 を搭載した VM インスタンスを作成します。
指示のない箇所はデフォルト設定のままで続行してください。

[Compute Engine] > [VMインスタンス] をクリックし、[インスタンスを作成] をクリックします。
![1-1_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3641067/ec01ae95-8bfd-c7a5-7548-ec7f88b5ec22.png)

VMインスタンスの作成に入ります。
名前は任意ですが、ここでは分かりやすく `cvat-gce` としておきます。
レイテンシを抑えたいので、特段の事情が無ければリージョンはアクセス元の所在地から近いものを選びます。

![1-1_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3641067/b76094b1-eabf-20f4-679b-064a63b35761.png)

マシンの構成の設定です。高パフォーマンスなものほど料金も高額になりますが、今回は Series は `N1` 、 マシンタイプは `n1-standard-4` を選択します。

![1-1_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3641067/9a147470-4f9e-a235-46ed-572958c71e26.png)

ブートディスクの設定を行います。OS は `ubuntu` 、バージョンは `Ubuntu 20.04 LTS` 、ブートディスクの種類は`標準永続ディスク`を選択します。
サイズの項目では、VMインスタンスの保存容量を設定することができます。この後で行う Docker および CVAT の環境構築だけで __10GBほどストレージを占有する__ ことを考慮して、アノテーションを行いたいデータのサイズに合わせて設定を行ってください。ここでは多少余裕をもって `100GB` としておきます。

![1-1_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3641067/e59d92fe-1595-3239-92c5-e13bbd137efa.png)

[アイデンティティと API へのアクセス] > [アクセス スコープ] より、`すべての Cloud API に完全アクセス権を許可`を選択します。

![1-1_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3641067/be0a015d-952d-9e87-84b2-ee73162bd6ad.png)

作成ボタンを押してVMインスタンスの作成は完了です！

### 1-2. ファイアウォールルールの作成・反映

次に、ファイアウォールルールを設定します。
ファイアウォールによって任意のIP以外からのアクセスを遮断することで、セキュリティ対策を行いましょう。

ファイアウォールルールの作成とインスタンスへの反映方法は、以下のサイト様を参考にしてください。サイトの案内から変更して設定してほしい箇所を表に示しますので、適宜確認しながら設定を行ってください。

| 変更する項目               | 設定内容                     | 
| :----------------: | :--------------------------: | 
| ソースIPの範囲     | アクセスを許可したいIP       | 

https://eightyfivelife.com/2019/09/google-cloud-platform-firewall-setting/

### 1-3. 外部IPアドレスの取得・反映
以下のドキュメントの [新しい静的外部 IP アドレスを予約する] と [新しい VM インスタンスへ静的外部 IP アドレスを割り当てる] を参考に、静的外部アドレスIPアドレスの取得とインスタンスへの反映を行ってください。

https://cloud.google.com/compute/docs/ip-addresses/reserve-static-external-ip-address?hl=ja#reserve_new_static

## 2. CVAT環境構築

ここまでで作成したインスタンスに SSH 接続し、各種インストール作業を行っていきます。

作成したインスタンスが起動されていることを確認した上で、 SSH ボタンを押します。

![2-1_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3641067/8dc1175d-d50d-94da-b867-6114c2380738.png)

Chrome の別ウィンドウでコマンドラインが立ち上がれば SSH 接続は成功です。

ここからはゴリゴリとコマンドを叩いていきます。
はりきっていきましょう！

### 2-1. Dockerの構築

まずはVMインスタンスに Docker の環境を構築していきます。

インストール可能なパッケージの一覧を更新します。
```:
sudo apt-get update
```

各種パッケージをインストールします。
```:
sudo apt-get --no-install-recommends install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
```

GPG鍵をダウンロードし、aptマネージャーに追加します。
```:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
```

Docker の Ubuntu リポジトリをaptに追加します。
```:
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
```

再度、インストール可能なパッケージの一覧を更新します。
```:
sudo apt-get update
```

Docker 関連の各パッケージをインストールします。
```:
sudo apt-get --no-install-recommends install -y \
docker-ce docker-ce-cli containerd.io docker-compose-plugin
```

`docker`という名前のグループを作成します。
```:
sudo groupadd docker
```

作成した `docker` グループに指定したユーザーを追加します。`[username]` の箇所をSSHへログインを行っているユーザー名に変更した上でコマンドを実行してください。
```:
sudo usermod -aG docker [username]
```

以上で Docker の構築は完了ですが、最後にユーザーに権限が正しく与えられているかの確認を行います。

`docker ps` コマンドを実行してください。Docker の権限が与えられていない場合、以下のようなログが出力されるかと思います。
```:
$ docker ps
permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json": dial unix /var/run/docker.sock: connect: permission denied
```

SSHのウィンドウを閉じてSSHに接続し直し、再度 `docker ps` コマンドを実行してください。以下のように表示されれば、 Docker の構築は成功です。
```:
$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
```

### 2-2. CVATのインストール

ここからはいよいよCVATのインストールを行っていきます。

まずはインストール可能なパッケージの更新を行います。
```:
sudo apt-get update
```

CVAT のリモートリポジトリをローカルマシンにクローンします。
```:
git clone https://github.com/opencv/cvat
```

カレントディレクトリの直下に作成された `cvat` という名前のディレクトリへ移動します。
```:
cd cvat/
```

インスタンスのIPアドレスからCVATへアクセスできるようにするために、環境変数 `CVAT_HOST` に __[1-3. 外部IPアドレスの取得・反映]で取得した静的外部アドレス__ をエクスポートします。

```:
export CVAT_HOST=[取得した静的外部アドレス]
```

コンテナを起動します。実行完了まで少々時間がかかりますので、しばしお待ちください。
```:
docker compose up -d
```

Superuser の情報を設定します。案内にしたがって __ユーザー名、メールアドレス、パスワード__ の入力してください。CVATへのログインはこの Superuser で行いますので、 __入力した内容はメモ等に控えておいて__ ください。 
```:
docker exec -it cvat_server bash -ic 'python3 ~/manage.py createsuperuser'
```

以上で CVAT のインストールは完了です。

### 2-3. CVATへのアクセス・ログイン

ここまでで構築したCVATへアクセスし、ログインを行ってみましょう。

作成したインスタンスが起動されていることを確認した上で、お手元のブラウザのURL入力欄に `http://[インスタンスの静的外部アドレス]:8080`と入力します。CVAT の構築が正常に行えていれば、以下の画像のような CVAT のログイン画面が表示されます。

![2-3_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3641067/9e698e53-8538-d96e-bbdb-0cfa66d443f5.png)

先ほど設定した Superuser の情報でログインして…

![2-3_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3641067/f4092532-5281-df13-5038-0c54c75b435d.png)

↑ このような画面になればCVATへのログインは完了です！
お疲れ様でした！！


## 3. 構築した CVAT の起動・停止
構築したインスタンスを使った CVAT の起動と停止の方法をご紹介します。

### 3-1. CVATの起動

CVAT 構築のために作成したインスタンスを起動し、SSH 接続を行います。

![3_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3641067/9e5f3985-3c4a-74a1-0fb1-43350bdde6f2.png)

SSH が起動したら `cvat` ディレクトリへ移動します。
```:
cd cvat/
```

環境変数 `CVAT_HOST` にインスタンスの静的外部アドレスをエクスポートします。

```:
export CVAT_HOST=[取得した静的外部アドレス]
```

コンテナを起動します。
```:
docker compose up -d
```

お手元のブラウザのURL入力欄に `http://[インスタンスの静的外部アドレス]:8080` と入力すれば CVAT へのアクセスは完了です。

### 3-2. CVATの停止

Google Cloud のVMインスタンスは起動時間に応じた課金がなされます。
CVAT を使い終わった後は忘れずにインスタンスを停止することで、料金コストの節約をはかりましょう。

カレントディレクトリが `cvat` であることを確認した上で、起動中のコンテナを停止します。

```:
docker compose down
```

SSH 接続からログアウトします。
```:
exit
```

Compute Engine の画面よりインスタンスを停止すれば、CVATの停止は完了です。

![3-2_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3641067/0e7f7e95-095a-46d9-42ac-ff8b9137f982.png)

## まとめと次回予告
いかがでしたでしょうか？
本記事ではアノテーションツールである CVAT をクラウドに構築する方法をご紹介させていただきました。

次回の記事ではセキュリティ対策をより万全にしたいという方に向けて、構築した CVAT 用のインスタンスに SSL を適用することで https 通信を可能にする方法をご紹介します。

お楽しみに！

## おしらせ

弊社X（旧：Twitter）では、Qiita投稿に関する情報や各種セミナー情報をお届けしております。情報収集や学びの場を求める皆さん！ぜひフォローしていただき、最新情報を手に入れてください😀
https://x.com/kccs_digital