非极大值抑制(NMS)讲解

本文详细介绍了非极大值抑制(NMS)算法的工作原理及应用流程。NMS是一种广泛应用于计算机视觉领域的算法,用于从多个重叠的物体检测候选框中筛选出最优解。文章通过人脸识别的具体案例解释了如何实现这一过程。
部署运行你感兴趣的模型镜像

非极大值抑制(Non-maximum suppression,NMS)是一种去除非极大值的算法,常用于计算机视觉中的边缘检测、物体识别等。

算法流程

给出一张图片和上面许多物体检测的候选框(即每个框可能都代表某种物体),但是这些框很可能有互相重叠的部分,我们要做的就是只保留最优的框。假设有N个框,每个框被分类器计算得到的分数为Si, 1<=i<=N。

0、建造一个存放待处理候选框的集合H,初始化为包含全部N个框;

     建造一个存放最优框的集合M,初始化为空集。

1、将所有集合 H 中的框进行排序,选出分数最高的框 m,从集合 H 移到集合 M;

2、遍历集合 H 中的框,分别与框 m 计算交并比(Interection-over-union,IoU),如果高于某个阈值(一般为0~0.5),则认为此框与 m 重叠,将此框从集合 H 中去除。

3、回到第1步进行迭代,直到集合 H 为空。集合 M 中的框为我们所需。

需要优化的参数:

IoU 的阈值是一个可优化的参数,一般范围为0~0.5,可以使用交叉验证来选择最优的参数。

示例:

比如人脸识别的一个例子:

已经识别出了 5 个候选框,但是我们只需要最后保留两个人脸。

首先选出分数最大的框(0.98),然后遍历剩余框,计算 IoU,会发现露丝脸上的两个绿框都和 0.98 的框重叠率很大,都要去除。

然后只剩下杰克脸上两个框,选出最大框(0.81),然后遍历剩余框(只剩下0.67这一个了),发现0.67这个框与 0.81 的 IoU 也很大,去除。

至此所有框处理完毕,算法结果:


(图片来自https://blog.youkuaiyun.com/shuzfan/article/details/52711706)





您可能感兴趣的与本文相关的镜像

PyTorch 2.7

PyTorch 2.7

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

非极大值抑制NMS)是目标检测中的一个关键步骤,它负责移除重叠的检测框,从而只保留最有可能的目标候选框。在YOLO算法中,NMS在预测阶段起到重要作用,确保每个目标只被检测一次,并且得到最佳的边界框。为了深入理解NMS的工作原理和实现方法,可以参考《YOLO目标检测算法详解:实时高效检测》。在这份资料中,你将找到详细的理论讲解和实践指导,直接关联到你的问题。 参考资源链接:[YOLO目标检测算法详解:实时高效检测](https://wenku.youkuaiyun.com/doc/4vs72fv85f?spm=1055.2569.3001.10343) 实际上,NMS过程大致可以分为以下步骤: 1. 对于每个预测的边界框,计算其与真实目标的交并比(IoU)。 2. 选择具有最高置信度(即概率)的边界框作为保留框。 3. 移除所有IoU大于某个阈值(例如0.5)的框,这些框与保留框重叠过多。 4. 重复步骤2和3,直到没有更多的边界框需要被移除。 在实际编码实现中,Python的NumPy库可以帮助我们高效地执行上述步骤。以下是使用NumPy实现NMS的一个简单示例代码片段: ```python import numpy as np def nms(bboxes, scores, iou_threshold=0.5): # 提取框的坐标和置信度 x1 = bboxes[:, 0] y1 = bboxes[:, 1] x2 = bboxes[:, 2] y2 = bboxes[:, 3] areas = (x2 - x1 + 1) * (y2 - y1 + 1) # 按置信度降序排序索引 order = scores.argsort()[::-1] keep = [] # 最终保留的边界框索引 while order.size > 0: i = order[0] keep.append(i) # 保留最高置信度的框 # 计算交集的坐标 xx1 = np.maximum(x1[i], x1[order[1:]]) yy1 = np.maximum(y1[i], y1[order[1:]]) xx2 = np.minimum(x2[i], x2[order[1:]]) yy2 = np.minimum(y2[i], y2[order[1:]]) # 计算交集面积 w = np.maximum(0.0, xx2 - xx1 + 1) h = np.maximum(0.0, yy2 - yy1 + 1) inter = w * h # 计算IoU iou = inter / (areas[i] + areas[order[1:]] - inter) # 保留IoU小于阈值的边界框 inds = np.where(iou <= iou_threshold)[0] order = order[inds + 1] # 由于上一个元素被保留,所以加1 return keep # 示例边界框和置信度数组 bboxes = np.array([[282, 175, 442, 308], [310, 182, 454, 326], ...]) scores = np.array([0.9, 0.7, ...]) keep = nms(bboxes, scores) ``` 通过使用上述代码,我们可以有效地对YOLO的预测结果进行非极大值抑制处理,从而提高目标检测的精度。建议在解决当前问题后,继续深入学习YOLO算法的其他方面,例如锚框的定义、损失函数的构建等,以全面提升你的计算机视觉项目的能力。 参考资源链接:[YOLO目标检测算法详解:实时高效检测](https://wenku.youkuaiyun.com/doc/4vs72fv85f?spm=1055.2569.3001.10343)
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值