Fast R-CNN精读笔记

Fast R-CNN

我的总结

其实感觉这篇论文里并没有提出一个很好的得到建议区域的方法,它只是使用了RoI Pooling Layer解决了原来的R-CNN算法中会对所有的建议区域进行同样的缩放这种不好的操作,同时测试表明在应用了这种方法之后得到的准确率有所上升,但测试却是在已经给定了建议区域的前提下完成的。

Introduction

作者认为以前所使用的方法是缓慢并且很不优雅的。并且认为有两大基本问题:

  • 需要处理大量的候选区域
  • 候选区域只能提供粗略的定位,需要改进才能得到精确的定位

而通常来说解决或者两个问题的方法会降低模型的速度、准确性和简单性。本文则简化了基于CNN的训练过程,提出了一个单阶段训练的能学习到分类方法和改进其定位位置的算法,而且这种算法与R-CNN相比是又快又准。

同时,作者指出了R-CNN的几个缺点:

  • 需要经过多个阶段的训练才能最终得到模型
  • 训练将占用大量的内存并且需要花费很长的时间
  • 目标检测时很慢(需要从所有的候选区域获取特征向量,没有使用共享运算)

其中SPPnets(Spatial pyramid pooling networks)可以通过计算的共享来加速R-CNN(即卷积时是直接计算整个图的卷积而不是每次只计算其中一部分,最终通过相对的池化来得到同样大小的特征向量),但这个方法也有缺点:需要经过多个阶段的训练,且微调算法无法更新。

作者吹了一下Fast R-CNN的优点

  • 比R-CNN和SPPnet更高的检测准确率
  • 使用多任务的损失函数达到只有一个阶段的训练
  • 训练过程中可以更新所有的神经网络层
  • 特征缓存不需要使用硬盘(应该是参数没有那么多的意思?)

Fast R-CNN architecture and training

本文中的算法是对整个图像进行卷积运算和池化后得到一个特征图,通过不同的候选区域对特征图上的特定区域进行特征向量的计算,并且特征向量输入全连接层后得到两个输出:属于不同类别的概率和对应类别物体在图像中的边界框。

RoI池化层(Region of Interest)

该层使用最大池化来将任意大小的特征图转换为一个固定大小的一个小特征图(小特征图的高和宽是超参数,与RoI无关),每个RoI区域由四个值定义:左上角的横纵坐标以及该区域的高和宽。

其中池化为统一大小的方法来源于K. He, X. Zhang, S. Ren, and J. Sun. Spatial pyramid pooling in deep convolutional networks for visual recognition. In ECCV, 2014.

使用预训练的神经网络初始化

作者测试了三个基于ImageNet的预训练网络作为Fast R-CNN的初始化,其中需要经历三次转化:

  • 最后一个最大池化层被转化为RoI池化层(该层的H和W被设置为与第一个全连接层兼容)
  • 全连接层的最后一层和softmax被转化为K+1类的softmax输出(包括背景类)和类别特定的边界框的回归计算

网络的输入被修改为两类数据:图像列表以及图像中的RoI区域

微调检测

首先作者提到了SPPnet不能更新金字塔池化层前的参数的原因是:每个RoI可能会有像一整张图像那么大的感受野,所以正向传播时往往需要处理整个图像,训练的输入太大了。

文中提出的方法可以在训练过程中实现参数共享,每个mini-batch中有N张图片,并且在每张图片上获取R/N个RoI区域进行训练,其中最重要的是,来源于同一张图片的RoI区域在前向传播和反向传播的过程中使用同样的参数实现共享。

但是这样的做法可能会由于来自同一张图像的RoI是相关的最终导致收敛缓慢,不过这样的问题并没有在实际中发生,并且当取N=2和R=128时使用SGD的迭代次数比R-CNN还少

同时Fast R-CNN通过这种操作最终只有一个训练阶段(在损失函数中融合了份分类计算和边界框的回归计算),而不是像原始R-CNN那样需要三个不同的训练阶段来训练不同的学习器。

多任务损失函数

两个任务分别为输出类别和对应的边界框。

Fast R-CNN有两个输出:一个输出是每个RoI区域在各个类别上的概率(概率由softmax得到),另一个输出是每个类别的边界框(由左上角坐标和边界框的高和宽给定)。

