目标检测算法RCNN,Fast RCNN,Faster RCNN,YOLO和SSD

object detection,目标检测,就是在给定图片中精确找到物体所在位置,并标注出物体的类别。所以,object detection 要解决的问题就是物体在哪里以及是什么的整个流程问题。目前最常听到的目标检测算法就是RCNN系列(RCNN-->Fast RCNN-->Faster RCNN),YOLO和SSD,正好参加的比赛中需要用到目标检测知识,所以就趁此机会整理一下。

此篇博客的目的仅仅是记录一下这几种算法,通过这篇博客,也只能了解到这几种算法是怎样的,具体细节见论文,附有各种链接。

在介绍各算法之前,先科普一下一些基础知识:

交并比(IoU)和非极大值机制(NMS)

AlexNet,VGG网络,GoogleNet网络

fine-tuning(微调):在实践中,由于数据集不够大,很少有人能够从头开始训练数据,常见的做法是使用预训练的网络来重新fine-tuning,或者当作特征提取器。例如,使用卷积网络当作特征提取器,使用在ImageSet上预训练的网络,去掉最后的连接层,剩下的部分当作特征提取器,这样提取的特征叫做CNN codes,得到这样的特征后,使用线性分类器来分类图像。或者fine-tuning卷积网络,一般可以选择fine-tuning全部层或者部分层。通常,前面的层提取的是图像的通用特征,这些特征对很多任务都很有用,后面的层提取的特征与特定类别有关的特征,因此fine-tuning时常常只需要fine-tuning后面的层。与重新训练相比,fine-tuning要使用更小的学习率。因为训练好的网络模型权重已经平滑,我们不希望太快扭曲它们。

crop和warp: crop就是从一个大图中抠出网络输入大小的patch,比如AlexNet网络的输入大小227*227;wrap就是将一个边界框bounding box的内容resize成227*227,如下图所示,可以看到crop/warp这种预处理会使得物体要么残缺要么扭曲,很明显会影响识别精确度

图1:crop/warp图例展示

Region of interest(RoI) pooling layer: RoI被广泛地应用在目标检测中,它主要是将不规则大小的输入通过最大池化(max pooling)转换成固定大小的特征图,例如H*W。在fast RCNN中,每个RoI是卷积特征图中的一个矩形框,被定义成一个四元组(r,c,w,h),其中(r,c)表示矩形左上角的坐标,h和w则表示矩形的高度和宽度。RoI max pooling的工作流程为:首先dividing the h*w RoI window into an H*W grid of sub-windows of approximate size h/H * w/W,然后在每一个子window中取最大值并输出。例如下面的动图,对一个8*8的特征图,里面存在一个四元组表示为(0,3,5,7)的RoI(黑色实线圈起来的区域),要求输出为2*2大小,则把候选框拆分成2*2大小的网格,然后在每一个网格中取其最大值,最后得到2*2大小的输出特征

RCNN

2014年,Ross Girshick使用候选区域+CNN代替传统目标检测使用的滑动窗口+手工设计特征,设计了R-CNN框架,使得目标检测取得了巨大突破,并开启了基于深度学习目标检测的热潮。在此,祭出RCNN的算法简要流程:

  • 输入一张图像,利用Selective Search算法在图像中从下到上定位出大约2000左右包含物体的候选框(region proposals)
  • 将每个候选框缩放(wrap)至相同大小227*227,并输入到CNN(AlexNet)内进行特征提取,将CNN的fc7层的输出作为特征
  • 对候选框中提取出的特征,使用支持向量机SVM进行分类
  • 使用Bounding-box regression进行修正候选框位置:对于每一个类,训练一个线性回归模型去判定这个框是否完美
图3:RCNN架构总览

当使用Selective Search算法搜索候选框时,由于目标物体形态各异,大小不同,使得搜出的候选框矩形大小不同。如果要将这些矩形候选区域直接喂入CNN网络进行特征提取,是不可行的,因为CNN要求输入的图像的大小是固定的,所以要对候选框进行处理,使其大小符合CNN对输入图像的尺寸要求,RCNN中选择的是wrap,得到指定大小之后,提取并分类。

图4:RCNN流程图

RCNN对原始图片通过Selective Search提取候选框多达2000个左右,而这2000个候选框中每个框又都需要进行CNN提取特征+SVM进行分类,计算量看着就不小呵,导致RCNN的检测速度很慢。 由于提取到2000个候选框都在一张图片中,所以为何不可对图像提一次卷积层特征,然后只需要将候选框在图像中的位置映射到卷积层的特征图上,这样我们就可以对一张图像提取一次特征,然后将每个候选框的卷积层特征输入到全连接层做后续操作。

