YOLO、SSD、FPN、Mask-RCNN检测模型对比
一.YOLO(you only look once)
YOLO 属于回归系列的目标检测方法,与滑窗和后续区域划分的检测方法不同,他把检测任务当做一个regression问题来处理,使用一个神经网络,直接从一整张图像来预测出bounding box 的坐标、box中包含物体的置信度和物体所属类别概率,可以实现端到端的检测性能优化
原理如下:
输入一张图片,图片中包含N个object,每个object包含4个坐标(x,y,w,h)和1个label。在网络最后面会生成一个7x7x30的三维矩阵,其中7x7对应到原图,就是将图片划分为7x7个grid cell,每个cell预测两个bounding box,30=5+5+20,第一个5代表预测的第一个bounding box的4个坐标和置信度,第二个5代表第二个bounding
box的4个坐标和置信度,最后的20代表PASCAL VOC数据集的20个分类。
预测的结果和groundtruth进行对比,每个object的groundtruth的中心对应到原图会落在某个grid cell里面,该object的检测由这个grid cell负责。预测的结果如果也落在该grid cell里,代表该grid cell有object(前提),分数(score)是预测bounding box与groundtruth的IoU值,若没有落在该grid cell中,代表没有object,分数(score)为0。最后会得到一个20x(7x7x2)=20x98的score矩阵,其中20行代表20个分类,98列代表的是整张图输出的所有bounding box,整个矩阵代表每个bounding box预测为这20个分类的分数。对于同一个类来说,有98个bounding box,这里用非极大值抑制法(NMS)进行候选框的筛选和合并。
每个grid cell负责:
1、预测两个bounding box
2、每个bounding box是否包含物体,置信度为0(无物体)或IoU(有物体)
3、每个bounding box所包含物体分别属于20个分类的概率
Inference: 输入一张图像,跑到网络的末端得到7x7x30的三维矩阵,这里虽然没有计算IOU,但是由训练好的权重已经直接计算出了bounding box的confidence。然后再跟预测的类别概率相乘就得到每个bounding box属于哪一类的概率。
YOLO缺点:
1、对小目标和密集型目标检测的效果差,如一群小鸭子(因为图片划分为7x7个grid cell,而每个cell只产生两个bounding box,意思就是每个grid cell的区域最多只会预测两个object)(是否可以用裁剪方法得到原图的局部放大图?每个grid cell预测多个bounding box?最后的卷积使用14x14x20?)
2、YOLO的物体检测精度低于其他state-of-the-art的物体检测系统。
3、YOLO容易产生物体的定位错误
YOLO优点:
1、YOLO检测物体非常快(45-155FPS)
2、YOLO可以很好的避免背景错误,产生false positives(可以看到全局图像,有上下文信息)
二.SSD(single shot mutibox detector)
SSD算法是一种直接预测bounding box的坐标和类别的object detection算法,没有生成proposal的过程。针对不同大小的物体检测,传统的做法是将图像转换成不同的大小,然后分别处理,最后将结果综合起来,而本文的ssd利用不同卷积层的feature map进行综合也能达到同样的效果。算法的主网络结构是VGG16,将两个全连接层改成卷积层再增加4个卷积层构造网络结构。对其中5个不同的卷积层的输出分别用两个3*3的卷积核进行卷积,一个输出分类用的confidence,每个default box生成21个confidence(这是针对VOC数据集包含20个object类别而言的);一个输出回归用的localization,每个default box生成4个坐标值(x,y,w,h)。另外这5个卷积层还经过priorBox层生成default box(生成的是坐标)。上面所述的5个卷积层中每一层的default box的数量是给定的。最后将前面三个计算结果分别合并然后传递给loss层。
算法的结果:对于300300的输入,SSD可以在VOC2007 test上有74.3%的mAP,速度是59 FPS(Nvidia Titan X),对于512512的输入, SSD可以有76.9%的mAP。相比之下Faster RCNN是73.2%的mAP和7FPS,YOLO是63.4%的mAP和45FPS。即便对于分辨率较低的输入也能取得较高的准确率。可见作者并非像传统的做法一样以牺牲准确率的方式来提高检测速度。作者认为自己的算法之所以在速度上有明显的提升,得益于去掉了bounding box proposal以及后续的pixel或feature的resampling步骤。
SSD也是使用回归的方法直接预测bounding box和分类,没有使用候选区域。
1、算法的主网络结构是VGG16,将两个全连接层改成卷积层再增加4个卷积层构造网络结构
2、对其中5个不同的卷积层的输出分别用两个3 *3的卷积核进行卷积,一个输出分类用的confidence,每个default
box生成21个confidence(这是针对VOC数据集包含20个object类别而言的);一个输出回归用的localization,每个default box生成4个坐标值(x,y,w,h)
3、每个feature map中default box的来源是由prior box通过计算产生的,包括default box的长宽比
上述5个feature map中每一层的default box的数量是给定的(5个层总和是8732个)。最后将前面三个计算结果分别合并然后传给loss层。
注意:
1、feature map cell 是指feature
map中每一个小格子,如图中分别有64和16个cell。default box是指在feature
map的每个小格(cell)上都有一系列固定大小的box,如图中每个cell包含4个default box(这部分和Faster-RCNN RPN中的锚点和画候选区域有点像,Faster-RCNN产生锚点和边框的地方是在最后一层卷积上,使用RPN产生的,而SSD则是在多个层次的feature
map上产生default box,然后把预测的坐标和分类结果进行拼接)。
2、假设每个feature map cell有k个default box,则每个default box都需要预测c个类别score和4个offset,如果一个feature map的大小是m×n,也就是有m * n个feature map cell,则该feature map就一共有(c+4)* k * m * n 个输出。这些输出个数的含义是:采用3×3的卷积核对该层的feature
map卷积时卷积核的个数,包含两部分(实际code是分别用不同数量的3 * 3卷积核对该层feature map进行卷积):数量c * k * m * n是confidence输出,表示每个default box的confidence,也就是类别的概率;数量4 * k * m * n是localization输出,表示每个default box回归后的坐标)。
3、最后对使用NMS算法对所有层产生的这些box区域进行筛选合并
SSD算法的核心:
1、对于每个feature map cell都使用多种横纵比的default boxes,所以算法对于不同横纵比的object的检测都有效
2、对default boxes的使用来自于多个层次的feature map,而不是单层,所以能提取到更多完整的信息
优点:
1、检测速度很快
2、检测准确率比faster-rcnn和yolo高
缺点:
文中作者提到该算法对于小的object的detection比大的object要差,还达不到Faster R-CNN的水准。作者认为原因在于这些小的object在网络的顶层所占的信息量太少,另外较低层级的特征非线性程度不够,所以增加输入图像的尺寸对于小的object的检测有帮助。另外增加数据集对于小的object的检测也有帮助,原因在于随机裁剪后的图像相当于“放大”原图像,所以这样的裁剪操作不仅增加了图像数量,也放大了图像。不过这样速度很慢。
三.对于小目标难检测问题的解决——FPN(CVPR2017)
Feature Pyramid Networks for Object Detection
论文链接:https://arxiv.org/pdf/1612.03144.pdf
低层的特征语义信息比较少,但是目标位置准确;高层的特征语义信息比较丰富,但是目标位置比较粗略。对图像feature的利用有以下四个方法:
1)输入网络前进行裁切,然后scale,缩放图像,这种方法会增加网络训练和预测的时间
2)类似于faster-rcnn和fast-rcnn,对卷积网络最后一层的feature map进行利用
3)类似于SSD,在网络中间,抽取一些卷积层产生的feature map进行利用
4)RPN
FPN类似于SSD+FCN+RPN,先自底向上进行正常的网络前向传播,每个阶段生成空间尺寸不断缩小的feature map,然后再从顶部的feature map(空间尺寸最小的那个)开始,进行2倍上采样,倒数第二层的feature map进行1x1卷积后(通道数匹配),两个feature map进行加和,然后再用3x3的卷积对新的feature map进行卷积融合,去除上采样加和的混叠。之后就按照这个思路不断上采样加和到前一个stage(前向传播中空间尺寸一致的当做一个stage),每一个stage生成的新feature map都独立进行预测。这里的预测可以是把生成的feature map送入RPN中,进行滑窗生成锚点和对应的bounding box,总共有15种不同的锚点。
四.Mask-RCNN(201703)
Mask-RCNN主要是基于Faster-RCNN,在RoI操作之后增加了一个分支,使用FCN进行语义分割操作,主要技术要点如下:
1、在RoI操作之后,除了接全连接的分类和边框回归之外,额外引出一个分支,用FCN进行语义分割,所以最终模型的loss来自于三个部分,分别是:分类loss、回归loss和分割loss
2、引入RoIAlign,替代原来的RoI
pooling,RoI pooling是在fast-rcnn里提出的,用于对大小不同的候选框进行resize之后送入后面的全连接层分类和回归,但RoI pooling计算时存在近似/量化,即对浮点结果的像素直接近似为整数,这对于分类来说影响不大(平移不变性),但新引入的Mask分割来说,影响很大,造成结果不准确,所以引入了RoI Align,对浮点的像素,使用其周围4个像素点进行双线性插值,得到该浮点像素的估计值,这样使结果更加准确。
五.几种检测模型性能对比