其中使用的参数化来源于“R. Girshick, J. Donahue, T. Darrell, and J. Malik. Rich feature hierarchies for accurate object detection and semantic segmentation. In CVPR, 2014.”

L ( p , u , t u , v ) = L c l s ( p , u ) + λ [ u ≥ 1 ] L l o c ( t u , v ) , L\left(p, u, t^{u}, v\right)=L_{\mathrm{cls}}(p, u)+\lambda[u \geq 1] L_{\mathrm{loc}}\left(t^{u}, v\right), L(p,u,tu,v)=Lcls(p,u)+λ[u1]Lloc(tu,v),

每个RoI区域都会有一个确切的边界框类别u和一个真实的边界框目标v(训练集中会标记好),本文中的损失函数就是将分类的损失函数与边界框各项数值的损失函数进行相加。

其中括号加个u被视为指示函数,满足条件时该函数为1,不满足条件时该函数为0。同时,在训练集中,所有被分类为背景的标签都是0,没有背景的边界框的损失函数是因为我们的训练集中根本就不会专门标记出来这是背景。

值得注意的是,当某个目标没有边界框的时候,使用L2损失函数的训练过程需要谨慎的调整学习率,否则可能会导致梯度爆炸。

而该损失函数中的超参数 l a m b d a \\lambda lambda是自己设置的,用来平衡两个任务的损失函数,本文中所有试验设置为 l a m b d a = 1 \\lambda=1 lambda=1

在这里插入图片描述

Mini-Batch采样

在微调阶段,每个mini-Batch中是两张图片,每张图片里面采集64个RoI区域。

选取与真实目标边界框的IoU值大于等于0.5的25%的RoI区域,这些区域包含不是背景的目标类别;在剩余的RoI区域中选取具有最大的IoU的区域(建议取值是在[0.1,0.5)之间),这些区域作为背景类别并且标签被打为0。

在训练的过程中,图像以0.5的概率发生水平翻转,除此之外不使用其他的数据增强手段。

通过RoI池化层的反向传播

这里的反向传播和原本卷积神经网络中最大池化的反向传播十分类似,应该可以对照着理解,Fast R-CNN里面只是最大池化的那个窗口的大小不同(因RoI区域而异)。

SGD超参数

对于用于softmax分类的全连接层,使用均值为0,标准差为0.01的高斯分布数据进行初始化;对于用于边界框回归预测的全连接层,使用均值为0,标准差为0.001的高斯分布数据进行初始化。

全部的偏置使用0作为初始化。

学习率设置这句不太懂,但摘抄下来。
在这里插入图片描述

保持图像比例的不变

有两种方法:

  • “蛮力”学习,在训练或者测试阶段,每张图像均被处理成一个拥有预定大小的图像,神经网络必须直接在训练集中学习到图像的比例缩放
  • 为神经网络提供准确的图像金字塔?在测试阶段

这里看着不是很懂,但是有引用文章,应该方法是那里面的

K. He, X. Zhang, S. Ren, and J. Sun. Spatial pyramid pooling in deep convolutional networks for visual recognition. In ECCV, 2014

目标检测部分

这里作者介绍了一下测试阶段的计算过程,并且提到了一个什么SVD可以用来加速目标检测的计算。

Main Result

这部分就是作者拿自己的模型和别人的比,证明自己的又快又好还省电脑,没怎么看。

Design evaluation

作者在这部分设计了实验来理解Fast R-CNN有多快。

多任务损失函数有帮助吗?

没怎么看,看不太懂他在干啥,大概意思就是在损失函数上面进行不同的操作来对比训练结果,最终得出的结果是他现在设计的损失函数最好。

保持比例不变:暴力还是技巧?

看不进去,要用的时候再看应该也行。

使用SVM还是softmax作为分类?

既然文章在设计模型阶段用了softmax,那这部分不看也知道最后的结果肯定是softmax的结果比较好。

是不是使用的边界框越多越好?

这种问题一看就是不一定。

Conclusion

  • 稀疏的检测对象似乎改善了目标检测的效果
  • 可能存在一种技术使得密集边界框和稀疏边界框的预测效果似乎一样的(废话)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值