文章17
标签11
分类1

TridentNet总结

论文标题: Scale-Aware Trident Networks for Object Detection
论文地址: 传送门

Abstract

尺度差异(Scale variation)是目标检测的关键问题之一。本文对目标检测中关于尺度差异的有效感受野进行了调研,同时提出了TridentNet,它可以使用统一的表示方式产生尺度相关的特征图。
TridentNet采用了一种并行多分支结构,每个分支共享参数但是具有不同的感受野。然后采用了一种尺度相关训练策略,从而使每一个分支对合适的样本进行采样。同时,TridentNet还有fast版本,即多分支训练,仅采用单个分支测试,其精度损失很低但是速度有所提升。
在COCO上TridentNet+ResNet101达到了48.4 mAP。

Introduction

DCN在目标检测领域取得了巨大的成功,如one-stage的YOLO、SSD,two-stage的Faster R-CNN、R-FCN,然而尺度问题一直都是一个很严重的问题,尤其是对非常小或者非常大的目标。

为了解决尺度问题,最早的就是使用图像金字塔的形式,如SNIP(ER)提出了一种尺度归一化的方法,对每个尺度选择合适的输入影像,然而图像金字塔耗费时间太多了。

另一种方法就是构建网络内的特征金字塔,如SSD、FPN。然而这些不同尺度的特征来自不同的层中,使得其并不能取代图像金字塔。

这两种方法都是基于:不同尺度的物体有不同的感受野。尽管图像金字塔并不高效,但是其能够对所有尺度的物体平等的进行变换。相反,特征金字塔的不同尺度破坏了特征的连续性,这导致有效训练数据的减少和更高的过拟合风险。

本文的工作就是将两者的优点结合起来,使其能够高效的产生一种对所有尺度具有统一表示能力的特征。(即三个分支使用相同的参数,但是有不同的感受野,从而可以识别大小不同的物体;而FPN是不同的参数识别不同的物体,这样的话同一种物体是有不同的参数来识别的,并不统一)。在本文中,相比于输入多尺度的图像金字塔,我们提出了一种新的网络结构来处理多尺度。

实际上,我们通过Trident Block输出多尺度的尺度相关(scale-specific)特征图(图1c)。通过空洞卷积(dilated convolutions),不同的分支共享网络结构和网络参数,但是具有不同的感受野。

此外,为了防止训练无穷尺度的物体,我们采用了一种尺度相关的训练策略,使得每一个branch匹配特定的感受野。

最后,由于不同分支共享权重,因此在inference时可以只使用一个分支,这样精度并没有下降很多,但是速度有所提升。

Investigation of Receptive Field

backbone的许多因素可以影响检测器的效果:下采样率、网络深度、感受野。前两者已经有很多工作去证明:深层的网络、较小的下采样率可以提高检测的效果。但是很少有人单独地研究过感受野对检测器的影响。为了研究感受野对不同尺度物体检测的影响,我们使用空洞卷积替换了backbone的部分卷积层,并通过不同的dilation rate 控制感受野大小。

上表表明,随着感受野增大,小目标的检测效果在ResNet50和ResNet101上都有所下降。然而对于大的目标,随着感受野的增加,检测效果有所提升。这个实验可以说明:

  1. 不同尺度物体的检测效果与有效感受野有关。
  2. 尽管ResNet的感受野已经很大了,但是通过增加dilation rates,大物体的检测效果还可以有所提升。
    也就是说,和SSD、FPN一样,感受野对不同尺度目标的检测具有很重要的作用,通过控制感受野可以更加有效的检测目标。

Trident Network

TridentNet包括trident block和scale-aware 训练方法。

Network Structure

TridentNet的目标是利用控制感受野进行检测的策略,同时克服其缺点。其网络结构如下图。

TridentNet的大致结构是:图像通过backbone提取特征,接着送入三个并行的Trident block当中,然后每个block都单独输出检测结果,最后统一通过nms输出结果。其中每个trident block都是一些卷积层和dilation层组成,且三个block共享参数。

Multi-branch Block Trident Block其实就是将ResNet中的bottleneck进行修改,将一个branch改为3个branch,这三个branch共享参数,但是其中$3 \times 3$的conv层有不同的dilation rates,分别为1,2,3。一般情况下,Trident block仅在backbone的最后一层添加。

Weight sharing among branches 一般情况下,多分支参数有可能导致过拟合。但由于三个分支共享参数,所以并不会出现过拟合。

Scale-aware Training Scheme

TridentNet的不同分支产生具有不同感受野的特征图,根据前面对感受野的研究,不同感受野对不同尺度目标检测效果也不同,因此可以将不同尺度的目标分配在不同的特征图上。

