互動式分割
點選一個物件即可得到掩碼,在瀏覽器中完成,無需 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 注意到認真的那一對彼此一致,而噪聲的三位彼此並不一致。
細節與注意事項參見掩碼共識。