【論文精讀】Segment Anything

Segment Anything

  • 前言
  • Abstract
  • 1. Introduction
  • 2. Segment Anything Task
  • 3. Segment Anything Model
  • 4. Segment Anything Data Engine
  • 5. Segment Anything Dataset
  • 6. Segment Anything RAI Analysis
  • 7. Zero-Shot Transfer Experiments
    • 7.1. Zero-Shot Single Point Valid Mask Evaluation
    • 7.2. Zero-Shot Edge Detection
    • 7.3. Zero-Shot Object Proposals
    • 7.4. Zero-Shot Instance Segmentation
    • 7.5. Zero-Shot Text-to-Mask
    • 7.6. Ablations
  • 8. Discussion
  • 閱讀總結

前言

被稱為CV領域的GPT-3的工作,大一統了圖像分割領域,實現了可提示及時分割,并且能夠實現模糊感知,此外還構建了迄今最大的圖像分割數據集,在1100萬張授權的隱私圖像上超過了10億個mask。該工作中稿于ICCV 2023,其方法構建、實驗設計以及寫作格局都值得我們學習。

Paperhttps://arxiv.org/pdf/2304.02643.pdf
Codehttps://github.com/facebookresearch/segment-anything
FromICCV 2023

image.png

Abstract

本文提出SA項目,包含圖像分割領域里新的任務、模型和數據集。作者構建了迄今最大的圖像分割數據集,在1100萬張授權的隱私圖像上超過了10億個mask。模型被設計和訓練成可提示的,因此在新的圖像和任務分布上有很好的泛化性能,甚至優于監督訓練的結果。

1. Introduction

NLP領域預訓練的基礎模型可以輕松泛化到未見的任務和數據上,在prompt加持和訓練語料的堆疊下,性能甚至能超過微調的模型。CV領域也對基礎模型進行了探索,CLIP等多模態模型實現了文圖兩種模態的對齊,可以通過文本提示對視覺概念進行泛化, 但是CV的任務更為廣泛,對于其中許多問題,并不存在豐富的訓練數據。
本文的目標是為圖像分割任務構建基礎模型,通過在通用任務的大規模數據集上進行預訓練,使用Prompt工程就能夠將模型泛化到未見的數據分布中。為了實現這個目標,需要關注以下三個組件:

  • 任務。什么樣的任務可以實現零樣本泛化?
  • 模型。相應的模型架構是什么樣的?
  • 數據。什么數據可以驅動這樣的任務和模型?

作者首先定義了足夠通用的可提示分割任務,這就要求模型能夠支持靈活提示,為了訓練,那就需要大規模的數據。但是目前圖像分割領域沒有理想規模的數據集,因此作者構建了數據引擎,在幫助收集數據的同時又利用新數據更新模型。具體設計如下:

  • 任務:作者提出可提示分割任務,一個prompt指出需要分割出圖像中的內容,比如識別對象的空或者文本信息。合法的輸出即使prompt模糊不清也能夠找到一個或多個對象(見圖1a)。作者使用可提示分割任務作為預訓練任務,并通過提示工程解決下游任務。
  • 模型:模型的關鍵在于支持靈活的提示,能夠及時計算mask以允許交互,并且具有模糊感知。作者發現一個強大的圖像編碼器和一個prompt編碼器,將二者的輸出過一個輕量級的mask解碼器(見圖1b)就能夠滿足上面三個約束。該模型稱為SAM,為了使SAM能夠感知歧義,作者將其設計為預測單個Prompt的多個mask,從而讓SAM自然處理歧義。
  • 數據引擎:當前領域的數據量難以支撐模型的強泛化性能,潛在的解決方法是在線獲取數據,但是mask并不豐富。為此,作者構建了數據引擎,它分為三個階段,第一階段,SAM協助標注人員標注mask;第二階段,SAM通過提示對象可能位置對對象子集生成mask,標注人員只需要關注剩下的對象,提高標注的多樣性;最后階段,作者采用前景點的規則網格提示SAM,為每張圖像產生約100個高質量的mask。
  • 數據:本文提出的數據集,SA-1B,在1100萬張圖像上超過10億個mask,全部由數據引擎生成,比現有任何分割數據集多400倍。