与SNIP相似,TridentNet为每个分支$i$定义了一个一个有效区间$[l_i,u_i]$。在训练的过程中,我们只选择尺度合适的proposals和gts。对于一个$(w,h)$的图像,对它有效的branch $i$上有:
$$l_i \leq \sqrt{wh} \leq u_i$$
这个策略对RPN和R-CNN都有效,对于RPN,在anchor label assignment时s我们仅选择合适的gts,相同的,在R-CNN时也仅选择合适的proposals。

Inderence and Approximation

在inference时我们将所有branch的结果合并起来,然后通过nms或者soft-nms和并输出结果。

Fast Inference Approximation 由于TridentNet多分支的缘故,其Inferencee的速度较慢,因此提出了TridentNet Fast,即仅取三个Trident block中间的分支作为输出。同时发现,fast版本的精度并没有下降多少。这主要是由于权重共享策略,multi-branch相当于网络内的数据增强。

Experiments

训练数据:trainval35k
验证数据:minival
测试数据:testdev

Implementation Details

  • backbone是在ImageNet上预训练的,stem、first residual stage all BN 的参数被*冻结。
  • 输入图片尺度的短边缩放到800。Random horizontal flip is adopted during training。
  • batch size is 16 on 8 GPUs。
  • Models are trained in 12 epochs with learing rate from 0.02 and decreased by a factor of 0.1 after 8th and 10th epoch.
  • $2 \times $ or $3 \times$ 即2倍或者3倍训练epoch和learning rate schedules。
  • TridentNet中的每一个branch,top 12000/500 proposals被用在NMS前/后,然后采样128 ROIs for training。
  • dilation rates分别为1,2,3.
  • scale-aware scheme中有效区间为:$[0,90],[30,160],[90,∞]$

Ablation Studies

Component of TridentNet

Number of branches

Stage of Trident blocks

Number of trident blocks

Performance of each branch

Comparison with State-of-the-Arts

Compare with other scale handling methods

Summary

总体来说,TridentNet是一个simple but work的工作。

目前用的最多的FPN,其通过不断地卷积来调整感受野,实现在多层特征上的预测,利用更多的信息。但是FPN上不同的实例被分配到不同的层上,而不同层有不同的参数,这就导致同一个类别的物体是通过两个层上来预测的,并不是一种统一的表示,而图像金字塔如SNIP对图像进行简单的缩放即可达到很高的精度,说明了图像金字塔的优势。但图像金字塔的速度较慢。

作者通过对有效感受野的研究,发现不同的感受野适应于不同尺度的目标。因此很自然的想到通过控制感受野实现多尺度的预测,即利用空洞卷积,设置不同的dilation rates。

为了克服FPN的缺点,TridentNet的block共享权重,从而使得相同的参数,通过调整感受野,实现对不同尺度目标的检测,因此是一种更加统一的特征表示方式。

由于其共享参数的特点,其在预测时仅使用一个branch即可达到较好的效果。

Faster R-CNN细节详解

论文题目:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
论文地址:传送门

这学期刚开学的时候,重新读了遍R-CNN系列,但当时仍然是浅尝辄止,许多东西还不懂。这是当时写的R-CNN系列总结,基本就是照着论文翻译,但其实现细节也是很久之后才懂的。

最近在尝试旋转框的检测,需要将Faster R-CNN的Horizontal BBOX改为Oriented BBOX,这才发现自己对其细节理解的不够深刻,同时代码能力也不够。

经过半个月的摸索,虽然旋转框还没有跑起来,但代码能力似乎提高了不少,对检测流程、检测框架有了较多的了解。

重读Faster R-CNN,才发现作者的设计真的是非常的严谨。

Introduction

事实上,Fast R-CNN已经够快了,将R-CNN上通过crop对应Region的图像块,调整为crop对应Region的特征块,即从feature map上crop出对应特征,并剔除ROI Pooling,使得特征的输入更加平稳。

至此,只有Region Proposal的部分仍然使用传统的方法,如Selective Search,耗费了大量的时间,且不符合NN的自动提取特征。因此作者就思考,能不能在feature map上提取region proposal?

为此,Faster R-CNN最突出的贡献就是提出了RPN(Region Proposal Network),而RPN也成为了Det中奠基石的一部分。

而在Faster R-CNN的实现当中,如果实现了RPN,其实就实现了其80%。

Region Proposal Networks

RPN对于任意尺寸的输入图像,可以输出其矩形的Region Proposals,每个Proposal都有一个score。其示意图如图一所示。

