【圖像分割】mask2former:通用的圖像分割模型詳解

最近看到幾個項目都用mask2former做圖像分割,雖然是1年前的論文,但是其attention的設計還是很有借鑒意義,同時,mask2former參考了detr的query設計,實現了語義和實例分割任務的統一。

1.背景

1.1 detr簡介

detr算是第一個嘗試用transformer實現目標檢測的框架,其設計思路也很簡單,就是定義object queries,用來查詢是否存在目標以及目標位置的,類似cnn檢測中的rpn,產生候選框。在detr中,object queries為(100,b,256)的可學習的參數,其中每個256維的向量代表了檢測的box信息,這個信息是由類別和空間信息(box坐標)組成,其中類別信息用于區別類別,而空間信息則描述了目標在圖像中的位置。

通過設置query,則不需要像傳統cnn檢測時預設anchor,最后通過匈牙利匹配算法將query到的目標和gt進行匹配,計算loss。

decoder過程中,query object先初始化為0,然后經過self attention,再和encoder的輸出進行cross attention。

?1.2?Deformable-DETR簡介

Deformable-Detr是在detr的基礎上了主要做了2個改進,Deformable attention(可變形注意力)和多尺度特征,通過可變性注意力降低了顯存,多尺度特征對小目標檢測效果比較好。

(1)Deformable attention(可變形注意力)

這個設計參考了可變性卷積(DCN),后續很多設計都參考了這個。先看下DCN,就是在標準卷積(a)的3 * 3的卷積核上,每個點上增加一個偏移量(dx,dy),讓卷積核不規則,可以適應目標的形狀和尺度。

對于一般的attention,query與key的每個值都要計算注意力,這樣的問題就是耗顯存;另外,對圖像來說,假設其中有一個目標,一般只有離圖像比較近的像素才有用,離比較遠的像素,對目標的貢獻很少,甚至還有負向的干擾。

Defromable attention的設計思路就是query不與全局的key進行計算,而是至于其周圍的key進行計算。至于這個周圍要選哪幾個位置,就類似DCN,讓模型自己去學。

  • 單尺度的可變性注意力機制

DeformAttn的公式如下:

  • 多尺度的可變性注意力機制

多尺度即類似fpn,提取不同尺度的特征,但由于特征的尺寸不一樣,需要將不同尺度的特征連接起來。

可變性注意力機制公式如下:

相比單尺度的,多尺度多了一個l,代表第幾個尺度,一般取4個層級。

對于一個query,在其參考點(reference point)對應的所有層都采用K個點,然后將每層的K個點特征融合(相加)。

整個deformable atten的流程如下:

2.mask2former

mask2former的設計上使用了deformable detr的可變形注意力。

主要計算過程用下圖表示:

2.1 模型改進

(1)masked attention

一般計算過程中,計算atten時只用前景部分計算,減少顯存占用。

(2) 多分辨率特征

如上圖,圖像經過backbone得到4層特征,然后經過Pixel Decoder得到O1,O2,O3,O4,注意O1,O2,O3經過Linear+Deform atten Layer,O4只通過Linear+卷積得到,具體可以區別看上圖。

(3) decoder優化

在transformer decoder(這個過程用的是標準attention)計算過程中,query剛開始都是隨機初始化的,沒有圖像特征,如果按常規直接self attention可能學不到充分的信息,所以將ca和sa兩個模塊反過來,先和pixdecoder得到的圖像O1,O2,O3計算ca,再繼續計算sa。

2.2 類別和mask分開預測

class和mask預測獨立開來,mask只預測是背景還是前景,class負責預測類別,這部分保留了maskformer的設計。

如上圖,class通過query加上Linear直接將維度轉到(n,k+1),其中k為類別數目。

mask通過decoder和最后一層的mask做外積運算,得到(k,h,w)的tensor,每個k代表一個前景。

采用這種query的方式,既可以做instance也可以做語義分割,query的數量N和類別K數量無關。

