在学习动手学CV-Pytorch的先验框部分内容时,需要生成一个先验框,这里在学习后对先验框以及生成的代码做解释。
关于先验框
在众多目标检测模型模型中,都有先验框的存在,在Faster RCNN中称之为锚点(Anchor),在SSD中称之为先验框(prior bounding box)。简单来讲,先验框就是预先设置好的用于检测物体的框,这些框具有非常多的种类(不同的长宽比),以此可以更好的去拟合目标框,即高交并比(IoU)。
先验框设计
这里采用最基础的在SSD与Faster RCNN设计的9种做例子。这9种为:3种尺度(大小),每种尺度下有3种长宽比的先验框,分别为2:1, 1:1, 1:2。如下图所示。
图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 = 0.2 \times \sqrt{2S} \] scale / np.sqrt(ratio)
则为其宽,计算同理。最后使用prior_box.clamp_(0, 1)
裁剪掉先验框大于图像的那一部分,如图2所示。因为先前做了归一化,所以这里直接去掉 (0, 1) 之外的值。