文章14
标签9
分类1

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

RefineDet模型总结

论文名称:Single-Shot Refinement Neural Network for Object Detection
论文地址:传送门

Introduction

我们知道,two-stage detector 精度高,但速度慢,one-stage detector速度快,但精度低。如果能将两者的优点结合起来,那就十分美好了。

One-stage 与 two-stage的最大差别在于是否有region proposal的过程。
有了region proposal的过程,可以在stage one中提取有效的anchor box,过滤无效的box,从而有效地解决class imbalance问题,然后在stage-two中对anchor box进行classification和精确的localization,但是显然two-stage会降低运行速度。
而one-stage则没有region proposal的过程,直接预设$1k \rightarrow 100k$左右的anchor box,本质上是一个dense prediction,按理说这么多box,肯定会十分准确地预测,但是由于这些anchor中大多数都是易于区分的negatives,并不利于模型的训练,导致严重的imbalance问题。

RefineDet则将两者的有点结合了起来:其stage-one用于提取region proposal,stage-two用于分类和精确定位,但最关键的是,其stage-one和stage-two近乎是共享feature maps的,从而大大减少了计算量,同时其采用了FPN的bottom-up,top-down的策略,实现了high-level feature与low-level feature的融合。

在MS COCO数据集上,其达到了41.8%的AP,同时可以达到24.1的FPS。

RefineDet

RefineDet包含两个模块:Anchor Refinement Module(ARM),Object Detection Module(ODM)。还有一个Transfer Connection Block(TCB)用于连接两个模块。

其基本结构是:

  1. ARM中类似于SSD,在backbone network中抽取四个feature layers,只不过将SSD中Multi-class Classification改为Binary Classification(Object or not)。
  2. TCB模块则将ARM与ODM连接起来,即将高层的feature传l下层,并与下层concat,重构一个SSD的网络。对于ODM,其简直与SSD一模一样:多层的Multi-class classification和regression。
  3. 最创新的其实是中间连接的部分,stage-one的anchor box,可以Hard Example Mining(HEM),过滤掉那些easy examples,保留hard negatives,这样就解决了class imbalance问题。

Network Architecture

TCB

TCB

TCB模块即采用Deconv将上层与下层的feature相结合。

Two-Step Cascade Regression

这让我不禁想起了同时CVPR 18的Cascade R-CNN。同样的套路,RefineDet将SSD改成two-stage,而Cascade R-CNN将R-CNN改成two-stage。

这里的two-step cascade regression主要是bounding box的回归。在ARM中,预测出一个大致的box,然后经过样本的过滤后,在ODM中进一步的regression。

Summary

好的工作总是相通的,级联的方式来解决检测的精度确实是很不错的主意,相比于Cascade R-CNN,RefineDet的检测速度更胜一筹,只不过 Cascade R-CNN里的解释与分析更加详细。

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来说是一个很大啊的突破。

GHM总结

论文名称:Gradient Harmonized Single-stage Detector
论文地址:传送门

Introduction

single-stage detector虽然面临着训练时的不协调,如正样本和负样本、易分类目标和难分类目标之间质量的巨大差异,但其不失为一种优雅且有效的方法。
在本文中,作者将这种不协调性归结到梯度问题,并提出了一种梯度协调机制(Gradient Harmonizing Mechanism,GHM)来解决这种不协调。GHM可以与分类和回归Loss function相结合,如Cross Entropy、Smooth L1 Loss。

我们知道在one-stage方法的训练过程中,最大的挑战就是正样本和负样本、易分类目标和难分类目标之间的不平衡性,大量易分类的背景样本使得模型并不能学习到目标的真正特征。如果一个目标很容易区分,那么模型并不能从中受益。

梯度范数等效于梯度的大小,范数越大,则梯度就较大。作者通过对梯度范数的分析,发现梯度范数较小时聚集了大量的样本,而这些样本即代表易分类的样本,它们对模型的训练并没有太大的帮助;同时我们还发现有许多梯度范数及其大的样本,他们对目标的分类也没有太大的作用。

