图像分割之SAM(Segment Anything Model)

论文介绍了SegmentAnythingModel(SAM),一个能处理多种分割任务的模型,支持输入原图和多种提示信息。SAM由图片编码器、提示信息编码器和分割mask解码器组成,利用Transformer架构并结合大规模数据集SA-1B进行训练。SAM在交互式分割、边界检测等多个场景表现出色,但对细粒度分割和文本到mask任务仍有局限性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

论文:Segment Anything

Github:https://github.com/facebookresearch/segment-anything

论文从zero-shot主干网络的基础出发,提出了SAM(Segment Anything Model)模型。该模型有别于传统的分割模型。传统分割模型只能输入原图输出固定的分割结果,SAM在设计上可以同时输入原图和特定提示(点、框、阴影、文本),然后根据不同的提示输出不同的分割结果图,并且SAM支持不同提示的交互式分割。SAM可以适用于多种分割场景,包括交互式分割、边界检测、超分、物体生成、前景分割、语义分割、实例分割、全景分割等众多场景。另外为了训练SAM这种多模态的模型,论文在数据上也下足了功夫,论文贡献了大规模分割数据集SA-1B,包括10亿个mask和110w图片。

要使模型具备0样本迁移能力,需要从模型容量、数据集大小、整体训练这3方面下功夫。

因此论文就从task, model, data 3个方面进行了改进。

Task

在论文的交互式分割任务中,有的提示信息,比如点的提示,存在模棱两可的情况。为了解决这样的问题,SAM模型会同时输出3个分割结果,分别为全部(whole),部分(part), 局部(subpart)。

model

论文设计了包含多模态信息的SAM分割模型,模型在相关提示下预测分割mask大概耗时50ms。

SAM模型由图片编码器模块(image encoder)、提示信息编码器模块(prompt encoder)、分割mask解码器模块(mask decoder)3部分组成。

图片编码器模块基于Vision Transformer (ViT)主干网络实现。

提示信息编码器模块支持稀疏特征点、框、文本 (points, boxes, text) 和稠密特征阴影 (masks)。

对于点和框在提取embedding的时候加入了位置编码信息的embedding,然后将两者相加得到最终的embedding。对于文本信息的编码采用了clip模型。

对于阴影信息的编码通过conv实现,并最终和图片的编码特征相加。

分割mask解码器模块采用Transformer的解码器部分实现,并在后面接入动态的头部预测模块。同时在训练过程中,从图片到提示和从提示到图片都引入了自监督(self-attention)和跨监督(cross-attention)操作。 最后上采样图片的embedding,通过一个MLP模块,经线性分类器,得到最终的概率图。

Data engine

为了建立一个大规模的分割数据集,论文建立了一套数据制作的引擎。整个过程包含3个阶段,人工手动阶段(assisted-manual),半自动阶段(semi-automatic), 全自动阶段(fully automatic)。

人工手动阶段(assisted-manual):

该阶段标注过程和训练过程是同步进行的。需要人工在标注引擎上对mask进行标注,如果一个mask的标注时间超过30s就会放弃选择标注下一个图片。随着标注图片的增加和训练过程的进行,图片编码器的主干网络从ViT-B进化为ViT-H。这样的标注-训练迭代过程持续了6轮。最终每张图片的标注时间从34s降低为14s。每个图片中的mask数量从20个提升到44个。最终在该阶段收集到了4.3M mask和 120k image。

半自动阶段(semi-automatic):

该阶段主要目的是提高mask的多样性,从而提高模型的分割能力。由于标注过程更注重mask多样性的标注,所以该阶段的平均标注时间提升到了34s/图。每个图片中的mask数量从44提升到了72。在该阶段收集了5.9M mask和180k image。

全自动阶段(fully automatic):

该阶段使用模型进行全自动标注。每个图片会被设置32*32的网格点来覆盖图片中的所有物体。并且会通过iou来选择靠谱的mask,然后再进行NMS操作,从而得到最终的mask。

该阶段共收集到1.1B mask和 11M image。

Losses and training

训练过程采用focal loss 和 dice loss的线性组合作为最终loss。

训练过程中会根据mask随机采样不同的提示进行训练。

Dataset

大规模分割数据集SA-1B,包括10亿个mask和110w图片。相比同类分割数据集,多了400倍的mask。

Images

原始图片的分辨率为3300× 4950,考虑到存储和展示的必要,将图片都缩放到短边为1500像素。即使是这样,也比coco数据集的图片分辨率480× 640大很多。

Masks

通过数据引擎标注的图片具有很高的标注质量。

Mask quality

从所有数据中随机选取了500张图片以及对应的大概50000mask。让专家进行精细标注,然后和数据引擎标注的结果进行iou对比。结果是94%的图片iou超过90%,97%的图片iou超过75%。iou一致性基本在85-91%。

Mask properties

SA-1B覆盖了更广泛的图片区间,比第二大分割数据集多了11倍的图片400倍的mask。同时SA-1B包含了更多的小和中等的mask。通过mask轮廓的凹陷程度来分析mask的多样性,发现SA-1B和其他分割数据集拥有同样的mask多样性。

RAI Analysis

