一道視覺算法面試的常考題
作者:YaqiLYU
轉(zhuǎn)自:https://zhuanlan.zhihu.com/p/44106492
大家好,我是 Jack。
視覺算法工程師,面試常見的一個(gè)問題就是:感受野。
通俗易懂的感受野基礎(chǔ)知識(shí),今天它來(lái)了。
經(jīng)典目標(biāo)檢測(cè)和最新目標(biāo)跟蹤都用到了RPN(region proposal network),錨框(anchor)是RPN的基礎(chǔ),感受野(receptive field, RF)是anchor的基礎(chǔ)。
本文介紹感受野及其計(jì)算方法,和有效感受野概念。
感受野
在典型CNN結(jié)構(gòu)中,F(xiàn)C層每個(gè)輸出節(jié)點(diǎn)的值都依賴FC層所有輸入,而CONV層每個(gè)輸出節(jié)點(diǎn)的值僅依賴CONV層輸入的一個(gè)區(qū)域,這個(gè)區(qū)域之外的其他輸入值都不會(huì)影響輸出值,該區(qū)域就是感受野。

圖中是個(gè)微型CNN,來(lái)自Inception-v3論文,原圖是為了說(shuō)明一個(gè)conv5x5可以用兩個(gè)conv3x3代替,從下到上稱為第1, 2, 3層:
第2層左下角的值,是第1層左下紅框中3x3區(qū)域的值經(jīng)過卷積,也就是乘加運(yùn)算計(jì)算出來(lái)的,即第2層左下角位置的感受野是第1層左下紅框區(qū)域; 第3層唯一值,是第2層所有3x3區(qū)域卷積得到的,即第3層唯一位置的感受野是第2層所有3x3區(qū)域; 第3層唯一值,是第1層所有5x5區(qū)域經(jīng)過兩層卷積得到的,即第3層唯一位置的感受野是第1層所有5x5區(qū)域。
就是這么簡(jiǎn)單,某一層feature map(特性圖)中某個(gè)位置的特征向量,是由前面某一層固定區(qū)域的輸入計(jì)算出來(lái)的,那這個(gè)區(qū)域就是這個(gè)位置的感受野。任意兩個(gè)層之間都有位置—感受野對(duì)應(yīng)關(guān)系,但我們更常用的是feature map層到輸入圖像的感受野,如目標(biāo)檢測(cè)中我們需要知道feature map層每個(gè)位置的特征向量對(duì)應(yīng)輸入圖像哪個(gè)區(qū)域,以便我們?cè)谶@個(gè)區(qū)域中設(shè)置anchor,檢測(cè)該區(qū)域內(nèi)的目標(biāo)。
感受野區(qū)域之外圖像區(qū)域的像素不會(huì)影響feature map層的特征向量,所以我們不太可能讓CNN僅依賴某個(gè)特征向量去找到其對(duì)應(yīng)輸入感受野之外的目標(biāo)。這里說(shuō)“不太可能”而不是“絕無(wú)可能”,是因?yàn)镃NN很強(qiáng)大,且圖像像素之間有相關(guān)性,有時(shí)候感受野之外的目標(biāo)是可以猜出來(lái)的,什么一葉知秋,管中窺豹,見微知著之類,對(duì)CNN目標(biāo)檢測(cè)都是有可能的,但猜出來(lái)的結(jié)果并不總是那么靠譜。
感受野有什么用呢?
一般task要求感受野越大越好,如圖像分類中最后卷積層的感受野要大于輸入圖像,網(wǎng)絡(luò)深度越深感受野越大性能越好; 密集預(yù)測(cè)task要求輸出像素的感受野足夠的大,確保做出決策時(shí)沒有忽略重要信息,一般也是越深越好; 目標(biāo)檢測(cè)task中設(shè)置anchor要嚴(yán)格對(duì)應(yīng)感受野,anchor太大或偏離感受野都會(huì)嚴(yán)重影響檢測(cè)性能。
感受野的計(jì)算
我們首先介紹一種從后向前計(jì)算方法,極其簡(jiǎn)單適合人腦計(jì)算,看看網(wǎng)絡(luò)結(jié)構(gòu)就知道感受野了,之后介紹一種通用的從前往后計(jì)算方法,比較規(guī)律適合電腦計(jì)算,簡(jiǎn)單編程就可以計(jì)算出感受野大小和位置。
感受野是一個(gè)矩形區(qū)域,如果卷積核全都長(zhǎng)寬相等,則對(duì)應(yīng)感受野就是正方形區(qū)域。輸出feature map中每個(gè)位置都對(duì)應(yīng)輸入圖像一個(gè)感受野區(qū)域,所有位置的感受野在輸入圖像上以固定步進(jìn)的方式平鋪。
我們要計(jì)算感受野的大小r(長(zhǎng)或?qū)?和不同區(qū)域之間的步進(jìn)S,從前往后的方法以感受野中心(x,y)的方式確定位置,從后往前的方法以等效padding P的方式確定位置。CNN的不同卷積層,用k表示卷積核大小,s表示步進(jìn)(s1表示步進(jìn)是1,s2表示步進(jìn)是2),下標(biāo)表示層數(shù)。
從后往前的計(jì)算方式的出發(fā)點(diǎn)是:一個(gè)conv5x5的感受野等于堆疊兩個(gè)conv3x3,反之兩個(gè)堆疊的conv3x3感受野等于一個(gè)conv5x5,推廣之,一個(gè)多層卷積構(gòu)成的FCN感受野等于一個(gè)conv rxr,即一個(gè)卷積核很大的單層卷積,其kernelsize=r,padding=P,stride=S。
(如果我們將一個(gè)Deep ConvNet從GAP處分成兩部分,看成是FCN (全卷積網(wǎng)絡(luò))+MLP (多層感知機(jī)),從感受野角度看FCN等價(jià)于一個(gè)單層卷積提取特征,之后特征經(jīng)MLP得到預(yù)測(cè)結(jié)果,這個(gè)單層卷積也就比Sobel復(fù)雜一點(diǎn),這個(gè)MLP可能還沒SVM高端,CNN是不是就沒那么神秘了~)
以下是一些顯(bu)而(hui)易(zheng)見(ming)的結(jié)論:
初始feature map層的感受野是1 每經(jīng)過一個(gè)convkxk s1的卷積層,感受野 r = r + (k - 1),常用k=3感受野 r = r + 2, k=5感受野r = r + 4 每經(jīng)過一個(gè)convkxk s2的卷積層或max/avg pooling層,感受野 r = (r x 2) + (k -2),常用卷積核k=3, s=2,感受野 r = r x 2 + 1,卷積核k=7, s=2, 感受野r = r x 2 + 5 每經(jīng)過一個(gè)maxpool2x2 s2的max/avg pooling下采樣層,感受野 r = r x 2 特殊情況,經(jīng)過conv1x1 s1不會(huì)改變感受野,經(jīng)過FC層和GAP層,感受野就是整個(gè)輸入圖像 經(jīng)過多分枝的路徑,按照感受野最大支路計(jì)算,shotcut也一樣所以不會(huì)改變感受野 ReLU, BN,dropout等元素級(jí)操作不會(huì)影響感受野 全局步進(jìn)等于經(jīng)過所有層的步進(jìn)累乘, 經(jīng)過的所有層所加padding都可以等效加在輸入圖像,等效值P,直接用卷積的輸入輸出公式 反推出P即可
這種計(jì)算方法有多簡(jiǎn)單呢?我們來(lái)計(jì)算目標(biāo)檢測(cè)中最常用的兩個(gè)backbone的感受野。最初版本SSD和Faster R-CNN的backbone都是VGG-16,結(jié)構(gòu)特點(diǎn)卷積層都是conv3x3s1,下采樣層都是maxpool2x2 s2。先來(lái)計(jì)算SSD中第一個(gè)feature map輸出層的感受野,結(jié)構(gòu)是conv4-3 backbone + conv3x3 classifier (為了寫起來(lái)簡(jiǎn)單省掉了左邊括號(hào)):
r = 1 +2 +2+2+2 )x2 +2+2+2 )x2 +2+2 )x2 +2+2 = 108
S = 2x2x2 = 8
P = floor(r/2 - 0.5) = 53
以上結(jié)果表示感受野的分布方式是:在paddding=53(上下左右都加) 的輸入224x224圖像上,大小為108x108的正方形感受野區(qū)域以stride=8平鋪。
再來(lái)計(jì)算Faster R-CNN中conv5-3+RPN的感受野,RPN的結(jié)構(gòu)是一個(gè)conv3x3+兩個(gè)并列conv1x1:
r = 1 +2 +2+2+2 )x2 +2+2+2 )x2 +2+2+2 )x2 +2+2 )x2 +2+2 = 228
S = 2x2x2x2 = 16
P =floor(r/2 - 0.5) = 113
分布方式為在paddding=113的輸入224x224圖像上,大小為228x228的正方形感受野區(qū)域以stride=16平鋪。
接下來(lái)是Faster R-CNN+++和R-FCN等采用的重要backbone的ResNet,常見ResNet-50和ResNet-101,結(jié)構(gòu)特點(diǎn)是block由conv1x1+conv3x3+conv1x1構(gòu)成,下采樣block中conv3x3 s2影響感受野。先計(jì)算ResNet-50在conv4-6 + RPN的感受野 (為了寫起來(lái)簡(jiǎn)單堆疊卷積層合并在一起):
r = 1 +2 +2x5 )x2+1 +2x3 )x2+1 +2x3 )x2+1 )x2+5 = 299
S = 2x2x2x2 = 16
P = floor(r/2 - 0.5) = 149
P不是整數(shù),表示conv7x7 s2卷積有多余部分。分布方式為在paddding=149的輸入224x224圖像上,大小為299x299的正方形感受野區(qū)域以stride=16平鋪。
ResNet-101在conv4-23 + RPN的感受野:
r = 1 +2 +2x22 )x2+1 +2x3 )x2+1 +2x3 )x2+1 )x2+5 = 843
S = 2x2x2x2 = 16
P = floor(r/2 - 0.5) = 421
分布方式為在paddding=421的輸入224x224圖像上,大小為843x843的正方形感受野區(qū)域以stride=16平鋪。
以上結(jié)果都可以反推驗(yàn)證,并且與后一種方法結(jié)果一致。從以上計(jì)算可以發(fā)現(xiàn)一些的結(jié)論:
步進(jìn)1的卷積層線性增加感受野,深度網(wǎng)絡(luò)可以通過堆疊多層卷積增加感受野 步進(jìn)2的下采樣層乘性增加感受野,但受限于輸入分辨率不能隨意增加 步進(jìn)1的卷積層加在網(wǎng)絡(luò)后面位置,會(huì)比加在前面位置增加更多感受野,如stage4加卷積層比stage3的感受野增加更多 深度CNN的感受野往往是大于輸入分辨率的,如上面ResNet-101的843比輸入分辨率大3.7倍 深度CNN為保持分辨率每個(gè)conv都要加padding,所以等效到輸入圖像的padding非常大
文中給出了通用的計(jì)算公式,也是逐層計(jì)算,不同點(diǎn)在于這里是從前往后計(jì)算,核心四個(gè)公式:
上式中n是feature map的大小,p是padding,k是kernel size,j是jump(前面的S),r是感受野大小,start是第一個(gè)特征向量(左上角位置)對(duì)應(yīng)感受野的中心坐標(biāo)位置。搬運(yùn)并翻譯:
公式一是通用計(jì)算卷積層輸入輸出特征圖大小的標(biāo)準(zhǔn)公式 公式二計(jì)算輸出特征圖的jump,等于輸入特征圖的jump乘當(dāng)前卷積層的步進(jìn)s 公式三計(jì)算感受野大小,等于輸入感受野加當(dāng)前層的卷積影響因子(k - 1) * jin,注意這里與當(dāng)前層的步進(jìn)s沒有關(guān)系 公式四計(jì)算輸出特征圖左上角位置第一個(gè)特征向量,對(duì)應(yīng)輸入圖像感受野的中心位置,注意這里與padding有關(guān)系
從以上公式可以看出:start起始值為0.5,經(jīng)過k=3, p=1時(shí)不變,經(jīng)過k=5, p=2時(shí)不變。
計(jì)算示例:

計(jì)算出r, j和start之后,所有位置感受野的大小都是r,其他位置的感受野中心是start按照j滑窗得到。這種方法比較規(guī)律,推薦編程實(shí)現(xiàn)。
有效感受野
NIPS 2016論文Understanding the Effective Receptive Field in Deep Convolutional Neural Networks提出了有效感受野(Effective Receptive Field, ERF)理論,論文發(fā)現(xiàn)并不是感受野內(nèi)所有像素對(duì)輸出向量的貢獻(xiàn)相同,在很多情況下感受野區(qū)域內(nèi)像素的影響分布是高斯,有效感受野僅占理論感受野的一部分,且高斯分布從中心到邊緣快速衰減,下圖第二個(gè)是訓(xùn)練后CNN的典型有效感受野。

這點(diǎn)其實(shí)也很好理解,繼續(xù)回到最初那個(gè)微型CNN,我們來(lái)分析第1層,下圖標(biāo)出了conv3x3 s1卷積操作對(duì)每個(gè)輸入值的使用次數(shù),用藍(lán)色數(shù)字表示,很明顯越靠近感受野中心的值被使用次數(shù)越多,靠近邊緣的值使用次數(shù)越少。5x5輸入是特殊情況剛好符合高斯分布,3x3輸入時(shí)所有值的使用次數(shù)都是1,大于5x5輸入時(shí)大部分位于中心區(qū)域的值使用次數(shù)都是9,邊緣衰減到1。每個(gè)卷積層都有這種規(guī)律,經(jīng)過多層堆疊,總體感受野就會(huì)呈現(xiàn)高斯分布。

ECCV2016的SSD論文指出更好的anchar的設(shè)置應(yīng)該對(duì)齊感受野:

絮叨
感受野,我當(dāng)年校招面試就考過,屬于深度學(xué)習(xí)的基礎(chǔ)知識(shí)。
這兩天,我還在休假中,請(qǐng)了年假,一直休到9號(hào),新的視頻爭(zhēng)取這周發(fā)出來(lái),三連,這次一定~!
我是 Jack,我們下期見。

推薦閱讀
? AI修復(fù)頻上熱搜,背后技術(shù)詳解!? 史詩(shī)級(jí)萬(wàn)字干貨,kNN算法。? 印度疫情,爆炸!