因此如果能够对梯度范数十分小的样本和十分大的样本(异常值,outliers)down-weight,那么每个样本的贡献都是均衡的。

Gradient Harmonizing Mechanism

对于二分类问题的Loss函数:Cross Entropy
$$L_{CE}(p,p^)=\begin{cases}
-log§ && if \quad p^
=1 \
-log(1-p) && if \quad p^*=0
\end{cases}$$

假设$p=sigmoid(x)$,那么:
$$\frac{\partial L_{CE}}{\partial x}=\begin{cases}
p-1 && if \quad p^=1 \
p && if \quad p^
=0
\end{cases}
=p-p^*
$$

接着我们定义$g$:
$$g = |p-p^|=\begin{cases}
1-p && if \quad p^
=1 \
p && if \quad p^*=0
\end{cases}$$

Gradient Dentisy

$$GD(g)=\frac{1}{l_{\epsilon}(g)}=\sum_{k=1}^N\delta_{\epsilon}(g_k,g)$$
$$\delta(x,y)=\begin{cases}
1 && if \quad y-\frac{\epsilon}{2} <= x < y+ \frac{\epsilon}{2} \
0 && otherwise
\end{cases}$$
$$
l_{\epsilon}(g)=min(g+\frac{\epsilon}{2},1)-max(g-\frac{\epsilon}{2},0)
$$
接着定义梯度密度协调参数$\beta_i=\frac{N}{GD(g_i)}$,其中N是样本总数。

GHM-C Loss

将GHM加入到分类Loss当中:
$$L_{GHM-C}=\frac{1}{N} \sum_{i=1}^{N}\beta_i L_{CE}(p_i,p^)
\= \sum_{i=1}^N \frac{L_{CE}(p_i,p^
)}{GD(g_i)}
$$
GHM-C Loss

GHM-R Loss

在回归当中使用的L1 Loss:
$$L_{reg}=\sum_{i \in {x,y,w,h}}SL_1(t_i-t_i^*)$$

Experiments

RetinaNet模型总结

论文名称:Focal Loss for Dense Object Detection
论文地址:传送门

Introduction

目前在目标检测领域,two-stage detector(如R-CNN系列)通常能取得较好的精度,但速度较慢;而one-stage detector(如SSD、YOLO)通常速度比较快,但精度会较低。如何保持检测速度的同时,能够提高one-stage检测精度,作者指出类别不平衡性是主要原因,因此作者提出了Focal Loss来解决类别不平衡问题,使本文提出的RetinaNet也能实现较高的精度。
类别不平衡性通常会导致两个问题:

  1. 许多易分类的负样本对训练没有什么贡献,导致训练较为低效。
  2. 这些Negetive的样本影响模型的训练,导致模型整体学习方向偏离。

而在two-stage detector中,通常有两种解决方案:

  1. 使用两个阶段进行递归(cascade)。在多阶段cascade时,可以逐渐筛去easy negetives,使得样本之间平衡。
  2. 选择mnibatch时,有针对的选择正负样本。如正:负=1:3。

Focal Loss

为了解决正负样本间的极度不平衡性,作者提出了Focal Loss。

通常情况下,对于两分类问题我们使用Cross Entropy Loss,即:
$$CE(p,y)=\begin{cases}
-log§, & \mbox{if } \quad y = 1 \
-log(1-p), & otherwise.
\end{cases}$$
其中y为Ground truth label,$p \in [0,1]$为预测结果,为了方便描述,CE也可以表示为:
$$p_t=\begin{cases}
p & \mbox{if} \quad y=1\
1-p & otherwise
\end{cases}
$$
此时有$CE(p,y)=CE(p_t)=-log(p_t)$,对应下图曲线上的蓝色曲线。可以看到,即使$p \ge 0.8$,仍有很大的loss。
这种损失的一个显着特征是,即使很容易分类(pt≫ .5)的例子,其损失也具有不小的幅度。 如果将大量简单的例子相加,这些小的损耗值可能会导致错误的类别。

