非极大值抑制算法(NMS)

定义: 非极大值抑制(Non-maximum suppression,NMS)是一种去除非极大值的算法,常用于计算机视觉中的边缘检测、物体识别、人脸检测、目标检测(DPM,YOLO,SSD,Faster R-CNN)等。其思想是搜素局部最大值,抑制非极大值。

算法流程: 给出一张图片和上面许多物体检测的候选框(即每个框可能都代表某种物体),但是这些框很可能有互相重叠的部分,我们要做的就是*** 利用非极大值抑制找到最佳的目标边界框,消除冗余的边界框,只保留最优的框***。
在这里插入图片描述
非极大值抑制的流程:

先假设有6个矩形框,根据分类器的类别分类概率做排序,假设从小到大属于车辆的概率 分别为A、B、C、D、E、F。

(1)从最大概率矩形框F开始,分别判断A~E与F的重叠度IOU是否大于某个设定的阈值;

(2)假设B、D与F的重叠度超过阈值,那么就扔掉B、D;并标记第一个矩形框F,是我们保留下来的。

(3)从剩下的矩形框A、C、E中,选择概率最大的E,然后判断E与A、C的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框。

就这样一直重复,找到所有被保留下来的矩形框。

需要优化的参数: IoU 的阈值是一个可优化的参数,一般范围为0~0.5,可以使用交叉验证来选择最优的参数。
在这里插入图片描述
产生proposal后使用分类网络给出每个框的每类置信度,使用回归网络修正位置,最终应用NMS.

### YOLO 中 NMS 的简化实现 #### 传统 NMS 算法概述 非极大值抑制 (Non-Maximum Suppression, NMS) 是一种用于消除冗余边界框的技术,广泛应用于目标检测模型中。通过设定阈值来过滤掉那些重叠程度较高的候选框,保留最有可能包含物体的那个框[^2]。 #### 简化的 NMS 实现思路 为了简化 NMS 的实现并提升效率,可以从以下几个方面入手: 1. **减少输入数量** 对于每一个类别,先按照置信度得分进行降序排列,仅选取前 K 名的预测框参与后续处理过程[K 取决于具体应用场景的需求以及硬件资源情况]。 2. **优化 IoU 计算方式** 使用更高效的交并比(IoU)计算方法,比如 DIoU、CIoU 或者 EIoU 来代替传统的 IoU 度量标准。这些改进版的距离函数不仅考虑了两个矩形之间的重合面积比例,还加入了中心点距离等因素的影响,使得筛选更加精准有效[^1]。 3. **采用 Soft-NMS 技术** 不同于经典硬裁剪式的 NMS 方案,Soft-NMS 提出了渐进式降低其他竞争者的分数策略,即当某个高分提案与其他低分但有一定重叠区域的小型障碍物存在较大相似性时,并不会立即将后者删除而是适当下调其权重系数;反之亦然。这种方法可以在一定程度上缓解漏检现象的发生概率。 4. **去除不必要的循环迭代** 如果已知某些条件下不可能再有新的合格项加入最终列表,则可以直接终止当前轮次甚至整个流程,提前结束运算以节省时间开销。 以下是基于上述原则的一个简单 C++ 版本的 NMS 函数示例代码: ```cpp #include <vector> #include <algorithm> struct BoundingBox { float score; int x_min, y_min, x_max, y_max; }; std::vector<BoundingBox> nms(const std::vector<BoundingBox>& boxes, float iou_threshold) { // Sort by scores in descending order. auto sorted_boxes = boxes; std::sort(sorted_boxes.begin(), sorted_boxes.end(), [](const BoundingBox& a, const BoundingBox& b){return a.score > b.score;}); std::vector<BoundingBox> picked; while (!sorted_boxes.empty()) { bool has_overlap = false; // Pick the box with highest confidence as non-maximum and remove it from list of boxes to be processed. BoundingBox current_box = sorted_boxes.front(); picked.push_back(current_box); sorted_boxes.erase(sorted_boxes.begin()); for(auto iter=sorted_boxes.begin();iter!=sorted_boxes.end();) { if(compute_iou(*iter,current_box)>iou_threshold){ iter = sorted_boxes.erase(iter); // Remove overlapping boxes based on IOU threshold. has_overlap=true; }else{ ++iter; } } if(!has_overlap){ break; // No more overlaps found so exit early. } } return picked; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

碧寒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值