【更新特徵 - 小樣本分割】Mining Latent Classes for Few-shot Segmentation
主要思路和創新點
這是我看的第一篇小樣本分割的論文,一開始很驚奇文章的做法,後來發現其實一大部分都是之前的常規操作哈哈哈。所以概括起來本文的創新點在於不斷更新支援集特徵,以獲取到訓練圖片更多可能的額外分割物體,同時,也利用了更多未標註的圖片建立新的分支幫助訓練。
上圖是文章對以往方法不足之處的一個概括,在使用支援集特徵學習查詢圖片時,只考慮當前的支援類。因此在查詢圖片中潛在的新類比如上圖的人就無法得到學習,在將它監督為背景時,模型降低了對這些新類物體的檢測能力。
首先,講一下本文對這種情況的處理方式。和先前方法一樣,將支撐圖片特徵透過遮罩平均池化(MAP: Masked Average Pooling)獲取該標註類別的原型特徵:
F 為特徵圖
其實就可以理解為將覆蓋物體的所有特徵平均了~類別 c 還包括了每張圖片中的背景類別,因為背景特徵差距很大,在本文中,作者直接採取平均所有圖片中背景類別作為最終背景原型特徵。
而對於前景來說,則將所有原型特徵使用 K-Means 聚類方法選出 K 個類中心,這些選出的中心特徵實際上並不代表某一種類別,只是明顯前景特徵的一種代表。K 的數量由不同的資料集而定,在實驗細節中,作者稱在 PASCAL-5 中僅使用 5 個聚類,COCO-20 中選取 15 個,甚至沒有訓練集總類別多。
之後則根據這些原型特徵對查詢圖片進行分割預測,先計算每個畫素特徵與原型特徵庫中的每個類別特徵的匹配程度,以及因此得到的匹配機率:
sigma 為溫度超引數,實驗中取 20
之後損失函式採用交叉熵:
實際上由於訓練和測試的時候不同類別圖片背景差異很大,所以文章提出了動態更新原型背景特徵的方法:
訓練時候的更新,m 取 0。999
測試時候的更新,w 取 0。9
而對於測試時的前景部分類別,為了使小樣本的特徵更具穩定和普遍性,文章透過選擇 K 張與支援圖片特徵相似度最大的圖片來生成偽原型特徵。而每張被選取的圖片則在 ResNet-50/101 第三層進行池化得到區域特徵,每張圖片選取相似度最大的那個區域特徵進行最終的加權平均矯正:
權重與相似度有關:
在這些所有的基礎上,作者提出也要透過一個額外的任務分支加快模型的訓練速度與前景挖掘能力。
我在這裡與整個文章敘述順序是反的哈哈哈~
實際上這是一張完整的結構圖,在第一個部分,作者先使用訓練好的模型為一些沒有標註的輔助圖片生成偽標籤,偽標籤生成方法和最終預測過程一樣:
之後在訓練的時候使用相同的編碼器,但對於這部分圖片會額外加一個簡易的解碼器結構,實際上也就是三層卷積,來預測最終分割圖。這部分損失也適用交叉熵,與提前生成的偽標籤圖作損失,總損失為:
Emmm……說了這麼多但目前開源的程式碼好像只有最基礎的部分,聊勝於無……
class
MatchingNet
(
nn
。
Module
):
def
__init__
(
self
,
backbone
):
super
(
MatchingNet
,
self
)
。
__init__
()
self
。
backbone
=
resnet
。
__dict__
[
backbone
](
pretrained
=
True
)
def
forward
(
self
,
img_s_list
,
mask_s_list
,
img_q
):
h
,
w
=
img_q
。
shape
[
-
2
:]
# feature maps of support images
feature_s_list
=
[]
for
k
in
range
(
len
(
img_s_list
)):
feature_s_list
。
append
(
self
。
backbone
。
base_forward
(
img_s_list
[
k
]))
# feature map of query image
feature_q
=
self
。
backbone
。
base_forward
(
img_q
)
# foreground(target class) and background prototypes pooled from K support features
feature_fg_list
=
[]
feature_bg_list
=
[]
for
k
in
range
(
len
(
img_s_list
)):
feature_fg_list
。
append
(
self
。
masked_average_pooling
(
feature_s_list
[
k
],
(
mask_s_list
[
k
]
==
1
)
。
float
())[
None
,
:])
feature_bg_list
。
append
(
self
。
masked_average_pooling
(
feature_s_list
[
k
],
(
mask_s_list
[
k
]
==
0
)
。
float
())[
None
,
:])
# average K foreground prototypes and K background prototypes
feature_fg
=
torch
。
mean
(
torch
。
cat
(
feature_fg_list
,
dim
=
0
),
dim
=
0
)
feature_bg
=
torch
。
mean
(
torch
。
cat
(
feature_bg_list
,
dim
=
0
),
dim
=
0
)
# measure the similarity of query features to fg/bg prototypes
similarity_fg
=
F
。
cosine_similarity
(
feature_q
,
feature_fg
[
。。。
,
None
,
None
],
dim
=
1
)
similarity_bg
=
F
。
cosine_similarity
(
feature_q
,
feature_bg
[
。。。
,
None
,
None
],
dim
=
1
)
out
=
torch
。
cat
((
similarity_bg
[:,
None
,
。。。
],
similarity_fg
[:,
None
,
。。。
]),
dim
=
1
)
*
10。0
out
=
F
。
interpolate
(
out
,
size
=
(
h
,
w
),
mode
=
“bilinear”
,
align_corners
=
True
)
return
out
def
masked_average_pooling
(
self
,
feature
,
mask
):
feature
=
F
。
interpolate
(
feature
,
size
=
mask
。
shape
[
-
2
:],
mode
=
“bilinear”
,
align_corners
=
True
)
masked_feature
=
torch
。
sum
(
feature
*
mask
[:,
None
,
。。。
],
dim
=
(
2
,
3
))
\
/
(
mask
[:,
None
,
。。。
]
。
sum
(
dim
=
(
2
,
3
))
+
1e-5
)
return
masked_feature
實驗結果
在 PASCAL-5 資料集上的實驗結果:unlabeled 表示最後提出的那個輔助任務,使用額外的未標註圖片來幫助訓練
在 COCO-20 資料集上的實驗結果
各組成部分精度貢獻的消融實驗:FG 表示前景矯正;BG 表示背景矯正;Mine 表示使用額外的分支挖掘新類
上表表示輔助任務只使用訓練集中的圖片;下表表示額外增加一些其他類的未標註圖片
一些無標籤資料來源的消融實驗
論文資訊
Mining Latent Classes for Few-shot Segmentation
https://
arxiv。org/pdf/2103。1540
2。pdf