Fast R-CNN 学习笔记


首先附上Fast R-CNN的原文下载链接
https://pan.baidu.com/s/1E4XdgGs4BERPvbd3Ks7N4w
提取码:s9ux

初次开始在CSDN上写博客,最近在入门CV,开始学习R-CNN系列论文,这次附上关于Fast R-CNN论文学习的笔记,学习过程中参考了不少大佬写的博客。

先得回顾一下VGG16这个网络

我们知道R-CNN用的是Alexnet这个网络做SS算法之后的特征提取,而Fast R-CNN用的是VGG16这个网络,鉴于刚开始入门CV以及深度学习这一块,作为学习,有必要搞清楚VGG16这个网络的结构。
以下部分来源于斯坦福大学CS231课程的讲解
B站中文字幕链接(作为小白,先看中文字幕过度一下- -!)
第9课CNN

  1. VGGnet相比于Alexnet使用了更小的卷积核
    你可能要问了,使用比较小的卷积核有什么好处?
    使用小卷积核可以有更加深的网络深度,更多的非线性性。
    3个串联起来的3×3的卷积核的感受野相当于一个7×7的卷积核。

    图1感受野变化原理图
    我们试着算一下这里面的参数个数: 如果按一个输入为7*7*3算,用一个7*7*3的卷积核直接卷积,这个卷积个参数个数为:7*7*3=147 而如果是三个串联的3*3*3的卷积核,则参数个数为:3*3*3*3=81,显然参数个数减少,但感受野却没变。

    有关感受野具体详细的介绍,可以参考博客:
    https://blog.csdn.net/program_developer/article/details/80958716.

在这里插入图片描述

图3 VGG网络详解图(1)

在这里插入图片描述

图4 VGG网络详解图(2)

R-CNN的不足

  1. 需要多线段流水线训练。R-CNN需要先使用log损失在物体的proposal上调优卷积网络,然后,还要让SVMs去适应卷积网络的特征,这些SVMs取代了通过调优学到的softmax分类器,在第三阶段进行约束框回归。
  2. 训练费时间费内存。对于SVM和约束框回归的训练,特征是从每张图片的每个物体proposal中抽取出来在写到硬盘的。对于非常深的网络来说,整个过程需要特别大的内存空间,训练起来非常慢。
  3. 物体检测非常慢。测试阶段,每张测试图片的每个梧桐的proposal都要进行特征提取,VGG16检验一张图片在GPU上耗费47s。

其实在读这篇论文的过程中,我才发现自己有个知识误区是,因为全连接层的结构确定了,所以才使得卷积层的最初输入的图片尺寸必须是固定的。就拿VGGnet16来举例,对于FC1层来说,4096个神经元中的参数是构建网络时就确定下来的,每个神经元中有(W1,W2,W3,…,W25088),之所以是25088是因为7×7×512=25088。所以并不是卷积层要求输入图片尺寸一样,是全连层的要求。

Fast R-CNN的改进之处

  1. 检测精度被提高了
  2. 使用了多任务的loss进行单阶段训练
  3. 训练可以更新所有层
  4. 不需要硬盘存储特征缓存

过度一下SPP Net

其实看完R-CNN,就应该先看SPP Net,如果不看SPP Net,对于理解fast R-CNN还是有点困难。SPP net(Spatial Pyramid pooling:空间金字塔池化)。好了,回到我们的问题,R-CNN其中有个非常的缺点是,crop/wrap操作会导致图片被拉伸变形,要么物体不全,限制了识别精度,要么就是失真了。
在这里插入图片描述

图5 crop/warp操作

所以,SPP Net作者的思考角度就是,既然卷积层可以允许任何尺寸的输入,而全连接层需要固定尺寸的输入,那么为什么不能在卷积层之后加入某种结构,使得后面的全连接层变成固定的输入呢?所以就创造了空间金字塔池化结构。

在这里插入图片描述

图6 R-CNN和SPPnet结构对比图

在普通的CNN结构中,输入图像的尺寸往往是固定,而输出是一个固定维数的向量,SPP Net在普通的CNN结构中加入了(region of pooling)层,使得网络的输入图像可以是任意尺寸的,输出则不变,同样是一个固定维数的向量。
SPPnet先对原图进行一次卷积计算,得到整张图的feature map,然后找到每个候选框在feature map上的映射patch,将此patch作为每个候选框的卷积特征输入到SPP layer和之后的层,完成特征提取工作。
先来看一下SPP层的工作原理。我们假设到了图片尺寸不定,而FC层的全连接层需要的输入是(21×256=5376的一维向量),现在由最后一层卷积层得到输入是n×n×256的输入。我们选择了三种类型的pooling块,4×4的,2×2的,1×1的,然后用这些块对每一个n×n×256的feature map进行max pooling
在这里插入图片描述

图6 SPP层原理图

怎么看这个图,假设现在这个n×n的图是可以被分成这样不同大小的区域的,用16的核一次max pooling得到16×256的输出,用4的核一次max pooling得到4×256的输出,再用一个1的核一次max pooling得到1×256的输出,最后将这些输出全部一次展成一维向量顺序连接,就会得到21*256的一维向量,然后就可以用作全连接层的输入了。这样就达到我们的目的了,将不同尺寸的图片最终可以得到固定维度输入到全连接层。
在这里插入图片描述

图7 特征图

R-CNN与SPP Net的对比