2.3 loss優化

mask decoder過程中,主要用最后一層的輸出計算loss;同時為了輔助訓練,默認開啟了auxiliary loss(輔助loss),其他層的輸出也去計算loss。

還有一個trick,mask計算loss時,不是mask上的所有點都去計算,而是隨機采樣一定數目的點去計算loss。默認設置K?= 12544,?i.e., 112?×?112 points,這樣可以節省顯存。

3.擴展

3.1 DAT:另一個Deform atten設計

另一篇deform atten的論文DAT,和deform attention思路類似,也是學習offset。只不過在偏移量設計上有區別,如下圖所示,DAT在當前特征圖F上學習offset時,進行了上采樣2倍,在得到offset后需要插值回F的尺寸,增加了相對位置的bias。

對比幾種查詢的注意力結果,vit是全查,swin固定窗口大小,有可能限制查到的key,DCN為可變性卷積,DAT學到的key更好。

?

模型設計上,參考swin-transformer,只將最后2層替換Deformable attention,效果最好。

?

3.2 視頻實例分割跟蹤

mask2former用于視頻分割,結構如下

模型結構上和圖像的分割基本一致。

修改主要在transformer decoder,包含以下3個地方:

(1)增加時間編碼t

主要在Transformer decoder過程,圖像的位置編碼為(x,y),對于視頻,由于考慮了多幀數據,增加時間t進行編碼,位置編碼為(x,y,t)。

       # b, t, c, h, wassert x.dim() == 5, f"{x.shape} should be a 5-dimensional Tensor, got {x.dim()}-dimensional Tensor instead"if mask is None:mask = torch.zeros((x.size(0), x.size(1), x.size(3), x.size(4)), device=x.device, dtype=torch.bool)not_mask = ~maskz_embed = not_mask.cumsum(1, dtype=torch.float32)  # not_mask【bath,t,h,w】1代表時間列的索引,cumsum累加計算,得到位置idy_embed = not_mask.cumsum(2, dtype=torch.float32)  # hx_embed = not_mask.cumsum(3, dtype=torch.float32)  # wif self.normalize:eps = 1e-6z_embed = z_embed / (z_embed[:, -1:, :, :] + eps) * self.scaley_embed = y_embed / (y_embed[:, :, -1:, :] + eps) * self.scalex_embed = x_embed / (x_embed[:, :, :, -1:] + eps) * self.scaledim_t = torch.arange(self.num_pos_feats, dtype=torch.float32, device=x.device)dim_t = self.temperature ** (2 * (dim_t // 2) / self.num_pos_feats)dim_t_z = torch.arange((self.num_pos_feats * 2), dtype=torch.float32, device=x.device)dim_t_z = self.temperature ** (2 * (dim_t_z // 2) / (self.num_pos_feats * 2))pos_x = x_embed[:, :, :, :, None] / dim_t  # [b,t,h,w]->[b,t,h,w,d] xy編碼的d長度是位置編碼向量長度的一半pos_y = y_embed[:, :, :, :, None] / dim_tpos_z = z_embed[:, :, :, :, None] / dim_t_z # z用編碼向量長度,然后和xy編碼相加pos_x = torch.stack((pos_x[:, :, :, :, 0::2].sin(), pos_x[:, :, :, :, 1::2].cos()), dim=5).flatten(4)pos_y = torch.stack((pos_y[:, :, :, :, 0::2].sin(), pos_y[:, :, :, :, 1::2].cos()), dim=5).flatten(4)pos_z = torch.stack((pos_z[:, :, :, :, 0::2].sin(), pos_z[:, :, :, :, 1::2].cos()), dim=5).flatten(4)pos = (torch.cat((pos_y, pos_x), dim=4) + pos_z).permute(0, 1, 4, 2, 3)  # b, t, c, h, w

