原創(chuàng) | Deformable DETR: 基于稀疏空間采樣的注意力機(jī)制,讓DCN與Transformer一起玩!
摘要:Deformable DETR提出了一種新玩法:它借鑒了DCN的思想,提出可變形注意力機(jī)制——每個(gè)特征像素不必與所有特征像素交互計(jì)算,只需要與部分基于采樣獲得的其它像素交互,并且這些采樣點(diǎn)的位置是可學(xué)習(xí)的。這是一種局部(local)和稀疏(sparse)的高效注意力機(jī)制,能夠解決DETR收斂慢與能夠處理的特征分辨率受限的問(wèn)題。
前言
DETR提出后,Transformer就被帶到目標(biāo)檢測(cè)這邊玩起來(lái)了,而且還玩出各種花樣,你看,這不就來(lái)了個(gè)可變形的DETR——Deformable DETR(名字倒是挺帥)。
看到'Deformable'字樣,估計(jì)各位煉丹師第一反應(yīng)都會(huì)是DCN(Deformable Convolutional NeTworks)。沒(méi)錯(cuò),這里就是借鑒了DCN的思想,將其應(yīng)用在注意力機(jī)制上。
相對(duì)于Transformer那種全局(global)&密集(dense)的注意力機(jī)制,這里提出了一種新玩法:每個(gè)參考點(diǎn)僅關(guān)注鄰域的一組采樣點(diǎn),這些采樣點(diǎn)的位置并非固定,而是可學(xué)習(xí)的(和可變形卷積一樣),從而實(shí)現(xiàn)了一種局部(local)&稀疏(sparse)的高效注意力機(jī)制。
OK,接下來(lái)一起和CW看看具體是怎么玩的吧!
附:Paper & Code(文末提取鏈接a、b)
1.研究動(dòng)機(jī)
DETR膩害啊,DETR好哇(猜測(cè)作者內(nèi)心:太好了,我可以在這基礎(chǔ)上玩,然后發(fā)paper了)!作者開(kāi)篇先吹了DETR一波,那么厲害在哪里、好在哪里呢?
i). 第一個(gè)端到端的目標(biāo)檢測(cè)器;
ii). 不需要眾多手工設(shè)計(jì)組件(如anchor、固定規(guī)則的標(biāo)簽分配策略、NMS后處理等)
iii). DETR實(shí)質(zhì)上相當(dāng)于是給出了一個(gè)方法論,猶如“普度眾生”,告訴大家Transformer可以拿到目標(biāo)檢測(cè)中來(lái)玩,并沒(méi)有過(guò)多地追求其它方面的成就(沒(méi)有使用一些騷里騷氣的tricks去漲點(diǎn)),剩下的就讓你們?nèi)ネ姘?,真是良心了!(私以為,作者盛贊DETR最真實(shí)的在于這點(diǎn)哈哈哈~?。?/p>
OK,這波吹完后,作者開(kāi)始為他的工作作鋪墊了,一個(gè)‘However’可謂峰回路轉(zhuǎn):
Howerver, it suffers from?slow convergence?and?limited feature spatial resolution, due to the limitation of Transformer attention modules in processing image feature maps.
也就是說(shuō)DETR收斂慢而且能夠處理的特征分辨率有限,而且,鍋還甩在了Transformer上(Transformer內(nèi)心:我好不容易來(lái)CV界混一混,還沒(méi)過(guò)足癮這就被噴了???)。至于原因嘛,主要有以下兩點(diǎn):
i). Transformer在初始化時(shí),分配給所有特征像素的注意力權(quán)重幾乎是均等的,這就造成了模型需要長(zhǎng)時(shí)間去學(xué)習(xí)關(guān)注真正有意義的位置,這些位置應(yīng)該是稀疏的;
ii). Transformer在計(jì)算注意力權(quán)重時(shí),伴隨著高計(jì)算量與空間復(fù)雜度。特別是在編碼器部分,與特征像素點(diǎn)的數(shù)量成平方級(jí)關(guān)系,因此難以處理高分辨率的特征(這點(diǎn)也是DETR檢測(cè)小目標(biāo)效果差的原因)
至此,作者認(rèn)為鋪墊得差不多了,再?lài)娤氯ゾ瓦^(guò)分了(Tranformer內(nèi)心:我太難了~),見(jiàn)好就收。
2.方法概述
鋪墊完,是時(shí)候秀秀自己的工作了。作者認(rèn)為,既然要學(xué)習(xí)稀疏的空間位置,為何不用可變形卷積那套呢?但是,可變形卷積同時(shí)也缺乏關(guān)系建模能力,而這點(diǎn)恰好是Transformer最擅長(zhǎng)的,于是作者最終就將兩者放在一起玩,這個(gè)玩法就是 Deformable DETR。
當(dāng)然,這不是玩玩而已,Deformable DETR是能解決DETR的慢收斂與高計(jì)算復(fù)雜度問(wèn)題的。
作者秀到:這個(gè)玩法最大的亮點(diǎn)在于提出了可變形注意力模塊,相比于Transformer那種有點(diǎn)'low'的方式,在這里,每個(gè)特征像素不必與所有特征像素交互計(jì)算,只需要與部分基于采樣獲得的其它像素“親密接觸”(交互)即可。
這就大大加速了模型收斂,同時(shí)也降低了計(jì)算復(fù)雜度與所需的空間資源。另外,該模塊能夠很方便地應(yīng)用到多尺度特征上,連FPN都不需要。
這么一看,好像有點(diǎn)膩害哦,具體是怎么做到的?下面CW就帶大家一起來(lái)看看。
3.主要方法
i). Multi-Scale Features & Scale-Level Embedding
在上一節(jié)也提到過(guò),作者說(shuō)可變形注意力能夠用于處理多尺度特征,于是在backbone部分提取了不同層級(jí)的特征,總共有4層,其中C3~C5來(lái)自ResNet,下采樣率對(duì)應(yīng)為8、16、32,C6由C5經(jīng)過(guò)步長(zhǎng)為2的3x3卷積得到。

