文章16
标签10
分类1

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。

Mask R-CNN模型总结

论文名称:Mask R-CNN
论文地址:传送门

Introduction

本以为这篇文章是众多R-CNN系列的一个,然而看到作者是kaiming和Ross Girshick,再看知乎上各种“劝退目标检测”,足以见得这篇文章的重要性。事实上,Mask R-CNN确实成为这几年来的baseline。

我们知道目标检测的基本任务是localization和classification,而instance segmentation不仅需要detection,同时也要segmentation,也就是要完成localization、classification、segmentation三项任务。由于其任务复杂,以往的instance segmentation系统也趋向于复杂化。而Mask R-CNN则通过向Faster R-CNN添加一个branch,实现了在detection的同时,完成segmentation的任务。作者指出,在没有使用任何trick的情况下,Mask R-CNN在检测和分割都达到了较好的效果。

同时作者还提出了ROIAlign,用来解决ROIPooling在运算时存在的定位误差。

ROIAlign

本文较为重要的一个概念就是ROIAlign了,但文中并没有清晰的介绍ROIAlign是怎么来的。
ROIPooling存在的问题:两次量化的误差。

  1. 首先Region Proposal中的坐标是通过回归得到的,一般都是浮点数,如$(cx,cy,w,h)$均是相对于图像长宽的值(范围均是$[0,1]$),同时此时的特征图一般都是较小的(如$[\frac{1}{16}w,\frac{1}{16}h]$),此时若在特征图上取ROI的话,得到的相对坐标也是浮点值,必须进行取整,从而产生误差。
  2. 其次ROIPooling将一个不同尺寸的Proposal变换到固定的尺寸(如$7 \times 7$),那么此时对Proposal进行划分时所产生的浮点数坐标也要进行取整,因此又产生一个误差。

这些误差在特征图上看似无关紧要,但如果将一个$[\frac{1}{16}w,\frac{1}{16}h]$的特征图映射回去,那么误差将放大16倍,这对小目标的检测是十分重要的。

那么ROIAlign做了什么事呢?其实就是将这些取整的操作用双线性插值代替,从而减小误差。

  1. 在通过回归或者RPN得到坐标后,并不进行取值,保留浮点坐标
  2. 将Region Proposal划分为$k \times k$个bin,对于每个bin,计算若干中心点的的像素值,取均值或最大值,得到大小为$k \times k$的特征图。
    其中对于每个bin,若只计算1个像素值,则对这个bin的中心点坐标进行双线性插值,得到其像素值;若计算4个像素值,则对这个bin划分为4个区域,取各区域的中心,并通过插值计算其像素值,然后取Mean或者Max。
    ROIAlign

对于ROIPooling,有公式:
$$y_{rj}=x_{i^(r,j)}$$
即$y_{rj}$是从$x_{i^
(r,j)}$中的最大值中得到的(MaxPool)

其梯度传播如下:
$$\frac{\partial{L}}{\partial{x_i}}=\sum_r \sum_j[i=i^(r,j)]\frac{\partial L}{\partial y_{rj}}$$
即L对x的梯度仅取决于其取到的那个像素值$x_{i^
(r,j)}$

对于ROIAlign,其梯度公式如下:
$$\frac{\partial L}{\partial x_i}\sum_r \sum_j [d(i,i^*(r,j))<1](1-\Delta h)(1- \Delta w)\frac{\partial L}{\partial y_{rj}}$$
即在ROIPooling的基础上,在半径为1的范围内,考虑参与插值的多个点贡献的梯度值,并以距离作为梯度传回大小的衡量。

Mask R-CNN

Mask R-CNN

Mask R-CNN基本上就是在box regression和classification上添加了一个并行的segmentation。segmentation部分已经比较常见,通过对特征图反卷积,产生更大的特征图,即本文中的Mask。

但重要的是,Mask R-CNN将detecction和segmentation结合起来,且实现方式十分的简单。在计算$L_{mask}$时,仅计算第$K$个mask产生的Loss,其中$K$为此box所包含物体的类别;在预测的时候,$K$为分类网络预测出的类别。

基于此,作者设计了两中结构,左侧为一般的Faster R-CNN,右侧为加入FPN的Faster R-CNN。

Summary

Mask R-CNN在detection领域并不算的多么重大的突破,但在实践过程中发现其收敛速度快,训练效果好,被工业界推崇。其提出的RIOAlign也算是对ROIPooling的一个改进,会逐渐的被采用。将Detection和Segmentation结合 起来进行Instance Segementaion,对IS来说是一个很大啊的突破。