http://blog.sina.com.cn/u/5438469990

目标检测框架网络模型分析(二 双塔奇兵)

 

 前言

  我很长一段时间一直都在做自动驾驶的物体检测性能调优,所以想总结整理一些小网络和检测框架的经验。

  文章会分成三个部分:

  第一部分将参照知乎@YaqiLYU 对小网络(经典网络)的分析并且结合的自己的理解。

  第二部分详细介绍目前state-of-art的主流检测框架。

       第三部分介绍了目标检测的问题及解决方案,目标检测在其他领域的拓展应用 

 

目标检测(Object Detection)是计算机视觉领域的基本任务之一,学术界已有将近二十年的研究历史。近些年随着深度学习技术的火热发展,目标检测算法也从基于手工特征的传统算法转向了基于深度神经网络的检测技术。从最初2013年提出的R-CNN、OverFeat,到后面的Fast/Faster R-CNN,SSD,YOLO系列,再到2018年最近的Pelee。短短不到五年时间,基于深度学习的目标检测技术,在网络结构上,从two stage到one stage,从bottom-up only到Top-Down,从single scale network到feature pyramid network,从面向PC端到面向手机端,都涌现出许多好的算法技术,这些算法在开放目标检测数据集上的检测效果和性能都很出色。

本篇综述的出发点一方面是希望给检测方向的入门研究人员提供一个技术概览,帮助大家快速了解目标检测技术上下文;另一方面是给工业界应用人员提供一些参考,通过本篇综述,读者可以根据实际业务场景,找到合适的目标检测方法,在此基础上改进、优化甚至是进一步创新,解决实际业务问题。

本文对其中的26篇论文进行介绍,这26篇论文涵盖了2013以来,除SSD,YOLO和R-CNN系列之外的,所有引用率相对较高或是笔者认为具有实际应用价值的论文。R-CNN系列,SSD和YOLO相关的论文详解资源已经非常多,所以本文不再赘述。下图对这些方法进行了分类概括。

一、 背景

 

  

 

  物体检测的任务是找出图像或视频中的感兴趣物体,同时检测出它们的位置和大小,是机器视觉领域的核心问题之一。

  物体检测过程中有很多不确定因素,如图像中物体数量不确定,物体有不同的外观、形状、姿态,加之物体成像时会有光照、遮挡等因素的干扰,导致检测算法有一定的难度。进入深度学习时代以来,物体检测发展主要集中在两个方向:two stage算法如R-CNN系列和one stage算法如YOLO、SSD等。两者的主要区别在于two stage算法需要先生成proposal(一个有可能包含待检物体的预选框),然后进行细粒度的物体检测。而one stage算法会直接在网络中提取特征来预测物体分类和位置。

  

  

本篇综述将主要分为三个部分:

1. Two/One stage算法改进。这部分将主要总结在two/one stage经典网络上改进的系列论文,包括Faster R-CNN、YOLO、SSD等经典论文的升级版本。

2. 解决方案。这部分论文对物体检测中遇到的各类问题进行了分析并提出了解决方案。

3. 扩展应用、综述。这部分将就特殊物体检测和检测算法在其他领域的应用等方面进行介绍。

本综述分三部分,本文介绍第一部分。

1.1.1 R-FCN: Object Detection via Region-based Fully Convolutional Networks

论文链接:

https://arxiv.org/abs/1605.06409

开源代码:

https://github.com/daijifeng001/R-FCN

录用信息:CVPR2017

论文目标:

对预测特征图引入位置敏感分数图提增强征位置信息,提高检测精度。

核心思想:

一. 背景

Faster R-CNN是首个利用CNN来完成proposals的预测的,之后的很多目标检测网络都是借助了Faster R-CNN的思想。而Faster R-CNN系列的网络都可以分成2个部分:

1.Fully Convolutional subnetwork before RoI Layer

2.RoI-wise subnetwork

第1部分就是直接用普通分类网络的卷积层来提取共享特征,后接一个RoI Pooling Layer在第1部分的最后一张特征图上进行提取针对各个RoIs的特征图,最后将所有RoIs的特征图都交由第2部分来处理(分类和回归)。第二部分通常由全连接层组层,最后接2个并行的loss函数:Softmax和smoothL1,分别用来对每一个RoI进行分类和回归。由此得到每个RoI的类别和回归结果。其中第1部分的基础分类网络计算是所有RoIs共享的,只需要进行一次前向计算即可得到所有RoIs所对应的特征图。