要知道,DETR僅用了單尺度特征,于是對(duì)于特征點(diǎn)位置信息的編碼,使用的是三角函數(shù),不同位置的特征點(diǎn)會(huì)對(duì)應(yīng)不同的編碼值,沒(méi)問(wèn)題。
但是,注意了,這僅能區(qū)分位于單尺度特征點(diǎn)的位置!而在多尺度特征中,位于不同特征層的特征點(diǎn)可能擁有相同的(h,w)坐標(biāo),這樣就無(wú)法區(qū)分它們的位置編碼了。
針對(duì)這個(gè)問(wèn)題,作者增加使用一個(gè)稱(chēng)之為'scale-level embedding'的東東,它僅用于區(qū)分不同的特征層,也就是同一特征層中的所有特征點(diǎn)會(huì)對(duì)應(yīng)相同的scale-level embedding,于是有幾層特征就使用幾個(gè)不同的scale-level embedding。
另外,不同于三角函數(shù)那種固定地利用公式計(jì)算出來(lái)的編碼方式,這個(gè)scale-level embedding是隨機(jī)初始化并且是隨網(wǎng)絡(luò)一起訓(xùn)練的、是可學(xué)習(xí)的:

在實(shí)際使用時(shí),這個(gè) scale-level embedding 與基于三角函數(shù)公式計(jì)算的 position embedding 相加在一起作為位置信息的嵌入:

ii). Deformable Attention(& Multi-Scale)
可變形注意力的道理用大白話來(lái)說(shuō)很簡(jiǎn)單:query不是和全局每個(gè)位置的key都計(jì)算注意力權(quán)重,而是對(duì)于每個(gè)query,僅在全局位置中采樣部分位置的key,并且value也是基于這些位置進(jìn)行采樣插值得到的,最后將這個(gè)局部&稀疏的注意力權(quán)重施加在對(duì)應(yīng)的value上。
OK,“普通話”講完,該高大上(公式+代碼)一番了。Transformer中多頭注意力的公式如下:

其中,zq看作query,由x經(jīng)過(guò)線性變換生成,q是對(duì)應(yīng)的索引,k是key的索引,Omegak即所有的k集合,m代表是第幾個(gè)注意力頭部,Wm是對(duì)注意力施加在value后的結(jié)果進(jìn)行線性變換從而得到不同頭部的輸出結(jié)果,W'm 用于將xk變換成value,Amqk代表歸一化的注意力權(quán)重。
由此可知,在Transformer的多頭注意力計(jì)算中,每個(gè)query都要與所有位置的key計(jì)算注意力權(quán)重,并且對(duì)應(yīng)施加在所有的value上。
再來(lái)看看我們(哦,不是我們,與我無(wú)關(guān),你們要嗎?)的Deformable Attetion:

和Transformer的很像是不是?(老師我沒(méi)有抄作業(yè),別兇..)可以看到,這里多了pq和delta_pmqk。其中,前者代表zq的位置(理解成坐標(biāo)即可),是2d向量,作者稱(chēng)其為參考點(diǎn)(reference points);而后者是采樣集合點(diǎn)相對(duì)于參考點(diǎn)的位置偏移(offsets)。
可以看到,每個(gè)query在每個(gè)頭部中采樣K個(gè)位置,只需和這些位置的特征交互(x(pq+delta_pmqk)代表基于采樣點(diǎn)位置插值出來(lái)的value),并不需要像Transformer般一開(kāi)始先從全局位置開(kāi)始學(xué)習(xí)才能逐漸過(guò)渡到關(guān)注局部(&稀疏的)的、真正有意義的位置。
需要注意的是,如可變形卷積一樣,位置偏移delta_pmqk是可學(xué)習(xí)的,由query經(jīng)過(guò)全連接層得到。
并且,注意力權(quán)重也一樣,直接由query經(jīng)過(guò)全連接層得到(因此,在可變形注意力機(jī)制下,其實(shí)沒(méi)有真正所謂的key來(lái)與query交互計(jì)算,為何可以這樣做,后文CW會(huì)談自己的看法)!
同時(shí)在K個(gè)采樣點(diǎn)之間歸一化,而非像Transformer般是由query與key交互計(jì)算得出的。OK,順著來(lái),看看可變形注意力是如何應(yīng)用到多尺度特征上的,依舊是公式走起:

