有同样的疑惑,没太理解意思,你弄明白了吗
有什么办法用d2l包一次画多张目标检测图吗,还是说通过for loop一张一张画
我也有这个问题,请问你解决了吗
(20个字符)
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