《博主简介》
小伙伴们好,我是阿旭。
专注于计算机视觉领域,包括目标检测、图像分类、图像分割和目标跟踪等项目开发,提供模型对比实验、答疑辅导等。
《------往期经典推荐------》
二、机器学习实战专栏【链接】 ,已更新31期,欢迎关注,持续更新中~~
三、深度学习【Pytorch】专栏【链接】
四、【Stable Diffusion绘画系列】专栏【链接】
五、YOLOv8改进专栏【链接】,持续更新中~~
六、YOLO性能对比专栏【链接】,持续更新中~
《------正文------》
目录
- 引言
- 基本步骤
- 1.导入需要的库
- 加载SAM3模型,并创建图像处理器
- 加载待处理图像
- 1.示例一:单正样本提示框-批量分割相似目标
-
- 添加并显示提示框
- [示例2:正负提示框组合 ------ 精准筛选目标](#示例2:正负提示框组合 —— 精准筛选目标)
- 更多示例
- 总结
引言
上一篇文章《【SAM3教程-1】SAM3 使用文本提示进行图像分割详细步骤与示例》详细介绍了如何使用SAM3通过文本进行图像中的目标一键分割,本文将介绍如何通过正/负样本提示框来获取图像中我们想要的相似目标。
基本步骤
使用SAM3进行正负样本提示框分割目标基本步骤如下:
- 环境准备:导入 torch、supervision 等依赖库,配置 GPU/CPU 运行环境;
- 模型加载:加载 SAM3 预训练模型与图像处理器,设置标注颜色调色板;
- 图像导入:上传待处理图像,完成预处理编码;
- 提示框标注:定义正负提示框坐标与标签(positive/negative);
- 一键分割:模型接收提示后自动推理,过滤低置信度结果,生成最终分割图。
1.导入需要的库
python
import torch
from sam3.model_builder import build_sam3_image_model
from sam3.model.sam3_image_processor import Sam3Processor
import supervision as sv
import matplotlib
matplotlib.use('TkAgg')
from PIL import Image
from typing import Optional
import numpy as np
加载SAM3模型,并创建图像处理器
python
# 定义用于标注的颜色调色板
COLOR = sv.ColorPalette.from_hex([
"#ffff00", "#ff9b00", "#ff8080", "#ff66b2", "#ff66ff", "#b266ff",
"#9999ff", "#3399ff", "#66ffff", "#33ff99", "#66ff66", "#99ff00"
])
# 设置运行设备:如果CUDA可用则使用GPU,否则使用CPU
DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
# 初始化图像模型并加载预训练权重
checkpoint_path = "models/sam3.pt" # 模型文件路径
bpe_path = "assets/bpe_simple_vocab_16e6.txt.gz" # BPE文件路径
image_model = build_sam3_image_model(
checkpoint_path=str(checkpoint_path),
bpe_path=str(bpe_path),
device=DEVICE
)
# 创建图像处理器实例
image_predictor = Sam3Processor(image_model, device=DEVICE)
加载待处理图像
python
image_path = "assets/images/test_image.jpg"
image = Image.open(image_path).convert('RGB')
inference_state = image_predictor.set_image(image) # 对图片进行预处理编码
image_predictor.reset_all_prompts(inference_state) # 重置所有提示

1.示例一:单正样本提示框-批量分割相似目标
添加并显示提示框
x1,y1,x2,y2分别表示提示框的左上角与右下角;
label表示提示框是正样本还是负样本,positive表示正样本;negative表示负样本;
python
# 添加的正样本提示框,label='positive'
boxes = [
{'x1': 362, 'y1': 289, 'x2': 493, 'y2': 654, 'label': 'positive'},
]
在原图上显示提示框位置,这里框选最左边男孩作为提示框进行提示
python
draw_boxes_on_image(image, boxes)

给模型添加提示框,并进行推理。
python
# 获取归一化后的正样本边界框
xyxy_positive = get_normalized_boxes(boxes, "positive", image.size)
# 向模型中添加检测框提示,并进行推理
for box in xyxy_positive:
inference_state = image_predictor.add_geometric_prompt(state=inference_state, box=box, label=True)
将SAM模型输出的结果转换为supervision库中的Detections对象,并过滤置信度底的对象;然后显示SAM3根据box提示的分割结果。
python
# 将模型输出转换为Detections对象,并过滤低置信度预测
detections = from_sam(sam_result=inference_state)
detections = detections[detections.confidence > 0.5]
# 在原始图像上绘制最终的分割结果
annotated_image = annotate(image, detections, label="target")
annotated_image

可以发现SAM3,根据提示框分割出了图像中的所有person对象。从图中的置信度大小可以发现由于框选的是男孩,因此SAM3分割出的结果中,男孩的置信度都在0.8以上,是高于女孩的。说明SAM3也很好的捕捉到了男孩与女孩这个属性。
那如果我们将其中一个女孩设置为负样本,那SAM3分割的结果会怎么样呢?下面一起看下。
示例2:正负提示框组合 ------ 精准筛选目标
设置一个正样本和一个负样本,正样本为最左边的男孩,正样本为左边的第一个女孩。
【注:正负样本可以添加多个提示框,以boxes列表的形式给出即可】
python
# 正负样本框
boxes = [
{'x1': 362, 'y1': 289, 'x2': 493, 'y2': 654, 'label': 'positive'},
{'x1': 498, 'y1': 307, 'x2': 589, 'y2': 635, 'label': 'negative'},
]
在原图上显示提示框位置,最左边男孩作为正样本,左侧第一个女孩作为负样本
python
draw_boxes_on_image(image, boxes)

分别获取正负样本边界框,并归一化处理成SAM3需要的格式,然后将正负样本添加到模型中.
python
# 获取归一化后的正负样本边界框
xyxy_positive = get_normalized_boxes(boxes, "positive", image.size)
xyxy_negatives = get_normalized_boxes(boxes, "negative", image.size)
# 向模型中添加几何提示(正样本与负样本)
for box in xyxy_positive:
inference_state = image_predictor.add_geometric_prompt(state=inference_state, box=box, label=True)
for box in xyxy_negatives:
inference_state = image_predictor.add_geometric_prompt(state=inference_state, box=box, label=False)
获取SAM3分割结果,并显示分割结果。
python
# 将模型输出转换为Detections对象,并过滤低置信度预测
detections = from_sam(sam_result=inference_state)
detections = detections[detections.confidence > 0.5]
# 在原始图像上绘制最终的分割结果
annotated_image = annotate(image, detections, label="target")
annotated_image

通过上面分割结果我们可以发现,SAM3根据正负样本提示,很好的分割出了图片中的所有男孩,而过滤掉了所有女孩对象。
更多示例
示例3:正样本框
原图:

设置并显示正样本提示框

根据提示框,使用SAM3进行目标分割结果:

示例4:正负样本
使用正负样本检测分割出褐色的鸡蛋,不要白色的鸡蛋。

设置提示框,并显示出提示框位置.将一个褐色的鸡蛋设为正样本,一个白色的鸡蛋设为负样本。

根据提示框,使用SAM3进行目标分割结果:

示例5:单正样本与多正样本
原图:

添加单个正样本框,并显示:

根据提示框,使用SAM3进行目标分割结果:

可以发现远处的很多车辆,并没有识别出来,因为远处的车辆与我们添加的样本特征相差较远,因此我们再多添加一个正样本框试下。通过添加多个正向提示框,来提升分割精度。
添加2个提示框,显示如下:

根据提示框,使用SAM3进行目标分割结果如下:

可以发现,通过多添加一个提示框,能够检测出更多的目标,例如左侧和右侧较小的车辆比之前多分割出了一些。但是由于遮挡原因,还是有一些车辆并没有检测出来。
总结
SAM3 依托灵活的提示框交互模式,实现了精准、高效的图像分割,其核心提示框类型、作用及用途可归纳如下:
一、核心提示框类型及作用
- 正提示框(Label=positive)
- 核心作用:指定需分割的目标区域,为模型提供 "待识别目标特征锚点"。模型会以正提示框内的目标特征为基准,自动在全图中匹配相似特征的对象,实现批量分割。
- 关键特性:支持单 / 多正提示框组合,单个正提示框可触发 "相似目标批量识别",多个正提示框可覆盖目标不同形态 / 角度特征,进一步提升分割精度与覆盖范围(如多正提示框标注不同位置的车辆,让模型更全面识别全图车辆)。
- 负提示框(Label=negative)
- 核心作用:标注需排除的干扰区域,为模型划定 "非目标特征边界"。模型会对比正、负提示框的特征差异,在分割时主动过滤与负提示框特征相似的对象,实现 "目标筛选 + 分割" 一体化。
- 关键特性:可与正提示框搭配使用,解决 "目标与干扰物特征相似" 的分割难题(如用负提示框标注白色鸡蛋,辅助正提示框精准分割褐色鸡蛋)。
二、提示框组合的核心用途与场景
- 单正提示框:高效批量分割相似目标
- 用途:无需逐一标注,只需框选 1 个目标,即可让模型自动识别全图中特征相似的同类对象,大幅降低操作成本。
- 适用场景:从人群中分割所有人物、从动物群中分割所有同类动物、从商品图中分割所有同款物品等 "批量提取同类目标" 场景。
- 正负提示框组合:精准筛选特定目标
- 用途:在 "目标与干扰物共存" 的复杂场景中,通过正提示框锁定目标、负提示框排除干扰,实现 "精准筛选 + 分割",避免误分割或漏分割。
- 适用场景:从 "男孩 + 女孩" 混合人群中只分割男孩、从 "褐色鸡蛋 + 白色鸡蛋" 中只分割褐色鸡蛋、从 "合格产品 + 瑕疵产品" 中只分割合格产品等 "目标筛选" 场景。
- 多正提示框:优化复杂目标分割精度
- 用途:当目标存在形态差异(如不同角度的车辆、不同姿态的人物)时,通过多个正提示框标注不同特征的目标,让模型学习更全面的目标特征,提升分割准确率与覆盖度。
- 适用场景:从多角度车辆图中分割所有车辆、从动态人物图中分割所有姿态的人物等 "目标特征多样" 场景。
综上,SAM3 通过正、负提示框的灵活搭配,既解决了 "批量分割效率低" 的问题,又攻克了 "复杂场景下目标筛选难" 的痛点,可广泛应用于设计抠图、数据统计、工业检测、科研分析等多类图像分割需求,兼顾专业性与易用性。

好了,这篇文章就介绍到这里,喜欢的小伙伴感谢给点个赞和关注,更多精彩内容持续更新~~
关于本篇文章大家有任何建议或意见,欢迎在评论区留言交流!