在研究目标检测算法的时候,通常会遇到如何稀疏化检测框这个问题。无论是anchor-based还是anchor-free的检测算法,输出的检测框在未经处理的时候,都很容易出现很多重复度很高的box, 这样从一定程度上会影响模型的准确率。通常,NMS是比较常用的合并检测框的方法,不了解的可以戳《NMS》。

本文介绍的是WBF,一种加权的检测框合并算法,也适用于与多模型的预测结果合并。
论文:https://arxiv.org/abs/1910.13302
git:https://github.com/ZFTurbo/Weighted-Boxes-Fusion


详细的7个步骤:

1.把当前帧的所有box,加入到一个list中,并用它们的confidence,给它们做一个降序排序。咱们先定这个list名字为B
2.初始化两个list,分别叫LF。其中L中的每个元素都是一个box的集合(即一个小list),而F中的每个元素都是一个box。F用来存我们合并之后的box,而L存放需要合并到一起的box集合。F和L长度始终一致,对应位置的元素是有关联的!举个样式栗子:L = [[b1, b2], [b3, b4]],F = [b1, b3]
3.开始迭代:用B中的box依次匹配F中的元素(F初始为空),假设IOU>0.55则认为匹配上;
4.如果没匹配上,则该box加入到LF的末尾,接着处理B中的下一个box;举个样式栗子:b_0未匹配上,则L.append([b_0]),F.append(b_0)
5.如果匹配到了F中的第i个元素,则该box就加入L中第i个元素列表中(L中每个元素是一个list);举个样式栗子:如果b_9匹配打了F[i],则L[i].append(b_9);
6.重新计算F[i](即被当前box匹配中的fusion框)的box坐标和confidence,咱们从L中可以得到必要的信息。用以下公式:

C={\sum_{i=1}^{T} C_i\over T}

X_{1,2} = {{\sum_{i=1}^TC_i*X_{1,2_i}}\over{\sum_{i=1}^T}}

Y_{1,2} = {{\sum_{i=1}^TC_i*Y_{1,2_i}}\over{\sum_{i=1}^T}}

第6步可以一言以蔽之:计算一个平均位置和一个平均的置信度confidence。

7.当B中所有的box都迭代完以后,我们重新规范化F中的confidence。大概可以用2种方法:

C=C*{min(T, N)\over N}

或者

C=C*{T\over N}

这里的T表示L[i]的长度(设当前box为F中的第i个元素),而N表示咱们使用的模型个数。如果是单模型预测,则N=1。所以,N在这里是一个常数,而T越大则代表该box的可信度越高。