實驗部分作者廣泛評估了SAM,在23個分割數據集組合的數據集中,SAM能夠生成高質量mask,通常只比手動注釋略低。其次,在Prompt工程下,SAM展現出一致的強大定性和定量結果。這些實驗表明SAM即插即用,具有極佳的泛化性能。
image.png

2. Segment Anything Task

可提示的分割任務受到NLP中基礎模型通過自回歸預訓練,然后使用Prompt工程解決下游任務的啟發。作者首先將Prompt的概念從NLP轉化為分割,這里Prompt可以是一組前景/背景點、一個粗糙的框,自由的文本等,那么任務就是基于這些Prompt返回有效的分割,即使是模糊的對象,也需要返回一個合理的mask,如下圖所示,每一列都是合理的輸出。
image.png
任務提出了一種自然的預訓練算法,根據每個訓練樣本的Prompt將模型的預測mask與真實情況進行比較,即使Prompt不夠明確,也能夠預測出有效的mask,這特別適用于在對下游任務零樣本遷移過程。
圖像分割是一個廣闊的領域,包括交互式分割、邊緣檢測、超像素化、前景分割等任務,本文提出的可提示分割任務目標是產出一個基礎模型,可以通過Prompt適用于任何分割任務,甚至是未見的任務,這種方法類似于其他基礎模型的使用方式。此外,這與之前的多任務分割系統不同,多任務系統中單個模型執行一組固定的任務,并在相同的任務上進行測試,而本文的任務在下游執行不同的任務,泛化性更好。

3. Segment Anything Model

image.png
SAM模型包括三個組件:圖像編碼器,靈活的Prompt編碼器,以及一個快速的mask解碼器。

  • 圖像編碼器采用MAE。
  • Prompt編碼器考慮了兩種不同的Prompt形式:稀疏(點,錨框,文本)和密集(mask)。作者通過位置編碼表示點和框,采用CLIP編碼文本嵌入,密集Prompt采用卷積計算得到嵌入,并與圖像的嵌入按元素求和。
  • mask解碼器將圖像嵌入、Prompt嵌入以及輸出token映射為mask。作者受到其他工作啟發,采用動態mask預測head的解碼器模塊,該模塊使用prompt自注意力和雙向跨注意力(Prompt2Image and vice-versa)。運行兩個塊后進行上采樣,MLP將輸出的token映射到動態線性分類器,用于計算mask概率。

如果輸入Prompt不明確,模型將會平均多個有效的mask。為了解決這個問題,作者修改模型以預測單個Prompt的多個輸出mask,一般三個足以覆蓋常見情況。模型的整體設計很大程度出于效率的考慮,給定圖像嵌入,Prompt編碼器和mask解碼器在CPU上的耗時約50ms,可以實現實時的交互提示。對于損失函數和訓練,作者采用焦點損失和骰子損失的線性組合來監督mask的預測,訓練時采用混合的幾何提示來訓練可提示的分割任務。

4. Segment Anything Data Engine

為了解決互聯網中分割數據不充足問題,作者構建了一個數據引擎用于構建SA-1B。引擎擁有三個階段,模型輔助手動標注階段,半自動階段,以及全自動階段。

  • 輔助手動階段。專業標注團隊使用交互式分割工具來手動標記mask。該階段初期,使用常見的公共分割數據集對SAM進行訓練,經過足夠多的數據標注,僅使用新注釋的mask重新訓練SAM。該階段從12萬張圖像中收集了430萬個mask。
  • 半自動階段。該階段目標是增加mask的多樣性,以提高模型分割的能力。作者首先自動檢測置信的mask,在由標注人員標注未被檢測出來的對象。該階段作者在180k個圖像中額外收集了590萬個mask,讓每張圖像的平均mask數量從44增加到72。
  • 全自動階段。受益于開始階段大量收集的mask,以及對于模糊情況下的有效預測,模型現在可以全自動標注。具體來說,作者采用32×32的規則點網格提示模型,為每個點預測一組可能有有效對象的mask。最后,模型在1100萬張圖片上生成了1.1B個高質量mask。

