13.4.1 生成多个锚框
这个写的也太不清晰了。。。
设\(h,w\)分别表示归一化高度和归一化宽度,\(H,W\)表示输入图像的原高度和原宽度,则锚框的高度和宽度分别为\(H\times h,W\times w\)
缩放比:归一化面积,即\(hw=s^2\)
宽高比:归一化宽度和归一化高度的比例,即\(\frac{Ww}{Hh}=r\)
所以原始代码那个调整是错误的,我也不知道为什么这么调整。原始代码只能满足宽高比是正确的,但是面积不是。只不过差不了多少
然后来看代码:
step_h和step_w的作用是归一化,也就是把真正的坐标放缩到\([0,1]\)之间成为比例meshgrid是用来形成矩阵或者坐标的indexing='ij'表示按照矩阵的方式去形成,也就是说形成的框向下是第零维,向右是第一维,(shift_y[i][j],shift_x[i][j])对应的是(center_h[i],center_w[j])indexing='xy'表示按照坐标系的方式去形成,也就是说形成的框向下是第一维,向右是第零维,(shift_y[i][j],shift_x[i][j])对应的是(center_w[i],center_h[j])
w和h就是在模拟式(13.1)的组合torch.cat默认按照第零维链接,所以w和h是长度为\(1\)的张量w要做那个缩放应该取根号
anchor_manipulations是偏移量torch.stack((-w,-h,w,h))的意思是按照第零维堆叠起来。注意w和h都是大小为(boxes_per_pixel,)的张量,所以堆叠之后变成(4,boxes_per_pixel)repeat(in_height*in_width,1)表示第零维和第一维分别重复的次数x = torch.tensor([[1, 2], [3, 4]]) y = x.repeat(2, 3) # 第0维重复2次,第1维重复3次 print(y) # 输出: # tensor([[1, 2, 1, 2, 1, 2], # [3, 4, 3, 4, 3, 4], # [1, 2, 1, 2, 1, 2], # [3, 4, 3, 4, 3, 4]])
out_grid是各个锚框的中心点repeat_interleave就是在数中间插入
每一个点重复x = torch.tensor([[1, 2], [3, 4]]) y = x.repeat_interleave(2, dim=0) print(y) # 输出: # tensor([[1, 2], # [1, 2], # [3, 4], # [3, 4]])boxes_per_pixel次就是为了模拟出每个像素的所有锚框。之所以要这么插入,是因为下面要对Y进行变化,可以想想两者之间的联系

浙公网安备 33010602011771号