CornerNet: Detecting Objects as Paired Keypoints

摘要:

cornernet是一种anchor free的方法。提出了cornernet,通过检测成对的关键点(box的左上,右下),去掉了anchor,此外还介绍了corner pooling(一个新的pooling layer ),帮助网络更好的定位corner角点。

introduction:

使用anchor有两个缺点:

1.DSSD使用了40k个anchor,retinanet有超过100k个anchor,需要大数量的anchor来确保与大多数gtbox有足够的重叠。结果,只有极小的一部分anchor会和gtbox重叠。这导致了正anchor和负anchor的极大不平衡,降低训练速度。

2.使用anchor需要很多的超参数和设计选择。包括多少anchor,多大size,什么长宽比。这些选择通过一些启发式的工作取得。当和multiscale框架联合在一起的时候,网络就更加复杂。

本文避免使用anchor,将检测一个目标当做一对关键点(bbox的左上,右下)。对所有的左上角点生成一个热点图,对所有属于一个类的右下角点生成一个热点图,对每一个检测角点生成一个embedding 向量。embedding的目的将属于同一个目标的角点组合,训练网络让他对属于同一个目标的角点能预测相似的embedding。这个方法idea来自:associative embedding method(被newell等人提出)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YCh3WRA4-1634367820265)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/8d624677-e01a-4fd3-b17a-1aa4206b6c71/Untitled.png)]

另一个新的组件是**corner pooling ,**一个新形式的pooling layer,帮助网络更好的定位bbox的角点。因为bbox的角点通常都是在目标的外面,在这种情况下,不能根据局部的证据对角点进行定位。为了确定这个位置是否有左上的角点,需要水平朝右看物体顶部边界(获得顶部特征),垂直向下看物体左边边界(获得左边特征)。
在这里插入图片描述
该层有2个输入特征图,特征图的宽高分别用W和H表示,假设接下来要对图中红色点(坐标假设是(i,j))做corner pooling,那么就计算(i,j)到(i,H)的最大值(对应Figure3上面第二个图),类似于找到Figure2中第一张图的左侧手信息;同时计算(i,j)到(W,j)的最大值(对应Figure3下面第二个图),类似于找到Figure2中第一张图的头顶信息,然后将这两个最大值相加得到(i,j)点的值(对应Figure3最后一个图的蓝色点)。
在这里插入图片描述
作者假设有两个原因为什么检测角点比bbox 中心或者proposal好,

1.box中心更难定位,因为他需要目标的四个边,定位一个角点只要两个边,更简单,而且对于corner pooling,编码了一些关于角点定位显示先验知识。

2.角点提供了一个更有效的途径来密集地离散化box 的空间:只需要$O(wh)$角点来表示$O(w^2h^2)$可能的anchor。

3 CornerNet

输出两套heatmap表示左上和右下角点,对每一个角点预测一个embedding vector,为了预测更紧密的bbox,网络预测了对角点的偏移,来轻微调整角点的位置。在预测heatmaps,embedding,offsets,应用了一个简单的后处理算法来获得bbox。

backbone是hourglass network,backbone后接两个预测模型,一个是对于左上角,一个是对于右下角。在预测heatmap ,embedding,offset前还进行了corner pooling。
在这里插入图片描述

网络输出:

heatmap:(HxWxC,C是检测类别个数)

本文将一个目标视为一对关键点:bbox的左上和右下。一个卷积神经网络预测两套heatmap,一套是左上角点,一套是右下角点,他们的channel C都表示类别的数量,size都是HxW。没有backbone channel。每一个channel是二进制掩码,指示这个类别的角点的位置。

对于一个角点,只有一个gt positive 位置,所有的其他的位置都是negative。在训练中,我们减少对在gt位置半径内的进行错误定位的惩罚,这是因为他们在接近gt位置,也能够产生一个和gtbox足够重叠的box。半径取决于能够保证在这个半径内的一对点组成的框能够和gtbox至少重叠多少(这里iou设置为0.3)。

惩罚项减少是通过一个非标准化的2D高斯核核 exp ⁡ ( − ( x ) 2 + ( y ) 2 2 σ 2 ) \exp \left(-\frac{\left(x\right)^{2}+\left(y\right)^{2}}{2 \sigma^{2}}\right) exp(2σ2(x)2+(y)2),中心是在positive位置,他的σ是半径的1/3,意思是接近gt 位置的地方,这个惩罚项小。

