個人理解:

整個過程是anchor回歸兩次,anchor第一次回歸得到的咱們按論文裏說的叫learned anchor,然後learned anchor再回歸一下,這樣回歸出來的框會更加準確,這也是RefineDet做的事情,但是RefineDet做到這一步還不夠完美,因為RefineDet兩次回歸用的特徵都是與RoI不對齊的特徵(雖然第二次時利用反捲積結合了高維特徵)。咱們畫個示例圖說明一下:

黃色框是anchor,紅色是GT,紫色是learned anchor,由anchor回歸到learned anchor是用feature map上黑色特徵點這一特徵(D維向量)做的,而這一黑色特徵是使用的灰色卷積核在其相鄰的9個點做卷積得到的,這9個相鄰的點所組成的區域映射到原圖,也就是原圖中灰色區域這一部分,換句話說,這一黑色特徵的全部信息基本都來自於原圖的灰色部分,但是顯然,這一灰色區域並沒有完全包含整個長頸鹿,用這一區域所得到的特徵去預測一個完整的長頸鹿,肯定有一點問題。這就是特徵與RoI不對齊的意思。這裡的RoI實際上就是learned anchor。

那怎樣才能將特徵與RoI對齊,這就是AlignDet要做的事。第一步跟RefineDet一樣,先將初始的anchor回歸得到learned anchor。這個時候learned anchor其實已經比較接近GT了。第二步,就是跟RefineDet不同之處了,RefineDet還是使用的不對齊特徵再把learned anchor回歸一次,而AlignDet是用的對齊的新特徵。怎麼做到對齊的?如下圖:

把第一次用的特徵再用deformable conv卷一下,當卷積核捲到黑色位置的時候,卷積核加上此位置給定的offset,於是卷積核的形狀就變成淺紅色的9個點,這九個點所組成的區域映射回原圖就是learned anchor的包含區域。這樣的話,經過deformable conv所得到的特徵就是對齊的了。那麼他咋能保證卷積核加上offset就正好是learned anchor 包圍區域的?原因是這裡的offset是根據learned anchor與卷積核的位置差算出來的。因此RoIConv實質上是一種offset已知的Demforable Conv。AlignDet是RefineDet的延申,而RefineDet又是SSD的延申。確實是很好的工作,值得學習!


隨便說兩點吧

1.前一段時間剛在Anchor的前世今生中提到misalignment問題,今天就放出文章了。

2.能不能順便解決一下正負樣本定義問題,這個問題在之前關於cascade R-CNN的介紹中提及過。我最近的實驗發現,正負樣本的定義稍微變一下就能有1個點左右的gain

厚臉皮地附上我的幾個實驗:


事情好像變得有點奇怪,感覺還是得出來正面回應一下。

首先感謝大家對我們工作的關注,本來出結果之前都不準備放 paper 的,但是最近有一些相似的工作,比如 @王劍鋒 提到的 PA 掛出來了,所以還是放出來。

整個工作的思路還是沿著 refinedet -&> guided anchoring 過來的,兼有吸收了一些 cascade r-cnn 的思想。做這個工作一方面是想解決 anchor 和 feature 對不齊的問題,另一方面也是想闡述 one-stage 和 two-stage 的區別並沒有想像中的大(paper 另一個候選名字叫 bridging one-stage and two-stage detection)。

其實一旦講清楚了 im2col 和 roialign 的關係之後,如何去彌合 one-stage和 two-stage 在 alignment 上的差別就已經顯而易見了。

選擇 7x7 RoIConv 和 1x1 1024c 的 feature 是為了儘可能的對齊 FPN Faster R-CNN,由於 1x1 卷積不會擴散 roi feature ,從而保持每個 region feature 的獨立性,這樣就和 R-CNN head 完全一致了。Aligndet 和 Faster R-CNN 的區別也就僅僅剩下 dense prediction + focal loss 對上 balanced sampling prediction 了。

仔細研究了一下 reppoints,發現雖然 motivation 大不相同,但是最後大家確實殊途同歸。對於 table 7 裏 RPDet 不是 multi-scale training 表示確實疏忽了,誤以為和其他 retinanet-based method 用的相同的 protocol,後續會更新一版 paper。在這裡對 @B1ueber2y 以及其他作者表示歉意,也期待你們在新一版的論文裏更公平的比較。

另一方面,我們對點數這個東西其實沒有特別關注,諸如 GN/SyncBN,用 YOLO/FCOS 這類更好的 assign 策略,回歸單獨用大一點的頭,smooth_l1 換成 l1,同等 FLOPs 下換 depthwise 漲點/降計算量這些方法我們都有意迴避了。如果大家能從 ablation 分析裏獲得一些 insight,就是對我們工作最大的鼓勵。謝謝。


AlignDet本質就是一個two stage檢測器。不過它把two stage檢測器的第二個階段(ROIAlign和RCNN)用基礎模塊(ROIConv+Conv)實現了。

現在的two stage檢測器,要是代碼功底不強,不管是想親手擼一個訓練框架還是前向框架都不太容易。

ROIConv有兩大優勢:

1、大大降低了手擼two stage檢測器的難度,方便two stage檢測器的部署;

2、ROIConv計算量跟普通Conv差不多,也就是ROIConv可以使得一個檢測器既有one stage檢測器的速度,又有two stage檢測器的效果。


我最初看的時候以為主要想解的是single-stage裡面point feature和region feature的misalign,後來看著看著發現怎麼RoI都出現了,又重新整理了下自己的觀點

核心motivation是去解cascade single-stage detector裡面不同stage之間的feature misalignment,之前的比如RefineDet這樣的工作雖然相當於有多個stage去做多次分類和回歸,但是不同stage用的feature是相同的,並沒有考慮到每次refine之後框都發生了變化,後續的操作應該依賴於更新之後的feature,我之前在Cascade RetinaNet裡面有分析過這種feature misalign,厚顏無恥放一下水文鏈接

https://arxiv.org/abs/1907.06881

所以一個很容易想到的idea就是用deformable conv去學習這種regression前後的offset,然後用feature aggregation來做align,Guided Anchor也用了類似的做法不過主要解的是shape misalignment

再往前進一步,既然你已經知道了regression offset的預測值,那直接把這個拿過來當做deformable conv的offset不就是RoIConv了,相比於直接用deformable,這樣的方式可能會更明確一些,在Table4裡面能裸漲一個點

當然RoIConv在去解上述regression前後的misalign的同時,也因為經過deformable conv整合了一些original conv採樣區域外的信息,所以也能更好的擬合region feature

羨慕韜哥和乃巖一直有solid work產出,弱雞如我流下了不會寫kernel的淚水

P.S. AlignDet的名字被用了,難過


推薦閱讀:
相關文章