这是一篇很久之前就看过的论文,当时没有仔细看,现在又翻出来看了。
CornerNet
CornerNet就像名称那样,网络就是预测物体的top-letf和bottom-right两个点。网络采用Hourglass Network 漏斗结构。
模型采用热力图进行预测方式,无anchor设置。Hourglass Network网络之后有两个分支,一个是top-left,另一个是bottom-right。每个分支之后会有三个输出Heatmaps,Embeddings,Offsets。
Heatmaps就是网络检测的角点的坐标位置。Embeddings是top-left和bottom-right关系的一个矩阵,当top-left一个位置的点和bottom-right上某个位置点距离较小那就是同一个物体的一对角点了。由于网络经过下采样预测位置和实际位置会有一定的偏移,offset就是偏移修正值。
- Heatmaps的大小是128 x 128,通道为80(coco数据,80类),所以Heatmaps是一个大小为128 x 128 x 80的张量。以Top-left corners模块中的Heatmaps为例,其每个通道代表coco数据中的80个类别,每个通道的128 x 128网格中的每个点的输出表示该点是一个左上角点的概率。并且该通道预测出来的所有左上角点对应的所有bbox的物体类别都一样。举个例子,假设在通道编号为10(假设物体类别是dog)的128 x 128热图里面,预测出了3个左上角点,也就是有3个bbox,那么这3个bbox的物体类别都是dog。
- Offsets大小为128 x 128,通道为2(分别为边角点x,y的偏移量)。由于用热图来表示某一点的xy坐标,会损失精度。因此cornerNet还对每个边角点预测其真实位置的偏移量。举个例子,假设通过热图预测出某一左上角点的坐标是(50,50),该坐标的对应尺度是热图的128 x 128,而真实的坐标从网络的输入尺度511 x 511,映射到128 x 128时是(50.2,50.6)这样就损失了精度了。现在cornerNet为(50,50)预测了偏移量为(0.3,0.5),那么可以计算出网络最终的预测坐标为(50.3,50.5)。尽管比真正的坐标(50.2,50.6)差了一点,但比(50,50)还是精确了许多。
- Embedding大小为128x128,通道为1。现在假设两个预测模块已经分别预测出了100个左上角点,和100个右下角点。那么有个问题,怎么知道哪一个左上角点和哪一个右上角点是属于同一个bbox呢?解决方法就是使用这个Embedding。Top-left预测模块和Bottom-right预测模块都有一个128x128的Embedding,简单来说,这两个Embedding中的每个值相当于一个标签。假设在Top-left预测模块里的Embedding的(50,50)位置的值是10(这个值是多少无所谓),那么其表示Top-left位置为(50,50)的左上角点的标签是10。如果,在Bottom-right预测模块里的Embedding的(100,100)位置的值也是10。那么就认为左上角坐标(50,50)和右下角坐标(100,100)属于同一个bbox。在实际应用中,属于同一个bbox的左上角和右下角的embedding值一般不会完全一样(到后面的Emdedding学习就可以知道为啥了),所以论文在判断左上角点和右上角点是否属于同一bbox的时是通过判断两个点所对应的embedding值的距离。
CornerNet设置
在训练期间,不是减少所有的负样本的数量,而是减少对正位置半径内的负位置给予的惩罚。 这是因为如果一对假角点检测器靠近它们各自的ground-truth位置,它仍然可以产生一个与ground-truth充分重叠的边界框。我们通过确保半径内的一对点生成的边界框与ground-truth的IoU ≥ t(我们在所有实验中将t设置为0.7)来确定物体的大小,从而确定半径。 给定半r径,惩罚的减少量由非标准化的2D高斯确定。
-
通过设计局部损失,N是一张图中物体的数量,α=2 and β=4 用来控制每个点的贡献。
-
通过设置图中位置(x,y)到热图的映射[x/n,y/n]偏差Ok
- 角点分组策略
图像中可能出现多个目标,因此可能检测到多个左上角和右下角。我们需要确定左上角和右下角的一对角点是否来自同一个目标边界框。我们的方法受到Newell等人提出的用于多人姿态估计任务的关联嵌入方法的启发[27]。Newell等人检测所有人类关节,并为每个检测到的关节生成嵌入。他们根据嵌入之间的距离将节点进行分组。
关联嵌入的思想也适用于我们的任务。 网络预测每个检测到的角点的嵌入向量,使得如果左上角和右下角属于同一个边界框,则它们的嵌入之间的距离应该小。 然后,我们可以根据左上角和右下角嵌入之间的距离对角点进行分组。 嵌入的实际值并不重要。 仅使用嵌入之间的距离来对角点进行分组。etk是对象k的左上的嵌入,ebk是对象k右下嵌入,ek是均值。使用‘pull’使同目标的嵌入相近,使用‘push’是不同目标嵌入产生特定距离∆=1。
- 联合多任务损失进行训练
Corner Pooling
使用如下公式进行关于top-left的corner pooling。因为需要进行top-left和bottom-right的max pooling。确定一个像素是否是左上角点时,需要在水平方向上往右看,在竖直方向上往下看。在确定是否时右下角点时,则需要在水平方向上往左看,在竖直方向上往上看。
对于top-left和bottom-right通过分别往下扫描和往右扫描,然后分别取最大值,最后相加。
测试
首先通过在角点热图上使用3×3最大池化层来应用非极大值抑制(NMS)。然后从热图中选择前100个左上角和前100个右下角。 角点位置由相应的偏移调整。 我们计算左上角和右下角嵌入之间的L1距离。距离大于0.5或包含不同类别的角点对将被剔除。 左上角和右下角的平均得分用作检测分数。
模型由于所有的one-stage模型,可以和two-stage媲美。