图像分割简介

使用 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...