原論文:Auto-FPN: Automatic Network Architecture Adaptation for Object Detection
Beyond Classification
之前的AutoML都是應用在圖像分類或者語言模型上,AutoFPN成功地將這技術應用到了目標檢測任務上。
傳統two-stage目標檢測網絡結構
在介紹AutoFPN之前,首先大致介紹一下two-stage目標檢測網絡的結構組成。
- backbone:即用來提取圖像特征的網絡結構,常用ResNet或VGG來提取特征
- RPN(region proposal networks): 這個網絡的作用是在backbone提取得到的特征的基礎上進一步預測出若干個區域,比如faster-rcnn可能會生成2000個proposals,這些proposals中可能存在錯誤的或者存在些許偏差的,所以還需要進一步由后面的網絡處理
- RCNN (region CNN) head: 簡單理解就是針對生成的proposal區域做進一步的分類和位置回歸。
AutoFPN
AutoFPN的創新點在后面兩個網絡中,如下圖示,主要是針對backbone的特征先做自動fusion操作(Auto-fusion),另外就是對head網絡使用NAS技術搜索得到一個網絡用於分類和回歸(Auto-head)。
Auto-fusion
Auto-fusion其實是基於之前的一些工作的改進,如下圖示:
- 最開始SSD會對不同尺度的特征圖做預測
- 之后FPN提出了自上而下的連接方式,將不同尺度的特征圖信息進行結合
- PANet通過直接將最底層的特征與最高層的特征圖進行連接,進一步增強特征圖之間的聯系
- Auto-fusion則是通過搜索網絡結構來讓算法自動找到不同層之間最合適的連接方式。
Auto-fusion搜索方法設計考慮的有如下兩個方面:
- 搜索空間覆蓋所有的連接方式
- 因為在TridenNet中使用dilated conv得到了不錯的效果,所以不同大小的dilated conv加入到了搜索空間中去。搜索空間如下:
- no connection (none)
- skip connection (identity)
- 3×3 dilated conv with rate 2
- 5×5 dilated conv with rate 2
- 3×3 dilated conv with rate 3
- 5×5 dilated conv with rate 3
- 3×3 depthwise-separable conv
- 5×5 depthwise-separable conv
下面結合上圖介紹Auto-fusion結構的表示方式。
對於backbone提取的4個特征圖我們用\({P^0_1,P^0_2,P^0_3,P^0_4}\)表示,\(P^0_4\)表示第0層的第4個特征圖,其高寬都比原圖的小4倍。那么如果Auto-fusion結構一共有\(L\)層,則第\(l\)層的特征圖可表示為\(P^l_1,P^l_2,P^l_3,P^l_4\)。第\(l-1\)層的\(i\)節點到第\(l\)層的\(j\)節點的operation可表示為(這里如果不明白先了解一下DARTS這篇論文):
下圖給出了Auto-fusion某一層的示意圖,可以看到因為要使得不同尺度的特征圖能做融合操作,首先都會用conv 1*1的操作,而后再計算不同operation的權重。
Auto-fusion對於one-stage和two-stage目標檢測網絡都適用。
Auto-head
Auto-head其實簡單理解就是和DARTS一樣搜索得到一個CNN結構,示意圖如下
不過有如下幾個方面作了修改,有必要提一下:
- Auto-head由\(M\)個cell組成,每個cell由7個nodes組成。每個cell有兩個inputs,分別是前一個和前前一個cell的outputs。
- 在DARTS中,最后有兩類cell,分別是normal cell和reduction cell。而在Auto-head中每個cell的結構可以不一樣,也就是說Auto-head可以由\(M\)個不同的cell組成
- Auto-head中沒有使用reduction cell,因為到了這一步特征圖大小已經很小了(如7*7)
- 同上,涉及到卷積的操作也不用dilated conv了,但是為了更好地提取特征,在每個operation后面還會加上3*3和5*5的卷積操作。
Resource constraint
AutoFPN還加入了資源約束,這樣既可以避免生成的模型過大,也能夠加速搜索和訓練過程。很直觀的一種想法是將forward時間作為約束條件,但是測得的forward時間相對於模型參數並不是可微的,所以考慮如下三個方面來對資源約束建模:
- 模型大小
- FLOPs
- memory access cost (MAC)
公示表示如下:
那么總的loss表達式如下:
其中\(\alpha\)表示模型參數,即我們常說的卷積核參數或者全連接層參數等,\(\beta\)表示模型結構參數,即記錄了不同operation的權重。值得一提的是\(\lambda\)這個參數,因為通過修改這個參數的大小,我們能夠控制模型的相對大小,例如如果我們令\(\lambda\)比較大,那么最終得到的網絡大小就會相對小一些,反之則大一些。在論文中,給出了三個等級的效果,具體結果看下一節。
實驗結果
Auto-fusion和Auto-head搜索結果
下圖給出了Auto-fusion和Auto-head搜索結果,可以看到identity和conv_5*5在兩個結構中用的最多。
不同大小模型的結果對比
按照文中的說法是分別Auto-fusion和Auto-head是分別進行搜索的,所以最后的AutoFPN是將二者最好的結果進行組合得到的。可以看到在不同的數據集上搜索得到的網絡結構更小,而且結果也能更好。
不過我看這結果有幾個疑問,就是結果的提升到底算不算顯著呢?結構的提升有多少其實是煉丹煉出來而不是搜網絡結構搜出來的呢?ε=(´ο`*)))唉
NAS baseline比較結果
最后文中還給出了不同搜索策略的結果對比,可以看到基於梯度下降的效果還是很不錯的。
訓練tricks大放送
作者很良心給出了5個訓練技巧:
- 先訓練初始化結構一段時間,然后再開始搜索網絡結構:Starting optimizing architecture parameters in the middle of training can improve the results by 1%;
- 在搜索階段固定backbone參數:Freezing the backbone parameters during searching not only accelerates the training but also improves the performance;
- 搜錯階段不要用BN:Searching with BN will decrease the performance by 1.7%;
- 在搜索head結構時,最好使用訓練好的neck結構:During searching for the head, loading the pretrained neck will boost the performance by 2.9%;
- 大模型對neck部分性能有些許提升,但是對head好像並沒有:Without resource constraints, our method becomes larger with only a small im- provement in neck but no improvement in head.