5. Segment Anything Dataset

數據集SA-1B的圖片多樣化,分辨率高,顯著優于其他數據分割數據集如COCO。數據引擎為SA-1B自動生成了1.1B的mask,這些mask對于訓練模型來說是高質量且有效的。為了評估mask的質量,作者隨機采樣了500張圖片,并要求專業的標注人員提高標注的質量。該過程產生校準的mask,結果發現94%的mask的IoU高于90%,為了對比,之前工作的標注人員的一致性為85%-91%。
下圖繪制了SA-1B中對象中心的空間分布與最大的現有分割數據集之間的比較。SA-1B對圖像的覆蓋更廣。
image.png
從數量上看,SA-1B比第二大的Open Images多11倍,mask多400多倍,下圖左邊是每張圖片平均mask的分布,中間圖像是mask的尺寸,由于數據集中每個圖像有更多的mask,因此它也包含更大比例的中小型相對尺寸mask。右圖是mask凹度,可以看到各個數據集mask凹度的分布幾乎一致。
image.png

6. Segment Anything RAI Analysis

接著作者調查了使用SA-1B和SAM時潛在的公平問題和偏見,對工作進行了嚴格的AI分析。
image.png
從地理上來看,圖像最多的三個國家來自不同的地區,并且在中等收入國家中圖像比例要高得多,此外,每個圖像的平均mask數量在不同地區和收入之間相當一致。從公平角度,作者調查了性別表現、年齡和膚色的潛在公平問題。
image.png
可以看到,雖然在各個維度上存在微小的差異,但整體上的表現是相似的,沒有顯著差異。

7. Zero-Shot Transfer Experiments

作者在5個任務上(4個與預訓練任務顯著不同)測試SAM的零樣本遷移能力。

7.1. Zero-Shot Single Point Valid Mask Evaluation

本節評估從單個前景點分割對象。測試數據集采用包含23個不同圖像分布數據集的組合,如下圖所示:
image.png
SAM在23個數據集中的16個上產生了更高的結果。作者還提出了一個Oracle結果,這是從SAM產生的三個mask中選擇最真實的而不是最有信心的結果,這揭示了模糊性對自動評估的影響。人工評估的結果如下圖b所示,SAM的質量始終高于最強baseline RRITM。圖c展現了SAM優秀的單點能力,圖d采用隨機點采樣替換默認的中心點采樣,觀察到SAM與baseline差距越來越大。
image.png

7.2. Zero-Shot Edge Detection

作者使用BSDS500在邊緣檢測任務上評估SAM。具體來說,作者采用16×16的前景點來提示SAM,生成768個mask,冗余的mask由NMS刪除。
image.png
可以看到,SAM沒有經過邊緣檢測的訓練也能產生合理的邊緣圖。與真實值相比,SAM預測了更多邊緣,明顯優于之前的零樣本遷移方法。
image.png

7.3. Zero-Shot Object Proposals

接下來,作者在對象提議生成的中級任務上評估SAM,為了能夠生成對象提議,作者對SAM進行了修改。
image.png
雖然該領域最優的模型ViTDet-H總體表現最佳,但是SAM在幾個指標上都有突出表現。

7.4. Zero-Shot Instance Segmentation

本節將SAM作為實例分割的模塊。實驗運行一個對象檢測器,根據其輸出框提示SAM。
image.png
結果如上圖所示,雖然效果仍然落后于ViTDet-H,但是在mask質量上,SAM通常優于ViTDet。作者認為COCO上的mask有一定的偏差(質量較低),ViTNet學習了這種特定偏差,所以在指標上分數更高,但是實際效果不如SAM。
image.png

