赞
踩
但是很可惜,即使使用了selective search等预处理步骤来提取潜在的bounding box作为输入,但是RCNN仍会有严重的瓶颈:
为了解决R-CNN中速度慢问题,何凯明大神提出SPPNet。
SPP Net的第一个贡献就是在最后一个卷积层后,接入了金字塔池化层,保证传到下一层全连接层的输入固定。
在普通的CNN机构中,输入图像的尺寸往往是固定的(比如224*224像素),输出则是一个固定维数的向量。SPP Net在普通的CNN结构中加入了ROI池化层(ROI Pooling),使得网络的输入图像可以是任意尺寸的,输出则不变,同样是一个固定维数的向量。
SPP Net的第二个贡献就是减少卷积运算。
对于多个候选区域依次进入特征提取网络进行图像特征提取,SPPNet采用直接将全图输入到卷积神经网络中提取图像特征,然后在图像特征图上找到候选区域的图像特征。此外,采用Spatial Pyramid Pooling将不同尺寸的候选区域特征转化为固定尺寸的值,避免了R-CNN采用的缩放操作。
R-CNN要对每个区域计算卷积,而SPPNet只需要计算一次卷积,从而节省了大量的计算时间,比R-CNN有一百倍左右的提速。
SPPNet做目标检测的主要步骤:
SPP-Net中的难点:
虽然总体流程还是 Selective Search得到候选区域->CNN提取ROI特征->类别判断->位置精修,但是由于所有ROI的特征直接在feature map上提取,大大减少了卷积操作,提高了效率。但是依旧有一个难点:
作者发现,卷积后对应的位置并不会发生改变,每个卷积层会匹配响应的区域。如下图所示:
映射的具体推导过程请看之前分享的博客。
Fast R-CNN使用了深度卷积神经网络来对候选区域进行分类,并且与之前的工作相比,既能提高训练和测试时的速度,又能增加检测的精度。与R-CNN相比,训练时Fast R-CNN能快9倍,测试时能快213倍。与SPP-Net相比,训练时快了3倍,测试时快了10倍。
在训练过程中,提取的特征要先存储在硬盘上,然后训练SVM分类模型,最后训练位置回归模型,而测试过程也是类似的,特征提取之后,需要先进行SVM分类,再回归目标的准确位置,整个过程在计算时间和存储空间上,都需要很大的开销。
通过分析得知,R-CNN之所以慢,它需要通过CNN前向传播来提取每一个候选区域的特征,没有用到共享计算。因此后续提出了SPP-Net网络。
SPP-Net网络通过共享计算来加速R-CNN的训练和测试过程。核心是引入了SPP层,也叫空间金字塔池化层。
SPP-Net的结构和R-CNN的结构大同小异,R-CNN的框架里,全连接层之间是一个最大池化层,而在SPP-Net里面,全连接层前面的最大池化层换成了SPP层。
SPP层的优点:当你传入一张图片时,通过卷积层和池化层,通过最后一个卷积层的时候,假如得到了一个 的特征图。在R-CNN中,我们通常会使用一个 ,步长为2的最大池化层,把 的特征图变成 的特征图,把池化的结果拉平后传给全连接层。SPP层本质上就是限制了我们的输出尺寸,也就是说采用了一个动态的池化核尺寸,比如我们想从 的特征图中得到 大小的特征图,那么我们只需要13/4后向上取整来作为池化核的一个尺寸,13/4向下取整的结果作为步长,也就是说用大小为4,步长为3的池化核,最终得到 大小的特征图,接下来 和 的操作一样。
所以SPP层的池化核的尺寸和步长是动态变化的,它会根据你输出特征图的尺寸来动态的改变池化核的尺寸和步长。在得到 、 和 大小的特征图后,再把它们拼接起来,就形成了一个固定长度的特征,再把这个特征传给后续的全连接层。
有了这个SPP层,可以输入任意大小的图片。
既然不需要像R-CNN一样限制输入图片大小的尺寸,那么换个思路,我们不传候选区域进去,直接把整幅图片传进CNN里面。SPP-Net论文里面提到,原图中的候选区域位置和特征图上的候选区域位置对应的区域相同。因此可以直接在特征图上提取候选区域。虽然不同尺寸输入的图像的候选区域尺寸不同,但是可以利用SPP层将不同尺寸的特征图转换成一个特定大小的输出。
那么我们相当于只使用CNN进行了一次前向传播。也就是说我们实现了在整张图上进行了共享计算。
SPP-Net依旧存在很多问题,和R-CNN一样,训练依旧是一个多阶段的过程,最后利用全连接层提取到特征之后,还是和R-CNN一样,SVM分类和边界框回归。既然是多阶段的,还是需要先将特征存储到磁盘里。R-CNN的训练问题还是没有得到解决。
并且SPP-Net引入了新的问题:微调算法很难去更新卷积层。这句话的意思后面在细讲。
因此提出了Fast R-CNN来尝试解决R-CNN和SPP-Net的缺点。
检测质量(mAP)高于R-CNN、SPPnet
训练是单阶段的,使用多任务损失
训练能更新所有的网络层
由于训练过程变成单阶段了,所以也就不需要将特征存储到磁盘中
对于一整张输入图片,会先通过深度卷积神经网络来得到一个整张图片的图片特征,根据候选区域在原图上的一个图片位置,我们可以根据ROI映射来得到特征图上的候选区域位置。
RoI pooling 借鉴了 SPPNet 的思想,是简化版的 SPPNet。它可以将不同大小的 feature map 转化为相同大小的特征向量。
先看一下通过的网络模型(例如AlexNet):
先将通用的网络模型(例如 AlexNet、VGG16 等)在 ImageNet 数据集上进行 预训练。做了如下的 3 步变换:
将网络最后的 max pooling 层换成 RoI pooling 层
网络最后的 FC 层和 softmax 替换成并列的 2 层 FC 层。一个 FC 用来分类【输出长度为:类别数 + 1,即21】,另一个 FC 用来回归最后的 Bounding Box。【输出长度为:4,通道数为:类别数 + 1】
将网络修改为接收 2 个值为输入。图像的 list 和属于这些图像中的 roi 的 list。
微调其实就是利用反向传播来训练模型的权重。Fast R-CNN可以很好的利用反向传播去更新权重,而SPP-Net不可以。
采样方法为什么这么重要?接下来展开讲一讲,先看一下流程图:
看一下模型结构,这里因为是测试一张图片的,所有只有一张图片的输入,但是在模型训练时,我们需要将一批一批的图片喂给卷积神经网络,一次会传入多张图片。
在反向传播更新权重的时候,是需要利用我们正向传播得到的中间每一层的值去更新权重的。在SPPNet中,训练时输入的一批图片是通过随机采样得到的。比如说,我们需要128个候选区域,这128个区域可能是来自不同的图片,也就是说我们需要传入128张这样类似的原图进去,然后在128张特征图中各自扣除需要的候选区域。在前向传播和后向传播的过程中,会占用大量的显存,降低模型的训练效率。
我们需要解决SPPNet不能微调SPP Layer之前的卷积层的问题 。
在前向传播的时候,我们只需要传两张图片进去,因为每张图片的64个区域都是在一张图上得到的。也就是说我们两张原图传进去,然后在其特征图上各自扣出64个候选区域即可,而不是像SPPNet一样,需要去传入128个原图,大大提升了训练效率,这就是作者提出的为什么SPPNet无法更新卷积层权重的原因。因为效率太低了!
在R-CNN中的流程是先提proposal,然后CNN提取特征,之后用SVM分类器,最后再做bbox regression进行候选框的微调;Fast R-CNN则是将候选框目标分类与bbox regression并列放入全连接层,形成一个multi-task模型。
看一下二者之间的图像:
和池化层的误差反向传播类似,由于通过SS算法获得候选框映射到特征图后发现很多区域会有重合,也就是说前一层的节点误差对后一层多个输出节点的误差有贡献,因此,前一层的误差应该等于后一层多个相关节点误差反向传播后的取值之和。
为了便于推导,我们这里只选择一张图,即mini-batch的N为1,此时有128张候选区域通过池化层。
除了修改增加的层,原有的层参数已经通过预训练方式初始化:
用于分类的全连接层以均值为0、标准差为0.01的高斯分布初始化。
用于回归的全连接层以均值为0、标准差为0.01的高斯分布初始化,偏置都初始化为0。
针对PASCAL VOC 2007和2012训练集,前30K次迭代全局学习率为0.01,每层权重学习率为1倍,偏置学习率为2倍,后10K次迭代全局学习率更新为0.0001。
动量设置为0.9,权重衰减设置为0.0005。
作者提出了使用两种方式对规模不变的对象进行检测:brute-force(单一尺度)和image pyramids(多尺度,图像金字塔)。
单一尺度直接在训练和测试阶段将image预先固定好像素大小,直接输入网络训练就好,然后期望在训练过程中网络自己能够学习到尺度不变性scale-invarience。
多尺度在训练阶段随机从图像金字塔(缩放图片的scale得到,得到多尺度图片,相当于扩充数据集)中采样训练,通过一个图像金字塔向网络提供一个近似的尺度不变,在测试阶段图像金字塔用来对每个候选框近似尺度归一化,训练阶段每次采样一个图像就随机采样一个金字塔尺度。
作者在5.2节对单一尺度和多尺度分别进行了实验,不管哪种方式下都定义图像短边像素为s,单一尺度下s=600【维持长宽比进行缩放】,长边限制为1000像素;多尺度s={480,576,688,864,1200}【维持长宽比进行缩放】,长边限制为2000像素,生成图像金字塔进行训练测试;实验结果表明AlexNet【S for small】、VGG_CNN_M_1024【M for medium】下单一尺度比多尺度mAP差1.2%~1.5%,但测试时间上却快不少,VGG-16【L for large】下仅单一尺度就达到了66.9%的mAP【由于GPU显存限制多尺度无法实现】,该实验证明了深度神经网络善于直接学习尺度不变形,对目标的scale不敏感。
第2中方法的表现确实比1好,但是好的不算太多,大概是1个mAP左右,但是时间要慢不少,所以作者实际采用的是第一个策略,也就是single scale。
一旦Fast R-CNN网络被微调,检测相当于运行正向传播(假设对象建议框object proposal是预先计算的)。
网络将图像(或图像金字塔,编码为图像列表)和待给得分的 R 对象建议框(object proposal)列表作为输入。
图像分类任务中,用于卷积层计算的时间比用于全连接层计算的时间多,而在目标检测任务中,selective search算法提取的建议框比较多【约2k】,几乎有一半的前向计算时间被花费于全连接层,就Fast R-CNN而言,RoI池化层后的全连接层需要进行约2k次【每个建议框都要计算】,因此在Fast R-CNN中可以采用SVD分解加速全连接层计算,具体实现如下:
在实现时,相当于把一个全连接层拆分为两个全连接层,第一个全连接层不含偏置,第二个全连接层含偏置。实验表明,SVD 分解全连接层能使 mAP 只下降 0.3% 的情况下提升 30% 的速度,同时该方法也不必再执行额外的微调操作。(见下图):
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。