损失函数,设pcij是类别c在heatmap的位置(i,j)的分数,ycij是热点图的gt值,这个值通过非标准化的高斯生成。这部分关于类别的损失函数是:
在这里插入图片描述
N是一个图像中的目标的数量,α和β是超参数,调整每一个点的损失贡献,设置α=2,β=4.

对α而言:就是在gt位置当它越接近1,他的损失权重就越小。不在gt位置,越接近0损失权重越小。

对β而言,当不在gt位置的手,当它接近gt位置,那么对应β的损失权重就小。

offset(HxWx2)

和centernet一样,直接照搬过来的:cornerner中用的采样因子是n

因为进行了采样因子为R,的下采样,这样的特征图重新映射到原始图像上的时候会带来精度误差,例如首先读入图像[640,320],然后变形成[512,512],然后下采样4倍成[128,128]。如果原图中心点映射到heatmap上的位置为[98.97667,2.3566666],但通过heatmap预测出的点为[98,2],直接将[98,2]映射回原图[640,320],就会有偏差,对一些小目标预测就会有问题,因此对于每一个corner,额外采用了一个local offset来轻微调整:

假设真实的offset是:
在这里插入图片描述
|xk/n|表示向下取整,xk,yk表示角点k的x和y坐标。

对左上和右下分别会预测一套偏移,这个偏移是所有类别共享的。

这个offset是根据损失函数计算得到:
在这里插入图片描述
\hat{Ok}是预测得到的offset,{Ok}是真实计算得到的offset,只对gt位置做offset loss。

embedding:(HxWx1)

将一个目标(bbox)的左上角点和右下角点分到一组。网络为每一个检测的corner分配一个一维embedding 向量,如果左上和右下角点属于一个相同的bbox,他们的embedding 向量距离就会很小(通过这个来分组)。具体的值不重要

embedding的loss

使用pull loss来讲corner组合到一起;

**回归的目标:**缩小属于同一个目标(第k个目标)的两个角点的embedding vector距离。
在这里插入图片描述
使用push loss来分离corner;

**回归的目标:**扩大不属于同一个目标的两个角点的embedding vector距离,使ek和ej相差大。
在这里插入图片描述
k表示目标k,etk表示左上角的embbeding,ebk表示右下角的embbeding,ek是这两个的平均值,设置三角形为1。这个loss只用在gt 角落位置。

3.4corner pooling具体实现:

在backbone后接了两个分支一个分支是左上结点的,一个分支是右下结点的。
在这里插入图片描述
在左上结点分支之后接两个分支ft和fl,分别是往右看的corner pooling 和往下看的corner pooling,
在这里插入图片描述
这两个分支的特征图都是HxW,计算从(i,j)往下到(H,j),(i,j)往右到(i,W)的最大值,作为当前位置的特征值t_{ij},l_{ij},在将二者加到一起(add)。公式如下:
在这里插入图片描述
对每一个像素点都用这个公式计算起来太复杂,公式还用到了递归,所以作者提出了下图简单的思想
在这里插入图片描述
第一排,从右往左遍历每一个像素点。每个像素点等于往右看的max-pooling

第二排,从下往上遍历每一个像素点,每个像素点等于往下看的max-pooling
定义右下角结点的corner pooling 采用了类似的方法。具体是往上看,和往左看取maxpooling

实验:

训练时,输入511x511,输出:128x128,总的损失函数:
在这里插入图片描述
第一项是左上,右下角点热点图上损失,中间两项是embedding损失,最后一项是用于下采样后映射回原图的精度损失回归。设置α,β都是0.1,

test:

在角点heatmap上采用3x3maxpooling来进行nms,具体操作:(自己认为的)例如设阈值为0.75。
在这里插入图片描述
0.6没有比周围一圈都大,所以这种情况不处理,不认为0.6检测了一个角点。
在这里插入图片描述
0.9比周围一圈都大,周围nms大于0.75的都筛掉,认作同一个目标,小于0.75的认作其他目标,认为0.9检测到了一个角点。最后取前一百个分数的角点。

然后从热点图,选取前一百个左上角点,前一百个右下角点,逐个匹配,生成100x100个候选框。然后用offset轻微调整他们的位置。计算左上和右下角点的embedding 的L1 distance如果距离小于等于0.5而且这两个角点来自同一个类而且右下角大于左上角,最终留下1000个候选框,这样的情况才分为一对角点。检测的分数等于左上角点的分数和右下角点分数的平均值。

保持输入图像的原始像素(而不是resize到固定尺寸),用0填充。应用soft-nms来抑制冗余的检测。只有前一百个检测被选出。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值