目录
1、概述
2、目标检测算法
2.1、SSD
2.2、DSSD
2.3、YOLO V1
2.4、YOLO V2
2.5、YOLO V3
2.6、RetinaNet
研究背景
主要贡献
二分类的交叉熵损失 (cross-entropy loss)
平衡的交叉熵 (Balanced Cross Entropy)
焦点损失(Focal Loss)
RetinaNet网络架构
3.参考:
将对单次目标检测器(包括SSD系列和YOLO系列等算法)进行综述。我们将分析FPN以理解多尺度特征图如何提高准确率,特别是小目标的检测,其在单次检测器中的检测效果通常很差。然后我们将分析Focal loss和RetinaNet,看看它们是如何解决训练过程中的类别不平衡问题的。
创新点:
与RCNN系列的目标检测算法不同,SSD属于One-Stage方法,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 的匹配遵循两个原则:
按照这两个原则进行匹配,匹配到ground truth的先验框对应的预测边界框作为正样本,没有匹配到ground truth的先验框对应的预测边界框作为负样本。尽管一个ground truth可以与多个先验框匹配,但是ground truth的数量相对先验框还是很少,按照上面的原则进行匹配还是会造成负样本远多于正样本的情况。为了使正负样本尽量均衡(一般保证正负样本比例约为1:3),SSD采用hard negativemining, 即对负样本按照其预测背景类的置信度进行降序排列,选取置信度较小的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对小目标的检测没有大目标好,因为随着网络的加深,在高层特征图中小目标的信息丢失掉了,适当增大输入图片的尺寸可以提升小目标的检测效果。
更多SSD的详细内容见博客:https://blog.csdn.net/qq_24819773/article/details/92086961
创新点:
为了解决SSD算法检测小目标困难的问题,DSSD算法将SSD算法基础网络从 VGG-16 更改为 ResNet-101,增强网络特征提取能力,其次参考FPN算法思路利用去Deconvolution结构将图像深层特征从高维空间传递出来,与浅层信息融合,联系不同层级之间的图像语义关系,设计预测模块结构,通过不同层级特征之间融合特征输出预测物体类别信息。
SSD和DSSD的网络模型
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(You Only Look Once: Unified, Real-Time Object Detection)是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预测(黄色框)、分类预测(紫色框)四个部分。
由于不同大小的边界框对预测偏差的敏感度不同,小的边界框对预测偏差的敏感度更大。为了均衡不同尺寸边界框对预测偏差的敏感度的差异。作者巧妙的对边界框的w,h取均值再求L2 loss. YOLO中更重视坐标预测,赋予坐标损失更大的权重,记为 coord,在pascal voc训练中coord=5 ,classification error部分的权重取1。
某边界框的置信度定义为:
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)算法从输出结果中提取最有可能的对象和其对应的边界框。
输入一张图片到YOLO网络将输出一个7730的张量表示图片中每个网格对应的可能的两个边界框以及每个边界框的置信度和包含的对象属于各个类别的概率。由此可以计算某对象i属于类别 同时在第j个边界框中的得分:
每个网格有20个类条件概率,2个边界框置信度,相当于每个网格有40个得分,7x7个网格有1960个得分,每类对象有1960/20=98个得分,即98个候选框。
NMS步骤如下:
1.设置一个Score的阈值,一个IOU的阈值;
2.对于每类对象,遍历属于该类的所有候选框,
3.返回步骤2继续处理下一类对象。
YOLO V1 具有以下优势:
相较于 Faster R-CNN , YOLO v1 存在明显不⾜:
更多YOLO的详细内容见博客:https://blog.csdn.net/qq_24819773/article/details/91435413
Yolo V2 的主要贡献在于:
在 yolo v1 中,使⽤用全连接层来直接预测目标的 bounding box 的坐标。训练过程不够稳定,主要来自 的预测。而在 Faster R-CNN 中,使用全卷积网络 RPN 来预测 bounding box 相对于 anchor box 的坐标的偏移量。由于预测网络是卷积网络,因此 PRN 在 feature map 网络的每个位置预测这些offset 。
相比于直接预测坐标,预测 offset 更简单,误差更小,可以简化问题,使得网络更容易学习。
YOLOv2采用Darknet-19,其网络结构如下图所示,包括19个卷积层和5个max pooling层,主要采用3x3卷积和1x1卷积,这里1x1卷积可以压缩特征图通道数以降低模型计算量和参数,每个卷积层后使用BN层以加快模型收敛同时防止过拟合。最终采用global avg pool 做预测。采用YOLOv2,模型的mAP值没有显著提升,但计算量减少了。
Darknet-19
YOLOv2的训练主要包括三个阶段。
第一阶段:先在ImageNet分类数据集上预训练Darknet-19,此时模型输入为 ,共训练160个epochs。
第二阶段:将网络的输入调整为 ,继续在imageNet数据集上finetune分类模型,训练10个epochs,此时分类模型的top-1准确度为76.5%,而top-5准确度为93.3%。 第三个阶段:修改Darknet-19分类模型为检测模型,并在检测数据集上继续finetune网络。 网络修改包括(网路结构可视化):移除最后一个卷积层、global avgpooling层以及softmax层,并且新增了3个3x3x1024卷积层,同时增加了一个passthrough层,最后使用1x1卷积输出预测结果。
YOLOv2借鉴了很多其它目标检测方法的一些技巧,如Faster R-CNN的anchor boxes, SSD中的多尺度检测。除此之外,YOLOv2在网络设计上做了很多tricks,使它能在保证速度的同时提高检测准确率,Multi-Scale Training更使得同一个模型适应不同大小的输入,从而可以在速度和精度上进行自由权衡。
WordTree的生成方式如下:
对于物体的标签,采用one-hot编码的形式,数据集中的每个物体的类别标签被组织成1个长度为9418的向量,向量中除在WordTree中从该物体对应的名词到根节点的路径上出现的词对应的类别标号处为1,其余位置为0。
YOLOv3总结了自己在YOLOv2的基础上做的一些尝试性改进,有的尝试取得了成功,而有的尝试并没有提升模型性能。其中有两个值得一提的亮点,
创新点:
YOLOv3在之前Darknet-19的基础上引入了残差块,并进一步加深了网络,改进后的网络有53个卷积层,取名为Darknet-53,网络结构如下图所示(以256*256的输入为例)。
性能对比图:
YOLOv3借鉴了FPN的思想,从不同尺度提取特征。相比YOLOv2,YOLOv3提取最后3层特征图,不仅在每个特征图上分别独立做预测,同时通过将小特征图上采样到与大的特征图相同大小,然后与大的特征图拼接做进一步预测。用维度聚类的思想聚类出9种尺度的anchor box,将9种尺度的anchor box均匀的分配给3种尺度的特征图。
如下图是在网络结构图的基础上加上多尺度特征提取部分的示意图(以在COCO数据集(80类)上256x256的输入为例):
Yolo V3 只是对 Yolo v2 进⾏行行了一次较小的优化,主要体现在网络结构上,提出了 darknet-53 结构,作为特征提取⽹网络。最后, Yolo V3 在小目标的识别上改善较大,但是中等⽬目标和大目标的识别方面,表现略微下降。
从YOLOv1到YOLOv2再到YOLO9000、YOLOv3, YOLO经历三代变革,在保持速度优势的同时,不断改进网络结构,同时汲取其它优秀的目标检测算法的各种trick,先后引入anchor box机制、引入FPN实现多尺度检测等。
论文地址:https://arxiv.org/abs/1708.02002
两阶段目标检测的类别不平衡问题及解决方法:
单阶段目标检测器:
CE loss 对容易分类的例子 也会导致non-trivial损失。 大量简单的例子相加,这些小损失值可以压倒the rare class (量小的类别) 。
解决类不平衡的常用方法是为类1引入加权因子?,为类-1引入1 - ?。 实际上,可以通过类别频率的倒数设置或者作为超参数通过交叉验证来设置。
虽然 ? 平衡了正例/负例的重要性,但它并没有区分简单/困难的例子。 所以建议reshape损失函数,以减轻简单的例子,从而集中训练困难例子。
焦点损失旨在解决one-stage目标检测场景,其中在训练期间前景和背景类之间存在极度不平衡(例如, 1: 1000)
显然,样本越易分,pt就越大(pt—>1),modulating factor趋近于0,则贡献的loss就越小,同样地,样本越难分,其pt就越小,modulating factor接近于1,则贡献的loss不受影响。
一旦乘上了该权重,量大的类别所贡献的损失被大幅消减,量少的类别所贡献的损失几乎没有多少降低。虽然整体的损失总量减少了,但是训练过程中量少的类别拥有了更大的话语权,更加被模型所关心了
本质改进点在于,在原本的交叉熵误差 (CE(??)=- ??log(??)) 前面乘上了(1 - ?? )? 这一权重。
单阶段RetinaNet网络架构在前馈ResNet架构(a)之上使用特征金字塔网络(FPN)作为骨干网络,以生成丰富的多尺度的卷积特征金字塔(b)。骨干网后, RetinaNet附加了两个子网,一个用于分类锚定框(c),一个用于从锚定框回归到GT目标框(d)
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初始化成前面提到的-log((1-π)/π);
https://github.com/scutan90/DeepLearning-500-questions
http://www.tensorinfinity.com/paper_197.html