在研究目标检测算法的时候,通常会遇到如何稀疏化检测框这个问题。无论是anchor-based还是anchor-free的检测算法,输出的检测框在未经处理的时候,都很容易出现很多重复度很高的box, 这样从一定程度上会影响模型的准确率。通常,NMS是比较常用的合并检测框的方法,不了解的可以戳《NMS》。
本文介绍的是WBF,一种加权的检测框合并算法,也适用于与多模型的预测结果合并。
论文:https://arxiv.org/abs/1910.13302
git:https://github.com/ZFTurbo/Weighted-Boxes-Fusion
详细的7个步骤:
- 把当前帧的所有box,加入到一个list中,并用它们的confidence,给它们做一个降序排序。咱们先定这个list名字为B;
- 初始化两个list,分别叫L和F。其中L中的每个元素都是一个box的集合(即一个小list),而F中的每个元素都是一个box。F用来存我们合并之后的box,而L存放需要合并到一起的box集合。F和L长度始终一致,对应位置的元素是有关联的!
举个样式栗子:L = [[b1, b2], [b3, b4]],F = [b1, b3] - 开始迭代:用B中的box依次匹配F中的元素(F初始为空),假设IOU>0.55则认为匹配上;
- 如果没匹配上,则该box加入到L和F的末尾,接着处理B中的下一个box;
举个样式栗子: b 0 b_0 b0未匹配上,则L.append([ b 0 b_0 b0]),F.append( b 0 b_0 b0) - 如果匹配到了F中的第
i
i
i个元素,则该box就加入L中第
i
i
i个元素列表中(L中每个元素是一个list);
举个样式栗子:如果 b 9 b_9 b9匹配打了F[ i i i],则L[ i i i].append( b 9 b_9 b9); - 重新计算F[
i
i
i](即被当前box匹配中的fusion框)的box坐标和confidence,咱们从L中可以得到必要的信息。用以下公式:
C = ∑ i = 1 T C i T C={\sum_{i=1}^{T} C_i\over T} C=T∑i=1TCi
X 1 , 2 = ∑ i = 1 T C i ∗ X 1 , 2 i ∑ i = 1 T X_{1,2} = {{\sum_{i=1}^TC_i*X_{1,2_i}}\over{\sum_{i=1}^T}} X1,2=∑i=1T∑i=1TCi∗X1,2i
Y 1 , 2 = ∑ i = 1 T C i ∗ Y 1 , 2 i ∑ i = 1 T Y_{1,2} = {{\sum_{i=1}^TC_i*Y_{1,2_i}}\over{\sum_{i=1}^T}} Y1,2=∑i=1T∑i=1TCi∗Y1,2i
第6步可以一言以蔽之:计算一个平均位置和一个平均的置信度confidence。 - 当B中所有的box都迭代完以后,我们重新规范化F中的confidence。大概可以用2种方法:
C = C ∗ m i n ( T , N ) N C=C*{min(T, N)\over N} C=C∗Nmin(T,N)
或者
C = C ∗ T N C=C*{T\over N} C=C∗NT
这里的T表示L[ i i i]的长度(设当前box为F中的第 i i i个元素),而N表示咱们使用的模型个数。如果是单模型预测,则N=1。所以,N在这里是一个常数,而T越大则代表该box的可信度越高。