第2部分的RoI-wise subnetwork不是所有RoIs共享的,这一部分的作用就是给每个RoI进行分类和回归。在模型进行预测时基础网络不能有效感知位置信息,因为常见的CNN结构是根据分类任务进行设计的,并没有针对性的保留图片中物体的位置信息。而第2部分的全连阶层更是一种对于位置信息非常不友好的网络结构。由于检测任务中物体的位置信息是一个很重要的特征,R-FCN通过提出的位置敏感分数图(position sensitive score maps)来增强网络对于位置信息的表达能力,提高检测效果。

二. 网络设计

2.1position-sensitive score map

  

 

  

 上图展示的是R-FCN的网络结构图,展示了位置敏感得分图(position-sensitive score map)的主要设计思想。如果一个RoI含有一个类别c的物体,则将该RoI划分为k x k个区域,分别表示该物体的各个相应部位。其每个相应的部位都由特定的特征图对其进行特征提取。R-FCN在共享卷积层的最后再接上一层卷积层,而该卷积层就是位置敏感得分图position-sensitive score map。其通道数channels=k x k x (C+1)。C表示物体类别种数再加上1个背景类别,每个类别都有k x k 个score maps分别对应每个类别的不同位置。每个通道分别负责某一类的特定位置的特征提取工作。

2.2 Position-sensitive RoI pooling

位置敏感RoI池化操作了(Position-sensitive RoI pooling)如下图所示:

 

该操作将每个RoIs分为k x k 个小块。之后提取其不同位置的小块相应特征图上的特征执行池化操作,下图展示了池化操作的计算方式。

得到池化后的特征后,每个RoIs的特征都包含每个类别各个位置上的特征信息。对于每个单独类别来讲,将不同位置的特征信息相加即可得到特征图对于该类别的响应,后面即可对该特征进行相应的分类。

 

 

2.3 position-sensitive regression

在位置框回归阶段仿照分类的思路,将特征通道数组合为4 x k x k 的形式,其中每个小块的位置都对应了相应的通道对其进行位置回归的特征提取。最后将不同小块位置的四个回归值融合之后即可得到位置回归的响应,进行后续的位置回归工作。

三. 网络训练

3.1 position-sensitive score map高响应值区域

在训练的过程中,当RoIs包涵物体属于某类别时,损失函数即会使得该RoIs不同区域块所对应的响应通道相应位置的特征响应尽可能的大,下图展示了这一过程,可以明显的看出不同位置的特征图都只对目标相应位置的区域有明显的响应,其特征提取能力是对位置敏感的。

 

 

 

3.2 训练和测试过程

使用如上的损失函数,对于任意一个RoI,计算它的Softmax损失,和当其不属于背景时的回归损失。因为每个RoI都被指定属于某一个GT box或者属于背景,即先让GT box选择与其IoU最大的那个RoI,再对剩余RoI选择与GT box的IoU>0.5的进行匹配,而剩下的RoI全部为背景类别。

 当RoI有了label后loss就可以计算出来。这里唯一不同的就是为了减少计算量,作者将所有RoIs的loss值都计算出来后,对其进行排序,并只对最大的128个损失值对应的RoIs进行反向传播操作,其它的则忽略。

并且训练策略也是采用的Faster R-CNN中的4-step alternating training进行训练。在测试的时候,为了减少RoIs的数量,作者在RPN提取阶段就将RPN提取的大约2W个proposals进行过滤:

1.去除超过图像边界的proposals

2.使用基于类别概率且阈值IoU=0.3的NMS过滤

3.按照类别概率选择top-N个proposals

在测试的时候,一般只剩下300个RoIs。并且在R-FCN的输出300个预测框之后,仍然要对其使用NMS去除冗余的预测框。

算法效果:

 

上图比较了Faster-R-CNN 和R-FCN的mAP值和监测速度,采用的基础网络为ResNet-101,测评显卡为Tesla K40。

1.1.2 R-FCN-3000 at 30fps: Decoupling Detection and Classification

论文链接:

https://arxiv.org/pdf/1712.01802.pdf

开源代码:无

录用信息:无

论文目标:

与YOLO9000(本论述后文会具体介绍YOLO9000)类似,本文的目标也是面向实际应用场景的大规模类别物体的实时检测。YOLO9000将检测数据集和分类数据集合并训练检测模型,但r-fcn-3000仅采用具有辅助候选框信息的ImageNet数据集训练检测分类器。

如果使用包含标注辅助信息(候选框)的大规模分类数据集,如ImageNet数据集,进行物体检测模型训练,然后将其应用于实际场景时,检测效果会是怎样呢?how would an object detector perform on "detection"datasets if it were trained on classification datasets with bounding-box supervision?

核心思想:

r-fcn-3000是对r-fcn的改进。上文提到,r-fcn的ps卷积核是per class的,假设有C个物体类别,有K*K个ps核,那么ps卷积层输出K*K*C个通道,导致检测的运算复杂度很高,尤其当要检测的目标物体类别数较大时,检测速度会很慢,难以满足实际应用需求。

为解决以上速度问题,r-fcn-3000提出,将ps卷积核作用在超类上,每个超类包含多个物体类别,假设超类个数为SC,那么ps卷积层输出K*K*SC个通道。由于SC远远小于C,因此可大大降低运算复杂度。特别地,论文提出,当只使用一个超类时,检测效果依然不错。算法网络结构如下:

上图可以看出,与r-fcn类似,r-fcn-3000也使用RPN网络生成候选框(上图中虚线回路);相比r-fcn, r-fcn-3000的网络结构做了如下改进:

1. r-fcn-3000包含超类(上图中上半部分)和具体类(上图中下半部分)两个卷积分支。

2. 超类卷积分支用于检测超类物体,包含分类(超类检测)和回归(候选框位置改进)两个子分支;注意上图中没有画出用于候选框位置改进的bounding-box回归子分支;回归分支是类别无关的,即只确定是否是物体。

3. 具体类卷积分支用于分类物体的具体类别概率,包含两个普通CNN卷积层。

4. 最终的物体检测输出概率由超类卷积分支得到的超类类概率分别乘以具体类卷积分支输出的具体类别概率得到。引入超类和具体类两个卷积分支实现了‘物体检测’和‘物体分类’的解耦合。超类卷积分支使得网络可以检测出物体是否存在,由于使用了超类,而不是真实物体类别,大大降低了运算操作数。保证了检测速度;具体类分支不检测物体位置,只分类具体物体类别。

超类生成方式:对某个类别j的所有样本图像,提取ResNet-101最后一层2018维特征向量,对所有特征项向量求均值,作为该类别的特征表示。得到所有类别的特征表示进行K-means聚类,确定超类。

算法效果:

在imagenet数据集上,检测mAP值达到了34.9%。使用nvidia p6000 GPU,对于375x500图像,检测速度可以达到每秒30张。在这种速度下,r-fcn-3000号称它的检测准确率高于YOLO 18%。

此外,论文实验表明,r-fcn-3000进行物体检测时具有较强的通用性,当使用足够多的类别进行训练时,对未知类别的物体检测时,仍能检测出该物体位置。如下图:

 

在训练类别将近3000时,不使用目标物体进行训练达到的通用预测mAP为30.7%,只比使用目标物体进行训练达到的mAP值低0.3%。

1.1.3 Mask R-CNN

论文链接:

https://arxiv.org/abs/1703.06870

开源代码:

https://github.com/TuSimple/mx-maskrcnn

录用信息:CVPR2017

论文目标

1. 解决RoIPooling在Pooling过程中对RoI区域产生形变,且位置信息提取不精确的问题。

2. 通过改进Faster R-CNN结构完成分割任务。

核心思想:

1. 使用RoIAlign代替RoIPooling,得到更好的定位效果。

2. 在Faster R-CNN基础上加上mask分支,增加相应loss,完成像素级分割任务。

一、概述

Mask R-CNN是基于Faster R-CNN的基础上演进改良而来,不同于Faster R-CNN,Mask R-CNN可以精确到像素级输出,完成分割任务。此外他们的输出也有所不同。Faster R-CNN输出为种类标签和box坐标,而Mask R-CNN则会增加一个输出,即物体掩膜(object mask)。

二、网络结构介绍

Mask R-CNN结构如下图:

Mask R-CNN采用和Faster R-CNN相同的两个阶段,具有相同的第一层(即RPN),第二阶段,除了预测种类和bbox回归,并且并行的对每个RoI预测了对应的二值掩膜(binary mask)。

三、Mask R-CNN详细改进

1. RoIAlign