通过Responsible AI (RAI)分析,SA-1B覆盖了全世界各个角落的数据图片。同时在年龄、性别、肤色等维度也都没有各种歧视。表现出了更多的包容性More Inclusive Annotations for People (MIAP)。

 

实验结果:

在众多数据集上,SAM方法都优于RITM方法。

随着提示点的数量的增加,SAM的分割效果越来越高,随着提示点从1到9的增加,SAM方法和其他分割方法之间的gap越来越小。当提示点达到9个是,SAM的分割效果会略低于其他方法,这是因为SAM方法的设计初衷就不是一个高IOU的分割方法。

SAM方法在中型物体、大型物体、罕见物体、正常物体上的分割效果是优于其他分割方法的。

 

SAM可以实现基于文本的分割。同时在文本分割不准确的情况下,可以通过增加点的提示信息,来提升分割效果。

Limitations

SAM在细粒度的分割、非连续部件的分割上表现都较差。同时分割的边界也不够干净利落。

对于文本到mask的分割任务还在尝试探索阶段,尚不够鲁棒,具有很大的提升空间。

结论:

SAM首个提出在图像分割领域0样本迁移的基础模型(foundation models)的概念。也就是不需要任何实际使用场景的训练,该模型就可以直接进行分割推理。论文贡献了SAM分割模型和SA-1B分割数据集。

 

 

 

 

 

### 使用 Segment Anything Model (SAM) 实现摇杆图像的语义分割 #### SAM 的核心功能概述 Segment Anything Model (SAM) 是一种强大的通用分割模型,其设计目标是实现“一切的分割”,即它可以处理任意类型的对象并对其进行精确分割[^1]。相比于传统的语义分割方法仅关注预定义的对象类别,或者实例分割专注于区分不同实例,SAM 提供了一种更灵活的方式来进行分割。 当应用于摇杆图像时,SAM 不需要事先知道摇杆的具体形状或类别即可完成分割任务。这得益于它的提示机制(prompt-based mechanism),允许用户通过简单输入(如点、边界框或其他形式的提示)引导模型聚焦于感兴趣的区域。 --- #### 数据准备与环境搭建 为了使用 SAM 进行摇杆图像的语义分割,需先准备好必要的数据和工具: 1. **安装依赖库** 需要安装 PyTorch 和 SAM 官方提供的 Python 库 `segment_anything`。以下是安装命令: ```bash pip install torch torchvision pip install git+https://github.com/facebookresearch/segment-anything.git ``` 2. **下载模型权重文件** 下载官方发布的 SAM 模型权重文件(例如 `sam_vit_h_4b8939.pth` 或其他变体)。可以从 Facebook AI Research 的 GitHub 页面获取这些资源。 3. **加载模型** 加载 SAM 模型及其配置参数可以通过以下代码片段实现: ```python from segment_anything import sam_model_registry, SamPredictor model_type = "vit_h" # 可选:vit_b, vit_l, vit_h checkpoint_path = "path/to/sam_vit_h_4b8939.pth" device = "cuda" if torch.cuda.is_available() else "cpu" sam = sam_model_registry[model_type](checkpoint=checkpoint_path).to(device) predictor = SamPredictor(sam) ``` --- #### 输入提示与预测过程 对于摇杆图像的分割任务,可以采用如下方式设置提示并向 SAM 提供输入信息: 1. **读取图像** 将待分割的摇杆图像加载到内存中,并传递给 SAM 的预测器。 ```python image = cv2.imread("joystick_image.jpg") image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) predictor.set_image(image) ``` 2. **指定提示类型** 用户可以根据需求选择不同的提示模式,比如单击感兴趣区域内的某个位置作为点提示,或者绘制一个粗略包围摇杆的矩形框作为边界框提示。下面分别展示两种常见情况下的代码示例: - **基于点提示** 如果已知摇杆的大致中心位置,则可以直接向模型提供该点坐标。 ```python input_point = np.array([[x_center, y_center]]) # 替换为实际像素坐标 input_label = np.array([1]) # 表示此点属于前景 masks, scores, logits = predictor.predict( point_coords=input_point, point_labels=input_label, multimask_output=False ) ``` - **基于边界框提示** 当希望限定搜索范围至某一特定区域内时,可利用边界框代替点提示。 ```python bbox = np.array([xmin, ymin, xmax, ymax]) # 替换为真实值 mask, _, _ = predictor.predict(box=bbox, multimask_output=False) ``` 3. **可视化结果** 得到掩码后,可通过叠加显示原始图片与分割后的效果以便验证准确性。 ```python plt.figure(figsize=(10,10)) plt.imshow(image) show_mask(masks[0], plt.gca(), random_color=True) show_points(input_point, input_label, plt.gca()) plt.axis('off') plt.show() ``` 上述过程中提到的功能函数(如 `show_mask`, `show_points` 等辅助绘图工具)通常由开发者自行编写或参考官方文档中的实现版本。 --- #### 结果优化建议 尽管 SAM 已具备较强的泛化能力,但在某些复杂场景下仍可能遇到挑战。此时可以考虑调整以下几个方面来提升性能表现: - 增加更多样化的提示组合; - 对低质量输出重新运行迭代改进流程; - 利用额外训练样本微调基础网络结构以适应具体领域特性。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值