查看 Markdown

可提示分割 API

LibreSAM 是可提示分割的工厂函数。一次前向传播需要在调用时给出针对该图像的提示,所以这一层有自己的 predict 接口,而不是走无提示的推理运行器。

安装

这一层需要 sam 扩展。

bash
pip install 'libreyolo[sam]'

工厂函数

python
LibreSAM(model: str = "base", **kwargs) -> LibreSAMModel

model 是尺寸别名,不是路径。**kwargs 会传到家族的构造函数,它接受 devicemultimask。未知别名会抛出 ValueError,错误信息里会列出所有已知别名。

点提示与框提示
from libreyolo import LibreSAM, SAMPLE_IMAGE model = LibreSAM("base") r = model.predict(SAMPLE_IMAGE, points=[900, 370], labels=[1])print(r.masks.xy)print(r.boxes.xyxy) r = model.predict(SAMPLE_IMAGE, bboxes=[100, 100, 200, 200])print(len(r))
一次编码,多次提示
from libreyolo import LibreSAM, SAMPLE_IMAGE model = LibreSAM("base")model.set_image(SAMPLE_IMAGE) a = model.predict(points=[500, 375], labels=[1])b = model.predict(bboxes=[100, 100, 200, 200])print(len(a), len(b)) model.reset_image()

别名

家族别名尺寸权重
SAM-1baselargehugeblhsam-basesam-largesam-hugesam_bsam_lsam_hbaselargehugefacebook/sam-vit-base-large-huge
SAM-2sam2-tinysam2-smallsam2-base-plussam2-baseplussam2-large,以及简写形式 sam2-tsam2-ssam2-bpsam2-lsam2_tsam2_ssam2_bpsam2_ltinysmallbase-pluslargeLibreYOLO/LibreSAM2tiny-small-base-plus-large
EdgeTAMedgetamedge-tamedgetam-edgeedgeLibreYOLO/LibreEdgeTAM
SAM 3sam3sam-3sam3-largelargefacebook/sam3
MobileSAMmobilesammobilesam-tinymobilesam_tmobile-sammobile-sam-tinytinyLibreYOLO/LibreMobileSAM
PicoSAM3picosam3picosam3-picopicosam3_picopico-sam3picoLibreYOLO/LibrePicoSAM3

默认是 base。SAM-1、SAM-2、EdgeTAM 和 MobileSAM 跑在名义上 1024 像素的画布 上,SAM 3 是 1008,PicoSAM3 是 96。

SAM 3 的权重是受限的(gated)。它们从 facebook/sam3 下载,采用 Meta 自定的 SAM License,既不是 MIT 也不是 Apache-2.0,LibreYOLO 不做再分发。加载前先在仓库 页面接受条款,并通过 Hugging Face 认证;加载器会先打印这条提示。

家族类也一并导出,所以 LibreSAM1LibreSAM2LibreSAM3LibreEdgeTAMLibreMobileSAMLibrePicoSAM3 可以用 size= 直接构造。

predict

python
model.predict(
    source=None,
    *,
    points=None,
    bboxes=None,
    labels=None,
    masks=None,
    text=None,
    conf=None,
    multimask=None,
    max_det=300,
    device=None,
    color_format="auto",
    points_per_side=None,
) -> Results
参数默认值含义
sourceNone要分割的图像;None 表示复用 set_image() 缓存的图像
pointsNone以像素坐标给出的点提示
bboxesNone形如 [x1, y1, x2, y2] 的框提示,也可以给一组框,每个框出一张掩码
labelsNone点标签,1 为正、0 为负,形状与 points 对应;省略时全部按正处理
masksNone保留参数;传入会抛出 NotImplementedError
textNone概念提示;仅 SAM 3 支持
confNone预测掩码 IoU 的下限
multimaskNone每个提示返回全部歧义掩码;默认取构造时的设置
max_det300返回掩码数量的上限
deviceNone为这次以及之后的调用移动模型,并让缓存的嵌入向量失效
color_format"auto"内存中数组的色彩格式提示
points_per_sideNone分割一切的网格密度;默认 32

返回的是普通的 Results,带 masks,外加由这些掩码推出的紧致 boxes,类别 0 命名为 "object"

提示的形状

points 接受这些嵌套形式:单个对象用 [x, y],N 个对象用 [[x, y], ...],按 对象分组的点用 [[[x, y], ...], ...]。凡是能用列表的地方都能用 Numpy 数组。 坐标就是源图像上的普通像素值。

不给任何空间提示就会跑分割一切:一个基于网格的自动掩码生成器,带预测 IoU 阈值和 框 IoU 去重。points_per_side 默认 32,大约要跑 1024 次解码器前向,在 CPU 上很 慢;交互使用时把它调小。这个生成器省掉了稳定性分数过滤、多裁剪和掩码 IoU 去重, 所以它只是有提示路径的近似,而不是与之等价。

置信度

conf 按预测掩码 IoU 过滤,那是掩码质量分数,不是检测置信度。None 在有提示的 路径下保留每一张掩码,在分割一切下则套用该家族的网格阈值。0.0 在两种模式下都 关闭过滤。

在 SAM 3 的文本路径上,conf 换成 Promptable Concept Segmentation 的检测分数。 那里的 None 表示标准的 0.3 阈值,0.0 则保留全部候选。

文本提示

text= 只有 SAM 3 支持;所有走空间提示的家族碰到它都会抛出 NotImplementedError。文本与点、框互斥。返回的 names 把类别 0 映射到请求的 概念。source=None 的文本调用会重新编码缓存的图像,因为跟踪器和概念编码器不共用 一份缓存。

关键字 exemplars= 是为将来的图像范例扩展保留的,目前没有实现。

一次编码的生命周期

python
model.set_image(source, color_format="auto") -> LibreSAMModel
model.reset_image() -> LibreSAMModel

set_image 把笨重的图像编码器跑一次,并缓存嵌入向量,所以之后每次 source=Nonepredict() 都很便宜。两个方法都返回模型本身,调用可以链式写。 给 predictdevice= 会移动模型,并让缓存失效。

PicoSAM3

PicoSAM3 只接受 bboxes=。点、文本、掩码、multimask 和分割一切的提示都会抛错。 框会外扩 10%,再送进一个 96 像素的 ROI 网络;PicoSAM3 是这一层里唯一能导出的 家族,而且只能导出 ONNX。

不支持的功能

train()val()track() 在这一层的每个家族上都会抛出 NotImplementedError。可提示的掩码没有固定的类别集合可供打分,所以 mAP 在这里 没有意义。export() 在 SAM-1、SAM-2、SAM 3、EdgeTAM 和 MobileSAM 上都会抛错。

SAM-2、SAM 3 和 EdgeTAM 的视频与 memory 路径不在这个版本的范围内,SAM 3 的图像 范例和掩码提示同样不在。

工厂别名、尺寸和仓库读自 libreyolo/models/sam/model.py、sam2.py、edgetam.py、sam3.py、libreyolo/models/mobilesam/model.py 和 libreyolo/models/picosam3/model.py。提示契约与默认值读自 libreyolo/models/sam/base.py。设计意图来自 docs/adr/0007-libresam-contract.md,全部基于 v1.5.0。