也就是扣取特征图的过程。最原始的RoIPooling比较暴力。如左图所示,中间较小的红色虚线框是MegDet给出的ROI,由于浮点数的影响,这个框并不能完全对齐到绿色的特征图格点上。现有的计算逻辑是把红色的虚线框拉伸到外围红色虚线框,然后计算框中部分特征格点。最近,Mask-RCNN的提出将这个“硬”过程软化成了插值流程,即计算格点附近四个点的平均结果。 

Faster R-CNN采用的RoIPooling,这样的操作可能导致feature map在原图的对应位置与真实位置有所偏差。如下图:

[From Face++]

RoIPooling会对区域进行拉伸,导致区域形变。RoIAlign可以避免形变问题。具体方式是先通过双线性插值到14 x 14,其次进行双线性插值得到蓝点的值,最后再通过max Pooling或average pool到7 x 7。

 

2.多任务损失函数

Mask R-CNN的损失函数可表示为:

 

掩膜分支针对每个RoI产生一个K x M xM的输出,即K个M x M的二值的掩膜输出。其中K为分类物体的类别数目。依据预测类别输出,只输出该类对应的二值掩膜,掩膜分支的损失计算如下示意图:

 

1. mask branch 预测K个种类的M x M二值掩膜输出。

2. 依据种类预测分支(Faster R-CNN部分)预测结果:当前RoI的物体种类为i。

3.RoI的平均二值交叉损失熵(对每个像素点应用Sigmoid函数)即为损失Lmask。

此外作者发现使用Sigmoid优于Softmax ,Sigmoid可以避免类间竞争。

 

体现了在COCO数据集上的表现效果。

1.2 One stage

提到one stage算法就必须提到OverFeat,OverFeat网络将分类、定位、检测功能融合在一个网络之中。随后的YOLO和SSD网络,都是很经典的one stage检测算法。

YOLO论文作者对原始YOLO网络进行了改进,提出了YOLO9000和YOLOv3。YOLO9000号称可以做到更好,更快,更强。其创新点还包括用小规模(指类别)检测标注数据集 + 大规模分类标注数据集训练通用物体检测模型。YOLOv3是作者的一个technical report,主要的工作展示作者在YOLO9000上的改进。另外本综述还将介绍新论文Object detection at 200 Frames Per Second,这篇论文在YOLO的基础上进行创新,能在不牺牲太多准确率的情况下达到200FPS(使用GTX1080)。

SSD算法是一种直接预测bounding box的坐标和类别的object detection算法,利用不同分辨率卷积层的feature map,可以针对不同scale的物体进行检测。本篇综述中主要介绍DSSD(原始作者的改进版本)和DSOD这两篇论文。

1.2.1 YOLO9000: better, faster, stronger

论文链接:

https://arxiv.org/pdf/1612.08242.pdf

开源代码:

https://github.com/pjreddie/darknet

https://github.com/zhreshold/mxnet-YOLO MXNet实现

录用信息:CVPR2017

论文目标:

论文目标是要解决包含大规模物体类别的实际应用场景中的实时目标检测。实际应用场景中,目标检测应满足两个条件:1. 检测速度满足实际场景需求 2. 覆盖物体类别满足实际场景需求。实际场景包含很多类别的物体,而这些类别物体的标注数据很难拿到,本论文提出使用小规模(指类别)检测标注数据集 + 大规模分类标注数据集训练通用物体检测模型。

YOLO9000是在YOLO基础上的改进,相比YOLO,YOLO9000号称可以做到更好,更快,更强。下面从这三个方面介绍YOLO9000如何做到这三点。

YOLO相关的论文解读可以参考:https://zhuanlan.zhihu.com/p/25236464

一、更好

准确率提升。相比R-CNN系列,YOLOv1的召回率和物体位置检测率较低,YOLO9000做了如下七点改进对其进行提升。

1.加入BN层。在所有的卷积层后加入BN操作,去掉所有dropout层。

2.使用高分辨率训练得到的分类模型pretrain检测网络。YOLOv1使用224x224训练得到的分类模型pretrain,而YOLO9000直接使用448x448训练得到的分类模型pretrain检测网络。

