论文精读之Fast R-CNN(Fast R-CNN)

Fast R-CNN是基于R-CNN的一个更快更强的版本

论文地址:

https://arxiv.org/pdf/1504.08083.pdf​arxiv.org/pdf/1504.08083.pdficon-default.png?t=N6B9https://link.zhihu.com/?target=https%3A//arxiv.org/pdf/1504.08083.pdf

1. Introduction

论文首先阐述了过去的R-CNN的缺点,主要有以下三个方面:

  • 训练分为多个阶段。R-CNN需要经过候选框的选取和裁剪图像,接着进行CNN特征提取,最后是SVM进行框回归和类别判定
  • 训练需要耗费大量的空间和时间。对于类别判别器和框回归器的训练,需要从每幅图像中的每个候选框中提取特征并写入磁盘
  • 物体检测速度较慢。测试时,要从每张测试图像中的每个候选框中提取特征

论文接着肯定了SPPnet的优点。SPPnet是一种优于R-CNN算法,其创新点在于只在整张图像上抽取一次特征。然后在每个特征图的候选窗口上应用空间金字塔池化,形成这个窗口的一个固定长度表示。

因为R-CNN的最后几层全连接层是固定的,因此导致网络的输入也是固定的227*227,而且是从图像中裁剪出2000个候选区域输入网络中。而SPPnet通过改变全连接层前池化层的设置,ROI Pooling使用自适应(根据输入feature的大小自调整)池化区域,不再固定池化区域大小,而固定池化区域个数,这样就确保了输入什么大小的feature,输出的feature大小完全相等。

因此,SPPnet不再固定网络的输入尺寸大小,网络不需要对每张输入图像进行裁剪,而是整张图像作为输入,经过CNN特征提取之后,得到特征图,接着根据预先确定好的候选框大小,从特征图中寻找原始图片中候选框的位置(根据特征图的大小和原图大小进行逆转换),并选用这个区域作为池化层的输入。SPPnet网络后面的部分和R-CNN相似。

论文接着阐述了SPPnet也有缺点,与R-CNN一样,训练也是分为多个阶段,并且无法更新空间金字塔池化之前的卷积层(这点本人无法理解,认真看了论文的解释也是一知半解,最后求助知乎得到了可以解释的解答),简单来说就是SPPnet对于图像的训练模式是打乱每个batch的所有ROI,所以很难更新卷积层的参数(虽然我也不知道为什么它要这样训练)

2. Fast R-CNN architecture and training

论文提出一种新的算法结构Fast R-CNN,首先,将图片输入DeepCNN网络中得到特征图,根据映射关系可以找到原图上每个候选区域在特征图上的特征矩阵,然后将特征矩阵通过RoI Pooling层统一缩放到指定尺寸(论文中采用7x7),然后经过两个全连接层得到特征向量,在这之后并联两个全连接层层,左边的全连接层用于目标类别预测(分类器),右边全连接层用于边界框回归参数的预测(回归器)。

分类器:输出N+1个类别的概率,N为检测目标种类数,1为背景

回归器:输出N+1个类别的边界框回归参数,每组 4 个值代表框的位置

RoI池化层只是SPPnets中使用的空间金字塔池化层的特例,其中只有一个金字塔层。论文中是将所有不同尺寸的特征图统一池化成7*7的特征向量。

论文使用三个预先训练好的ImageNet网络进行实验,每个网络都有五个最大池化层和五到十三个 conv 层。当一个预训练网络初始化Fast R-CNN网络时,它将经历三次转换。首先,最后一个最大池化层被 RoI 池化层取代, 其次,将网络的最后一个全连接层替换为前面所述的(一个全连接层和 K + 1 个类别的softmax以及特定类别的边界框回归层)。 第三,对网络进行修改,以接受两个数据输入: 图像和这些图像中的 RoIs。

这部分比较难理解,网上也没有标准的解释,本人认为论文的意思是Fast R-CNN的训练方式与SPPnet对比,采用分层采样思想,先采样出N张图像,在这N张图像中再平均采样出R个RoI,即每张图片采样出R/N个RoI,同一图像的RoI共享计算和内存。论文中举了一个例子说到:设N = 2, R = 128,也就是说只用计算和存储2张图像卷积正向传播过程中的数据,那么需要存储的数据量相比R-CNN和SPPnet小了64倍(因为SPPnet采用的是打乱RoI训练,那么针对一张图像来说,两个模型达到相同效果的情况下SPPnet需要存储的数据量更大)

