3-8 Anchor Boxes
Anchor Boxes
假设你有这样一张图片,对于这个例子,我们继续使用 3×3 网格,注意行人的中点和汽车的中点几乎在同一个地方,两者都落入到同一个格子中。所以对于那个格子,如果y输出这个向量:
你可以检测这三个类别,行人、汽车和摩托车,它将无法输出检测结果,所以我必须从两个检测结果中选一个。
而 anchor box 的思路是,这样子,预先定义两个不同形状的 anchor box,或者 anchor box 形状,你要做的是把预测结果和这两个 anchor box 关联起来。你要做的是定义类别标签,用的向量不再是:
而是重复两次:
前面的8个参数${p_c}$,${b_x}$,${b_y}$,${b_h}$,${b_w}$,${c_1}$,,${c_2}$,${c_3}$(绿色方框标记的参数)是和 anchor box 1 关联的 8 个参数,后面的 8 个参数(橙色方框标记的元素)是和 anchor box 2 相关联。
因为行人的形状更类似于 anchor box 1 的形状,所以你可以用这 8 个数值(前8 个参数),这么编码${p_c} = 1$,是的,代表有个对象,用${b_x}$,${b_y}$,${b_h}$,${b_w}$来编码包住行人的边界框,然后用${c_1}$,,${c_2}$,,${c_3}$来说明这个对象是个行人然后是车子,因为车子的边界框比起 anchor box 1 更像 anchor box 2 的形状,你就可以这么编码,这里第二个对象是汽车,然后有这样的边界框等等,这里所有参数都和检测汽车相关。
现在每个对象都和之前一样分配到同一个格子中,分配到对象中点所在的格子中,以及分配到和对象形状交并比最高的 anchor box中。这个对象不只分配到一个格子,而是分配到一对,即( grid cell, anchor box)对,这就是对象在目标标签中的编码方式。所以现在输出y就是 3×3×16,或者你也可以看成是3×3×2×8,因为现在这里有 2 个 anchor box,而y是 8 维的。
现在还有一些额外的细节,如果你有两个 anchor box,但在同一个格子中有三个对象,这种情况算法处理不好,对于这种情况,我们就引入一些打破僵局的默认手段。还有这种情况,两个对象都分配到一个格子中,而且它们的 anchor box 形状也一样,这是算法处理不好的另一种情况,你需要引入一些打破僵局的默认手段,专门处理这种情况。
我们建立 anchor box 这个概念,是为了处理两个对象出现在同一个格子的情况,实践中这种情况很少发生,特别是如果你用的是 19×19 网格而不是3×3 的网格,两个对象中点处于 361 个格子中同一个格子的概率很低,确实会出现,但出现频率不高。也许设立 anchor box 的好处在于 anchor box 能让你的学习算法能够更有针对性。
人们一般手工指定 anchor box 形状,你可以选择 5 到 10 个 anchor box 形状,覆盖到多种不同的形状,可以涵盖你想要检测的对象的各种形状。
YOLO 论文中有更好的做法,就是所谓的 k-平均算法,可以将两类对象形状聚类,如果我们用它来选择一组 anchor box,选择最具有代表性的一组 anchor box,可以代表你试图检测的十几个对象类别,但这其实是自动选择 anchor box 的高级方法。