anchor box(先验框)
anchor (锚; 给以安全感的人(或物); 精神支柱; 顶梁柱;)
为什么
对象检测中存在一个问题就是每个格子只能预测一个对象,如果想让一个格子检测出多个对象,用anchor box
以前的做法
假设我们有这样一张图片,对于这个例子,我们使用3x3的网格,可以观察到,行人和汽车的中心几乎在同一个网格,然而我们以前的方法一个格子只能预测一个对象,而且对于y输出的的向量量𝑦 = [𝑝𝑐 𝑏𝑥 𝑏𝑦 𝑏ℎ 𝑏𝑤 𝑐1 𝑐2 𝑐3 ],你可以检测这三个类别,行人、汽车和摩托车,它将无法输出检测结果,所以我必须从两个检测结果中选一个,这便影响了模型性能,导致一些对象被丢弃无法检测出来。
anchor box 引入
预先定义两个不同形状的 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的维度是nxnxmxc(n为图片分成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。