RPN是一个全卷积网络,其输入是某一尺寸为$H \times W \times N$的特征图,输出是$H \times W \times 2k$的scores和$H \times W \times 4k$的坐标。

具体来说,我们将$H \times W \times N$的特征图,通过一次卷积得到$H \times W \times N_1$的特征图($N_1$可以是256、512等),然后再分别送入两个分支网络当中,其中的分类(cls)分支得到$H \times W \times 2k$的特征图,回归分支得到$H \times W \times 4k$的特征图。其中$k$是特征图上每个点的anchor数量,本文设置为$k=9$。

Translation-Invariant Anchors

那么anchor是什么东西呢?其中文意思是锚点,(个人理解)在Det中一般指的是在某个位置上设置的“锚”,也就是预设的目标。如上图中$k$个anchor具有不用的尺寸和长宽比。

这里是怎样实现Translation-Invariant呢?其实就是在每个点设置$k$个anchors,从而可以得到$k$个Region Proposals(RP),且这$k$个RP相对于anchors是参数化的,也就是其$(x,y,h,w)$是相对于anchor的$(x,y,h,w)$的。

具体来说,本文选取$k=9$,其中包括3个scale、3个ratio,$scales=128,256,512$,$ratios=2:1,1:1,1:2$。两者组合起来即有9种anchors。
这样的话,对于$H \times W$的特征图,将会有$H \times W \times 9$个anchors。

Loss Function for Learning Region Proposals

为了更清晰的说明,贴上具体实现过程中,Faster R-CNN的示意图,图片来自这里

由于RPN只需要判断objectness,而不需要判断类别,因此在训练RPN时,只需要gt_boxes,而不需要gt_labels。

首先我们根据特征图的大小$H \times W$,可以预设$H \times W \times k$个anchors,每个anchor都可以表示为$(x_a,y_a,w_a,h_a)$,其中$x_a,y_a$为其中心点坐标。那么这些anchors当中有许多都是没有gt_boxes与其对应的,这样的anchors在后面的box回归当中也很难收敛,因此我们需要从这些anchors当中选取一些与gt_boxes重叠较大的anchors。Positive anchors的选择原则:

  1. 和gt_boxes有最大重叠的anchors
  2. 和任一gt_boxes重叠超过0.7的anchors

因此一个gt_boxes可能有多个anchors与其对应,负责其box回归。那么negative anchors被定义为IOU小于0.3的anchors,其他的anchors则被忽略。

其Loss Function定义如下:

其中$i$是一个mini_batch中anchor的索引,$p_i$是anchor $i$的objectness预测值,$p_i^*$是对应的gt,$p_i^*=1$时为positive,$p_i^*=0$时为negative。其中$L_{cls}$为log loss。

$t_i$为预测的box的参数化表示,相应的$t_i^*$为gt。$L_{reg}(t_i,t_i^*)=R(t_i-t_i^*)$。其中$L_{reg}$为Smooth L1 Loss。

$p_i^*L_{reg}$表示只对positive anchor进行回归,忽略negative。

我们前面所说的参数化表示,如下式所定义:

其中$x,x_a,x^*$分别为预测值、anchor、gt_boxes。

到这里文章所要表达的内容似乎清晰多了。检测的主要任务是cls和reg,而reg需要预测物体的坐标,但直接让一个网络预测坐标是比较困难的。
因此作者设计了anchor这个东西,即在每个位置都预设一些“锚点”,我们不直接预测坐标,而是预测gt_boxes与anchors之间的偏移量。
同时由于物体的大小、长宽比各不相同,因此在每个位置设置多个不同scale,不同ratio的anchor,每种anchor负责相近尺寸目标的回归。

当网络学习到这种偏移量规则后,我们再将偏移量转为coordinates,从而实现box预测。

当然,由于每个位置有$k$个anchor,且是人为设计的,因此后面有许多工作对此进行改进,甚至是取消anchor这个机制,如FSAF、FCOS等。

Optimization

经过anchor的选取后,我们有许多positives和negatives,我们可以直接对其进行训练,然而由于negatives的数量远超过positives,从而会导致class imbalance的问题。因此在RPN中会有一个样本选择的过程,即我们共选取大约256个样本,其中正样本128个,负样本128个。如果正样本$s_{pos}<128$,则仅选取$s_{pos}$个正样本,那么负样本即选取$256-s_{pos}$个;若正样本$s_{pos}>128$,则随机选取128个样本,负样本也是同样的规则。

Sharing Convolutional Feaetures for Region Proposal and Object Detection

即RPN和Fast R-CNN共享同一个backbone的feature map,然后两者依次交叉训练,但后来实验表明,直接对两者联合训练的效果也非常好。

