目标检测SSD

目标检测SSD

1. 锚框的长和宽

1.1 书上代码解析

s指的是长宽的缩放比例而非面积的缩放比例,比如s=0.5,则面积就是原图像的0.5^2=0.25倍。r是宽高比,指的是将原图像归一化为正方形后截取的锚框的宽高比;或者说是在原图像的宽高比基础上乘以r,才是锚框的宽高比。锚框的实际宽高比即。之所以r=1时你看到的是方形,之后会解释。 由此,可得以下方程组 解得 分别处以w和h进行归一化,可得 而在代码中我们可以看到:

1
2
3
4
5
w0 = torch.cat((size_tensor * torch.sqrt(ratio_tensor[0]),
sizes[0] * torch.sqrt(ratio_tensor[1:])))\
* in_height / in_width
h0 = torch.cat((size_tensor / torch.sqrt(ratio_tensor[0]),
sizes[0] / torch.sqrt(ratio_tensor[1:])))

先不看in_height / in_width。上面解得的归一化后的公式与代码所写的一模一样。代码中的就是锚框归一化后的宽高(此时消除了原图像w和h的影响,可以认为,r所代表的宽高比就是此时锚框的宽高比,r=1时,是一个正方形锚框,也即此时的值是一样的)。但是呢,由于我们显示的时候需要乘以图像的实际宽高所以,乘后的锚框实际宽高比就不是1了,所以才要乘以in_height / in_width,作用就是抵消乘以实际图像长宽后r会改变的问题,当然这样做存粹是为了显示方便(也让你误以为r是指锚框的宽高比),带来的副作用就是,锚框的实际面积就不再是原始图像的( ̄ε(# ̄)。

由于实际在我们进行目标检测时,特征图长和宽都是相同的,比如(19, 19)、(7, 7),所以in_height / in_width恒等于1,因此对于实际的使用并不会带来副作用。但此时,如果要将锚框显示出来,归一化后的锚框再乘以图像实际长宽后,所显示的锚框的长宽比会改变。如下图所示,特征图宽高是(1, 1),当r=1,s=0.5时,最终锚框的宽高比并不是r=1,而是。即上述代码中in_height / in_width这部分失效了。好消息是,面积是原图的,又符合定义了。\( ̄︶ ̄\))

1.2 尝试的改动

所以如果r宽高比的定义按照**原图像的宽高比*r来定义,那么沐神的代码和书上的公式在实际使用时都是没问题的。只是将这个函数作用于特征图宽高不相同的实例时(比如为了给观众显示方便,直接作用上面这幅图像),会产生一丢丢歧义:此时的r的定义居然又变回了锚框的宽高比**。

我们可以尝试来重新定义宽高比r(s定义不变),直接认定它代表锚框的宽高比,会有如下公式: 解得 分别处以w和h进行归一化,可得 这样定义的话,就要求multibox_prior()函数要传入原图像的长度和宽度。 下面实验验证,不论特征图的长宽怎么变,r和s的定义都是一致的。

2. 锚框偏移

假设是某个标签目标,是某个anchor,边框回归与Faster-RCNN类似 回归的偏移相对的是的中点和宽高(cx, cy, w, h) 解释:

  • 激活的锚框(即给分配了某gt的正样本),其与某gt的IOU肯定不低,则其x、y、w、h也肯定差不大,这是前提
  • x、y:做差后分布于零点对称,除以锚框宽或高起到归一化作用,值分布变窄
  • w、h:做除法后用log,可近似线性,且使得结果的分布呈现零点对称,使得网络回归更简单