這個(gè)也和上面的非常像是不是???(老師我真的沒(méi)有抄作業(yè)啊..太難了~)相比于上面,這里多了{(lán)xl}Ll=1和phil。
另外pq頭上多了個(gè)小尖角,代表歸一化到[0,1],而phil正是用于將歸一化的坐標(biāo)映射(re-scales)到各個(gè)特征層去,這樣,每個(gè)參考點(diǎn)在所有特征層都會(huì)有一個(gè)對(duì)應(yīng)的(歸一化)坐標(biāo),從而方便計(jì)算在不同特征層進(jìn)行采樣的那些點(diǎn)的位置。
至于{xl}Ll=1嘛,當(dāng)然就是代表多尺度特征咯,xl代表第l層的特征。
在這里,每個(gè)query在每個(gè)特征層都會(huì)采樣K個(gè)點(diǎn),共有L層特征,從而在每個(gè)頭部?jī)?nèi)共采樣LK個(gè)點(diǎn),注意力權(quán)重也是在這LK個(gè)點(diǎn)之間進(jìn)行歸一化。
另外,作者還提到,當(dāng)L=K=1且且W'm 是identity矩陣時(shí),該模塊就退化成可變形卷積;相對(duì)地,當(dāng)采樣所有可能的位置(即全局位置)時(shí),該模塊等效于Transfomer中的注意力。
道理說(shuō)完,依舊如CW的風(fēng)格,是時(shí)候上代碼了。


接下來(lái)有個(gè)亮點(diǎn),在以上最后的_reset_parameters()中,是關(guān)于生成初始的采樣點(diǎn)位置的:

具體實(shí)現(xiàn)以及道理看以上代碼和CW的注釋?zhuān)罱K效果就是,初始的采樣點(diǎn)位置相當(dāng)于會(huì)分布在參考點(diǎn)3x3、5x5、7x7、9x9方形鄰域。
在github上有朋友提過(guò)相關(guān)的issue,CW那時(shí)正好逛到,也給予了相應(yīng)的互動(dòng):Why sampling_offsets in `MSDeformAttn` is normalized by n_points(文末提取鏈接c)
另外,對(duì)于注意力權(quán)重的初始化,CW發(fā)現(xiàn)作者的源碼實(shí)現(xiàn)和paper中描述得有出入:

若按照以上的實(shí)現(xiàn),感覺(jué)明顯不合理,這樣會(huì)導(dǎo)致注意力權(quán)重為全0,從而使得這個(gè)模塊的輸出結(jié)果也會(huì)變?yōu)槿?。CW在github上提了issue,暫未有回復(fù):Initialization for bias parameters of the attention weights seems to be wrong(文末提取鏈接d)
接下來(lái)看看最重要的前向過(guò)程:

Deformable DETR有2-stage模式,后文會(huì)講到。在2-stage模式下,輸入到Decoder的參考點(diǎn)和object query&query embedding會(huì)有所不同。

以下主要是計(jì)算出采樣點(diǎn)的位置。2-stage模式下,輸入到Decoder的參考點(diǎn)是Encoder預(yù)測(cè)的top-k proposal boxes,也就是說(shuō)是4d的(非2-stage情況下是2d),于是需要分情況處理:

注意力權(quán)重有了,采樣點(diǎn)位置有了,最后就是計(jì)算結(jié)果了。

在這里,將注意力權(quán)重與value進(jìn)行weighted sum的實(shí)現(xiàn)是調(diào)用了用CUDA來(lái)實(shí)現(xiàn)的版本,因?yàn)镻ytorch版性能有點(diǎn)尷尬,不過(guò)我們也可以看看Pytorch的實(shí)現(xiàn),了解其中的邏輯。

以下就是基于采樣點(diǎn)位置插值出對(duì)應(yīng)的采樣特征(value):

最后就是將注意力權(quán)重和采樣特征進(jìn)行weighted sum:

