交互式分割
点击一个对象即可得到掩码,在浏览器中完成,无需 GPU,每次点击也不产生网络调用。Potato 如何通过 ONNX Runtime Web 运行 MobileSAM,以及如何配置它。
点击一个对象,约 130 毫秒后掩码就会返回,全部在标注者的浏览器中完成,无需 GPU,也没有网络往返。 两条命令即可安装,一旦权重就位于本机,它便可在气隙环境下工作。
安装
potato download-models onnxruntime # 13.5 MB,每次安装一次即可
potato download-models mobile_sam # 45 MB然后把 sam 加入某个模式的 tools:
annotation_schemes:
- annotation_type: image_annotation
name: objects
description: "Outline every object you find."
source_field: image
tools: [sam, polygon, brush, eraser]
labels:
- name: object
color: "#6e56cf"画笔、橡皮擦与识别颜色的填充工具仍然可用,供手工操作。交互式分割是掩码的起点,而不是修正掩码的替代品。
运行 examples/image/interactive-segmentation/ 即可看到实际效果。
工作原理
这里使用的模型是 MobileSAM,它是 Segment Anything 的蒸馏版本,通过 ONNX Runtime Web 运行。
编码器与解码器是有意分开的。编码器开销大,每张图片只运行一次;解码器开销小,每次点击运行一次。把两者分开、并按图片缓存嵌入,正是点击之所以感觉像交互而非网络请求的全部原因。该缓存有容量上限,会淘汰最久未使用的嵌入。
你可以正向点击以扩展掩码,反向点击以从中裁去,框选对象以约束搜索范围,或者对已有的掩码做细化。
为什么默认放在浏览器里
pip install potato-annotation 之后就应当得到可用的分割能力:不需要 GPU,不需要新的 Python 依赖,标注时也不产生对外网络请求。最后这一点不是锦上添花:有若干研究组在气隙环境下运行 Potato,在那里,一个要在点击时去拉取的模型不是"慢",而是"缺失"。
| 浏览器(默认) | 服务端端点 | |
|---|---|---|
| 安装 | potato download-models | pip install 'potato-annotation[vision]' 外加权重 |
| GPU | 不需要 | 建议配备 |
| 气隙可用 | 是,模型下载完成后 | 是 |
| 模型体积 | 蒸馏版,约 45 MB | 取决于你提供的模型 |
服务端端点是为那些拥有 GPU、想用更大模型的实验室准备的,但它是例外而非默认。
输入契约是验证过的,而不是假定的
SAM 的编码器接收的是经过预处理的图像,而其规格说明允许不止一种看似合理的解读。其中三种解读会产出自信、看似合理却错误的掩码:质心误差在 70 到 148 像素之间,看上去像是标注者有点马虎,而不像是流水线坏了。正确的解读落在 0.1 像素。
这种差别只有对照真实权重和真实基准才看得出来,因此这份契约由测试固定,而不是靠注释约定。此处若解读错误,会悄无声息地劣化用它构建的每一个数据集中的每一份掩码。
掩码上的一致性
两位标注者分割同一个对象,不会产出完全相同的像素,因此掩码一致性需要的不只是一个重叠度数字。Potato 使用 STAPLE(Warfield、Zou 与 Wells,2004),它在估计潜在共识边界的同时,也给出每位评定者的敏感度与特异度。
它与逐像素多数表决的差别并非表面功夫。当两位认真的标注者以二比三落于噪声标注者之下时,多数表决相对真值的 Dice 为 0.846,而 STAPLE 为 1.000,因为 STAPLE 注意到认真的那一对彼此一致,而噪声的三位彼此并不一致。
细节与注意事项参见掩码共识。