DETR 論文精讀【論文精讀】

一、前言

1、大家為什么喜歡他?
2、為什么他是目標(biāo)檢測領(lǐng)域的里程碑式的工作?
3、為什么是一個全新架構(gòu)?
文章題目:簡單明了,包含兩個關(guān)鍵詞:端到端、transformer
目標(biāo)檢測領(lǐng)域:從目標(biāo)檢測開始火到detr都很少有端到端的方法,大部分方法最后至少需要后處理操作(NMS,non-maximum suppression非極大值抑制)
無論是proposal based方法、anchor based方法、non-anchor based方法,最后都會生成很多預(yù)測框,如何去除這些冗余的框就是NMS要做的事情,
問題:
1、而有了NMS,模型調(diào)參就會很復(fù)雜,
2、而且即使訓(xùn)練好了一個模型,部署起來也非常困難(NMS不是所有硬件都支持)
引入:
所以一個簡單的、端到端模型一直是大家夢寐以求的,detr解決了這些痛點(diǎn)
原因:
1、不需要proposal、不需要anchor,直接利用transformer這種全局建模的能力,把目標(biāo)檢測看做是集合預(yù)測問題
2、因為有了這種全局建模的能力,detr不會有那么多冗余框,最后出什么結(jié)果就是什么結(jié)果,不需要NMS做后處理,讓模型的訓(xùn)練和部署簡單不少
目的:不想讓大家覺得目標(biāo)檢測是比圖像分類難很多的任務(wù),都可以用簡單的,優(yōu)雅的框架做出來
作者團(tuán)隊:來自Facebook AI(meta AI)
二、摘要

集合預(yù)測:目標(biāo)檢測本來任務(wù)就是給定一個圖像,預(yù)測一堆框,每個框不僅要知道的其坐標(biāo),還要知道框里包含物體的類別,這些框就是一個集合,不同的圖像對應(yīng)的集合也是不同的,給定一個圖片,我要預(yù)測這個集合
貢獻(xiàn):
1、把目標(biāo)檢測做成一個端到端的框架,
把之前特別依賴人的先驗知識的部分刪掉了(NMS部分、anchor),一旦把這兩個部分拿掉之后,我們也不用費(fèi)盡心思設(shè)計這種anchor,最后不會出現(xiàn)這么多框,不會用到NMS,也不會用到很多超參去調(diào)
detr提出:
2、新的目標(biāo)函數(shù),通過二分圖匹配的方式,強(qiáng)制模型輸出一組獨(dú)一無二的預(yù)測(沒有那么多冗余框,每個物體理想狀態(tài)下就會生成一個框)
3、使用encoder-decoder的架構(gòu)
兩個小貢獻(xiàn):
1、decoder還有另外一個輸入learned object query,類似anchor的意思
(給定這些object query之后,detr就可以把learned object query和全局圖像信息結(jié)合一起,通過不同的做注意力操作,從而讓模型直接輸出最后的一組預(yù)測框)
2、想法&&實(shí)效性:并行比串行更合適,并不是檢測一個大物體前必須先檢測一個小物體,或從左到右檢測,我們希望越快越好
DETR的好處:
1、簡單性:想法上簡單,不需要一個特殊的library,只要硬件支持transformer或CNN,就一定支持detr
2、性能:在coco數(shù)據(jù)集上,detr和一個訓(xùn)練非常好的faster RCNN基線網(wǎng)絡(luò)取得了差不多的效果,模型內(nèi)存和速度也和faster RCNN差不多
3、想法好,解決了目標(biāo)檢測領(lǐng)域很多痛點(diǎn),寫作好
4、別的任務(wù):全景分割任務(wù)上detr效果很好,detr能夠非常簡單拓展到其他任務(wù)上
Facebook research的代碼一般都非常好
三、引言
1、目標(biāo)檢測任務(wù):對每一個感興趣的物體,去預(yù)測一些框,和物體類別,就是一個集合預(yù)測問題
2、現(xiàn)在大多數(shù)好用的目標(biāo)檢測器,都是用間接的方式去處理集合預(yù)測問題,(1)比如proposal方式(如RCNN系列工作),(2)anchor方式(YOLO系列,focal loss),non-anchor based方法(物體中心點(diǎn)center net,F(xiàn)COS),他們都沒有直接做集合預(yù)測任務(wù),而是設(shè)計一個替代(回歸、分類)解決目標(biāo)檢測問題。所有這些方法性能受限于后處理操作(NMS),由于用了anchor和NMS導(dǎo)致檢測器都非常復(fù)雜,難以優(yōu)化和調(diào)參
3、端到端的思想已經(jīng)在別的很多任務(wù)里大范圍使用,而且使任務(wù)更加簡單好用,我們不要先驗知識,就是要用一個端到端網(wǎng)絡(luò)

