RetinaNet的理解

Anchor boxes

 Anchor boxes最早是在faster-rcnn 里面引入的,现在yolov2,yolov3,ssd ,retinanet也都有应用,因为标准的卷积很难生成各种形状各种大小的边框

                                                                                    图1

下图是将锚点框映射到原始图像上

RPN

如图1所示

feature map 用于两个任务,一个用于回归,一个用于分类。我们讨论一下怎么设计RPN

回归:

在faster-rcnn里面,我们最后得到的是一个50*50的feature map,对其进行3x3的卷积,在每一个位置的每一个锚点,预测4个值 [x1, y1, h1, w1] ,那我们最终的输出是50x50x9x4

分类:

跟回归很相似,分类每一个锚点只会输出两个两个值,前景和背景的概率,那么最终的输出为50x50x9x2

RPN存在的问题:

1、RPN是用了多次采样之后的feature map,因此很难检测比较小的物体(fpn可以解决这个问题)

2、损失函数采用的是128左右的的正样本和128左右的负样本,因为整体样本是不均衡的,并且有些样本是分类是比较简单的

FPN

在RPN里面,用的是最高层的feature map,但是所有的imagenet 或者coco都使用了多尺度的金字塔特征模型。假如,我们要在800x800的图像上进行边框预测,如果我们采用图金字塔,我们必须把原始图像变成256x256,512x512等等,我们计算他们每一个的特征图,然后进行非极大值抑制,检测出目标,但是这种太耗费资源了

作者用特征金字塔代替了图像金字塔,比如作者不是用resnet 最后一层,而是采用池化(采样)前一层,对这个些层的特征都采用RPN,然后将他们合并起来,应用非极大值抑制,这就构建了金字塔特征,但是这也会存在一个问题,不同层级的特征所表达的语义差别比较大,底层的特征会包含高层的特征,这会对高层特征的目标检测有负面作用。

 

作者的目标是构建一个强大的语义解释的金字塔特征模型,为了达到这个目标,将底层特征图和高层特征图进行融合。

我们可以更复杂的设计这些模块,但是作者发现改进有限,所以就保留了这种简单的结构

设计锚点框的关键因素

1、由于金字塔拥有不同的尺度形状,所以我们在每一层不用设计多种尺度的框,我们用[32, 54, 128, 256, 512] 在P3, P4, P5, P6, P7,长宽比为 [1:1, 1:2, 2:1]

2、超出图片范围的必须忽略

3、anchor和真实框的iou大于0.7为正例,小于0.3的为反例

Focal Loss

One-stage为了提高速度, 会在可能目标所在位置应用大量的,规则,稠密的样本。但是由于正负样本的不均衡会造成训练准确度不如two-stage

focal Loss只是交叉熵的变种,它会降低分类比较好的损失,这种损失函数可以防止大量的容易分类的负样本压倒正样本的损失

下面看下他是如何设计的,我们首先看下二分类的交叉熵

由于类别的高度不均衡,我们这里引入一个惩罚因子,这里我们把a叫做平衡参数

如上所述,大量的负样本共享了主要的梯度,尽管a平衡了正负样本的重要性,但是并没有区分难易样本,所以作者设计了如下结构

这里的γ称为focal因子

举一个简单的例子:

前景的概率是p=0.9,那么现在的交叉熵是

CE(foreground) = -log(0.9) = 0.1053

CE(background) = -log(1–0.1) = 0.1053

我们这里设a=0.25 γ=2

FL(foreground) = -1 x 0.25 x (1–0.9)**2 log(0.9) = 0.00026

FL(background) = -1 x 0.25 x (1–(1–0.1))**2 log(1–0.1) = 0.00026

如果前景的概率是p=0.1,那么现在的交叉熵是

CE(foreground) = -log(0.1) = 2.3025

CE(background) = -log(1–0.9) = 2.3025

我们这里设a=0.25 γ=2

FL(foreground) = -1 x 0.25 x (1–0.1)**2 log(0.1) = 0.4667

FL(background) = -1 x 0.25 x (1–(1–0.9))**2 log(1–0.9) = 0.4667

如果如果前景的概率是p=0.99,那么现在的交叉熵是

CE(foreground) = -log(0.99) = 0.01

CE(background) = -log(1–0.01) = 0.1053

我们这里设a=0.25 γ=2

FL(foreground) = -1 x 0.25 x (1–0.99)**2 log(0.99) = 2.5*10^(-7)

FL(background) = -1 x 0.25 x (1–(1–0.01))**2 log(1–0.01) = 2.5*10^(-7)

结论

1: 0.1/0.00026 = 384

2: 2.3/0.4667 = 5

3: 0.01/0.00000025 = 40,000

通过这个例子我们很好的解释了focal loss的作用

你可能感兴趣的:(目标检测)