当前,目标检测的方法主要有两类,一类被称为两阶段方法,一类被称为一阶段方法。两阶段方法和一阶段方法都是基于目标应位于某个矩形框内这样一个假设,区别在于两阶段方法多了一个框的筛选阶段(Region Proposal),一般来说,两阶段方法以复杂度为代价换取精度的提升。
两阶段的代表算法主要有R-CNN,Fast-RCNN,Faster-RCNN及Mask-RCNN,具体介绍见文章:目标检测介绍之--RCNN系列 。一阶段的开山之作为YOLO,几乎同一时期的SSD结合YOLO和Faster R-CNN的优点,取得了更好的精度和速度。本篇介绍YOLO和SSD的检测方法。
1. 分类与回归
在介绍YOLO和SSD之前,我们先看两个概念:分类和回归。
分类问题是指输出变量为有限个离散变量的预测问题,而回归问题是指输出变量均为连续变量的预测问题。由于卷积神经网络在图像分类的巨大成功,人们将目标检测问题转化为分类问题,如R-CNN系列(“候选框+分类”)。另一方面,也是因为目标检测问题难以直接应用回归方法去解决。
对于单个目标的检测问题,很容易将它看作一个回归问题,即预测目标所属类的分数和位置的量,如下图所示。
但是对于多个且不确定的目标检测,因为需要回归的变量个数不确定,这个方法变得不可行了。比如下图中鸭妈妈带了很多只小鸭子,具体数目并不是一目了然,或者说需要检测的目标个数预先并不知晓。
2016年,Joseph Redmon提出了YOLO模型,将检测问题看做回归问题,提出了端到端(end-to-end)的单一网络直接预测边界框和类概率,巧妙地运用回归方法解决检测问题。
2. YOLO
YOLO全称是You Only Look Once,顾名思义就是你只需看一眼就能知道是什么。所以作者希望所提出的算法可以达到这种简洁高效的检测水平。它最大的优点在于执行速度很快。
YOLO的思想大致如下:整张图作为网络的输入,把目标检测的问题转化成一个回归问题,直接输出目标边界框和类别概率。
前面说过,由于图像中目标个数的不确定性,目标检测问题难以转化为回归问题。那么,YOLO是怎么解决这个问题的呢?下面看一下它的解决思路。
首先,YOLO的具体操作过程如下:把一张图片划分为S*S个格子(图左),然后对每个格子预测B个边界框及这些边界框的可信度(图中上方)及C类的概率(图中下方),这些预测被编码成一个S*S*(B*5+C)的张量,其中的5对应 BOX(x, y, w,h) 与 P(object)的5个值。
当S=7,B=2,C=20时,输出维度为7*7*30(上图左)。每个1*1*30的维度对应原图7*7个cell中的一个(上图中的红框),1*1*30中含有类别预测(20类)和2个物体框(bbox)坐标及可信度预测。
可以看出,YOLO方法所确定的边界框个数是确定的(RCNN系列中不确定),这也决定了图像中目标个数的上限,在上面的假设中,7*7*2=98个。
前面提到,每个网格预测B个边界框。这些边界框里面有些框包含了物体,有些并没有包含物体,对没有包含物体的边界框进行回归是没有意义的。很多时候,边界框与物体的真值(ground truth)并不是完全重合或者没有任何交叠,而是有一部分相交。选择哪些边界框进行预测是非常重要的。在YOLO模型中,采取了这样的策略:如果一个物体的中心落在某一个网格中,则该网格负责预测这个物体。一个网格有B个边界框,则选择与真值具有最大交并比(IOU)的框来预测物体。这导致了边界框的专门化,它也使得在大小,宽长比,目标类别方面的预测更好,提高了整个网络的召回率。以上也回答了YOLO是如何将检测问题转化为回归问题的。
需要指出的是,R-CNN里面也用到了回归方法。不过,R-CNN是将回归方法用在最后检测出的边界框修正上,降低了定位的误差。
YOLO算法的损失函数由几部分组成:坐标损失(前2项),类别损失(第3,4项)及类别概率(第5项),并分配了不同的权重,这些回归参数均为连续量。
虽然YOLO在速度上获得了很大的提升,但精度却相对于R-CNN差了点。主要由于基于格子进行划分图片一定程度上限制了物体框的大小以及位置,并且预测框的数目也非常有限,对于密集型或者较小的目标,效果不如意。
在这张图中,YOLO检测器把上面的人识别成了飞机。
3. SSD
SSD全称Single Shot multi box Detector,借鉴了Faster R-CNN和YOLO两者的思想。既可以保证较快的速度,也可以有较高的精度。
上图是SSD的示意图,输入的是一张原始图片和对应的真值(蓝框和红框),通过卷积网络后,会得到不同大小的特征图(如b图8*8, c图4*4) ,这些特征图的每个位置都对应不同尺寸和形状的默认框(类似Faster R-CNN中的anchor box,这也是论文题目中 Multi box Detector的由来),每个默认框都包含框的形状偏移量(loc)及所属不同类别对应的值(conf)。在训练阶段,需要将这些默认框跟真值匹配,相匹配的框为正样本,其余的则为负样本。匹配的原则为选择最大的交并比及交并比大于0.5的框。如b图中有两个蓝框都满足条件,因此被当做正样本进行训练。
上图示意了在2层特征图上取默认框。实际中,论文采取了在更多层上选取默认框,如下图所示。下图是SSD模型的结构,并与YOLO做了对比。
在SSD中,算法模型应用了VGG16网络,输入300*300的图片,在conv5中得到38*38响应图,每个位置上的默认框个数K取值为4,进一步降采样后得到响应图大小分别为19*19、10*10以及5*5,这三个响应图k取值6,最后继续降低采样得到响应图分辨率分别为3*3、1*1,k取值4,那么每一个类别就可以得到8732(38*38*4+(19*19+10*10+5*5)*6+(3*3+1*1)*4=8732)个默认框。而在YOLO中,输入大小为448*448的图像,若格子大小为7*7,每个格子默认预测2个物体框,最后每个类别就是7*7*2一共98个物体框。SSD相比YOLO来说,输入的图片更小,但得到的默认物体框数量高出很多,并且在速度上也很接近。
下图是SSD的检测效果图。可以看出,检测效果还不错,但没有检测出玻璃花瓶。
4. 小结
YOLO算法是一个非常有创意的检测方法,它突破了“候选框+分类器”的统治框架。SSD算法采取在多个特征图上检测目标,借鉴了Faster-RCNN的锚框思想,在检测精度和速度上都有提升。
参考:
论文:You Only Look Once: Unified, Real-Time Object Detection
论文:SSD: Single Shot MultiBox Detector
斯坦福李飞飞的课程PPT http://cs231n.stanford.edu/syllabus.html 中Lecture 12: Detection and Segmentation