当RPN与Fast R-CNN结合时,其作用是为Fast R-CNN提供Region Proposals,也就是取代了Selective Search的作用。因此其输出有3个:cls_loss,reg_loss,region proposals。

由于这些region proposals有很大的重叠,会造成冗余,因此我们根据其cls_score进行NMS(threshold=0.7),选取大约2000k region proposals。然后我们再选出top-N个regions用于检测。

Experiments

Ignored

Conclusion

在CV如此快速发展的今天,Faster R-CNN从15年提出,到现在19年底依然是非常流行的检测框架,足以见其重要性,接下来我们重新实现下Faster R-CNN,同时形成自己的一套代码风格。

FSAF:Feature Selective Anchor-Free Module for Single-Shot Object Detection

论文名称:Feature Selective Anchor-Free Module for Single-Shot Object Detection
论文地址:传送门

Abstract

本文提出了Feature Selective Anchor-free(FSAF)模块,它是一个用于一阶段检测器的极其简单的building block,可以加入到任何有FPN结构的模型当中。

FSAF主要解决anchor-based+FPN当中的两个问题:

  1. 启发式特征选择(heuristic-guided feature selection)
  2. 基于重叠面积的样本选择(ovelap-based anchor saampling)

FSAF模块基本的概念是应用在训练过程中的多层anchor-free分支。具体来说,一个anchor-free分支被应用在FPN的每一个层上。在训练过程中,我们动态的将实例(instance)分配给最适合的特征层。在测试时,FSAF可以和anchor-based分支联合输出预测结果。

试验结果表明,FSAF在COCO数据集上比anchor-based的检测器精度更高且速度更快。在和anchor-based分支一起工作时,FSAF可以稳健的提升Retinanet的baseline。最后,加入FSAF的最好的模型在COCO上可以达到44.6%的mAP。

Introduction

目标检测当中一个很有挑战性的问题就是尺度差异(scale variation)。为了实现尺度不变,SOTA的方法都采用FPN的结构。如下图所示,可以看到40和50被分在了同一层,而60被分在另一层。

而FSAF出发点就是让每个实例选择最好的feature level来优化整个网络。具体来说,在anchor-based detector当中,每个实例的分配是人为设计的,而我们通过FSAF可以去学习这些参数,从而将实例分配到最适合的feature level上。如下图所示。

在FPN的每个level上都有一个anchor-free的分支,每个分支包含一个分类子网络和回归子网络。一个实例被分配到anchor-free的每一个分支,在训练的过程中,我们动态的选择最适合这个实例的level,而不是简单的根据其bounding box分配到一个层。在测试时,FSAF可以和anchor-based分支一起预测。

此外,FSAF也可以被应用在使用FPN的Single-Stage detector当中。

Feature Selective Anchor-Free Module

Network Architecture

RetinaNet和FSAF的网络结构如上图所示。可以看出,FSAF的结构极其简单。RetinaNet可以看作一个backbone和两个分支网络,一个cls,一个reg。而FSAF则是在cls和reg分支上分别添加一个anchor-free分支,同样的,在cls上的分支负责分类,在reg上的分支负责回归。

具体来说,FSAF在每个feature level引入了两个额外的卷积层。每个卷积层都是通过$3 \times 3$的卷积核实现的,对于cls分支则有K个卷积核,其中K为数据集类别;对于reg分支,则有4个卷积核,对应四个坐标值。

Ground-truth and Loss

对于一个实例,我们知道它的类别$k$和坐标$b=[x,y,w,h]$。
$b_p^l=[x_p^l,y_p^l,w_p^l,h_p^l]$ 是$b$在特征金字塔的$l$层$P_l$上的映射。
$b_e^l=[x_e^l,y_e^l,w_e^l,h_e^l]$ 是有效框,表示一个框的中心位置,如下图的白色区域。
$b_i^l=[x_i^l,y_i^l,w_i^l,h_i^l]$ 是忽略框,如下图灰色区域。
对于一个框内其他部分则被作为负样本,其值都是0.

在本文中,设定了有效框的范围为0.2,忽略框的范围为0.5.

Classification Output

cls分支的输出是K个分类图,每个图对应一个类别。我们对ground truth map有以下定义:

  1. 有效框(上图白色区域)的值为1
  2. 忽略框(灰色区域)的值不会回传到网络当中
  3. 相邻特征图的忽略框也是此特征图的忽略区域。

loss选择Focal Loss,cls总的loss是所有有效框的和,并使用像素总数进行normalize。

Box Regression Output

