分割一切-CV領(lǐng)域的基礎(chǔ)模型
人工智能中的基礎(chǔ)模型變得越來越重要。該技術(shù)一開始是在自然語言處理領(lǐng)域獲得快速發(fā)展,現(xiàn)在,隨著“Segment Anything”模型的出現(xiàn),它們也逐漸進入了計算機視覺領(lǐng)域。Segment Anything是Meta(臉書)公司的一個項目,旨在構(gòu)建圖像分割基礎(chǔ)模型的起點。在本文中,我們將了解Segment Anything項目的最核心組成部分,包括數(shù)據(jù)集和模型。
除了使用Segment Anything模型和數(shù)據(jù)集外,我們還將使用官方預(yù)訓(xùn)練權(quán)重進行推斷。
通過上面的介紹,大家可能對SAM還是很陌生,這里給大家做個簡單的介紹,我是從事醫(yī)療影像AI算法研發(fā)的,在此之前,如果我想通過AI來分割肝臟,我首先需要收集大量腹部的訓(xùn)練數(shù)據(jù),而且要保證訓(xùn)練數(shù)據(jù)和未來要預(yù)測的數(shù)據(jù)分布要一致。然后對數(shù)據(jù)進行標注,訓(xùn)練完成后,我的模型只能分割肝臟,如果想要分割肺部,那需要重新收集數(shù)據(jù),標注和訓(xùn)練,也就是說我訓(xùn)練的模型只能完成單一任務(wù)。
但今天要講的Segment Anything就不一樣了,從他的名字就可以看出來,它不是針對某個特定分割任務(wù)的,你可以輸入任何圖像,然后像NLP大模型那樣,提供提示詞,例如,你可以在你想要分割器官上畫一個點或者邊框,或者直接輸入本文,模型就能按照你的提示進行分割。
官方網(wǎng)址:https://segment-anything.com
論文地址:https://arxiv.org/abs/2304.02643
源碼:https://github.com/facebookresearch/segment-anything
其官方網(wǎng)址還提供了在線演示Demo,見下面視頻,為了驗證分割效果,我特意上傳了不同領(lǐng)域的圖片,效果驚人!
有了Segment Anything模型,我們現(xiàn)在擁有了一個泛化能力強且可提示的圖像分割模型,可以從圖像中摳出幾乎任何東西。

接下來讓我們簡單分析一下論文。

該項目主要分為三個部分,第一個是基于提示詞的分割任務(wù),第二個是SAM模型,第三個是數(shù)據(jù)標注引擎。
其中,SAM模型是最重要的,它主要分為三部分,第一部分圖像編碼器,圖像編碼器將輸入圖像映射成Image Embedding,通俗的講就是將輸入空間映射到特征空間,因為SAM是基于Transformer的,模型會在大量數(shù)據(jù)(1100萬張圖像中的10億個標注)上進行訓(xùn)練,可以認為特征空間包含了注意力信息。也就是說,你給模型一個提示點,注意力機制就能找到與該點最相關(guān)的其他點。第二部分是提示詞編碼器,它將提示信息(點,邊框,蒙版,文本)映射成prompt?Embedding。
注意:如果提示信息是文本,則需要借助CLIP對文本進行編碼。
第三部分是解碼器,它將prompt?Embedding和Image?Embedding解碼成分割結(jié)果Mask。


由于編碼器參數(shù)量遠大于解碼器,編碼器執(zhí)行非常耗時和占內(nèi)存,同一張圖像的Image Embedding是不變的,所以為了避免對于同一張圖像重復(fù)執(zhí)行編碼操作,其官方源碼實現(xiàn)中編碼器和解碼器是分開的,對于一張圖像,只需要經(jīng)過一次編碼器處理,就可以針對不同提示信息執(zhí)行不同的分割任務(wù)。
可以用SAM做什么?
增強現(xiàn)實
SAM最大的成就之一是識別日常物品。再加上增強現(xiàn)實和AR眼鏡,它可以幫助用戶提醒和給出指示。

不僅如此,在AR/VR中,用戶可以通過凝視就能在虛擬世界中分割和提起物體。
,時長00:12
生物醫(yī)學(xué)圖像分割
醫(yī)學(xué)圖像分割和細胞顯微鏡是一些最難處理的領(lǐng)域。但是,SAM可以在不需要重新訓(xùn)練的情況下直接協(xié)助分割細胞顯微鏡圖像。

另外,也可以用它制作全自動圖像標注工具。
如果你想自己訓(xùn)練一個NLP大模型,或者把NLP的一些預(yù)訓(xùn)練模型部署到本地,這個很難實現(xiàn),因為預(yù)訓(xùn)練模型很大,千億級別的參數(shù)量,訓(xùn)練也需要大量的數(shù)據(jù),更需要龐大的服務(wù)器和硬件設(shè)備,這是普通人無法承擔的,與NLP領(lǐng)域的大模型不同,SAM官方發(fā)布了不同大小的預(yù)訓(xùn)練模型,其最大的模型Vit-H SAM也不過2G,你即可以基于官方發(fā)布的預(yù)訓(xùn)練模型繼續(xù)訓(xùn)練,也可以本地部署。

SAM是基于Pytorch開發(fā)的,官方發(fā)布的推理源碼是基于Python的,下面是官方GIthub源碼中加載預(yù)訓(xùn)練模型進行預(yù)測的例子。
https://github.com/facebookresearch/segment-anything/tree/main/notebooks
如果你想在其他平臺加載預(yù)訓(xùn)練模型進行推理,例如C++,C#或者JS,可以將預(yù)訓(xùn)練模型轉(zhuǎn)換為ONNX格式,然后通過ONNXruntime就可以在不同平臺加載預(yù)訓(xùn)練模型進行預(yù)測。
前面我們說過,SAM模型解碼器和編碼器是分開的,官方提供的預(yù)訓(xùn)練模型是放在一起的,且官方源碼只提供了解碼器的ONNX轉(zhuǎn)換代碼,如果大家想要編碼器的轉(zhuǎn)換代碼或者直接想要編碼器和解碼器轉(zhuǎn)換后的ONNX格式模型文件,歡迎后臺聯(lián)系我。
另外,我自己也實現(xiàn)了通過C#代碼加載模型進行預(yù)測。如果想要源碼也可以聯(lián)系我。
參考資料:
Segment Anything – A Foundation Model for Image Segmentation (learnopencv.com)