【EmbedMask】《EmbedMask:Embedding Coupling for One-stage Instance Segmentation》
arXiv-2019
code:https://github.com/yinghdb/EmbedMask
在 FCOS 基礎上的改進
文章目錄
1 Background and Motivation
隨著深度學習的蓬勃發展,CNN 在計算機視覺中的應用已經從 image-level 擴充套件到 pixel-level。eg,例項分割就是對目標檢測的一種擴充套件,detected objects from instance-level to pixel-level.
當前基於 CNN 做例項分割的方法可以分為兩類
- Proposal-based methods:先用目標檢測方法檢測目標框,再在框內區域進行 pix-level 的分類。代表性的方法有 Mask R-CNN (參考【Mask RCNN】《Mask R-CNN》) , one-stage 普遍沒有 two-stage 的目標檢測方法的方法猛,two-stage 中 RoI pooling 操作又會存在如下兩個缺點
- results in the loss of features and the distortion to the aspect ratios
- complex to adjust too many parameters
- segmentation based methods: segment first then do clustering,這類方法都沒有 re-pooling 操作(RoI pooling),難點在 cluster 的過程中,很難去 determine the number of clusters or the positions of the cluster centers
作者融合兩類分割方法的優點(It preserves strong detection capabilities as the proposal-based methods, and meanwhile keeps the details of images as the segmentation-based methods),提出了 EmbedMask 例項分割方法,用 embedding 的方式來 simplifies the clustering procedure in the segmentation-based methods and avoid the repooling procedure in Mask R-CNN
2 Related Work
- Proposal-based methods:detection and segmentation
- Two-stage Methods,eg Mask RCNN
- One-stage Methods,eg YOLACT、TensorMask
- Segmentation-based Methods(bottom-up methods):first segmenting and then clustering(eg 讓屬於同一例項的畫素在 embedding 空間中儘量靠在一起)
3 Advantages / Contributions
- propose a framework that unites the proposal-based and segmentation-based methods,通過 pixel-embedding 和 proposal embedding
- one-stage 例項分割方法,但是 higher quality(挑了些圖) and higher speed than two-stage 的 Mask RCNN(但 AP 沒別人高喲)
4 Method
pixel embeddings, proposal embeddings, and proposal margins to extract the instance masks
d
=
32
d=32
d=32
location x j x_j xj 處 p r o p o s a l j proposal_j proposalj 的所有引數為 { c l a s s j , b o x j , c e n t e r j , q j , σ j } \{class_j, box_j,center_j, q_j,\sigma_j\} {classj,boxj,centerj,qj,σj}
其中 q j q_j qj 是 proposal embedding,which is regarded as the cluster center
σ j \sigma_j σj 是 proposal margin
pixel embedding 和 proposal embedding 的相似度來生成每個候選區域中的 mask,proposal margin δ \delta δ 相當於一個相似度的閾值,來決定最終的 mask
4.1 Embedding Definition
作者提出了下面兩種新的 embedding 方式
-
proposal embedding, which is a good representation of entire instance
-
pixel embedding, which learns the relation between each pixel with corresponding instance
在 embedding 空間中,proposal embedding 相當於聚類中心,然後同一個 instance 的 pixel embedding 會在這個聚類中心附近
相比於其他方法,作者的這種 embedding 方式就避免了找 cluster center 的位置和數量的問題了
常規的思路是
- p i p_i pi 是 pixel embeddings
- q i q_i qi 是 proposal embedding
- δ \delta δ 是 proposal margin
- Q k Q_k Qk 是 instance proposal S k S_k Sk(GT mask) 內,正樣本區域 q i q_i qi 的平均值,也即聚類中心
訓練的時候 S k S_k Sk 是 GT mask, Q k Q_k Qk 是所有 positive proposal embedding 的平均值,優化目標是讓同一 instance 的 pixel embedding 與 proposal embedding 儘可能的近(pull),與背景畫素儘可能的遠(push)
在公式(1)的基礎上,採用 hinge loss,就可以訓練了
- K K K: GT instance 的數量
- B k B_k Bk:represents the set of pixel embeddings that need to be supervised for the instance S k S_k Sk,GT mask 對應的 bbox 的區域
- N k N_k Nk:the number of pixel embeddings in B k B_k Bk
- I ( i ∈ S k ) \mathbb{I}(i \in S_k) I(i∈Sk) indicator function
- S k S_k Sk:GT instance 的 mask
- Q k Q _k Qk 是所有 positive proposal embedding 的平均值,positive 區域是預測的 bbox 與 S k S_k Sk 對應的 bbox IoU 大於 0.5 的區域內
- [ x ] + [x]_+ [x]+:表示 max(0,x)
- δ a \delta_a δa 和 δ b \delta_b δb 是 two margins designed for push and pull strategy
第一項是 pull 到 margin δ a \delta_a δa 內,第二項是 push 到 margin δ b \delta_b δb 外
畫個圖這個關係就很明瞭,橫座標是 p-q,縱座標分別是兩項 loss
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-2,5,100)
y1 = np.array([max(0,(i-1))**2 for i in x])
y2 = np.array([max(0,(1-j))**2 for j in x])
plt.plot(x,y1)
plt.plot(x,y2)
plt.legend(['y1','y2'],loc="upper center")
# gca = get current axis
ax = plt.gca() # x,y
# spines = 上下左右四條黑線
ax.spines['right'].set_color('none') # 讓右邊的黑線消失
ax.spines['top'].set_color('none') # 讓上邊的黑線消失
ax.xaxis.set_ticks_position('bottom') # 把下面的黑線設定為x軸
ax.yaxis.set_ticks_position('left') # 把左邊的黑線設定為y軸
ax.spines['bottom'].set_position(('data',0)) # 移動x軸到指定位置,本例子為0
ax.spines['left'].set_position(('data',0)) # 移動y軸到指定位置,本例子為0
plt.show()
第一項 x 超過了設定的閾值,損失就會越來越大,第二項 x 小於閾值,損失就會越來越大
作者發現設定固定的 margin (difficult to find the optimal values),
因此採用 learning 的方式,來學習一個 margin
3.2 Learnable Margin
採用高斯公式來判斷畫素是否屬於例項,取代 3.1 小節的公式 (1)
map the distance between the pixel embedding p i p_i pi of the pixel x i x_i xi and the proposal embedding Q k Q_k Qk of the instance S k S_k Sk into a value ranged in [0, 1)
- Σ k \Sigma_k Σk 就是 positive 區域的 σ j \sigma_j σj 的均值,類比 q j q_j qj 和 Q k Q_k Qk 的關係,positive 是預測的 bbox 與 S k S_k Sk 對應的 bbox IoU 大於 0.5 的區域內
- ϕ ( x i , S k ) \phi(x_i,S_k) ϕ(xi,Sk) 表示畫素 x i x_i xi 屬於 GT mask S k S_k Sk 的概率
整體的 loss 就沒有用公式(3)中的 hinge loss 了, 而採用瞭如下形式
- L ( ⋅ ) L(·) L(⋅) 是 binary classification loss function
- ϕ ( x i , S k ) \phi(x_i,S_k) ϕ(xi,Sk) 表示畫素 x i x_i xi 屬於 GT mask S k S_k Sk 的概率
- G ( x i , S k ) \mathbb{G}(x_i,S_k) G(xi,Sk) represents the ground truth label for pixel x i x_i xi to judge whether it is in the mask of the proposal S k S_k Sk, which is a binary value
相當於需要網路學 Σ \Sigma Σ,而不是用固定的 σ \sigma σ,實際中學習的是 1 2 σ 2 \frac{1}{2\sigma^2} 2σ21(會用指數函式保證預測出來的都是正值)
3.3 Smooth Loss
Q k Q_k Qk 和 Σ k \Sigma_k Σk 的計算方式如下
- M k M_k Mk 是正樣本畫素的集合——當前畫素預測出的 bbox 與 GT bbox 的 IoU > 0.5
注意,訓練的時候 S k S_k Sk 是 GT,會被用到如下兩個地方
- 來算 Q k Q_k Qk 和 Σ k \Sigma_k Σk 的正樣本區域時候(在 GT mask 區域內選 IoU > 0.5 的位置)
- 算二值損失公式(4)時
測試的時候,我們是不知道 S k S_k Sk 的,無法計算 Q k Q_k Qk 和 Σ k \Sigma_k Σk,所以作者在測試的時候把公式(3)中的 Q k Q_k Qk 和 Σ k \Sigma_k Σk 替換為了當前位置的 q j q_j qj 和 σ j \sigma_j σj
這樣,訓練和測試的 Q k Q_k Qk 和 Σ k \Sigma_k Σk 就不一樣(訓練的時候是區域 embedding 的平均值,測試的時候是當前位置的 embedding),作者用如下損失來緩解這種情況
讓每個位置的 embedding 儘量和他們的聚類中心差距較小
3.4 Training
計算 loss 的時候,feature map 和 embedding 都 resize 到原圖長寬的 1/4
其中
λ 1 = 0.5 \lambda_1 = 0.5 λ1=0.5, λ 1 = 0.1 \lambda_1 = 0.1 λ1=0.1
1)Training Samples for Box and Classification
FCOS
{ b o x j , c l a s s j , c e n t e r j } \{box_j, class_j, center_j\} {boxj,classj,centerj},正樣本被定義為,locate on the center region of the ground-truth bounding box,且在 GT mask 區域內
2)Training Samples for Proposal Embedding and Margin
正樣本被定義為,當前畫素預測出的 bbox 與 GT bbox 的 IoU > 0.5(且在 GT mask 內)
3)Training Samples for Pixel Embedding
正樣本被定義為,落在 GT bbox 中的 pixel,實驗中發現, expand bbox,增加 training sample(負樣本)效果會更好
3.5 Inference
根據 NMS 後的 bbox(預設都是正樣本了),用當前位置的 q j q_j qj 和 σ j \sigma_j σj 代替 Q Q Q 和 Σ \Sigma Σ,然後代入下面公式 計算 x i x_i xi 屬於 S k S_k Sk 的概率
5 Experiments
5.1 Datasets
- MS COCO
- trainval35k split (115K images) for training,
- minival split (5K images) for ablation study
- test-dev (20K images) for reporting the main results
5.2 Main Results
1)Quantitative Results
一階段中最好
2)Qualitative Results
左圖 mask rcnn,右圖 embedmask,can provide more detailed masks than Mask R-CNN with sharper edges(沒有 re-pooling 帶來的 detail missing)
5.3 Ablation Study
1)Fixed vs. Learnable Margin
δ a = 0.5 \delta_a = 0.5 δa=0.5, δ b = 0.8 \delta_b = 0.8 δb=0.8, δ = 1.5 \delta = 1.5 δ=1.5
學出來的更好
2)The Choice of Cluster Centers
用 p j p_j pj 作為聚類中心,不用 Q k Q_k Qk 作為聚類中心,結果如下
3)Sampling Strategy
也即正樣本取樣策略
{ b o x j , c l a s s j , c e n t e r j } \{box_j, class_j, center_j\} {boxj,classj,centerj} 是否落在中心區域
{
p
j
,
σ
j
}
\{p_j,\sigma_j\}
{pj,σj} IoU>0.5
在 mask 內,且 IoU >0.5 合起來,效果會更好
4)Training Samples for Pixel Embedding
正樣本為 GT mask 內的畫素,bbox 擴大 1.2 倍,增加 training sample(負樣本)效果會更好
5)Embedding Dimension
6 Conclusion(own)
- proposal margin,實際中學習的是 1 2 σ 2 \frac{1}{2\sigma^2} 2σ21,會用指數函式保證預測出來的都是正值
- 小寫 q q q 和 大寫 Q Q Q,小寫 σ \sigma σ 和 大寫 Σ \Sigma Σ 的區別是,小寫代表每個位置的 embedding,大寫表示正樣本區域(bbox IoU>0.5)的 embedding 均值
相關文章
- Rank & Sort Loss for Object Detection and Instance Segmentation 論文解讀(含核心原始碼詳解)ObjectSegmentation原始碼
- IJCAI-PRICAI 3D AI Challenge 2020: Instance Segmentation第二名方案AI3DSegmentation
- FCOS: Fully Convolutional One-Stage Object DetectionObject
- Embedding flow
- code embedding研究系列一-基於token的embedding
- 時間embedding
- LintCode-Word SegmentationSegmentation
- tacmd[203] no segmentation fault(coredump)ACMSegmentation
- Segmentation fault (coredump)的解決Segmentation
- Embedding技術與應用(4): Embedding應用工程探析
- Embedding Kotlin PlaygroundKotlin
- Stable Diffusion中的embedding
- 目標檢測:Segmentation is All You Need ?Segmentation
- 什麼是細分Segmentation? - KDnuggetsSegmentation
- 執行sqlplus遭遇Segmentation FaultSQLSegmentation
- 構建RAG應用-day03: Chroma入門 本地embedding 智譜embedding
- Go 1.16 推出 Embedding FilesGo
- Embedding Kotlin Playground TipsKotlin
- instance和clientclient
- Oracle database instanceOracleDatabase
- The Instance and the Database (285)Database
- STATUS OF ORACLE INSTANCEOracle
- mysql執行命令報segmentation fault 錯誤MySqlSegmentation
- LISA: Reasoning Segmentation via Large Language ModelSegmentation
- pytorch中nn.Embedding理解PyTorch
- 論文解讀《Cauchy Graph Embedding》
- torch.nn.Embedding使用詳解
- Transformer模型:Position Embedding實現ORM模型
- sqplus 的 segmentation fault錯誤及解決!Segmentation
- netca 啟動時報錯(Segmentation fault(coredump))Segmentation
- 顧客細分(Customer Segmentation)(轉載)Segmentation
- 理解Database和InstanceDatabase
- Monitoring an SAP instance
- BIEE Instance OracleBIPresentat DownOracle
- Overview of Instance and Crash RecoveryView
- Oracle instance解釋Oracle
- TensorFlow-7-TensorBoard Embedding可ORB
- 文字向量化模型acge_text_embedding模型