1、NMS(非极大值抑制)
非极大值抑制(Non-Maximum Suppression,NMS),顾名思义就是抑制不是极大值的元素,可以理解为局部最大搜索。由下图可见,同一个物体可能有好几个框,我们的目标是一个物体只须保留一个最优的框:于是我们就要用到非极大值抑制,来抑制那些冗余的框: 抑制的过程是一个迭代-遍历-消除的过程。
NMS python实现代码:
def cpu_nums(dets, thresh=0.7):x1 = dets[:,0]y1 = dets[:,1]x2 = dets[:,2]y2 = dets[:,3]scores = dets[:,4]areas = (x2 - x1 + 1)*(y2 - y1 + 1) # 检测框box的面积index = scores.argsort()[::-1] #将每个box的置信度由高到低排序,并返回其在原列表中的索引keep = [] # 保留经nms后的box的索引while index.size > 0: i = index[0]keep.append(i)# 求检测框之间的交集的面积x11 = np.maximum(x1[i], x1[index[1:]])y11 = np.maximum(y1[i], y1[index[1:]])x22 = np.minimum(x2[i], x2[index[1:]])y22 = np.minimum(y2[i], y2[index[1:]])w = np.maximum(0, x22-x11+1)h = np.maximum(0, y22-y11+1)overlaps = w*hious = overlaps/(areas[i] + areas[index[1:]] - overlaps) # 检测框的交并比idx = np.where(ious
2、Soft-NMS
论文:http://cn.arxiv.org/abs/1704.04503
github:https://github.com/bharatsingh430/soft-nms
问题探究:
该图像有两个马的检测的置信度(红色和绿色显示),其得分分别为0.95和0.8。绿色检测框与红色检测框有明显的重叠。最好是完全压制绿色框,并将其赋值为0,还是稍低一点,为0.4比较好?
绝大部分目标检测方法,最后都要用到 NMS-非极大值抑制进行后处理。 通常的做法是将检测框按得分排序,然后保留得分最高的框,同时删除与该框重叠面积大于一定比例的其它框。
这种贪心式方法存在如上图所示的问题: 红色框和绿色框是当前的检测结果,二者的得分分别是0.95和0.80。如果按照传统的NMS进行处理,首先选中得分最高的红色框,然后绿色框就会因为与之重叠面积过大而被删掉。
另一方面,NMS的阈值也不太容易确定,设小了会出现下图的情况(绿色框因为和红色框重叠面积较大而被删掉),设置过高又容易增大误检。
解决方法:不要粗鲁地删除所有IOU大于阈值的框,而是降低其置信度。
传统NMS:
改进的NMS(soft-NMS):
线性函数
高斯函数
分析上面的两种改进形式,思想都是:M为当前得分最高框,b i 为待处理框,b i 和M的IOU越大,b i 的得分s i 就下降的越厉害。
soft-NMS python 实现代码:
def cpu_soft_nms(dets, sigma = 0.5, Nt = 0.7, method = 0, weight = 0, thresh = 0.2 ):box_len = len(dets) # box的个数for i in range(box_len):max_scores = dets[i, 4]tmpx1 = dets[i,0]tmpy1 = dets[i,1]tmpx2 = dets[i,2]tmpy2 = dets[i,3]ts = dets[i,4]max_pos = ipos = i+1while pos 0 and ih >0:overlaps = iw * ihious = overlaps/((tmpx2 - tmpx1 + 1) * (tmpy2 - tmpy1 + 1) + area - overlaps)if method==1: # 线性if ious > Nt:weight = 1 - iouselse:weight = 1elif method==2: # gaussianweight = np.exp(-(ious**2)/sigma)else: # original NMSif ious > Nt:weight = 0else:weight = 1# 赋予该box新的置信度dets[pos, 4] = weight*dets[pos, 4]# print(dets[pos, 4])# 如果box得分低于阈值thresh,则通过与最后一个框交换来丢弃该框if dets[pos,4]
3、DIoUNMS
该NMS
在DIoUloss
一文中提出,在nms过程中采用DIoU的计算方式替换了IoU,由于DIoU的计算考虑到了两框中心点位置的信息,故使用DIoU进行评判的nms效果更符合实际,效果更优。