回归的ground truth是与类别无关的4个offset maps。对于有效框内的一个像素点$(i,j)$,我们定义$d_{i,j}^l=[d_{t_{i,j}}^l,d_{l_{i,j}}^l,d_{r_{i,j}}^l,d_{b_{i,j}}^l ]$,分别表示点到框四边的距离。有效框外的区域被忽略。loss选择IOU Loss,总的回归Loss所有有效框的平均值。

在inference的时候,可以直接解码出bbox和class,每个框的分数可以从classification map中得出。

Online Feature Selection

FSAF的出发点就是通过学习选择出最适合每一个实例的特征层,而不是根据框的大小直接分配。对于一个实例$I$,我们定义其分类Loss和回归Loss分别是$L_{FL}^I(l)$和$L_{IoU}^I(I)$。($l$表示FPN中的$l$层)
$$\begin{aligned} L_{F L}^{I}(l) &=\frac{1}{N\left(b_{e}^{l}\right)} \sum_{i, j \in b_{e}^{l}} F L(l, i, j) \ L_{I o U}^{I}(l) &=\frac{1}{N\left(b_{e}^{l}\right)} \sum_{i, j \in b_{e}^{l}} L_{IoU}(l, i, j) \end{aligned}$$
其中$N(b_e^l)$表示$b_e^l$中的像素总数。

上图表示在线特征选取的过程。每个实例都通过所有feature level的anchor-free分支,然后计算每一层总的Loss,最后将实例分配到Loss最小的那一层。
$$l^{*}=argmin_{l} (L_{F L}^{I}(l)+L_{I o U}^{I}(l))$$

对于一个训练的batch,features负责的实例被更新。其目的是选择最适合这个实例的特征。通过训练,我们可以进一步提高其下界(也就是说,无论其被分配到哪个层,都有较好的检测效果)。在测试的时候,我们不需要选择特征,因为最适合的特征层可以输出较高的置信度。
有个问题:刚开始训练的时候,某个实例被分配的特征层应该会不断地移动吧?

Joint Inference and Training

FSAF可以和RetinaNet一起工作。在Inference时,FSAF分支的输出结果也可以解码出bbox,我们经过置信度0.05后,在每一个feature level上选择1k个top-scoring locations,然后和anchor-based branch一起使用NMS进行筛选。

优化: 整个网络的Loss包括anchor-based的和anchor-free的。
$$
L=L^{a b}+\lambda\left(L_{c l s}^{a f}+L_{r e g}^{a f}\right)
$$
本文将$\lambda$设置为0.5。整个网络使用SGD,在8块GPU上训练,每个GPU两张图像。

Experiments

整个实验在COCO上进行,训练数据是COCO trainval35k,包含来自train的80k图像,和来自val的35k图像,测试时使用minival的5k图像,在比较精度时,使用的是test-dev。

Ablation Studies

Anchor Free branches are necessary. FSAF更擅长哪些具有挑战的物体,如小物体,特别瘦长的物体及那些不能被anchor boxes覆盖的物体。

Online feature selection is essential. 可以看到FSAF也遵循大的目标分配在高层,小的目标分配在底层的规则,然而FSAF和RetinaNet检测的也有些许的不同。

FSAF module is robust and efficient.

Comparison to State of the Art

Conclusion

FSAF在FPN特征选层这个问题上做了深入的探讨,并通过加入很小的head,实现了动态的分配实例,而不是根据其尺寸进行分配,因而进一步提升了精度,却没有引入多少计算量。

另外刚好最近读了FCOS,发现两者还是有很大的相似之处。不同的是FSAF是将FCN加入到RetinaNet当中,而FCOS是加入center-ness,直接使用FCN。

FCOS中center-ness的效果

FSAF精度

FCOS精度对比

有没有觉得,FCOS比FSAF高的那3.6(41.5-37.9)是从center-ness中来的?
接下来我也会实验一下,看看FSAF+center-ness的效果怎么样。

FCOS:全卷积一阶段目标检测模型

论文名称:FCOS: Fully Convolutional One-Stage Object Detection
论文地址:传送门

Introduction

目前主流的目标检测模型如Faster R-CNN,SSD,YOLO都需要预设一些anchor。
虽然他们的效果都不错,但是它们有一些缺点:

  1. 检测效果对参数敏感,如anchor的sizes,ratios,numbers
  2. 因为其anchor的设计是固定的,对于有较大差异的图像,尤其是小目标的检测效果并不好。
  3. 为了达到检测效果,anchor boxes过多,如短边800的图像在FPN中将产生180K anchor boxes。
  4. IoU计算耗时。

