“把图片里这一件物体分出来”需要明确主体。SAM 可以接收点提示,输出像素掩码;智能体若只收到一句“抠出它”而没有坐标或明确对象,就容易选错主体。本文先建立图片加点坐标的分割工具输入,再把候选掩码还原为原图尺寸。
准备输入:点要落在目标内部
适合希望给工作流增加交互分割工具的开发者。准备 photo.jpg,查看其像素尺寸,记下主体内部一点的 x、y。左上角为原点,向右是 x、向下是 y;检查坐标没有超出图片。该点表示希望包含的前景,本例标签 1 是正提示。

python -m pip install torch "transformers==4.57.1" pillow numpy
示例使用 facebook/sam-vit-base 和 CPU。首次加载需下载权重,内存与耗时要按设备验证。本文未运行 SAM 模型推理,下面不是某张客户图片的分割实测。
生成并保存原图尺寸的掩码
把代码保存为 segment_point.py;将 point 替换为你记录的主体内部坐标,然后运行 python segment_point.py。默认中心点只方便演示,并不保证落在目标上。
from PIL import Image
import numpy as np
import torch
from transformers import SamModel, SamProcessor
name = "facebook/sam-vit-base"
processor = SamProcessor.from_pretrained(name)
model = SamModel.from_pretrained(name).eval()
image = Image.open("photo.jpg").convert("RGB")
w, h = image.size
# Replace this center point with a point inside your intended object.
point = [w // 2, h // 2]
inputs = processor(image, input_points=[[point]], input_labels=[[1]],
return_tensors="pt")
with torch.inference_mode():
outputs = model(**inputs)
masks = processor.image_processor.post_process_masks(
outputs.pred_masks.cpu(), inputs["original_sizes"].cpu(),
inputs["reshaped_input_sizes"].cpu())
scores = outputs.iou_scores[0, 0].cpu()
best = int(scores.argmax())
mask = masks[0][0, best].numpy().astype(np.uint8) * 255
assert mask.shape == (h, w)
Image.fromarray(mask).save("mask.png")
print("point", point, "mask", mask.shape, "predicted_iou", float(scores[best]))
不要把模型估计分数当成真值
打开 mask.png,应为黑底白色主体的掩码,尺寸与 photo.jpg 相同。把白色区域半透明叠在原图上,检查点处是否被包含、邻近物体是否粘连、细长边缘是否丢失。尺寸断言通过只是坐标还原通过,不能替代轮廓检查。
predicted_iou 是模型对掩码质量的估计,不是与人工真值计算出的 IoU。若选错主体,先移动点到明确的前景内部;若相邻对象粘连,再按文档增加负提示点,不以提高分数替代人工确认。
作为智能体工具时的输入与输出
输入至少保留图片编号、原图宽高和点坐标;输出保留掩码文件路径、候选序号及质量估计。对越界点直接报输入错误,模糊或遮挡图片交回用户确认。本例只提供分割算子,实际工具注册、权限和会话状态由接入平台负责。
SAM 的点提示掩码不自动给出物体类别。需要逐像素类别名称的是语义分割任务,不应把这张掩码当成所有类别的标注。
资料与适用范围
本文依据 2026 年 10 月 1 日读取的项目资料编写。安装后请记录实际依赖版本;版本升级时先用小样本核对接口和输出。
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/30641.html