SSD (ECCV2016)
创新点:
基于Faster R-CNN中的Anchor,提出了相似的先验框(Prior box)
从不同比例的特征图(多尺度特征)中产生不同比例的预测,并明确地按长宽比分离预测。
SSD使用VGG16网络作为特征提取器(和Faster R-CNN中的CNN一样),将后面的全连接层替换成卷积层,并在之后添加自定义的卷积层,并在最后直接采用卷积进行检测。
在多个特征图上设置不同缩放比例和不同宽高比的先验框以融合多尺度特征图进行检测,靠前的大尺度特征图可以捕捉到小物体的信息,而靠后的小尺度特征图能够捕捉到大物体的信息,从而提高检测的准确度和定位的准确性。
SSD中default box的概念有点类似于Faster R-CNN中的anchor。不同于Faster R-CNN只在最后一个特征层取anchor, SSD在多个特征层上取default box,可以得到不同尺度的default box。在特征图的每个单元上取不同宽高比的default box,一般宽高比在{1,2,3,1/2,1/3}中选取,有时还会额外增加一个宽高比为1但具有特殊尺度的box。
如下图所示,在8x8的feature map和4x4的feature map上的每个单元取4个不同的default box。原文对于300x300的输入,分别在conv4_3,conv7,conv8_2,conv9_2,conv10_2,conv11_2的特征图上的每个单元取4,6,6,6,4,4个default box. 由于以上特征图的大小分别是38x38,19x19,10x10,5x5,3x3,1x1,所以一共得到38x38x4+19x19x6+10x10x6+5x5x6+ 3x3x4+1x1x4=8732个default box.对一张300x300的图片输入网络将会针对这8732个default box预测8732个边界框。
SSD在训练的时候只需要输入图像和图像中每个目标对应的ground truth.先验框与ground truth 的匹配遵循两个原则:
1.对图片中的每个ground truth, 在先验框中找到与其IOU最大的先验框,则该先验框对应的预测边界框与ground truth 匹配。
2.对于1 中每个剩下的没有与任何ground truth匹配到的先验框,找到与其IOU最大的groundtruth,若其与该ground truth的IOU值大于某个阈值(一般设为0.5),则该先验框对应的预测边界框与该ground truth匹配。
按照这两个原则进行匹配,匹配到ground truth的先验框对应的预测边界框作为正样本,没有匹配到ground truth的先验框对应的预测边界框作为负样本。 尽管一个ground truth可以与多个先验框匹配,但是ground truth的数量相对先验框还是很少,按照上面的原则进行匹配还是会造成负样本远多于正样本的情况。为了使正负样本尽量均衡(一般保证正负样本比例约为1:3),SSD采用hard negative mining, 即对负样本按照其预测背景类的置信度进行降序排列,选取置信度较小的top-k作为训练的负样本。
最后分别在所选的特征层上使用3x3卷积核预测不同default boxes所属的类别分数及其预测的边界框location。由于对于每个box需要预测该box属于每个类别的置信度(假设有c类,包括背景,例如20class的数据集合,c=21)和该box对应的预测边界框的location(包含4个值,即该box的中心坐标和宽高),则每个box需要预测c+4个值。所以对于某个所选的特征层,该层的卷积核个数为(c+4)x 该层的default box个数.最后将每个层得到的卷积结果进行拼接。
对于得到的每个预测框,取其类别置信度的最大值,若该最大值大于置信度阈值,则最大值所对应的类别即为该预测框的类别,否则过滤掉此框。对于保留的预测框根据它对应的先验框进行解码得到其真实的位置参数(这里还需注意要防止预测框位置超出图片),然后根据所属类别置信度进行降序排列,取top-k个预测框,最后进行NMS,过滤掉重叠度较大的预测框,最后得到检测结果。
SSD优势是速度比较快,整个过程只需要一步,首先在图片不同位置按照不同尺度和宽高比进行密集抽样,然后利用CNN提取特征后直接进行分类与回归,所以速度比较快,但均匀密集采样会造成正负样本不均衡的情况使得训练比较困难,导致模型准确度有所降低。另外,SSD对小目标的检测没有大目标好,因为随着网络的加深,在高层特征图中小目标的信息丢失掉了,适当增大输入图片的尺寸可以提升小目标的检测效果。
DSSD (CVPR2017)
创新点:
Backbone:将SSD中的VGG网络替换为ResNet-101网络,增强了特征提取能力;
添加了Deconvolution层,增加了大量上下文信息。
为了解决SSD算法检测小目标困难的问题,DSSD算法将SSD算法基础网络从 VGG-16 更改为 ResNet-101,增强网络特征提取能力,其次参考FPN算法思路利用去Deconvolution结构将图像深层特征从高维空间传递出来,与浅层信息融合,联系不同层级之间的图像语义关系,设计预测模块结构,通过不同层级特征之间融合特征输出预测物体类别信息。
DSSD算法中有两个特殊的结构:Prediction模块;Deconvolution模块。
Prediction模块:利用提升每个子任务的表现来提高准确性,并且防止梯度直接流入ResNet主网络。
Deconvolution模块:则增加了三个Batch Normalization层和三个3×3卷积层,其中卷积层起到了缓冲的作用,防止梯度对主网络影响太剧烈,保证网络的稳定性。
1.Prediction Module
SSD直接从多个卷积层中单独引出预测函数,预测量多达7000多,梯度计算量也很大。MS-CNN方法指出,改进每个任务的子网可以提高准确性。根据这一思想,DSSD在每一个预测层后增加残差模块,并且对于多种方案进行了对比,如下图所示。结果表明,增加残差预测模块后,高分辨率图片的检测精度比原始SSD提升明显。
2.Deconvolution module
为了整合浅层特征图和deconvolution层的信息,作者引入deconvolution模块,如下图所示。作者受到论文Learning to Refine Object Segments的启发,认为用于精细网络的deconvolution模块的分解结构达到的精度可以和复杂网络一样,并且更有效率。
作者对其进行了一定的修改:其一,在每个卷积层后添加批归一化(batch normalization)层;其二,使用基于学习的deconvolution层而不是简单地双线性上采样;其三,作者测试了不同的结合方式,元素求和(element-wise sum)与元素点积(element-wise product)方式,实验证明元素点积计算能得到更好的精度。
详解请移步 YOLO系列
YOLO V1 (CVPR2015)
创新点:
1.将整张图作为网络的输入,直接在输出层回归bounding box的位置和所属的类别;
2.速度快,one stage detection的开山之作。
之前的物体检测方法首先需要产生大量可能包含待检测物体的先验框, 然后用分类器判断每个先验框对应的边界框里是否包含待检测物体,以及物体所属类别的概率或者置信度,同时需要后处理修正边界框,最后基于一些准则过滤掉置信度不高和重叠度较高的边界框,进而得到检测结果。这种基于先产生候选区再检测的方法虽然有相对较高的检测准确率,但运行速度较慢。
YOLO创造性的将物体检测任务直接当作回归问题(regression problem)来处理,将候选区和检测两个阶段合二为一。只需一眼就能知道每张图像中有哪些物体以及物体的位置。
YOLO也并没有真正的去掉候选区,而是直接将输入图片划分成7x7=49个网格,每个网格预测2个边界框,一共预测49x2=98个边界框。可以近似理解为在输入图片上粗略的选取98个候选区,这98个候选区覆盖了图片的整个区域,进而用回归预测这98个候选框对应的边界框。
YOLO网络借鉴了GoogLeNet分类网络结构,不同的是YOLO使用1x1卷积层和3x3卷积层替代inception module。如下图所示,整个检测网络包括24个卷积层和2个全连接层。其中,卷积层用来提取图像特征,全连接层用来预测图像位置和类别概率值
YOLO将输入图像分成7x7的网格,每个网格预测2个边界框。若某物体的ground truth的中心落在该网格,则该网格中与这个 ground truth IOU最大的边界框负责预测该物体。对每个边界框会预测5个值,分别是边界框的中心x,y(相对于所属网格的边界),边界框的宽高w,h(相对于原始输入图像的宽高的比例),以及这些边界框的confidencescores(边界框与ground truth box的IOU值)。同时每个网格还需要预测c个类条件概率 (是一个c维向量,表示某个物体object在这个网格中,且该object分别属于各个类别的概率,这里的c类物体不包含背景)。论文中的c=20,则每个网格需要预测2x5+20=30个值,这些值被映射到一个30维的向量。 为了让边界框坐标损失、分类损失达到很好的平衡,损失函数设计如下图所示。
如上图所示,损失函数分为坐标预测(蓝色框)、含有物体的边界框的confidence预测(红色框)、不含有物体的边界框的confidence预测(黄色框)、分类预测(紫色框)四个部分。
某边界框的置信度定义为:
Confidence = 边界框存在某类对象的概率pr(object) x 边界框与对象的 Ground Truth 的 IOU值
若该边界框存在某个对象pr(object)=1 ,否则pr(object)=0 。
由于一幅图中大部分网格中是没有物体的,这些网格中的边界框的Confidence置为0,相比于有物体的网格,这些不包含物体的网格更多,对梯度更新的贡献更大,会导致网络不稳定。
为了平衡上述问题,YOLO损失函数中对没有物体的边界框的Confidence error赋予较小的权重,记为 noobj,对有物体的边界框的Confidence error赋予较大的权重。
在pascal VOC训练中noobj=0.5 ,有物体的边界框的confidence error的权重设为1。
YOLO最后采用非极大值抑制(NMS)算法从输出结果中提取最有可能的对象和其对应的边界框。
NMS步骤如下:
1.设置一个Score的阈值,一个IOU的阈值;
2.对于每类对象,遍历属于该类的所有候选框,
过滤掉Score低于Score阈值的候选框;
找到剩下的候选框中最大Score对应的候选框,添加到输出列表;
进一步计算剩下的候选框与2中输出列表中每个候选框的IOU,若该IOU大于设置的IOU阈值,将该候选框过滤掉,否则加入输出列表中;
最后输出列表中的候选框即为图片中该类对象预测的所有边界框
3.返回步骤2继续处理下一类对象。
YOLO V1 具有以下优势:
速度极快,易于优化:只需读取一次图像,就可进行端对端优化,可满足实时需求
背景误识别率低:对全图进行卷积学习,综合考虑了全图的上下文信息
泛化性能好:也是由于综合考虑了图片全局,因此能够更好地学习数据集的本质表达,泛化性能更好
识别精度高
相较于 Faster R-CNN , YOLO v1 存在明显不⾜:
定位精度不够,尤其是⼩⽬标
对密集目标的识别存在不足
对异常宽长比的目标识别不佳
YOLO V2 (CVPR2017)
Yolo V2 的主要贡献在于:
利用 wordTree 设计,充分利⽤分类数据集,弥补目标识别类别数目的不足
重新设计基础网络 darknet-19 ,输入尺⼨可变,从而在同一套模型上,提供速度和精度之间的切换
重新设计 anchor box 和坐标变换格式,是的收敛更快,精度更高
相比于直接预测坐标,预测 offset 更简单,误差更小,可以简化问题,使得网络更容易学习。
YOLOv2采用Darknet-19,其网络结构如下图所示,包括19个卷积层和5个max pooling层,主要采用3x3卷积和1x1卷积,这里1x1卷积可以压缩特征图通道数以降低模型计算量和参数,每个卷积层后使用BN层以加快模型收敛同时防止过拟合。最终采用global avg pool 做预测。采用YOLOv2,模型的mAP值没有显著提升,但计算量减少了。
YOLO V3 - 2018
YOLOv3总结了自己在YOLOv2的基础上做的一些尝试性改进,有的尝试取得了成功,而有的尝试并没有提升模型性能。其中有两个值得一提的亮点,
一个是使用残差模型,进一步加深了网络结构;
另一个是使用FPN架构实现多尺度检测。
创新点:
新网络结构:DarkNet-53
融合FPN
用逻辑回归替代softmax作为分类器
YOLOv3在之前Darknet-19的基础上引入了残差块,并进一步加深了网络,改进后的网络有53个卷积层,取名为Darknet-53,网络结构如下图所示(以256*256的输入为例)。
YOLOv3借鉴了FPN的思想,从不同尺度提取特征。相比YOLOv2,YOLOv3提取最后3层特征图,不仅在每个特征图上分别独立做预测,同时通过将小特征图上采样到与大的特征图相同大小,然后与大的特征图拼接做进一步预测。用维度聚类的思想聚类出9种尺度的anchor box,将9种尺度的anchor box均匀的分配给3种尺度的特征图。
Yolo V3 只是对 Yolo v2 进⾏行行了一次较小的优化,主要体现在网络结构上,提出了 darknet-53 结构,作为特征提取⽹网络。最后, Yolo V3 在小目标的识别上改善较大,但是中等⽬目标和大目标的识别方面,表现略微下降。
从YOLOv1到YOLOv2再到YOLO9000、YOLOv3, YOLO经历三代变革,在保持速度优势的同时,不断改进网络结构,同时汲取其它优秀的目标检测算法的各种trick,先后引入anchor box机制、引入FPN实现多尺度检测等。
RetinaNet (ICCV2017)
Two-Stage检测器(如Faster R-CNN、FPN)效果好,但速度相对慢
One-Stage检测器(如YOLO、SSD)速度快,但效果一般
主要贡献
1.找到妨碍单阶段目标检测器实现高准确度的主要原因:- 训练期间的前景-背景之间的类别不平衡
2.设计焦点损失(Focal Loss) 来解决这种类别不平衡问题,降低分配给分类良好例子的损失。
3.提出了单阶段 RetinaNet网络架构 使用了焦点损失和多尺度特征金字塔。
二分类的交叉熵损失 (cross-entropy loss)
CE loss 对容易分类的例子 也会导致non-trivial损失。 大量简单的例子相加,这些小损失值可以压倒the rare class (量小的类别) 。
平衡的交叉熵 (Balanced Cross Entropy)
解决类不平衡的常用方法是为类1引入加权因子
α
\alpha
α,为类-1引入
1
−
α
1-\alpha
1−α。 实际上,可以通过类别频率的倒数设置或者作为超参数通过交叉验证来设置。
焦点损失(Focal Loss)
焦点损失旨在解决one-stage目标检测场景,其中在训练期间前景和背景类之间存在极度不平衡(例如, 1: 1000)
显然,样本越易分,
p
t
p_t
pt就越大(
p
t
p_t
pt—>1),modulating factor趋近于0,则贡献的loss就越小,同样地,样本越难分,其
p
t
p_t
pt就越小,modulating factor接近于1,则贡献的loss不受影响。
一旦乘上了该权重,量大的类别所贡献的损失被大幅消减,量少的类别所贡献的损失几乎没有多少降低。虽然整体的损失总量减少了,但是训练过程中量少的类别拥有了更大的话语权,更加被模型所关心了
本质改进点在于,在原本的交叉熵误差 C E ( p t ) = − l o g ( p t ) CE(p_t)=-log(p_t) CE(pt)=−log(pt)前面乘上了 ( 1 − p t ) γ (1-p_t)^\gamma (1−pt)γ这一权重。
网络结构
单阶段RetinaNet网络架构在前馈ResNet架构(a)之上使用特征金字塔网络(FPN)作为骨干网络,以生成丰富的多尺度的卷积特征金字塔(b)。骨干网后, RetinaNet附加了两个子网,一个用于分类锚定框(c),一个用于从锚定框回归到GT目标框(d)
(a)使用图像金字塔构建特征金字塔。 在每个图像尺度上独立地计算特征,比较缓慢。
(b)最近的检测系统选择仅使用单一尺度的特征来加快检测速度。
(c)另一种方法是重用从 ConvNet 计算的金字塔特征层次结构,就好像它是一个特征化的图像金字塔。
(d)提出的特征金字塔网络(FPN)像(b)和(c)快速,但更准确。
Building block: 包括侧向连接(lateral connection )和自上而下路径(passway) ,通过相加合并
自上而下的部分生成粗粒度特征,自下而上的部分通过侧向连接加入细粒度特征。
FPN本身不是目标检测器。 它是一个与目标检测器配合使用的特征检测器。馈送每个独立的特征图以进行目标检测。
RetinaNet结构注意内容:
1. 训练时FPN每一级的所有example都被用于计算Focal Loss,loss值加到一起用来训练;
2. 测试时FPN每一级只选取score最大的1000个example来做nms;
3. 整个结构不同层的head部分(上图中的c和d部分)共享参数,但分类和回归分支间的参数不共享;
4. 分类分支的最后一级卷积的bias初始化成前面提到的
−
l
o
g
(
(
1
−
π
)
/
π
)
-log((1-π)/π)
−log((1−π)/π);