7.5. Zero-Shot Text-to-Mask

最后,作者考慮了更高級別的任務,即從自由文本中分割對象。作者將通過CLIP的文本得到的文本嵌入作為SAM的prompt。
image.png
上圖展示了定性的結果,SAM可以根據簡單的文本提示以及短語來分割對象,當無法選擇正確對象時,附加點可以幫助修復預測。

7.6. Ablations

image.png
作者采用單中心點prompt對23個數據集組合進行多次消融實驗。左圖展示了SAM在數據引擎階段累積數據時訓練的性能。在所有三個階段的訓練中,自動mask的數量遠超過手動和半自動mask的數量。為了解決這個問題,作者測試了僅使用自動mask的設置,結果僅略低于使用所有數據的性能。
上圖中間研究了數據量的影響,可以看到0.1M時mIoU有較大的下降,而1M和11M的結果沒有明顯的區別,此時仍然包含100M個mask,這可能是比較實用的設置。
最后是圖像編碼器采用不同的規模的消融實驗,可以看出進一步的圖像編碼器縮放沒有明顯的成效。

8. Discussion

本文工作的目標與分割領域的基礎模型對齊,模型SAM展現出強大的泛化能力,在不同任務的數據集上執行零樣本取得了不錯的結果。雖然SAM表現優秀,但是它還是會錯過精細的結構,也會出現不連貫的幻覺問題,不過SAM的初衷是通用性和廣泛使用,而不是為了高IoU的交互分割。此外,SAM雖然可以實時處理prompt,但當使用重型的圖像編碼器時,SAM的整體性能不是實時的。
最后進一步總結,SAM項目試圖將圖像分割提升到基礎模型時代,本文的主要貢獻是提出新的分割領域大一統任務,分割模型SAM和數據集SA-1B。SAM能否成為基礎模型還需要時間的檢驗。

閱讀總結

許多科研人員都將SAM稱為是CV領域的GPT-3,是具有跨時代意義的工作。從方法闡述、實驗分析以及演示效果來看,SAM提出新的任務大一統了圖像分割領域的大部分任務,就像NLP中自回歸任務大一統NLP任務一樣。SAM優秀的泛化性能讓其在未見的任務上也有優異的表現。文章中作者指出SAM有三點大的貢獻:新的任務,新的模型以及新的數據集,此外還指出三點在應用中的貢獻:可提示,及時響應以及模糊感知,這表明SAM的初衷不只是一篇形而上的文章,而是真正能夠落地的方法。
SAM工作看起來并不復雜,它真正的難點可能就在于如何將不同的分割任務大一統,而實現的過程也很簡單,將這些分割任務的指示作為prompt就好了,即對不同的指示(點、錨框、文本等)統一編碼成嵌入再和圖像編碼融合訓練。剩下的工作都是工程了,所以優秀的工作并不是復雜且繁瑣的,而是如何透過現象看本質,找到研究內容的共性,這才是科研的真功夫,才是優秀工作必備的條件。
當然,SAM還有一些問題,比如性能上確實比不過某個具體任務上的模型,分割時會出現幻覺,分割也不夠細致,在自然語言prompt下分割不夠準確等,這些都是日后可以改進的點,這并不影響SAM在分割領域里程碑式的意義。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/697456.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/697456.shtml
英文地址,請注明出處:http://en.pswp.cn/news/697456.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【開源】SpringBoot框架開發音樂平臺

目錄 一、摘要1.1 項目介紹1.2 項目錄屏 二、功能模塊三、系統展示 四、核心代碼4.1 查詢單首音樂4.2 新增音樂4.3 新增音樂訂單4.4 查詢音樂訂單4.5 新增音樂收藏 五、免責說明 一、摘要 1.1 項目介紹 基于微信小程序JAVAVueSpringBootMySQL的音樂平臺,包含了音樂…

