当前位置: 首页 > news >正文

pytorch复现_NMS

NMS(非极大值抑制)阈值是用于控制在一组重叠的边界框中保留哪些边界框的参数。当检测或识别算法生成多个边界框可能涵盖相同物体时,NMS用于筛选出最相关的边界框,通常是根据它们的置信度分数。
具体来说,NMS的工作原理如下:
1.首先,算法对图像中的目标进行检测,并为每个检测到的目标生成一个边界框。每个边界框都伴随一个与目标相关的置信度分数。
2.接下来,NMS算法将所有边界框按照它们的置信度分数进行排序,通常按照分数降序排列。
3.然后,NMS算法从分数最高的边界框开始,将该边界框添加到最终保留的边界框列表中。
4.对于剩余的边界框,NMS会计算它们与当前保留的边界框的IoU(交并比)。如果IoU大于NMS阈值,这些边界框将被抑制(丢弃),只保留一个。
5.重复步骤3和4,直到遍历所有边界框。


import numpy as npimport numpy as np
def compute_iou(boxA,boxB):# 计算相交区域的坐标xA=max(boxA[0],boxB[0])yA=max(boxA[1],boxB[1])xB=min(boxA[2],boxB[2])yB=min(boxA[3],boxB[3])# 计算相交区域,如果是负数一定是不相交interArea = max(0,xB-xA)*max(0,yB-yA)# 计算A和B的面积boxAArea=(boxA[3]-boxA[1])*(boxA[2]-boxA[0])boxBArea=(boxB[3]-boxB[1])*(boxB[2]-boxB[0])# 计算iouiou=interArea/(boxAArea+boxBArea-interArea)return ioudef nms(boxes, scores, threshold):# boxes: 边界框列表,每个框是一个格式为 [x1, y1, x2, y2] 的列表# scores: 每个边界框的得分列表# threshold: NMS的IoU阈值# 按得分升序排列边界框sorted_indices = np.argsort(scores)boxes = [boxes[i] for i in sorted_indices]scores = [scores[i] for i in sorted_indices]keep = []  # 保留的边界框的索引列表while boxes:# 取得分最高的边界框current_box = boxes.pop()current_score = scores.pop()keep.append(sorted_indices[-1])sorted_indices = sorted_indices[:-1]discard_indices = []  # 需要丢弃的边界框的索引列表for i, box in enumerate(boxes):# 计算与当前边界框的IoUiou = compute_iou(current_box, box)# 如果IoU超过阈值,标记该边界框为需要丢弃if iou > threshold:discard_indices.append(i)# 移除标记为需要丢弃的边界框。从后往前删,不然for循环会出错for i in sorted(discard_indices, reverse=True):boxes.pop(i)scores.pop(i)sorted_indices = np.delete(sorted_indices, i) # np与list的方法不同return keep# test# 模拟一组边界框和得分
boxes = [[1, 1, 3, 3], [2, 2, 4, 4], [4, 4, 6, 6], [5, 5, 7, 7], [10, 10, 12, 12]]
scores = [0.9, 0.8, 0.7, 0.75, 0.6]# 设置NMS阈值
nms_threshold = 0.9# 调用nms函数进行非极大值抑制
keep_indices = nms(boxes, scores, nms_threshold)# 打印保留下来的边界框的索引
print("保留的边界框索引:", keep_indices)# 打印保留下来的边界框的坐标和得分
print("保留的边界框坐标和得分:")
for idx in keep_indices:print("边界框坐标:", boxes[idx])print("得分:", scores[idx])

在这里插入图片描述

相关文章:

  • 11.1 知识总结(JavaScript)
  • 大数据之LibrA数据库系统告警处理(ALM-12007 进程故障)
  • web3:智能合约浏览器版本的 IDE - remix 使用教程
  • R语言在生态环境领域中的实践技术应用
  • 牛客网刷题-(9)
  • android下的app性能测试应主要针对那些方面,如何开展?
  • [.NET]桃源网络硬盘 v7.4
  • MySQL - 系统库之 sys
  • 【Python 千题 —— 基础篇】乘法计算
  • [SpringCloud | Linux] CentOS7 部署 SpringCloud 微服务
  • 四级核心词汇
  • 【C/C++】空指针访问成员函数
  • 如何卸载干净 IDEA(图文讲解)windows和Mac教程
  • R -- 体验 stringdist
  • 【备忘录】SpringBoot+ dynamic-datasource配置自定义多数据源
  • 【391天】每日项目总结系列128(2018.03.03)
  • cookie和session
  • E-HPC支持多队列管理和自动伸缩
  • Git 使用集
  • go append函数以及写入
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • JavaScript 一些 DOM 的知识点
  • Laravel5.4 Queues队列学习
  • Logstash 参考指南(目录)
  • PAT A1017 优先队列
  • React Transition Group -- Transition 组件
  • SAP云平台里Global Account和Sub Account的关系
  • SpiderData 2019年2月16日 DApp数据排行榜
  • ucore操作系统实验笔记 - 重新理解中断
  • 阿里云前端周刊 - 第 26 期
  • 从setTimeout-setInterval看JS线程
  • 大数据与云计算学习:数据分析(二)
  • 关于extract.autodesk.io的一些说明
  • 基于组件的设计工作流与界面抽象
  • 检测对象或数组
  • 区块链共识机制优缺点对比都是什么
  • 如何设计一个微型分布式架构?
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 延迟脚本的方式
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (52)只出现一次的数字III
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (pojstep1.1.2)2654(直叙式模拟)
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (接口封装)
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (转)大型网站架构演变和知识体系
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil