![在这里插入图片描述](https://img.php1.cn/3cd4a/1eebe/cd5/0a0ce631ec450943.webp?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1MDM3Njg0,size_16,color_FFFFFF,t_70)
作用:在目标检测算法中,以Faster_Rcnn为例,对于一张图片,模型会预测生成多个Anchor(预测方框),这些预测的方框和图片中实际的真实方框肯定是不完全匹配的, 如何确定每个Anchor是大概属于哪个真实方框,通过计算两者之间IOU值即可,通常还规定一个iou阈值(iou_threshold),若预测框和真实框之间的iou值大于iou_threshold,就表明此预测框具有和真实框的相同属性(如类别、是否前景)。我们不要这种框,把大于IOU阈值的框都删掉。
![在这里插入图片描述](https://img.php1.cn/3cd4a/1eebe/cd5/99b88427bc9ce0dc.webp?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1MDM3Njg0,size_16,color_FFFFFF,t_70)
非极大值抑制NMS(Non-maximum suppression)
NMS顾名思义就是抑制不是极大值的元素,可以理解为局部最大搜索。这个局部代表的是一个邻域,邻域有两个参数可变,一是邻域的维数,二是邻域的大小。NMS在计算机视觉中应用广泛,我们以行人检测为例,滑动窗口经提取特征,经分类器分类识别后,每个窗口都会得到一个分数。但是滑动窗口会导致很多窗口与其他窗口存在包含或者大部分交叉的情况。这时就需要用到NMS来选取那些邻域里分数最高(是行人的概率最大),并且抑制那些分数低的窗口。
目地:消除多余的检测框,保留最好的一个
原理:使用极大概率的备选框抑制其他与它位置接近的备选框
输入:一些备选框,每个备选框包含备选框的坐标和属于相应类别的概率(注意:这里所有类共享这些备选框);
一个重叠度的阈值,常见的阈值是0.3~0.5
输出:每个类别的备选框
代码:
import numpy as npdef nms(boxes, threshold):x1 &#61; boxes[:, 0]y1 &#61; boxes[:, 1]x2 &#61; boxes[:, 2]y2 &#61; boxes[:, 3]scores &#61; boxes[:, 4]areas &#61; (x2 - x1 &#43; 1) * (y2 - y1 &#43; 1)order &#61; scores.argsort()[::-1]keep &#61; []while order.size > 0:i &#61; order[0]keep.append(i) xx1 &#61; np.maximum(x1[i], x1[order[1:]])yy1 &#61; np.maximum(y1[i], y1[order[1:]])xx2 &#61; np.minimum(x2[i], x2[order[1:]])yy2 &#61; np.minimum(y2[i], y2[order[1:]])w &#61; np.maximum(0.0, xx2 - xx1 &#43; 1)h &#61; np.maximum(0.0, yy2 - yy1 &#43; 1)inter &#61; w * hover &#61; inter / (areas[i] &#43; areas[order[1:]] - inter)index &#61; np.where(over <&#61; threshold)[0]order &#61; order[index &#43; 1]return keep
还有直接调用pytorch(>&#61;1.2.0)、torchvision(>&#61; 0.3)中封装好了的nms函数。
from torchvision.ops import nms
keep &#61; nms(boxes,scores,iou_threshold)
boxes &#61; boxes[keep]
参数&#xff1a;
boxes (Tensor[N, 4])) – bounding boxes坐标. 格式&#xff1a;(x1, y1, x2, y2)scores (Tensor[N]) – bounding boxes得分iou_threshold (float) – IoU过滤阈值