iii). Deformable Transformer
這里的Transformer和DETR中的大體過(guò)程一致,最主要的區(qū)別在于用可變形注意力替代了Encoder中的自注意力(self-attention)以及Decoder中的交叉注意力(cross-attention)。
在分別解析Encoder和Decoder前,CW先向大家梳理下這里Transformer的整個(gè)pipeline(有源碼解析哦!)。
1). 為Encoder的輸入做準(zhǔn)備
主要是將一些輸入元素的維度展平(flatten),這些輸入元素包括:多尺度特征圖、各尺度特征圖對(duì)應(yīng)的mask(指示哪些部分屬于padding)、各尺度特征圖對(duì)應(yīng)的位置信息(position embedding + scale-level embedding),另外還有些輔助信息。
比如:各尺度特征圖的寬高、不同尺度特征對(duì)應(yīng)于被flatten的那個(gè)維度的起始索引、各尺度特征圖中非padding部分的邊長(zhǎng)占其邊長(zhǎng)的比例。




2). Encoder
編碼特征源碼對(duì)應(yīng)上圖最后一句。
輸出memory(編碼后的特征表示),shape是 (bs, h_lvl1*w_lvl1+h_lvl2*w_lvl2+.., c=256),其中h_lvli和w_lvli分別代表第i層特征圖的高和寬,于是第二個(gè)維度就是所有特征點(diǎn)的數(shù)量。編碼后,特征的最后一個(gè)維度(hidden_dim)為256。
3). 處理Encoder的輸出,為Decoder的輸入做準(zhǔn)備
這一步主要是得到參考點(diǎn)(reference points)。需要說(shuō)明下,在2-stage模式下,參考點(diǎn)和輸入到Decoder的object query及query embedding的生成方式和形式會(huì)有所不同:
如果是2-stage模式,那么參考點(diǎn)就是由Encoder預(yù)測(cè)的top-k得分最高的proposal boxes(注意,這時(shí)參考點(diǎn)是4d的,是bbox形式)。然后通過(guò)對(duì)參考點(diǎn)進(jìn)行位置嵌入(position embedding)來(lái)生成Decoder的object query(target) 和對(duì)應(yīng)的 query embedding;
否則,Decoder的 object query(target )和 query embedding 就是預(yù)設(shè)的embedding,然后將query embedding經(jīng)過(guò)全連接層輸出2d參考點(diǎn),這時(shí)的參考點(diǎn)是歸一化的中心坐標(biāo)形式。
另外,兩種情況下生成的參考點(diǎn)數(shù)量可能不同:2-stage時(shí)是有top-k(作者設(shè)置為300)個(gè),而1-stage時(shí)是num_queries(作者也設(shè)置為300)個(gè),也就是和object query的數(shù)量一致(可以理解為,此時(shí)參考點(diǎn)就是object query本身的位置)。

在閱讀源碼的過(guò)程中,CW發(fā)現(xiàn)這里有個(gè)小問(wèn)題,貌似不妥。由于分類(lèi)預(yù)測(cè)頭部的輸出維度是多分類(lèi)的,而proposals僅需二分類(lèi)就足夠了,作者在取top-k得分時(shí)直接用第一個(gè)類(lèi)別預(yù)測(cè)的結(jié)果來(lái)計(jì)算:

同時(shí),在不使用iterative bbox refine策略的情況下,會(huì)使得在第二階段對(duì)解碼輸出進(jìn)行分類(lèi)時(shí)都傾向于預(yù)測(cè)第一個(gè)類(lèi)別(使用iterative bbox refine時(shí),對(duì)Decoder每層都有不同的分類(lèi)預(yù)測(cè)頭部實(shí)例,參數(shù)不共享,并且在這里會(huì)額外使用一個(gè)獨(dú)立的分類(lèi)預(yù)測(cè)頭部,與應(yīng)用到Decoder中的不相關(guān))。關(guān)于檢測(cè)頭部的設(shè)置,代碼如下:

繼續(xù),緊接著pipeline來(lái)吧。


4). Decoder解碼特征并輸出參考點(diǎn)
若使用了iterative bbox refine策略,則Decoder每層都會(huì)預(yù)測(cè)bbox,這些bbox就會(huì)作為新一輪的參考點(diǎn)供下一層使用,相當(dāng)于coarse-to-fine的過(guò)程,不斷地對(duì)參考點(diǎn)進(jìn)行校正,最終會(huì)返回最后一層的校正結(jié)果。
由此可知,即便不是2-stage模式,只要使用了iterative bbox refine策略,這里返回的參考點(diǎn)也會(huì)變?yōu)?d的形式。
因?yàn)闄z測(cè)頭部的回歸分支預(yù)測(cè)出來(lái)的結(jié)果是4d(xywh)形式的,而且是相對(duì)于參考點(diǎn)的偏移量(并非絕對(duì)坐標(biāo)位置)。如果初始進(jìn)來(lái)的參考點(diǎn)是2d的,那么wh就僅由檢測(cè)頭部的預(yù)測(cè)結(jié)果決定。
相對(duì)地,如果沒(méi)有使用iterative bbox refine策略,那么這里返回的參考點(diǎn)和初始輸進(jìn)來(lái)的一樣,保持不變。