损失函数采用类别损失L_{cls}与边框回归L_{loc}损失的加权和(\lambda=1),其中 L_{cls}(p,u)=-log p_{u}是真实类别 u 的对数损失。当 u ≥ 1 时,[u ≥ 1] 的值为 1,否则为背景,则[u ≥ 1]=0

边框回归损失是一种稳健的 L1 损失,与 R-CNN 和 SPPnet 中使用的 L2 损失相比,它对异常值不那么敏感。当回归目标不受限制时,使用 L2 损失进行训练可能需要仔细调整学习率,以防止梯度爆炸。

在正负样本的选择上,论文选择IoU大于0.5的候选框里面的25%作为正样本;IoU低于0.5的则作为负样本;论文中提到使用了水平翻转作为数据增强。

论文详细解释了RoI池化层反向传播原理。假设图片经过候选框裁剪之后得到许多尺寸不一的特征图,并且经过一个池化(最大池化)得到3*3的输出,其中x_{i}指的是第r个区域特征图的第i个输入, y_{rj}指的是第r个特征图的第j个输出。在前向传播中,使用的是最大池化,所以y_{rj}是在第r特征图中的第j个池化区域的最大值x_{i}

反向传播时,计算x_{i}对 y_{rj}的偏导时,由于不同的区域特征图对应的x_{i}可能是同一个,因为需要对每一个特征图相加\sum_{r};同样的,也有许多池化区域的最大池化可能都是 x_{i} ,因此也需要对每一个j输出相加 \sum_{j} ,其中,[i=i^{*}(r,j)]控制的是使得只有当 y_{rj}=x_{i}时该值=1,否则=0

论文中还对SGD的超参数进行了设置

论文探索了两种实现物体尺度不变检测的方法:(1) 通过 "蛮力"学习;(2) 利用图像金字塔。在 "蛮力 "方法中,在训练和测试过程中,每幅图像都按照预先确定的像素尺寸进行处理。网络必须从训练数据中直接学习比例不变的物体检测。 多尺度方法则通过图像金字塔为网络提供近似的尺度不变性。测试时,图像金字塔用于对每个候选框进行近似比例归一化。

3. Fast R-CNN detection

在测试阶段,由于每张图像的候选区域比较多,网络在全连接阶段耗费时间比较多,因此网络提出了一个“截断 SVD”用于加快检测速度。

学过矩阵分解的应该都知道实际上SVD就是一个矩阵分解,将原本全连接层的W压缩成较小参数量的T(奇异值非0),参数量越少,计算速度越快

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!对于 Faster R-CNN 的代码精读,你可以参考以下步骤: 1. 阅读主要的文件结构:Faster R-CNN 通常包括几个主要的文件,包括模型定义文件、数据加载文件、训练和测试脚本等。首先,了解代码的整体结构和文件之间的关系是很重要的。 2. 理解模型架构:查看模型定义文件,通常是一个包含网络结构的类或函数。在这个文件中,你可以找到网络的主要组件,如卷积层、池化层、全连接层等。仔细阅读这些组件的定义和参数设置,对整个网络的结构和运作方式有一个清晰的理解。 3. 研究损失函数:Faster R-CNN 使用一种特定的损失函数来衡量模型预测与真实标签之间的差异。阅读训练脚本中的损失函数实现部分,了解如何计算损失以及如何反向传播梯度更新模型参数。 4. 数据加载与处理:Faster R-CNN 在训练和测试过程中需要加载和处理数据。查看数据加载文件,了解如何从数据集中读取图像和标签,并进行预处理操作,如缩放、裁剪、归一化等。 5. 推断与预测过程:Faster R-CNN 的目标是在图像中检测和定位物体。了解测试脚本中的推断和预测过程,包括如何对输入图像进行前向传播,并根据预测结果生成检测框和类别。 6. 调试和修改:在阅读代码的过程中,你可能会遇到一些问题或有一些想法来改进模型。尝试调试代码并进行一些修改,看看是否能够改善模型的性能或加入新的功能。 请记住,Faster R-CNN 是一个相对复杂的模型,可能需要花费一些时间来理解和熟悉代码。阅读官方的文档和参考资料,以及查找其他人的实现和解释,都是学习和理解代码的有用资源。祝你成功!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值