计算机视觉实战|Mask2Former实战:轻松掌握全景分割、实例分割与语义分割

一、引言

上一篇文章《计算机视觉|Mask2Former:开启实例分割新范式》,我们学习了 Mask2Former 的框架原理、优缺点以及应用领域。今天要带大家一起探索一个强大的图像分割工具——Mask2Former。作为一名技术博主,我的目标是让复杂的概念变得简单易懂,即使你是刚入门的小白,也能通过这篇文章学会使用 Mask2Former 进行 全景分割实例分割语义分割。我会用通俗的语言一步步讲解,还会提供实际操作代码,让你马上上手!

Mask2Former 是一个多功能的图像分割模型,它能同时处理三种任务:全景分割、实例分割和语义分割。听起来是不是有点高大上?其实它就像一个“万能的图像分析师”,能帮你轻松搞定图像中的物体识别和分割。

举个例子:想象你有一张照片,里面有几只猫在草地上玩耍。Mask2Former 可以:

  • 告诉你哪些像素是“”,哪些是“草地”(语义分割);
  • 区分出每只猫的具体位置和轮廓(实例分割);
  • 把照片里所有的猫和背景都分割出来,每只猫和背景都有自己的区域(全景分割)。

这篇文章将带你从基础概念到实战操作,学会如何使用 Mask2Former 处理图像分割任务


二、分割任务简介

在进入实战之前,我们先简单了解一下这三种分割任务的区别,用生活化的例子帮你快速get到重点。

2.1 语义分割

语义分割的目标是为图像中的每一个像素打上类别标签。比如在一张街景照片中,它会标记出“道路”、“行人”、“树木”等区域。但它不会区分同一个类别中的不同个体——如果有两辆车,它只会告诉你这些像素都是“车”,不会分开标记。

举例照片里有三只猫,语义分割会告诉你哪些地方是“猫”,哪些是“背景”,但不会告诉你哪只猫是哪只。

2.2 实例分割

实例分割比语义分割更进一步,它不仅知道像素属于哪个类别,还能区分出同一个类别中的不同个体。还是那张猫的照片,实例分割会把三只猫分别标记为“猫1”、“猫2”、“猫3”,并为每只猫画出单独的轮廓。

举例就像你在照片里给每只猫贴上名字,还画出它们的具体形状。

2.3 全景分割

全景分割是语义分割和实例分割的“合体”。它会把图像中的所有物体(包括背景)都分割出来,并为每个物体和背景区域分配唯一的标签。简单来说,它既能识别类别,又能区分个体,还包括背景。

举例在猫的照片中,全景分割会把每只猫和草地都分割出来,每只猫有自己的轮廓,草地也有自己的区域,就像一张完整的“分割地图”。


三、 Mask2Former原理简介

Mask2Former 是基于 Transformer 架构的模型,它用了一种叫做“掩码分类”的方法。了解具体架构可以看之前的文章:《计算机视觉|Mask2Former:开启实例分割新范式》

听起来有点复杂?别急,我来用简单的比喻解释一下。

Mask2Former 的工作方式就像一个聪明的画家:

  1. 它先在图像上画出一堆区域(这些区域叫“掩码”),每个掩码可能对应一个物体或背景。
  2. 然后,它会判断每个区域是什么,比如“这个区域是猫,那个区域是草地”。

它的厉害之处在于,这一个模型就能同时搞定全景分割、实例分割和语义分割,只需要在最后处理结果时稍微调整一下就行。这样既省事又高效!


四、 实战操作:使用Mask2Former进行图像分割

好了,现在进入最激动人心的部分——实战操作!我将教你如何用 Mask2Former 对一张图像进行分割。你不需要高端GPU,也不需要深厚的编程基础,只需一台普通电脑和一些简单的Python代码,就能体验它的强大功能。

4.1 准备工作

首先,你需要在电脑上安装几个Python库:

  • transformers:Hugging Face 提供的库,包含 Mask2Former 模型。
  • torch:PyTorch 库,Mask2Former 的运行基础。
  • pillow:用于处理图像。

打开终端或命令行,输入以下命令安装:

pip install transformers torch pillow

4.2 加载预训练模型和处理器

Hugging Face 提供了 Mask2Former 的预训练模型,我们可以直接用。下面以全景分割为例:

from transformers import Mask2FormerForUniversalSegmentation, Mask2FormerImageProcessor

# 加载预训练模型和处理器
## 1. 全景分割
panoptic_model = Mask2FormerForUniversalSegmentation.from_pretrained("facebook/mask2former-swin-base-coco-panoptic")
panoptic_processor = Mask2FormerImageProcessor.from_pretrained("facebook/mask2former-swin-base-coco-panoptic")

## 2. 语义分割
semantic_model = Mask2FormerForUniversalSegmentation.from_pretrained("facebook/mask2former-swin-base-ade-semantic")
semantic_processor = Mask2FormerImageProcessor.from_pretrained("facebook/mask2former-swin-base-ade-semantic")

## 3. 实例分割
instance_model = Mask2FormerForUniversalSegmentation.from_pretrained("facebook/mask2former-swin-large-coco-instance")
instance_processor = Mask2FormerImageProcessor.from_pretrained("facebook/mask2former-swin-large-coco-instance")