Python 類型提示(Type Hinting)及typing庫

目錄 為什么要進行類型提示變量添加靜態類型注釋函數參數的類型注釋**基本類型注釋****基于`typing`庫**其他高級用法注意事項特殊情況類引用自身實例作為形參時的類型注釋參數要求為一個函數為什么要進行類型提示 從 Python 3.5 開始引入,類型提示允許程序員為變量、函數參數…

【ctfshow—web】——信息搜集篇1(web1~20詳解)

ctfshow—web題解 web1web2web3web4web5web6web7web8web9web10web11web12web13web14web15web16web17web18web19web20 web1 題目提示 開發注釋未及時刪除 那就找開發注釋咯,可以用F12來查看,也可以CtrlU直接查看源代碼呢 就拿到flag了 web2 題目提示 j…

第3.5章:StarRocks數據導入——Broker Load

注:本篇文章闡述的是StarRocks-3.2版本的Broker Load導入機制 一、概述 Broker Load導入方式支持從HDFS類的外部存儲系統(例如:HDFS、阿里OSS、騰訊COS、華為云OBS等),支持Parquet、ORC、CSV、及 JSON 四種文件格式&a…

vue里echarts的使用:畫餅圖和面積折線圖

vue里echarts的使用,我們要先安裝echarts,然后在main.js里引入: //命令安裝echarts npm i echarts//main.js里引入掛載到原型上 import echarts from echarts Vue.prototype.$echarts = echarts最終我們實現的效果如下: 頭部標題這里我們封裝了一個全局公共組件common-he…

qt 軟件發布(Windows)

1. 開發環境 QtCreator MSVC編譯器 2. 源碼編譯 生成release或者debug版本的exe可執行文件(x64或x86) 3. windeployqt 打包 ①左下角開始菜單欄找到QT的命令交互對話框,如下圖MSVC 2017 64-bit(根據第二步編譯的類型選擇64位或者32位)。 ②cd 切換到第二步可…

TCP/IP協議詳解

文章目錄 TCP/IP協議概述基于TCP/IP協議的應用工具協議協議的必要性 TCP/IP協議TCP/IP協議族協議的分層 傳輸方式的分類報文、幀、數據包等的區別TCP 和 UDP的區別 TCP/IP協議概述 TCP/IP(Transmission Control Protocol/Internet Protocol)是一組通信協…

《圖解HTTP》筆記2:http的構成

1,查看瀏覽器上面一個具體的http請求 瀏覽器地址欄輸入網址:https://news.baidu.com/ 使用瀏覽器的開發者工具,查看網絡中發送和接受的數據。 可以看到輸入一個網址,瀏覽器和服務器進行了很多的交互。(綠色部分&#…

python + selenium/appnium

Selenium 的自動化原理: selenium 自動化流程: 自動化程序調用Selenium 客戶端庫函數(比如點擊按鈕元素)客戶端庫會發送Selenium 命令 給瀏覽器的驅動程序瀏覽器驅動程序接收到命令后 ,驅動瀏覽器去執行命令瀏覽器執行命令瀏覽器驅動程序獲取命令執行的…

ubuntu環境下openssl庫的簡單使用

安裝 sudo apt-get install libssl-devaes算法demo 編譯&#xff1a;gcc aes.c -lssl -lcrypto -o aes 運行&#xff1a;./aes #include<stdio.h> #include<stdlib.h> #include<string.h> #include<openssl/aes.h>#define AES_KEY_SIZE 128 // AES密…

UNI-APP_app跳轉企業微信客服對話

uniapp打包app&#xff0c;app里點擊客服&#xff0c;跳轉企業微信客服對話。為什么是企業微信&#xff1f;因為只有微信小程序才可以通過 button 的 open-type‘share’ 打開微信客服對話框&#xff08;微信客服要在公眾號平臺配置&#xff09; 1、appId獲取 &#xff08;1&a…

