![]()
什么是先验框?
了解过目标检测算法的朋友们肯定知道先验框(Anchor)的概念,那么什么是先验框,为什么要有先验框?若要解释这个问题,首先我们需要了解边界框回归原理。
bounding box regression
如图所示,图中的狗子是我们要检测的目标,也即是红框(Ground Truth)圈住的物体。在通常情况下模型预测到的框是绿色框。但是由于绿色框不准,相当于没有正确的检测出狗子。所以我们希望有一个方法对绿色框进行调整,使得绿色框更接近红色框。

对于预测框我们一般使用
(
x
,
y
,
w
,
h
)
(x,y,w,h)
(x,y,w,h)来表示,其中
x
,
y
x, y
x,y代表预测框的中心点,
w
,
h
w,h
w,h代表预测框的宽高。
现在设红框的坐标信息为:
G
=
[
G
x
,
G
y
,
G
w
,
G
h
]
G = [G_x,G_y,G_w,G_h]
G=[Gx,Gy,Gw,Gh]
绿框的坐标信息为:
G
′
=
[
G
x
′
,
G
y
′
,
G
w
′
,
G
h
′
]
G' = [G'_x,G'_y,G'_w,G'_h]
G′=[Gx′,Gy′,Gw′,Gh′]
那么要经过怎么样的调整才能使得绿框变成红框呢?目标检测中的做法是:平移+缩放。
- 将预测框的中心点平移到与真实框的中心重合的位置。
- 再将预测框的高和宽缩小或放大到与真实框一样的长度。
众所周知,平移至重合位置需要两个偏移量
b
x
,
b
y
b_x,b_y
bx,by,缩放也需要两个系数
s
w
,
s
h
s_w,s_h
sw,sh
那么显然这个偏移量与缩放系数的大小与真实框实际的偏差有很大关联。若原本预测框与真实框就很接近,需要偏移和缩放的大小也就少一点,反之亦然。所以我们肯定希望预测框与真实框越接近越好。
但是真实的情况往往是不同的,数据中的真实框都是各种各样的,有的可能非常大,有的可能非常偏,数据分布非常不统一,而预测框就更不用说了。这就导致了学习到的偏移量和缩放系数变化大,模型难收敛的问题。所以为了解决这个问题,我们引入了Anchor机制。
Anchor
虽然我们不能约束预测框的位置,但是可以统一真实框的位置。我们将假设我们将所有真实框的长宽都设为128,把这个长宽都为128的框叫做先验框(Anchor),也就是图中蓝色的框。那么这样模型学习到的系数都会偏向这个先验框。那么有人就会问了,那这个预测框要如何转为真实框?很简单,也是将它进行平移+变换的操作变回真实框。

不过只拿128一种尺度来代表所有真实框肯定是不合适的。所以在Faster RCNN中引入了9种尺度的先验框:
而加入了多个尺度之后,真实框如何选择合适的anchor又成了一个问题。一般我们选择IOU最大的作为先验框。
而这种固定尺度的anchor也会有缺陷,不能很好的适应所有数据集。例如coco数据集中就有很多小目标。所以后面也有YOLOv3这一类的目标检测模型使用k-means算法对所有真实框进行筛选。选出最有代表性的几个尺度作为anchor。
在什么阶段进行先验框匹配?
一般来说,我们都会在经过骨干网络处理的特征层上进行先验框匹配。因为如果在一开始的图片上就进行先验框匹配,那就会有很多先验框,这样计算量就会激增。以Faster RCNN为例,输入图片是600x600的大小,而特征层是38x38的大小。如果在输入图片上进行先验框匹配,那就产生
600
∗
600
∗
9
=
3
,
240
,
000
600 * 600*9 = 3,240,000
600∗600∗9=3,240,000个先验框,而在特征层上则是
38
∗
38
∗
9
=
12996
38 * 38 *9 = 12996
38∗38∗9=12996个先验框。下图是Faster RCNN特征层一个点上的先验框演示(其他点没有绘制)。
当然对于目标检测来说,一个模型内可能有不同大小的特征层,分别用于检测不同尺度的物体,其中心点的数量不一样。如YOLOv3系列的目标检测网络就有52x52,26x26,13x13的特征层。
本文章只是对Anchor机制的一些理解,若有错误之处,敬请指正。
版权声明:本文为CSDN博主「热血厨师长」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42392454/article/details/110950290
![]()

暂无评论