基于FCN的方法在语义分割等任务上取得了很好的效果。由于anchor的使用,目标检测到目前还没有从FCN中受益。

之前采用FCN进行检测的工作主要集中在特定的领域,如Face detection,Text Detection,主要是FCN在Generic Object Detection上效果并不好。主要原因是:以FCN方式检测时很难处理物体的重叠问题。

在本文中,作者采用FPN,很大程度上解决了重叠所造成的ambiguity。
同时由于本文的方法产生了很多远离目标中心的低质量的点,因此作者提出了“centerness”的概念,来衡量点接近目标中心的程度。通过“centerness”,越靠近中心的点,权重越高,远离中心的点,则权重降低。

Implement Details

FCOS模型示意图

如上图模型,可以看出FCOS的结构确实十分的优雅,输入一张影像,输出三个branch:classification,centerness,regression,且每个branch的大小都是对应featmap的尺寸$H \times W$.

Fully Convolutional One-Stage Object Detector

首先有一些定义:
$F_i \in R^{H \times W \times C}$: CNN产生的第i个featmap
$B_i = (x_0^i,y_0^i,x_1^i,y_1^i,c^i) \in R^4 \times {1,2 \dots C}$: 图像的ground-truth bounding box。
$s$: 当前featmap与输入图像间总共的strides。

对于$F_i$上的一个点$(x,y)$,我们可以直接映射到原图像的$([\frac{s}{2}]+xs,[\frac{s}{2}]+ys)$。
相较于传统基于anchor的检测方法,FCOS直接将每一个点当作训练样本。换句话说,在基于anchor的检测方法中,每一个anchor box从featmap上抠出来,然后通过cls和reg,得到类别和坐标;而FCOS直接将每个点当作样本,featmap上的每个点都能产生一个类别和预测一个box,也就是所谓的semantic segmentation style。

具体来说,对于classification任务,如果一个点落在了一个ground-truth box内,那么它就是正样本,类别$c^*$为ground-truth box的类别;如果其落在box外,那么$c^*=0$。

同时还有regression任务。每个点都定义一个4D向量,$t^*=(l^*,t^*,r^*,b^*)$,其中$l^*,t^*,r^*,b^*$分别为此点到它所在gt_box的四边的距离。

如果一个点落在了多个gt_box内,则其被称为ambiguous sample,则选择最小面积的哪个gt_box作为回归的目标。在下一部分我们会看到FCOS使用FPN来解决这个问题。

即如果一个点$(x,y)$落在了$B_i$中,那么回归目标可以定义为:
$$l^*=x-x_0^i,t^*=y-y_0^i,r^*=x_1^*-x,b^*=y_1^*-y$$

Network Outputs. 如上图模型示意图,模型最后输出一个80D的classification vector,一个4D的coordinates vector。

Loss Function.
$$L({p_{x,y}},{t_{x,y}})= \frac{1}{N_{pos}} \sum_{x,y} L_{cls}(p_{x,y},c_{x,y}^*) + \frac{\lambda}{N_{pos}} \sum_{x,y} 1_{c_{x,y}^*>0} L_{reg}(t_{x,y},t_{x,y}^*)$$

其中$L_{cls}$为Focal Loss,$L_{reg}$为IOU Loss。

inference. 对于一张输入影像,直接输出每个featmap的$p_{x,y}$和$t_{x,y}$,然后选择出$p_{x,y}>0.05$的样本作为正样本,接着从$t$中反解出bounding box。

Multi-level Prediction with FPN for FCOS

FCOS采用FPN来解决FCN目标检测中存在的重叠问题。

在构建FPN时,FCOS共定义了5个level,${P_3,P_4,P_5,P_6,P_7}$. 其中${P_3,P_4,P_5}$是有CNN的${C_3,C_4,C_5}$产生的。${P_6,P_7}$是分别在${P_5,P_6}$上添加一个步长为2的卷积层产生的。至此,${P_3,P_4,P_5,P_6,P_7}$的步长分别为8,16,32,64,128.
作者之所以不采用原FPN中的$P_2$,可能是$P_2$特征较浅,效果不好,且参与运算的样本更多。

我们知道FPN与Fast R-CNN结合时,是将RPN的anchor根据大小分配到不同level的featmap上,而在FCOS中,作者也将点分配到不同的level上,同时又解决了重叠的问题。

首先,点在不同level分配的原则时:根据回归距离的大小。也就是回归距离小的点分配到底层如$P_3$,而回归距离较大的层则分配到顶层如$P_7$。具体来说,如果:
$$max(l^*,t^*,r^*,b^*)>m_i$$
或者
$$max(l^*,t^*,r^*,b^*)< m_{i-1}$$
那么这个样本被定义为负样本,不参与box回归。其中$m_2,m_3,m_4m_5m_6$被设置为0,64,128,256,512和∞。