(2) query和多幀數據進行atten計算

        for i in range(self.num_feature_levels):size_list.append(x[i].shape[-2:])pos.append(self.pe_layer(x[i].view(bs, t, -1, size_list[-1][0], size_list[-1][1]), None).flatten(3))src.append(self.input_proj[i](x[i]).flatten(2) + self.level_embed.weight[i][None, :, None])  #level_embed size [level_num,d],level embed和輸入相加# NTxCxHW => NxTxCxHW => (TxHW)xNxC  # 多幀數據融合_, c, hw = src[-1].shapepos[-1] = pos[-1].view(bs, t, c, hw).permute(1, 3, 0, 2).flatten(0, 1)# 其中src是Pixel decoder的輸出src[-1] = src[-1].view(bs, t, c, hw).permute(1, 3, 0, 2).flatten(0, 1)

(3)query和mask計算優化

如代碼所示,query和mask 外積計算,從q外積mask得到mask的shape為[b,q,t,h,w],也就是得到(b,q,t)個instance mask,然后query的instance mask和每幀的gt計算loss。

    def forward_prediction_heads(self, output, mask_features, attn_mask_target_size):decoder_output = self.decoder_norm(output)decoder_output = decoder_output.transpose(0, 1)outputs_class = self.class_embed(decoder_output)mask_embed = self.mask_embed(decoder_output)# query和mask 外積計算,從q外積mask得到[b,q,t,h,w]個maskoutputs_mask = torch.einsum("bqc,btchw->bqthw", mask_embed, mask_features)b, q, t, _, _ = outputs_mask.shape# NOTE: prediction is of higher-resolution# [B, Q, T, H, W] -> [B, Q, T*H*W] -> [B, h, Q, T*H*W] -> [B*h, Q, T*HW]attn_mask = F.interpolate(outputs_mask.flatten(0, 1), size=attn_mask_target_size, mode="bilinear", align_corners=False).view(b, q, t, attn_mask_target_size[0], attn_mask_target_size[1])# must use bool type# If a BoolTensor is provided, positions with ``True`` are not allowed to attend while ``False`` values will be unchanged.attn_mask = (attn_mask.sigmoid().flatten(2).unsqueeze(1).repeat(1, self.num_heads, 1, 1).flatten(0, 1) < 0.5).bool()attn_mask = attn_mask.detach()return outputs_class, outputs_mask, attn_mask

訓練時是以instance作為一個基礎單元,假設有t幀圖像,有n個instance(實例),instance和frame的關系如下圖表示:

?

instance在每幀上都可能存在或者不存在。對于每個instance,初始化t個mask,初始化為0,所以instace的shape是[b,n,t,h,w],如果這個instance在某幀上存在,即賦真值mask,用于匹配計算loss;不存在,即為0。

instance在每幀上都是同一個物體(形態可能變化,但是instance id是相同的),所以預測instance的類別時,每個instance只需要預測一個類別即可,所以類別的shape為[b,n]

3.3 思考

sam(segment anything model)可以通過prompt進行分割,但是缺乏類別信息,可以參考mask2former的思想,mask和類別是獨立的,可以添加分類的query,接一個分類的分支,然后在coco等數據集上單獨訓練這個分支,讓sam分割后增加類別信息。

4.參考資料

  • mask2former論文
  • mask2former代碼


附贈

【一】上千篇CVPR、ICCV頂會論文
【二】動手學習深度學習、花書、西瓜書等AI必讀書籍
【三】機器學習算法+深度學習神經網絡基礎教程
【四】OpenCV、Pytorch、YOLO等主流框架算法實戰教程

? 在助理處自取:

?

? 還可咨詢論文輔導?【畢業論文、SCI、CCF、中文核心、El會議】評職稱、研博升學、本升海外學府!

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

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

相關文章

基于github.com/emmansun/gmsm庫編寫的SM2對C 開放的庫

go-gmsm cgo庫 介紹 基于github.com/emmansun/gmsm庫編寫的SM2對C 開放的庫 特性&#xff1a;非對稱加密、不支持跨平臺編譯 git地址&#xff1a;https://gitee.com/state-secret-series/go-gmsm.git 軟件架構 Go、Cgo、mod 安裝教程 克隆倉庫 git clone https://gite…