3.使用卷积层预测anchor box位置。YOLOv1基于输入图像的物理空间划分成7x7的网格空间,每个网格最多对应两个候选预测框,因此每张图像最多有98个bounding box,最后接入全连接层预测物体框位置。而YOLO9000移除全连接层,使用anchor box预测候选框位置,大大增加了每张图片的候选框个数。这个改进将召回率由81%提高到88%,mAP由69.5%稍微降低到69.2%。同时,由于去掉了全连接层,YOLO9000可以支持检测时不同分辨率的图像输入。

4.kmeans聚类确定候选框形状。使用k-means对训练数据集中的物体框的分辨率和比例进行聚类,确定anchor box的形状。为避免物体大小引起的统计误差,YOLO9000使用IoU而不是欧氏距离来作为距离度量方式。

Dimension clusters

之前Anchor Box的尺寸是手动选择的,所以尺寸还有优化的余地。 为了优化,在训练集(training set)Bounding Boxes上跑了一下k-means聚类,来找到一个比较好的值。 
如果我们用标准的欧式距离的k-means,尺寸大的框比小框产生更多的错误。因为我们的目的是提高IOU分数,这依赖于Box的大小,所以距离度量的使用: 
这里写图片描述

通过分析实验结果(Figure 2),左图:在model复杂性与high recall之间权衡之后,选择聚类分类数K=5。右图:是聚类的中心,大多数是高瘦的Box。 
Table1是说明用K-means选择Anchor Boxes时,当Cluster IOU选择值为5时,AVG IOU的值是61,这个值要比不用聚类的方法的60.9要高。选择值为9的时候,AVG IOU更有显著提高。总之就是说明用聚类的方法是有效果的。

5.预测‘候选框相对于图像的内部偏移’。以往RPN网络,通过回归候选框相对于当前anchor box的偏移来定位候选框的位置,由于偏移相对于anchor box外部,所以取值范围是不受限的,导致训练的时候难以收敛。因此YOLO9000采用与YOLO类似的方式,预测候选框相对于图像左上角的位置偏移,并将偏移量归一化到0-1区间,解决了训练难收敛问题。

用Anchor Box的方法,会让model变得不稳定,尤其是在最开始的几次迭代的时候。大多数不稳定因素产生自预测Box的(x,y)位置的时候。按照之前YOLO的方法,网络不会预测偏移量,而是根据YOLO中的网格单元的位置来预测坐标,这就让Ground Truth的值介于0到1之间。而为了让网络的结果能落在这一范围内,网络使用一个 Logistic Activation来对于网络预测结果进行限制,让结果介于0到1之间。 网络在每一个网格单元中预测出5个Bounding Boxes,每个Bounding Boxes有五个坐标值tx,ty,tw,th,t0,他们的关系见下图(Figure3)。假设一个网格单元对于图片左上角的偏移量是cx,cy,Bounding Boxes Prior的宽度和高度是pw,ph,那么预测的结果见下图右面的公式: 

 

6.使用更精细的特征。YOLOv1提取13x13的特征层进行后续物体检测,对于小物体的检测效果并不友好。为解决这个问题,YOLO9000将前一层26x26的特征与13x13层的特征进行通道concatenation。如26x26x512的feature map被拆分成13x13x2048,然后同后面的13x13特征层进行concatenation。mAP提升1%。

7.多尺度图像训练。YOLO9000采用不同分辨率的图像进行模型迭代训练,增强模型对多尺度图像的预测鲁棒性。

二、更快

YOLOv1的basenet基于GoogleNet改进得到,计算复杂度大概是VGG16的1/4,但在imagenet上224x224图像的top-5分类准确率比vgg16低2%。YOLO9000提出一个全新的basenet,号称darknet-19,包含19个卷积层和5个max pooling层,详细网络结构见论文,计算复杂度比YOLOv1进一步减少了34%,imagenet上top-5准确率提升了3.2%。

三、更强

更强是指,在满足实时性需求的前提下,能检测出的物体类别数更多,范围更大。YOLO9000提出使用词树’wordtree’,将分类数据集和检测数据集合并,进行模型训练。反向传播时,检测样本的训练loss用于计算和更新整个网络的模型参数;而分类样本的训练loss仅用于更新与分类相关的网络层模型参数。这样以来,检测数据集训练网络学到如何检测出物体(是否是物体,位置),而分类数据集使得网络识别出物体类别。

在训练的过程中,当网络遇到一个来自检测数据集的图片与标记信息,那么就把这些数据用完整的YOLO v2 loss功能反向传播这个图片。当网络遇到一个来自分类数据集的图片和分类标记信息,只用整个结构中分类部分的loss功能反向传播这个图片。 

