文章目录[隐藏]
一.锚框(anchor box)/先验框(prior bounding box)
在众多经典的目标检测模型中,均有先验框的说法,有的paper(如Faster RCNN)中称之为anchor(锚点),有的paper(如SSD)称之为prior bounding box(先验框),实际上是一个概念,特此说明。
1.锚框的作用
对于目标检测任务,有这样一种经典解决方案:遍历输入图像上所有可能的像素框,然后选出正确的目标框,并对位置和大小进行调整就可以完成目标检测任务。这些进行预测的像素框就叫锚框。这些锚框通常都是方形的。
同时,为了增加任务成功的几率,通常会在同一位置设置不同宽高比的锚框(本文的方式在改变宽高比的同时维持面积不变)。此处注明,锚框的设置形式有很多,本文采用SSD的方式进行解释。
2.特征图中的锚框
如果按照上述方案不加改变的执行,即使是一张图片所产生的锚框将多到我们难以承受的地步。对于一个224x224的图片,假设每个位置设置3个不同尺寸的先验框,那么就有224x224x3=150528个锚框;这个数量太大了!所以,更好的处理方式是先对原图进行下采样处理,得到feature map,在feature map中生成锚框。以vgg16的backbone为例,把224x224的输入图片下采样了5次,得到7x7的feature map,那就只需要得到7x7x3=147个先验锚框,这样的设置大大减少了先验框的数量,同时也能覆盖大多数情况。
3.先验框与IOU
在训练任务阶段,可以在输入图片中插入正确的目标框,以供网络学习ground truth信息。而判断一个锚框是否与目标框相近的指标,很自然的可以选择锚框和目标框的IOU(交并比)。 例如,可以设定一个阈值0.5,如果iou<0.5的先验框,这些框我们将其划分为背景,设为背景框,Iou>=0.5的被归到目标先验框。示例见下图
二.先验框的参数
如先前所述,一般会在同一位置生成不同形状和大小的多个锚框来增加预测的成功率。形状和大小分别用宽高比和尺度来描述。
1.尺度(scale)与宽高比(ratio)
尺度:描述基准锚框的大小信息。若尺度为a,那么基准锚框
由原图的宽和高分别缩小a倍所得。(注意,若宽高缩小为a倍,面积缩小
a
2
a^2
a2倍)
宽高比:生成锚框的形状信息,即最终生成锚框的宽和长的比。在改变宽高比时,应应维持最终生成的锚框和基准锚框
的面积恒定。(详见第3个小标题锚框的坐标描述)
2.锚框的生成位置
如前文所述,先把原图像处理后得到77的feature map,再在对应的feature map中生成锚框。下面给出一个示例,对应的把77的feature map 分割成相等大小的7*7的cell,代表位置信息,并画出了在中间位置的具有不同scale 和 ratio 参数的9个锚框。(注意,这里的cell只代表位置信息,与第一个小标题中的scale参数没有关系,即与生成锚框的大小没关系)
对于锚框的位置描述,一般采用中心位置的坐标,所以应在对应cell的坐标上+0.5。例如,假设上图中画出9个anchors的cell对应的坐标是(3,3),那么anchor的中心坐标应当是(3.5,3.5)
3.生成锚框的参数描述
我们可以用锚框的中心坐标和锚框的宽和高来描述一个锚框。
中心坐标已经在第二个标题中描述过了,不再赘述。介绍宽和高的计算。
假设基准锚框的宽和高是a和b,最终生成锚框的宽和高为x和y,宽高比为k。那么应该有
a
∗
b
=
x
∗
y
a*b=x* y
a∗b=x∗y 和
y
/
x
=
k
y/x=k
y/x=k 解方程即可得
x
=
a
∗
k
,
y
=
b
/
k
x=a*\sqrt{k},y=b/\sqrt{k}
x=a∗k
,y=b/k
那么最终生成的锚框可以描述为:
(中心横坐标,中心纵坐标,锚框的宽,锚框的高)
三.分类头和回归头
针对一个目标框,我们生成很多先验框并选取了一个IOU最大的先验框。接下来需要网络对这个先验框的类别做出预测,然后对先验框的位置和大小进行修改。
1.分类头
关于分类框的类别信息,以VOC数据库为例,共有20个类别;此外,我们还需要人为地加入一个背景框类别,一共21个类别需要预测,这种预测被称为分类头预测。
2.回归头
对于位置信息的预测,我们并不对锚框的绝对位置信息做预测,而是对位置锚框相对于目标框的偏差信息做预测,而且这种偏差信息需要经过某种方式的归一化。对这种经过归一化的位置偏差信息做出的预测,叫做回归头预测。
3.边界框的编码
对于位置信息的归一化处理,还可以叫做边界框的编码。此处介绍SSD中的编码方法。
下图中有一个先验框和一个目标框,并结合此图介绍对先验框的编码。
公式如下:
4.解码
解码只需要依据公式反向进行即可。
四.维度分析
假设输入的图像像素为224x224,经过VGG的预处理之后,会输出7x7的特征图,然后我们把特征图放入卷积层分别进行分类头和回归头训练。
基于上面的描述,输出的第一维和第二维即为7x7,而第三维和卷积处理方式有关,下面进行解释。
假设我们:
- 设置3种不同的尺度:0.2, 0.4, 0.6
- 设置3种不同的长宽比:1:1, 1:2, 2:1
那么在同一位置,我们将会生成33=9个不同形状大小的锚框。
在分类头中,我们需要预测21个类别,因此,分类头的第三维大小为:219=189。整个分类头的维度为:7x7x189。
在回归头中:我们需要预测4个位置信息,所以,回归头的第三维大小为:4*9=36。整个回归头的维度为:7x7x36。
最后, 我们还希望做一些特别的处理,因为我们每个anchor的预测独自成一维,因此,最终结果为:
- 分类头 batch_size x 441 x 21
- 回归头 batch_size x 441 x 4
本文参考:
https://datawhalechina.github.io/dive-into-cv-pytorch/
版权声明:本文为CSDN博主「是苍啊!」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_46110834/article/details/111410923
暂无评论