代码解释

  • model:加载 Mask2Former 模型,用于分割任务。
  • processor:加载图像处理器,负责把图像变成模型能理解的格式。

4.3 加载图像

准备一张你想分割的图片,可以是网上的图片,也可以是你自己拍的照片。例如:猫、狗、风景都可以。

url = 'http://images.cocodataset.org/val2017/000000039769.jpg'
image = Image.open(requests.get(url, stream=True).raw)

这里我们使用一张网络图片。

原图

4.4 预处理图像

在输入模型之前,我们需要用处理器对图像进行预处理,比如调整大小、标准化等。

# 预处理图像
## 全景分割
panoptic_inputs = panoptic_processor(images=image, return_tensors="pt")
## 语义分割
semantic_inputs = semantic_processor(images=image, return_tensors="pt")
## 实例分割
instance_inputs = instance_processor(images=image, return_tensors="pt")

代码解释:这一步把图像转换成 PyTorch 张量,方便模型处理。

4.5 模型推理

接下来,把预处理后的图像输入模型,得到分割结果。

import torch

# 模型推理
## 全景分割
with torch.no_grad():
    panoptic_outputs = panoptic_model(**panoptic_inputs)
## 语义分割
with torch.no_grad():
    semantic_outputs = semantic_model(**semantic_inputs)
## 实例分割    
with torch.no_grad():
    instance_outputs = instance_model(**instance_inputs)

代码解释

  • with torch.no_grad():在推理时用这个,可以节省内存。
  • model(**inputs):把图像输入模型,得到原始输出。

4.6 后处理

模型的输出是原始数据,我们需要后处理一下,才能得到最终的分割结果。

# 后处理
## 全景分割
panoptic_result = panoptic_processor.post_process_panoptic_segmentation(panoptic_outputs, target_sizes=[image.size[::-1]])[0]
## 语义分割
semantic_seg = semantic_processor.post_process_semantic_segmentation(semantic_outputs, target_sizes=[image.size[::-1]])[0]
## 实例分割
instance_result = instance_processor.post_process_instance_segmentation(instance_outputs, target_sizes=[image.size[::-1]], threshold=0.9)[0]

代码解释

  • post_process_panoptic_segmentation:把模型输出转换成全景分割结果。
  • target_sizes:确保输出的掩码大小和原图一致。
  • threshold : 用于控制 置信度筛选,也就是说,只有 置信度高于该阈值 的实例才会被保留下来。

4.7 可视化结果

为了看到分割效果,我们需要把结果变成一张彩色的图片。这里用简单的可视化代码:

import numpy as np
import matplotlib.pyplot as plt

# 全景分割
panoptic_seg = panoptic_result["segmentation"]
panoptic_visualization = np.zeros((panoptic_seg.shape[0], panoptic_seg.shape[1], 3), dtype=np.uint8)
for segment in panoptic_result["segments_info"]:
    segment_id = segment["id"]
    color = np.random.randint(0, 255, size=3)
    panoptic_visualization[panoptic_seg == segment_id] = color
    
# 语义分割
semantic_visualization = np.zeros((semantic_seg.shape[0], semantic_seg.shape[1], 3), dtype=np.uint8)
unique_labels = torch.unique(semantic_seg)
for label in unique_labels:
    color = np.random.randint(0, 255, size=3)
    semantic_visualization[semantic_seg == label] = color
    
# 实例分割
instance_visualization = np.zeros((instance_seg.shape[0], instance_seg.shape[1], 3), dtype=np.uint8)
for i in range(len(instance_result["segments_info"])):
    mask = instance_seg == i
    color = np.random.randint(0, 255, size=3)
    instance_visualization[mask] = color

# 4. 可视化
fig, axs = plt.subplots(2, 2, figsize=(10, 10))

# 原图
axs[0, 0].imshow(image)
axs[0, 0].set_title("Original Image")
axs[0, 0].axis('off')

# 全景分割
axs[0, 1].imshow(panoptic_visualization)
axs[0, 1].set_title("Panoptic Segmentation")
axs[0, 1].axis('off')

# 语义分割
axs[1, 0].imshow(semantic_visualization)
axs[1, 0].set_title("Semantic Segmentation")
axs[1, 0].axis('off')

# 实例分割
axs[1, 1].imshow(instance_visualization)
axs[1, 1].set_title("Instance Segmentation")
axs[1, 1].axis('off')

plt.tight_layout()
plt.show()

代码解释

  • panoptic_seg:分割掩码,每个像素值对应一个区域的ID。
  • segments_info:包含每个区域的类别信息。
  • 我们为每个区域随机分配颜色,然后显示出来

运行这段代码,你会看到一张彩色的分割结果图(如下图所示),每个物体和背景都有不同的颜色。

在这里插入图片描述


五、 总结

通过这篇文章,你已经学会了如何使用 Mask2Former 进行图像分割。从基础概念到代码实战,小白也能轻松入门!
希望这篇分享能帮到你!如果有任何问题,欢迎留言交流。快去试试吧,用 Mask2Former 解锁图像分割的乐趣!

具体用法可以参考 Hugging Face 文档


延伸阅读


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

紫雾凌寒

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值