【CV 目标检测】②——NMS(非极大值抑制)
4.NMS(非极大值抑制)
(1)NMS概念
非极大值抑制(Non-Maximum Suppression,NMS),就是抑制不是极大值的元素。例如在行人检测中,滑动窗口经提取特征,经分类器识别后,每个窗口都会得到一个分数。但是滑动窗口会导致很多窗口与其他窗口包含或者大部分交叉的情况。这时就需要用到NMS来选取那些邻域里分数最高(是行人的概率最大),并且抑制那些分数低的窗口。NMS在计算机视觉领域有着非常重要的应用,如视频目标跟踪,数据挖掘,3D建模,目标识别以及纹理分析等。
(2)NMS目的
在目标检测中,NMS的目的就是要去除冗余的检测框,保留最好的一个
(3)NMS原理
NMS原理是对于预测框的列表B及其对应的置信度S,选择具有最大score(置信度最大)的检测框M,将其从B集合中移除并加入到最终的检测结果D中,计算B中剩余检测框与M的IOU值,通常将IOU大于阈值Nt的框从B中移除(这里的框是被抑制掉,被认为是冗余框,不会加入到D集合中)。重复这个过程,直到B为空。
理解(NMS使用方法):
(4)NMS检测流程
- 首先是检测出一系列的检测框
- 将检测框按照类别进行分类
- 对同一类别的检测框应用NMS获取最终检测结果
(5)单类别的NMS实现方法
def nms(boxes, score, thre):# 容错处理if len(boxes) == 0:return [], []# 类型转换:boxes默认使用极坐标表示boxes = np.array(boxes)score = np.score(boxes)# 获取左上角和右下角坐标x1 = boxes[:, 0]y1 = boxes[:, 1]x2 = boxes[:, 2]y2 = boxes[:, 3]# 面积areas = (x2 - x1)*(y2 - y1)# NMSpick_boxes = []pick_score = []# 排序:小-->大order = np.argsort(score)while order.size > 0:# 获取score最大索引index = order[-1]# 保留下来pick_boxes.append(boxes[index])pick_score.append(score[index])# 计算IOU# 保留下来的框与其他所有框交集的坐标x11 = np.maximum(x1[index], x1[order[:-1]])y11 = np.maximum(y1[index], y1[order[:-1]])x22 = np.minimum(x2[index], x2[order[:-1]])y22 = np.minimum(y2[index], y2[order[:-1]])# 宽,高,交集面积w = np.maximum(0.0, x22 - x11)h = np.maximum(0.0, y22 - y11)inter_area = w*h# 交并比iou = inter_area/(areas[index] + areas[order[:-1]] - inter_area)# 删除冗余框keep_boxes = np.where(iou < thre)# 更新orderorder = order[keep_boxes]return pick_boxes, pick_score
bounding = [(187, 82, 337, 317) ,(150, 67, 305, 282),(246, 121, 368, 304)]
confidence_score = [0.9, 0.65, 0.8]
threshold = 0.5box, score = nms(bounding, confidence_score, threshold)