5). 輸出解碼特征和參考點(diǎn)
這里輸出的參考點(diǎn)有兩個(gè),包括初始進(jìn)入Decoder前的和Decoder返回的。在上一步也說(shuō)過(guò),如果沒(méi)有使用iterative bbox refine策略,則兩者是一樣的。
iv).Encoder
這里的Encoder與Transformer中最主要的區(qū)別在于使用可變形注意力替代了原生的自注意力。類(lèi)似地,在每層編碼時(shí)會(huì)將上一層輸出的編碼特征作為下一層的輸入,這個(gè)輸入與position emebdding結(jié)合作為query、而經(jīng)過(guò)線性變換則作為value。

現(xiàn)在具體來(lái)看看主要有哪些過(guò)程:
1). 計(jì)算參考點(diǎn)的位置這里的參考點(diǎn)實(shí)質(zhì)就是多尺度特征點(diǎn)的歸一化坐標(biāo)。注意,每個(gè)特征點(diǎn)在所有特征層都會(huì)計(jì)算出一個(gè)對(duì)應(yīng)的歸一化坐標(biāo)(后文會(huì)談到為何這樣做)。


CW通過(guò)源碼發(fā)現(xiàn)有個(gè)小問(wèn)題:這里在對(duì)坐標(biāo)歸一化時(shí)使用的是非padding部分的特征圖邊長(zhǎng),而不同層非padding部分的邊長(zhǎng)比例有可能由于計(jì)算時(shí)的舍入誤差而不一致,從而導(dǎo)致最終歸一化后的坐標(biāo)值大于1。
2). self-attention
使用(多尺度)可變形注意力模塊替代原生的Transformer自注意力,query和value均來(lái)自特征圖,只不過(guò)query要結(jié)合position embedding,注意,這里的position embedding實(shí)質(zhì)是position emebedding + scale-level emebedding。
3). feed-forward neTwork
前向反饋網(wǎng)絡(luò),和Transformer中的一致:由全連接層、激活函數(shù)、Dropout、殘差連接以及層歸一化(LayerNorm)組成。

vi).Decoder
這里與Transformer中主要的區(qū)別在于使用可變形注意力替代了原生的交叉注意力。類(lèi)似地,每層的解碼過(guò)程是self-attention+cross-attention+ffn,下一層輸入的object query是上一層輸出的解碼特征。

一起具體來(lái)看看每層的主要過(guò)程:
1). 將參考點(diǎn)坐標(biāo)映射(re-scales)到各尺度特征層
將每個(gè)參考點(diǎn)的坐標(biāo)分別都乘以各特征層非padding部分邊長(zhǎng)的比例,使得一個(gè)參考點(diǎn)在所有尺度特征層上都有相應(yīng)的歸一化坐標(biāo)值(后文會(huì)談到為何這樣做)。


2). self-attention
這一步是為了學(xué)習(xí)各個(gè)目標(biāo)之間的關(guān)系,query和key都是object query+query embedding,value就是object query(注意不需要位置嵌入哦)。

3). cross-attention
使用(多尺度)可變形注意力模塊替代原生的Transformer交叉注意力,object query來(lái)自self-attention層的輸出,同時(shí)也要加上query embedding;value由Encoder編碼的特征經(jīng)過(guò)線性變換得到。

4). feed-forward neTwork
輸入來(lái)自cross-attention的輸出,詳細(xì)過(guò)程就不再闡述了,都是老朋友了~

5). iterative bounding box refinement
僅當(dāng)使用了iterative bbox refine策略時(shí)有這一步:使用bbox檢測(cè)頭部對(duì)解碼特征進(jìn)行預(yù)測(cè),得到相對(duì)于參考點(diǎn)(boxes or points)的偏移量,然后加上參考點(diǎn)坐標(biāo)(先經(jīng)過(guò)反sigmoid處理,即先從歸一化的空間從還原出來(lái)),最后這個(gè)結(jié)果再經(jīng)過(guò)sigmoid(歸一化)得到校正的參考點(diǎn),供下一層使用(在輸入下一層之前會(huì)取消梯度,因?yàn)檫@個(gè)參考點(diǎn)在各層相當(dāng)于作為先驗(yàn)的角色)。


6). 輸出各層的解碼特征和參考點(diǎn)

