13.4.1 生成多个锚框

这个写的也太不清晰了。。。
\(h,w\)分别表示归一化高度和归一化宽度,\(H,W\)表示输入图像的原高度和原宽度,则锚框的高度和宽度分别为\(H\times h,W\times w\)
缩放比:归一化面积,即\(hw=s^2\)
宽高比:归一化宽度和归一化高度的比例,即\(\frac{Ww}{Hh}=r\)
所以原始代码那个调整是错误的,我也不知道为什么这么调整。原始代码只能满足宽高比是正确的,但是面积不是。只不过差不了多少
然后来看代码:

  • step_hstep_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])
  • wh就是在模拟式(13.1)的组合
    • torch.cat默认按照第零维链接,所以wh是长度为\(1\)的张量
    • w要做那个缩放应该取根号
  • anchor_manipulations是偏移量
    • torch.stack((-w,-h,w,h))的意思是按照第零维堆叠起来。注意wh都是大小为(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进行变化,可以想想两者之间的联系
posted @ 2025-07-20 20:16  最爱丁珰  阅读(6)  评论(0)    收藏  举报