卷积神经网络物体检测之感受野大小计算

  学习RCNN系列论文时, 出现了感受野(receptive field)的名词, 感受野的尺寸大小是如何计算的,在网上没有搜到特别详细的介绍, 为了加深印象,记录下自己对这一感念的理解,希望对理解基于CNN的物体检测过程有所帮助。

1 感受野的概念

  在卷积神经网络中,感受野的定义是 卷积神经网络每一层输出的特征图(feature map)上的像素点在原始图像上映射的区域大小。

  

  RCNN论文中有一段描述,Alexnet网络pool5输出的特征图上的像素在输入图像上有很大的感受野(have very large receptive fields (195 × 195 pixels))和步长(strides (32×32 pixels) ), 这两个变量的数值是如何得出的呢?

2 感受野大小的计算

感受野计算时有下面的几个情况需要说明:

  (1)第一层卷积层的输出特征图像素的感受野的大小等于滤波器的大小

  (2)深层卷积层的感受野大小和它之前所有层的滤波器大小和步长有关系

  (3)计算感受野大小时,忽略了图像边缘的影响,即不考虑padding的大小,关于这个疑惑大家可以阅读一下参考文章2的解答进行理解

这里的每一个卷积层还有一个strides的概念,这个strides是之前所有层stride的乘积。

  即strides(i) = stride(1) * stride(2) * ...* stride(i-1)

  关于感受野大小的计算采用top to down的方式, 即先计算最深层在前一层上的感受野,然后逐渐传递到第一层,使用的公式可以表示如下:   

       RF = 1 #待计算的feature map上的感受野大小
  for layer in (top layer To down layer):
    RF = ((RF -1)* stride) + fsize

stride 表示卷积的步长; fsize表示卷积层滤波器的大小  

用python实现了计算Alexnet  zf-5和VGG16网络每层输出feature map的感受野大小,实现代码:

#!/usr/bin/env python

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‘]},
       ‘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 = 224

def outFromIn(isz, net, layernum):
    totstride = 1
    insize = isz
    for layer in range(layernum):
        fsize, stride, pad = net[layer]
        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]
        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)

receptiveField.py

执行后的结果如下:

参考:

http://stackoverflow.com/questions/35582521/how-to-calculate-receptive-field-size

2 http://stackoverflow.com/questions/37136829/receptive-fields-on-convnets-receptive-field-size-confusion/37143998#37143998 

3 CNN感受野的计算

4 Convolutional Feature Maps: Elements of Efficient (and Accurate) CNN-based Object Detection

5 Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition

   

时间: 2024-10-13 01:49:47

卷积神经网络物体检测之感受野大小计算的相关文章

深度卷积神经网络在目标检测中的进展

作者:travelsea链接:https://zhuanlan.zhihu.com/p/22045213来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 近些年来,深度卷积神经网络(DCNN)在图像分类和识别上取得了很显著的提高.回顾从2014到2016这两年多的时间,先后涌现出了R-CNN,Fast R-CNN, Faster R-CNN, ION, HyperNet, SDP-CRC, YOLO,G-CNN, SSD等越来越快速和准确的目标检测方法. 基于Reg

DeepLearning.ai学习笔记(四)卷积神经网络 -- week3 目标检测

一.目标定位 这一小节视频主要介绍了我们在实现目标定位时标签该如何定义. 上图左下角给出了损失函数的计算公式(这里使用的是平方差) 如图示,加入我们需要定位出图像中是否有pedestrian,car,motorcycles.注意在这里我们假设图像中只肯呢个存在这三者中的一种或者都不存在,所以共有四种可能. \(P_c=1\)表示有三者中的一种 \(C_1=1\)表示有pedestrian,反之没有 \(C_2=1\)表示有car \(C_3=1\)表示有motorcycles \(b_*\)用于

吴恩达【深度学习工程师】 04.卷积神经网络 第三周目标检测 (1)基本的对象检测算法

