COCO Annotatorを使って骨格検知用のデータセットを作ってみる

2020.07.01

せーのでございます。

世の中にはアノテーションツールが有料、無料共に沢山あるわけですが、その中でも今回は「COCO Annotator」というツールを使って骨格検知のデータセットを作ってみます。

ピンポイントでいいツールが見つかった

私が欲しかったツールの条件は

  • 無料
  • 骨格検知用にキーポイント(体の各部所をポイントで示し、線でつなげる)をつけられる
  • 結果をCOCO形式で保存する

というものでした。これがなかなか見つからない。たどり着いたツールがCOCO Annotatorでした。

方法はとてもカンタンなので、備忘録として書いておきます。

やってみる

では早速やってみます。

まずはCOCO AnnotatorをCloneします。

HL00340:annotation_tool seinotsuyoshi$ git clone https://github.com/jsbroks/coco-annotator.git
Cloning into 'coco-annotator'...
remote: Enumerating objects: 61, done.
remote: Counting objects: 100% (61/61), done.
remote: Compressing objects: 100% (51/51), done.
remote: Total 3016 (delta 23), reused 23 (delta 10), pack-reused 2955
Receiving objects: 100% (3016/3016), 1.37 MiB | 1.64 MiB/s, done.
Resolving deltas: 100% (2123/2123), done.

HL00340:coco-annotator seinotsuyoshi$ ls
CONTRIBUTING.md     db
Dockerfile      docker-compose.build.yml
LICENSE.md      docker-compose.dev.yml
README.md     docker-compose.gpu.yml
backend       docker-compose.yml
build_gpu.sh      models
client        pytest.ini
datasets

docker composeファイルが入っていますので、これを使って環境を構築します。

HL00340:coco-annotator seinotsuyoshi$ sudo docker-compose up
Password:
Creating network "coco-annotator_cocoannotator" with the default driver
Creating volume "coco-annotator_mongodb_data" with default driver
Pulling messageq (rabbitmq:3)...
3: Pulling from library/rabbitmq
d7c3167c320d: Pull complete
131f805ec7fd: Pull complete
322ed380e680: Pull complete
........
........

 annotator_webclient | [2020-06-30 18:28:34 +0000] [10] [DEBUG] GET /
annotator_webclient | [2020-06-30 18:28:34 +0000] [10] [DEBUG] GET /css/app.7bd0b7a4.css
annotator_webclient | [2020-06-30 18:28:34 +0000] [10] [DEBUG] GET /css/chunk-vendors.9dfc9b77.css
annotator_webclient | [2020-06-30 18:28:34 +0000] [10] [DEBUG] GET /js/app.6a177efd.js
annotator_webclient | [2020-06-30 18:28:35 +0000] [10] [DEBUG] GET /js/chunk-vendors.1277c01d.js
annotator_webclient | [2020-06-30 18:28:35 +0000] [10] [DEBUG] GET /socket.io/
annotator_webclient | [2020-06-30 18:28:35 +0000] [10] [INFO] Socket connection created with anonymous
annotator_message_q | 2020-06-30 18:28:35.385 [info] <0.2061.0> accepting AMQP connection <0.2061.0> (172.18.0.5:50678 -> 172.18.0.3:5672)
annotator_message_q | 2020-06-30 18:28:35.389 [info] <0.2061.0> connection <0.2061.0> (172.18.0.5:50678 -> 172.18.0.3:5672): user 'user' authenticated and granted access to vhost '/'
annotator_webclient | [2020-06-30 18:28:35 +0000] [10] [DEBUG] GET /api/user/
annotator_webclient | [2020-06-30 18:28:35 +0000] [10] [DEBUG] GET /api/info/
annotator_webclient | [2020-06-30 18:28:35 +0000] [10] [DEBUG] GET /api/dataset/data
annotator_webclient | [2020-06-30 18:28:35 +0000] [10] [DEBUG] GET /socket.io/
annotator_webclient | [2020-06-30 18:28:35 +0000] [10] [DEBUG] GET /socket.io/
annotator_webclient | [2020-06-30 18:28:35 +0000] [10] [DEBUG] GET /favicon.ico