为了解决这个问题,作者提出了Balanced Cross Entropy,即:
$$CE(p_t)=- \alpha_t log(p_t)$$

为了降低易分类目标(easy examples)的权重,使模型在训练时更加专注于难分类样本(hard exmaples),作者提出了Focal Loss,不同$\gamma$对应的图像如上图所示。
$$FL(p_t)=-(1-p_t)^{\gamma}log(p_t)$$

使用Focal Loss之后,大量易分的negtives的loss就减小了,从而使模型更加专注于难以区分的目标。

Focal Loss还有另一种形式:
$$FL(p_t)=-\alpha_t(1-p_t)^{\gamma}log(p_t)$$
本文实验采用的即时此种形式。

RetinaNet Detector

RetinaNet

  1. ReNet作为backbone
  2. 采用FPN(Feature Pyramid Network)进行不同scale的采样。
  3. 对于每个scale level,都有一个class net和box net。
  4. 将最终预测的anchor进行merge,使用NMS进行筛选。

其中,FPN使用的的是$P_3$到$P_7$,$P_3 \dots P_5 \rightarrow C_3 \dots C_5$,而$P_6$是对$C_5$进行卷积得到的,$P_7$是通过对$C_6$卷积得到的。

对于每个level,不仅仅是从$32^2$到$512^2$的大小,还有${2^0,2^{1/3},2^{2/3}}$三个尺寸,每个尺寸都有三个ratio:${1:2,1:1,2:1}$,即每个level都有9个anchor box。对于每个anchor box,都单独预测K个class,即总共需要$KA$个值。

对于box net,则简单的预测$4A$个值,对应着A个anchor box的坐标。

FPN(Feature Pyramid Networks for object detection)总结

论文题目:Feature Pyramid Networks for Object Detection
论文地址:传送门

Introduction

在传统的手工提取特征里,金字塔模型用于提取层次化的特征,然而在深度学习里基本上抛弃了这种方式,而FPN(Feature Pyramid Networks)则将金字塔模型融入到深度神经网络当中,从而 在目标检测时取得了显著的提升。

作者展示了四种常见的金字塔模型。(a)即对于不同尺度的影像计算特征,比较慢。(b)即Fast R-CNN等采用的方式,仅利用最后一层特征。©即抽取不同层的特征,如SSD。(d)即本文的FPN所采用的方式。

Feature Pyramid Network

FPN

作者指出其目标为使用卷积网络从低到高的特征层构建特征金字塔模型。模型包含一个从低到顶(bottom-up)和从顶到低(top-down)的路径和一个侧边连接(lateral connection) 。

从底到顶即卷积网络一层层的提取特征,特征图逐渐变小,分辨率逐渐降低,语义信息逐渐变清晰;对于产生相同大小特征图的卷积层,作者将其称为同一阶段(stage);FPN将为每一个阶段(stage)定义一个Pyramid level,通常情况下,每一个level都将从stage的最后一层取出,因为最后一层具有最丰富的信息。
如对于$Resnet$,FPN将取其conv2、conv3、conv4、conv5定义为${C_2,C_3,C_4,C_5}$。

从顶到底和侧边连接:即如上图所示将顶层的特征upsampling后与底层的特征相连接,不断重复一直到最底层,从而构建新的特征金字塔。

如下图以Resnet为例,为了将FPN融入到Resnet当中,首先从${C_2,C_3,C_4,C_5}$中抽取特征,然后对$C_5$进行$3 \times 3$卷积后输出$P_5$;接着将$C_5$二倍upsampling,然后与$C_4$连接,再进行$3 \times 3$卷积得到$P_4$;以此类推得到$P_3,P_2$。

FPN示意图

Applications

首先作者将其应用到RPN(Region Proposal Network)上。