由于小目标被分配在了不同的层,因此重叠问题很大程度降低了。如果此时还有多个box重叠,那么取最小面积的哪个作为回归目标。

Center-ness for FCOS

尽管使用了FPN,但是FCOS和anchor-based detector之间仍存在精度差异。作者认为其是由于FCOS产生了大量的低质量的远离目标中心的点导致的。因此作者定义了一个centerness,根据目标与回归中心的距离,为不同的点赋予不同的权重。其定义如下:

$$centerness^* = \sqrt(\frac{min(l^*,r^*)}{max(l^*,r^*)},\frac{min(t^*,b^*)}{max(t^*,b^*)})$$

使用sqrt主要是为了降低centerness的decay。centerness的范围为$[0-1]$,使用BCE Loss。
在训练时,$L_{center}$和$L_{cls}$,$L_{reg}$一起训练;在测试时,centerness_score与cls_score相乘,然后在排序筛选出得分较高的box。

Summary

总的来说FCOS还是十分的work的,与Faster R-CNN相比,模型的结构也十分的优雅。
刚接触Detection时我也在想为什么不用Segmentation的方式进行检测,主要原因是物体的重叠问题,而FCOS使用FPN很大程度解决了这个问题。
同时作者提出的Centerness可以减少low-level的点,在预测时可以较少错误检测。

但是相比于其他模型的输入300300,FCOS直接使用8001024的图像,精度自然会高许多,然后还有GN等tricks。
同时每次训练时得到target也挺耗时的,不过知乎有大佬指出可以把这部分放在data_loader里。

如果想要改进的话,感觉还可以从FCN导致的重叠做起,找到一种较为完美的解决重叠的方法。
看到Github已经有issue问是否要做instance segmentation,作者说已经在做了。去arxiv找了下,商汤已经有人做了PolarMask

CornetNet && CenterNet && RepPoints 模型总结

CornerNet

论文名称:CornerNet: Detecting Objects as Paired Keypoints
论文地址:传送门

Introduction

CornerNet最大的创新在于其突破了anchor的限制,使用两个点来表示物体的bounding box,并提出了corner pooling,且取得了不错的效果。

其指出基于anchor的one-stage detectors通常需要大量的anchor,但最终只提取极少数的box,且导致参数多,计算量大,而其仅通过一个物体的top-left和bottom-right 两个点来确定物体的位置,且不需要各种scale(但事实上其训练速度、测试速度也非常慢)。

在COCO数据集上其达到了42.2%的mAP。

Network

CornerNet采用的backbone为hourglass network(HN),HN的主要特点是重复的bottom-up、top-down操作,使得不同层之间的信息相互融合。
Hourglass Module

如图所示,在一张图片经过ConvNet之后,其分别进入两个分支的网络,其分别预测物体的左上角和右下角,然后通过group corner将同一个物体的corner连接起来,接着还设置了一个offset 网络,对预测点进行offset。

CornerNet

在进行角点检测的过程中,每一个分支都将产生$C$个heatmaps,其中$C$代表物体的类别数,每个heatmap的大小都是$H \times W$。
对于每一个角,其都只有一个ground truth,但靠近此点的prediction也能产生一个近似的预测,因此不能简单地将其归为negtive。为此本文对每个ground truth点设置了一个半径,半径内的即被认为是positive。而半径设置时需要满足半径内的点组成的box与gt box之间的IoU达到某个阈值(本文为0.3)。

由于heatmap较小,在映射回去之后会产生较大的误差,因此本文对每个点都设计了一个offset,使得映射回去的点进行一个修正。如下式中,$o_k$即为offset。
$$o_k = (\frac{x_k}{n}-[\frac{x_k}{n}],\frac{y_k}{n}-[\frac{y_k}{n}])$$
为此本文采用Smooth L1 Loss来定义offset loss。
$$L_{off}=\frac{1}{N} \sum_{k=1}^N SmoothL1Loss(o_k,\hat{o}_k)$$

由于作者在前面采用两张heatmap分别预测两个角点,因此需要将两者进行配对(Grouping Corners),在这里作者主要采用了Associative Embedding的思想。在AE中,作者定义了group loss,即$L_g$,其前半部分是将同一个人体的点pull在一起,后半部分是将不同的人的点push出去,从而使得同一个人的点具有相同的tag,不同人的点具有不同的tag,即同时实现了检测和分组,而不像传统的方法分两个阶段来解决。
Associative Embedding

