Advertisement

CentripetalNet: Pursuing High-quality Keypoint Pairs for Object Detection 论文笔记

阅读量:

前言

corner-based目标检测方法主要分为两个步骤:角点的预测和角点的匹配。传统的角点匹配方法是为每个角点学习一个嵌入(embedding),然后根据这个嵌入来判断两个角点是否属于同一个bbox。如果两个角点来自于同一个bbox,那么它们的嵌入会非常相似;否则会非常不同。根据嵌入来匹配角点的方法其实存在一些不足:

  • 在学习嵌入的过程中,训练过程涉及到push loss和pull loss。push loss是由不属于同一目标的点来计算的,这两个点离得越远越好。pull loss是由属于同一目标的点计算的。这样的话网络对异常点是非常敏感的,因为网络要在对角线的所有潜在点内找到唯一匹配的点,如果一个训练样本中有多个相似目标的话,训练难度会大幅增加。
  • 在预测嵌入时依据的是目标的外观特征,而没有使用位置信息。也就是说如果两个目标具有相似的外观,就算它们相距很远,网络也会为它们预测相似的嵌入。

基于此,本文提出基于向心偏移(centripetal shift) 的CentripetalNet。给定一对儿角点,为每个角点定义一个2-D向量,也就是向心偏移。向心偏移表示的是角点到bbox中心点的空间偏移(spatial offset)。这样的话每个角点都能基于向心偏移来产生一个中心点,如果两个角点属于同一个bbox,那么它俩产生的中心点应该非常接近。

此外,为了更好地预测向心偏移,本文还提出 “十字星”可变形卷积(cross-star deformable conv) 。由于corner pooling在进行池化操作时,使用的是max和sum操作来将目标的位置信息沿着“十字星”的边界扩展到角点上,因此“十字星”包含着目标的上下文信息。因此本文将目标的位置和几何信息嵌入到可变形卷积的offset field中。


CentripetalNet

在这里插入图片描述
上图是centripetalnet的整体结构,它主要由四部分构成:

  • 角点预测模块(corner prediction module):基于CornerNet生成候选角点;
  • 向心偏移模块(centripetal shift module):预测角点的向心偏移,如果通过某角点对儿的位置和向心偏移得到的偏移结果是一致的,就把它们匹配起来;
  • 十字星可形变卷积(cross-star deformable convolution):通过角点与其对应的中心点之间的偏移来学习一个offset field,然后通过特征自适应以丰富角点所在位置上的视觉特征,这样可以提高向心偏移模块的准确度;
  • instance mask head :以向心偏移模块预测的bbox作为候选区域,使用RoIAlign来提取特征,并使用一个小型的卷积网络来预测分割mask。在inference的时候,这个模块可要可不要。

1. 向心偏移模块

首先说一下向心偏移的定义

对于bboxi=(tlxi,tlyi,brxi,bryi)bboxi=(tlxi,tlyi,brxi,bryi),它的几何中心点是(ctxi,ctyi)=(tlxi+brxi2,tlyi+bryi2)(ctxi,ctyi)=(\frac{tlxi+brxi}{2},\frac{tlyi+bry^i}{2})

那么bbox的左上角点和右下角点的向心偏移分别定义为:

cstli=(log(ctxi−tlxis),log(ctyi−tlyis))csi_{tl}=(log(\frac{ctxi-tlxi}{s}),log(\frac{ctyi-tly^i}{s}))

csbri=(log(brxi−ctxis),log(bryi−ctyis))csi_{br}=(log(\frac{brxi-ctxi}{s}),log(\frac{bryi-cty^i}{s}))

在训练时,在gt corner的位置上应用L1损失,以对predicted corner和gt corner之间的差异进行惩罚,如下式所示,L1L_1表示L1 损失,NN表示训练样本中gt corner的数量。
在这里插入图片描述

在得到向心偏移之后,就要对角点进行匹配了。

作者的匹配思路是如果一对儿角点属于同一个bbox,那么它们应该共享这个bbox的中心点。既然我们已经得知一个角点的位置信息和向心偏移,那么就可以通过它的位置信息和向心偏移来解码出它对应的中心点,也就是decoded center。如果一对儿角点各自的decoded center离得足够近,并且都与bbox的gt center也离得很近,那么就可以把这一对儿角点匹配起来。

那么就可以得到角点匹配的大概流程:

第一步: 首先通过corner heatmap和local offset feature map得到角点(predicter corner)。如下图所示,当把gt corner映射到heatmap上时,local offset(也就是图中的OtlO_{tl}和ObrO_{br})用于弥补精度损失。
在这里插入图片描述

第二步: 对属于同一类别的角点进行分组,并且需满足tlx<brx⋀tly<brytlx<brx \bigwedge tly<bry这个条件,以构建预测框(predicted bbox),此时预测框的分数为其角点分数的几何平均值。

第三步: 基于gt bbox定义一个中心区域,如下图所示,红色的RcentralR_{central}部分就是定义的中心区域,其中心就是gt center,这是为了比较decoded center和gt center之间的相似度。
在这里插入图片描述

RcentralR_{central}的区域范围以及角点分别为:
在这里插入图片描述
在这里插入图片描述

第四步: 通过向心偏移分别得到左上角点和右下角点的decoded center为(tlctx,tlcty)(tl_{ctx},tl_{cty})和(brctx,brcty)(br_{ctx},br_{cty})

第五步: 通过下式来计算每个预测框的分数权重wjw^j,如果两个decoded center离得越近,并且这两个decoded center与gt center也离得很近,那么该预测框就有更高的分数权重,最后可以通过乘以分数权重来对预测框进行重打分。分数最高的预测框就是最终的检测结果,而该预测框对应的predicter corner就是最终确定的角点。
在这里插入图片描述

2. 十字星可形变卷积

如下图(a)所示,在经过角池(corner pooling)后,特征图中会出现一些类似于十字星的东西。由于角池使用max和sum操作来将目标的位置信息沿着十字星的边界扩展到角点上,因此十字星的边界包含着目标丰富的上下文信息。如果能够捕获这些上下文信息,那么就可以预测得到更准确的角点,从而更精确的定位目标位置。 为了捕获这些上下文信息,需要学习十字星的几何结构。由此作者提出十字星可形变卷积。
在这里插入图片描述
十字星可形变卷积如下图所示:
在这里插入图片描述
首先将角池得到的特征图送入十字星可形变卷积模块中。 由于十字星的形状和bbox的形状有关,因此在学习十字星的几何结构时,可以用相应的目标的大小来引导offset field分支,以进行可形变卷积。也就是说不同大小的目标,在十字星可形变卷积模块中的offset field是不同的。

为了告诉卷积往哪个方向卷才能获取有效信息,需要加一个guiding shift ,这样可以让offset field不会与实际方向偏差太大。比如拿左上角点来说,位于这个位置的十字星的左上部分肯定不会包含太多与目标相关的有用信息,那么就能通过guiding shift说明从左上角点到中心点的这个偏移,如下图所示,这个偏移包含边界框形状和位置信息。然后将这个guiding shift添加到offset field分支中。
在这里插入图片描述

offset field包含的是上下文和几何信息。 为了获得offset field,需要有三个卷积层。前两层将角池的输出结果嵌入到特征图中,这个过程由以下损失函数进行监督:
在这里插入图片描述
其中δ\delta表示guiding shift,由下式进行定义:
在这里插入图片描述
最后一个卷积层将以上特征映射到offset field中。

全部评论 (0)

还没有任何评论哟~