CornerNet 笔记
前言
1.本文重点是CornerNet的网络结构、损失函数和corner pooling,尽量用较少篇幅表达清楚论文算法,其他一些不影响理解算法的东西不做赘述
2.博客主要是学习记录,为了更好理解和方便以后查看,当然如果能为别人提供帮助就更好了,如果有不对的地方请指正(论文中的链接是我经过大量搜索,个人认为讲解最清楚的参考)
创新点
1.提出直接检测corner的one-stage检测算法CornerNet
2.提出corner pooling
问题引出
现在最先进的目标检测算法基本都是基于anchor的,这样就会造成两个问题:
1.anchor过多,正负样本不均衡
2.anchor引入了许多超参数和设计选择,如anchor的个数,大小和宽高比
上述问题会使网络训练变得复杂,所以作者舍弃anchor借鉴人体姿态估计,提出一种直接检测目标角点的算法CornerNet
CornerNet
如上图所示,CornerNet预测每个目标的左上角点和右下角点,并输出每个检测到的角点的嵌入式向量
1.网络结构
CornerNet的基础网络是Hourglass Network,后面接两个预测模块,一个负责预测左上角点一个预测右下角点,每个预测模块都包含corner pooling和三个输出分支,分别是heatmaps、embeddings和offsets,heatmaps是预测的角点信息,是一个HxWxC的特征图,通道数C是类别数,也就是每一类都有一张包含该类角点信息的图征图,特征图的每个值都是(0,1)之间的数,embeddings用来组合角点,以确保两个角点是同一个目标的左上角和右下角点,offsets用来调整角点位置
2.损失函数
损失函数分为三部分,也就是heatmaps、embeddings和offsets
2.1 heatmaps部分损失
其是Focal loss的变体,H、W、C很容易理解是heatmaps特征图的高、宽和通道数,N是目标个数,是类别C的(i,j)位置的分数,是gt的值,也就是label
注:
以前大部分算法里的label都是0或1,但是这篇的有点特殊,当(i, j)位置是角点时,=1,但是当(i, j)位置不是角点时, 不是简单粗暴的等于0,而是一个基于真正角点坐标的二维高斯分布,离真正角点近,(i, j)处的值就大一点,接近1,远则反之,这样处理的作用可以认为是增加一点正样本数量,防止正负样本不均衡
2.2 embeddings部分损失
目的就是让同类别的角点embedding值接近,这个很容易懂,其中是左上角点的embedding值,是右下角点的embedding值,是二者均值;解释一下,它的目的就是让不同类别的角点embedding值差变大,其中和是不同类别的角点,“三角号”=1,当和的值相差大于1时,=0,意思就是不用管它了,当和的值相差小于1时就不等于0了,这个时候就会产生损失,网络会对其进行优化
2.3 offsets部分损失
是真实的offset,也就是gt;帽是预测的offset,网络学习预测offset来调整角点坐标
其中:
意思就是某个点在原图上的坐标经过cnn(n为所有层的stride乘积),改点在特征图上坐标理论上应该是/n,但实际会进行下采样,上述式子表示的就是理论上准确的坐标和下采样之后的坐标之间的误差offset
3.corner pooling
如上图所示,目标检测的bbox角点在目标的外面,如果用普通池化很难学习,作者提出corner pooling来使角点包含目标的信息,例如上图中左边的人,上边是脑袋,左边是手,corner pooling就是将这两个信息联系到左上角中,右下角同理,具体的见下图
以单个点为例,也就是output中蓝色点怎么来的,它是前面两个特征图上红色点相加而来,那么红色点又是怎么来的,上面红色点为例,红色点所在列从下往上依次比较像素值取大的值得来(这就达到了把上面那个人的右手信息联系到左上角点中),再具体的操作继续见下图
如图是以四个点为例,现在以单个点,后面的6所在点为例(可以联系到上面图的蓝色点),6是前面两个特征图上对应位置点(上下两张对应点的值都是3,就是第二行第二列)的值相加而来,那这两个特征图上对应的点就相当于之前的红色点,现在看3是怎么来的,以下面特征图第二行第二列的3为例,它就是最前面的特征图上第二列从下往上(0-2-3-1-3)依次比较再取大值(0-2-3-3-3)得来
CornerNet 缺点
作为一刀流速度还是慢