SPP

 上面想法很不错,但是由于每个候选框的尺寸不一样,而且全连接层的输入要求必须固定尺度,为了解决这个问题,空间金字塔池化SPP(Spatial Pyramid Pooling)应运而生。SPP厉害之处在于对任意尺寸的图片都能够得到固定长度的输出

在RCNN中,因为得到的候选框大小各异,因此需要将每个候选框wrap成满足CNN要求的输入大小,而且crop/wrap这种处理,多多少少都会使得图片失真,限制了识别精度。很显然的是,CNN一般包含卷积层和全连接层,其中,卷积层连接层输入的是不需要固定尺寸大小的,而全连接层则需要固定大小的输入,那么就可以在卷积层和全连接层之间加入某种结构,使得卷积层的输出特征经过这种结构之后转换成固定长度的特征,这种结构就是SPP,下图是RCNN和SPP Net的检测流程比较:

图5:普通CNN和SPP网络比较

可以从图5中看到,SPP是处于卷积层和全连接层之间,目的是要将卷积层生成的特征转换成满足全连接输入的固定长度,从而避免了将图片进行crop或者warp。

SPP Net的特点有两个,一是结合空间金字塔方法实现CNN的多尺度输入。 SPP Net在普通CNN结构中加入RoI池化层,使得网络的输入图像可以是任意尺寸的,输出则是一个固定维数的向量二是对原图提取一次卷积特征,RCNN中是先提取候选区域,然后将候选区域resize统一大小后作为CNN的输入提取特征,这种做法很是繁琐,SPP Net简化了特征提取的步骤,只对原图进行一次卷积运算,就能够得到整张图的卷积特征图,然后在特征图上找到每个候选框的映射patch,将此patch作为每个候选框的卷积特征输入SPP layer和之后的层,完成特征提取。

图6:SPP

对于不同的图像要想得到相同大小的池化结果,就需要根据图像的大小动态地计算池化层窗口的大小和步长,假设第五层卷积conv_{5}的特征图大小为a*a,需要得到n*n大小的池化结果,则池化层的滑动窗口的大小和步长分别为:win=ceil\left ( a/n \right )(向上取整),str=floor\left ( a/n \right )(向下取整),如果金字塔有l-level,那么就实行池化操作l次,下一层的全连接层则连接这l个输出作为输入。图6中,256是指conv_{5}的过滤器的数目,池化输出结果分别是4*4,2*2和1*1,假设conv_{5}的特征图大小为13*13,那么相对应的滑动窗口的大小和步长分别为:

                                                  \\ win_{4}=\left \lceil 13/4 \right \rceil =4 ; str_{4} = \left \lfloor 13/4 \right \rfloor = 3 \\ win_{2}=\left \lceil 13/2 \right \rceil =7 ; str_{2} = \left \lfloor 13/2 \right \rfloor =6 \\ win_{1}=\left \lceil 13/1 \right \rceil =13 ; str_{1} = \left \lfloor 13/1 \right \rfloor = 13

假设的特征图大小为10*10,那么相应的滑动窗口的大小和步conv_{5}长分别为:

                                                  \\ win_{4}=\left \lceil 10/4 \right \rceil =3 ; str_{4} = \left \lfloor 10/4 \right \rfloor = 2 \\ win_{2}=\left \lceil 10/2 \right \rceil =5 ; str_{2} = \left \lfloor 10/2 \right \rfloor = 5 \\ win_{1}=\left \lceil 10/1 \right \rceil =10 ; str_{1} = \left \lfloor 13/1 \right \rfloor = 10

Fast RCNN

如上所述,RCNN存在很多问题,一是训练过程是multi-stage pipeline(包括特征提取,fine-tuning网络,训练SVM分类器,以及最后的bounding-box回归),二是在空间和时间上耗费过大,三是检测速度过慢。虽然使用SPP可以使得任意尺寸的输入在经过SPP池化层后转换成固定尺寸的输出,使得不是每一个候选框都经过CNN提取特征后再用SVM进行分类,而是在整张图片经过卷积运算输出特征图,特征图经过SPP结构得到固定尺寸的大小,但是即使这样,SPP结构也像RCNN是multi-stage pipeline,而且除此之外,在fine-tuning步骤,并不能更新卷积层,这也会限制了检测精度。因此,Fast RCNN在RCNN的基础上采纳了SPP方法,对R_CNN进行改进,使得性能更好。 那么与R-CNN框架进行比较,Fast RCNN有哪些特点呢?一是fast RCNN在最后一个卷积层后加了ROI pooling layer,二是fast RCNN 损失函数使用了多任务损失函数,将边框回归(Bounding Box Regression)直接加入到CNN网络中训练,如下图所示:

