15
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2020-09-14

image.png

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

image.png

前提知識

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

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

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

こんな感じのアプリです

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

labelmeの使い方詳細

labelmeをダウンロード

難しくないので省略

labelmeでラベル付け

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

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

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

左側の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)

image.png

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

最後に

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

15
14
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?