作者 | 王劍鋒
來源 | 知乎CVer計算機視覺專欄
我們基於FCOS,首次在dense prediction上利用全卷積結構做到E2E,即無NMS後處理。我們首先分析了常見的dense prediction方法(如RetinaNet、FCOS、ATSS等),並且認為one-to-many的label assignment是依賴NMS的關鍵。受到DETR的啟發,我們設計了一種prediction-aware one-to-one assignment方法。此外,我們還提出了3D Max Filtering以增強feature在local區域的表征能力,並提出用one-to-many auxiliary loss加速收斂。我們的方法基本不修改模型結構,不需要更長的訓練時間,可以基於現有dense prediction方法平滑過渡。我們的方法在無NMS的情況下,在COCO數據集上達到了與有NMS的FCOS相當的性能;在代表了密集場景的CrowdHuman數據集上,我們的方法的recall超越了依賴NMS方法的理論上限。
整體方法流程如下圖所示:
One-to-many vs. one-to-one
自anchor-free方法出現以來,NMS作為網絡中最後一個heuristic環節,一直是實現E2E dense prediction的最大阻礙。但其實我們可以發現,從RPN、SSD、RetinaNet等開始,大家一直遵循著這樣一個流程:先對每個目標生成多個預測(one-to-many),再將多個預測去重(many-to-one)。所以,如果不對前一步label assignment動刀,就必須要保留去重的環節,即便去重的方法不是NMS,也會是NMS的替代物(如RelationNet,如CenterNet的max pooling)。
那直接做one-to-one assignment的方法是否存在呢?其實是有的。上古時代有一個方法叫MultiBox,對每個目標和每個預測做了bipartite matching,DETR其實就是將該方法的網絡換成了Transformer。此外還有一個大家熟知的方法:YOLO,YOLO也是對每個目標只匹配一個grid[1],只不過它是採用中心點做的匹配,而且有ignore區域。
Prediction-aware one-to-one
於是接下來的問題就是,在dense prediction上我們能不能只依賴one-to-one label assignment,比較完美地去掉NMS?我們首先基於去掉centerness分支的FCOS,統一網絡結構和訓練方法,用Focal Loss + GIoU Loss,做了如下分析實驗:
我們設計了兩種hand-crafted one-to-one assignment方法,分別模仿RetinaNet(基於anchor box)和FCOS(基於center點),儘可能做最小改動,發現已經可以將有無NMS的mAP差距縮小到4個點以內。
但我們認為手工設計的label assignment規則會較大地影響one-to-one的性能,比方說center規則對於一個偏心的物體就不夠友好,而且在這種情況下one-to-one規則會比one-to-many規則的魯棒性更差。所以我們認為規則應該是prediction-aware的。我們首先嘗試了DETR的思路,直接採用loss做bipartite matching的cost[2],發現無論是絕對性能還是有無NMS的差距,都得到了進一步的改善。
但我們知道,loss和metrics往往並不一致,它常常要為優化問題做一些妥協(比如做一些加權等等)。也就是說,loss並不一定是bipartite matching的最佳cost。因而我們提出了一個非常簡單的cost:
看起來稍微有點複雜,但其實就是用網絡輸出的prob代表分類,網絡輸出和gt的IoU代表回歸,做了加權幾何平均,再加一個類似於inside gt box的空間先驗。加權幾何平均和空間先驗我們後面都分別做了ablation。
這就是我們提出的POTO策略,它進一步地提升了無NMS下的性能,也側面驗證了loss並不一定是最好的cost[3]。但從Table 1中我們也發現了,POTO的性能依舊不能匹敵one-to-many+NMS組合。我們認為問題出在兩個方面:
- one-to-one需要網絡輸出的feature非常sharp,這對CNN提出了較嚴苛的要求(這也是Transformer的優勢);
- one-to-many帶來了更強的監督和更快的收斂速度。
我們分別用3D Max Filtering和one-to-many auxiliary loss緩解如上問題。
3D Max Filtering
針對第一點,我們提出了3D Max Filtering,這基於一個intuition(paper中沒有提到):卷積是線性濾波器,學習max操作是比較困難的。此外,我們在FCOS上做了實驗,發現duplicated predictions基本來自於5×5的鄰域內,所以最簡單的做法就是在網絡中嵌入最常見的非線性濾波器max pooling。另外,NMS是所有feature map一起做的,但網絡在結構上缺少層間的抑制,所以我們希望max pooling是跨層的。
如Figure 3所示,這個模塊只採用了卷積、插值、max pooling 3d,速度非常快,也不需要寫cuda kernel。
One-to-many auxiliary loss
針對第二點監督不夠強、收斂速度慢,我們依舊採用one-to-many assignment設計了auxiliary loss做監督,該loss只包含分類loss,沒有回歸loss。assignment本身沒什麼可說的,appendix的實驗也表明多種做法都可以work。這裡想提醒大家的是注意看Figure 2的乘法,它是auxiliary loss可以work的關鍵。在乘法前的一路加上one-to-many auxiliary loss,乘法後是one-to-one的常規loss。由於1*0=0,1*1=1,我們只需要大致保證one-to-one assignment的正樣本在one-to-many中依然是正樣本即可。
實驗
最主要的實驗結果已經在Table 1中呈現了,此外還有一些ablation實驗。
這裡highlight幾點:
- α越低,分類權重越大,有無NMS的差距越小,但絕對性能也會降低[4];α太高也不好,我們後續所有實驗用α=0.8;
- 在α合理的情況下,空間先驗不是必須的,但空間先驗能夠在匹配過程中幫助排除不好的區域,提升絕對性能;我們在COCO實驗中採用center sampling radius=1.5,在CrowdHuman實驗中採用inside gt box[5];
- 加權幾何平均數(Mul)[6]比加權算術平均數(Add)[7]更好。
去掉NMS的最大收益其實是crowd場景,這在COCO上並不能很好地體現出來。所以我們又在CrowdHuman上做了實驗如下:
請注意CrowdHuman的ground-truth做NMS threshold=0.6,只有95.1%的Recall,這也是NMS方法的理論上限。而我們的方法沒有採用NMS,於是輕易超越了這一上限。
我們還做了其它一些實驗和分析,歡迎看原文。
可視化
經過以上改進,我們成功把one-to-one的性能提升到了與one-to-many+NMS方法comparable的水平。我們可視化了score map,可以發現FCN是有能力學出非常sharp的表示的,這也是很讓我們驚奇的一點。
結果圖中比較明顯的改善出現在多峰case上。比如兩個物體有一定的overlap(但又沒有特別重合),這個時候one-to-many+NMS方法經常出現的情況是,除了兩個物體分別出了一個框之外,在兩個物體中間也出了一個框,這個框與前兩個框的IoU不足以達到NMS threshold,但置信度又比較高。這類典型的多峰問題在POTO中得到了較大的緩解。
Others
有些人可能比較關心訓練時間,因為潛意識裡在dense prediction上做bipartite matching應該是很慢的。然而實際上依賴於scipy對linear_sum_assignment的優化,實際訓練時間僅僅下降了10%左右。
如果對這一時間依然敏感,可以用topk(k=1)代替bipartite matching;在dense prediction里top1實際上是bipartite matching的近似解[8]。相似地,k>1的情況對應了one-to-many的一種新做法,我們組也對此做了一些工作,後續可能會放出來。
順便打一波廣告:對曠視研究院BaseDetection組感興趣的同學可以發簡歷到[email protected],組裡目前主要在做目標檢測、自監督等方向。
參考
- 如果有人感興趣的話,可以在YOLO上去掉NMS嘗試一下,可以接近30mAP。
- 注意我們這裡沒有使用DETR的CE+GIoU+L1組合,而是直接採用loss本身(Focal+GIoU)。我們認為這樣更符合DETR用loss做cost的原意。
- 其實這裡可以有一個腦洞留給大家,因為cost是不需要求導的,所以甚至是可以直接算AP當cost的。
- 側面印證了分類和回歸的衝突在檢測任務上是顯著的。
- 理由很簡單,CrowdHuman的遮擋問題太嚴重,center區域經常完全被遮擋。
- 事實上加權幾何平均數的負對數就是CE+IoU Loss,加權算術平均數則沒有明顯的物理含義。
- NoisyAnchor在assign中採用了類似的公式,只不過採用的是anchor IoU。
- 更具體來講,top1(即argmin)是Hugarian Algorithm只做第一次疊代的結果;由於在dense prediction下衝突會很少,一次疊代就已經逼近了最優匹配,這也是為什麼Hungarian Algorithm這裡實際運行很快。
連結:
https://link.zhihu.com/?target=https%3A//arxiv.org/abs/2012.03544
代碼:
github.com/Megvii-BaseD(內部代碼遷移+審查中,後續放出)
文章來源: https://twgreatdaily.com/zh-tw/kxjhS3YBX2TYn2u-LNAy.html