目標檢測論文閱讀:Deformable Convolutional Networks
來自專欄從目標檢測開始的挖坑日記4 人贊了文章
?這篇論文其實讀起來還是比較難懂的,主要是細節部分很需要推敲,尤其是deformable的卷積如何實現的一步上,在寫這篇博客之前,我也查閱了很多其他人的分享或者去github找代碼,當然也不敢說完全了解了這種特殊的卷積……僅僅做一點自己的閱讀心得與體會吧。這是一篇很有意義的工作,但是和深度學習很多論文一樣,在讀完之後內心也不免有著種種疑雲。
Deformable Convolutional Networks
論文鏈接:https://arxiv.org/abs/1703.06211
代碼鏈接:https://github.com/msracver/Deformable-ConvNets(官方實現,但是release的版本是遷移到MXNet上的,速度和performance上有些出入)MSRA的文章,嚴格意義上講,deformable convolutional不僅僅只適用於object detection,作為對常見的卷積的一種改良,它可以廣泛應用在各個網路中,和空洞卷積一樣,是對傳統卷積的改良,而且某種意義上也可以說是空洞卷積的進一步拓展。1. Background
這篇文章的motivation其實比較簡單,我們都知道,常規的卷積,包括池化這些操作,不管你怎麼累加,基本得到的都是矩形框……這個其實非常不貼合實際,在對不規則的目標建模的時候有非常大的局限性。
作者認為克服建模形變困難主要是兩種方法:
- 通過提供變化足夠豐富的大量訓練樣本,讓訓練器強行記憶擬合
- 設計能夠檢測到形變的特徵和演算法,這方面主要還是以hand-crafted的特徵為主,這種在對付沒有考慮到的形變和過於複雜的形變的時候其實比較無力CNN其實不具有旋轉不變性和尺度不變性的,所以本質上CNN是用的策略1,缺乏判斷形變的策略依據。局限性比較多,比如固定的box對於靈活物體來說非常僵硬,比如同一層的特徵圖的不同位置可能對應的是不同形狀的物體,但是都和同一個卷積做計算。(理解這一點比較重要,涉及到後面對deformable卷積的理解)作為對上述問題的解決方案,作者提出了一種新的卷積方式deformable convolution,在此基礎上提出了一種新的RoI pooling方法deformable RoI pooling。主要思路就是卷積操作不是在規規矩矩的3x3的格子里做了,而是有了種種偏移,如下圖所示:
2. Deformable Convolutional Networks
2.1 deformable卷積的計算公式
我們知道,一般的卷積是這種形式的:
留意到p0是中心點,pn是屬於R的3x3的kernel的9個位置,因此這是在3x3方格內採樣的一個規則卷積,而可形變的卷積就是在x(po+pn)之中再加上一個偏移量:
在實際當中,因為添加的這個偏移量往往是小數,導致比較難處理,作者採用的辦法是雙線性差值,根據相鄰的點來進行計算具體公式如下,留意到這裡的a-b如果差值大於1了,g就是0,所以只有比較接近的點才對線性差值的點有效果:(以上是公式化的內容,關於差值內容如何求導可以到附錄裡面找)2.2 偏置求法
重點來了,怎麼得到這個偏移量?,可變卷積神經網路的示意圖如下圖所示:
2.3 Deformable RoI Pooling
為RoI pooling添加deformable機制其實和卷積的非常類似。因為本身RoI pooling的時候和卷積一樣,選取的也是方形區域,我們要做的也是增加偏移量。原來的RoI pooling過程可以表示為如下:
那麼新的RoI pooling計算公式則如下:而它的偏移量的網路結構和計算過程如下圖所示:
其中,要注意的有兩點:- feature map此處是用fc來學習的,而且也不是直接學習最終偏移量,而是學習頭上帶三角號的那個變數……
- 這個變數會和(w, h)做點乘,然後再乘以一個尺度因子,其中w,h是RoI的寬和高,而伽馬是一個0.1的常數因子……個人理解,前者是為了讓deformable能和RoI的尺度結合起來,更好地估計偏移位置;而後者是為了防止偏移量太大甚至超出RoI和整個圖像……之前也看到有人認為,DNN網路最後幾層經常會出現感受野不足的情況,所以空洞卷積才會效果比一般卷積好,如果不加約束,deformable的RoI可能無限制地擴大,這個觀念我還不是很理解,日後如果有了新發現再更新吧另外就是作者還搞出了一個和R-FCN的位置敏感比較類似的另一種RoI方法,同樣是考慮deformable因素的,叫Position-Sensitive (PS) RoI Pooling,這裡就不詳細介紹了
2.4 deformable networks
這個部分沒什麼太多內容要介紹的,因為deformable卷積使用前後feature map是不變化的,因此大致上就是將卷積和Pooling方法直接替換到一些主流方法里就好……一些網路設置就不談了,說兩個我感覺比較重要的點:
- 學習offset的那些參數怎麼初始化和學習:作者採用的是0初始化,然後按照網路其它參數學習率的$eta$倍來學習,這個$eata$默認是1,但在某些情況下,比如faster rcnn中的fc的那些,是0.01
- 並不是所有的卷積都一股腦地換成可行變卷積就是好的,在提取到一些語義特徵後使用形變卷積效果會更好一點,一般來說是網路靠後的幾層
3. 網路理解和實驗結果
3.1 對deformable卷積的理解
作者繪製了一些圖來方便我們理解deformable卷積,例如常規卷積和可形變卷積的一些對比:
最上面的top feature map的activation units,中間層和最下層是上一層和上上層的卷積,可以看到它們產生的過程。這張圖應該會更清晰一點的:
綠色的點是activation units,而紅色的點是激活點在3個level的deformable filters採樣位置(一共9的三次方700多個點),左中右分別是背景類,小目標和中等目標的採樣點分布,和傳統的卷積還是產生了很大差異的。另外也有關於RoI pooling中的9個Bin和gt的圖,可以看到和傳統的方法的差別,RoI pooling也會根據物體產生形變:作者認為可形變卷積的優勢還是很大的,包括:- 對物體的形變和尺度建模的能力比較強
- 感受野比一般卷積大很多,因為有偏移的原因,實際上相關實驗已經表明了DNN網路很多時候受感受野不足的條件制約;但是一般的空洞卷積空洞是固定的,對不同的數據集不同情況可能最適合的空洞大小是不同的,但是可形變卷積的偏移是可以根據具體數據的情況進行學習的另外值得一提的是,作者發現可形變卷積可以適應物體的尺度,而背景類的尺度一般在medium和large尺寸的物體之間,作者認為這說明large的目標可以更有效幫助我們識別干擾,也算是無心插柳吧。
3. 2 實驗結果
這是作者給出的最終結果,class-aware RPN是指分類別的RPN,可以視作一個簡易版本的SSD,而對DeepLab的方法筆者也不是很了解。
總的來說,這個工作亮點是很多,包括對卷積的改良,知乎上對這個工作有一些討論包括評論我覺得還是很不錯的:https://www.zhihu.com/question/57493889/answer/153369805 (包括評論),卷積改變為類似採樣的思路都是很有意義的。但是看完之後總感覺也有一些疑問,比如懷疑是否一層網路真的能有效學習偏置,不同圖片的大量不同物體在offset優化上會不會引發競爭什麼的,不過都屬於很難量化和考察的內容了,最後還是要靠實驗結果說話,大概是目前煉丹的通病吧,有興趣的也可以留言討論下~推薦閱讀:
TAG:機器學習 | 論文 | 深度學習DeepLearning |