OJAC近嶼智能張立賽博士揭秘GPT Store:技術創新、商業模式與未來趨勢

> - [Look&#xff01;&#x1f440;我們的大模型商業化落地產品](https://www.airecruitas.com/aigc) >- &#x1f4d6;更多AI資訊請&#x1f449;&#x1f3fe;[關注](https://mp.weixin.qq.com/s/85qwuIydaaydMQz2g0rgMA) >- [Free三天集訓營助教在線為您火熱答疑…

C#_各式各樣的參數(引用參數、輸出參數、數組參數、具名參數、可選參數)

引用參數 值參數和引用參數的區別在于傳參時是否會創建參數副本&#xff1a;值參數不會創建副本&#xff0c;而引用參數會創建副本。 換言之&#xff0c;值類型參數的參數與實體之間無直接關聯&#xff0c;修改參數不會對實體產生影響&#xff1b;引用類型參數的參數與實體可視…

6.微格式

微格式 經典真題 知道什么是微格式嗎&#xff1f;談談理解。在前端構建中應該考慮微格式嗎&#xff1f; 微格式介紹 所謂微格式&#xff0c;是建立在已有的、被廣泛采用的標準基礎之上的一組簡單的、開放的數據格式。 具體表現是把語義嵌入到 HTML 中&#xff0c;以便有助…

通過SSH 可以訪問Ubuntu Desktop嗎?

你可以在 Ubuntu Desktop 上開啟 SSH 服務&#xff0c;以便其他機器可以通過 SSH 連接到你的服務器。以下是在 Ubuntu Desktop 上開啟 SSH 服務的步驟&#xff1a; 打開終端 (Terminal) 應用程序。 輸入以下命令安裝 OpenSSH 服務器&#xff1a; sudo apt-get update sudo ap…

多任務爬蟲(多線程和多進程)

在一臺計算機中&#xff0c;我們可以同時打開多個軟件&#xff0c;例如同時瀏覽網頁、聽音樂、打字等&#xff0c;這是再正常不過的事情。但仔細想想&#xff0c;為什么計算機可以同時運行這么多軟件呢? 這就涉及計算機中的兩個名詞&#xff1a;多進程和多線程。 同樣&#xf…

通信入門系列——鎖相環、平方環、Costas環

微信公眾號上線&#xff0c;搜索公眾號小灰灰的FPGA,關注可獲取相關源碼&#xff0c;定期更新有關FPGA的項目以及開源項目源碼&#xff0c;包括但不限于各類檢測芯片驅動、低速接口驅動、高速接口驅動、數據信號處理、圖像處理以及AXI總線等 本節目錄 一、鎖相環 1、壓控振蕩…

重磅!MongoDB推出Atlas Stream Processing公共預覽版

日前&#xff0c;MongoDB宣布推出Atlas Stream Processing公共預覽版。 在Atlas平臺上有興趣嘗試這項功能的開發者都享有完全的訪問權限&#xff0c;可前往“閱讀原文”鏈接點擊了解更多詳細信息或立即開始使用。 開發者喜歡文檔型數據庫的靈活性、易用性以及Query API查詢方…

使用k-近鄰算法改進約會網站的配對效果(kNN)

目錄 谷歌筆記本&#xff08;可選&#xff09; 準備數據&#xff1a;從文本文件中解析數據 編寫算法&#xff1a;編寫kNN算法 分析數據&#xff1a;使用Matplotlib創建散點圖 準備數據&#xff1a;歸一化數值 測試算法&#xff1a;作為完整程序驗證分類器 使用算法&…

js過濾取出對象中改變的屬性和值

朋友公司的面試題 &#xff0c;取出對象中被改變的屬性和值 const obj1 { a: 1, b: 2, c: 4 }; const obj2 { a: 1, b: 2, c: 5 }; 方法1 function testFun(obj1, obj2) {const diff {};const keys1 Object.keys(obj1);const keys2 Object.keys(obj2);const allKyes keys…