RPN结构示意
对于这样一个RPN来说,在Faster R-CNN中是直接在VGG的conv4或conv5的后面接一个$1 \times 1$的卷积层,得到256维的输出,然后进行localization和classification。
但加入FPN时,作者将VGG中得到的${P_2,P_3,P_4,P_5}$与RPN相连。具体作法为:原本RPN直接输出9个anchor box坐标,但作者将其不同尺寸的anchor box分到不同的FPN层去处理。作者将anchor的大小定义为${32^2,64^2,128^2,256^2,512^2}$,对应着${P_2,P_3,P_4,P_5,P_6}$,$P_6$是特意为RPN加入的一个层;然后每个层都有三个不同的ratio:${1:2,1:1,2:1}$,即加入FPN的RPN在每个点上都有15个anchor box。
对于Fast R-CNN的部分:TODO

Summary

总结起来,FPN就是将传统的金字塔模型进行了调整,使其融入到卷积网络当中,提取不同层次的特征;同时将FPN融入到目标检测网络当中,并取得了很好的效果。

Cascade R-CNN模型总结

论文名称:Cascade R-CNN: Delving into High Quality Object Detection
论文地址:传送门

Introduction

众所周知,在目标检测中IoU的阈值越高,则样本质量就越好,但是一味的提升阈值会引发两个问题:

  1. 样本过少引起过拟合
  2. 在train和inference时使用不同的阈值会导致mismatch
    因此作者提出了一种multi-stage的网络,不断地提高阈值,在保证样本数量的情况下训练出高质量的检测器。

本文的出发点引人思考:在现阶段常用的两阶段目标检测任务当中,通常使用IoU(intersection over union)阈值来确定那些proposal是positive,哪些是negative,一般情况下,这个阈值$u=0.5$,然而0.5的阈值一定合适吗?很多情况下,即使阈值大于0.5,仍然会有很多close false positives,这就导致模型预测出很多噪声bounding box。

如上图所示,$©$和$(d)$分别为不同IoU阈值$u \in {0.5,0.6,0.7}$的情况下,localization和detection perfoemance的情况。如$©$表示不同IoU阈值下,输入proposal的IoU与输出的IoU之间的关系,可以看出,在输入输出IoU相近的情况下,有较好的效果;同时只有当proposal有较高质量时,detector才有较好的表现。

Related Works

作者还列举了一些相关的工作,如上图所示,$H_i$表示卷积,而$C$表示表示分类,$B$表示回归。对于Faster R-CNN,其使用RPN进行提取ROI,然后进行识别和回归;对于Iterative BBox则是通过三个级联的方式,但其三个阶段的阈值是相同的;对于Intergral Loss其设置三个不同的阈值,但各个部分是单独检测的,额米有利用到前面高质量的proposal。其实吧,作者仅仅是在$(b)$的基础上改动了下阈值,但是作者对这种改变做出了深刻的分析。

如上图所示,作者发现,在cascade r-cnn当中,经过不同stage的训练,IoU的质量确实有显著的提升,越靠后,其质量越高;同时我们在前面讲过,对于某一质量的IoU,经过网络之后其质量必然会有所提升,因此经过三个阶段的训练,可以得到高质量的detector。


经过对比,cascade R-CNN精度有了很大的提升,但是在速度上并没有慢多少。

Summary

其实本文最核心的思想就是:作者发现高质量的proposal可以产生更高质量的bounding box,同时还存在mismatch问题,因此将多个r-cnn连接起来,并且设置不同的阈值,将产生更高质量的detector。

Reference

  1. https://zhuanlan.zhihu.com/p/36095768

R-FCN模型总结

论文名称:R-FCN: Object Detection via Region-based Fully Convolutional Networks
论文地址:传送门

Introduction

传统的影像分类模型需要依赖特征的平移不变性(translation-invariance),而对于检测网络,影像的平移显然会影像到目标的定位与识别,因此其需要依赖位置敏感性(translation-variance)。通过 RoI pooling 的插入,打破了原卷积网络的平移不变性,但这种做法牺牲了训练和测试效率。而R-FCN在提升精度的同时利用“位置敏感得分图(position-sensitive score maps)”提升了检测速度。本文的核心即替换Faster R-CNN中单纯的ROI Pooling,引入psROIpooling(Position Sensitive ROI Pooling),从而引入了位置信息,提升了检测速度。
基于ResNet-101的R-FCN在PASCAL VOC 2007的测试集上的mAP=83.6%,速度为170ms per image。