遇到一个来自分类数据集的图片和分类标记信息,只用整个结构中分类部分的loss功能反向传播这个图片。 
但是检测数据集只有粗粒度的标记信息,像“猫“、“ 狗”之类,而分类数据集的标签信息则更细粒度,更丰富。比如狗这一类就包括”哈士奇“”牛头梗“”金毛狗“等等。所以如果想同时在监测数据集与分类数据集上进行训练,那么就要用一种一致性的方法融合这些标签信息。 
再者,用于分类的方法,大多是用softmax layer方法,softmax意味着分类的类别之间要互相独立的。而盲目地混合数据集训练,就会出现比如:检测数据集的分类信息中”狗“这一分类,在分类数据集合中,就会有的不同种类的狗”哈士奇“”牛头梗“”金毛“这些分类,这两种数据集之间的分类信息不相互独立。所以使用一种多标签的model来混合数据集,假设一个图片可以有多个分类信息,并假定分类信息必须是相互独立的规则可以被忽略。

训练一个Extremely Large Scale检测器。所以训练的时候使用WordTree混合了COCO检测数据集与ImageNet中的Top9000类,混合后的数据集对应的WordTree有9418个类。另一方面,由于ImageNet数据集太大了,作者为了平衡一下两个数据集之间的数据量,通过过采样(oversampling)COCO数据集中的数据,使COCO数据集与ImageNet数据集之间的数据量比例达到1:4。 

为了评估这一方法,使用ImageNet Detection Task对训练结果进行评估。 
评估结果: 
YOLO9000取得19.7mAP。 
在未学习过的156个分类数据上进行测试,mAP达到16.0。 
YOLO9000的mAP比DPM高,而且YOLO有更多先进的特征,YOLO9000是用部分监督的方式在不同训练集上进行训练,同时还能检测9000个物体类别,并保证实时运行。

算法效果:

下图给出了YOLOv2和对比算法的准确率和运行时间的综合性能结果。可以看出YOLOv2在保证准确率的同时,可以达到超过30fps的图像检测速度。相比SSD512和Faster R-CNN(使用ResNet),YOLOv2在准确率和运行性能上都更胜一筹(图中左边第一个蓝圈)。

 

 

1.2.2 YOLOv3: an incremental improvement

论文链接:

https://arxiv.org/abs/1804.02767

开源代码:

https://github.com/pjreddie/darknet

录用信息:无。原文是4页technical report,2018年4月在arxiv放出。

论文目标:

保证准确率同时,更快。

核心思想:

YOLOv3对YOLO9000进行了改进,v3采用的模型比YOLO9000更大,进一步提高检测准确率,但速度比YOLO9000稍慢。相比其他检测算法,RetinaNet,SSD,DSSD等算法,YOLOv3的综合性能(准确率&速度)仍然很是最好的。但总的来说,文章的改进主要还是修修补补,换换网络,没有特别的突出创新点。

YOLOv3在Pascal Titan X上处理608x608图像速度达到20FPS,在 COCO test-dev 上 mAP@0.5 达到 57.9%,与RetinaNet(FocalLoss论文所提出的单阶段网络)的结果相近,并且速度快4倍.

YOLO v3的模型比之前的模型复杂了不少,可以通过改变模型结构的大小来权衡速度与精度。

速度对比如下:

分类器-类别预测
YOLOv3不使用Softmax对每个框进行分类,主要考虑因素有两个:

  1. Softmax使得每个框分配一个类别(score最大的一个),而对于Open Images这种数据集,目标可能有重叠的类别标签,因此Softmax不适用于多标签分类。
  2. Softmax可被独立的多个logistic分类器替代,且准确率不会下降。
    分类损失采用binary cross-entropy loss.

多尺度预测
每种尺度预测3个box, anchor的设计方式仍然使用聚类,得到9个聚类中心,将其按照大小均分给3中尺度.

  • 尺度1: 在基础网络之后添加一些卷积层再输出box信息.
  • 尺度2: 从尺度1中的倒数第二层的卷积层上采样(x2)再与最后一个16x16大小的特征图相加,再次通过多个卷积后输出box信息.相比尺度1变大两倍.
  • 尺度3: 与尺度2类似,使用了32x32大小的特征图.

