影像分割入門

使用 PyTorch 進行影像深度學習

Michal Oleszak

Machine Learning Engineer

影像分割

  • 影像分割在像素層級將影像切成多個區塊
  • 影像中的每個像素都被指派到某個區塊
  • 三種分割方式:
    • 語意分割
    • 實例分割
    • 全景分割
使用 PyTorch 進行影像深度學習

語意分割

語意分割

  • 將每個像素分類到一個類別
  • 同一類別的所有像素視為相同
使用 PyTorch 進行影像深度學習

實例分割

實例分割

  • 區分同一類別中的不同實例
  • 背景常不會被分割
使用 PyTorch 進行影像深度學習

全景分割

全景分割

  • 結合語意分割與實例分割
  • 為每個物件實例指派唯一標籤
  • 在像素層級分類背景
使用 PyTorch 進行影像深度學習

資料標註

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 進行影像深度學習

理解遮罩

  • 資料集文件:

    像素標註: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 進行影像深度學習

建立二元遮罩

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 進行影像深度學習

物件分割

object_tensor = image_tensor * binary_mask


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

分割後影像

  • 影像與二元遮罩相乘
  • 將物件轉為 PIL 影像
  • 顯示物件影像
使用 PyTorch 進行影像深度學習

一起來練習吧!

使用 PyTorch 進行影像深度學習

Preparing Video For Download...