锚框


这是个人理解和公式推导,欢迎探讨。

有同样的疑惑,没太理解意思,你弄明白了吗

1 Like

有什么办法用d2l包一次画多张目标检测图吗,还是说通过for loop一张一张画

我也有这个问题,请问你解决了吗
(20个字符)


请问文中的偏移量是如何推导的呢?

1 Like

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可能是什么意思。)

2 Likes

虽然不是完全和代码一样 但是推导一下边框生成大概的逻辑 可以对照着狗狗照片s=0.75,r=0.5的来理解。

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。


下面就是不同的效果了,主要看那个蓝色的框框,大致可以看出来区别:

  1. 对w进行归一:
    w归一
    2.对h进行归一:
    h归一
    3.什么都不干:
    什么都不做
1 Like

最后一句说错了,尴尬,咋还改不了,“对w和h同时乘in_width后,基准描框的长和宽就均为in_height了,满足正方形”,应该改为 “对w和h分别乘in_width和in_height后,基准描框的长和宽就均为in_height了,满足正方形”

你的画的图一和图二得描述好像写反啦2333333

Anchor 的两种编程实现 - xinet - 博客园 (cnblogs.com)

我的思路是这样的。不过,这个写的比较早,当时使用的是高宽比。

codelab 中获取图片不存在,截图放到content/img/catdog.jpg, 能够运行成功


成功的anchorbox

1 Like