画像セグメンテーション入門

PyTorch で学ぶ画像向け Deep Learning

Michal Oleszak

Machine Learning Engineer

画像セグメンテーション

  • 画像セグメンテーションは、ピクセル単位で画像を複数の領域に分割します
  • 各ピクセルは特定の領域に割り当てられます
  • セグメンテーションの種類:
    • セマンティックセグメンテーション
    • インスタンスセグメンテーション
    • パノプティックセグメンテーション
PyTorch で学ぶ画像向け Deep Learning

セマンティックセグメンテーション

セマンティックセグメンテーション

  • 各ピクセルをクラス分類
  • 同一クラスのピクセルは同等に扱う
PyTorch で学ぶ画像向け Deep Learning

インスタンスセグメンテーション

インスタンスセグメンテーション

  • 同一クラス内の異なる個体を区別
  • 背景は非セグメント化のことが多い
PyTorch で学ぶ画像向け Deep Learning

パノプティックセグメンテーション

パノプティックセグメンテーション

  • セマンティックとインスタンスを統合
  • 各オブジェクトの個体に一意ラベル付与
  • 背景をピクセル単位で分類
PyTorch で学ぶ画像向け Deep Learning

データ注釈

image = Image.open("images/British_Shorthair_36.jpg")
mask = Image.open("annots/British_Shorthair_36.png")


transform = transforms.Compose([ transforms.ToTensor() ]) image_tensor = transform(image) mask_tensor = transform(mask)
print(f"""Image shape: {image_tensor.shape} Mask shape: {mask_tensor.shape}""")
    Image shape: torch.Size([3, 333, 500])
    Mask shape: torch.Size([1, 333, 500])

ブリティッシュショートヘアの写真

PyTorch で学ぶ画像向け Deep Learning

マスクの理解

  • データセットの注釈:

    ピクセル注釈: 1: 前景 2: 背景 3: 未分類

  • マスクの一意値:

    mask_tensor.unique()
    
    tensor([0.0039, 0.0078, 0.0118])
    
  • ピクセル値は 255 で割られている:

    • 1 / 255 = 0.0039 - オブジェクト
    • 2 / 255 = 0.0.0078 - 背景
    • 3 / 255 = 0.0118 - 未分類
PyTorch で学ぶ画像向け Deep Learning

二値マスクの作成

binary_mask = torch.where(
    mask_tensor == 1/255, 
    torch.tensor(1.0),
    torch.tensor(0.0),
)


to_pil_image = transforms.ToPILImage() mask = to_pil_image(binary_mask)
plt.imshow(mask)

セグメンテーションマスク

  • torch.where():
    • 条件
    • 条件成立時の値
    • それ以外の値
  • マスクをPIL画像に変換
  • マスク画像を表示
PyTorch で学ぶ画像向け Deep Learning

オブジェクトのセグメント化

object_tensor = image_tensor * binary_mask


to_pil_image = transforms.ToPILImage() object_image = to_pil_image(object_tensor)
plt.imshow(object_image)

セグメント化された画像

  • 画像に二値マスクを乗算
  • オブジェクトをPIL画像に変換
  • オブジェクト画像を表示
PyTorch で学ぶ画像向け Deep Learning

練習しましょう!

PyTorch で学ぶ画像向け Deep Learning

Preparing Video For Download...