【目标检测】Anchor Free —— CornerNet

编程入门 行业动态 更新时间:2024-10-26 08:35:05

【<a href=https://www.elefans.com/category/jswz/34/1770031.html style=目标检测】Anchor Free —— CornerNet"/>

【目标检测】Anchor Free —— CornerNet

Contents

    • 0 写在前面
    • 1 Introduction
    • 2 CornerNet
      • 2.1 Overview
      • 2.2 Detecting corners
      • 2.3 Grouping Corners
      • 2.4 Corner Pooling
      • 2.5 Hourglass Network
    • 3 实现总结


开始之前学习一个单词热热身:

waive 英[weɪv]
放弃(权利、要求等);
He pleaded guilty to the murders of three boys and waived his right to appeal.
他承认谋杀了3个男孩,并放弃上诉。


0 写在前面

      CornerNet: Detecting Objects as Paired Keypoints.

      早就要补🙅‍anchor free的坑,先从CornerNet开始吧,学习完论文的第一感觉是CornerNet检测物体的"Paired Keypoints"和自己在用LabelImg无情打标时候的思路是一摸一样的。
" we detect an object bounding box as a pair of keypoints, the top-left corner and the bottom-right corner, using a single convolution neural network. "
      首先它是端到端的,在训练时不需要提供anchor的大小,其次该论文还提出"corner pooling",一种新的池化方式,可以帮助网络更好的定位角点,从而更好地定位物体位置。

1 Introduction

     论文中一句话对One-stage检测方法做了总结:
" One-stage detectors place anchor boxes densely over an image and generate final box predictions by scoring anchor boxes and refining their coordinates through regression."
使用anchor boxes有两个缺点:

  1. 在一张图片上生成的很多很多的anchor boxes(40k~100k),检测器被训练去判断这些anchor boxes是否与真实框有sufficient overlap,结果是生成的所有anchor boxes中仅有极少一部分与真实框有重叠,这样导致了正负锚框的数量极大不平衡从而降低了训练时间。(没得办法,anchor boxes的思想就是相当于在初始图片上枚举越多的候选框,那么能够检测出图片中的全部物体的概率就越大,所以就慢咯)
  2. 使用anchor boxes则引入了很多超参数,比如在特征图上每个点的anchor个数、尺寸以及长宽比(aspects ratios),并且在多尺度预测的网络结构中,不同尺度的特征图上需要的anchor大小通常也是不同的。

     CornerNet使用单一卷积网络生成两个heatmap和两个embedding vector:所有目标的左上角和所有目标的右下角的热点图heatmap以及每个顶点的连接矢量(embedding vector)。也就是首先利用heatmap分别预测边界框的所有左上角点与所有右下角点,再通过连接矢量(embedding vector)来将属于一个物体的左上角和右下角关联起来,进而形成一个边界框。下图是CornerNet的pipeline。

     第二个创新点是提出了corner pooling用于定位顶点,因为由于检测物体的形状变化,不可以通过物体特征来确定角点的位置(比如一个圆形物体的边框角点一定是在圆的两条垂直切线的焦点处的),一个目标的bbox的Corner往往位于目标之外。作者认为,要确定一个location是不是top-left corner,需要从这个location水平向右看,才能知道是不是目标的topmost边界,同理,从这个location垂直向下看,才能知道是不是目标的leftmost边界,这就是corner pooling
层,如下图的例子。

     以Top-Left Corner Pooling 为例,对于一个特征图,分别提取特征图对应位置处的水平和垂直方向的最大值,然后求和,最终得到这个位置的vector。为什么是一个vector呢?因为特征图每个通道独立进行,所以是一个vector,其长度为category数量。所有位置的vector就组成heatmap。如下图所示。

2 CornerNet

2.1 Overview

简单概括CornerNet就是使用Hourglass作为主干网络的神经网络生成两组heat maps来预测不同类别下的corners,其中一组负责预测左上角,另一组负责预测右下角。此外同时针对每个corner预测embedding vector,用于判断某左上角点和右下角点是否同属一个目标,并且为了使得通过预测左上角点和右下角点得到的bbox更加紧贴目标,网络还预测了corner的偏差offset。如下图所示。


     在主干网络后直接接两个预测头,每个预测头有一个的corner pooling层,之后预测heatmap,embedding和offset三个部分。虽然当前的目标检测方法很多都是对不同scale的目标使用不同scale的feature(FPN),但是本文仅将预测模块应用到hourglass network的最后一层输出上。

