anchor box(先验框)

Catalogue
  1. 1. anchor box(先验框)
    1. 1.1. 为什么
    2. 1.2. 以前的做法
    3. 1.3. anchor box 引入
    4. 1.4. 总结
    5. 1.5. 不足
    6. 1.6. 怎么选box?

anchor box(先验框)

anchor (锚; 给以安全感的人(或物); 精神支柱; 顶梁柱;)

为什么

对象检测中存在一个问题就是每个格子只能预测一个对象,如果想让一个格子检测出多个对象,用anchor box

以前的做法

假设我们有这样一张图片,对于这个例子,我们使用3x3的网格,可以观察到,行人和汽车的中心几乎在同一个网格,然而我们以前的方法一个格子只能预测一个对象,而且对于y输出的的向量量𝑦 = [𝑝𝑐 𝑏𝑥 𝑏𝑦 𝑏ℎ 𝑏𝑤 𝑐1 𝑐2 𝑐3 ],你可以检测这三个类别,行人、汽车和摩托车,它将无法输出检测结果,所以我必须从两个检测结果中选一个,这便影响了模型性能,导致一些对象被丢弃无法检测出来。
img

anchor box 引入

img

预先定义两个不同形状的 anchor box,或者 anchor box 形状

一般来说,可能会用更多的 anchor box,可能要 5 个甚至更多,为介绍方便就用两个 anchor box

定义类别标签,用的向量不再是下面这个:
[𝑝𝑐 𝑏𝑥 𝑏𝑦 𝑏ℎ 𝑏𝑤 𝑐1 𝑐2 𝑐3]𝑇

而是输出重复两次:

𝑦 = [𝑝𝑐 𝑏𝑥 𝑏𝑦 𝑏ℎ 𝑏𝑤 𝑐1 𝑐2 𝑐3 𝑝𝑐 𝑏𝑥 𝑏𝑦 𝑏ℎ 𝑏𝑤 𝑐1 𝑐2 𝑐3]𝑇

前一半是box1后一半是box2

行人一般符合anchor box1形状,所以用anchor box1来预测行人会达到很好的效果,这么编码𝑝𝑐 = 1,代表有个行人,用𝑏𝑥,𝑏𝑦,𝑏ℎ和𝑏𝑤来编码包住行人的边界框,然后用𝑐1,𝑐2,𝑐3(𝑐1 = 1,𝑐2 = 0,𝑐3 = 0)来说明这个对象是个行人。
汽车一般是box2,方式同理

文章没说编码完一部分后剩下的怎么处理

总结

所以,总的来说,anchor box是这么来做的,现在每个对象和以前一样根据中心点分配到一个格子中,然后看和每个anchor box的IoU(交并比),选择IoU最高的那个,用这个anchor box来进行预测。输出y的维度是nxnxmxcn为图片分成nxn份,m为anchor box数量,c为class类别数)

不足

1.两个 anchor box,但在同一个格子中有三个对象,这种情况算法处理不好,你希望这种情况不会发生,但如果真的发生了,这个算法并没有很好的处理办法

2.两个对象都分配到一个格子中,而且它们的 anchor box 形状也一样,也不好办

看文章说其实这两种情况很少出现,特别是如果你用的是 19×19 网格而不是3×3 的网格

怎么选box?

1.一般手工指定anchor box形状,根据要检测的对象,指定有针对性地anchor box,可选择5-10个anchor box,使其尽可能覆盖到不同形状。
2.使用K-means聚类算法获得anchor box。