セグメンテーション用のラベル(マスク)をlabelmeで作成する方法(semantic segmentation mask)


↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

前提知識

以下の知識があることを前提に記事を書いています

  • semantic segmentation(#セマンティックセグメンテーション)
  • mask(#label)

labelmeはラベル作成用のアプリ

こんな感じのアプリです

  • labelmeはpython製のラベル作成用アプリです。画像に対して複数のラベルを付けることができます。
  • 他クラスでも問題ありません。ので、もちろん2クラスのsemantic segmentationでもできます。
  • 画像にポイントで線を引き、結果がJSONファイルで出力されます
  • JSONファイルが同名で画像と同フォルダに保存されているばあい(デフォルトで同じ名前で保存されます)、画像を読み込んだ時に勝手にJSONもロードされ、アノテーションされた状態で開いてくれる。
  • 作成したポイントは再編集可能。

labelmeの使い方詳細

labelmeをダウンロード

難しくないので省略

labelmeでラベル付け

labelmeを開くと、以下のようなウインドウが開きます。(画像はgoogle検索画面のスクリーンショットです。

拡大しながら、ポイントで線を引いていきます。
拡大と移動は非常に簡単にできます。

この適当な感じで1minくらいかなー。
かなり使いやすい。。

左側のSAVEからJSONを保存します。
こんな感じのデータができます!

{
  "version": "4.5.6",
  "flags": {},
  "shapes": [
    {
      "label": "dog",
      "points": [
        [
          104.36893203883496,
          66.99029126213593
        ],
        [
          93.44660194174757,
          71.35922330097087
        ],
        ここは省略
        [
          112.13592233009709,
          74.27184466019418
        ],
        [
          107.28155339805825,
          73.30097087378641
        ]
      ],
      "group_id": null,
      "shape_type": "polygon",
      "flags": {}
    }
  ],
  "imagePath": "スクリーンショット 2020-09-14 141400.png",
  "imageData": "省略",
  "imageHeight": 405,
  "imageWidth": 535
}

注意!このJSONポイントは、ポリゴンのポイントなので、そのままマスクには使えません。。なので、このポイントをマスクに変換する必要があります。

labelmeのファイルをJSONからMASKに変換

当初自分で実装しようかと思ってたのですが、それ用の関数が用意されていました。
labelmeにはutilsフォルダにshape.pyというモジュールが用意されており、shape_to_mask関数を使用することでJSONからMASKに変換することができます。

ただ、微妙に実装しないといけないので、サンプルのコードを載せておきます。

import json
with open(path, "r",encoding="utf-8") as f:
    dj = json.load(f)
# dj['shapes'][0]は今回一つのラベルのため。
mask = shape_to_mask((dj['imageHeight'],dj['imageWidth']), dj['shapes'][0]['points'], shape_type=None,line_width=1, point_size=1)
mask_img = mask.astype(np.int)#booleanを0,1に変換

#anacondaを使っています
import matplotlib.pyplot as plt
%matplotlib inline

plt.imshow(mask_img)

うまくラベリングできました。
このくらいのレベルであれば、画像開いてから保存までで2-3minくらいでできるのではないでしょうか。

最後に

labelme以外におすすめのラベリングツールあったら教えてください。
結構独自に実装したりしてる人もいるのかな。