昨天鹅厂的电面,敲醒了我,面试后经过一天的失落,最终还是要站起来的,把论文里存在的问题点弄清楚。就从在SPPNet和fast RCNN都涉及到ROI到feature map的映射关系开始吧!

感受野(receptive field):卷积网络中某非输入层的feature map中的神经元(像素点)映射到输入feature map上的区域大小。

是否考虑padding,需要根据具体情况具体分析。首先要注意三个概念:
- 卷积层之间尺寸关系;
- 层间感受野尺寸关系;
- 层间坐标关系;

层间尺寸关系(考虑padding)

输入层->输出层

已知:inputFieldSize:输入层feature map尺寸;
KernelSize:核尺寸;
Padding:单边padding尺寸;
未知:输出层尺寸;

其中:

  1. 红色部分:卷积核扫过的像素数,除以stride后,就是对应输出层的像素数;
  2. 绿色部分 :输入层两边各加padding;
  3. 蓝色部分:由于第一步没有考虑最后一个卷积操作,最后的卷积操作对应输出层的最后一个像素

输出层->输入层

已知:otputFieldSize:输出层feature map尺寸;
KernelSize:核尺寸;
Padding:单边padding尺寸;
未知:输入层尺寸(出去padding后的尺寸);

  1. 红色部分:先不考虑最后一个像素,其他每个像素对应这输入层的长度。
  2. 绿色部分 :除去padding长度,才是输入层的实际长度。
  3. 蓝色部分:再加上最后一次卷积核的Size,即为输入层的Size。

2 层间感受野尺寸关系(不考虑padding)

根据感受野的定义,表示输出层单位像素点对应输入图像的区域,跟padding无关。只与kernel size和stride有关。
也就是说conv1的feature map的感受野=kernel size,即:上述公式退化成input field size = kernel size(由于padding=0,outputsize=1)

先计算从第i层到第i-1层计算感受野,然后再依次向前计算:

      RF = 1 #待计算的feature map上的感受野大小for layer in (top layer To down layer):RF = ((RF -1)* stride) + fsize#此处padding区域不考虑,其他和上述公式相同,只是RF刚开始变成1

stride 表示卷积的步长; fsize表示卷积层滤波器的大小
如下图所示:

以下python代码计算Alexnet和VGG16的每层的feature map:

# -*- coding: UTF-8 –*-
import numpy as np#!/usr/bin/env pythonnet_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']},'zf-5':{'net': [[7,2,3],[3,2,1],[5,2,2],[3,2,1],[3,1,1],[3,1,1],[3,1,1]],'name': ['conv1','pool1','conv2','pool2','conv3','conv4','conv5']}}imsize = 224def outFromIn(isz, net, layernum):totstride = 1insize = iszfor layer in range(layernum):fsize, stride, pad = net[layer]outsize = (insize - fsize + 2*pad) / stride + 1insize = outsizetotstride = totstride * stridereturn outsize, totstridedef inFromOut(net, layernum):RF = 1for layer in reversed(range(layernum)):fsize, stride, pad = net[layer]RF = ((RF -1)* stride) + fsizereturn RFif __name__ == '__main__':print "layer output sizes given image = %dx%d" % (imsize, imsize)for net in net_struct.keys():print '************net structrue name is %s**************'% netfor 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)

3 层间坐标关系(考虑左边的padding)

坐标映射关系

由于每层的坐标的原点都是基于当前featuremap在padding前的左上角,如果padding后,图像左上角变化,导致坐标变化,因此,需要最后减去左上角的padding区域。

因此,相邻conv或pooling层的坐标映射关系:


上图所示:如果每层padding: ⌊F/2⌋ ⌊ F / 2 ⌋ \left \lfloor F/2 \right \rfloor,则feature map的(0,0)点和上一层输入图像的(0,0)点相对应,且feature map的(x,y)点和上一层输入图像的(xS,yS)点相对应。因此,对上面的公式进行简化。
从公式分析: (ki−1)2−padding=(ki−1)2−⌊ki2⌋ ( k i − 1 ) 2 − p a d d i n g = ( k i − 1 ) 2 − ⌊ k i 2 ⌋ \frac{(k_i-1)}{2} - padding = \frac{(k_i-1)}{2} - \left \lfloor \frac{k_i}{2} \right \rfloor
当 ki k i k_i为奇数时, (ki−1)2−⌊ki2⌋=0 ( k i − 1 ) 2 − ⌊ k i 2 ⌋ = 0 \frac{(k_i-1)}{2} - \left \lfloor \frac{k_i}{2} \right \rfloor = 0
一般卷积核不为偶数,所以上式简化成: pi=si∗pi−1 p i = s i ∗ p i − 1 p_i = s_i * p_{i-1}
第i层相对于第1层的stride:strides(i) = stride(1) * stride(2) * …* stride(i-1) (只考虑conv/pooling)
第i层到第1层的坐标映射为: p1=∏i0si∗pi p 1 = ∏ 0 i s i ∗ p i p_1 = \prod_{0}^{i}s_i * p_i

ROI与feature map之间的映射