香橙派AIpro實測:YOLOv8便捷檢測,算法速度與運行速度結合

香橙派AIpro實測&#xff1a;YOLOv8便捷檢測&#xff0c;算法速度與運行速度結合 文章目錄 香橙派AIpro實測&#xff1a;YOLOv8便捷檢測&#xff0c;算法速度與運行速度結合一、引言二、香橙派AIpro簡介三、YOLOv8檢測效果3.1 目標檢測算法介紹3.1.1 YOLO家族3.1.2 YOLOv8算法理…

NDT配準收斂問題

GitHub - abougouffa/ndtpso_slam: ROS package for NDT-PSO, a 2D Laser scan matching algorithm for SLAM SRG NDT Das_Arun_2013.pdf;jsessionid97F7EDB4E8805EFE68D1E46687EF593F (uwaterloo.ca)

上海計算機考研炸了,這所學校慎報!上海大學計算機考研考情分析!

上海大學&#xff08;Shanghai University&#xff09;&#xff0c;簡稱“上大”&#xff0c;是上海市屬、國家“211工程”重點建設的綜合性大學&#xff0c;教育部與上海市人民政府共建高校&#xff0c;國防科技工業局與上海市人民政府共建高校&#xff0c;國家“雙一流”世界…

【微信小程序開發】微信小程序界面彈窗,數據存儲相關操作代碼邏輯實現

?? 歡迎大家來到景天科技苑?? &#x1f388;&#x1f388; 養成好習慣&#xff0c;先贊后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者簡介&#xff1a;景天科技苑 &#x1f3c6;《頭銜》&#xff1a;大廠架構師&#xff0c;華為云開發者社區專家博主&#xff0c;…

ArcGIS Pro SDK (七)編輯 12 編輯模版

ArcGIS Pro SDK &#xff08;七&#xff09;編輯 12 編輯模版 文章目錄 ArcGIS Pro SDK &#xff08;七&#xff09;編輯 12 編輯模版1 在圖層上按名稱查找編輯模板2 查找屬于獨立表的表模板3 當前模板4 更改模板的默認編輯工具5 隱藏或顯示模板上的編輯工具6 使用圖層創建新模…

how to use Xcode

Xcode IDE概覽 Xcode 頁面主要分為以下四個部分&#xff1a; 工具欄&#xff08;ToolBar area&#xff09;&#xff1a;主要負責程序運行調試&#xff0c;編輯器功能區域的顯示 / 隱藏&#xff1b;編輯區&#xff08;Editor area&#xff09;&#xff1a;代碼編寫區域&#xf…

140. 好二叉樹(卡碼網周賽第二十四期(23年騰訊音樂筆試真題))

140. 好二叉樹&#xff08;卡碼網周賽第二十四期&#xff08;23年騰訊音樂筆試真題&#xff09;&#xff09; 題目描述 小紅定義一個二叉樹為“好二叉樹”&#xff0c;當且僅當該二叉樹所有節點的孩子數量為偶數(0 或者 2)。 小紅想知道&#xff0c;n&#xff08;1< n <…

vue table表格 ( parseTime-格式化時間)

<el-table-column label"發布時間" width"420px" prop"bidPublishDatetime"><template slot-scope"scope"><span>{{ parseTime(scope.row.bidPublishDatetime, {y}-{m}-{d}) }}</span></template></…

若依代碼生成

在若依框架中&#xff0c;以下是這些代碼的作用及它們在程序運行中的關聯方式&#xff1a; 1. domain.java&#xff1a;通常用于定義實體類&#xff0c;它描述了與數據庫表對應的對象結構&#xff0c;包含屬性和對應的訪問方法。作用是封裝數據&#xff0c;為數據的操作提供基…

Richtek立锜科技車規級器件選型

