96SEO 2026-02-20 01:06 18
。

它的主要目的是解决目标检测过程中出现的重复检测问题#xff0c;即对于…
Suppression简称NMS是一种在计算机视觉和图像处理领域中广泛使用的后处理技术特别是在目标检测任务中。
它的主要目的是解决目标检测过程中出现的重复检测问题即对于同一个物体算法可能会预测出多个重叠或相似的边界框bounding
在目标检测算法得出一系列候选边界框及其对应的类别得分confidence
排序首先根据每个边界框的得分进行降序排序选取得分最高的边界框作为保留的对象。
抑制对于排序后的边界框列表对每一个框i检查其与得分低于它的所有其他框j之间的重叠程度。
通常使用交并比Intersection
剔除如果框i与某个框j的IoU超过预设的阈值比如0.5则认为框j是冗余的将其剔除抑制。
迭代重复上述步骤直到处理完所有候选边界框最终剩下的边界框集合即是经过非极大值抑制后的结果这些框代表了各自区域内最有可能对应真实物体的检测结果。
总之非极大值抑制确保了对同一物体只有一个最精确的边界框被保留下来从而减少误报和重复检测提高了目标检测的精度。
在目标检测中NMS的目的就是要去除冗余的检测框,保留最好的一个
NMS的原理是对于预测框的集合S及其对应的置信度score这里的置信度就是softmax得出的概率值它的含义是多大的把握预测正确也就是有多大的把握确定检测框中存在真正的目标,选择具有最大score的检测框,记为M,将其从集合S中移除并加入到最终的检测结果集合中.并且将集合S中剩余检测框中与检测框M的IoU大于阈值的框从集合S中移除.重复这个过程,直到集合S为空。
算法一般是为了去掉模型预测后的多余框其一般设有一个nms_threshold0.5具体的实现思路如下
了那么就舍弃这个box由于可能这两个box表示同一目标所以保留分数高的哪一个从最后剩余的boxes中再找出最大scores的哪一个如此循环往复。
scores.new(scores.size(0)).zero_().long()x1
通过一个例子看些NMS的使用方法假设定位车辆算法就找出了一系列的矩形框我们需要判别哪些矩形框是没用的需要使用NMS的方法来实现。
5个候选框每个框旁边的数字是它的置信度我们设定NMS的iou阈值是0.5接下来进行迭代计算
第一轮因为B是得分最高的即B的置信度最高在集合S的其余候选框中如果与B的IoU0.5会被删除。
ACDE中现在分别与B计算IoUDE结果0.5剔除DE说明BDE检测的是同一个目标保留置信度最大的候选框而AC可能检测的是另一个目标B作为一个预测结果从集合S中移除并放入最终的检测结果集合中。
此时新的集合S中只剩下候选框A,C
第二轮在新的集合S中A的置信度得分最高将集合S中剩下的候选框分别与A计算IoU因为A与C的iou0.5所以剔除CA作为另外一个预测结果从集合S中移除并放入最终的检测结果集合中此时集合S为空所以循环结束。
[]#强制转换为numpy类型的数组这样才可以进行切片等numpy所支持的操作bboxes
将当前置信度最大的候选框的索引加入返回值列表中因为是从小到大排序所有最后一个值最大即
order[-1]#将置信度最大的候选框及其置信度值加入返回值列表中picked_boxes.append(bboxes[index])picked_score.append(score[index])#
获取当前置信度最大的候选框与其他任意候选框的相交面积这里的order[:-1]表示除了最后一个元素之外的所有元素np.max和np.maximum的实现功能是不同的#np.maximum的用法np.maximum([2,4,7],[3,1,5])输出的结果是array([3,
7])np.maximum([2],[3,1,5])的输出结果是array([3,
5])#np.max的用法np.max([2,4,7])输出结果是7x11
threshold)#更新order以便保留IoU小于阈值的框order
假设有检测结果如下当阈值threshold设置的越大则保留越多的候选框
print(NMS后得到的bbox的confidences是,
print(NMS后得到的bbox的confidences是,
上述所讲的NMS方法都是先将检测框按照类别进行分类然后对对同一类别的检测框应用NMS。
但是在实际的任务中如果所预测的类别很多时那么这种效率非常低。
所以有些时候我们会使用新的方法进行NMS:它的大致思想是先将不同类别的预测框在坐标位置上尽可能的区分开然后就可以一次性对所有预测框进行NMS此时不用先进行分类然后分别对每一个类别依次做NMS
比如下图所示蓝色方框的类别索引是1黄色方框的类别索引是2这些不同类别的预测框在位置上靠的很近此时如果直接对所有类别同时做NMS效果就很差。
所以我们会设法将蓝色方框和黄色方框分离开本例的方法是首先找到所有方框中坐标值最大的数值max_value比如这里是81
indxs与val_value相乘得到不同类别框的偏移量offsets它的公式是offsetsindxs*max_value
比如对于类别索引为1的方框它的偏移量是offsetsindxs*max_value1*8181对于类别索引为1的方框它的偏移量是offsetsindxs*max_value2*81162
计算完每个类别的偏移量后我们就得到新的预测框的坐标以及其对于的新位置如下所示。
然后就可以一次性对所有预测框进行NMS此时不用先进行分类然后分别对每一个类别依次做NMS
2、找出该图片中得分大于门限函数的框。
在进行重合框筛选前就进行得分的筛选可以大幅度减少框的数量。
3、判断第2步中获得的框的种类与得分。
取出预测结果中框的位置与之进行堆叠。
此时最后一维度里面的内容由5num_classes变成了412四个参数代表框的位置一个参数代表预测框是否包含物体两个参数分别代表种类的置信度与种类。
4、对种类进行循环非极大抑制的作用是筛选出一定区域内属于同一种类得分最大的框对种类进行循环可以帮助我们对每一个类分别进行非极大抑制。
6、每次取出得分最大的框计算其与其它所有预测框的重合程度重合程度过大的则剔除。
视频中实现的代码是numpy形式而且库比较久远。
这里改成pytorch的形式且适应当前的库。
nms_thres0.4):#----------------------------------------------------------##
85]#----------------------------------------------------------#box_corner
prediction.new(prediction.shape)box_corner[:,
enumerate(prediction):#----------------------------------------------------------##
种类#----------------------------------------------------------#class_conf,
keepdimTrue)#----------------------------------------------------------##
利用置信度进行第一轮筛选#----------------------------------------------------------#conf_mask
conf_thres).squeeze()#----------------------------------------------------------##
根据置信度进行预测结果的筛选#----------------------------------------------------------#image_pred
image_pred[conf_mask]class_conf
class_conf[conf_mask]class_pred
image_pred.size(0):continue#-------------------------------------------------------------------------##
class_pred#-------------------------------------------------------------------------#detections
1)#------------------------------------------##
获得预测结果中包含的所有种类#------------------------------------------#unique_labels
prediction.is_cuda:unique_labels
unique_labels:#------------------------------------------##
获得某一类得分筛选后全部的预测结果#------------------------------------------#detections_class
#------------------------------------------##
#------------------------------------------##
descendingTrue)detections_class
detections_class[conf_sort_index]#
取出这一类置信度最高的一步一步往下判断判断重合程度是否大于nms_thres如果是则去除掉max_detections.append(detections_class[0].unsqueeze(0))if
self.bbox_iou(max_detections[-1],
detections_class[1:])detections_class
torch.cat(max_detections).data#
self.yolo_correct_boxes(box_xy,
参考文章睿智的目标检测31——非极大抑制NMS与Soft-NMS-CSDN博客
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback