一文讀懂感受野
1.感受野的定義
感受野( )的定義是卷積神經(jīng)網(wǎng)絡(luò)每一層輸出的特征圖( )上的像素點(diǎn)在原始輸入圖片上映射的區(qū)域大小。再通俗點(diǎn)的解釋是,特征圖上的一個(gè)點(diǎn)對應(yīng)原始輸入圖片上的區(qū)域,如下圖所示。

2.感受野的例子
這里舉兩個(gè)例子來簡單說明一下感受野。首先是一個(gè)5 * 5的輸入圖經(jīng)過兩層卷積核為3 * 3的卷積操作后得到的感受野是5*5,其中卷積核()的步長()為1、為0,如下圖所示:

上圖中中左上角第一個(gè)值是由中左上角3 * 3區(qū)域的值經(jīng)過卷積計(jì)算出來的,即中左上角值的感受野是中左上角3 * 3的區(qū)域;
中的值是由中對應(yīng)3 * 3的區(qū)域經(jīng)過卷積計(jì)算得到的,即中的感受野是中整個(gè)3 * 3的區(qū)域;
由此可知的值是由中所有的區(qū)域經(jīng)過兩層卷積計(jì)算得到的,即的感受野是中所有的5 * 5區(qū)域。
再舉一個(gè)例子,7 * 7的輸入圖經(jīng)過三層卷積核為3 * 3的卷積操作后得到的感受野為7 * 7,也就是中的值是由所有區(qū)域的值經(jīng)過卷積計(jì)算得到,其中卷積核大小、步長和的值均和上面例子相同,如下圖所示:

3.感受野的計(jì)算
在計(jì)算感受野時(shí)有下面幾點(diǎn)需要說明:
(1)第一層卷積層的輸出特征圖像素的感受野的大小等于卷積核的大小。
(2)深層卷積層的感受野大小和它之前所有層的濾波器大小和步長有關(guān)系。
(3)計(jì)算感受野大小時(shí),忽略了圖像邊緣的影響,即不考慮padding的大小。
下面給出計(jì)算感受野大小的計(jì)算公式:
其中RF_{l+1}為當(dāng)前特征圖對應(yīng)的感受野的大小,也就是要計(jì)算的目標(biāo)感受野,RF_{l}為上一層特征圖對應(yīng)的感受野大小,f_{l+1}為當(dāng)前卷積層卷積核的大小,累乘項(xiàng)表示當(dāng)前卷積層之前所有卷積層的步長乘積。
以上面距的第二個(gè)為例:
層由于是第一層卷積輸出,即其感受野等于其卷積核的大小,即第一層卷積層輸出的特征圖的感受野為5,=3;
層的感受野 = 3 + (3 - 1) * 1 = 5,即第二層卷積層輸出的特征圖的感受野為5;
層的感受野 = 5 + (3 - 1) * 1 = 7,即第三層卷積層輸出的特征圖的感受野為7;
下面給出了由上述方法來計(jì)算和網(wǎng)絡(luò)中每一層輸出特征圖的感受野大小的代碼:
net_struct = {
'alexnet': {'net': [[11, 4, 0], [3, 2, 0], [5, 1, 2], [3, 2, 0], [3, 1, 1], [3, 1, 1], [3, 1, 1], [3, 2, 0]],
'name': ['conv1', 'pool1', 'conv2', 'pool2', 'conv3', 'conv4', 'conv5', 'pool5']},
'vgg16': {'net': [[3, 1, 1], [3, 1, 1], [2, 2, 0], [3, 1, 1], [3, 1, 1], [2, 2, 0], [3, 1, 1], [3, 1, 1], [3, 1, 1],
[2, 2, 0], [3, 1, 1], [3, 1, 1], [3, 1, 1], [2, 2, 0], [3, 1, 1], [3, 1, 1], [3, 1, 1],
[2, 2, 0]],
'name': ['conv1_1', 'conv1_2', 'pool1', 'conv2_1', 'conv2_2', 'pool2', 'conv3_1', 'conv3_2',
'conv3_3', 'pool3', 'conv4_1', 'conv4_2', 'conv4_3', 'pool4', 'conv5_1', 'conv5_2', 'conv5_3',
'pool5']}}
# 輸入圖片size
imsize = 224
def outFromIn(isz, net, layernum):
totstride = 1
insize = isz
for layer in range(layernum):
fsize, stride, pad = net[layer]
# outsize為每一層的輸出size
outsize = (insize - fsize + 2 * pad) / stride + 1
insize = outsize
totstride = totstride * stride
return outsize, totstride
def inFromOut(net, layernum):
RF = 1
for layer in reversed(range(layernum)):
fsize, stride, pad = net[layer]
# 感受野計(jì)算公式
RF = ((RF - 1) * stride) + fsize
return RF
if __name__ == '__main__':
print("layer output sizes given image = %dx%d" % (imsize, imsize))
for net in net_struct.keys():
print('************net structrue name is %s**************' % net)
for i in range(len(net_struct[net]['net'])):
p = outFromIn(imsize, net_struct[net]['net'], i + 1)
rf = inFromOut(net_struct[net]['net'], i + 1)
print("Layer Name = %s, Output size = %3d, Stride = % 3d, RF size = %3d" % (net_struct[net]['name'][i], p[0], p[1], rf))
其輸出結(jié)果為:

4.感受野的作用
(1)一般task要求感受野越大越好,如圖像分類中最后卷積層的感受野要大于輸入圖像,網(wǎng)絡(luò)深度越深感受野越大性能越好;
(2)密集預(yù)測task要求輸出像素的感受野足夠的大,確保做出決策時(shí)沒有忽略重要信息,一般也是越深越好;
(3)目標(biāo)檢測task中設(shè)置anchor要嚴(yán)格對應(yīng)感受野,anchor太大或偏離感受野都會(huì)嚴(yán)重影響檢測性能。
5.有效感受野
一文中提出了有效感受野( , )理論,論文發(fā)現(xiàn)并不是感受野內(nèi)所有像素對輸出向量的貢獻(xiàn)相同,在很多情況下感受野區(qū)域內(nèi)像素的影響分布是高斯,有效感受野僅占理論感受野的一部分,且高斯分布從中心到邊緣快速衰減,下圖第二個(gè)是訓(xùn)練后的典型有效感受野。

回到這張圖,我們看綠色的這個(gè)區(qū)域,黃色為圖像,綠色框掃過時(shí),對于第一列是只掃過一次,也就是參與一次運(yùn)算,而之后之間的幾列均是參與了多次計(jì)算。因此,最終實(shí)際感受野,是呈現(xiàn)一種高斯分布。

6.總結(jié)
感受野屬于計(jì)算機(jī)視覺當(dāng)中非常重要的基礎(chǔ)知識,屬于高頻面試題,各位小伙伴一定要搞懂呀。
7.引用
https://www.cnblogs.com/objectDetect/p/5947169.html https://www.linkedin.com/pulse/receptive-field-effective-rf-how-its-hurting-your-rosenberg https://zhuanlan.zhihu.com/p/39184237 https://zhuanlan.zhihu.com/p/44106492 https://blog.csdn.net/zyazky/article/details/80967931?utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control -https://arxiv.org/pdf/1701.04128.pdf
?------------------------------------------------
雙一流高校研究生團(tuán)隊(duì)創(chuàng)建,專注于目標(biāo)檢測與深度學(xué)習(xí),希望可以將分享變成我們的習(xí)慣。
整理不易,點(diǎn)贊三連!
