文章标题:《Weighted Boxes Fusion: combining boxes for object detection models》
文章PDF地址:https://arxiv.org/abs/1910.13302
GitHub地址:https://github.com/ZFTurbo/Weighted-Boxes-Fusion
简介
作者认为,在目标检测任务中,当实时性要求不强时,集成多个推理模型有助于我们得到更好的结果。
于是作者在文中提出了一种方法,可以把多个目标检测模型的预测结果结合起来。
这个方法称为 weighted boxes fusion,简称 WBF 。
在筛选预测框的过程中,常用的方法是非极大值抑制(non-maximum, NMS),还有一种 soft-NMS 方法也被用于改进筛选性能。这些方法在单个模型上效果不错,但只能简单地从预测框中,“筛选” 框框。不能有效地结合多个模型的预测结果来产生一个平均的框框。与单一模型相比,结合多个模型的预测会得到更好更准确的效果,这样做在打比赛中通常名列前茅。
NMS、soft-NMS等方法只是简单地删除部分预测框。
与之不同,作者提出的 WBF 方法用上了所有预测框的置信度(得分),来构造出融合的框框。
在实际应用中,还有一种技术也经常被用到,叫做测试时增强(test-time augmentation, TTA),它类似于训练时的数据增强。举个例来说,测试的时候使用一个训练好的模型,对原始、垂直/水平反转等多张图像进行推理,这将得到多个结果,然后对结果求平均,作为最终的结果。这种有多个结果的情况也可以用 WBF。
WBF 的过程
关于 NMS 和 soft-NMS 资料网上很多,这里主要介绍 WBF 的过程。
假设用多个模型对下面这张图做目标检测,得到许多框框。
(单个模型也能生成这么多框,把分数阈值设低一点)
为了便于理解,我对这些框进行了分类,相同颜色的框表示它们选中了同一个目标。
这里有 3 朵花,每朵花上应该只保留 1 个框,这是我们本次任务的目标。
先透露一下,用 WBF 处理过后,可以得到这样的结果:
显然我们也可以用 NMS 直接干掉那些重叠的框,最后得到 3 个干净的框,效果也差不多。
但 WBF 不是这么做的。它不是直接干掉这些框,而是对现有的框进行融合,生成新的框。
这个例子里,它把 3 个蓝色的框融合成 1 个框;2 个黄色的框融合成1个框;4 个红色的框融合成 1 个框。
WBF 首先对这些框做一个预处理,把这些框按照得分从高到低进行排序,放在一个数组里:
上面的图示中,对 9 个框(3个蓝框,4个红框,2个黄框)进行了排序,右边那一列是排序的结果。数组的每个元素里面记录了该框框的得分和坐标。然后从最高分的开始,一个一个取出来,进行加权融合。
先说一下:
在我们的程序里面,每个框的数据只有坐标和分数,并不知道哪个框属于哪朵花。
所以哪个框要和哪个框融合?首先要这些框进行聚类:把同一朵花上面的框归到一起。
这可以通过 IOU(交并比)做到,我们一步一步来。 (只能把这些框归到一起,但仍然不知道是哪朵花)
再将一个公式(论文里的),我把它叫做融合框公式。假设现在有两个很接近的框,分别为:
b
o
x
A
:
[
A
x
1
,
A
y
1
,
A
x
2
,
A
y
2
,
A
s
]
boxA:[Ax_{1},Ay_{1},Ax_2, Ay_2, As]
boxA:[Ax1,Ay1,Ax2,Ay2,As],
b
o
x
B
:
[
B
x
1
,
B
y
1
,
B
x
2
,
B
y
2
,
B
s
]
boxB:[Bx_{1},By_{1},Bx_2, By_2, Bs]
boxB:[Bx1,By1,Bx2,By2,Bs],
其中 (
x
1
,
y
1
x_1,y_1
x1,y1) 代表该
b
o
x
box
box 左上角的坐标, (
x
2
,
y
2
x_2,y_2
x2,y2) 代表该
b
o
x
box
box 右下角的坐标,
s
s
s 代表该
b
o
x
box
box 的置信度 (得分)。
通过 b o x A boxA boxA 和 b o x B boxB boxB 融合得到 b o x C boxC boxC,如图所示:
可以看到,这里用框的得分作为权值,把两个框的坐标进行融合,得到一个新的框。
所以得分越高的框,权值越大,在生成新框的过程中,它的贡献更大。
新框的形状和位置更偏向于权值大的框。
对于 2 个以上的框,也是按照这个公式往后面加就行了。
论文提供的源码里还有一种计算方式,是直接求平均的,没有把得分作为权值来用。具体可以看代码。
回到 WBF 的处理流程,对这 9 个框排序完成之后,再维护 2 种容器(可以用数组之类的东西):
其中一种容器叫做 clusters,是聚类的结果,用于存放同一朵花上面的所有框。
在这个例子中,有 3 个聚类:clusterA,clusterB,clusterC,分别代表这 3 朵花上面的框。
另外一种容器叫做 fusions,把与它对应的 cluster 中所有的框用融合框公式算出一个新的框,记录在fusion 里。
同理这里也有 3 个:fusionA,fusionB,fusionC,是与其对应的 3 种 cluster 各自融合的结果。
为了快速描述 WBF 的处理流程,假设现在已经按照排序顺序,处理完数组里的前 6 个数据了:
处理完前面 6 个数据后,已经得到 2 组 cluster 和 2 个 fusion 了。
它们是怎么来的呢? 再看第 7 个数据是怎么处理的就知道了。
现在从 preDatas 中取出第 7 个数据(黄色的框),首先对它做聚类,聚类的方法是:
把这个新来的 7 号框,与现有 fusions 中的所有 fusion 做 IOU,如果 IOU 结果大于指定阈值,则聚类成功,把这个框放到该 fusion 对应的 cluster 中。
按照上述说法,我们分别把 7 号框与 fusionA 和 fusionB 的框做 IOU,发现都小于阈值。
显然 7 号框不属于 clusterA,也不属于clusterB,应该给它新建一个 cluster。聚类完毕。
姑且把这个新的 cluster 命名为 clusterC,把 7 号框放到里面。
同时对 clusterC 里所有的框做 加权融合(用上面讲的融合框公式),得到 fusionC。
由于 clusterC 里只有一个框,所以 fusionC 就是它自己。
现在已经处理完第 7 个框了,接下来第 8 个也同样处理。
第 8 个是红色的框,经过聚类(算IOU) 后,它被分到 clusterB 里了。
分配完后,对 clusterB 里的所有框(此时共有4个)做加权融合,得到新的 clusterB。
结果如图:
可以看到现在 clusterB 里有 4 个框, 这 4 个框就是下面那朵花上的 4 个框。
第 9 个框的处理方式也一样,我就不画了。
所有数据处理完毕后,得到 3 个fusion,这 3 个框就是 WBF 算法的结果。
把这个 3 个框画到图片上,就得到文章开头展示的结果:
总结
这个 WBF 算法可以直接用来代替 NMS,不过计算量可能会大一点。
对于一张图片,可以用多个不同的模型来做预测,然后对所有预测结果运用 WBF 算法,得到 1 个结果。作者说这个结果可能好过单个模型的预测结果。作者提出 WBF 算法也是主要应用于这种场景。
如果只有 1 个模型,也可以用 WBF 算法。方法就是把得分阈值设低一点,让网络输出一堆框框,然后对这些框做 WBF。如果网络判别能力强,得分低的框往往是一些垃圾框,它在融合过程中也没什么权重,所以直接做 WBF 应该没有问题。
在一些情况下,WBF 还能用于改善漏检、误检等问题。
不过 WBF 的能力有限,毕竟它还得依赖于网络输出结果,并不能颠覆这个结果。
WBF 和 NMS 选哪个,还要看具体应用和具体情况。