基础网络 Darknet-53
仿ResNet, 与ResNet-101或ResNet-152准确率接近,但速度更快.对比如下:

 

网络结构如下:

YOLOv3在 mAP0.5mAP0.5 及小目标 APSAPS 上具有不错的结果,但随着IOU的增大,性能下降,说明YOLOv3不能很好地与ground truth切合.

边框预测
作者尝试了常规的预测方式(Faster R-CNN),然而并不奏效: x,y的偏移作为box的长宽的线性变换.

 

算法效果:

对320x320的输入图像,YOLOv3在保证检测准确率与SSD一致(mAP=28.2)的前提下,处理每张图像的时间为22ms,比SSD快3倍。

值得注意的是,论文提出的darknet-53,是一个比ResNet152综合性能更好的分类网络。

 

1.2.3 Object detection at 200 Frames Per Second

论文链接:

https://arxiv.org/abs/1805.06361

开源代码:无

录用信息:无

论文目标:

为了解决检测算法计算复杂度过高、内存占用过大的问题,本文提出了一种快而有效的方法,能够在保持高检测率的同时,达到每秒200帧的检测速度。

核心思想:

为了实现又快又强的检测目标,本文从三个方面提出了创新:网络结构、损失函数以及训练数据。在网络结构中,作者选择了一种深而窄的网络结构,并探讨了不同特征融合方式带来的影响。在损失函数设计中,作者提出了蒸馏损失函数以及FM-NMS方法以适应one-stage算法的改进。最后,作者在训练时同时使用了已标注数据和未标注数据。下面具体介绍下本文在这三方面的创新工作。

一、网络结构

一般来说,网络越深越宽,效果也会越好,但同时计算量和参数量也会随之增加。为了平衡算法的效果与速度,作者采用了一个深而窄的网络结构。示意图如下:

 

说明一下,本文的baseline算法是Tiny-Yolo(Yolo 9000的加速版)。

为了实现更窄,作者将卷积的通道数做了缩减,从Yolo算法的1024缩减为了512;为了实现更宽,作者在最后添加了3个1*1的卷积层。为了加深理解,建议读者结合Yolo的网络结构图,对比查看。

从上图中,我们还可以看出,作者采用了特征融合的方式,将前几层提取的特征融合到了后面层的特征图中。在融合的过程中,作者并没有采取对大尺寸特征图做max pooling然后与小尺寸特征图做融合的方式,而是采用了stacking方法,即先将大尺寸特征图进行resize然后再和小尺寸特征图做融合。具体到上图中,对104*104*64的特征图用卷积核数量为4,大小为1*1的卷积层进行压缩,得到104*104*4的特征图,然后做resize得到13*13*256的输出。

二、损失函数

蒸馏算法是模型压缩领域的一个分支。简单来说,蒸馏算法是用一个复杂网络(teacher network)学到的东西去辅助训练一个简单网络(student network)。但直接将蒸馏算法应用于one stage的Yolo算法还存在着一些困难。

困难1:对于two stage算法,在第一阶段就会去除很多背景RoI,送入检测网络的RoI相对较少,并且大部分包含object;而one stage 算法,输出中包含大量背景RoI。如果直接对输出进行学习,会导致网络过于关注背景,而忽视了前景。

鉴于此,本文作者提出objectness scaled distillation,主要考虑了teacher network中输出的objectness对损失函数的影响。作者认为只有objectness比较大的才应该对损失函数有贡献。

为了更好地理解作者的思路,我们先回顾一下Yolo算法的损失函数,如下所示:

 

作者提出的蒸馏损失函数如下:

 

困难2:对于检测算法来说,如果不做NMS,直接将teacher network的预测RoI输出给student network,会因为某些box有很多的相关预测RoI而导致这些box容易过拟合。

基于特征的NMS算法(feature map NMS或者简写成FM-NMS)
NMS是object detection算法中常用的后处理算法,用来去除重复预测框,传统的NMS算法和网络结构的训练是独立的。如果不做NMS,直接将teacher network的预测框输出给student network,则会导致student network接收到的object相关的loss会非常大,这样训练几轮以后就会对这些object过拟合了。因此这里采取了类似NMS算法的feature map NMS进行重复框进行去除。