detr流程(訓(xùn)練):1、CNN提特征
2、特征拉直,送到encoder-decoder中,encoder作用:進(jìn)一步學(xué)習(xí)全局信息,為近下來的decoder,也就是最后出預(yù)測框做鋪墊
3、decoder生成框的輸出,當(dāng)你有了圖像特征之后,還會有一個object query(限定了你要出多少框),通過query和特征在decoder里進(jìn)行自注意力操作,得到輸出的框(文中是100,無論是什么圖片都會預(yù)測100個框)
4、loss :二分圖匹配,計算100個預(yù)測的框和2個GT框的matching loss,決定100個預(yù)測框哪兩個是獨(dú)一無二對應(yīng)到紅黃色的GT框,匹配的框去算目標(biāo)檢測的loss
推理
1、2、3一致,第四步loss不需要,直接在最后的輸出上用一個閾值卡一個輸出的置信度,置信度比較大(>0.7的)保留,置信度小于0.7的當(dāng)做背景物體
結(jié)果
1、detr對大物體預(yù)測很準(zhǔn),歸功于transformer,能進(jìn)行全局建模(原來使用anchor的話就會受限于anchor大?。?/p>
2、缺陷:對小物體效果不好(多尺度、多特征,可以提高小物體的檢測)
3、detr訓(xùn)練很慢,500個epoch(coco大多數(shù)模型一般訓(xùn)練幾十個epoch就行)
四、相關(guān)工作
目標(biāo)檢測:
根據(jù)初始猜測做預(yù)測:
1、two-stage:初始猜測是中間的proposal
2、one-stage:初始猜測是anchor或物體中心點(diǎn)
最近一篇論文做了詳細(xì)比較,發(fā)現(xiàn)他們的性能和剛開始的初始猜測非常相關(guān),怎么做后處理對性能影響至關(guān)重要
怎么后處理:
1、集合思想:可學(xué)習(xí)的NMS方法、關(guān)系型網(wǎng)絡(luò),可以利用自注意力方法去處理物體之間的聯(lián)系,得出獨(dú)一無二的預(yù)測,就不需要后處理的步驟(性能較低)
解決:人工干預(yù):手工設(shè)計的場景特征幫助模型學(xué)習(xí),但是detr目標(biāo)是想讓目標(biāo)檢測任務(wù)更加簡單,不希望用到過多人工先驗知識
2、循環(huán)檢測器:encoder-decoder
讓detr工作主要原因:transformer
五、方法
分兩塊:1、基于集合的目標(biāo)函數(shù)怎么做,作者如何通過二分圖匹配把預(yù)測的框和GT框連接在一起,算得目標(biāo)函數(shù) 2、detr具體模型架構(gòu)
目標(biāo)函數(shù)部分
detr模型最后輸出是一個固定集合,無論圖片是什么,最后都會輸出n個(本文n=100)
問題:detr每次都會出100個輸出,但是實(shí)際上一個圖片的GT的bounding box可能只有幾個,如何匹配?如何計算loss?怎么知道哪個預(yù)測框?qū)?yīng)GT框?
百科舉例:分配工人干活,讓最后之處最小

scipy包提供的linear sum assignment
detr論文里:代碼也用的linear sum assignment函數(shù)
a,b,c看成100個預(yù)測框,x,y,z看成GT框,損失矩陣未必都是正方形
損失矩陣的值應(yīng)該放些什么?loss包含兩部分:分類loss、出框的準(zhǔn)確度
detr主體網(wǎng)絡(luò)框架(圖2:圖1的升級版)

真代碼(簡化版)

六、實(shí)驗

表1detr和faster RCNN的對比
+表示用更好的訓(xùn)練策略把三個模型重新訓(xùn)練一遍
gflops參數(shù):每秒進(jìn)行的浮點(diǎn)運(yùn)算次數(shù)
gflops越小,模型越小,跑起來越快?X
如果更關(guān)心速度,比較fps
檢測效果
detr由于使用transformer全局建模,沒有用anchor,想檢測多大物體就檢測多大,所以檢測大物體效果較好
detr框架太簡單,沒有多尺度特征,沒有FPN,沒有復(fù)雜的目標(biāo)檢測頭,所以在小目標(biāo)檢測效果不好
結(jié)論
decoder

object query可視化(n=100,這里只有20個)

到底學(xué)了什么(綠色代表小的bounding box,紅色代表大的橫向bounding box,藍(lán)色代表大的豎向bounding box)object query和anchor有些像,anchor是提前定一些bounding box,把預(yù)測和這些提前定好的bounding box對比,object query是可以學(xué)習(xí)的
七、總結(jié)