标签:识别 position 背景 round 像素 cpm art cnn 结构
本文对基于RCNN框架的几个模型进行介绍和总结。
[目标检测][base64str0]
论文:Rich feature hierarchies for accurate object detection and semantic segmentation
发表时间:2014
发表作者:(加州大学伯克利分校)Ross Girshick
发表刊物/会议:CVPR
本文具有很多比较重要的意义。
1、在 Pascal VOC 2012 的数据集上,能够将目标检测的验证指标 mAP 提升到 53.3%,这相对于之前最好的结果提升了整整 30%.
2、这篇论文证明了可以讲神经网络应用在自底向上的候选区域,这样就可以进行目标分类和目标定位。
3、这篇论文也带来了一个观点,那就是当你缺乏大量的标注数据时,比较好的可行的手段是,进行神经网络的迁移学习,采用在其他大型数据集训练过后的神经网络,然后在小规模特定的数据集中进行 fine-tune 微调。
R-CNN利用候选区域与 CNN 结合做目标定位。其中借鉴了滑动窗口思想,R-CNN 采用对区域进行识别的方案。具体是:
给定一张输入图片,从图片中提取 2000 个类别独立的候选区域。
对于每个区域利用 CNN 抽取一个固定长度的特征向量。
再对每个区域利用 SVM 进行目标分类。
[R-CNN1][base64str1]
采用在 ImageNet 上已经训练好的模型,然后在 PASCAL VOC 数据集上进行 fine-tune。
因为 ImageNet 的图像高达几百万张,利用卷积神经网络充分学习浅层的特征,然后在小规模数据集做规模化训练,从而可以达到好的效果。
现在,称之为迁移学习,是必不可少的一种技能。
R-CNN 系统分为 3 个阶段,反应到架构上由 3 个模块完成。
能够生成候选区域的方法很多,比如:
R-CNN 抽取了一个 4096 维的特征向量,采用的是 Alexnet,基于 Caffe 进行代码开发。
需要注意的是 Alextnet 的输入图像大小是 227x227。而通过 Selective Search 产生的候选区域大小不一,为了与 Alexnet 兼容,R-CNN 采用了非常暴力的手段,那就是无视候选区域的大小和形状,统一变换到 227*227 的尺寸。
有一个细节,在对 Region 进行变换的时候,首先对这些区域进行膨胀处理,在其 box 周围附加了 p 个像素,也就是人为添加了边框,在这里 p=16。
在测试阶段,R-CNN 在每张图片上抽取近 2000 个候选区域。
然后将每个候选区域进行尺寸的修整变换,送进神经网络以读取特征,然后用 SVM 进行类别的识别,并产生分数。候选区域有 2000 个,所以很多会进行重叠。
针对每个类,通过计算 IoU 指标,采取非极大性抑制,以最高分的区域为基础,剔除掉那些重叠位置的区域。
在卷积神经网络中,第一层可以直接用来显示,而且肉眼可视,通常他们是为了捕捉物体边缘,及突出的颜色信息,但越往后的卷积层越抽象,这个时候进行可视化就是一个挑战了。
Zeiler 和 Fergus 提出了一种基于反卷积手段的可视化研究,但 R-CNN 的作者直接提供了一个没有参数的方法,简单直接。
思路是挑选一个特征出来,把它直接当成一个物体分类器,然后计算它们处理不同的候选区域时,activation 的值,这个值代表了特征对这块区域的响应情况,然后将 activation 作为分数排名,取前几位,然后显示这些候选区域,自然也可以清楚明白,这个 feature 大概是什么。
R-CNN 作者将 pool5 作为可视化对象,它的 feature map 是 6x6x255 的规格,可以理解为有 256 个小方块,每个方块对应一个特征。
下面的图表中显示了这以可视化的效果,这里只显示了 256 个特征中的 6 个,每个特征取 activation 值最高的 16 个区域。
[R-CNN2][base64str2]
AlexNet 有 7 层,那么那些层是关键指标呢?哪些层可有可无呢?
[R-CNN3][base64str3]
pool5 在上一小节已经讨论过了,那么 fc6 和 f7 就成了研究的对象。
fc6 与 pool5 构成全连接,为了计算 feature 它会乘以一个 4096x9216 的权重矩阵,然后在与一组 bias 相加,所以它有 3700 多万的参数。fc7 是最后一层,它的权重矩阵是 4096x409,它的参数有 1678 万多的参数。
但经过作者在 PASCAL 上不做 fine-tune 处理,直接测试,可以发现 fc7 的意义没有 fc6 大,甚至移除它之后,对于 mAP 结果指标没有影响。移除 fc7 就表示可以减少将近 1800 万个参数。
更惊喜的事情是,同时移除 fc6 和 fc7 并没有多大的损失,甚至结果还要好一点点。
所以,神经网络最神奇的力量来自卷积层,而不是全连接层。
上面说的是没有 fine-tune 的情况,那么在 fine-tune 的情况是什么呢?
结果证明,fine-tune 后 fc6 与 fc7 提升的效果明显。所以结论就是,pool5 从 ImageNet 训练集中学习了物体的泛化能力,而能力的提升则是通过特定领域的 fine-tune 。
举个例子,神经网络在 ImageNet 数据集中学习到了 100 种猫的特征,而我自己的数据集只有两种猫,经过 fine-tune 训练后,这个神经网络可以更准确识别这两种猫了。
R-CNN 还与其他的特征方法进行了能力比较,作者选取了两种基于 DPM 的方法,DPM ST 和 DPM HSC,结果都证明,R-CNN 要好于它们。
R-CNN整体流程如下:
流程注意点:
首先在fine-tuning阶段,IOU阈值为0.5,即大于0.5的都是目标,小于0.5的都是背景,而在SVM训练时,小于0.3的都是负样本,正样本为GT。
为什么要分开设置阈值呢?在fine-tuning期间,为了防止过拟合,阈值设置的宽松一点,就是就算有一半左右的物体与GT相交,那也是算是物体,而不是背景。在训练SVM的时候,则正样本只有GT,阈值大于0.3的忽略掉,小于0.3的算负样本(0.3也是通过实验挑选出来的)。之所以要重新训练SVM,也是因为在之前fine-tuning网络的时候设置的阈值较为宽松,所以softmax进行分类的性能其实并不是很理想。因此重新训练了一个SVM分类器,效果相比softmax更理想了。
创新点:
(1)采用高容量的CNN进行特征提取;
(2)采用大样本下有监督预训练+小样本微调的方式解决小样本难以训练甚至过拟合等问题。小样本数据训练很容易造成网络过拟合,但是在大样本训练后利用其参数初始化网络可以很好地训练小样本,这解决了小样本训练的难题。文中利用ILSVRC2012的训练集先进行有监督预训练,再利用PASCAL 2007进行微调。
缺点:
(1)训练过程是多级流水线。R-CNN首先使用目标候选框对卷积神经网络使用log损失进行微调。然后,它将卷积神经网络得到的特征送入SVM。 这些SVM作为目标检测器,替代通过微调学习的softmax分类器。 在第三个训练阶段,学习检测框回归。
(2)训练在时间和空间上的开销很大。对于SVM和检测框回归训练,从每个图像中的每个目标候选框提取特征,并写入磁盘。对于非常深的网络,如VGG16,这个过程在单个GPU上需要2.5天(VOC07 trainval上的5k个图像)。这些特征需要数百GB的存储空间。
(3)目标检测速度很慢。在测试时,对每个测试图像中的1000-2000个目标候选框各自提取特征。上千个 Region 存在大量的范围重叠,重复的特征提取带来巨大的计算浪费。
(4)针对传统 CNN 需要固定尺寸的输入图像,crop/warp(归一化)产生物体截断或拉伸,会导致输入 CNN 的信息丢失;
论文:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
发表时间:2015
发表作者:(微软研究院)Kaiming H
发表刊物/会议:ECCV
针对卷积神经网络重复运算问题,本文提出一种 SPP-Net 算法,通过在卷积层和全连接层之间加入空间金字塔池化结构(Spatial Pyramid Pooling代替 R-CNN 算法在输入卷积神经网络前对各个候选区域进行剪裁、缩放操作使其图像子块尺寸一致的做法。利用空间金字塔池化结构有效避免了 R-CNN 算法对图像区域剪裁、缩放操作导致的图像物体剪裁不全以及形状扭曲等问题,更重要的是解决了卷积神经网络对图像重复特征提取的问题,大大提高了产生候选框的速度,且节省了计算成本。但是和 R-CNN 算法一样训练数据的图像尺寸大小不一致,导致候选框的 ROI 感受野大,不能利用 BP 高效更新权重。
SPP-Net的改进如下:
ROI是Region of Interest的简写,指的是在“特征图上的框”。
在SPP Net和Fast RCNN中, ROIS是指Selective Search完成后得到的所有“候选框”在特征图上的映射;
在Faster RCNN中,候选框是经过RPN算法产生的,然后再把各个“候选框”映射到特征图上,得到ROIS。
根据输入的原始图像和Selective Search算法提供的1000-2000个候选框位置,产生整个原始图像得到的feature map上对应的框,也就是我们说的ROI(Region of Interest,即“特征图上的框”);
将映射后的区域划分为相同大小的块,块的数量是我们指定的;对每个块进行max pooling操作。
可以从不同大小的方框得到固定大小的相应的feature maps。输出的pooling结果的大小只和我们划分成多少块有关,而不取决于ROI和卷积feature maps的大小。
我们将Selective Search算法提供的1000-2000个候选框的位置记录下来,然后通过比例映射到整张图像的feature map上,每个候选框得到一个自己的候选区域的特征图B,然后将B同时送入上面的SPP层的4个ROI Pooling层;
SPP层(1×1, 2×2, 3×3, 6×6, totally 50 bins),得到112,800-d (256×50)个特征值;
[SPP1][base64str4]
对卷积层可视化发现:输入图片的某个位置的特征反应在特征图上也是在相同位置。基于这一事实,对某个ROI区域的特征提取只需要在特征图上的相应位置提取就可以了。
一张任意尺寸的图片,在最后的卷积层conv5可以得到特征图。根据Region proposal步骤可以得到很多候选区域,这个候选区域可以在特征图上找到相同位置对应的窗口,然后使用SPP,每个窗口都可以得到一个固定长度的输出。将这个输出输入到全连接层里面。这样,图片只需要经过一次CNN,候选区域特征直接从整张图片特征图上提取。在训练这个特征提取网络的时候,使用分类任务得到的网络,固定前面的卷积层,只微调后面的全连接层。
在检测的后面模块,仍然和R-CNN一样,使用SVM和边框回归。SVM的特征输入是FC层,边框回归特征使用SPP层。
在CNN中感受野(receptive fields)是指某一层输出结果中一个元素所对应的上一层的区域大小。
在卷积参数计算过程中,我们给出上一层/下一层/滤波器尺寸、步长和填充大小的关系:
令:
输入尺寸 W1×H1
卷积核 F×F
输出尺寸 W2×H2
步长 stride:S
填充大小 padding:P
关系式如下:
\[
W_2 = \frac{W_1-F+2P}{S}+1 \H_2 = \frac{H_1-F+2P}{S}+1
\]
这是上一层到下一层的推导,如果现在反过来,给你下一层的大小,问你上一层的感受野多大,该怎么计算?
我们把上面公式变个形式:
\[
W_1=(W_2-1)S-2P+F \H_1=(H_2-1)S-2P+F
\]
通常,我们需要知道网络里面任意两个feature map之间的坐标映射关系(一般是中心点之间的映射),计算公式:
[SPP2][base64str5]
作者主要展示了在VOC 2007数据集上SPP与RCNN的效果。
[SPP3][base64str6]
SPP Net是一个灵活的解决方案,可以处理不同的规模、大小和纵横比。这些问题在视觉识别中很重要,但在深度网络环境中却很少被考虑。本文提出了一种利用空间金字塔池层训练深度网络的方法。由此产生的SPP-net在分类/检测任务中显示出优异的精度,大大加快了基于dnn的检测速度。但SPP Net网络也有显著的缺点:
像RCNN一样,训练过程是一个多级流水线,涉及提取特征,使用log损失对网络进行微调,训练SVM分类器,最后拟合检测框回归。但是有一点要注意,就是SPP Net的优化算法无法更新SPP层之前的卷积层(这些卷积层用来提取整张图像的特征)。这种限制(固定的卷积层)影响了深层网络的精度。
论文:Fast R-CNN
发表时间:2015
发表作者:(Microsoft)Ross Girshick
发表刊物/会议:ICCV
本文提出一种改进的 Fast R-CNN 算法,借鉴 SPP-Net 算法结构,设计一种 ROI pooling 的池化层结构,有效解决 R-CNN 算法必须将图像区域剪裁、缩放到相同尺寸大小的操作。提出多任务损失函数思想,将分类损失和边框回归损失结合统一训练学习,并输出对应分类和边框坐标,不再需要额外的硬盘空间来存储中间层的特征,梯度能够通过 RoI Pooling 层直接传播。用SVD对Fast R-CNN网络末尾并行的全连接层进行分解,减少计算复杂度,加快检测速度。但是其仍然没有摆脱选择性搜索算法生成正负样本候选框的问题。
经典的R-CNN存在以下几个问题:
在Fast RCNN之前提出过SPPnet来解决R-CNN中重复卷积问题,但SPPnet仍然存在与R-CNN类似的缺陷:
因此,该文提出的Fast RCNN便是解决上述不足,在保证效果的同时提高效率。基于VGG16的Fast RCNN模型在训练速度上比R-CNN快大约9倍,比SPPnet快大约3倍;测试速度比R-CNN快大约213倍,比SPPnet快大约10倍,在VOC2012数据集上的mAP大约为66%。
Fast R-CNN输入是224×224224×224的固定大小图片;经过5个卷积层+2个降采样层(分别跟在第一和第二个卷积层后面)进入ROIPooling层(其输入是conv5层的输出和region proposal,region proposal个数大约为2000个);再经过两个output都为4096维的全连接层,分别经过output各为21和84维的全连接层(并列的,前者是分类输出,后者是回归输出);最后接上两个损失层(分类是softmax,回归是smoothL1)
Fast R-CNN模型的流程图如下:
[Fast R-CNN1][base64str7]
由于region proposal的尺度各不相同,而期望提取出来的特征向量维度相同,因此需要某种特殊的技术来做保证。ROIPooling的提出便是为了解决这一问题的。其思路如下:
训练过程中每个mini-batch包含2张图像和128个region proposal(即ROI,64个ROI/张),其中大约25%的ROI和ground truth的IOU值大于0.5(即正样本),且只通过随机水平翻转进行数据增强。
多损失融合(分类损失和回归损失融合),分类采用log loss(即对真实分类的概率取负log,分类输出K+1维),回归的loss和R-CNN基本一样。
总的损失函数如下:
\[
L(p,u,t^u,v)=L_{cls}(p,u)+\lambda [u\geqslant 1]L_{loc}(t^u,v)
\]
分类损失函数如下:
\[
L_{cls}(p,u)=-log\ p_u
\]
回归损失函数如下:
\[
L_{loc}(t^u,v)=\sum_{i\epsilon \{x,y,w,h\}}smooth_{L_1}(t_i^u-v_i)
\]
其中有:
\[
smooth_{L_1}(x)=\left\{\begin{matrix}0.5x^2\ \ \ \ \ \ if\ |x|< 1\\|x|-0.5\ \ otherwise\end{matrix}\right.
\]
由于卷积层计算针对的是一整张图片,而全连接层需要对每一个region proposal都作用一次,所以全连接层的计算占网络计算的将近一半。作者采用SVD来简化全连接层计算。
Fast R-CNN整体训练流程如下:
将整个图片与通过Selective Search筛选出的region proposals一同输入,经过卷积层、池化层产出feature map,计算出原图的proposal在feature map的映射,将相应的feature送到ROI pooling层,进行池化,产出固定长度的feature vector作为FC层(SVD分解实现)的输入最终分支成两个兄弟输出层:一个通过softmax产生K+1个分类的概率,另一个对于每个object 类别输出四个实数,代表一个较为精确的BBox position,最后进行NMS得到最终的结果。
训练整体架构总结如下:
[Fast R-CNN2][base64str8]
测试整体架构整体架构总结如下:
[Fast R-CNN3][base64str9]
Fast R-CNN相比其他算法表现更好,且注意到,VOC12由于数据集更大而使得模型效果提高很多。(这一角度也说明了数据对于当前深度学习的重要性不容忽视!)
[Fast R-CNN4][base64str10]
Fast R-CNN最主要的是解决了SPP-Net与R-CNN训练步骤复杂、冗余的缺点,首先它同样对整个图像只做一次卷积提取full-image feature map,其次它利用了ROI pooling layer(可以看做SPP的简化版) 进行固定送入FC层的feature尺寸,从而达到对任意尺寸的图像进行训练及测试,最后它将分类与回归同时进行,相当于多任务学习,他们共享前面网络的特征与计算,这样也不需要利用磁盘对特征进行存储。同时Fast R-CNN也对损失函数,FC层加速等做了优化。同时该文章还通过实验证明了深度网络具有较好的scale-invariance,即对scale并不是特别敏感。但region proposal的提取仍然采用selective search,整个检测流程时间大多消耗在这上面(生成region proposal大约2~3s,而特征提取+分类只需要0.32s),之后的Faster RCNN的改进之一便是此点。
论文:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
发表时间:2016
发表作者:(Microsoft)Shaoqing Ren, Kaiming He, Ross Girshick, and Jian Sun
发表刊物/会议:NIPS
论文链接:论文链接
论文代码:Matlab版本点击此处,Python版本点击此处
2015 年微软研究院的任少庆、何恺明以及 Ross B Girshick 等人又提出了 Faster R-CNN 算法。从R-CNN到Fast R-CNN,再到本文的Faster R-CNN,目标检测的四个基本步骤(候选区域生成,特征提取,分类,位置精修)终于被统一到一个深度网络框架之内。所有计算没有重复,完全在GPU中完成,大大提高了运行速度。
Faster R-CNN可以简单地看做“区域生成网络(RPN)+Fast RCNN“的系统,用区域生成网络代替Fast R-CNN中的Selective Search方法,网络结构如下图。本篇论文着重解决了这个系统中的三个问题:
[Faster RCNN1][base64str11]
步骤如下:
设计辅助生成样本的 RPN(Region Proposal Networks)网络,将算法结构分为两个部分,先由 RPN 网络判断候选框是否为目标,再经分类定位的多任务损失判断目标类型,整个网络流程都能共享卷积神经网络提取的的特征信息,节约计算成本,且解决 Fast R-CNN 算法生成正负样本候选框速度慢的问题,同时避免候选框提取过多导致算法准确率下降。
RPN网络基本设想是:在提取好的特征图上,对所有可能的候选框进行判别。由于后续还有位置精修步骤,所以候选框实际比较稀疏。
[Faster RCNN2][base64str12]
但是由于 RPN 网络可在固定尺寸的卷积特征图中生成多尺寸的候选框,导致出现可变目标尺寸和固定感受野不一致的现象。
Faster R-CNN的结构主要分为三大部分:
第一部分是共享的卷积层-backbone,第二部分是候选区域生成网络-RPN,第三部分是对候选区域进行分类的网络-classifier。
RPN与classifier部分均对目标框有修正。classifier部分就是Fast R-CNN结构。
Anchor:
Anchor实际上指的是预先设置好长宽比与面积的候选框。但是这种候选框产生的机制与Selective Search算法不一样。
在论文中,作者为每一个位置生成9种anchor,包含三种面积(128×128,256×256,512×512),每种面积又包含三种长宽比(1:1,1:2,2:1)。
RPN(Region Proposal Networks)网络,RPN网络实际分为2条线,上面一条通过softmax分类(分类指的是候选框中是不是有目标物体,而不是对其内部的具体类别进行分类)anchors获得foreground和background(检测目标是foreground),下面一条用于计算对于anchors的bounding box regression偏移量,以获得精确的proposal。而最后的Proposal层则负责综合foreground anchors和bounding box regression偏移量获取proposals,同时剔除太小和超出边界的proposals。其实整个网络到了Proposal Layer这里,就完成了相当于目标定位的功能。
anchors(三个大小,三种形状,with:height∈{1:1, 1:2, 2:1}),而这 9 个 anchors 的作用,就是用来遍历 Conv layers 获得的 feature map(将 anchor 中心点与滑窗中心点进行对其),为每一个点都配备anchors 作为初始的检测框。
此外,全部anchors拿去训练太多了,训练程序会在合适的anchors中随机选取128个postive anchors+128个negative anchors进行训练。训练RPN时,与VGG共有的层参数可以直接拷贝经ImageNet训练得到的模型中的参数,剩下没有的层参数用标准差=0.01的高斯分布初始化。
一句话总结:其实RPN最终就是在原图尺度上,设置了密密麻麻的候选Anchor。然后用cnn去判断哪些Anchor是里面有目标的foreground anchor,哪些是没目标的backgroud。所以,仅仅是个二分类而已!
缺点:由于RPN网络可在固定尺寸的卷积特征图中生成多尺寸的候选框,导致出现可变目标尺寸和固定感受野不一致的现象。
RPN最大的问题就是对小物体检测效果很差
参考:
RCNN
SPP Net
Fast R-CNN
Paper Reading:RCNN-SPP-Fast RCNN-Faster RCNN
标签:识别 position 背景 round 像素 cpm art cnn 结构
原文地址:https://www.cnblogs.com/hellojamest/p/11437523.html