芯片按照應用場景&#xff0c;通常可以分為消費級、工業級、車規級和軍工級四個等級&#xff0c;其要求依次為軍工>車規>工業>消費。 所謂“車規級元器件”--即通過AEC-Q認證 汽車不同于消費級產品&#xff0c;會運行在戶外、高溫、高寒、潮濕等苛刻的環境&#xff0c…

澳藍榮耀時刻,6款產品入選2024年第一批《福州市名優產品目錄》

近日&#xff0c;福州市工業和信息化局公布2024年第一批《福州市名優產品目錄》&#xff0c;澳藍自主研發生產的直接蒸發冷卻空調、直接蒸發冷卻組合式空調機組、間接蒸發冷水機組、高效間接蒸發冷卻空調機、熱泵式熱回收型溶液調濕新風機組、防火濕簾6款產品成功入選。 以上新…

飛利浦的臺燈值得入手嗎?書客、松下多維度橫評大分享!

隨著生活品質的持續提升&#xff0c;人們對于健康的追求日益趨向精致與高端化。在這一潮流的推動下&#xff0c;護眼臺燈以其卓越的護眼功效與便捷的操作體驗&#xff0c;迅速在家電領域嶄露頭角&#xff0c;更成為了眾多家庭書房中不可或缺的視力守護者。這些臺燈以其精心設計…

(vue)eslint-plugin-vue版本問題 安裝axios時npm ERR! code ERESOLVE

(vue)eslint-plugin-vue版本問題 安裝axios時npm ERR! code ERESOLVE 解決方法&#xff1a;在命令后面加上 -legacy-peer-deps結果&#xff1a; 解決參考&#xff1a;https://blog.csdn.net/qq_43799531/article/details/131403987

【C語言】指針剖析(完結)

©作者:末央&#xff06; ©系列:C語言初階(適合小白入門) ©說明:以凡人之筆墨&#xff0c;書寫未來之大夢 目錄 回調函數概念回調函數的使用 - qsort函數 sizeof/strlen深度理解概念手腦并用1.sizeof-數組/指針專題2.strlen-數組/指針專題 指針面試題專題 回調函…

云服務器linux系統安裝配置docker

在我們拿到一個純凈的linux系統時&#xff0c;我需要進行一些基礎環境的配置 &#xff08;如果是云服務器可以用XShell遠程連接&#xff0c;如果連接不上可能是服務器沒開放22端口&#xff09; 下面是配置環境的步驟 sudo -s進入root權限&#xff1a;退出使用exit sudo -i進入…

process.env.VUE_APP_BASE_API

前端&#xff1a;process.env.VUE_APP_BASE_API 在Vue.js項目中&#xff0c;特別是使用Vue CLI進行配置的項目&#xff0c;process.env.VUE_APP_BASE_API 是一個環境變量的引用。Vue CLI允許開發者在不同環境下配置不同的環境變量&#xff0c;這對于管理API基礎路徑、切換開發…

MySQL調優的五個方向

客戶端與連接層的優化&#xff1a;調整客戶端DB連接池的參數和DB連接層的參數。MySQL結構的優化&#xff1a;合理的設計庫表結構&#xff0c;表中字段根據業務選擇合適的數據類型、索引。MySQL參數優化&#xff1a;調整參數的默認值&#xff0c;根據業務將各類參數調整到合適的…

【leetcode78-81貪心算法、技巧96-100】

貪心算法【78-81】 技巧【96-100】

谷粒商城-個人筆記(集群部署篇二)

前言 ?學習視頻&#xff1a;?Java項目《谷粒商城》架構師級Java項目實戰&#xff0c;對標阿里P6-P7&#xff0c;全網最強?學習文檔&#xff1a; 谷粒商城-個人筆記(基礎篇一)谷粒商城-個人筆記(基礎篇二)谷粒商城-個人筆記(基礎篇三)谷粒商城-個人筆記(高級篇一)谷粒商城-個…