WSL2を使ってCVATを使うには?

WSL2を使ってCVATを使うには?

WSL2経由でCVATを使いたい

機械学習の中でセグメンテーションが最近流行っていますね。自分もちょっと面白いアイデアが思いついたのでセグメンテーションを使ったソフトウェアを開発してみることにしました。

セグメンテーションの教師データを作るツールとしてはVIA, VoTTCVATなどがあるようです。

CVATがデータの作りやすさ、出力形式の柔軟性などの観点で優れいたのでこれを使うことにしました。

もともと、WSL2を使用しないwindows環境でCVATを使用していたのですが、「教師データの生成自体を機械学習で行う」という機能を使うときに行き詰まりました。なので、WSL2でCVATの環境と整えようと思います。

WSL2の設定

超粗削りです。必要に応じて他サイトも参考にしてください。 windowsのバージョンやCPUによってもやり方が異なるようなのでご注意ください。すべて管理者権限のあるwindowsアカウントで実行してください。

管理者権限でコマンドプロンプトを起動して下記を入力

> wsl --install

Microsoft StoreからUbuntu 20.04 LTSをインストール

インストールが完了したらこれを起動。初回起動時はユーザー名とパスワードの設定を求められるので指示に従う。

Dockerの設定

まずはDockerが動く環境を整えます。Ubuntuで下記を実行していきます。

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release gnupg-agen software-properties-common
$curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
$ apt-cache madison docker-ce
// このコマンドを実行すると利用可能なバージョンの一覧が下記のように表示されます。
// docker-ce | 5:20.10.9~3-0~ubuntu-focal | https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
// docker-ce | 5:20.10.8~3-0~ubuntu-focal | https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
// docker-ce | 5:20.10.7~3-0~ubuntu-focal | https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
// "5:20.10.9~3-0~ubuntu-focal"のようなバージョン名を使用して下記を実行します。バージョン名は各自の環境に応じて変えてください。
$ sudo apt-get install docker-ce=5:20.10.9~3-0~ubuntu-focal docker-ce-cli=5:20.10.9~3-0~ubuntu-focal containerd.io

これでひとまずdockerはインストールできたはずです。下記コマンドで確認してみましょう

$ docker -v
// Docker version 20.10.9, build xxxxxxx

このようになればOKです。続いて、Dockerが正しく動作しているかを確認するために下記コマンドを実行します。

$ sudo service docker start // dockerを起動するコマンドです。Ubuntuを起動するたびに必要です。
$ sudo docker run hello-world
// 結果として下記のような内容が表示されれば成功です。
Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

CVATの導入

続いてwsl2環境にCVATをインストールしていきます。CVATではブラウザを使用するソフトです。つまり、windowsからwsl2のlocalhostにアクセスできる必要があります。そのため、windowsの”C:\Users\(ユーザー名)\”フォルダに”.wslcofig”というファイルを作り下記の内容を記載してください。

localhostForwarding=True

windowsでは”.(ドット)”で始まり拡張子を持たない名前のファイルを作ることはできないので、一度テキストドキュメント(メモ帳)で適当な名前で上記内容を保存したのちに、名前の変更で “.wslcofig” にしてください。

さて、Ubuntuに戻って下記の通りコマンドを実行してください。

$ sudo apt-get --no-install-recommends install -y python3-pip python3-setuptools
$ sudo python3 -m pip install setuptools docker-compose
$ sudo apt-get --no-install-recommends install -y git
// ここで、適宜CVATをクローンするディレクトリを作成して移動しておいてください。
$ git clone https://github.com/opencv/cvat
$ cd cvat
$ sudo docker-compose up -d

これでCVATが起動したはずです。 ブラウザ(googleChrome)を開いて”localhost:8080″にアクセスすると次のようなログイン画面が表示されると思います。

ただ、現状ではアカウントがないためログインすることができません。アカウントをつくります。

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

指示に従ってユーザー名、メールアドレス、パスワードを入力します。無事アカウントができたら、ユーザー名とパスワードを使ってログインします。ログインできると次のような画面になります。

半自動/全自動アノテーションツール導入

CVATのマニュアル的にはSemi-automatic and Automatic Annotationと呼ばれている機能を導入します。CVATが立ち上がっている状態であれば、一度立ち下げます。

$ sudo docker-compose down

必要なものを下記コマンドでインストールします。nuclioのバージョンは1.5.16としていますが、/components/serverless/docker-compse.serverless.ymlというファイルの記載内容とそろっていることが大事だそうです。念のためこのこのファイルを確認してインストールするバージョンを確認してください。このファイルの中の5行目辺りにnuclioのバージョン情報が書かれています。

またこのファイルの18行目辺りでポートが指定されていますが、デフォルトの8070では私の環境では上手くいきませんでした。この時点でポートを8060など適当なものに変えてしまってもよいかもしれません。

$ wget https://github.com/nuclio/nuclio/releases/download/1.5.16/nuctl-1.5.16
-linux-amd64
$ sudo chmod +x nuctl-1.5.16-linux-amd64
$ sudo ln -sf $(pwd)/nuctl-1.5.16-linux-amd64 /usr/local/bin/nuctl
$ sudo nuctl create project cvat
$ sudo nuctl deploy --project-name cvat \
  --path serverless/openvino/dextr/nuclio \
  --volume `pwd`/serverless/common:/opt/nuclio/common \
  --platform local

今回はセグメンテーションということで”dextr”というモデルを導入してみました。 bounding box を使用する教師データを作成したい場合はYOLOなどを選択することもできます。その場合、最後のコマンドが下記に置き換わります。

$ sudo nuctl deploy --project-name cvat \
  --path serverless/openvino/omz/public/yolo-v3-tf/nuclio \
  --volume `pwd`/serverless/common:/opt/nuclio/common \
  --platform local

dextr、YOLO以外にも利用可能なモデルは多数あり、cvatのgitのREADME.mdに記載があります。各モデルのリンクたどるとパスが分かるので、上記コマンドの”–path” 引数を変えて実行してください。

これで一通りの準備が完了しました。改めてCVATを起動します。

$ docker-compose -f docker-compose.yml -f components/serverless/docker-compose.serverless.yml up -d

私の環境ではここで下記のエラーが発生し、うまくモデルを有効化できませんでした。

ERROR: for nuclio  Cannot start service nuclio: driver failed programming external connectivity on endpoint nuclio (93577a206c019b4f7e0a7853xethdc6b24e6f74ff518e1gc384f8ddcc52ca710): Error starting userland proxy: listen tcp4 0.0.0.0:8070: bind: address already in use
ERROR: Encountered errors while bringing up the project.

すでに記載しましたが、対策として /components/serverless/docker-compse.serverless.yml のport番号を8070以外にすることで回避できました。

“localhost:8080″にアクセスしヘッダーのModelsを選択すると、利用可能なモデルの一覧が表示されます。今回はDEXTRを入れたので下図のようになっていると思います。

CVATの使用方法自体は公式マニュアルや他サイトなど多数の情報があるので、本記事ではここまでで一度終わりにします。自分で使ってみてノウハウなどがたまってきたら使い方も紹介するかもしれません。