本文中作者指出,对于同一个box的顶点距离也比较近,也可以采用Associative Embedding来实现点的分组。因此定义了$L_{pull}$和$L_{push}$,分别用来将top-left corner和bottom-right corner pull在一起、push awy。其中$e_k$是两个点的平均值,$\Delta$设置为1。
$$L_{pull} = \frac{1}{N} [(e_{tk}-e_k)^2+(e_{bk}-e_k)^2]$$
$$L_{push}=\frac{1}{N(N-1)} \sum_{k=1}^N \sum_{j=1,j \neq k}^N max(0, \Delta-|e_k-e_j|)$$

其实就是在训练时为每个corner分配一个embeddding vector,然后使用Associative Embedding,根据点之间的距离进行grouping。

Corner Pooling

Corner Pooling

一般情况下,物体的角点不会在物体上,我们在寻找物体的角点时,如左上角,一般会先向右看,找到最靠左的点,然后向下看,找到最靠上的点,那么这两个值组成的点便是左上角点;右下角同理。
具体来说,对于点$(i,j)$,我们对$(i,j)$到$(i,H)$之间所有的点进行maxpool,将结果赋予$t_{ij}$,同理对水平方向也这样进行。

Corner Pool

其示意图如下所示。

Detection Module

即经过backbone之后有三个分支,一个类似于residual connection,另外两个负责预测top-left corner,接着进行corner pooling,接着对pool之后的特征图连接,然后分为三个部分,分别预测heatmaps、Embeddings、Offsets,最后以一个multi-task loss进行优化。
$$L = L_{det}+ \alpha L_{pull} + \beta L_{push} + \gamma L_{off}$$

CenterNet

论文名称:Objects as Points
论文地址:传送门

Introduction

目标检测当中通常使用bounding box来定位object,目前流行的detector也是基于这种方法:产生大量的可能存在目标的box,这显然是wasteful,inefficient。而本文使用一个中心点来表示物体,使用keypoint estimation对尺寸、3D location、orientation、pose等进行点回归。在COCO数据集上达到28.1% AP时有142 FPS,37.4%时有52 FPS,45.1%时有1.4FPS。

本文模型的流程十分简单:将影像送入全卷积网络当中,产生一个heatmap,heatmap中的peaks即为目标的中心点。

在测试时并不需要NMS,因为CenterNet并不需要阈值来区分正样本和负样本,只需要根据heatmap的peaks来确定正样本即可:一个目标仅有一个positive,并不需要选出若干anchor。

同时CenterNet使用了一个较大的output(反卷积实现的),因此并不需要多尺度anchor。

事实上CornerNet和ExtremeNet都是对点进行检测,但他们都需要对点进行配对,而CenterNet并不需要这个过程。

Preliminary

输入:$I \in R^{W \times H \times 3}$
输出:$\hat{Y} \in [0,1]^{\frac{W}{H} \times \frac{W}{H} \times C}$
其中$C$代表关键点的类型,如人体姿态检测$C=17$,COCO目标检测类别$C=80$

Ground Truth: 使用高斯分布将keypoints展开成heatmap。

Keypoints Loss:Focal Loss

Offset Loss: $\hat{O} \in R^{\frac{W}{H} \times \frac{W}{H} \times 2}$

Size Loss: $s_k = (x_2^{(k)}-x_1^{(k)},y_2^{(k)}-y_1^{(k)})$,$\hat{S} \in R^{\frac{W}{H} \times \frac{W}{H} \times 2}$

则总的Loss: $L_{det}=L_k+\lambda_{size}L_{size}+\lambda_{off}L_{off}$

网络在每个位置输出$C+4$个值,其中$C$为关键点类型数,4表示2个size,2个offset,而每个点的location是根据heatmap的peaks得出的。

在网络经过不同的backbone(Resnet、Hourglass、DLA)之后,经过一个$3 \times 3$卷积、Relu、$1 \times 1$卷积。
不同的backbone

从点到bounding box:
$$(\hat{x}_i+\delta \hat{x}_i - \hat{w}_i/2,\hat{y}_i+\delta \hat{y}_i - \hat{h}_i/2,\hat{x}_i+\delta \hat{x}_i + \hat{w}_i/2,\hat{y}_i+\delta \hat{y}_i + \hat{h}_i/2)$$
其中$(\delta \hat{x}_i,\delta \hat{y}_i)$为offset

Summary

虽然CornerNet在论文里argue物体的中心点并不好找,但CenterNet并不需要Associate Embedding的过程,因此效率会更高。我觉得其最具创新的是:将每个物体定义为一个点,接着对于不同的任务,将中心点向不同的方向regression。