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
-
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.
R-CNN的不足
- 需要多线段流水线训练。R-CNN需要先使用log损失在物体的proposal上调优卷积网络,然后,还要让SVMs去适应卷积网络的特征,这些SVMs取代了通过调优学到的softmax分类器,在第三阶段进行约束框回归。
- 训练费时间费内存。对于SVM和约束框回归的训练,特征是从每张图片的每个物体proposal中抽取出来在写到硬盘的。对于非常深的网络来说,整个过程需要特别大的内存空间,训练起来非常慢。
- 物体检测非常慢。测试阶段,每张测试图片的每个梧桐的proposal都要进行特征提取,VGG16检验一张图片在GPU上耗费47s。
其实在读这篇论文的过程中,我才发现自己有个知识误区是,因为全连接层的结构确定了,所以才使得卷积层的最初输入的图片尺寸必须是固定的。就拿VGGnet16来举例,对于FC1层来说,4096个神经元中的参数是构建网络时就确定下来的,每个神经元中有(W1,W2,W3,…,W25088),之所以是25088是因为7×7×512=25088。所以并不是卷积层要求输入图片尺寸一样,是全连层的要求。
Fast R-CNN的改进之处
- 检测精度被提高了
- 使用了多任务的loss进行单阶段训练
- 训练可以更新所有层
- 不需要硬盘存储特征缓存
过度一下SPP Net
其实看完R-CNN,就应该先看SPP Net,如果不看SPP Net,对于理解fast R-CNN还是有点困难。SPP net(Spatial Pyramid pooling:空间金字塔池化)。好了,回到我们的问题,R-CNN其中有个非常的缺点是,crop/wrap操作会导致图片被拉伸变形,要么物体不全,限制了识别精度,要么就是失真了。
所以,SPP Net作者的思考角度就是,既然卷积层可以允许任何尺寸的输入,而全连接层需要固定尺寸的输入,那么为什么不能在卷积层之后加入某种结构,使得后面的全连接层变成固定的输入呢?所以就创造了空间金字塔池化结构。
在普通的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
怎么看这个图,假设现在这个n×n的图是可以被分成这样不同大小的区域的,用16的核一次max pooling得到16×256的输出,用4的核一次max pooling得到4×256的输出,再用一个1的核一次max pooling得到1×256的输出,最后将这些输出全部一次展成一维向量顺序连接,就会得到21*256的一维向量,然后就可以用作全连接层的输入了。这样就达到我们的目的了,将不同尺寸的图片最终可以得到固定维度输入到全连接层。
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的两处不同
- 在最后一个卷积层加了一个ROI pooling layer。
- 损失函数使用了多任务损失函数(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
对此图的解释
对比一下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回归偏移量。
举个例子再细说明一下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操作
- 然后就可以输入到全连接层
画图说明
假设我们需要的是2×2的尺寸输入到FC
给定了第一个ROI的坐标为左下角(0,3)右上角(7,8)
补充一些多任务损失函数的内容
先讲一下什么是边框回归
对于窗口来说,我们一般使用四维向量(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