s指缩放比 r指宽高比 w,h原图像宽和高
锚框的宽高比 : w’/h’ = w / h * r
锚框的大小 : w’*h’ = w * h * s * s
因此 w’ = w * s * sqrt(r)
h’ = h * s / sqrt(r)
再除以w,h得到归一化后的锚框的宽和高
w’ / w = s * sqrt(r)
h’ / h = s / sqrt(r)
看李沐老师视频里说缩放比是锚框与图片面积之比,宽高比是锚框的宽和高之比,但是我并没有推导出文中给出的那个公式。
(代码太难懂,评论区各抒己见,公式都不太一样,官方能否给出锚框宽度和高度公式的由来,不然不清不楚的,大家都在猜不同的r和s可能是什么意思。)
w = torch.cat((size_tensor * torch.sqrt(ratio_tensor[0]),
sizes[0] * torch.sqrt(ratio_tensor[1:])))\
* in_height / in_width # 处理矩形输入
解释下为什么会有* in_height / in_width
这个操作。
实际上 之所以锚框的w要乘以图片(特征图)的高再除以图片(特征图)的宽,
单纯是为了如果你的图片(特征图)是矩形(长方形(特指不含正方形))而不是正方形的时候,以图片(特征图)的高h为基准生成标准的正方形锚框,
然后以正方形锚框为基准生成各种ratio的最终锚框。如果你的图片从始至终都是正方形 那么加不加这个操作没有任何区别。因为返回的是相对于被归一化了的图片上的坐标,也就是相对位置。最后只要和任何图片相乘都可以按照所乘的图片的相对位置画上框。
w = torch.cat((size_tensor * torch.sqrt(ratio_tensor[0]),
sizes[0] * torch.sqrt(ratio_tensor[1:])))\
* in_height / in_width
h = torch.cat((size_tensor / torch.sqrt(ratio_tensor[0]),
sizes[0] / torch.sqrt(ratio_tensor[1:])))
你说的对,现在终于理解 为什么会有* in_height / in_width
这个操作了,说下我的总结:
1、原图坐标进行了归一化,描框坐标显然同样需要归一化,归一化后显然没有 * in_height / in_width这个操作;
2、我们认为size_tensor=1且ratio_tensor=1时生成的描框为基准描框,当w中没有* in_height / in_width这一项时,基准描框的实际尺寸为原图像的尺寸,此时就不能保证我们的基准描框实际尺寸一定为正方形。当原图为正方形时,基准描框为正方形;当原图不为正方形时,我们仍然想要基准描框为正方形(单纯的人为设置),因此需要在w上* in_height / in_width,这时当我们看上述公式,s=1,r=1,对w和h同时乘in_width后,基准描框的长和宽就均为in_height了,满足正方形
对的,在这里是以h作为基准进行归一化的,就是s=0.75,锚框是正方形的,锚框的h就是原图的h*0.75,而w并不是原图的w*0.75。
同样地,我们也可以这么写:
w =t.cat((size_tensor*t.sqrt(ratio_tensor[0]),sizes[0]*t.sqrt(ratio_tensor[1:])))
h = t.cat((size_tensor/t.sqrt(ratio_tensor[0]),sizes[0]/t.sqrt(ratio_tensor[1:])))/in_height*in_width
以W为基准,进行归一化,生成的锚框的w就是w*0.75。
下面就是不同的效果了,主要看那个蓝色的框框,大致可以看出来区别:
- 对w进行归一:
2.对h进行归一:
3.什么都不干:
最后一句说错了,尴尬,咋还改不了,“对w和h同时乘in_width后,基准描框的长和宽就均为in_height了,满足正方形”,应该改为 “对w和h分别乘in_width和in_height后,基准描框的长和宽就均为in_height了,满足正方形”
你的画的图一和图二得描述好像写反啦2333333
這麽長一篇評論,只有这一个答案是靠谱的。
:+
代码里输入的r’是锚框的w/h,书里给的r是锚框的(w’/h’)除以原图的(w/h),而代码里把r’当作r来算,最后为了满足w/h=r’,让w’乘以了 in_height / in_width.
实际上r = r’ * in_height / in_width. 和你下面的式子等价。当然两种方法都可以生成正确的锚框,就是逻辑和代码有出入。
以同一像素为中心的锚框的数量是n+m−1。这里n+m-1计算方式是这样的,比如考虑缩放比s1,s2,s3,宽高比:r1,r2,r3。文中提到“ 在实践中,我们只考虑包含s1或r1的组合:”,所以这里的生成的锚框个数是:
(s1,r1),(s1,r2),(s1,r2),
(s2,r1),(s2,r2),(s2,r2),
(s3,r1),(s3,r2),(s3,r3),
这里的锚框就是包含r1+包含s1的锚框,即:(s1,r1),(s1,r2),(s1,r2),(s2,r1),(s3,r1),一共m+n-1 = 3+3-1=5个