NMS:
算法流程:
1.将所有检出的output bbox按类别进行划分;
2.在每个类别的集合内根据各个bbox的cls score做降序排列,得到一个降序的list_k,从list_k中top1 cls score开始,计算该bbox_x与list_k中其他bbox_y的IoU,若IoU大于阈值T,则剔除该bbox_y,最终保留bbox_x,从list_k中取出;
3.对剩余的bbox_x,重复step-2中的迭代操作,直至list_k中所有bbox都完成筛选;
4.对每个集合的list_k,重复step-2、step-3中的迭代操作,直至所有list_k都完成筛选。
Soft NMS
图片上有重叠的两个类别一样的物体,用传统的nms将会去掉一个检测框造成漏检,但其实他们框的是两个不一样的物体。
不是一遇到重叠度过高的就去除,而是将其置信度降低,降低置信度的方式有线性和高斯加权
M为当前得分最高框,Bi 为待处理框,Bi 和M的IOU越大,Bi 的得分Si 就下降的越厉害,最后指定一个置信度阈值,高于该阈值的检测框就保留。soft-NMS在训练中采用传统的NMS方法,仅在推断代码中实现soft-NMS。
Softer NMS
NMS时用到的score仅仅是分类置信度得分,不能反映Bounding box的定位精准度,NMS会出现问题的情况:所有的BBox都不准确,或者拥有高分类置信分数的BBox定位不准确。Softer NMS增加定位置信度预测分支(预测坐标方差),提高定位精度,用KL Loss进行训练,假设Bounding box的是高斯分布,ground truth bounding box是狄拉克delta分布(即方差为0的高斯分布极限),KL 散度用来衡量两个概率分布的非对称性度量,KL散度越接近0代表两个概率分布越相似。论文提出的KL loss,即为最小化Bounding box regression loss,使得预测的坐标分布尽可能接近ground truth坐标分布,直观上解释,KL Loss使得Bounding box预测呈高斯分布,且与ground truth相近。将BBox预测的标准差看作置信度,Softer-NMS基于soft-NMS,对IOU大于阈值的候选框按方差的倒数进行加权平均。
Matrix NMS
出自SOLOv2,基于SoftNMS,实现并行化,在softnms中,Bi的得分会乘以一个惩罚系数,而这个惩罚系数的计算是串行的。对于mask m_j,需要通过s_j * decay factor来得到新的置信度s_j,soft nms是遍历和m_j相同类并且置信度比它高的那些m_i,Matrix nms 想并行计算,想通过矩阵一次性求decay factor,因此m_i被抑制最有可能就是和他重叠度最大的那个mask造成的。(参考:https://github.com/WXinlong/SOLO/blob/master/mmdet/core/post_processing/matrix_nms.py)
首先计算得到NxN pairwise IoU Matrix,也就是这N个mask 每个和其他的mask的IoU
(先按置信度选出top N个mask,文章中N选的是500,得到的seg_masks是[N,HxW],然后计算IoU矩阵,得到类别相同的矩阵)
然后计算decay factor,
分母是与之类别相同且重叠比最高的IoU
分子是与自己类别相同且置信度比自己高的iou的函数(高斯或者线性函数)
Adaptive NMS
为了解决行人检测任务中目标过于密集的问题,本文对soft-NMS又进行了优化,提出了一种自适应的非极大值抑制(Adaptive NMS)的行人检测后处理方法,通过网络预测目标周边的密集和稀疏的程度,采用不同的去重策略。使得在人群密集的地方,NMS阈值较大(置信分数下降的阈值),而人群稀疏的地方NMS阈值较小。首先定义密度,目标i的密度定义为ground truth中与之重叠比最大的IoU的值,代表了拥挤程度:
因此Adaptive NMS:
N_M表示的是目标M的adaptive nms的阈值,d_M是目标M的密度,当周围的bbox远离M时,置信分数保持不变,当M处在一个密集区域时(d_M>N_t),就将目标密度作为NMS的阈值,在训练CNN时,每次还需要求出密度作为监督信号,训练网络能够拟合这个密度函数,即输入一张图片,能输出每个位置的物体密度,因此论文设计了一个Density-subnet对目标密度进行回归预测。
IoU-Net
目标检测的分类与定位通常被两个分支预测。对于候选框的类别,模型给出了一个类别预测,可以作为分类置信度,然而对于定位而言,回归模块通常只预测了一个边框的转换系数,而缺失了定位的置信度,即框的位置准不准,并没有一个预测结果。定位置信度的缺失也导致了在前面的NMS方法中,只能将分类的预测值作为边框排序的依据,然而在某些场景下,分类预测值高的边框不一定拥有与真实框最接近的位置,因此这种标准不平衡可能会导致更为准确的边框被抑制掉。基于此,旷视提出了IoU-Net,增加了一个预测候选框与真实物体之间的IoU分支,并基于此改善了NMS过程,进一步提升了检测器的性能。
IoU-Net的基础架构与原始的Faster RCNN类似,使用了FPN方法作为基础特征提取模块,然后经过RoI的Pooling得到固定大小的特征图,利用全连接网络完成最后的多任务预测。
同时,IoU-Net与Faster RCNN也有不同之处,主要有3点:
- 在Head处增加了一个IoU预测的分支,与分类回归分支并行。图中的Jittered RoIs模块用于IoU分支的训练。
- 基于IoU分支的预测值,改善了NMS的处理过程。
- 提出了PrRoI-Pooling(Precise RoI Pooling)方法,进一步提升了感兴趣区域池化的精度。
IoU分支用于预测每一个候选框的定位置信度。在训练时IoU-Net通过自动生成候选框的方式来训练IoU分支,而不是从RPN获取。
具体来讲,Jittered RoIs在训练集的真实物体框上增加随机扰动,生成了一系列候选框,并移除与真实物体框IoU小于0.5的边框。实验证明这种方法来训练IoU分支可以带来更高的性能与稳健性。IoU分支也可以方便地集成到当前的物体检测算法中。
在整个模型的联合训练时,IoU预测分支的训练数据需要从每一批的输入图像中单独生成。此外,还需要对IoU分支的标签进行归一化,保证其分布在[-1,1]区间中。
由于IoU预测值可以作为边框定位的置信度,因此可以利用其来改善NMS过程。IoU-Net利用IoU的预测值作为边框排列的依据,并抑制掉与当前框IoU超过设定阈值的其他候选框。此外,在NMS过程中,IoU-Net还做了分类置信度的聚类,即对于匹配到同一真实物体的边框,类别也需要拥有一致的预测值。具体做法是,在NMS过程中,当边框A抑制边框B时,通过选取A和B的分类置信度的较大值来更新边框A的分类置信度。
PrRoI-Pooling方法
RoI Align的方法,通过采样的方法有效避免了量化操作,减小了RoIPooling的误差,如图下图所示。但Align的方法也存在一个缺点,即对每一个区域都采取固定数量的采样点,但区域有大有小,都采取同一个数量点,显然不是最优的方法。
以此为出发点,IoU-Net提出了PrRoI Pooling方法,采用积分的方式实现了更为精准的RoI池化,与RoI Align只采样4个点不同,PrRoI Pooling方法将整个区域看做是连续的,采用积分公式求解每一个区域的池化输出值,区域内的每一个点(x, y)都可以通过双线性插值的方法得到。这种方法还有一个好处是其反向传播是连续可导的,因此避免了任何的量化过程。
总体上,IoU-Net提出了一个IoU的预测分支,解决了NMS过程中分类置信度与定位置信度之间的不一致,可以与当前的物体检测框架一起端到端地训练,在几乎不影响前向速度的前提下,有效提升了物体检测的精度。