图7:Fast RCNN

如图7所示,Fast RCNN的简要流程为:

  •  Fast RCNN以整张图片和一系列的object proposals作为输入,经过一个卷积网络输出卷积特征图
  • 接下来特征图中的候选框经过RoI池化层提取输出固定大小的特征向量
  • 然后得到的特征向量作为一系列全连接层的输入,在全连接层后接上两个输出层,一输出层是K个物体类加一个背景类的softmax概率,另一姊妹输出层是K个物体类的四元组

Faster RCNN

在Fast RCNN中,仍然使用Selective Search方法进行找出所有的候选框,这个也是很耗时的操作,所以能不能使用一个更高效的方法提取候选框呢。在Faster RCNN中,引进Region Proposal Networks(RPNs)替代Selective Search提取候选框,同时引入anchor box。

Faster RCNN中包含两个模块,一个是RPN候选框提取模块,一个是Fast RCNN检测模块。Faster RCNN的简要流程:

  • 将整张图片作为CNN的输入,提取image的特征图,该特征图被共享用于后续RPN层和全连接层
  • 卷积特征图作为RPN网络的输入,生成候选区域。
  • 以RPN提取的候选区域和卷积网络生成的特征图作为RoI池化层的输入,送到后续全连接层中进行判定目标
图8:Faster RCNN

RPN网络是以任意尺寸的图像作为输入,然后输出目标候选矩阵框及其得分。(A Region Proposal Network(RPN) takes an image (of any size) as input and outputs a set of rectangular object proposals, each with an objectness score)。RPN的核心思想是使用CNN卷积神经网络直接产生候选框。具体操作是在CNN卷积层后增加滑动窗口操作以及两个卷积层完成候选区域提取:第一个卷积层将特征图每个滑窗位置编码成一个特征向量,使用一个小网络在最后卷积层得到的特征图中进行滑动扫描,这个小网络以特征图的n*n窗口为输入,然后映射到一个低维向量(256-d for ZF和512-d for VGG,后随ReLU); 第二个卷积层对应两个全连接层-- a box regression layer(reg layer)和a box-classification layer(cls layer),对每个滑窗位置,输出k个候选区域的概率和候选框坐标信息。即在每个卷积映射位置输出这个位置上多种尺寸(3种)和长宽比(3种)的k个(3*3=9)区域的物体得分和回归边界。

图9:RPN

Anchors是一组大小固定的参考窗口:三种box areas\left \{ 128^{2}, 256^{2},512^{2} \right \}\times三种aspect ratio\left \{ 1:1, 1:2, 2:1 \right \},下图表示RPN网络中每个滑窗位置所对应的原图区域中9种可能的大小,相当于模板,对任意图像任意滑窗位置都是这9种模板。 根据图像大小计算滑窗中心点对应原图区域的中心点,通过中心点和size就可以得到滑窗位置和原图位置的映射关系,由此原图位置并根据Ground Truth重复率贴上正负标签,让RPN学习该Anchors是否有物体即可。对于每个滑窗位置,产生k=9个anchor对于一个大小为W*H的卷积特征图,总共产生W*H*k个anchor

图10:anchors

YOLO

YOLO算法的思想不同于上述RCNN系列的思想,它将目标算法看做一个回归问题。YOLO是一个end-to-end的网络,完成从原始图像的输入到物体位置和类别的输出。如下图所示,输入图片,经过一个卷积网络后,输出目标位置和其置信度,看似很简单的样子。YOLO的设计速度很快但是同时又能够保持较高的准确率。

图11:YOLO

 YOLO算法是将输入图片划分为S*S的网格,如果有一个物体的中心是在一个grid cell中,那么这个cell就负责检测这个物体。每一个grid cell 预测B个bounding boxes及其它们的confidence score和C个类别条件概率Pr\left ( Class_{i}|Object \right )。其中confidence score反映的是一个box包含物体的confidence和模型认为这个box预测正确的概率,定义confidence为Pr\left ( Object \right )*IOU_{pred}^{truth},如果一个cell中没有包含任何物体,那么confidence score是为0。在测试阶段,让类别条件概率和box confidence相乘就能得到每一个box的class-specific confidence scores,Pr\left ( Class_{i}|Object \right ) * Pr\left ( Object \right ) * IOU_{pred}^{truth} = Pr\left ( Class_{i} \right ) * IOU_{pred}^{truth},这些score则表明出现在box里的类别的概率和这个预测的box匹配这个物体的程度估量。

