博客專欄

        EEPW首頁 > 博客 > 大白話用Transformer做Object Detection

        大白話用Transformer做Object Detection

        發布人:計算機視覺工坊 時間:2022-05-15 來源:工程師 發布文章
        作者丨秋名山車神@知乎(已授權)

        來源丨https://zhuanlan.zhihu.com/p/503011317編輯丨極市平臺1 大白話Attention

        理解Attention是讀懂Transformer[2]論文的第一步,說白了就是一個公式:


        其中q=fc(a),k=fc(b),v=fc(b)。如果a==b就是Self-attention(ViT中全是這玩意);如果a!=b就是Cross-attention(一般應用于Transformer decoder)。注意這三個fc層不共享參數。簡單起見,省略了scaling factor(不影響理解)。

        那么如何理解這個公式呢?Attention的本質就是加權:一部分重要,其它部分不重要;或者說一部分相關,其它部分不相關。上式中的加權是基于k對于q的相似度。舉一個直觀的例子:特征提取的目的是尋找高富帥,q (query) 代表一個理想中標準的高富帥,k (key) 代表每個真實候選人的身高、財富和樣貌,v (value) 就是每個真實候選人的特征。那么一個候選人越符合標準的高富帥條件,就會被賦予更高的權重,特征占比也就越大。

        2 為什么要用Transformer做目標檢測?

        DETR的本質是基于查詢(query)的目標檢測,而目標檢測的本質是一種image-to-boxes的轉換。相比于CNN時代基于錨框或錨點 (anchor box or anchor point) 的檢測方法[3,4,5],基于query的檢測機制其實更加符合image-to-boxes的范式:encoder中的一個元素代表圖像上的一塊區域 (patch embedding),而decoder中的一個元素代表一個物體 (object embedding)。Image-to-boxes的轉換是基于區域與區域間的、區域與物體間的、物體與物體間的信息交換。整體的思路其實非常簡單、直接、合理。

        DETR具有兩大核心優勢:

        1. End-to-end detection。 Anchor-based目標檢測器大多采用一對多的標簽分配算法,因此NMS成為一項必不可少的后處理步驟(去除冗余框)。最近也有一些基于CNN的工作,通過探索一對一的標簽匹配[6],實現了nms-free的目標檢測(然而精度提升并不明顯,應用于YOLOX甚至還有些許掉點)。對于DETR,端到端檢測就顯得尤為自然直接。除了一對一的二分匹配 (bipartite matching),Transformer機制引入了query間的信息交換 (Self-attention in decoder),來防止多個query收斂到同一目標。相似的操作也被Sparse RCNN[7]所采用。也許樣本(anchor/query/proposal)間的信息交換才是實現end-to-end detection的關鍵。

        2. 解耦輸入與輸出空間。 在Transformer的邏輯里,圖片被展開成一維序列(sequence),由positional embedding描述絕對位置信息來維系圖片形式,其中encoder應用一套positional embedding,decoder應用另一套positional embedding。這其實給了模型解耦輸入與輸出空間的能力:比如輸入空間為圖片上均勻采樣的點(stride=32),而輸出空間為圖片上隨機分布的100個點;比如輸入空間為多個環視相機視角,輸出空間為BEV視角。

        換一個角度思考,query和anchor、proposal本質上是一種東西,都是對于圖片上潛在物體的刻畫。得益于Attention機制,query獲得了全局感受野和樣本間信息交換的能力,達成了稀疏采樣 (sparse sampling) 和端到端檢測 (end-to-end detection)。

        3 DETR網絡結構

        基于anchor的目標檢測器的大體可分為三個組成部分:backbone(特征提取)、neck(多尺度特征聚合)、head(分類與回歸預測)。DETR延續了這個結構:backbone(特征提取)、encoder(特征聚合)、decoder(query精修)。區別在于后兩個結構(encoder和decoder)都是由基于Attention機制的Transformer實現。

        圖片DETR網絡結構,add/Norm/殘差連接被省略3.1 Transformer encoder

        先用一個1*1卷積降低CNN提取的特征維度(b,2048,h,w ==> b,256,h,w),再展開成一維序列(b,256,h,w ==> h*w,b,256),記為src;然后準備好一個相同形狀的positional embedding(計算方法參考這里:https://github.com/facebookresearch/detr/blob/8a144f83a287f4d3fece4acdf073f387c5af387d/models/position_encoding.py#L12),記為pos_embed。最后重復6次Self-attention和FFN,其中Self-attention的k=fc(src+pos_embed),q=fc(src+pos_embed),v=fc(src);FFN就是兩層fc。輸出記為memory。

        3.2 Transformer decoder

        準備100個object queries,形狀為(100,256),初始化為0,記為tgt。準備其對應的相同形狀的positional embedding,隨機初始化,記為query_embed。訓練時兩者都擴充為(100,b,256)。最后重復6次Self-attention、Cross-attention和FFN,其中Self-attention的k=fc(tgt+query_embed),q=fc(tgt+query_embed),v=fc(tgt);Cross-attention的k=fc(tgt+query_embed),q=fc(memory+pos_embed),v=fc(memory)。

        直觀上理解,Cross-attention就是每個query根據各自感興趣的區域從圖片中抽取相關信息,而Self-attention就是所有query開會決定誰當大哥(前景),誰當小弟(背景)。

        我還想簡單解釋一下object queries (tgt) 和其對應的positional embedding (query_embed)的初始化:object query裝載的是圖片上的物體信息,在進入decoder之前模型其實對圖片上的物體一無所知,所以作者將他初始化為0。positional embedding裝載的是每個query所關注的位置和區域,作者希望這100個query能盡可能均勻的覆蓋到整張圖片,所以采用隨機初始化。

        其他諸如Prediction FFN、Bipartite matching loss、Deep supervision等細節,比較容易理解,這里就不贅述了。

        DETR并不是對傳統anchor-based detectors的降維打擊。相反,DETR存在收斂速度慢、檢測精度差、運行效率低等問題。

        碎碎念:CVPR2022收錄了至少4篇DETR相關的檢測論文,用transformer做object detection算是一個很promising的研究方向了,值得關注。

        得益于Transformer帶來的動態感受野和樣本間信息交換的能力,DETR解鎖了稀疏采樣 (sparse sampling) 和端到端檢測 (end-to-end detection) 兩個技能。

        然而原始DETR也存在一個比較明顯的缺點,就是需要非常長的訓練周期才能收斂(在COCO數據集上要訓500個epoch)。DETR的大部分后續工作都嘗試針對這個缺點做出改進。

        4 為何DETR難以收斂?

        根據作者的設想,每個object query會根據各自感興趣的區域通過Transformer decoder里的Cross-attention layer從圖片中抽取相應的物體特征。


        這個抽取特征的過程包含兩個步驟,一個是key (image features) 對于query (object queries) 的相似度匹配,一個是依據匹配結果對value (image features) 進行加權平均。

        然而理想很豐滿,現實很骨感。問題就出在這第一個步驟上:由于query embedding是隨機初始化的,object queries和image features在模型訓練的初期無法正確匹配。

        直觀上理解,一把鑰匙 (object query) 開一把鎖(圖片上某一特定區域的物體)。但是由于鑰匙是隨機初始化的,導致它實際上開不了任何一把鎖(圖片上任意位置的特征對于object query的相似匹配度都很低)。結果就是Cross-attention layer實際上幾乎均勻地抽取了整張圖片的特征,而不是有針對性的抽取特定區域內的物體特征。可以想象,在這之后的object query不僅采集了目標物體的特征,還采集了圖片背景和其他不相關物體的特征,因此用它來分類和定位目標物體還是很困難的。

        換個角度考慮,Cross-attention可以想象成是一種軟性的RoIAlign:從圖片中依據kq相關性 (attention map) 劃分出感興趣區域 (region of interest) 并收集相應特征。DETR難以收斂的原因就是由于object query和image feature間的不對齊 (misalignment),導致無法有針對性的收集特定區域的物體特征,而是收集到了圖片上其他很雜亂的特征。

        簡單補充一下為什么基于CNN的檢測器沒有這個問題:Two-stage detectors是直接利用RoIAlign操作對齊了region proposal和image features;對于One-stage detectors,anchor box的中心是依據所處特征的image coordinate設定的,大小是依據所處金字塔的feature scale設定的,所以大體上也是對齊的(參考AlignDet[1])。

        5 一系列改進工作

        Deformable DETR[2]:既然原始的Cross-attention layer自由度太高,沒有辦法focus到特定區域,那就為每個object query設定需要關注的中心點 (reference point),并且提出的Deformable attention也只采樣中心點附近的N個圖片特征,這樣既加速了收斂又減少了計算量。并且由于Deformable attention的計算量與特征圖大小無關,還可以采用多尺度特征圖來優化小目標的檢測。

        SMCA DETR[3]:在計算Cross-attention之前,每個query先預測一下要檢測物體的位置和長寬(有點anchor的味道了),再根據預測的物體位置和長寬生成一個對應的高斯熱圖 (Gaussian-like weight map),并融入Cross-attention里kq相似度匹配計算中。這樣,每個query抽取的特征就被限制在物體的中心附近,收斂速度也因此得到提升。

        Anchor DETR[4]:顧名思義,直接將anchor point的位置編碼為object query,并且encoder和decoder共用一套位置編碼的方式 (Sine encoding + MLP)。這樣encoder和decoder的位置部分 (positional embedding) 就是對齊的,每個query抽取的特征也就集中在anchor point附近了。此外,為了檢測同一位置的不同物體,作者還提出為每個anchor point添加不同的模式(multiple patterns,一般是3種,有點類似每個位置設置大小和長寬比不同的3種anchor box)。

        DAB DETR[5]:相對Anchor DETR做了兩個方面的優化,一是將anchor box(包括位置長寬4個維度)編碼為object query,而不是僅僅編碼anchor point的位置信息;二是應用了cascade思想,每層不斷精修anchor box(上一層的輸出的作為下一層的輸入)。值得注意的是作者利用所預測的box長寬進一步限制了Cross-attention里的kq相似度匹配計算,使生成的注意力圖能夠擬合不同位置、不同尺度、不同長寬比的物體。

        SAM DETR[6]:為了在語義空間上對齊object queries和image features,作者直接在Cross-attention layer前加了一個RoIAlign操作,即先從image features里切出物體特征,再重新采樣8個顯著點 (salient points re-sampling),用以生成語義對齊的query embedding和positional embedding。這里有個小小的疑問,Cross-attention就是為了提取image feature上各個query所對應的物體特征,完成作者的這些操作以后,原本的Cross-attention還有必要嗎?

        總結一下,由于object query和image feature間(位置上的和語義上的)不對齊,導致Transformer decoder中的Cross-attention layer難以精確地匹配到待檢測物體所對應的特征區域,object query也因此采集到了很多除目標物體以外的無關特征,最終導致DETR收斂緩慢。上面介紹的幾個工作都是通過不同的方式限制了object query的采樣區域,使得網絡能夠更快的地聚焦于物體區域,所以加速了訓練。

        6 Future direction

        探討object query的數量對于檢測精度的影響。理論上100已經遠遠大于圖片上可能出現的物體個數了,然而更多的query還是會帶來更高檢測精度。直觀上思考,越少的query會導致各個query的搜索范圍變大,并且難以檢測同一位置的多個目標;過多的query又會導致難以抑制多個query收斂到同一物體的情況。那么多少才是合適的query數量呢?每層需求的query數量相同嗎?

        由于需要精準定位物體,DETR必須能夠很好地編碼特征的絕對/相對位置關系。DETR目前所采用地Positional embedding是否是最佳方案?或許該在Transformer里塞一些卷積層,或者是否能夠從query based patch localization角度,構造一個自監督訓練框架?

        還有one to one的匈牙利標簽匹配還沒有人動過,這會不會也是造成DETR收斂慢的原因呢?大家覺得怎么樣呢 :-)

        參考文獻:

        • [1] End-to-End Object Detection with Transformers https://arxiv.org/abs/2005.12872

        • [2] Attention Is All You Need https://arxiv.org/abs/1706.03762

        • [3] Focal Loss for Dense Object Detection https://arxiv.org/abs/1708.02002

        • [4] FCOS: Fully Convolutional One-Stage Object Detection https://arxiv.org/abs/1904.01355

        • [5] Objects as Points https://arxiv.org/abs/1904.07850

        • [6] What Makes for End-to-End Object Detection? https://arxiv.org/abs/2012.05780

        • [7] Sparse R-CNN: End-to-End Object Detection with Learnable Proposals https://arxiv.org/abs/2011.12450

        • [8] Revisiting Feature Alignment for One-stage Object Detection https://arxiv.org/abs/1908.01570

        • [9] Deformable DETR: Deformable Transformers for End-to-End Object Detection https://arxiv.org/abs/2010.04159

        • [10] Fast Convergence of DETR with Spatially Modulated Co-Attention https://arxiv.org/abs/2101.07448

        • [11] Anchor DETR: Query Design for Transformer-Based Object Detection https://arxiv.org/abs/2109.07107

        • [12] DAB-DETR: Dynamic Anchor Boxes are Better Queries for DETR https://arxiv.org/abs/2201.12329

        • [13] Accelerating DETR Convergence via Semantic-Aligned Matching https://arxiv.org/abs/2203.06883


        本文僅做學術分享,如有侵權,請聯系刪文。


        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。



        關鍵詞: AI

        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 丰顺县| 丰都县| 镇赉县| 汪清县| 缙云县| 县级市| 伊宁市| 牙克石市| 三台县| 武功县| 吉木乃县| 玛曲县| 清水县| 南华县| 武胜县| 东明县| 明溪县| 淮滨县| 普陀区| 滦平县| 泸水县| 新蔡县| 宣化县| 乡城县| 樟树市| 洱源县| 泰顺县| 张北县| 炉霍县| 读书| 宜州市| 积石山| 乌拉特前旗| 四平市| 永城市| 来凤县| 乐业县| 龙川县| 南川市| 通许县| 洪湖市|