必要なコンテナが次々に立ち上がりました。
ブラウザを開き、localhostを5000ポートでアクセスすると、COCO Annotatorの画面が開きます。

ユーザの登録を済ませたらメイン画面が出てきます。
まずはカテゴリを登録しますので「Category」メニューにアクセスします。

Createボタンをクリックします。

カテゴリ名を「Person」にし、+ボタンをクリックします。

左側にキーポイント名、右側にそのキーポイントとつながるキーポイントが入ります。
今回は上半身のキーポイントをつけてみます。キーポイント名はそれぞれ「head」「right_shoulder」「right_elbow」「right_wrist」「left_shoulder」「left_elbow」「left_wrist」になります。

キーポイント名を入力したら右側にはそれぞれ候補として下の方にキーポイントが出ますので、headを中心に左右につなげていけばOKです。
出来上がりはこのようになります。

「Create Category」ボタンでカテゴリを作成します。次のカテゴリ作成ウィンドウが表示されるので、それはCloseで閉じます。
datasetメニューに戻り、Createボタンをクリックします。

データセット名を入力し、先程作ったカテゴリを選択して「Create Dataset」ボタンをクリックします。

Datasetの枠ができました。Cloneしたディレクトリ内の「dataset」の下にデータセットの名前でディレクトリが作成されています。

HL00340:coco-annotator seinotsuyoshi$ cd datasets/
HL00340:datasets seinotsuyoshi$ ls
test

このディレクトリの中にデータセットを作る対象となる画像を直接入れます。
COCO Annotatorをリフレッシュすると、入れた画像が表示されます。

画像をクリックすると実際のアノテーション作業に入ります。

まずは右側のカテゴリ一覧よりPersonをクリックします。

左側のアイコンより「polygon」を選択し、人の周りをクリックして囲みます。囲んだ部分の色が変わります。

再び右側のカテゴリを見ると、Personの下に「1(id:1)」の表示が見えます。このリンクをクリックすると先程作成したキーポイント一覧が出てきますので、いい感じの位置にポイントしていきます。

全てのキーポイントが設定し終わると自動的に次の画面にいきます。今回は一枚のみ入れているのでこれで終了となります。datasetのメニューに戻るとアノテーションが完了したメッセージが表示されています。

アノテーションが終わったデータセットの右側にあるオプションアイコンをクリックするとその中に「COCO download」のボタンがあるのでクリックすると、COCO形式のjsonファイルがダウンロードできます。

中身を見てみると、COCO形式のキーポイントに変換されていることが確認できます。

.......
  .......
  "annotations": [
    {
      "id": 1,
      "image_id": 1,
      "category_id": 1,
      "dataset_id": 1,
      "segmentation": [],
      "area": 0,
      "bbox": [
        0,
        0,
        0,
        0
      ],
      "iscrowd": false,
      "isbbox": false,
      "creator": "chao2suke",
      "width": 2456,
      "height": 3680,
      "color": "#e9c855",
      "keypoints": [
        1239,
        422,
        2,
        516,
        1680,
        2,
        505,
        2860,
        2,
        588,
        3655,
        2,
        1873,
        1597,
        2,
        2050,
        2634,
        2,
        2171,
        3539,
        2
      ],
      "metadata": {},
      "milliseconds": 1286123,
      .......
      .......

まとめ

以上、アノテーションツール「COCO Annotator」を使って骨格検知のデータセットを作ってみました。
何千枚のデータセットを作るとすると結構な時間はかかるかな、と思いますが、COCO Annotatorには1枚のアノテーションにかかった時間なども計測されていますので、作業の目安になるかと思います。

骨格検知のデータセット作成は意外と手こずるところかと思います。こちらのツールを使ってみることをおすすめします。

参考リンク