每一个bounding boxes包含五个值,x,y,w,h和confidence。其中(x,y)是指当前格子预测得到的物体的bounding box的中心位置的坐标。w和h表示box相对于整张图片的比例。最后,YOLO网络最后的输出维度为S*S*(B*5+C)。

图12:grid Model

 虽然每个格子可以预测B个bounding box,但是训练的时候,我们仅仅只想要每类物体的一个bounding box,所以就选择与ground truth的IOU值最高的bounding box作为物体检测输出,即每个格子最多只能预测一个物体,所以就使得如果格子中包含多个物体时,只能检测出来一个。 这也是YOLO的一个缺点。

YOLO使用均方和误差作为损失函数,即使用网络的输出的S*S*(B*5+C)维向量与真实图像的对应的S*S*(B*5+C)维向量的均方和误差。损失函数定义如下:包括五部分,前两部分是坐标误差,中间两部分是IOU误差,最后一部分是分类误差

在这个损失函数中,只有当某个grid cell中有object时才对classification error进行惩罚,它也只有当对某个box predictor对某个ground truth box负责时,才会对box的coordinate error进行惩罚,而对哪个ground truth box负责则就看起预测值和ground truth box的IoU值是否在那个cell中的所有box中最大。

 YOLO的网络架构是基于GoogleNet进行改进的,但是却没有借鉴GoogleNet网络中的Inception结构,而是使用1*1卷积层+3*3卷积层,网络总共包括24个卷积层和2个全连接层,网络的卷积层用来提取图像中的特征,全连接层用来预测目标输出概率和坐标。

图13:YOLO网络架构

SSD

Faster RCNN拥有较高的准确率,YOLO速度较快,而SSD算法的运行速度要比YOLO要快,同时准确率却能和Faster RCNN相媲美。SSD算法的核心是在特征图上使用小卷积核来预测固定尺寸default bounding boxes的类别分数和偏移量;为了提高准确率,SSD在不同大小的特征图上进行预测,通过纵横比分开预测。这些改进设计,实现了end-to-end训练并且保证较高的准确率,即是在低分辨率的图片上也能够保持高精度,further imporving the speed vs accuracy trade-off。

SSD基于前馈卷积网络,对于boxes里面的目标物体实例,产生一个固定尺寸的bounding boxes的集合和分数,紧接着跟随一个非极大值抑制NMS去做最后的检测。前期的网络是一个由高质量图片分类的标准网络,被称为base  network。在base network之后添加额外的网络结构,如下图所示:

  • Multi-scale feature maps for detection:在base network后增加卷积层,这些卷积层按照大小递减的次序连接,能够进行多尺寸预测
  • Convolutional predictiors for detection: 在每一个添加的卷积层(或者在base network中已经存在的卷积层),可以使用一系列的卷积核产生一系列固定大小的detection predictions。对于一个大小为m*n,具有p个通道的特征层,使用3*3*p大小的小kernel,要么生成一个类别的score,要么是相对于default box坐标的shape offsets。
  • Default boxes and aspect ratios: 每一个box相对于与其对应的feature map cell的位置是固定的。在每一个feature map cell中, 我们预测box与cell中default box之间的offset,以及每一个box中包含物体的score。因此,对于一个位置上的k个boxes中的每一个box,预测C个类别得分score,以及相对于default bounding box的4个偏移量,这样就需要(c+4)*k个filters,在m*n的特征图上将产生(c+4)*k*m*n个输出结果。
图14:SSD

feature map cell 就是将feature map划分成8*8或者4*4大小的格子,如下图(b)中的8*8和(c)中的4*4。default box类似于faster RCNN中anchors,是每一个格子上一些列固定大小的box,如下图中虚框所示,对每一个默认的方框,预测形状的偏移和所有物体分类的置信度。

至此,已经能大略知道各个算法基本思想,下图是对各个算法的简要总结。

参考文献:

[1]. Rich feature hierarchies for accurate object detection and semantic segmentation tech report (R-CNN)

[2]. Fast R-CNN (Fast R-CNN)

[3]. Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks (Faster R-CNN)

[4]. You Only Look Once: Unified, Real-Time Object Detection (YOLO)

[5]. SSD: Single Shot MultiBox Detector (SSD)

[6]. 一文读懂目标检测:R-CNN,Fast R-CNN,Faster R-CNN,YOLO,SSD

[7]. RCNN,Fast RCNN, Faster RCNN总结

[8]. Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition(SPP)

[9]. Region of interest pooling explained (RoI)

[10]. Faster R-CNN论文笔记-FR

[11]. 论文阅读笔记:You Only Look Once:Unified,Real-Time Object Detection

[12]. 论文阅读:SSD:Single Shot MultiBox Detector

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

马鹤宁

谢谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值