↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
前提知識
以下の知識があることを前提に記事を書いています
- 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以外におすすめのラベリングツールあったら教えてください。
結構独自に実装したりしてる人もいるのかな。