CVATとYOLOで自動アノテーション

CVATとYOLOで自動アノテーション

Label Studioでは、SAMを利用したアノテーションが上手く動かなかったので、CVATも試してみる。

SAM(Segment Anything Model)は、Facebook(Meta)社が開発した自動セグメンテーションするためのモデル。これを使うとセグメンテーションが楽にできる。

まずは、CVATの構築とYOLOを用いたアノテーションを試してみる。

CVATの構築

GitからCVATのリポジトリを取ってきて、Dockerで立ち上げるだけ。ローカルポート8080でアクセスできる。

git clone https://github.com/cvat-ai/cvat
cd cvat
docker compose up -d
  1. Create an accountからアカウントを作成。
  2. ProjectsのCreate a new projectからプロジェクトを作成。
  3. 今回は、Add labelでBirdというラベルを作成しておく。
  4. Create a new taskからアノテーションするデータを登録。
  5. 登録したタスクのOpenボタンを押すと、アノテーション画面に移動する。

こんな感じでアノテーションできる。

YOLOで自動アノテーション

CVATもYOLOを使った自動アノテーションに対応しているので試してみる。

対応している自動アノテーションはこちらで確認できる。

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

CVATの場合、Nuclioというものを利用して自動アノテーション連携するので、まずはnuctlコマンドのインストールが必要とのこと。

Nuclioは、データ処理や機械学習に特化したサーバレスプラットフォームらしい。

下記ページを参考にインストール。環境はSilicon Mac。

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

curl -OL https://github.com/nuclio/nuclio/releases/download/1.13.0/nuctl-1.13.0-darwin-arm64 
chmod +x nuctl-1.13.0-darwin-arm64
sudo ln -sf $(pwd)/nuctl-1.13.0-darwin-arm64 /usr/local/bin/nuctl
nuctl version

Client version:
"Label: 1.13.0, Git commit: c4422eb772781fb50fbf017698aae96199d81388, OS: darwin, Arch: arm64, Go version: go1.21.1"

serverless配下に自動アノテーションに使うモデルがそれぞれ配置されている。

YOLOは、serverless/onnx/WongKinYiu/yolov7/nuclio/以下のファイルとなるが、そのままでは上手く認識しなかったので、ポート番号を指定するようにfunction.yamlを編集した。

  triggers:
    myHttpTrigger:
      numWorkers: 2
      kind: 'http'
      workerAvailabilityTimeoutMilliseconds: 10000
      attributes:
        maxRequestBodySize: 33554432 # 32MB
        port: 32768 # この行を追加

YOLOモデルをNuclioに登録する。

bash serverless/deploy_cpu.sh serverless/onnx/WongKinYiu/yolov7

登録したモデルが上手く動いているかは、nuctlコマンドで確認できる。

STATEがreadyになっていればOK。

nuctl get functions

 NAMESPACE | NAME                           | PROJECT | STATE     | REPLICAS | NODE PORT
 nuclio    | onnx-wongkinyiu-yolov7         | cvat    | ready     | 1/1      | 32768

下記のようなコマンドで、serverlessのcomposeファイルも追加するような形でCVATを立ち上げ直す。

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

Automatic Annotationを使えば、タスクに登録した全ての画像を自動アノテーションできる。

個別に適用したい場合は、アノテーション画面で、AIツールのDetectorsを使う。

SAMで自動アノテーション

続いて、SAMを使ってみる。

YOLOと同じようにポート番号を指定する。

  triggers:
    myHttpTrigger:
      numWorkers: 2
      kind: 'http'
      workerAvailabilityTimeoutMilliseconds: 10000
      attributes:
        maxRequestBodySize: 33554432 # 32MB
        port: 32769 # この行を追加

SAMをNuclioに登録する。

bash serverless/deploy_cpu.sh serverless/pytorch/facebookresearch/sam/

STATEを確認すると、unhealthyとなって上手く動いていない模様。

nuctl get functions

 NAMESPACE | NAME                           | PROJECT | STATE     | REPLICAS | NODE PORT
 nuclio    | pth-facebookresearch-sam-vit-h | cvat    | unhealthy | 1/1      | 32769

Dockerコンテナのログを確認すると下記のようなエラーが発生し、上手く起動できていない。

25.05.04 03:01:18.286 (D) sor.http.w1.python.logger Waiting for start
25.05.04 03:01:18.342 (I) sor.http.w1.python.logger Init context... 0% {"worker_id": "1"}
25.05.04 03:01:18.343 (I) sor.http.w0.python.logger Init context... 0% {"worker_id": "0"}
25.05.04 03:01:18.738 (W) sor.http.w1.python.logger Failed to read control message {"errRootCause": "EOF"}
25.05.04 03:01:18.739 (D) sor.http.w1.python.logger Control connection was closed
25.05.04 03:01:18.737 (W) sor.http.w1.python.logger Failed to read from event connection {"err": "EOF"}
25.05.04 03:01:18.739 (E) sor.http.w1.python.logger Unexpected termination of child process {"error": null, "status": "signal: killed"}
panic: Wrapper process for worker 1 exited unexpectedly with: signal: killed
goroutine 14 [running]:
github.com/nuclio/nuclio/pkg/processor/runtime/rpc.(*AbstractRuntime).watchWrapperProcess(0x40002642a0)
/home/runner/work/nuclio/nuclio/pkg/processor/runtime/rpc/abstract.go:663 +0x398
created by github.com/nuclio/nuclio/pkg/processor/runtime/rpc.(*AbstractRuntime).startWrapper in goroutine 13
/home/runner/work/nuclio/nuclio/pkg/processor/runtime/rpc/abstract.go:318 +0x17c
25.05.04 03:01:19.255 (I) processor Starting processor {"version": "Label: 1.13.0, Git commit: c4422eb772781fb50fbf017698aae96199d81388, OS: linux, Arch: arm64, Go version: go1.21.7"}

