原文链接:https://blog.csdn.net/qq_34914551/article/details/102843418
很多人都知道Anchor-based的目标检测网络按照阶段来分有两类,以RCNN为代表的的二阶段检测和SSD,Yolo为代表的一阶段网络。其中二阶段网络的RPN和一阶段网络的输出,损失函数都有框回归的部分。本篇博客就详细解释框回归的原理,步骤和Smoth L1 loss.
前言
在正式讲解之前,我们需要知道,网络的输出不是框的坐标和宽,高。这些坐标,宽高需要从输出向量解码得到。我们都知道,目标检测网络box分支输出的是离GT的偏置(offset)。所以box分支的label,其实并不是坐标值,而是要把坐标值先按照一定格式要求编码为一个四维向量,四个值分别描述了框中心点xy离GT框中心点的偏置,以及宽和GT宽的尺度变化信息,以及高和GT的高的尺度变化信息。
框回归是啥
anchor-base目标检测方法是有anchor的。为简单描述起见,以下提到的anchor统统都在原图空间下。
如下图所示,绿色框是网络预定义的一个anchor,这个anchor对应的score非常高,所以网络会把这个anchor挑出来作为框的输出,但是anchor这个东西是死的,即预先按照位置比例以及长宽比以及anchor size提前预定的,所以anchor一般来说都是没法准确框到目标的,我们需要在anchor的基础上进行框回归,或者认为是调整。
一个框的信息用四个值能描述,框中心的xy坐标,以及框的宽高,这四个值。对于中心点的坐标的调整,其实就是偏移,数学运算是加和减;而对于宽和高的调整,数学运算是乘和除。因此在后面的部分我们可以看出anchor是如何回归(解码)得到最后的框位置。
训练过程中,编码GT
假设GT是 x c , y c , w , h x c , y c , w , h x c , y c , w , h xc,yc,w,hxc,yc,w,h x_c,y_c,w,h xc,yc,w,hxc,yc,w,hxc,yc,w,hxc,yc,w,h ,这四个值就是网络的框的位置输出(间接输出,因为由解码得到)。
从代码来看编码解码
先看编码
# matched 是框的GT,顺序是x,y, w,h ,下面一句通过先求框的中心点,然后框的中心点减去anchor的中心点得到差值
g_cxcy = (matched[:, :2] + matched[:, 2:])/2 - priors[:, :2]
# 差值除以anchor的宽和高,分别得到上述前两个公式dx, dy
g_cxcy /= priors[:, 2:]
# 先求GT的宽和高与 anchor的宽和高的比值
g_wh = (matched[:, 2:] - matched[:, :2]) / priors[:, 2:]
# 然后求log,也是一一与上述步骤对应。
g_wh = torch.log(g_wh)
#
loc = torch.cat([g_cxcy, g_wh], 1) # [num_priors,4]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
再看解码
boxes = torch.cat((
# anchor 的x y坐标加上 预测的xy的偏置项 乘 anchor的宽和高,就是前两行公式的反推。
priors[:, :2] + loc[:, :2] * priors[:, 2:],
priors[:, 2:] * torch.exp(loc[:, 2:] )), 1)
# 框左上角坐标
boxes[:, :2] -= boxes[:, 2:] / 2
# 框右下角坐标
boxes[:, 2:] += boxes[:, :2]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
结束语
到此为止,我的讲解结束了,如果觉得不错的,请点个赞或者留言鼓励哦。优质博客,欢迎转载,转载请注明出处。