SAM 3 作为 Meta 推出的新一代概念分割模型,已集成到 Ultralytics 8.3.237 及以上版本,支持文本提示、图像示例提示、视频跟踪等核心功能。其调用需先完成环境配置,再根据具体任务选择对应预测器接口,以下是详细步骤和示例:
一、前置准备
1. 环境安装与升级
确保 Ultralytics 版本符合要求,通过 pip 安装或升级:
pip install -U ultralytics
2. 模型权重与依赖文件下载
SAM 3 需手动下载核心文件,否则无法正常运行:
- 模型权重:从modelscope 模型库下载
sam3.pt,下载链接 :https://modelscope.cn/models/facebook/sam3/resolve/master/sam3.pt - 放置在工作目录或调用时指定绝对路径。
- 文本编码依赖(仅文本提示需用):从 gitcode 资源库下载 BPE 词汇文件
bpe_simple_vocab_16e6.txt.gz,用于文本提示的编码处理。下载链接: - CLIP4Clip/modules/bpe_simple_vocab_16e6.txt.gz · cl/CLIP4Clip - AtomGit | GitCode
二、核心调用场景与示例
SAM 3 支持 概念分割(PCS)、视觉分割(PVS,兼容 SAM 2 风格)、视频跟踪 三大核心场景,对应不同的预测器类,以下分场景详解 (这里受限于文章篇幅,只介绍部分用法,具体请参考官网 链接如下:SAM 3: Segment Anything with Concepts - Ultralytics YOLO Docs):
场景 1:概念分割(PCS)—— 文本提示
通过简单名词短语(如 "person"、"yellow school bus")分割图像中所有匹配概念的实例,需使用 SAM3SemanticPredictor 接口。
调用步骤:
- 导入预测器类;
- 初始化配置(指定模型权重、BPE 词汇路径、置信度等);
- 设置待处理图像;
- 输入文本提示并执行分割。
from ultralytics.models.sam import SAM3SemanticPredictor
# 1. 初始化预测器(配置参数可按需调整)
overrides = dict(
conf=0.25, # 置信度阈值,默认0.25
task="segment", # 任务类型:分割
mode="predict", # 运行模式:预测
model="sam3.pt", # 模型权重路径(相对/绝对路径)
half=True, # 启用FP16精度,提升推理速度(需GPU支持)
)
predictor = SAM3SemanticPredictor(
overrides=overrides,
bpe_path="path/to/bpe_simple_vocab_16e6.txt.gz" # 文本编码依赖文件路径
)
# 2. 设置待分割图像(一次设置可多次查询)
predictor.set_image("path/to/image.jpg") # 替换为实际图像路径
# 3. 执行分割(支持多文本提示、描述性短语)
# 示例1:多概念同时分割
results = predictor(text=["person", "bus", "glasses"], save=True) # save=True 保存结果
# 示例2:带描述的短语提示
results = predictor(text=["person with red cloth", "person with blue cloth"], save=True)
# 示例3:单个概念分割
results = predictor(text=["a penguin"], save=True)
场景 2:兼容 SAM 2 风格 —— 视觉提示(单对象分割)
SAM 3 支持 SAM 2 的传统视觉提示(点、框、掩码),仅分割指定的单个对象实例,需使用基础 SAM 接口。
from ultralytics import SAM
# 加载模型
model = SAM("sam3.pt")
# 示例1:单点提示(分割指定坐标的对象,labels=[1]表示前景)
results = model.predict(source="path/to/image.jpg", points=[900, 370], labels=[1])
results[0].show() # 显示结果
# 示例2:多点提示(多个点辅助定位单个对象)
results = model.predict(source="path/to/image.jpg", points=[[400, 370], [900, 370]], labels=[1, 1])
# 示例3:框选提示(分割 bounding box 内的单个对象)
results = model.predict(source="path/to/image.jpg", bboxes=[100, 150, 300, 400])
results[0].show()
244

被折叠的 条评论
为什么被折叠?



