Focal Loss for Dense Object Detection(RetinaNet)论文及代码解析

@[TOC](Focal Loss for Dense Object Detection(RetinaNet)论文及代码解析)

Focal Loss for Dense Object Detection(RetinaNet)论文及代码解析

本文针对Focal Loss for Dense Object Detection做出自己的判断和解析,不一定代表正确性(鄙人并不做目标检测。。。)
Focal Loss for Dense Object Detection(RetinaNet)论文及代码解析
论文下载链接(arxiv国内镜像):http://xxx.itp.ac.cn/pdf/1708.02002v2
论文代码:https://github.com/yhenon/pytorch-retinanet

论文部分

Motivation

检测分为one-stage和two-stage。two-stage首先检测出粗糙的候选框,然后在这些粗糙的候选框中精确回归候选框的坐标以及长宽。One-stage为了减少检测出粗糙候选框的步骤,为每一个位置都设置一个anchor。然后回归这些anchor的坐标。One-stage的效果明显差于two-stage。作者发现原因在于one-stage的方法样本极度不均衡。而two-stage由于先做了初步筛选,样本不均衡程度得到改善。

Methods

Focal Loss

原本交叉熵损失函数表示为:
Focal Loss for Dense Object Detection(RetinaNet)论文及代码解析
为了简化,
Focal Loss for Dense Object Detection(RetinaNet)论文及代码解析
公式简化为:
Focal Loss for Dense Object Detection(RetinaNet)论文及代码解析
由于最终分类损失函数等于所有候选框的交叉熵损失函数的总和,尽管背景物体loss低,但是他们数量多,当多到一定程度,这些背景的损失函数就会占据最终分类损失函数优化的大部分边界框,模型难以对需要处理的前景物体做优化。
为了降低背景物体的交叉熵损失函数在总损失函数中的比重,利用损失函数的数值大小对需要优化的损失函数赋以不同权重。具体表示为:
Focal Loss for Dense Object Detection(RetinaNet)论文及代码解析
下图显示了损失函数值随γ变化曲线为:
Focal Loss for Dense Object Detection(RetinaNet)论文及代码解析
对于背景区域,分类器有非常大置信度认为它是背景,所以背景区域属于上图中的well-classified examples。当γ等于0,我们发现这个区域损失函数值比较大。而随着γ增大,这个区域损失函数值逐渐减小。也就说明随着γ值变大,背景区域的损失函数占总体损失函数的比例在下降。模型能够更加注意硬样本(硬样本表示对损失函数的优化有意义的样本,例如在该样本下的损失函数较大,上图左边区域)。

RetinaNet

粗略讲完focal loss,我们关注RetinaNet。
论文中贴图为:
Focal Loss for Dense Object Detection(RetinaNet)论文及代码解析
简单叙述表示为:
对ResNet做处理,采用特征金字塔网络架构。而后特征金字塔每一层(每一个尺度)都接两个子网络,分别做分类和回归任务。
其中在class subnet中,输出WxHxKA(A表示anchor数目,K表示类别总数目),表示为每一个空间位置对应的anchor预测类别(如果对anchor不熟悉,请关注链接1链接2
在box subnet中,输出WxHx4A,表示为每一个空间位置对应的anchor回归边界框。
通过代码理解,整体的流程图为:
Focal Loss for Dense Object Detection(RetinaNet)论文及代码解析
于是,对于所有anchor,先利用真值筛选出符合条件的anchor,对这些符合条件的anchor(边界框)做分类和回归任务。

代码

困了,未完待续。。。