2.2 Detecting corners

     对于某个corner,仅有一个gt positive location,其他location相对于这个corner均为negative。在训练阶段,损失函数中对negative location的惩罚不是均等的,因为即使一对错误的corner检测(左上和右下),如果足够靠近 gt corner locations的话,那么生成的box与 gt box 仍有很大的IOU,也同样可以作为预测框来输出。所以作者将以gt positive location为中心,以通过目标的尺寸计算出的半径(后面讨论如何计算得到)画圆,使得在这个圆内生成的一对角点构成的边界框与真实框的IOU至少为t(论文中的实验,t=0.3)。
     那么原本的gt positive location由仅有一些位置为1,其余均为0变成了原本值为1的附近的值由0变为由高斯公式计算出的逐渐衰减的值。 这些值通过高斯公式

     计算得到,其中中心为positive location,σ为半径的三分之一。

     那么如何求这个角点处与目标的尺寸相关的半径值呢?
     其主要还是依赖于目标边界框的宽高,其计算方法为下图所示。 实际情况中会取IOU=0.7,即下图中的IOU=0.7作为临界值,然后分别计算出三种情况的半径,取最小值作为半径r

     注意,这里将真实框的标注由0/1变成0/Gauss(0,1)/1的目的仅仅是改变对于negative location的惩罚,并非将gt positive location的范围主观扩大!!!
     那么关于角点检测的损失函数,作者结合Focal Loss的思想,具体为,

其中:
     N为一张图片中物体的个数;
     α和β是控制每一个角点的超参数(论文中α=2,β=4);
     pcij为网络预测heatmap上的(i,j)位置处为类别c的预测值。从上式可见,只对negative position考虑降低惩罚。

     说完了Loss,接下来讲一下关于坐标精度修复的问题。
     在降采样的特征图上预测点的位置,之后再映射到原图上时,免不了产生精度损失,这对于小物体的IOU会产生极大影响。为了解决该问题,作者增加了一个坐标偏差的预测,gt 的坐标偏差由下式计算得到:
     其中n为主干网络降采样的系数,xk、yk为第k个真实角点在原图上的位置坐标。

     记预测坐标偏差为o^k,则预测偏差损失函数为
     在测试阶段,根据得到的预测偏差offset,设在heatmap上位置(x, y)预测为一个corner,对应预测的offset为(🔺x, 🔺y), 那么预测到的corner对应在原图上的位置为

     顺便回顾一下L1Loss /L2Loss/SmoothL1Loss

Loss表达式
L1Loss,平均绝对误差(Mean Absolute Error,MAE)
L2Loss,均方误差(Mean Square Error,MSE;PyTorch中也将其命名为torch.nn.MSELoss)
SmoothL1Loss,简单讲就是平滑版的L1 Loss


     对于SmoothL1Loss仔细观察可以看到,当预测值和ground truth差别较小的时候(绝对值差小于1),其实使用的是L2 Loss;而当差别大的时候,是L1 Loss的平移。SooothL1Loss其实是L2Loss和L1Loss的结合,它同时拥有L2 Loss和L1 Loss的部分优点。

  1. 当预测值和ground truth差别较小的时候(绝对值差小于1),梯度(曲线斜率)不至于太大。
  2. 当差别大的时候,梯度值稳定,不容易产生梯度爆炸。

2.3 Grouping Corners

     两组heatmaps中将会分别预测出很多左上角corners和右下角corners,如何确定某个左上角corner和右下角corner(组成一对corners)是否来自同一目标?作者使用embedding方法,为每个corner生成embedding vector,如果一对corners来自于同一目标,那么对应的两个embedding vector应该很接近,即一对corners的embedding vector之差很少。

     对于网络预测的embedding feature map的维度为h×w×l,这里的l=1,即对于预测的整个h×w×c的corner,仅预测h×w×1的embedding值,相当于把c个维度的不同类别的预测角点压到一个通道上进行匹配。作者引入了pull损失和push损失:

     其中 N 为一张图片中的目标数量, ▲=1 。

     从两个损失的命名可见,Lpull 是为了将同一目标的etk、ebk的两个embedding拉的更近,同一目标的两个embedding越接近,pull损失越小。使用这个损失学习,更偏向于将同一目标的两个embedding值的更接近。 Lpush则使不同目标的均值embedding尽可能互相“推开”/分离(这里的不同目标指的是一张图片上的K对点组成的K2个边界框),公式中ek、ej均为etk、ebk的均值,互相推开的程度由"▲"来量化。当两个不同目标的均值embedding的差的超过 “▲” 时,我们认为可以足够区分corner是来自不同的目标,此时push损失为0是很合理的;而不超过 “▲” 时,会导致判断(这两个corners属于同一目标)错误,需要对这样的embedding作惩罚,这就构成了push损失。

     总之,embedding本身没有target value(事实上也很难去给出一个绝对的值),它主要是通过训练网络的过程中使得Loss变小为原则,两个embeddings相互约束形成的结果。所以使用pull和push损失学习,可以看成是为了让生成的embedding遵守规则,这样在测试阶段,就可以基于这些约束规则根据embedding值对corners进行同目标归并。