该笔记介绍的是<卷积神经网络>系列第三周:目标检测(1)基本的对象检测算法 主要内容有: 1.目标定位 2.特征点检测 3.目标检测  目标定位 使用算法判断图片中是不是目标物体,如果是还要再图片中标出其位置并使用边框标记出来                          我们研究过的问题中,图片分类的思想可以帮助学习分类定位,而分类定位的思想又可以帮助学习对象检测 a.分类定位问题,通常有一个较大的对象位于图片中间位置. b.对象检测问题,图片可以含有多个对象,或一张图片中会有多个不同分

数据挖掘、目标检测中的cnn和cn---卷积网络和卷积神经网络

content 概述 文字识别系统LeNet-5 简化的LeNet-5系统 卷积神经网络的实现问题 深度神经网路已经在语音识别,图像识别等领域取得前所未有的成功.本人在多年之前也曾接触过神经网络.本系列文章主要记录自己对深度神经网络的一些学习心得. 第二篇,讲讲经典的卷积神经网络.我不打算详细描述卷积神经网络的生物学运行机理,因为网络上有太多的教程可以参考.这里,主要描述其数学上的计算过程,也就是如何自己编程去实现的问题. 1. 概述 回想一下BP神经网络.BP网络每一层节点是一个线性的一维排列

卷积神经网络的计算

转自:https://zhuanlan.zhihu.com/p/63174774 1. 卷积 卷积神经网络中的卷积是指定义好卷积核(kernel),并对图像(或者特征图,feature map)进行滑动匹配,即对应位置相乘再相加.其特点就在于能够捕捉局部的空间特征.具体过程如下图所示: 图1-二维卷积过程示例 每一个卷积核对应于一种特征提取的范式,不同的卷积核对应于不同的特征提取器,如下图所示: 图2-卷积特征提取示例 卷积操作的参数包括卷积核大小(kernel size).步长(stride)

人脸检测及识别python实现系列(4)——卷积神经网络(CNN)入门

人脸检测及识别python实现系列(4)--卷积神经网络(CNN)入门 上篇博文我们准备好了2000张训练数据,接下来的几节我们将详细讲述如何利用这些数据训练我们的识别模型.前面说过,原博文给出的训练程序使用的是keras库,对我的机器来说就是tensorflow版的keras.训练程序建立了一个包含4个卷积层的神经网络(CNN),程序利用这个网络训练我的人脸识别模型,并将最终训练结果保存到硬盘上.在我们实际动手操练之前我们必须先弄明白一个问题--什么是卷积神经网络(CNN)? CNN(Conv

R-FCN:基于区域的全卷积网络来检测物体

http://blog.csdn.net/shadow_guo/article/details/51767036 原文标题为"R-FCN: Object Detection via Region-based Fully Convolutional Networks ",作者代季峰 1,14年毕业的清华博士到微软亚洲研究院的视觉计算组,CVPR 16 两篇一作的会议主持人~ ╰(°▽°)╯ 同时公布了源码~ 2 后面主要内容为原文随便的翻译或概括.必有不紧贴原文原意之处,曲解请指出,否则

TensorFlow与caffe中卷积层feature map大小计算

刚刚接触Tensorflow,由于是做图像处理,因此接触比较多的还是卷及神经网络,其中会涉及到在经过卷积层或者pooling层之后,图像Feature map的大小计算,之前一直以为是与caffe相同的,后来查阅了资料发现并不相同,将计算公式贴在这里,以便查阅: caffe中: TF中: 参考: http://blog.csdn.net/lujiandong1/article/details/53728053 http://www.cnblogs.com/denny402/p/5071126.h

CV学习资料《卷积神经网络与视觉计算》+《深度学习实践计算机视觉》+《视觉SLAM十四讲从理论到实践》电子资料代码分析

视觉和图形学真是一家,基础都一样! 如果学习图像识别,计算机视觉,推荐电子书<视觉SLAM十四讲:从理论到实践>,系统介绍了视觉SLAM(同时定位与地图构建)所需的基本知识与核心算法,既包括数学理论基础,如三维空间的刚体运动.非线性优化,又包括计算机视觉的算法实现,例如多视图几何.回环检测等. 一个周读完了,代码很清晰!Particle Filtering,KF,EKF, Batch Optimization, Lie Group,ICP,LK光流... 尤其惊喜的是文末作者看好的IMU-SL