设:输入图像ROI左上角坐标 (x1,y1) ( x 1 , y 1 ) (x_1,y_1),右下角坐标 (x2,y2) ( x 2 , y 2 ) (x_2,y_2)(已知)
feature map的ROI左上角坐标 (x′1,y′1) ( x 1 ′ , y 1 ′ ) (x_1^{'},y_1^{'}),右下角坐标 (x′2,y′2) ( x 2 ′ , y 2 ′ ) (x_2^{'},y_2^{'})(未知)
x′1=⌊x1S⌋+1 x 1 ′ = ⌊ x 1 S ⌋ + 1 x_1^{'} = \left \lfloor \frac{x_1}{S} \right \rfloor + 1
y′1=⌊y1S⌋+1 y 1 ′ = ⌊ y 1 S ⌋ + 1 y_1^{'} = \left \lfloor \frac{y_1}{S} \right \rfloor + 1
x′2=⌈x2S⌉−1 x 2 ′ = ⌈ x 2 S ⌉ − 1 x_2^{'} = \left \lceil \frac{x_2}{S} \right \rceil - 1
y′2=⌈y2S⌉−1 y 2 ′ = ⌈ y 2 S ⌉ − 1 y_2^{'} = \left \lceil \frac{y_2}{S} \right \rceil - 1
为什么加1或减1呢?
看看一下分析:

是否小数 xS x S \frac{x}{S} ⌊xS⌋+1 ⌊ x S ⌋ + 1 \left \lfloor \frac{x}{S} \right \rfloor + 1 ⌈y2S⌉−1 ⌈ y 2 S ⌉ − 1 \left \lceil \frac{y_2}{S} \right \rceil - 1
有小数 1.2 1+1=2(多0.8) 2-1=1(少0.2)
无小数 2 2+1=3(多1) 2-1=1(少1)
- - 总比 xS x S \frac{x}{S} 多0~1 总比 xS x S \frac{x}{S} 少0~1

也就是说左上角坐标反映射到输入图像后,在真实ROI左上角的比较接近右下方,右下角坐标反映射到输入图像后,在真实ROI左上角的比较接近左上方,也就是防止反映射到输入图像的区域超过实际ROI区域。

参考链接

  1. http://www.sohu.com/a/130601394_680233
  2. http://www.cnblogs.com/objectDetect/p/5947169.html

CNN中receptive field相关推荐

  1. 深度CNN感受野(Receptive Field)的计算

    参考 如何计算感受野(Receptive Field)--原理 FOMORO AI -> 可视化计算感受野的网站,可以用来验证自己计算的结果 Python代码 这里使用的是从后向前的计算方法,简 ...

  2. 《Understanding the Effective Receptive Field in Deep Convolutional Neural Networks》理解深卷积神经网络中的有效感受野

    前言 论文推荐来自B站UP-启释科技,该up对感受野和卷积有深刻的理解 推荐感受野视频讲解: 深度理解感受野(一) 深度理解感受野(二) 深度理解感受野(三) 深度理解感受野(四) 深度理解感受野(五 ...

  3. CNN接受域( receptive field)的计算

    A guide to receptive field arithmetic for CNN 原文:click here CNN的两大神器之一,局部感知野(另一个是权值共享).一般认为,人类的对外界的感 ...

  4. 有效感受野--Understanding the Effective Receptive Field in Deep Convolutional Neural Networks

    Understanding the Effective Receptive Field in Deep Convolutional Neural Networks NIPS 2016 本文主要分析了 ...

  5. 【目标检测系列】CNN中的目标多尺度处理方法

    关注上方"深度学习技术前沿",选择"星标公众号", 技术干货,第一时间送达! [导读]本篇博文我们一起来讨论总结一下目标检测任务中用来处理目标多尺度的一些算法. ...

  6. CNN中各类卷积总结:残差、shuffle、空洞卷积、变形卷积核、可分离卷积等

    CNN从2012年的AlexNet发展至今,科学家们发明出各种各样的CNN模型,一个比一个深,一个比一个准确,一个比一个轻量.我下面会对近几年一些具有变革性的工作进行简单盘点,从这些充满革新性的工作中 ...

  7. 卷积神经网路之感受野(receptive field)的理解

    卷积神经网路之感受野(receptive field)的理解与计算 感受野,源于生物学中,是一个有界限的媒介,一些生理刺激可以在特定生物体中引起感觉神经元反应.定义,单个感受器与许多感觉神经纤维相联系 ...

  8. 【目标检测】Receptive Field Block Net for Accurate and Fast Object Detection论文理解

    摘要   目标检测器现状:   (1)目前性能最好的目标检测器依赖于深度CNN骨干,如ResNet-101和Inception,拥有强大的特征表示,但承受着高计算成本.   (2)一些基于轻量级模型的 ...

  9. ECCV2018论文RBNet:Receptive Field Block Net for Accurate and FastObject Detection

    论文下载:https://arxiv.org/abs/1711.07767 源码下载:https://github.com/ruinmessi/RFBNet Abstract: 目前性能最好的目标检测 ...

最新文章

  1. 编译php时错误make ***[libphp5.la] Error 1
  2. python编程高手教程_写给编程高手的Python教程(11) 深入类和对象
  3. 打家劫舍系列(dp)
  4. 思科安全——企业安全棋局的“宇宙流”
  5. python链表删除尾部节点_python单链表中如何查找和删除节点?
  6. char与byte的区别
  7. php和java之间rsa加密互通
  8. ----------------学习进度表---------------------------------
  9. 百度网盘自动备份php,Linux定时备份数据到百度云盘
  10. 输电线路巡检机器人PPT_“高空大师”来了!架空输电线路智能巡检机器人在宁波投运...
  11. arduino无源蜂鸣器歌曲编码_Arduino加无源蜂鸣器,播放音乐《葫芦娃》
  12. 面向对象第八天---预处理与mysql事务
  13. 神策数据:打造趁手好用的标签用户画像系统(附PPT下载链接)
  14. postman 使用
  15. linux 0891端口,凯立德导航专用版本号及分辨率、端口、波特率
  16. JSON的4种解析方式使用以及对比
  17. H5分享到微信朋友圈与好友实现思路
  18. 大数据的核心价值是什么,主要体现在哪几方面?
  19. 2018年迎春杯复赛入围名单(三年级)
  20. 灵遁者:真正热爱生活的人,都知道这点

热门文章

  1. 2021年8月29日到2021年9月4日
  2. 输入阴历日期转化为华夏农历日期
  3. outline如何使用呢?从秘钥获取到到文件配置完整教程分享
  4. 店铺商场一键报警紧急求助按钮创建和谐社会
  5. FCN(Fully Convolutional Network)全卷积网络笔记
  6. 图片编辑用什么软件?快把这些软件收好
  7. Linux运维人,该醒醒了,2019年要变天了
  8. Jackson反序列化List
  9. C课程设计——魔塔游戏
  10. 移动端rem单位换算