目标检测算法笔记

1.FPN(Feature Pyramid Network)

论文地址:https://arxiv.org/pdf/1612.03144.pdf
在物体检测里面,有限计算量情况下,网络的深度(对应到感受野)与stride通常是一对矛盾的东西,常用的网络结构对应的stride一般会比较大(如32),而图像中的小物体甚至会小于stride的大小,造成的结果就是小物体的检测性能急剧下降。传统解决这个问题的思路包括:

(1)多尺度训练和测试,又称图像金字塔,如图1(a)所示。目前几乎所有在ImageNet和COCO检测任务上取得好成绩的方法都使用了图像金字塔方法。然而这样的方法由于很高的时间及计算量消耗,难以在实际中应用。

(2)特征分层,即每层分别预测对应的scale分辨率的检测结果。如图1©所示。SSD检测框架采用了类似的思想。这样的方法问题在于直接强行让不同层学习同样的语义信息。而对于卷积神经网络而言,不同深度对应着不同层次的语义特征,浅层网络分辨率高,学的更多是细节特征,深层网络分辨率低,学的更多是语义特征。

本文针对这些问题,提出了特征金字塔网络FPN,如图1(d)所示,网络直接在原来的单网络上做修改,每个分辨率的feature map引入后一分辨率缩放两倍的feature map做element-wise相加的操作。通过这样的连接,每一层预测所用的feature map都融合了不同分辨率、不同语义强度的特征,融合的不同分辨率的feature map分别做对应分辨率大小的物体检测。这样保证了每一层都有合适的分辨率以及强语义特征。同时,由于此方法只是在原网络基础上加上了额外的跨层连接,在实际应用中几乎不增加额外的时间和计算量。作者接下来实验了将FPN应用在Faster RCNN上的性能,在COCO上达到了state-of-the-art的单模型精度。

The construction of our pyramid involves a bottom-up pathway, a top-down pathway, and lateral connections

在这里插入图片描述
a.图像金字塔,即将图像做成不同的scale,然后不同scale的图像生成对应的不同scale的特征。这种方法的缺点在于增加了时间成本。有些算法会在测试时候采用图像金字塔。
b.像SPP net,Fast RCNN,Faster RCNN是采用这种方式,即仅采用网络最后一层的特征。
c.像SSD(Single Shot Detector)采用这种多尺度特征融合的方式,没有上采样过程,即从网络不同层抽取不同尺度的特征做预测,这种方式不会增加额外的计算量。作者认为SSD算法中没有用到足够低层的特征(在SSD中,最低层的特征是VGG网络的conv4_3),而在作者看来足够低层的特征对于检测小物体是很有帮助的。
d.本文作者是采用这种方式,顶层特征通过上采样和低层特征做融合,而且每层都是独立预测的。

在这里插入图片描述
上面一个带有skip connection的网络结构在预测的时候是在finest level(自顶向下的最后一层)进行的,简单讲就是经过多次上采样并融合特征到最后一步,拿最后一步生成的特征做预测。而下面一个网络结构和上面的类似,区别在于预测是在每一层中独立进行的。
在这里插入图片描述
作者的主网络采用ResNet。一个自底向上的线路,一个自顶向下的线路,横向连接(lateral connection)。图中放大的区域就是横向连接,这里1*1的卷积核的主要作用是减少卷积核的个数,也就是减少了feature map的个数,并不改变feature map的尺寸大小。
We denote the output of these last residual blocks as {C2, C3, C4, C5} for conv2, conv3, conv4, and conv5 outputs, and note that they have strides of {4, 8, 16, 32} pixels with respect to the input image. We do not include conv1 into the pyramid due to its large memory footprint
K取2,3,4,5,也就是每个stage的特征图分别是原图大小的1/2k

Fast RCNN中的FPN用来选择用哪一层做ROI Pooling。
在这里插入图片描述
当w* h = 2242时,k=k0=4
当w* h=4482时,k=k0+1=5

在RPN中,每一层设置不同比例的feature map
we assign anchors of a single scale to each level. Formally, we define the anchors to have areas of {322 , 642 , 1282 , 2562 , 5122} pixels on {P2, P3, P4, P5, P6} respectively.1 As in [29] we also use anchors of multiple aspect ratios {1:2, 1:1, 2:1} at each level. So in total there are 15 anchors over the pyramid.

2.focal loss

论文地址:https://arxiv.org/pdf/1708.02002.pdf
传统的交叉熵损失函数:
在这里插入图片描述
定义pt如下。
在这里插入图片描述
那么公式可以改写为
在这里插入图片描述
我们可以用αt来改进交叉熵公式。
在这里插入图片描述
αt是个(0,1)的数,定义和pt差不多。取α为0.25,当为正样本时α是0.25,权重小,负样本时α时0.75,权重就大一些。

focal loss公式:
在这里插入图片描述
我猜FL是个pt的单调递减函数。γ=1的时候可以证明。p越小FL的权重就越大。
例如当p=0.9,γ=2时,y=1,FL=1/100 * CE
当p=0.5,γ=2时,y=1,FL=0.25 * CE
当p=0.1,γ=2时,y=-1,FL=0.81 * CE

Focal Loss通过调整loss的计算公式使单级结构达到和Faster RCNN一样的准确度,公式是Focal Loss的计算方法。pt是不同类别的分类概率,r是个大于0的值,at是个[0,1]间的小数,r和at都是固定值,不参与训练。r和at的最优值是相互影响的,所以在评估准确度时需要把两者组合起来调节。作者在论文中给出r=2、at=0.25时,ResNet-101+FPN作为backbone的结构有最优的性能。

RetinaNet
RetinaNet is a single, unified network composed of a backbone network and two task-specific subnetworks.
The backbone is ResNet-FPN , construct a pyramid level with levels P3 and P7.
The subnetworks is classification and bbox regression.
Anchor; A=9 and each anchor is k+4 vector.

在这里插入图片描述
这个结构要注意几点:
1、训练时FPN每一级的所有example都被用于计算Focal Loss,loss值加到一起用来训练;
2、测试时FPN每一级只选取score最大的1000个example来做nms;
3、整个结构不同层的head部分(图2的c和d部分)共享参数,但分类和回归分支间的参数不共享;
4、分类分支的最后一级卷积的bias初始化成前面提到的-log((1-π)/π);
这个网络在coco数据集上达到了39.1的mAP。

γ对loss的影响:
在这里插入图片描述
各类算法的比较:

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章