目标检测SSD
目标检测SSD
1. 锚框的长和宽
1.1 书上代码解析
s指的是长宽的缩放比例而非面积的缩放比例,比如s=0.5,则面积就是原图像的0.5^2=0.25倍。r是宽高比,指的是将原图像归一化为正方形后截取的锚框的宽高比;或者说是在原图像的宽高比基础上乘以r,才是锚框的宽高比。锚框的实际宽高比即
1 | w0 = torch.cat((size_tensor * torch.sqrt(ratio_tensor[0]), |
先不看in_height / in_width
。上面解得的归一化后的公式与代码所写的一模一样。代码中的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定义不变),直接认定它代表锚框的宽高比,会有如下公式: multibox_prior()
函数要传入原图像的长度和宽度。 下面实验验证,不论特征图的长宽怎么变,r和s的定义都是一致的。
2. 锚框偏移
假设
- 激活的锚框(即给分配了某gt的正样本),其与某gt的IOU肯定不低,则其x、y、w、h也肯定差不大,这是前提
- x、y:做差后分布于零点对称,除以锚框宽或高起到归一化作用,值分布变窄
- w、h:做除法后用log,可近似线性,且使得结果的分布呈现零点对称,使得网络回归更简单