【SAM3教程-2】使用正负样本提示框一键分割图片中的相似目标详细步骤与示例

《博主简介》

小伙伴们好,我是阿旭。
专注于计算机视觉领域,包括目标检测、图像分类、图像分割和目标跟踪等项目开发,提供模型对比实验、答疑辅导等。

《------往期经典推荐------》

一、AI应用软件开发实战专栏【链接】

项目名称 项目名称
1.【人脸识别与管理系统开发 2.【车牌识别与自动收费管理系统开发
3.【手势识别系统开发 4.【人脸面部活体检测系统开发
5.【图片风格快速迁移软件开发 6.【人脸表表情识别系统
7.【YOLOv8多目标识别与自动标注软件开发 8.【基于深度学习的行人跌倒检测系统
9.【基于深度学习的PCB板缺陷检测系统 10.【基于深度学习的生活垃圾分类目标检测系统
11.【基于深度学习的安全帽目标检测系统 12.【基于深度学习的120种犬类检测与识别系统
13.【基于深度学习的路面坑洞检测系统 14.【基于深度学习的火焰烟雾检测系统
15.【基于深度学习的钢材表面缺陷检测系统 16.【基于深度学习的舰船目标分类检测系统
17.【基于深度学习的西红柿成熟度检测系统 18.【基于深度学习的血细胞检测与计数系统
19.【基于深度学习的吸烟/抽烟行为检测系统 20.【基于深度学习的水稻害虫检测与识别系统
21.【基于深度学习的高精度车辆行人检测与计数系统 22.【基于深度学习的路面标志线检测与识别系统
23.【基于深度学习的智能小麦害虫检测识别系统 24.【基于深度学习的智能玉米害虫检测识别系统
25.【基于深度学习的200种鸟类智能检测与识别系统 26.【基于深度学习的45种交通标志智能检测与识别系统
27.【基于深度学习的人脸面部表情识别系统 28.【基于深度学习的苹果叶片病害智能诊断系统
29.【基于深度学习的智能肺炎诊断系统 30.【基于深度学习的葡萄簇目标检测系统
31.【基于深度学习的100种中草药智能识别系统 32.【基于深度学习的102种花卉智能识别系统
33.【基于深度学习的100种蝴蝶智能识别系统 34.【基于深度学习的水稻叶片病害智能诊断系统
35.【基于与ByteTrack的车辆行人多目标检测与追踪系统 36.【基于深度学习的智能草莓病害检测与分割系统
37.【基于深度学习的复杂场景下船舶目标检测系统 38.【基于深度学习的农作物幼苗与杂草检测系统
39.【基于深度学习的智能道路裂缝检测与分析系统 40.【基于深度学习的葡萄病害智能诊断与防治系统
41.【基于深度学习的遥感地理空间物体检测系统 42.【基于深度学习的无人机视角地面物体检测系统
43.【基于深度学习的木薯病害智能诊断与防治系统 44.【基于深度学习的野外火焰烟雾检测系统
45.【基于深度学习的脑肿瘤智能检测系统 46.【基于深度学习的玉米叶片病害智能诊断与防治系统
47.【基于深度学习的橙子病害智能诊断与防治系统 48.【基于深度学习的车辆检测追踪与流量计数系统
49.【基于深度学习的行人检测追踪与双向流量计数系统 50.【基于深度学习的反光衣检测与预警系统
51.【基于深度学习的危险区域人员闯入检测与报警系统 52.【基于深度学习的高密度人脸智能检测与统计系统
53.【基于深度学习的CT扫描图像肾结石智能检测系统 54.【基于深度学习的水果智能检测系统
55.【基于深度学习的水果质量好坏智能检测系统 56.【基于深度学习的蔬菜目标检测与识别系统
57.【基于深度学习的非机动车驾驶员头盔检测系统 58.【太基于深度学习的阳能电池板检测与分析系统
59.【基于深度学习的工业螺栓螺母检测 60.【基于深度学习的金属焊缝缺陷检测系统
61.【基于深度学习的链条缺陷检测与识别系统 62.【基于深度学习的交通信号灯检测识别
63.【基于深度学习的草莓成熟度检测与识别系统 64.【基于深度学习的水下海生物检测识别系统
65.【基于深度学习的道路交通事故检测识别系统 66.【基于深度学习的安检X光危险品检测与识别系统
67.【基于深度学习的农作物类别检测与识别系统 68.【基于深度学习的危险驾驶行为检测识别系统
69.【基于深度学习的维修工具检测识别系统 70.【基于深度学习的维修工具检测识别系统
71.【基于深度学习的建筑墙面损伤检测系统 72.【基于深度学习的煤矿传送带异物检测系统
73.【基于深度学习的老鼠智能检测系统 74.【基于深度学习的水面垃圾智能检测识别系统
75.【基于深度学习的遥感视角船只智能检测系统 76.【基于深度学习的胃肠道息肉智能检测分割与诊断系统
77.【基于深度学习的心脏超声图像间隔壁检测分割与分析系统 78.【基于深度学习的心脏超声图像间隔壁检测分割与分析系统
79.【基于深度学习的果园苹果检测与计数系统 80.【基于深度学习的半导体芯片缺陷检测系统
81.【基于深度学习的糖尿病视网膜病变检测与诊断系统 82.【基于深度学习的运动鞋品牌检测与识别系统
83.【基于深度学习的苹果叶片病害检测识别系统 84.【基于深度学习的医学X光骨折检测与语音提示系统
85.【基于深度学习的遥感视角农田检测与分割系统 86.【基于深度学习的运动品牌LOGO检测与识别系统
87.【基于深度学习的电瓶车进电梯检测与语音提示系统 88.【基于深度学习的遥感视角地面房屋建筑检测分割与分析系统
89.【基于深度学习的医学CT图像肺结节智能检测与语音提示系统 90.【基于深度学习的舌苔舌象检测识别与诊断系统
91.【基于深度学习的蛀牙智能检测与语音提示系统 92.【基于深度学习的皮肤癌智能检测与语音提示系统
93.【基于深度学习的工业压力表智能检测与读数系统 94.【基于深度学习的CT扫描图像肝脏肿瘤智能检测与分析系统】
95.【基于深度学习的CT扫描图像脑肿瘤智能检测与分析系统】 96.【基于深度学习的甲状腺结节智能检测分割与诊断系统】

