先验框的生成(Pytorch)

发布时间 2023-07-03 19:23:22作者: 绘守辛玥

  在学习动手学CV-Pytorch的先验框部分内容时,需要生成一个先验框,这里在学习后对先验框以及生成的代码做解释。

关于先验框

  在众多目标检测模型模型中,都有先验框的存在,在Faster RCNN中称之为锚点(Anchor),在SSD中称之为先验框(prior bounding box)。简单来讲,先验框就是预先设置好的用于检测物体的框,这些框具有非常多的种类(不同的长宽比),以此可以更好的去拟合目标框,即高交并比(IoU)。

先验框设计

这里采用最基础的在SSD与Faster RCNN设计的9种做例子。这9种为:3种尺度(大小),每种尺度下有3种长宽比的先验框,分别为2:1, 1:1, 1:2。如下图所示。

图1

图1 - 3种先验框

先验框生成

  在这里利用VGG16将原始图像压缩为7×7的大小,接下来依据这个大小的图片生成先验框。先验框的坐标表示方式为 \((C_x, C_y, w, h)\),即中心点x、y坐标,长,宽。生成先验框的代码如下。

def create_prior_boxes():
        fmap = 7 
        scales = [0.2, 0.4, 0.6]  # 框缩放倍数
        aspect_ratios = [1., 2., 0.5]  # 长宽比

        prior_box = []
        for y in range(fmap):
            for x in range(fmap):
                cx = (x + 0.5) / fmap  # 将x, y坐标归一化,以便后续截掉超出图像区域
                cy = (y + 0.5) / fmap

                for scale in scales:
                    for ratio in aspect_ratios:
                        prior_box.append([cx, cy, scale * np.sqrt(ratio), scale / np.sqrt(ratio)])

        prior_box = torch.FloatTensor(prior_box)
        prior_box.clamp_(0, 1)

        return prior_box

  对于scale * np.sqrt(ratio),假设其为先验框的长为\(W\),面积为\(S\)(这里实际为1,因为对每个像素做遍历),宽为\(h\),框缩放倍数为0.2,长宽比为2,则其计算公式为:

\[W \times h = {0.2}^2 \times S \]

\[\frac{W}{h} = 2 \]

  则可得出:

\[W = 0.2 \times \sqrt{2S} \]

  scale / np.sqrt(ratio)则为其宽,计算同理。最后使用prior_box.clamp_(0, 1)裁剪掉先验框大于图像的那一部分,如图2所示。因为先前做了归一化,所以这里直接去掉 (0, 1) 之外的值。

图2

图2 - 3种缩放倍数的先验框图示