4.改進(jìn)策略
Deformable DETR是怎么讓DCN和Transformer一起玩的,CW在上述已基本解析完畢。無(wú)奈作者還研究了“高配版”的Deformable DETR,涉及兩個(gè)提升性能的策略:iterative bounding box refinement & Two-stage。于是,CW又要多碼不知道多少字了..
i). Iterative Bounding Box Refinement
字面意思就是迭代地對(duì)bbox進(jìn)行校正,類(lèi)似于cascaded head,實(shí)質(zhì)上也是coarse-to-fine不斷校正的一個(gè)過(guò)程。第d層Decoder校正后歸一化的bbox用公式表示如下:

其中delta_bdq{x,y,w,h}是第d層Decoder利用檢測(cè)頭部的回歸分支預(yù)測(cè)的結(jié)果(偏移量),sigma和sigma-1分別代表sigmoid和反sigmoid函數(shù)。
在這里需要注意兩點(diǎn):1. 各層的檢測(cè)頭部是不共享參數(shù)的;2. 校正后的bbox梯度會(huì)被阻斷(detach),不會(huì)跨層傳播
具體實(shí)現(xiàn)和解析在上一節(jié)講Decoder的時(shí)候已詳細(xì)說(shuō)明,這里就讓CW偷懶一下下吧~
ii). Two-Stage Deformable DETR
2-stage模式下,Encoder會(huì)輸出一批proposals(并不是基于網(wǎng)絡(luò)預(yù)測(cè),而是像anchor一樣計(jì)算出來(lái)的),boxes中心就是各特征點(diǎn)的中心,而寬、高的設(shè)置則與所在的特征層相關(guān),base值設(shè)置為0.05。這時(shí)的proposals相對(duì)于anchors的角色。
然后,使用檢測(cè)頭部的分類(lèi)分支對(duì)Encoder編碼的特征(memory)進(jìn)行預(yù)測(cè),對(duì)應(yīng)各個(gè)proposals的分類(lèi)結(jié)果;同時(shí)使用回歸分支也對(duì)編碼特征也進(jìn)行預(yù)測(cè),得到相對(duì)于proposals(xywh)的偏移量,接著將偏移量加在proposals的中心坐標(biāo)和寬、高上得到第一階段預(yù)測(cè)的proposals。
最后,取top-k分?jǐn)?shù)最高的那批預(yù)測(cè)proposals作為Decoder的參考點(diǎn)。并且,Decoder的object query和query embedding都由參考點(diǎn)通過(guò)位置嵌入(position embedding)來(lái)生成。具體的代碼過(guò)程在前面Deformable Transformer已有解析,這里就不再重復(fù)啦~
5.頭腦風(fēng)暴
i). 為何不需要FPN也能達(dá)到跨層融合的效果?
作者在paper中說(shuō)到,多尺度可變形注意力可以在不同尺度的特征之間交換信息,因此不需要FPN:
Note that?the top-down structure in FPN (Lin et al., 2017a) is not used, because our proposed multi-scale deformable attention in itself can exchange information among multi-scale feature maps.
那么到底是為何?具體是怎么做到的呢?
其實(shí)前文也提到了,每個(gè)參考點(diǎn)在各尺度特征層都會(huì)進(jìn)行采樣。而且在上述處理參考點(diǎn)坐標(biāo)的過(guò)程中,我們也可以看到,無(wú)論在Encoder還是Decoder,都會(huì)對(duì)參考點(diǎn)進(jìn)行處理,使得一個(gè)參考點(diǎn)在所有尺度特征層上都有相應(yīng)的歸一化坐標(biāo)值。為什么這樣做呢?這樣做其實(shí)就是為了計(jì)算出每個(gè)參考點(diǎn)在各尺度特征層對(duì)應(yīng)的采樣點(diǎn)位置。
那么你可能又會(huì)奇怪了,一個(gè)參考點(diǎn)明明是只處于某個(gè)特定的特征層,怎么能夠把它放到另一個(gè)特征層去呢?這樣合理嗎?
合理不合理由網(wǎng)絡(luò)去進(jìn)行學(xué)習(xí),基于最終的匹配效果來(lái)證明。但是可不可行我們倒是可分析的,可以這么看:我們知道,由于特征圖是經(jīng)過(guò)原圖下采樣得到,因此一個(gè)像素點(diǎn)無(wú)論是處于原圖還是各層特征圖中,其坐標(biāo)的歸一化值應(yīng)該是一致的(忽略細(xì)微的計(jì)算誤差)。那么,既然這里參考點(diǎn)坐標(biāo)是歸一化的,它就能夠映射(re-scales)到各尺度特征中去,這部分對(duì)應(yīng)以下公式中的phil函數(shù):

