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这种预处理会使得物体要么残缺要么扭曲,很明显会影响识别精确度
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大小的输出特征
2014年,Ross Girshick使用候选区域+CNN代替传统目标检测使用的滑动窗口+手工设计特征,设计了R-CNN框架,使得目标检测取得了巨大突破,并开启了基于深度学习目标检测的热潮。在此,祭出RCNN的算法简要流程:
当使用Selective Search算法搜索候选框时,由于目标物体形态各异,大小不同,使得搜出的候选框矩形大小不同。如果要将这些矩形候选区域直接喂入CNN网络进行特征提取,是不可行的,因为CNN要求输入的图像的大小是固定的,所以要对候选框进行处理,使其大小符合CNN对输入图像的尺寸要求,RCNN中选择的是wrap,得到指定大小之后,提取并分类。
RCNN对原始图片通过Selective Search提取候选框多达2000个左右,而这2000个候选框中每个框又都需要进行CNN提取特征+SVM进行分类,计算量看着就不小呵,导致RCNN的检测速度很慢。 由于提取到2000个候选框都在一张图片中,所以为何不可对图像提一次卷积层特征,然后只需要将候选框在图像中的位置映射到卷积层的特征图上,这样我们就可以对一张图像提取一次特征,然后将每个候选框的卷积层特征输入到全连接层做后续操作。
上面想法很不错,但是由于每个候选框的尺寸不一样,而且全连接层的输入要求必须固定尺度,为了解决这个问题,空间金字塔池化SPP(Spatial Pyramid Pooling)应运而生。SPP厉害之处在于对任意尺寸的图片都能够得到固定长度的输出。
在RCNN中,因为得到的候选框大小各异,因此需要将每个候选框wrap成满足CNN要求的输入大小,而且crop/wrap这种处理,多多少少都会使得图片失真,限制了识别精度。很显然的是,CNN一般包含卷积层和全连接层,其中,卷积层连接层输入的是不需要固定尺寸大小的,而全连接层则需要固定大小的输入,那么就可以在卷积层和全连接层之间加入某种结构,使得卷积层的输出特征经过这种结构之后转换成固定长度的特征,这种结构就是SPP,下图是RCNN和SPP Net的检测流程比较:
可以从图5中看到,SPP是处于卷积层和全连接层之间,目的是要将卷积层生成的特征转换成满足全连接输入的固定长度,从而避免了将图片进行crop或者warp。
SPP Net的特点有两个,一是结合空间金字塔方法实现CNN的多尺度输入。 SPP Net在普通CNN结构中加入RoI池化层,使得网络的输入图像可以是任意尺寸的,输出则是一个固定维数的向量。二是对原图提取一次卷积特征,RCNN中是先提取候选区域,然后将候选区域resize统一大小后作为CNN的输入提取特征,这种做法很是繁琐,SPP Net简化了特征提取的步骤,只对原图进行一次卷积运算,就能够得到整张图的卷积特征图,然后在特征图上找到每个候选框的映射patch,将此patch作为每个候选框的卷积特征输入SPP layer和之后的层,完成特征提取。
对于不同的图像要想得到相同大小的池化结果,就需要根据图像的大小动态地计算池化层窗口的大小和步长,假设第五层卷积的特征图大小为a*a,需要得到n*n大小的池化结果,则池化层的滑动窗口的大小和步长分别为:(向上取整),(向下取整),如果金字塔有-level,那么就实行池化操作次,下一层的全连接层则连接这个输出作为输入。图6中,256是指的过滤器的数目,池化输出结果分别是4*4,2*2和1*1,假设的特征图大小为13*13,那么相对应的滑动窗口的大小和步长分别为:
假设的特征图大小为10*10,那么相应的滑动窗口的大小和步长分别为:
如上所述,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的简要流程为:
在Fast RCNN中,仍然使用Selective Search方法进行找出所有的候选框,这个也是很耗时的操作,所以能不能使用一个更高效的方法提取候选框呢。在Faster RCNN中,引进Region Proposal Networks(RPNs)替代Selective Search提取候选框,同时引入anchor box。
Faster RCNN中包含两个模块,一个是RPN候选框提取模块,一个是Fast RCNN检测模块。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)区域的物体得分和回归边界。
Anchors是一组大小固定的参考窗口:三种box areas三种aspect ratio,下图表示RPN网络中每个滑窗位置所对应的原图区域中9种可能的大小,相当于模板,对任意图像任意滑窗位置都是这9种模板。 根据图像大小计算滑窗中心点对应原图区域的中心点,通过中心点和size就可以得到滑窗位置和原图位置的映射关系,由此原图位置并根据Ground Truth重复率贴上正负标签,让RPN学习该Anchors是否有物体即可。对于每个滑窗位置,产生k=9个anchor对于一个大小为W*H的卷积特征图,总共产生W*H*k个anchor
YOLO算法的思想不同于上述RCNN系列的思想,它将目标算法看做一个回归问题。YOLO是一个end-to-end的网络,完成从原始图像的输入到物体位置和类别的输出。如下图所示,输入图片,经过一个卷积网络后,输出目标位置和其置信度,看似很简单的样子。YOLO的设计速度很快但是同时又能够保持较高的准确率。
YOLO算法是将输入图片划分为S*S的网格,如果有一个物体的中心是在一个grid cell中,那么这个cell就负责检测这个物体。每一个grid cell 预测B个bounding boxes及其它们的confidence score和C个类别条件概率。其中confidence score反映的是一个box包含物体的confidence和模型认为这个box预测正确的概率,定义confidence为,如果一个cell中没有包含任何物体,那么confidence score是为0。在测试阶段,让类别条件概率和box confidence相乘就能得到每一个box的class-specific confidence scores,,这些score则表明出现在box里的类别的概率和这个预测的box匹配这个物体的程度估量。
每一个bounding boxes包含五个值,x,y,w,h和confidence。其中(x,y)是指当前格子预测得到的物体的bounding box的中心位置的坐标。w和h表示box相对于整张图片的比例。最后,YOLO网络最后的输出维度为S*S*(B*5+C)。
虽然每个格子可以预测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个全连接层,网络的卷积层用来提取图像中的特征,全连接层用来预测目标输出概率和坐标。
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之后添加额外的网络结构,如下图所示:
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]. https://deepsense.ai/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