Focal Loss通过在Cross Entropy的基础上引入一个 项,此项可以减小 well-classified 目标 的在总loss中占的比例,使得模型更加关注那些难分类的目标。
目前为止,精度最高的目标检测模型仍然是RNN那一套two-stage的方法,One-stage的方法虽然简单、速度快但是精度上与two-stage的方法差不少。作者认为前景和背景类别的极端不平衡是主要原因。为了验证Focal Loss的有效性还专门设计了一个RetinaNet,其实这里我是不理解的,既然Focal Loss好使,那么在其他模型上应该表现也不错,何必重新设计一个网络?源码地址:
https://github.com/facebookresearch/Detectron.
首先介绍了two-stage方法的流程,第一步生成候选框,第二步确定候选物体在图像中的位置和具体的分类。那么为什么one-stage的模型不行呢,如何改进能达到two-stage的精度?作者认为就是class imbalance,所以作者也是从这里下手的。
class imbalance的问题在RCNN那套模型中是不存在的,经过RPN后会选出候选框过滤掉了大部分背景;在第二个stage,sampling heuristics比如固定比例的前景和背景(1:3)或者OHEM都可以起到平衡前景和背景的作用。
相反的,one-stage检测器必须处理整张图片范围内的所有候选位置,这比two-stage的范围大了很多。相应的作者提出了Focal Loss,使用一个权重调整易分类和难分类目标在Loss中所占的权重。但是Focal Loss的形式并不是统一的,作者接下来会为我们展示几种不同的示例,他们都可以达到相似的效果。
Classic Object Detectors: 介绍了目标检测的发展历史。
Two-stage Detectors: 介绍了RCNN系列的发展历史。
One-stage Detectors: 介绍了One-stage目标检测器的发展历史。
Class Imbalance: 所有经典的one-stage目标检测模型都会遇到class imbalance的问题。这些Detector在每张图片中列举出 个候选区域,但是只有非常少的一部分包含了目标,这种不平衡造成了两个问题:
(1)大部分训练时无效的,因为易识别的背景占据了大部分,它们并不能提供有效的训练信号;
(2)大量的易识别的反例会主导训练,使得模型偏向反例,造成模型退化。
目前常见的解决方式是采用hard negative mining(以后会专门写一篇相关博客)。但是使用Focal Loss就可以避免那么麻烦。
Robust Estimation:设计更加健壮的loss function目前受到的研究人员的注意,比如Huber Loss,可以减弱离群点(outliers)的影响。Focal Loss专注于训练难识别的目标。
3.1 Balanced Cross Entropy
常用的解决class imbalance的方法是引入权重 ,对于正样本我们使用 ,对于负样本我们使用 。所以 -balanced CE写为:
3.2 Focal Loss Definition
虽然上面介绍的平衡CE的方法可以解决类别不平衡的问题,但是并不能区分易分类和难分类目标,即不能使模型更加关注难分类的目标。作者的目标是,重新调整Loss的结构,使得难分类的目标在Loss中占得更大的比例。Focal Loss的形式如下:
在上图中,,Focal Loss特性:
(1)当把正样本错分成背景时,很小,这样权重就会接近1,其所占的loss并不会受到影响;
当把正样本正确识别出来时,很大,这样权重就会接近0,其所占的loss会缩小。
(2) 负责调整易分类目标在 Loss中占的权重,作者通过实验得知时效果最好。
经验上来说,作者仍然采用了 参数平衡各个类别,完整的Focal Loss如下:
不过Focal Loss的形式并不只是这样,在附录中还有介绍了其他类型的。
3.3 Class Imbalance and Model Initialization
一般的分类模型默认初始化为 y=-1 or 1,这两种时等概率的。在类别不平衡的情况下,出现次数多的类别会占据主要部分,这会造成训练前期的不稳定。为了克服这个缺点,作者引入了‘prior’这个概念,用它去寻找模型中少见的类别。使用这种方法可以提高类别严重不平衡时模型训练的稳定性。
3.4 Class Imbalance and Two-stage Detectors
two-stage的目标检测器通过两种机制解决类别不平衡的问题:
(1)两级串联
(2)biased minibatch sampling。
第一个stage实现的时目标推荐功能,可以把候选目标减少到1000个左右,更重要的时在选择候选区域时并不是随机选择的,而是根据可能性进行排序选择的前1000个。在第二个阶段,选择前景和后景的比例也是不同的,我们可以设定为1:3或者1:2,这个有点类似于Focal Loss的 α 参数的作用。
Feature Pyramid NetWork Backbone:
RetianNet 采用 FPN 作为 Backbone。FPN为什么有效呢?简单来说是因为它在原来的ResNet这种基本的卷积网络上增加了top-down通路和lateral通路,所以FPN可以在一张输入图片的基础上构造一个内容丰富、多尺度的特征金字塔。金字塔的每一层特征都会用来检测输入图像不同尺寸的目标。
但是作者所构造的FPN网络与原始的FPN网络有所不同,作者构造的FPN由P3-P7构成( 层的分辨率是输入图像的 ),其中P3-P5是由ResNet的C3-C5计算得到的,P6是由C5使用stride=2的3X3卷积得到的,P7是由P6经过stride=2的3x3卷积得到的,特征金字塔的所有层的Channel=256。与原始的FPN不同之处在于:(1)FPN没有使用P2层;(2)P6是由stride=2的卷积得到的而不是降采样;(3)引入了P7层提升对大尺寸目标的检测效果。
Anchors:
RetianNet 采用了类似于RPN的anchor机制,level P3 到 P7曾anchor的面积从不等,每个anchor有三个比例{1:2, 1:1, 2:1}不等,为了覆盖Dense目标,在每个level中增加了三种面积的的anchor,这种设置的确可以提高模型的精度。
每个Anchor都会有长度为K的one-hot分类目标和4-vector的box回归目标。这与RPN网络是类似的,但是作者做了一些小小的改动:(1)anchor内部包含目标的判断仍然是与GT的IOU,但是这个IOU的阈值设置为了0.5(RPN是0.7);(2)每个anchor被认为只能包含一种目标,如果它与GT的IOU大于了阈值0.5却没有包围任何类别的目标,那么这个Anchor将不会被用来进行训练。
Classification Subnet:
分类子网络预测每个位置上A个anchor中每个anchor对应的类别,每个位置供K*A个可能。这个子网络可以看做是一个小的FCN网络,这个网络连接到FPN金字塔的每一层。分类子网络的参数是被特征金字塔每一层所共享的。子网络由4层3x3的卷积层组成,每个卷积层都使用了Relu激活函数,最后的输出是K*A的one-hot结果。
Box Regression Subnet:
与分类网络并行,box regression子网络是类似的FCN结构,但是他们的权重并不是共享的,但是输出是回归得到相对gt的坐标偏置值(offset)。图像空间每个坐标上都会有A个anchor,每个anchor都会得到相应的偏置坐标。box回归网络和分类网络实现了坐标和类别的解耦。
4.1 Inference and Training
Inference:
为了提高速度,作者只对FPN每层部分predictions进行处理。在FPN的每个特征层上,首先使用0.05的阈值筛选出是前景的物体,最多选取前1k个predictions进行后续的处理。之后融合各层的predictions,再使用NMS(阈值0.5)去掉重叠box。
Focal Loss:
Focal Loss用在分类子网络中。时效果最好,在[0.5,5]范围内相对稳定。作者在训练RetinaNet时,每张图大概100k个anchors都使用了focal loss。这是与heuristic sampling方法(比如RPN)和hard example mining(比如OHEM,SSD)每个mini batch中只选用部分anchor是不同的。一张图片的total focal loss是图片内约100k个anchor的总和,normalized by the number of anchors assigned to a ground-truth box。最后讲述的是如何设置α,α的作用是调节不常见类别的loss在整体loss中占的比例,作者的实验中α=0.25是最好用的。一般来说增大就要相应的减小α。
Initialization:
Optimization:
作者训练RetinaNet只使用了SGD方法,16张图每个minibatch,一共使用了8个GPU,每个GPU2张图。每个模型都是迭代了90k次,初始lr=0.01,在60k次时lr=0.001,在80k次时lr=0.0001。在数据曾广方法中,只使用了图像水平翻转。优化器参数weight decey=0.0001,momentum=0.9。训练的总loss是类别子网络的focal loss和定位子网络的standard smooth L1 loss之和。
未完!