本文介绍了用卷积神经网络改进传统NMS的方法,文章来源于2016ICLR《A CONVNET FOR NON-MAXIMUM SUPPRESSION》,该文章状态为正在审核。
NMS,非极大值抑制,在很多计算机视觉问题中有着重要应用,尤其是目标检测领域。
以人脸检测为例,通常的流程为3步:
(1)通过滑动窗口或者其它的object proposals方法产生大量的候选窗口;
(2)用训练好的分类器对候选窗口进行分类,该过程可以看做是一个打分的过程;
(3)使用NMS对上面的检测结果进行融合(因为一个目标可能被检测出多个窗口,而我们只希望保留一个)。
以此图为例,传统的NMS,首先选定一个IOU阈值,例如为0.25。然后将所有4个窗口(bounding box)按照得分由高到低排序。然后选中得分最高的窗口,遍历计算剩余的3个窗口与该窗口的重叠面积比例(IOU),如果IOU大于阈值0.25,则将窗口删除。然后,再从剩余的窗口中选中一个得分最高的,重复上述过程。直至所有窗口都被处理。
假如0.25是一个不错的阈值,那么我们可以得到比较好的结果,如下图:
如果,我们的IOU阈值设定的特别小,比如说0.1。那么2个人的窗口会被归为一个人而被融合。得到下面的错误结果:
如果,我们的IOU阈值设定的特别大,比如说0.6。那么又可能得到下面的错误结果:
由上可知,对于传统的NMS算法选择一个好的阈值是多么重要的一件事,但又是一件很困难的事。传统的NMS是一种硬判决,是一种贪心算法。因此在文章中,作者称传统的NMS算法为:GreedyNMS
再提及一下,传统的NMS在判决融合的时候,只利用到了2个信息:Score 和 IOU ,即每个框的得分和框与框之间的重叠比例。
文章用神经网络去实现NMS,所利用的同样也是这2个信息。如下图的整个流程图:
由网络结构图中的红色框可以得到,输入data层有2个,一个是Score map,一个是 Iou layer.下面我们讲述一下,如何由最初的bounding box去得到这两个data层。
假定原图像尺寸为W×H,那么我们要制作的score map大小为w×h,其中w=W/4, h=H/4,则score map上的一个点对应着原图的4×4的区域:
对于一个bounding box ,我们计算其中心然后判断其属于哪个区域,然后将该box的score填入score map对应的位置。如下图:
如果有多个bounding box的中心落入同一区域,则只记录最高得分。
到此,我们已经得到了w×h×1的score map.
文章提到,传统的NMS需要排序,但在卷积神经网络中,很难用各种线性组合和非线性激活去模拟排序。因此,文章先用传统的NMS处理一遍bounding boxes, 然后再生成一张同样大小的score map,记作S(T),T为NMS的阈值。
最终,我们得到了w×h×2的score map. 记作S(1,T)
IOU,intersection-over-union。因此IOU层描述的也就是bounding box之间的相交关系。
IOU层大小为w×h×121,其中121=11×11,即描述的是相应中心点11×11范围内存在的box的相交关系。
如下图所举出的例子,左侧的图是score map S(1),粉色表明有值,则每个粉色处也对应着一个bounding box。以红色为中心划一个11×11的范围,则可以依次计算每一个位置对应的box与中心点对应box的IOU,其值记作I,如右侧所示。 同理,易知 I(7,8,i)一定为0。
(1): IOU层的kernel size 为1,stride也为1。
Score map层的kernel size 为11×11,这是为了呼应IOU层;stride 为1 ,pad 为5,这是为了获得和输入同样尺寸的输出:
(2): Layer 2将之前的2个输出拼接,之后所有的卷积都是1×1。最终的输出仍然是一个尺寸一致的score map .
理想的输出是一个同输入尺寸完全一致的score map 图,在该图中,每一个目标只拥有一个score,相应地也只对应了一个bounding box。
(1)上图a的score map 是我们的输入,由图易知,这里面一共有5个有效的score,则也对应着5个bounding box。
(2) 假设5个bounding box都是同一个目标的检测结果。则我们的训练目的则是保留最好的一个,抑制其余4个。
为此,我们首先分配标签:5个bounding box 中满足与ground truth 的IOU大于0.5且得分最高的box作为正样本,其余均为负样本,如上图b所示。
(3)显然正负样本的数量严重不均衡,因此计算loss之前,我们要分配一下权重用于权衡这种失衡。权重的分配很简单,如图c所示,正样本的权重总和与负样本的权重总和相等。
(4)上右侧的图为理想的输出。综上,我们的Loss Function就可以很容易得出了(类似于pixel级别的分类):
其中,p属于G,表示score map 中有值的点。