作者在paper中是這么描述的:
Function phil?re-scales the normalized coordinates?p^q?to the input feature map of the l-th level.
ii).為何注意力權(quán)重可由query直接通過(guò)全連接層預(yù)測(cè)得到?
我們知道,在Transformer中,注意力權(quán)重是由query和key交互計(jì)算得到的。然而,在這里卻像開(kāi)掛般直接通過(guò)query經(jīng)全連接層輸出得到(好家伙~!),這節(jié)奏是不是不對(duì)勁呢?要分析這個(gè)問(wèn)題,不妨先來(lái)看看Deformable DETR中參考點(diǎn)(reference points)和query之間的關(guān)系。
在Encoder中:參考點(diǎn)是特征點(diǎn)本身的位置,query embedding是特征圖對(duì)應(yīng)的position emebdding(其實(shí)還加上了scale-level embedding),object query則來(lái)自于特征圖,最終注意力機(jī)制中的query就是object query + query embedding。
在Decoder中:2-stage時(shí),由參考點(diǎn)經(jīng)過(guò)位置嵌入生成query embedding和object query;而1-stage時(shí),object query和query embedding都是預(yù)設(shè)的embedding,參考點(diǎn)則由query embedding經(jīng)全連接層生成,最終注意力機(jī)制中的query也是object query + query embedding。
綜上可知,參考點(diǎn)(reference points)和query之間是存在著對(duì)應(yīng)關(guān)系的(就有點(diǎn)“你生我、我生你”的feel~)。
OK,既然這樣,那么基于參考點(diǎn)位置采樣插值出來(lái)的特征(value)自然就能夠和通過(guò)query經(jīng)過(guò)線性變換得到的注意力權(quán)重對(duì)應(yīng)起來(lái)了,這就是為什么可變形注意力模塊中不需要key與query來(lái)交互計(jì)算注意力權(quán)重了。
打個(gè)比方:A與B已建立起了對(duì)應(yīng)關(guān)系,之后A再通過(guò)某種映射關(guān)系得到C,B也通過(guò)某種映射關(guān)系得到D,那么C與D之間必然會(huì)有某種程度的耦合與對(duì)應(yīng)關(guān)系。這里A、B、C、D就分別指代query、reference points、attention weights以及value。
還有個(gè)問(wèn)題值得思考,為何在Decoder中,2-stage時(shí)由reference points生成query embedding是通過(guò)position embedding,而1-stage時(shí)由query embedding生成reference points時(shí)卻用全連接層呢?
對(duì)此,CW是這么想的:2-stage時(shí),參考點(diǎn)是由Encoder預(yù)測(cè)出來(lái)的proposals,本身一定程度上代表著物體的位置信息了(雖然這個(gè)位置可能并不精確),因此有必要用位置嵌入將這“寶貴"的信息給記錄下來(lái);而1-stage時(shí),預(yù)設(shè)的query embedding本身就是一個(gè)抽象體,盲猜的東西,因此用線性變換來(lái)做維度映射得到參考點(diǎn)比較合理,因?yàn)楫吘蛊浔旧聿](méi)有實(shí)際意義的位置信息。
iii). 為何檢測(cè)頭部的回歸分支預(yù)測(cè)的是偏移量而非絕對(duì)坐標(biāo)值?
這個(gè)問(wèn)題估計(jì)很多人會(huì)提出,為何這里不像DETR一樣直接預(yù)測(cè)bbox的坐標(biāo)而是預(yù)測(cè)偏移量呢?請(qǐng)你想想,Deformable DETR相比于DETR多了一個(gè)很顯眼的東西是什么?是參考點(diǎn)(reference points)?。。ǜ杏X(jué)通篇它都在秀存在感..)
采樣點(diǎn)的位置是基于參考點(diǎn)和對(duì)應(yīng)的坐標(biāo)偏移量計(jì)算出來(lái)的,也就是說(shuō)采樣特征是分布在參考點(diǎn)附近的,既然這里需要由采樣特征回歸出bbox的位置,那么預(yù)測(cè)相對(duì)于參考點(diǎn)的偏移量就會(huì)比直接預(yù)測(cè)絕對(duì)坐標(biāo)更易優(yōu)化,更有利于模型學(xué)習(xí)。
Because the multi-scale deformable attention module extracts image features around the reference?point, we let the detection head predict the bounding box as relative offsets w.r.t. the reference point to further reduce the optimization difficulty.
另外,由于采樣特征中注入了注意力,而預(yù)測(cè)框是基于采樣特征回歸得到的,loss是基于回歸結(jié)果計(jì)算的,梯度是通過(guò)loss反向傳播的,因此最終學(xué)習(xí)到的注意力權(quán)重就會(huì)和預(yù)測(cè)框有相對(duì)較強(qiáng)的聯(lián)系,這也起到了加速收斂的效果。
In this way, the learned decoder attention will have strong correlation with the predicted bounding boxes, which also accelerates the training convergence.
6.與其它方法比較
Deformable DETR是在DETR基礎(chǔ)上提出的,因此,在這最后一部分CW打算將其與DETR作個(gè)比較;另外,CW覺(jué)得其與Sparse R-CNN也有值得比較的地方(畢竟之前在CW的這篇文章:Sparse R-CNN: 青出于藍(lán)的R-CNN家族新晉小生,稀疏交互機(jī)制 & No RPN & No NMS = E2E?(文末提取鏈接e)中說(shuō)過(guò)Sparse R-CNN像是DETR的小弟哈哈哈)。
以下列出的點(diǎn)都是僅出現(xiàn)在 Deformable DETR 中而在 DETR / Sparse R-CNN 中是沒(méi)有的。
i). vs DETR
1. 多尺度特征;? ??
2. 新增scale-level embedding,用于區(qū)分不同特征層(由于第1點(diǎn));?
3. 使用了多尺度可變形注意力替代Encoder中的自注意力和Decoder中的交叉注意力;?
4. 引入了參考點(diǎn),某種程度上起到先驗(yàn)的作用;??
5. 為自己開(kāi)發(fā)了“高配”版:迭代的框校正策略?和?兩階段模式;? ?
6. 檢測(cè)頭部的回歸分支預(yù)測(cè)的是bbox偏移量而非絕對(duì)坐標(biāo)值
ii). vs Sparse R-CNN
1. 沒(méi)有使用FPN;? ??
2. 使用了位置嵌入;???
3. 2-stage時(shí),proposals是predicted的(而非Sparse R-CNN直接使用learnable embedding);? ?
4. 使用了Transformer;?
5. 注意力機(jī)制是one-to-many iteraction(Sparse R-CNN由于‘Sparse’偶像包袱太重,是徹底的sparse,是one-to-one實(shí)例級(jí)別的交互);? ?
6. 檢測(cè)頭部的回歸分支預(yù)測(cè)的是bbox偏移量而非絕對(duì)坐標(biāo)值。