最终整个网络的损失函数如下:

2.4 Corner Pooling

     关于Corner Pooling的计算,不要管论文中给出的两个让人看不懂的公式,直接看下图:

     上图为计算top-left corner pooling,对于某个位置,分别从下向上/从右向左不断取遇到的最大值,最后将两个方向的值相加即为这个位置的corner pooling结果。bottom-up corner pooling取最大值的方向相反即可。即每次沿着该方向上遇到的最大的值作为填充值,即可快速实现corner pooling。

     接下来看看预测模块的具体实现过程。首先从backbone后引出三个分支,上边两个分支为Top-Left Corner Pooling模块,下面的一个分支是起到残差连接的作用;残差连接后经过一个ReLU激活函数和一个3×3卷积后,输出三个分支用于预测Heatmaps、Embeddings、Offsets。

2.5 Hourglass Network

     CornerNet的backbone使用Hourglass网络,这个网络在人体姿态估计任务中首次被引入。Hourglass网络是全卷积网络,包含一个或多个hourglass模块。

     作者使用了两个Hourglass Module作为主干网络,并在其基础上做了一些修改,下图为主干网络结构图(来源见文末)

在原有hourglass的基础上,作者做出的改进总结如下:

  1. 在输入hourglass module之前,需要将图片分辨率降低为原来的1/4倍。论文采用了一个stride=2的7x7卷积和一个stride=2的残差单元进行图片分辨率降低。
  2. 使用stride=2的卷积层代替max pooling进行downsample
  3. 共进行5次downsample ,这5次downsample后的特征图通道为[256,384,384,384,512]
  4. 采用最近邻插值的上采样(upsample),后面接两个残差单元

     其中作者仿照HourglassNet的,采用了Intermediate supervision,HourglassNet论文中讲到Intermediate supervision的作用:
     Intermediate supervision就是要在两个Hourglass模块中间引出一个支路来和后面的预测输出加在一起计算loss, 使得intermediate heatmaps 能够被计算loss。


3 实现总结

     小总结一下,通过上述的网络结构以及损失函数,就可以开始训练网络了。在训练过程中,肯定是网络的预测结果和真实监督值之间的比较进而可以更新网络参数,那么提供给网络的真实监督值是什么样的呢?
     网络接受511×511×3的图片,预测出:
(1)左上corner的heatmaps,大小为(batch size,128,128,80)
(2)左上corner的embedding,大小为(batch size,128,128,1)
(3)左上corner的offsets,大小为(batch size,128,128,2)
(4)右下corner的heatmaps,大小为(batch size,128,128,80)
(5)右下corner的embedding,大小为(batch size,128,128,1)
(6)右下corner的offsets,大小为(batch size,128,128,2)

     那么就需要在网络训练过程中提供这些真值呗!

  • 对于角点的监督值,真实左上角点和右下角点在gt heatmap图上的相应位置为1,以该点为圆心,使用高斯分布获取其临近区域的值(越靠近真实角点的值越大,越远离的越小)。
  • 对于Offset,是通过上述的公式计算出来的,也是一个固定的值。
  • 对于embedding,它本身没有targtet value(事实上也很难去给出一个绝对的值),它主要是通过训练网络的过程中使得Loss变小为原则,因为这部分的Loss的计算,确实没有用到"真实值"呀~

参考博客
部分图片来源

欢迎关注【OAOA

更多推荐

【目标检测】Anchor Free —— CornerNet

本文发布于:2024-03-09 15:56:41,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1725429.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:目标   Anchor   CornerNet   Free

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!