前言:预了解
NMS,去掉冗余的框。在目标检测中,不论是最初的region proposal,还是后来的anchor box,不可避免的一个问题就是对于同一个物体,会预测出多个bounding box,如下左图所示。而NMS所做的就是去除掉多余的bounding box,只保留和ground truth重叠度最高的bounding box,如下右图所示。
在目标检测中,分类器会给每个bounding box(bb)计算出一个class score,就是这个bb属于每一类的概率,NMS就是根据这些值来进行的,主要流程:
- 对于每一类,首先把所有score<thresh1的bb的score设为0
- 之后,将所有的bb按照得分排序,选中最高分及其对应的bb
- 遍历其余的bb,如果和当前最高分bb的重叠面积(IoU)大于一定的阀值,便将遍历的bb删除
- 从未处理的bb中继续选择一个最高分的bb,重复上述过程
- 重复上述过程,直到找到全部保留的bb
- 然后根据所有保留bb的class score和class color画出最后的预测结果
铺垫:基础知识
在YOLOv1论文中,我们知道,网络输出的结果是一个7×7×30的一个张量(向网络输入一张图片的前提下会得到7×7×30的张量,如果输入一个批为batch_size的图像,那么最后输出结果为batch_size×7×7×30的一个张量),在这里,我们以一张图片所得到的结果为例,说明非极大值抑制算法的思路。
如下图所示,网络输出结果为一个7×7×30的一个张量,7×7表示7×7个grid_cell,我们取出其中的一个grid_cell来看,如下图红框所示的grid_cell,该grid_cell所包含的是一个30维度的向量,该向量的结构为 2×5【4+1】 + 20 ,第一个5表示第一个bounding box的4个位置坐标(x,y,w,h)和一个置信度分数confidence score(物体在这个 bounding box 中的概率),
第二个5表示的是第二个bounding box的信息,后面的20维是该 grid_cell 在包含物体的条件下是哪种类别的概率。
每一个grid_cell要预测C个条件类别概率,即为Pr(Classi | Object)。即在一个grid_cell中包含一个Object的前提下,这个grid_cell属于某个类别的概率,如下图所示。
注意:
条件类别概率针对的是每个grid_cell;置信度分数 confidence score 针对的是每个预测的bounding box。
在测试阶段,将每个 grid_cell 的conditional class probabilities 与每个 bounding box的 confidence score 相乘:
这样即可得到每个bounding box的具体类别的class score。
这乘积既包含了bounding box中预测的class的 probability信息,也反映了bounding box是否含有Object和bounding box坐标的准确度。
每一个grid_cell都能够获得两个20维度的全概率向量,49个 grid_cell 则能获得98个20维度的全概率向量。每一个黄色的竖条表示对于每个bounding box而言,它所预测的20个物体类别的概率是多少。
这98个20维的向量可视化出来的结果就是下图中间部分的上面图。
如何从含有98个框的图到最终的只有三个框的目标检测结果图,这就是NMS要做的事情,如下所示。
正题:NMS处理过程
我们现在获得了98个竖条,我们以狗这一个类别为例,假设狗是20个类别的第1个类别,则98个竖条的第一个数字是狗的概率,这98个概率中必然会有比较小的,此时我们设置一个阈值thresh(0.2),把所有小于0.2的概率一律抹零,然后按照狗的概率的高低进行排序,将高的放在前面,低的放在后面,然后在对排序后的结果进行NMS算法处理。如下图所示。
仍然是98个竖条,我们现在只看狗的概率,即看第一行,如下图所示。那么NMS如何进行排序呢?先将最高的拿出来,然后将后面的每一个与最高的作比较。
比如说我们现在来比较第一高和次高,如果这两个预测框的IoU大于设定的阈值,那么我们就认为这两个预测框重复识别了一个物体,那我们就将低概率的这个预测框删掉,直接将所对应的概率置0即可。
接下来我们比较最高和第三高,如下图所示,我们发现这两个预测框的IoU没有大于设定的IoU阈值,那么我们就保留这个第三高所对应的蓝框。
随后,我们将其余的均和第一高进行比对,删除掉大于IoU阈值的框。【注意:在狗这一类别中,经过NMS处理后不一定只剩预测狗这一个预测框,还有可能有其他的预测框存在,但其他类别经过这样处理之后,多余的预测框就会被删掉,此时就可保留预测狗的预测框】
上述流程是针对狗这一个类别,我们应该对20个类别均执行上述的操作,那么就可以得到最终的目标检测结果,也就是得到最终的三个预测框,如下图所示。
在对20个类别均经过NMS处理之后,得到的结果是一个稀疏矩阵,肯定会有很多全零向量,即上面的部分黄色竖条所包含的元素是全零元素。如果某个黄色竖条不是全为零的向量,那么我们把不为零所对应的类别拎出来,再将对应的得分拎出来,作为目标检测的结果。
参考: