今天看的这篇文章还是物体识别的,链接如下:
Background
对于目标检测来说,比较好的方法主要是Two-Stage的,以R-CNN为例,其中一个Stage负责生成稀疏的候选目标,第二个Stage就负责在各个目标中进行分类(前后背景分离),而One-Stage则是输出一个稠密的proposal,然后丢进分类器中,直接进行类别分类,该方法的结构比较简单,所以速度较快,但较Two-Stage来说,准确率会差些。
Why One-Stage Method not Effective
基于已有的这些知识,就可以提出疑问:单Stage检测器能否达到相似的准确性呢?
首先本文通过观察提出,之所以One-Stage的方法(稠密分类)精度不够好,是因为在稠密检测训练时,前景和背景极度不平衡。且单阶段检测器必须处理一个从图像中均匀采样的超大的候选目标区域集合。且这个集合通常会到达100k的一个数量,密集的覆盖空间位置,尺度和纵横比。比如在PASCAL VOC数据集中,每张图片上标注的目标可能也就几个。但是YOLO V2最后一层的输出是13×13×5,也就是845个候选目标!大量(简单易区分)的负样本在loss中占据了很大比重,使得有用的loss不能回传回来。
相反,类不平衡的问题在双Stage里面不是这么棘手,因为双Stage里有两阶段级联(Two-Stage Cascade)和启发式采样(Sampling Heuristics),比如Selective Search, EdgeBoxes, DeepMask, RPN, 前一个Stage能迅速地将候选目标区域的数量减小到了一个很小的数量(e.g., 1-2k), 这无疑已经过滤掉了大部分的背景区域,而后一个Stage所用的启发式采样,比如固定前后背景比值(1:3)或者在线的困难例子的挖掘(Online Hard Example Mining(OHEM)), 都让前后景样本维持了一定平衡。
基于此,作者将传统的交叉熵损失做了如下变形:
能给那些易于被分类的简单例子小的权重,给不易区分的难例更大的权重。基于此,作者提出了一个新的Loss:Focal Loss和one-stage的检测器RetinaNet,让速度和精度很好地平衡好。
Focal Loss
这个Loss主要是为了解决单Stage方法在训练过程中前后背景类出现的极度不平衡问题而设计的,首先从二分类交叉熵入手(cross entropy(CE)):
其中$y \in\{ \pm 1\}$代表了真值的类,$p \in[0,1]$则代表了为1的可能性估计值,同时定义:
那么$\operatorname{CE}(p, y)=\operatorname{CE}\left(p_{\mathrm{t}}\right)=-\log \left(p_{\mathrm{t}}\right)$
如图所示:
CE loss就是那条蓝色的曲线, 可以发现它的一个显著特点是:即使对于容易分类的样本(pt≫.5)也会引起loss,即便是很小的量级。当大量的简单样本加到一起时,这些小的loss就会吞噬掉较难处理的类。
Balanced Cross Entropy
对于这个问题,通常的解决办法是引入一个权重因子,用$\alpha \in[0,1]$表示类1,用$1-\alpha \in[0,1]$表示类-1,实际中
$\alpha$可能被设置为类的频率的倒数或者被当做是一个由交叉验证所设置的超参数:
Focal Loss Definition
虽然$\alpha$能帮助平衡正负例子,但它不能区分简单和难的例子,所以本文又提出了新的Loss,以便能降低简单例子的权重以便集中训练难的负例子
由上图可以发现,focal loss有以下特点:
当一个例子被误分类了且$p_{\mathrm{t}}$很小时,调节因子将接近1,反之若$p_{\mathrm{t}} \rightarrow 1$,因子将接近0,且那些正确分类的例子的loss的权重会被降低。
Focusing参数$\gamma$能平滑的调节简单例子被调低权重的速度,$\gamma$为0时,FL近似于CE,而当$\gamma$增加时,调节速度将会加快。
直观来看,调制因子会减小正确分类的例子的loss权重,且拓展了会得到低loss的样本的范围。
而最后的Loss还加入了$\alpha$,会比不加稍微好一些:
RetinaNet Detector
RetinaNet Detector是一个单一的且统一的网络结构,由Backbone网络和两个有特定任务的子网络组成,其中Backbone网络负责从整个输入图中,计算出一个卷积的特征图,而第一个子网络负责从主网络的输出中执行卷积的物体识别,而第二个子网络则是本文提出的一个专门为了单Stage的紧密检测(Dense Detection)设计的简单结构。总网络见下图所示:
Feature Pyramid Network Backbone
本文的主网络采用了特征金字塔结构(Feature Pyramid Network(FPN)),它通过使用一个自上而下的结构以及横向连接,让网络能够有效的提取出丰富多尺度的特征。
Anchors
本文使用了与RPN变体(Variant)类似的平移不变的Anchor框,且每个Anchor都附加了一个长度为K的分类目标的One-hot向量(其中K是物体类别数)以及一个4维的边框回归目标。本文使RPN中的赋值规则但修改了阈值以满足类别检测的要求。
而又因为每个Anchor是能赋给最多一个物体框,本文将长度为K的标签向量里的对应entry设为1,而其他entry设为0。如果没有被赋予框的话,训练的时候就直接忽略。
Classification Subnet
针对分类的子网络在每A个anchor和K个目标类中的每个空间位置预测目标出现的概率,这个子网络其实是在每个FPN层上增加一个小的FCN,这个子网络的参数在所有的金字塔层间共享。与RPN相比,本文的目标分类子网络更深一点,且不与另一个子网络共享参数。
Box Regression Subnet
与第一个子网络并行,本文对每个金字塔层都附加了另一个小的FCN,以将每个Anchor框的偏移量(Offset)回归到一个邻近的目标真值。对每A个Anchor的每个空间位置,这四个输出预测了Anchor框的真值之间对应的偏移量。
Initialization
对于一般的分类网络,在初始化之后,其输出的预测结果通常情况下是均等的。但是本文认为,这种初始化方式在类别极度不均衡的时候会对结构产生不利影响。所以本文提出应该初始化模型参数,然后模型输出稀有类别的概率将会变小(如0.01)。本文发现这种初始化方法对于CE和Focal Loss的性能提升都有帮助。
在后续的模型介绍部分,本文较为详细地说明了模型初始化方法。首先,从imagenet预训练得到的base net不做调整,新加入的卷积层权重均初始化为$\sigma=0.01$的高斯分布,偏置项为0。对于分类网络的最后一个卷积层,将偏置项置为$b=-\log ((1-\pi) / \pi)$。这里的π参数是一个超参数,能在训练的初始阶段,增加每个anchor被分类为前景的概率。
这样进行模型初始化造成的结果就是,在初始阶段,不会产生大量的False Positive,使得训练更加稳定。