锚框
以每个像素为中心,生成多个缩放比和宽高比(aspect ratio)不同的边界框。这些边界框被称为锚框(anchor box)。
生成锚框
假设输入图像的大小为(h, w)
,我们以图像的每个像素为中心,生成多个锚框:缩放比为s
,宽高比为r
,那么锚框的高宽分别(hs\sqrt{r}, ws\sqrt{r} )
要生成不同形状的锚框,我们需要设置很多缩放比s_1, s_2, ..., s_n
和宽高比r_1, r_2, ..., r_m
,假设我们考虑所有组合,我们需要生成whnm个锚框,计算复杂度较高。在实践中,我们仅考虑以下组合
(s_1, r_1), (s_1, r_2), ..., (s_1, r_m), (s_2, r_1), (s_3, r_1), ..., (s_n, r_1)
此时锚框的数量为(n + m - 1)wh
交并比IoU
杰卡德系数(Jaccard)可以用来衡量锚框和真实边界框的相似性。给定集合\mathcal{A},\mathcal{B}
他们的Jaccard
系数为
J(\mathcal{A}, \mathcal{B}) = \frac{\left|\mathcal{A} \cap \mathcal{B}\right|}{\left| \mathcal{A} \cup \mathcal{B}\right|}
显然J \in [0, 1]
, 0表示两个框没有重合,1表示完全重合
训练
我们把每个锚框视为一个训练样本,为了训练目标模型,我们需要获得每个锚框的类别(class)和偏移量(offset),前者是锚框对应的相关对象的类别,后者是锚框相对于真实边界框的偏移量.
将真实边界框分配给锚框
假定锚框为A_1, A_2, ..., A_n
真实边界框为B_1, B_2, ..., B_m
满足n >= m
。定义一个矩阵\mathcal{X} \in \mathbb{R}^{m \times n}
,其中第i行,第j列为锚框A_i
和真实边界框B_j
的IoU。
我们按以下算法流程分配
- 在矩阵
\mathcal{X}
中找到最大元素,假设它的索引为(i_1, j_1)
我们把B_j
分配给A_i
.完成后删除第i行和第j列 - 重复上述步骤,直到丢弃掉m列元素
- 遍历剩下的所有锚框
((n - m)个)
,对于A_i
在矩阵\mathcal{X}
的第i行寻找IoU最大的B_j
只有到IoU大于预先设定的阈值时,才将B_j
分配被A_i
标记类别和偏移量
给定锚框A
和真实边界框B
中心坐标分别为(x_a, y_a)
和(x_b, y_b)
宽度和高度分别为(w_a, h_a)
和(w_b, h_b)
,可以将A的偏移量标记为
(\frac{\frac{x_b - x_a}{w_a} - \mu_x}{\sigma_x}, \frac{\frac{y_b - y_a}{h_a} - \mu_y}{\sigma_y},
\frac{log{\frac{w_b}{w_a}} - \mu_w}{\sigma_w},
\frac{log{\frac{h_b}{h_a}} - \mu_h}{\sigma_h})
其中\mu_x = \mu_y = \mu_w = \mu_h = 0, ~~~\sigma_x = \sigma_y = 0.1, ~~~\sigma_w = \sigma_h = 0.2
使用非极大值抑制预测边界框
- 列出所有预测框,并按照它们的置信度得分排序,置信度最高的预测框排在最前面。
- 选择置信度最高的预测框,并将其作为“保留”预测框。
- 计算此保留预测框与其他所有预测框的交并比(IoU,Intersection over Union)。如果某个预测框的IoU超过了预设的阈值(这意味着两个框有高度的重叠),那么我们就将这个预测框从列表中删除,因为我们认为它与已保留的预测框表示的是同一个物体。
- 重复步骤2和3,直到所有的预测框都被检查过。最后保留下来的预测框就是我们的最终结果。