論文:Segment Anything
官網(wǎng):https://segment-anything.com/
代碼:https://github.com/facebookresearch/segment-anything
出處:Meta、FAIR
時間:2023.04.05
貢獻點:
- 首次提出基于提示的分割任務,并開源了可以分割一切的模型 SAM
- 開源了一個包含 1100 萬張圖像(約包含 10 億 masks)的數(shù)據(jù)集 SA-1B,是目前最大的分割數(shù)據(jù)集,數(shù)據(jù)集的標注經(jīng)過三個階段——手動標注、半自動標注、全自動標注,最終提供的 mask 都是全自動標注的 mask
- SAM 具有很強的零樣本遷移能力,在未經(jīng)訓練過的數(shù)據(jù)集上的邊緣檢測、proposal 生成、instance segmentation 的效果都很強
- 開源了三種不同大小的模型,模型大小分別為 375M、1.25G、2.56G,能夠適合不同場景的使用
一、Intruduction
1、背景:
前有經(jīng)過預訓練的大語言模型被證明有很強的 zero-shot 和 few-shot 泛化能力,這些基礎模型能夠泛化到其沒有見過的任務和數(shù)據(jù)上去。
究其原因就在于 prompt engineering,提示機制能夠根據(jù)的提示文本來提示模型來生成更好的反饋。
所以 prompt engineering 和基礎模型(在大數(shù)據(jù)集上預訓練)的風很快吹到了 CV 領域
如 CLIP[82] 和 ALIGN[55],使用對比學習來訓練 text 和 image 的 encoder,讓這兩種模態(tài)對齊
一旦經(jīng)過訓練,text prompt 就能夠零樣本泛化到新的視覺概念和數(shù)據(jù)分布上
這樣的 encoder 也可以很高效的和其他模型結合,來實現(xiàn)下游的任務,如圖像生成
雖然在視覺和語言編碼器方面已經(jīng)取得了很大的進展,但計算機視覺中有超出這個范圍的很多問題,比如不存在非常豐富的訓練數(shù)據(jù)
所以,本文的目標是構建一個圖像分割的基礎模型,將 prompt 引入,且在非常豐富的數(shù)據(jù)集上進行預訓練,讓模型有更好的泛化能力,基于這個基礎模型來更好的解決分割的下游問題。
2、什么是 zero-shot learning 零樣本學習:
- 從原理上來說,zero-shot learning 就是讓計算機具備人類的推理能力,來識別出一個從未見過的新事物。
- 舉個例子,我們告訴一個從沒見過斑馬的小朋友:“斑馬是一種長得像馬,身上有黑白色條紋的動物”,他就可以很輕松地在動物園里找出來哪個是斑馬。
- 可是,在傳統(tǒng)的圖像識別算法中,要想讓機器認出“斑馬”,往往需要給機器投喂足夠規(guī)模的“斑馬”樣本才有可能。而且,利用“斑馬”訓練出來的分類器,就無法識別其他物種。
- 但是 zero-shot learning 就可以做到,一次學習都沒有,只憑特征描述就識別出新事物,這無疑離人類智力又近了一步。
zero-shot learning 是如何工作的:
-
利用高維語義特征代替樣本的低維特征,使得訓練出來的模型具有遷移性。
-
比如斑馬的高維語義就是“馬的外形,熊貓的顏色,老虎的斑紋”,盡管缺乏更多細節(jié),但這些高維語義信息已經(jīng)足夠對“斑馬”進行分類,從而讓機器成功預測出來。
-
這就解決了圖像識別長久以來的問題:如果一個事物從來沒有在現(xiàn)有數(shù)據(jù)集中出現(xiàn)過,機器應該如何學習和識別它。
3、SA 模型簡介:
本文提出的 Segment Anything(SA):
- 提出了一個新任務:基于提示的分割任務
- 提出了一個新模型:SAM, 可以分割一切
- 開源了一個新的用于圖像分割的數(shù)據(jù)集(SA-1B,1 Billion masks,11M images),是當前最大的分割數(shù)據(jù)集,包含 1100 萬張圖像,約 10 億標注 masks
SA model 的特性:
- 模型是使用 promptable 的模式訓練的,故可以遷移 zero-shot 到新的數(shù)據(jù)和任務
- 作者在多種不同的任務中進行了性能測試,發(fā)現(xiàn)其 zero-shot 性能很厲害,可以匹敵或超過一些監(jiān)督訓練的結果
本文的目標:
- 構建一個適用于圖像分割的基礎 promptable 模型
- 有足夠強的泛化能力
- 能夠使用 prompt 功能來實現(xiàn)對下游新數(shù)據(jù)的分割問題
要實現(xiàn)該目標就有三個重要的元素:
- task:什么任務能夠提高 zero-shot 的泛化能力
- model:使用什么樣的模型
- data:什么樣的數(shù)據(jù)能夠支撐上面的 task 和 model
① Task:promptable segmentation task
在自然語言處理和最近的計算機視覺方法中,基礎模型很火,它可以通過使用 “提示” 技術對新的數(shù)據(jù)集和任務進行 zero-shot 和 few-shot learning。
故此,本文提出了【可提示的分割任務】,其目的是在給定任何分割提示下返回一個有效的分割掩碼,如圖 1a 所示,可以根據(jù)使用者的提示(point、box、mask、text)來返回分割結果。
-
prompt 能夠指定要在圖像中分割的內容,如一些能夠標識目標的空間信息或文本信息。
-
一個有效的 mask 輸出就意味著,即使當一個 prompt 是模糊的或指向多個目標(比如一件襯衫上的像素點可能表示襯衫或穿它的人),mask 的輸出應該是合理且可解釋的,至少會包含一個所指向的目標
-
作者使用提示分割任務作為預訓練的目標,并通過 prompt 過程來解決一般的下游分割任務
② Model:
基于提示的分割任務和現(xiàn)實中的可用性就給 model 施加了一些約束
- model 必須支持足夠靈活的提示
- model 必須能夠支持實時交互使用
- model 必須是模糊感知的,可以對一個模糊 prompt 輸出多個 masks,從而允許模型能夠自然地處理模糊的目標,如 shirt 和 person
基于上述約束,作者發(fā)現(xiàn)了一個簡單的結構能夠同時滿足上述三種約束:
- 一個強大的 image encoder,來計算 image embedding
- 一個 prompt encoder 來編碼 prompts
- 一個能夠將上面兩個 embedding 結合起來的輕量級 mask decoder,預測分割 mask
Segment Anything Model,SAM,見圖 1b,由三部分組成:
- image encoder:圖像特征提取
- prompt encoder:主要使用點、框、mask 、text 作為提示
- mask decoder:通過對上面兩個編碼結果進行一定的 cross-attention,得到 mask 結果
3、Data engine
為了實現(xiàn)在新數(shù)據(jù)集的強大的泛化能力,非常有必要在大量且豐富的 mask 上訓練 SAM,而非使用現(xiàn)有的分割數(shù)據(jù)集來訓練。
有一些基礎模型方法[82] 使用在線獲取數(shù)據(jù),但 mask 并不豐富
本文作者建立了一種 ‘data engine’ (數(shù)據(jù)引擎)的方法, 如圖 1c 所示,作者使用 model-in-the-loop 數(shù)據(jù)集標注和 SAM 模型來共同開發(fā),有三個階段:
- assisted-manual:SAM 輔助標注工具來標注 masks,類似于傳統(tǒng)的分割標注步驟
- semi-automatic:SAM 能夠根據(jù)提示目標的位置來為一些目標生成 mask,標注工具會對其他剩余的目標進行標注
- fully automatic:用規(guī)則的前景網(wǎng)格點來提示 SAM,為每個 image 生成約 100 個高質量的 masks
4、Dataset
最終得到的 dataset 是 SA-1B,包括 1B mask(10億),11M imgs(1100萬),如圖 2 所示:
- SA-1B 使用的由 data engine 的最后一個階段標注結果
- 是現(xiàn)有的分割數(shù)據(jù)集 mask 數(shù)量的 400x 之多,且 mask 的質量都較高且更豐富
5、Responsible AI
作者研究且說明了在使用 SA-1B 和 SAM 時潛在的公平問題和偏差。
SA-1B的圖像跨越了地理和經(jīng)濟上不同的國家,我們發(fā)現(xiàn) SAM 表現(xiàn)在不同的人群中也是同樣的。
6、Experiments
- 使用 23 個分割數(shù)據(jù)集,我們發(fā)現(xiàn) SAM 從單個前景點產生高質量的掩模,通常只略低于手動標注的 gt
- 其次,在使用提示引擎的 zeor-shot 時,各種下游任務的定量和定性都獲得了較好的結果(包括邊緣檢測、目標建議生成、實例分割以及 text-to-mask 等)
圖 2 展示了數(shù)據(jù)集中的一些標注樣本,標注的 mask 都是最后一個階段 SAM 自動標注的,每個圖像中平均包含約 100 個 masks
可以看出標注非常的細致,有邊界區(qū)分的圖像區(qū)域(盡管可能同屬于一個 person 或者 car)都被進行了很細粒度的分割,每個土豆都被分割成了一個區(qū)域,這和我們通常意義上的實例分割或語義分割的標注 label 有很大的差異。
二、Segment Anything Task
1、Task
首先將 prompt 的概念從 NLP 轉換到分割
prompt:
- 可以是一組前景/背景點,如圖 3,綠色的點就是 point prompt,模型會給出這個點所在的目標的 mask
- 一個粗糙的框或 mask
- 自由形式的文本
- 或者能夠表示在圖像中要分割的內容的任何形式
promptable segmentation task 的目標:
- 給定任何 prompt,返回有效的分割 mask(如圖 3 所示,任何模糊的提示都要有一個有效的 mask),輸出至少要是一個目標
2、Pre-training
可提示的分割任務提出了一種預訓練方法,能夠為每個訓練樣本模擬一系列提示(如 points、box、mask),并且和真實的 gt mask 做對比。
3、zero-shot transfer
pre-training 任務賦予了模型在推理時對任何提示做出適當反應的能力,因此下游任務可以通過設計合適的 prompt 方法來解決。
- 假設有一個貓的 box,可以通過提供檢測器的 box 輸出作為模型的 prompt,來獲得貓的實例分割結果
- 一般來說,實際的分割任務都可以被視為 prompting。除了自動數(shù)據(jù)集標記,第七章中探索了 5 個不同的示例任務。
4、related tasks
分割任務有很多子任務,例如:
- interactive segmentation [57, 109]
- edge detection [3]
- super pixelization [85]
- object proposal generation [2]
- foreground segmentation [94]
- semantic segmentation [90]
- instance segmentation [66]
- panoptic segmentation [59]
提示性的分割模型能支持盡可能多的場景,但不是全部場景
5、discussion
提示和組合能夠使單個模型能夠以可擴展的方式使用,并有可能完成在模型設計時未知的任務。
這種方法類似如何使用其他基礎模型,例如,CLIP [82] 是 圖像生成系統(tǒng) DALL·E[83] 的文本-圖像對齊組件。
由 prompt 技術驅動的可組合的系統(tǒng)設計,將會比專門為一組固定的任務訓練的應用更加廣泛。
三、Segment Anything Model
SAM 有三個部分,如圖 4 所示:
-
image encoder:
使用 MAE pre-trained Vision Transformer(ViT)來處理高分辨率的輸入,image encoder 會對每張圖像都運行一次,且可以在使用提示之前應用。
image encoder 的輸出是經(jīng)過 16x 下采樣的結果,輸入大小為 1024x1024,所以經(jīng)過 image embedding 后的結果是 64x64 大小,為了降低通道數(shù)量,使用了 1x1 卷積將通道降為 256。
-
flexible prompt encoder:有兩種 prompts
- sparse(points、boxes、text):通過位置編碼來表示 points 和 box,通過 CLIP 的 off-the-shelf text encoder 來表示 text。sparse prompts 都是 256-d 的向量。point 表示位置編碼和該點是前景還是背景;box 表示左上角學習到的編碼和右下角學習到的編碼。text 是從 CLIP 中得到的編碼。
- dense(masks):使用卷積來進行編碼,并對編碼結果進行 element-wise 求和。mask 是將圖像下采樣 4x 后輸入的,然后是 1x1 卷積將通道變?yōu)?256,然后將 image embedding 和 mask 進行逐點相加,如果沒有 mask prompt,則不加即可
-
fast/lightweight mask decoder
- decoder 能夠高效地對 image embedding 和 prompt embedding 進行映射,得到輸出的 mask,如圖 14 所示。
- 共有兩層 decoder layer,通過 cross-attention 來更新 image embedding 和 prompt token
每個 decoder layer 有 4 個步驟:
- 首先,對 prompt token 上進行 self-attention
- 然后,對 token(as queries)到 image embedding 進行 cross-attention
- 接著,使用逐點的 MLP 來更新每個 token
- 最后,對 image embedding(as queries)到 token 進行 cross-attention,使用 prompt 信息更新 image embedding
這里的 token 是什么:
- 我們知道在圖像分類 ViT 中,在 49 個 patch embedding 后面又添加了一個 cls token,變成了 50 維的特征輸入到了 Transformer 中進行特征提取,最后使用 cls token 經(jīng)過 MLP 后得到類別,這里的 cls token 就是最終用于分類的特征
- 所以在本文中,在 prompt embedding 中也添加了一個 token,在 decoder 的輸出中會用到
如何進行 cross-attention:
- 將 image embedding 看做一系列 64x64x256 的向量
- 每個 self、cross-attention、MLP 在訓練中都有殘差鏈接、layer norm、dropout
- 作者使用兩層 decoder,下一個 decoder layer 的輸入是上一層更新后的 token 和更新后的 image embedding
decoder 運行完之后,使用兩個反卷積將特征擴大 4x,相比于原圖是 4x 下采樣大小
token 再次被用到 image embedding 上,并且將更新后的輸出 token embedding 經(jīng)過一個小的 3 層 MLP,輸出的通道和上面經(jīng)過反卷積的 image embedding 保持一致。最后使用 MLP 的輸出和反卷積后的 image embedding 進行逐點相乘來預測 mask
如何解決 prompt 的模糊性:
- 如果給出一個模糊的提示,則模型一般會平均多個有效的 mask 來得到一個輸出
- 為了解決這個問題,作者修改了模型,如果只給了一個 prompt,也會輸出多個匹配到的 masks(如圖 3)
- 作者發(fā)現(xiàn) 3 個 mask 輸出通常能夠解決大多數(shù)常見的情況(嵌套 mask 通常最多有三個深度:整體、部分、子部分)
如何訓練:
- 在訓練過程中,僅僅回傳 mask 中最小的 loss
- 模型會給每個 mask 預測一個 confidence score (estimated IoU)來進行排序
高效性:
- prompt encoder 和 mask decoder 都運行在 web browser 上,在 CPU 上大概為 50ms
Loss:
- 使用 focal loss 和 dice loss 的線性組合來監(jiān)督 mask prediction,且 focal loss 和 dice loss 的權重比為 20:1
- 此外,作者證明在每個 decoder layer 后面使用輔助 loss 也有效果,所有使用 MSE loss 來監(jiān)督 IoU head
Training:
- 使用混合 geometric promps 來訓練 promptable segmentation task
- 對每個 mask 都會進行 11 輪隨機采樣 prompt 來模擬交互,允許 SAM 和 data engine 無縫銜接
四、Segment Anything Data Engine
由于現(xiàn)有大分割數(shù)據(jù)集并不豐富,所以作者搭建了一個數(shù)據(jù)引擎來持續(xù)收集數(shù)據(jù)
數(shù)據(jù)引擎分為三個階段:
- 模型輔助手動標注階段
- 包含自動預測 mask 和模型輔助標注的半自動階段
- 全自動階段,模型生成 mask 且沒有標注器
1、手動標注階段
類似于傳統(tǒng)的交互式分割,標注人員使用標注工具進行 mask 的標注
沒有對標記對象施加語義約束,標注人員可以自由的標注 ‘stuff’ 和 ‘things’
作者會建議標注人員標注其自己認為可以命名或描述的對象,但并不需要類別來對這些被 mask 的對象進行描述
標注人員會按圖像中物體的突出程度來按順序標注物體
在這個階段,SAM 使用常見的公共分割數(shù)據(jù)集進行訓練,在進行足夠的數(shù)據(jù)標注后,只使用新的標注 mask 來重新訓練。
隨著標注 mask 的增多,image encoder 從 ViT-B 擴展到 ViT-H,其他結構不變
共進行了 6 次訓練
隨著模型效果的提升,每個 mask 的平均標注時間從 34s 降到了 14s
14s 比 COCO 的 mask annotation 快 6.5x,比 box annotation 慢 2x
隨著 SAM 的提升,每個圖像中的 mask 的平均數(shù)量從 20 提升到了 44
在這個階段從 120k 數(shù)據(jù)中得到了 4.3M masks
2、半自動標注階段
在這個階段,目標是增加 mask 的多樣性,以提高模型分割任何東西的能力
為了將標注器集中到不太突出的目標上,首先,自動檢測到很有信心的 mask,然后對這些 mask 的地方進行填充,然后讓標注器去關注其他未標注的地方。
如何得到有信心的 mask:
- 為了檢測有信息的 masks,訓練了一個 bbox 檢測器[84] ,使用的是通用的 ‘object’ category。
在這個階段,在 180k 數(shù)據(jù)中得到了 5.9M masks(和前面的一共 10.2M mask)
通過進行 5 次訓練,每個 mask 的標注時間又變成了 34s,因為這些 mask 的標注比較難,每個圖像中的 mask 從 44 擴充到了 72 個
3、全自動標注階段
在最后一個階段,是進行全自動的標注,這也是可行的
- 其一,因為在這個階段的開始,已經(jīng)收集到了足夠的 mask,包括前兩個階段收集到的多種多樣的 mask
- 其二,在這個階段,開發(fā)了感知模糊模型,運行對模糊的 prompt 進行輸出
具體方法:
- 使用 32x32 的網(wǎng)格 point prompt 模型,為每個 point 預測一系列可能對應于有效目標的 mask
- 對于感知模糊模型,如果一個 point 位于一個 part 或 subpart 上,則模型會返回該 part、shupart、whole 的目標
- 使用 IoU 預測模塊來選擇 confident mask
- 此外,作者只選擇 stable masks
- 選擇到 confident 和 stable 的 mask 后,使用 NMS 進行過濾
- 為了進一步提升小 mask 的質量,還使用了多種重疊的 zoom-in 的方式
經(jīng)過最后一階段的全自動標注,共在 11M 圖像上得到了 1.1B 的高質量 mask
五、Segment Anything Dataset
1、Images
這些 11M 圖像都是經(jīng)過授權的,都是高分辨率圖像(平均 3300x4950 pixels),該量級的數(shù)據(jù)大小對訪問和存儲都是挑戰(zhàn)。
因此,作者發(fā)布了最短邊長為 1500 px 的降采樣圖像,這樣也高于一些常用的圖像(如 COCO 大約為 480x640 px 左右)
2、Masks
共包含 1.1B 個 mask,其中 99.1% 都是自動生成的,因此 mask 的質量至關重要
作者會將生成的 mask 和專業(yè)標注的結果進行比較,并且在第 7 章證明了本文的數(shù)據(jù)集標注 mask 是高質量的
3、Mask quality
為了估計 mask 的質量,作者隨機抽取了 500 張圖像,約 50k masks,并要求標注人員提高這些 mask 的質量。
這樣一來就能產生成對的預測 mask 和矯正后的 mask
通過計算 IoU 發(fā)現(xiàn):
- 有 94% 的 mask pair 的 IoU > 90%
- 有 97% 的 mask pair 的 IoU > 75%
4、Mask properties
如圖 5,繪制了 SA-1B 的所有 mask center(mask 中心店)和現(xiàn)有流行分割數(shù)據(jù)集的 mask center 的空間分布對比
在所有的數(shù)據(jù)集中,都存在攝影師偏差
-
SA-1B 相比于 LVIS v1 和 ADE20K,具有更大的 mask 覆蓋范圍,即 mask center 的分布很廣泛,沒有明顯的集中到圖像中心的位置,mask 的位置的分布較為均衡
-
COCO 和 Open Images V5 有更突出的中心偏差??梢悦黠@的看出 COCO 中心點顏色很深,說明 coco 的很大部分的 mask 的中心點集中在圖像的中心點
在圖 6 中,按大小對比了這些數(shù)據(jù)集
SA-1B 比第二大開放圖像數(shù)據(jù)集多 11x 圖像 和 400x mask,平均每幅圖像比開放圖像多 36x mask
如圖 6 中間,SA-1B 的每個圖中有更多的 mask,故包含了更多中小目標
六、Segment Anything RAI Analysis
這里將臺灣和香港被列為 Country,有嚴重的問題,已經(jīng)有網(wǎng)友給作者發(fā)郵件敦促修改,這里靜等結果!
七、Zero-shot Transfer Experiments
本節(jié)主要介紹使用 SAM 進行 zero-shot transfer 實驗,包括了 5 個任務:
- 實驗測試的是 SAM 在沒見過的數(shù)據(jù)集和任務上的效果(和 CLIP 的使用類似)
- 數(shù)據(jù)集中包括新的數(shù)據(jù)分布,如水下或俯視圖(如圖8)
實驗的核心目標:
- 測試是否能夠從任何提示中生成一個有效的 mask
使用一系列從低到中再到高水平的圖像理解來證明效果:
- 邊緣檢測
- 分割所有內容,即生成 object proposal
- 對檢測到的目標進行分割,即實例分割
- 作為一個概念,從 free-form text 的提示中來分割對象。
實驗設置:
- SAM 使用基于 MAE 預訓練的 ViT-H[33] 作為 image encoder
- SAM 在 SA-1B 上訓練,該數(shù)據(jù)集的標注 mask 只有自動標注的結果
圖 8 展示了作者使用的 23 個測試開源數(shù)據(jù)集
7.1 zero-shot single point valid mask evaluation
1、Task
作者測試了從單個前景 point 出發(fā)來進行一個目標的分割
2、Datasets
作者使用由不同的 23 個數(shù)據(jù)集組成的數(shù)據(jù),如圖 8 展示了 dataset 并且展示了每個數(shù)據(jù)集的樣本(表 7 更詳細)
使用 mIoU 作為評估標準:
- 對于 human study:使用如圖 9b 的 subset
3、Results
如圖 9a,SAM 和 RITM 對比了每個數(shù)據(jù)集的結果
- SAM 取得了 16 個數(shù)據(jù)集的更好的結果
- 此外,還展示了 oracle 結果,抽出 SAM 的 3 個 mask 和 gt 對比,而非使用所有的 confident mask,SAM 在所有數(shù)據(jù)集上都超越了 RITM
human study 的結果見圖 9b
7.2 zero-shot edge detection
作者在 BSDS500 數(shù)據(jù)集上測試了 SAM 邊緣檢測的效果
使用 16x16 的規(guī)則前景點 grid 作為 prompt,得到 768 個預測 mask(每個點預測 3 個),多余的 mask 使用 NMS 剔除掉
然后使用 sobel 濾波和后處理,得到最終的邊緣 maps
結果:
如圖 10 (圖 15 更多)所示:
- 定性來看,盡管 SAM 沒有訓練過邊緣檢測的任務,但也能得到理想的邊緣檢測結果
- 和 gt 相比,SAM 預測了更多的邊緣,包括 BSDS500 中沒有標注的一些邊緣
7.3 zero-shot object detection
作者在 object proposal generation 任務上也測試了 SAM 的性能
這項任務在目標檢測任務上很重要
作者將 mask 自動生成的 pipeline 進行了一些修改,用于生成 proposal,輸出的 mask 作為 proposals
average recall (AR) 作為評判標準
表 4 展示了結果
7.4 zero-shot instance segmentation
作者也使用了 instance segmentation 來評判了 SAM 的效果
- 首先運行一個目標檢測網(wǎng)絡
- 將檢測結果作為 SAM 的 prompt
結果:
7.5 zero-shot text-to-mask
作者在根據(jù) free-form text 來進行目標分割的任務上也進行了實驗
- 對每個面積大于 10 0 2 100^2 1002 像素的 mask,都抽取 CLIP image embedding
- 在訓練階段,使用 CLIP image embedding 作為 SAM 的 prompt,在推理階段,使用 text embedding 就可以了。因為 CLIP 的 image embedding 是和 text embedding 對齊的
- 所以,在推理階段,通過 CLIP 的文本編碼器對文本編碼,然后將生成的文本編碼作為提示符提供給 SAM
結果:
如圖 12 所示,SAM 可以在給定文本提示符的情況下來分割對應的目標
八、總結
SAM 能夠實現(xiàn)非常細粒度的圖像分割,分割粒度之細讓人望而生畏,突破了以前實例分割和語義分割的標注上限。能達到這樣的細粒度標注的一個關鍵原因就在于沒有給標注過程設置 “類別” 的界限,只要標注人員(第一階段)認為這個區(qū)域是能夠抽象描述的,就可以將這個區(qū)域 mask 出來,而無需給定一個類別描述或語言描述。
如上所述,SAM 分割的結果是不含類別信息的(因為訓練數(shù)據(jù)的 label 也是沒有類別信息的,只有像素是否是否屬于一個 mask 的信息),使用 text 作為 prompt 的時候可以輸入類別信息,如 ‘cat’,就可以輸出一張圖中的所有 cat,這個 cat 是基于圖文編碼匹配的,而分割的結果中原本是沒有任何類別信息的。
SAM 作為首個圖像分割的大基礎模型,為未來 CV 方向提供了更多的可能,為自動標注也提供了很好的范本。
九、在線體驗
體驗地址
點擊右上角的 demo 即可體驗,可以使用網(wǎng)站上的圖,也可以點擊 Upload an image 上傳自己的圖
點擊左側 Everything 即可對圖中所有目標進行分割:
點擊 Box 就可以使用 box prompt 來提示模型輸出 box 內的分割 mask:
點擊 Hover&Click 就可以在頁面上點擊,會輸出該點所在的 mask 的結果:
十、代碼
代碼路徑
只能做推理
1、環(huán)境安裝
conda create -n seg_any python=3.8 pytorch=1.10 torchvision cudatoolkit=11.7 -c pytorch -c conda-forge
git clone https://github.com/facebookresearch/segment-anything.git
cd segment-anything
pip install -e .
pip install opencv-python pycocotools matplotlib onnxruntime onnx -i http://pypi.douban.com/simple/
2、模型下載
在 github 項目中有模型下載地址:
3、簡單使用
# 根據(jù) prompt 生成 mask
from segment_anything import SamPredictor, sam_model_registry
sam = sam_model_registry["<model_type>"](checkpoint="<path/to/checkpoint>")
predictor = SamPredictor(sam)
predictor.set_image(<your_image>)
masks, _, _ = predictor.predict(<input_prompts>)
# 獲取圖中所有的 mask
from segment_anything import SamAutomaticMaskGenerator, sam_model_registry
sam = sam_model_registry["<model_type>"](checkpoint="<path/to/checkpoint>") # model type: ['default', 'vit_l', 'vit_b']
mask_generator = SamAutomaticMaskGenerator(sam)
masks = mask_generator.generate(<your_image>)
# 也可以使用單行命令實現(xiàn)
python scripts/amg.py --checkpoint <path/to/checkpoint> --model-type <model_type> --input <image_or_folder> --output <path/to/output>
4、image encoder
- 輸入:1024x1024x3
- 第一步:patch embedding:patch 大小為 16x16(使用 16x16,步長為 16 的二維卷積實現(xiàn)),得到 16x16x768 維的特征,輸出為 [N, 16, 16, 768]
- 第二步:給圖像編碼加上位置編碼
- 第三步:輸入 Transformer Encoder 中,進行多級 MHSA 和 MLP,ViT 深度為 12,多頭自注意力的 head 數(shù)為 12
- 第四步:經(jīng)過 Neck(1x1 conv + LN + 3x3 conv + LN)
- 輸出:64x64x256 大小
5、prompt encoder文章來源:http://www.zghlxwxcb.cn/news/detail-580321.html
- 對 points 編碼
- 對 box 編碼
- 對 mask 編碼
6、mask decoder文章來源地址http://www.zghlxwxcb.cn/news/detail-580321.html
- 對 image encoder 和 prompt encoder 的結果做 cross-attention
到了這里,關于【多模態(tài)】12、Segment Anything | Meta 推出超強悍可分割一切的模型 SAM的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!