Skip to content

交互式分割

点击一个对象即可得到掩码,在浏览器中完成,无需 GPU,每次点击也不产生网络调用。Potato 如何通过 ONNX Runtime Web 运行 MobileSAM,以及如何配置它。

点击一个对象,约 130 毫秒后掩码就会返回,全部在标注者的浏览器中完成,无需 GPU,也没有网络往返。 两条命令即可安装,一旦权重就位于本机,它便可在气隙环境下工作。

安装

bash
potato download-models onnxruntime     # 13.5 MB,每次安装一次即可
potato download-models mobile_sam      # 45 MB

然后把 sam 加入某个模式的 tools

yaml
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-modelspip 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 注意到认真的那一对彼此一致,而噪声的三位彼此并不一致。

细节与注意事项参见掩码共识

相关内容