RetinaNet 是通过对单目标检测模型 (如 YOLO 和 SSD) 进行两次改进而形成的:
1.Feature Pyramid Networks for Object Detection (https://arxiv.org/abs/1612.03144)
2.Focal Loss for Dense Object Detection (https://arxiv.org/abs/1708.02002)
RetinaNet只是原来FPN网络与FCN网络的组合应用,因此在目标网络检测框架上它并无特别亮眼创新。文章中最大的创新来自于Focal loss的提出及在单阶段目标检测网络RetinaNet(实质为Resnet + FPN + FCN)的成功应用。Focal loss是一种改进了的交叉熵(cross-entropy, CE)loss,它通过在原有的CE loss上乘了个使易检测目标对模型训练贡献削弱的指数式,从而使得Focal loss成功地解决了在目标检测时,正负样本区域极不平衡而目标检测loss易被大批量负样本所左右的问题。此问题是单阶段目标检测框架(如SSD/Yolo系列)与双阶段目标检测框架(如Faster-RCNN/R-FCN等)accuracy gap的最大原因。
在Focal loss提出之前,已有的目标检测网络都是通过像Boot strapping/Hard example mining等方法来解决此问题的。作者通过后续实验成功表明Focal loss可在单阶段目标检测网络中成功使用,并最终能以更快的速率实现与双阶段目标检测网络近似或更优的效果。
Focal Loss
Focal Loss为了同时调节正、负样本与难易样本,提出了如下所示的损失函数。
其中
用于控制正负样本的权重,当其取比较小的值来降低负样本(多的那类样本)的权重;
用于控制难易样本的权重,目的是通过减少易分样本的权重,从而使得模型在训练的时候更加专注难分样本的学习。文中通过批量实验统计得到当
时效果最好。
可以看出,对于Focal loss损失函数,有如下3个属性:
是为了调节难易样本的权重。当一个边框被误分类时,pt较小,则
接近于1,其损失几乎不受影响;当pt接近于1时,表明其分类预测较好,是简单样本,
接近于0,因此其损失被调低了。
RetinaNet
为了验证Focal Loss的效果,何凯明等人还提出了一个一阶物体检测结构RetinaNet,其结构如下图所示。
RetinaNet的框架整体是ResNet+FPN+FCN,它使用ResNet作为backbone来提取图像特征,然后从中抽取5层特征层来构建特征金字塔网络(FPN: feature pyramid network),最后接两个独立的全卷积网络(FCN: full convolution network)分别得到物体的类别信息和位置框信息。
△ RetinaNet框架
对于RetinaNet的网络结构,有以下5个细节:
(1)在Backbone部分,RetinaNet利用ResNet与FPN构建了一个多尺度特征的特征金字塔。
(2)RetinaNet使用了类似于Anchor的预选框,在每一个金字塔层,使用了9个大小不同的预选框。
(3)分类子网络:分类子网络为每一个预选框预测其类别,因此其输出特征大小为KA×W×H, A默认为9, K代表类别数。中间使用全卷积网络与ReLU激活函数,最后利用Sigmoid函数输出预测值。
(4)回归子网络:回归子网络与分类子网络平行,预测每一个预选框的偏移量,最终输出特征大小为4A×W×W。与当前主流工作不同的是,两个子网络没有权重的共享。
(5)Focal Loss:与OHEM等方法不同,Focal Loss在训练时作用到所有的预选框上。对于两个超参数,通常来讲,当γ增大时,α应当适当减小。实验中γ取2、α取0.25时效果最好。
含FPN特征金字塔的backbone
将深层信息上采样,与浅层信息逐元素地相加,从而构建了尺寸不同的特征金字塔结构,性能优越,现已成为目标检测算法的一个标准组件。FPN的结构如下所示。
△ 特征金字塔FPN结构
原始的ResNet共有4个stage,其得到的特征分别记为,相较于输入图像,它们的stride分别为。
FPN的构建从开始,首先采用一个1x1卷积得到channel为C(FPN中取256,FPN中所有level的channel都是一样的)的新特征,然后就可以自上而下生成不同level的新特征,分别记为,与ResNet的特征是一一对应的,另外对直接采用一个stride=2的下采样得到一个新特征(基于stride=2的1x1 maxpooling实现),这样最后FPN实际上得到了5个不同level的特征,其stride分别为,特征维度均为C。
Faster R-CNN是采用这样的FPN结构,但是RetinaNet却有稍许变动,第一点是只用ResNet的,这样通过FPN得到的特征是,相当于去掉了,的stride是4,特征很大,去掉它可以减少计算量,后面会讲到RetinaNet的anchor量和detection head都是比RPN更heavy的,这很有必要。另外新增两个特征和,在上加一个stride=2的3x3卷积得到,是在后面加ReLU和一个stride=2的3x3卷积得到。
这样RetinaNet的backbone得到特征也是5个level,分别为,其stride分别为。一点题外话就是FCOS的backbone也是取,也算是借鉴了RetinaNet。而YOLOV3的backbone是基于DarkNet-53的FPN,其特征共提取了3个层次,stride分别是。
RetinaNet性能
作者选择了特征提取能力极强的Resnet作为backbone,然后借鉴了FPN的思想,对多尺度特征进行了强化利用,从而得到了表达力更强、包含多尺度目标区域信息的feature maps集合,对小目标物体也能达到一个良好的检测精度。
同时结合上述提到的Focal Loss机制和单阶段模型的设计,使得RetinaNet在检测精度和前向速度上都达到了一个很高的水准,如下图所示。采用ResNeXt-101-FPN作为backbone,最终能在COCO test-dev数据集上达到40.8 mAP值。
△ RetinaNet与其他模型在COCO数据集上的检测精度
△ RetinaNet与其他单阶段模型的速度对比
最后总结一下RetinaNet与其它同类模型的对比:
对比之后,其实发现基于anchor的one stage检测模型差异并没有多大。