AWS EC2上のUbuntuにCVATをデプロイして、yoloでsemi-auto annotationする
AWS EC2 instanceに ubuntu20.04をデプロイしていることを前提とする。
AMIは「Deep Learning AMI GPU PyTorch 1.13.1 (Ubuntu 20.04) 20230315」を使用。
CVATのインストール
以下の本家documentを元にインストールする。
youtubeも充実。
dockerは入っているので割愛。cvatを持ってくる。
git clone https://github.com/opencv/cvat
cd cvat
今回の場合、クラウド上にデプロイするので以下のコマンドは必須。EC2のpublic IPを入れる。
export CVAT_HOST=your-ip-address
以下で簡単に立ち上がる。
docker compose up -d
dockerのバージョンによってdocker-composeだったり、docker composeだったりする。やめてほしい。以下でsuperuserを作って入れる。
docker exec -it cvat_server bash -ic 'python3 ~/manage.py createsuperuser'
AWS S3 Bucketのマウント
クラウドストレージをマウントして、大規模データセットを使用可能にする。
CVATのtabからCloud Storages→"+"と移動して、Display nameに名前をつけて、ProviderはAWSを選択。Bucket nameを設定する。
ACCESS KEY ID、SECRET ACCESS KEY IDはIAM userで発行できるいつものやつを入れる。重要なのはmanifestファイルを作ること。
cvat/utilsにツールが用意されているが、
今回はAWS上にCVATをデプロイしたので、そこまでデータを持っていってmanifest作るのが面倒。探した結果以下を発掘。
pipでインストールして、pythonでローカルで組んで、各データのmanifestを作成。AWSにアップロードする。
これでCVAT上からアクセス可能。フォルダごとアップロードするなら、パスの情報もmanifestファイルに入れないと表示されないので注意。
nuclioを使ってAIをインストール
serverlessでyoloなどが動くというdocker containerが用意されていて、以下を打ち込めば立ち上がる。
docker compose -f docker-compose.yml -f components/serverless/docker-compose.serverless.yml up -d
nuclioを持ってきて、色々やる。
wget https://github.com/nuclio/nuclio/releases/download/<version>/nuctl-<version>-linux-amd64
sudo chmod +x nuctl-<version>-linux-amd64
sudo ln -sf $(pwd)/nuctl-<version>-linux-amd64 /usr/local/bin/nuctl
nuclioを立ち上げる
nuctl create project cvat
<ec2のpublic ip:8070>をブラウザで叩けばnuclioが見える
以下でdextrとyolov3が使用可能になる。
nuctl deploy --project-name cvat \
--path serverless/openvino/dextr/nuclio \
--volume `pwd`/serverless/common:/opt/nuclio/common \
--platform local
nuctl deploy --project-name cvat \
--path serverless/openvino/omz/public/yolo-v3-tf/nuclio \
--volume `pwd`/serverless/common:/opt/nuclio/common \
--platform local
このインテルのおじさまもわかりやすい。
CVATに戻ればModelタブが追加されていて、semi-auto annotationが可能になる。
yolov5のインストール
こちらを参考に進める。
一発これやればいいという話。何かdockerfileをいじった場合は --buildをつけるのを忘れずに。
docker compose -f docker-compose.yml -f docker-compose.dev.yml -f components/serverless/docker-compose.serverless.yml up -d
deploy_cpu.shとdeploy_gpu.shが用意されて入れこれらを使えば、長いコマンドを打ち込まなくて済む。
serverless/deploy_cpu.sh serverless/pytorch/ultralytics/yolov5/nuclio/
nuclio上にyolov5があることが確認できる。ただしyolo5の挙動が不安定で上記コマンドを打ってもうまくデプロイできるときとできない時があった。これに関してはfunction.ymlファイルにportを指定して解決。
新しいTaskを作成し、yolo5を使ってplayerとpersonを対応させて自動アノテーションさせると以下のようになった。
dockerを止めたい時には以下のコマンド。--remove-orphansでネットワーク設定も消すことができる。
docker compose down --remove-orphans
customモデルを指定すれば、自身で学習させたモデルでautomatic annotationができる。