目标检测总结:focal loss 和 RetinaNet

目标检测总结:focal loss 和 RetinaNet

    • focal loss
    • Retina Net

  之前总结过,目前常见的目标检测算法分one-stage和two-stage两种,one-stage以Yolo系列和SSD系列为代表,two-stage以Faster-RCNN系列为代表。两种类型的目标检测算法可谓各有所长,one-stage算法计算速度快,但其精度弱于two-stage算法,而two-stage算法计算速度虽然慢,但其精度较高,在精度方面一直是sota。
  分析one-stage算法精度不高的原因,作者认为主要是类别的不平衡引起的。在anchor-based的目标检测算法中,绝大部分的anchor都是背景,只有少数的anchor存在object,所以在训练过程中,分类器可以无脑的把所有的anchor分类为background,这样导致了one-stage算法的精度不高。
  而two-stage算法可以有效的避免这个问题,原因在于其第一个stage会对anchor进行简单的二分类,经过初步的筛选,属于background的bbox被大幅砍削,虽然数量依然多余存在object的bbox,但是数量的悬殊程度没有那么夸张,在第二个stage时,分类器再一次进行细分,使得two-stage算法精度上由于one-stage的算法。但是经过了两个stage的操作,使得two-stage的算法速度降了下来。
  类别不平衡是one-stage算法精度不如two-stage算法的原因所在。

focal loss

由于原有的交叉熵损失函数无法解决类别不平衡这一问题。作者提出了一个新的损失函数focal loss。交叉熵(CE)和focal loss的对比如下:
在这里插入图片描述
在这里插入图片描述
交叉熵损失函数想必都很熟悉,这里不做过多的介绍,着重介绍一下focalloss,其实focalloss的公式非常简单,在交叉熵损失函数的前面成了一个权重。我们对前面的权重进行一个简单的分析:

  • 首先,在这里插入图片描述这一项相当于对原来的损失函数×了一个系数。我们展开来分析。假如样本类别为1,那么当预测值pt越接近于1,这个权重的值越小,相当于分类器越易分的样本其损失函数×的权重越小,而在分类器不易分的难例样本处×的权重较大。样本类别为0时同理。这样相当于通过损失函数对easy example进行抑制,着重处理难分的样本(hard example)。
  • 其次,α系数,用于调节positive 和 negative的比例,前景类别为α时,背景类别使用1-α。比如前景类别较少,α可以取接近1的值进行调节,而背景类别的权重为1-α,是一个接近0的数。可以通过α来调节样本比例的不均衡。
  • 在类别差异不大时,focal loss的作用不大,另外focal loss公式并不是固定的,论文中其参数γ=2,α=0.25。另外当γ取0的时候,focal loss即为交叉熵损失。

Retina Net

为了证明focal loss的有效性,作者还提出了一个新的one-stage目标检测算法——Retina Net。模型的结构如下图所示。
目标检测总结:focal loss 和 RetinaNet_第1张图片
其实Retina Net其实就是Resnet + FPN + 两个FCN的子网络的组合。
  首先以Resnet作为backbone,然后加入了FPN。在金字塔网络的P3-P7分别提取特征,对应的anchor的size为32,64,128,256,512,每一层的anchor有三个比例(1:2,1:1,2:1),同时为了密集采样,每一层增加了三个新的size,分别为原始size的(2的0次方,2的1/3次方,2的2/3次方)倍。
另外分类和回归子网络和FPN中提到的一致,所有的金字塔特征层共享。并且相比于FasterRCNN中的RPN的head更深。
在inference时,采用的是对FPN中的conf前1000个框进行box回归,然后nms输出。

你可能感兴趣的:(深度学习)