在R-CNN中,每个候选框先resize到统一大小,然后分别作为CNN的输入这样是很低效的。而SPP Net根据这个缺点做了优化:只对原图进行一次卷积计算,便得到整张图的卷积特征feature map,然后找到每个候选框在feature map上的映射patch,将此patch作为每个候选框的卷积特征输入到SPP layer核之后的层,完成特征提取工作。所以,R-CNN要对每个区域计算卷积,而SPP Net之u需要计算一次卷积,从而节省了大量的计算时间,比R-CNN有一百倍的提速。

进入正题Fast R-CNN

R-CNN与Fast R-CNN的两处不同

  1. 在最后一个卷积层加了一个ROI pooling layer。
  2. 损失函数使用了多任务损失函数(multi—task loss),将边框回归Bounding Box Regression直接加入到CNN网络训练中。
    注解:ROL pooling layer实际上是一个SPP Net的精简版,由于Fast R-CNN的使用了VGG NET,我们从上文的图中发现,VGGnet的con5_3的输出是7×7×512,所以每个pathc的卷积特征图最后都要下采样到77512,512是通道数这个都是一样的,主要是尺寸变到7*7
    在这里插入图片描述
图8 Fast R-CNN原理图

对此图的解释
对比一下R-CNN和Fast R-CNN的工作流程,R-CNN的每一个候选框都要独自经过CNN,2000个region proposal要进行2000次卷积,这部分就非常浪费时间,而Fast R-CNN在于我先对原图进行一次卷积,然后你的需求不过是region proposal的特征图而已,我们就在原图的特征图找我现在的region proposal的特征图就行,找到把它抠出来,这时候因为尺寸不一,无法输入到全连接层,所以下采样到7×7×512。紧接着,从图上可以看出,先经过了两个FC,然后分别将此时的特征送到两个不同的FC,一个用于输出softmax概率,一个用于输出bounding-box回归偏移量。
在这里插入图片描述

图9 Fast R-CNN和R-CNN速度对比图

举个例子再细说明一下ROI Pooling层的工作原理

输入

  • 原图经过VGGNet的5个卷积池化层得到的feature map
  • 一个表示ROI的N×5的矩阵,其中N代表ROI的数目,因为fast R-CNN依然采用SS算法,所以,应该有2000个ROI,第一列表示图像的index,其余四列是固定边框的坐标。

具体流程

  • 根据输入image,将ROI映射到feature map的对应位置
  • 将映射后的区域划分为7×7的区域大小(如果不能均分,比如一个区域是4×5,一个区域是3×5也是可以的)
  • 然后对现在的每个区域进行max pooling操作
  • 然后就可以输入到全连接层

画图说明

图10 一个8×8的feature map

假设我们需要的是2×2的尺寸输入到FC
给定了第一个ROI的坐标为左下角(0,3)右上角(7,8)
在这里插入图片描

图11 在feature map上找到了ROI的特征映射

在这里插入图片描述

图12 将其划分为2×2的区域 , 对每个区域做max pooling

在这里插入图片描述

图13 每个区域做max pooling 之后的输出

补充一些多任务损失函数的内容

先讲一下什么是边框回归

在这里插入图片描述

图14 边框回归原理图

对于窗口来说,我们一般使用四维向量(x,y,w,h)来表示,分别表示窗口的中心点坐标和宽高。绿色的框G代表ground truth,就是真实窗口,P代表原始的region proposal的窗口。因为我们的建议窗口并不总是合理的,总会和我们实际需要的输出有一点偏差,我们希望输入这个region proposal的窗口,然后学到一种回归模型,这种回归模型我帮我们调整到一个G*的窗口,就是蓝色的窗口,这个窗口非常接近G。

换成数学公式表示就是:在这里插入图片描述那么如何去做呢?
在这里插入图片描述

在这里插入图片描述
这里还需要事先设置一下IOU,R-CNN用的IOU是>0.6,即大于0.6时候就可以停止学习了。

为什么Iou较大,可以认为是线性变换?

Log函数明显不满足线性函数,但是为什么当Proposal 和Ground Truth相差较小的时候,就可以认为是一种线性变换呢?
在这里插入图片描述
在这里插入图片描述
当且仅当Gw−Pwj近似为0的时候,才会是线性函数,也就是宽度和高度必须近似相等。

L1损失函数和L2损失函数

L1损失函数:最小化绝对误差,因此L1损失对于异常点有较好的适应鲁棒性,不可导,有多解,解的稳定性不好
关于L1损失函数不连续的问题,可以用平滑L1损失函数代替:
在这里插入图片描述
L2损失函数:最小化平方误差,因此L2损失对异常点敏感,L2损失函数会赋予异常点更大损失值和梯度,调整网络参数向减小异常点误差的方向更新,因此容易造成训练的不稳定和发散。
关于交叉熵和对数损失函数的知识可以参考博客:
https://blog.csdn.net/qq_38625259/article/details/88371462

Fast R-CNN的损失函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
等式右边第一项是中的p是由全连层的softmax计算得到的,所以等式右边第一项是分类的概率损失,等式右边第二项是边框回归的损失。方程中的λ是用于平衡中损失任务的,实验中取λ=1。

非极大值抑制(NMS)

关于非极大值抑制可以参考博客:非极大值抑制的理解

参考博客

fast R-CNN论文翻译
https://blog.csdn.net/weixin_38241876/article/details/84971371
一文读懂目标检测:R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD
https://blog.csdn.net/v_JULY_v/article/details/80170182?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase
ROI POOLING讲解
https://blog.csdn.net/XYKenny/article/details/100626881

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值