作者洞悉到DETR慢收斂和小目標(biāo)檢測(cè)效果差的原因在于Transformer的注意力計(jì)算模塊——其對(duì)全局密集的關(guān)系進(jìn)行建模,這使得模型需要長(zhǎng)時(shí)間去學(xué)習(xí)關(guān)注真正有意義的稀疏位置,同時(shí)還帶來(lái)了高復(fù)雜度的計(jì)算與空間資源消耗。
聯(lián)想到稀疏空間位置的學(xué)習(xí)是DCN的強(qiáng)項(xiàng),但同時(shí)其又缺乏關(guān)系建模能力,于是作者機(jī)智地將DCN與Transformer放在一起愉快地玩耍,最終提出 Deformable DETR。
CW認(rèn)為Deformable DETR的思想和整體工作還是很值得學(xué)習(xí)的,所以就決心研究一番,也在此和大家分享了自己的思考與見(jiàn)解。CW在學(xué)習(xí)過(guò)程中,看過(guò)不少解析Deformable DETR的相關(guān)文章,但它們幾乎要不是將論文通俗地翻譯一遍就是泛泛而談,沒(méi)有一些深入的思考以及注入自己的見(jiàn)解,這種風(fēng)格實(shí)在太無(wú)聊了些..
吾以為,既然要寫(xiě),就應(yīng)該寫(xiě)出自己的風(fēng)格,更重要的是要注入自己的思想(考),提出自己的見(jiàn)解,甚至去懷疑(不一昧向權(quán)威低頭),不然,真的很無(wú)趣耶!所以說(shuō),CW不要無(wú)聊的風(fēng)格~
參考鏈接
a. https://arxiv.org/abs/2010.04159
b. https://github.com/fundamentalvision/Deformable-DETR
c.https://github.com/fundamentalvision/Deformable-DETR/issues/38
d.https://github.com/fundamentalvision/Deformable-DETR/issues/44
e.?https://www.yanxishe.com/columnDetail/25284

本文來(lái)自作者CW的原創(chuàng)投稿,如有任問(wèn)題請(qǐng)及時(shí)留言,我們會(huì)第一時(shí)間處理。
作者簡(jiǎn)介:CW,廣東深圳人。畢業(yè)于中山大學(xué)(SYSU)數(shù)據(jù)科學(xué)與計(jì)算機(jī)學(xué)院,畢業(yè)后就業(yè)于騰訊計(jì)算機(jī)系統(tǒng)有限公司技術(shù)工程與事業(yè)群(TEG)從事Devops工作,期間在AI LAB實(shí)習(xí)過(guò),實(shí)操過(guò)道路交通元素與醫(yī)療病例圖像分割、視頻實(shí)時(shí)人臉檢測(cè)與表情識(shí)別、OCR等項(xiàng)目。目前也有在一些自媒體平臺(tái)上參與外包項(xiàng)目的研發(fā)工作,項(xiàng)目專(zhuān)注于CV領(lǐng)域(傳統(tǒng)圖像處理與深度學(xué)習(xí)方向均有)。