二、机器学习实战专栏【链接】 ,已更新31期,欢迎关注,持续更新中~~
三、深度学习【Pytorch】专栏【链接】
四、【Stable Diffusion绘画系列】专栏【链接】
五、YOLOv8改进专栏【链接】持续更新中~~
六、YOLO性能对比专栏【链接】,持续更新中~

《------正文------》

目录

引言

上一篇文章《【SAM3教程-1】SAM3 使用文本提示进行图像分割详细步骤与示例》详细介绍了如何使用SAM3通过文本进行图像中的目标一键分割,本文将介绍如何通过正/负样本提示框来获取图像中我们想要的相似目标。

基本步骤

使用SAM3进行正负样本提示框分割目标基本步骤如下:

  1. 环境准备:导入 torch、supervision 等依赖库,配置 GPU/CPU 运行环境;
  2. 模型加载:加载 SAM3 预训练模型与图像处理器,设置标注颜色调色板;
  3. 图像导入:上传待处理图像,完成预处理编码;
  4. 提示框标注:定义正负提示框坐标与标签(positive/negative);
  5. 一键分割:模型接收提示后自动推理,过滤低置信度结果,生成最终分割图。

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 依托灵活的提示框交互模式,实现了精准、高效的图像分割,其核心提示框类型、作用及用途可归纳如下:

一、核心提示框类型及作用

  1. 正提示框(Label=positive)
    • 核心作用:指定需分割的目标区域,为模型提供 "待识别目标特征锚点"。模型会以正提示框内的目标特征为基准,自动在全图中匹配相似特征的对象,实现批量分割。
    • 关键特性:支持单 / 多正提示框组合,单个正提示框可触发 "相似目标批量识别",多个正提示框可覆盖目标不同形态 / 角度特征,进一步提升分割精度与覆盖范围(如多正提示框标注不同位置的车辆,让模型更全面识别全图车辆)。
  2. 负提示框(Label=negative)
    • 核心作用:标注需排除的干扰区域,为模型划定 "非目标特征边界"。模型会对比正、负提示框的特征差异,在分割时主动过滤与负提示框特征相似的对象,实现 "目标筛选 + 分割" 一体化。
    • 关键特性:可与正提示框搭配使用,解决 "目标与干扰物特征相似" 的分割难题(如用负提示框标注白色鸡蛋,辅助正提示框精准分割褐色鸡蛋)。

二、提示框组合的核心用途与场景

  1. 单正提示框:高效批量分割相似目标
    • 用途:无需逐一标注,只需框选 1 个目标,即可让模型自动识别全图中特征相似的同类对象,大幅降低操作成本。
    • 适用场景:从人群中分割所有人物、从动物群中分割所有同类动物、从商品图中分割所有同款物品等 "批量提取同类目标" 场景。
  2. 正负提示框组合:精准筛选特定目标
    • 用途:在 "目标与干扰物共存" 的复杂场景中,通过正提示框锁定目标、负提示框排除干扰,实现 "精准筛选 + 分割",避免误分割或漏分割。
    • 适用场景:从 "男孩 + 女孩" 混合人群中只分割男孩、从 "褐色鸡蛋 + 白色鸡蛋" 中只分割褐色鸡蛋、从 "合格产品 + 瑕疵产品" 中只分割合格产品等 "目标筛选" 场景。
  3. 多正提示框:优化复杂目标分割精度
    • 用途:当目标存在形态差异(如不同角度的车辆、不同姿态的人物)时,通过多个正提示框标注不同特征的目标,让模型学习更全面的目标特征,提升分割准确率与覆盖度。
    • 适用场景:从多角度车辆图中分割所有车辆、从动态人物图中分割所有姿态的人物等 "目标特征多样" 场景。

综上,SAM3 通过正、负提示框的灵活搭配,既解决了 "批量分割效率低" 的问题,又攻克了 "复杂场景下目标筛选难" 的痛点,可广泛应用于设计抠图、数据统计、工业检测、科研分析等多类图像分割需求,兼顾专业性与易用性。


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

相关推荐
阿_旭2 天前
【SAM3教程-1】SAM3 使用文本提示进行图像分割详细步骤与示例【附源码】
sam3
阿_旭3 天前
SAM3分割一切大模型中BPE文件bpe_simple_vocab_16e6.txt.gz是什么?有什么作用?
sam3