Network Design

R-FCN

如上图所示为R-FCN的示意图,其大部分结构借鉴于Faster R-CNN,如RPN,ROI Pooling,但不同的是将其中的ROI Pooling替换为了psROIPooling,从而解决了位置敏感性的问题。其流程如下:

  1. 影像送入Backbone网络,输出特征图
  2. 使用RPN网络提取Region
  3. 加入一个具有特定数量卷积核的卷积层,得到一定量的特征图
  4. 对于每一个ROI,使用psROIpooling得到新的特征图
  5. Vote确定特征图所属ROI的类别

接下来会详细介绍其实现细节。

Position-sensitive score maps & Position-sensitive RoI pooling

R-FCN采用Resnet作为backbone,将其average pooling和fully connected层的最后一个卷积层作为输出,其是一个2048维的向量($2048 \times 7 \times 7$),接着再加入一个随机初始化的1000维的卷积层($1024 \times 1 \times 1$),最后加入一个包含$k^2(C+1)$个卷积核的卷积层,从而得到$k^2(C+1)$个特征图。

为了将位置信息编码进网络,本文首先将每个ROI分割成$k \times k$的网格,如对于大小为$w \times h$的ROI,则其每一个网格的大小约为$\frac{w}{k} \times \frac{h}{k}$。

接着,我们让第$i+k(j-1)$个score map负责位置$(i,j)$的预测,如对于黄色的score map,我们仅取其左上角的一个网格(即第$(1,1)$个网格)作为新的score map的一部分,那么例如蓝色的score map则负责$(3,1)$位置的预测,即仅取其$(3,1)$位置的网格作为新score map的一部分。

经过这样的映射,新组成的score map就如上图右侧经过ROI pooling之后所示,此时向量的大小为$k \times k \times (C+1)$,即新的score map是由$k^2(C+1)$个特征图经过映射得到的,包含了位置信息,而不是直接的进行ROIpooling。

接着对于大小为$k^2(C+1)$的score map,对$C+1$维上每一层都进行average pooling,得到大小为$C+1$的一维向量,接着使用softmax公式计算其最终的类别。其公式如下:
$$r_c(i,j|\theta)=\sum_{(x,y) \in bin(i,j)}z_{i,j,c}(x+x_0,y+y_0|\theta)/n$$
其中$r_c(i,j|\theta)$表示对于第$c$类经过pool之后的第$(i,j)$个网格,$z_{i,j,c}$表示$k^2(C+1)$个score map中的一个,$(x_0,y_0)$表示ROI的左上角

Bounding Box Regression

为了准确预测bounding box,本文在$k^2(C+1)$的卷积层后添加了一个$4k^2$个卷积核的卷积层,产生了一个$4k^2$维的向量,然后使用average pooling转成4维的向量,让这个4维向量编码$t=(t_x,t_y,t_w,t_h)$。

Refenrence

  1. https://www.jianshu.com/p/df49ff18c8cc
  2. https://zhuanlan.zhihu.com/p/30867916
  3. https://blog.csdn.net/wfei101/article/details/79284512

YOLO系列模型总结

YOLO v1

论文名称:You Only Look Once: Unified, Real-Time Object Detection
论文地址:传送门

Introduction

以往的目标检测算法(尤其是R-CNN系列)将目标检测问题归结为分类问题,即先寻找目标可能存在的区域(Bounding box),然后对这些Box分类,从而确定目标。Yolo则将目标检测问题转换为一个回归问题(Regreesion problem),直接预测出boudning box和相关的类别信息。Yolo是一个可以端到端训练的single network,它不需要单独的搜索Region Proposals,也不需要单独的Classifier,因此其检测速度特别快,Yolo可以达到45FPS,而Fast Yolo可以达到155FPS。Yolo对背景的识别效果较好,且有一定的迁移性,可以识别一般问题(如Artwork),但是Yolo最大的问题是对小目标的检测不准确。