模型介绍

一. 模型简介:

SAM(Segment Anything Model)是Meta AI于2023年推出的通用图像分割模型,通过大规模训练(1100万张图像+11亿掩码)实现零样本分割,支持点、框、文本等交互提示,无需微调即可分割任意对象。其核心基于ViT编码器、提示编码器和掩码解码器,兼具强泛化能力和多场景适用性(如医疗、遥感),但复杂边缘处理和高算力需求仍是挑战。

二. 模型原理:

  • 图像蓝图提取:
    模型首先使用图像编码器(通常是基于 Vision Transformer)将输入图像转换成一个高维特征图,也就是所谓的蓝图。这个蓝图保留了图像中的全局和局部视觉信息,相当于一张建筑的平面图,详细描述了图像各处的纹理、形状和边缘信息。
  • 提示信息编码:
    在训练和推理时,用户或系统会提供一些提示,例如点、框或者其他几何形状。提示编码器负责将这些提示转换为特征向量,就像是在平面图上标记出特定区域。这个过程帮助模型确定哪些区域是重点关注的。
  • 掩膜生成:
    最后,掩膜解码器将图像蓝图与提示特征融合,学习如何根据两者之间的对应关系生成准确的分割掩膜。训练过程中,通过大量实例及相应的损失函数(如交叉熵、Dice Loss等),模型不断优化,从而更好地将提示和图像信息拟合到掩膜输出上。

简单来说,就是通过蓝图+提示这一过程,模型学会了把图像中的特征与提示的位置、尺度等信息关联起来,并最终生成与真实分割掩膜高度吻合的输出。SAM 模型的核心本质就是利用图像编码器生成富含全局和局部信息的蓝图,再结合提示编码器提取的用户输入(如点或框)信息,通过掩膜解码器将二者融合,从而拟合出精准的分割掩膜,形成图像蓝图 + 提示 = 掩膜的关系。


安装部署

git clone git@github.com:facebookresearch/segment-anything.git
cd segment-anything; pip install -e .   
pip install opencv-python pycocotools matplotlib onnxruntime onnx

安装完毕后,可选择下载 vit_b模型权重文件: ViT-B SAM model.


图像分割简单示例

python scripts/amg.py
--checkpoint /Users/pengzhang/segment-anything/model/sam_vit_b_01ec64.pth
--model-type vit_b
--input /Users/pengzhang/segment-anything/input_imgs
--output /Users/pengzhang/segment-anything/output_imgs
--device cpu

Sam模型工程目录下的scripts/amg.py文件详解了命令参数
–checkpoint:权重文件路径
–model-type:模型类型,参考Model Checkpoints
–input:输入图片文件夹
–output:输出图片文件夹 –device:由于部署机器是macbook air,因此选择cpu


自定义图像分割

SamAutomaticMaskGenerator 的核心参数通过控制采样密度、候选掩膜过滤、裁剪分块及后处理等环节,共同决定分割结果的精细度和连贯性:

  • 采样参数(如points_per_side和points_per_batch):决定图像上采样点的分布和批处理量,影响候选掩膜的覆盖范围和细节捕捉能力。
  • 质量过滤参数(如pred_iou_thresh、stability_score_thresh与 box_nms_thresh):设定候选掩膜的保留标准,以确保只输出准确、稳定且去重的掩膜。
  • 裁剪与后处理参数(如crop_n_layers、crop_overlap_ratio、crop_n_points_downscale_factor和min_mask_region_area):用于处理高分辨率或复杂场景,将图像分块后有效整合、过滤噪声,保障整体分割效果。
import numpy as np
import torch
import matplotlib.pyplot as plt
import cv2
import sys
sys.path.append("..")
from segment_anything import sam_model_registry, SamAutomaticMaskGenerator, SamPredictor

# 读取图片
image = cv2.imread('images/groceries.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

# 初始化模型
sam_checkpoint = r"../model/sam_vit_b_01ec64.pth"
model_type = "vit_b"
device = 'cpu' # "cuda"
sam = sam_model_registry[model_type](checkpoint=sam_checkpoint)
sam.to(device=device)

# 图像分割
mask_generator = SamAutomaticMaskGenerator(
    model=sam,
    points_per_side=32,
    pred_iou_thresh=0.86,
    stability_score_thresh=0.92,
    crop_n_layers=1,
    crop_n_points_downscale_factor=2,
    min_mask_region_area=100,  # Requires open-cv to run post-processing
)
masks = mask_generator.generate(image)

# 分割结果可视化
plt.figure(figsize=(20,20))
plt.imshow(image)
show_anns(masks2)
plt.axis('off')
plt.show()


模型展望

SAM模型专注于类无关分割,它根据图像的视觉特征生成掩膜,因此即便同一类别的目标也可能被划分成多个区域并以不同颜色显示;如果需要实现语义归类,则通常需要在SAM分割后结合语义分类或聚类等后处理步骤。

利用SAM对遥感图像进行类无关分割,然后通过语义分类、特征提取或聚类方法对分割结果按对象归类合并,是一个有潜力的策略,但其成功依赖于后处理步骤对遥感图像复杂特性的有效适配和实验验证。另外,默认情况下,SAM模型是在大量RGB图像上训练的,其输入就是三通道图像。如果需要处理多通道(例如遥感多光谱)图像,通常需要先做预处理(比如选择关键波段或将多通道数据转换为 3 通道形式),或者修改模型的输入层并进行适当的微调和重新训练。


参考文献

segment-anything
基于SAM模型的大幅面遥感影像建筑物提取研究
分割一切模型SAM的潜力与展望:综述
SAM在遥感影像通用语义分割中的应用