色々調べてみると、Dockerのメモリ不足で上手く起動できていないようだ。

Docker Desktopでは4Gほど設定していたが、上限を14Gまで増やしたところ無事に起動するようになった。

Docker Desktopの設定、Resources、AdvancedからMemory limitを14Gに増やす。

AIツールのInteractorsからSegment Anythingを選択し、セグメンテーションしたい物体を選択すると自動的にマスクを作ってくれる。マスクがズレている場合は、右クリックで除外領域を選択できたり、細かい操作も可能。

ただ、CPU処理だと初回処理に少し時間がかかるのが少しネック…。同じ画像なら二回目以降はすぐ選択してくれる。

SiamMaskで動画アノテーションを追尾させる

動画のアノテーションも調べてみる。

例えば、動画でアノテーションしていく場合、同じ物体をフレームごとに選択していく必要がある。通常、選択対象の物体は移動していくわけで、これをフレームごとに選択していくのは非常に大変。

そこで、SiamMaskというのを使うと選択対象の移動を追尾してくれるので、アノテーション作業が楽になる。とは言っても、多少ズレたりするので調整は必要になりそう。

こちらもYOLOと同じようにポート番号を指定する。

  triggers:
    myHttpTrigger:
      numWorkers: 2
      kind: 'http'
      workerAvailabilityTimeoutMilliseconds: 10000
      attributes:
        maxRequestBodySize: 33554432 # 32MB
        port: 32767 # この行を追加

SiamMaskをNuclioに登録する。

bash serverless/deploy_cpu.sh serverless/pytorch/foolwood/siammask/

下記のようなエラーが発生してビルドに失敗している模様。

3.738 rosetta error: failed to open elf at /lib64/ld-linux-x86-64.so.2
3.738  Miniconda3-latest-Linux-x86_64.sh: line 333:    44 Exit 141                extract_range "${boundary1}" "${boundary2}"
3.738         45 Trace/breakpoint trap   | CONDA_QUIET="$BATCH" "$CONDA_EXEC" constructor --extract-tarball --prefix "$PREFIX"
------
Dockerfile.processor:24
--------------------
  22 |     RUN apt update && apt install -y --no-install-recommends wget git ca-certificates && rm -rf /var/lib/apt/lists/*
  23 |
  24 | >>> RUN wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh && chmod +x Miniconda3-latest-Linux-x86_64.sh && bash Miniconda3-latest-Linux-x86_64.sh -b && rm -f Miniconda3-latest-Linux-x86_64.sh
  25 |
  26 |     WORKDIR /opt/nuclio
--------------------
ERROR: failed to solve: process "/bin/sh -c wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh && chmod +x Miniconda3-latest-Linux-x86_64.sh && bash Miniconda3-latest-Linux-x86_64.sh -b && rm -f Miniconda3-latest-Linux-x86_64.sh" did not complete successfully: exit code: 133

View build details: docker-desktop://dashboard/build/desktop-linux/desktop-linux/eni7mbe7hjv1fuhgso3y0pd0o

    /nuclio/pkg/cmdrunner/shellrunner.go:114
Failed to build
    /nuclio/pkg/dockerclient/shell.go:119
Failed to build docker image
    .../pkg/containerimagebuilderpusher/docker.go:70
Failed to build processor image
    /nuclio/pkg/processor/build/builder.go:267
Failed to deploy function
    ...//nuclio/pkg/platform/abstract/platform.go:227

どうやらx86でのビルドが必要らしい。今回はあまり良くなさそうだが、下記のようにbaseImageにプラットフォーム指定するようにファイルを修正して対応。

  build:
    image: cvat.pth.foolwood.siammask
    baseImage: --platform=linux/amd64 ubuntu:20.04

serverless/deploy_cpu.sh実行時に下記のようなエラーが出て失敗する場合は、一度Nuclioから削除する必要がある。

25.05.04 12:56:14.728 (I)                     nuctl Project created {"Name": "cvat", "Namespace": "nuclio"}
Deploying pytorch/foolwood/siammask function...

Error - Function cannot be updated when existing function is being provisioned
    /nuclio/pkg/platform/local/platform.go:221

Call stack:
Failed to validate a function configuration against an existing configuration
    /nuclio/pkg/platform/local/platform.go:221

nuctlのdeleteで削除できる。

nuctl delete functions pth-foolwood-siammask --force

AIツールからTrackers、SiamMaskを選択してバウンディングボックスで選択する。

フレームを動かしていくと、SiamMaskが処理してくれるので、バウンディングボックスが自動的に移動・リサイズしてくれる。

ただ、1フレームずつ処理していく必要があるようで、そのたびに少し処理に時間がかかる。GPUなら一瞬で処理してくれてストレスはないかも。でも1フレームずつ手作業でやるよりは全然楽だと思う。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です