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

【目标检测】非极大值抑制(Non-Maximum Suppression, NMS)步骤与实现

步骤

  1. 置信度排序:首先根据预测框的置信度(即预测框包含目标物体的概率)对所有预测框进行降序排序。
  2. 选择最佳预测框:选择置信度最高的预测框作为参考框。
  3. 计算IoU:计算其他所有预测框与参考框的交并比(Intersection over Union, IoU)。
  4. 抑制:删除IoU高于某个阈值的所有预测框,因为这些框与参考框重叠太多,可能是重复预测。
  5. 迭代:从剩余的预测框中选择置信度最高的作为新的参考框,重复步骤3和4,直到所有预测框都被处理。

代码实现

导入必要的库

import numpy as np

定义计算IoU的函数

def 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)# 计算每个边界框的面积boxAArea = (boxA[2] - boxA[0]) * (boxA[3] - boxA[1])boxBArea = (boxB[2] - boxB[0]) * (boxB[3] - boxB[1])# 计算并集面积unionArea = boxAArea + boxBArea - interArea# 计算IoUiou = interArea / unionArea if unionArea != 0 else 0return iou

定义NMS函数

def nms(boxes, scores, iou_threshold):picked = []  # 存储被选择的边界框索引indexes = np.argsort(scores)[::-1]  # 按分数降序排列索引while len(indexes) > 0:current = indexes[0]picked.append(current)  # 选择当前最高分的边界框indexes = indexes[1:]  # 移除当前最高分的索引# 检查剩余边界框与当前选择框的IoU,如果大于阈值则抑制indexes = [i for i in indexes if iou(boxes[current], boxes[i]) <= iou_threshold]return picked

示例使用

# 假设boxes和scores是模型预测的边界框和分数
boxes = np.array([[50, 50, 100, 100], [60, 60, 110, 110], [200, 200, 300, 300]])
scores = np.array([0.9, 0.75, 0.8])# 设置IoU阈值
iou_threshold = 0.5# 执行NMS
picked_boxes = nms(boxes, scores, iou_threshold)print("Selected box indices:", picked_boxes)

注意

  • 边界框通常以(x1, y1, x2, y2)的格式表示,其中(x1, y1)是左上角坐标,(x2, y2)是右下角坐标。

Code

完整示例代码已上传至:Machine Learning and Deep Learning Algorithms with NumPy
此项目包含更多AI相关的算法numpy实现,供大家学习参考使用,欢迎star~

备注

个人水平有限,有问题随时交流~

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 超级智能体创造营:启动!我的情侣匹配度测试助手
  • Vue3 reactive原理(一)-代理对象及数组
  • 可乐的由来
  • 【前端/js】使用js读取本地文件(xml、二进制)内容
  • Redis的使用场景——热点数据缓存
  • 昇思25天学习打卡营第19天|DCGAN生成漫画头像
  • 【VSCode实战】Golang无法跳转问题竟是如此简单
  • 浏览器内核的理解
  • 业务记录:处理动态表头的CSV/EXCEL文件
  • 电子档案系统与双层PDF及基于Elasticsearch全文检索技术的探索
  • 大语言模型-GPT2-Generative Pre-Training2
  • java实现OCR图片识别,RapidOcr开源免费
  • 前端工程化-vue项目创建
  • Kafka知识总结(事务+数据存储+请求模型+常见场景)
  • 《Java初阶数据结构》----6.<优先级队列之PriorityQueue底层:堆>
  • #Java异常处理
  • cookie和session
  • ERLANG 网工修炼笔记 ---- UDP
  • ES10 特性的完整指南
  • HTTP中的ETag在移动客户端的应用
  • JavaScript函数式编程(一)
  • js正则,这点儿就够用了
  • Linux后台研发超实用命令总结
  • magento2项目上线注意事项
  • Mysql优化
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • Python中eval与exec的使用及区别
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • 动态规划入门(以爬楼梯为例)
  • 简单实现一个textarea自适应高度
  • 理解在java “”i=i++;”所发生的事情
  • 使用common-codec进行md5加密
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 提醒我喝水chrome插件开发指南
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • ​什么是bug?bug的源头在哪里?
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • #图像处理
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (1)bark-ml
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (6)添加vue-cookie
  • (libusb) usb口自动刷新
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (SpringBoot)第七章:SpringBoot日志文件
  • (补)B+树一些思想
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包