首先在Yolo算法中,最后的输出层中每个grid cell的维度是1*1*(N*(K + 5)),也就是图中的蓝色或绿色三维矩形条,矩形条的长度就是N*(K + 5),其中N表示bbox的数量,K表示分类的类别数,5表示4个坐标值和1个objectness score。grid cell的数量就是输出层的feature map的宽高乘积。FM-NMS算法的假设是假如几个相邻的grid cell所预测bbox的类别一样,那么这些bbox极有可能预测的是同一个object。基于这样的假设或者说是观察到的现象,FM-NMS算法的做法是:每次取3*3个相邻的grid cell,对这9个grid cell中预测类别相同的bbox的得分(objectness value)进行排序,最后只选择得分最高的那个bbox传给后续的student network。Figure4是对2个grid cell做FM-NMS的示意图。

这里写图片描述

三、训练数据

鉴于作者使用了蒸馏算法,在训练时,可以非常方便地使用已标注数据和未标注数据。如果有标注数据,就使用完整的蒸馏损失函数。如果没有标注数据,就只使用蒸馏损失函数的distillation loss部分。

算法效果:

 

1.2.4 DSSD: Deconvolutional Single Shot Detector

论文链接:

https://arxiv.org/pdf/1701.06659.pdf

开源代码:

https://github.com/MTCloudVision/mxnet-DSSD 综述笔者实现版本

录用信息:未被会议收录

论文目标:

大小物体通吃。使用Top-Down网络结构,解决小物体检测的问题。

DSSD论文的详细解读可以参见https://zhuanlan.zhihu.com/p/33036037。

DSSD与FPN类似,都是基于Top-Down结构解决小物体检测,不同的是,如FPN的网络结构只是针对ResNet做了优化,文章中也没有提及过更换其他的基础网络的实验结果,普适度不够。DSSD作者提出一种通用的Top-Down的融合方法,使用vgg和ResNet网络将高层的语义信息融入到低层网络的特征信息中,丰富预测回归位置框和分类任务输入的多尺度特征图,以此来提高检测精度。

笔者认为,虽然Top-Down结构也许有效,但毕竟DSSD比FPN放出时间更晚一些,且在网络结构上这并没有太大创新,也许这就是本文未被会议收录的原因之一。

核心思想:

DSSD是基于SSD的改进,引入了Top-Down结构。下文分别从这两方面出发,介绍DSSD思想。

一、DSSD之于SSD

DSSD相对于 SSD算法的改进点,总结如下:

1.提出基于Top-Down的网络结构,用反卷积代替传统的双线性插值上采样。

2.在预测阶段引入残差单元,优化候选框回归和分类任务输入的特征图。

3. 采用两阶段训练方法。

DSSD的网络结构与SSD对比如下图所示,以输入图像尺寸为为例,图中的上半部分为SSD-ResNet101的网络结构,conv3_x层和conv5_x层为原来的ResNet101中的卷积层,后面的五层是SSD扩展卷积层,原来的SSD算法是将这七层的特征图直接输入到预测阶段做框的回归任务和分类任务。DSSD是将这七层特征图拿出六层(去掉尺寸为的特征图)输入到反卷积模型里,输出修正的特征图金字塔,形成一个由特征图组成的沙漏结构。最后经预测模块输入给框回归任务和分类任务做预测。

 

 

DSSD中的D,即反卷积模型,指的是DSSD中高层特征和低层特征的融合模块,其基本结构如下图所示:

 

 

 

二、DSSD之于FPN和TDM

同样是采用Top-Down方式,DSSD与FPN 和TDM(这两篇论文将在本论述后文中详细介绍)的网络结构区别如下图。可以看出,TDM使用的是concat操作,让浅层和深层的特征图叠在一起。DSSD使用的是Eltw Product(也叫broadcast mul)操作,将浅层和深层的特征图在对应的信道上做乘法运算。FPN使用的是Eltw Sum(也叫broadcast add)操作,将浅层和深层的特征图在对应的信道上做加法运算。

 

算法效果:

DSSD 当输入为513x513的时候在VOC2007数据集赏达到了80.0%mAP。

更详细的实验复现和结果对比见:

https://zhuanlan.zhihu.com/p/33036037

1.2.5 DSOD : learning deeply supervised object detectors from scratch

论文链接:

https://arxiv.org/pdf/1708.01241.pdf

开源代码:

https://github.com/szq0214/DSOD

录用信息:ICCV2017

 

 

 

未完待续----

 

posted @ 2018-09-28 12:07  Bob·li  阅读(6045)  评论(0编辑  收藏  举报