目标检测:NMS代码

2024-06-17 20:36
文章标签 代码 目标 检测 nms

本文主要是介绍目标检测:NMS代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

非极大值抑制NMS是目标检测常用的后处理算法,用于剔除冗余检测框

总体概要:

对NMS进行分类,大致可分为以下六种,这里是依据它们在各自论文中的核心论点进行分类,这些算法可以同时属于多种类别。

  1. 分类优先:传统NMS,Soft-NMS (ICCV 2017)

  2. 定位优先:IoU-Guided NMS (ECCV 2018)

  3. 加权平均:Weighted NMS (ICME Workshop 2017)

  4. 方差加权平均:Softer-NMS (CVPR 2019)

  5. 自适应阈值:Adaptive NMS (CVPR 2019)

  6. +中心点距离:DIoU-NMS (AAAI 2020)

分类优先

传统NMS有多个名称,据不完全统计可以被称为:Traditional / Original / Standard / Greedy NMS,为统一起见,下称Traditional NMS。

Traditional NMS算法是最为经典的版本,伪代码如下:

缺点:

  1. 顺序处理的模式,计算IoU拖累了运算效率。

  2. 剔除机制太严格,依据NMS阈值暴力剔除。

  3. 阈值是经验选取的。

  4. 评判标准是IoU,即只考虑两个框的重叠面积,这对描述box重叠关系或许不够全面

测试图片

假如有如下 预测框

import cv2img = cv2.imread('./cat&dog.png')boxes = [(140,110,500,800),(110,70,550,810),(260,60,600,780),(620,80,990,780),(710,62,1050,760),(780,120,1100,740)]colors = [(255,255,0),(0,255,255),(0,255,0),(255,0,0),(255,0,255),(0,0,255)]labels = ['dog']*3 + ['cat']*3for index,(box,color) in enumerate(zip(boxes,colors)):x1,y1,x2,y2 = boxcv2.rectangle(img,(x1,y1),(x2,y2),color,2)cv2.putText(img, labels[index], (x1,y1-10), cv2.FONT_HERSHEY_SIMPLEX, 0.8, color, 2)cv2.imshow('img',img)
cv2.waitKey(20000)
cv2.destroyAllWindows()

 

 

nms实现逻辑是什么?

非极大值抑制(Non-Maximum Suppression,NMS)是一种常用于目标检测中的技术,用于消除重叠的目标框并保留置信度最高的目标框。其实现逻辑如下:

1.输入阶段: 对于每个检测到的目标框,包括其坐标(左上角和右下角)和置信度(confidence score)。

2.根据置信度排序: 首先,根据目标框的置信度对所有检测到的目标框进行排序,通常是按照置信度从高到低的顺序排列。

3.初始化空列表: 创建一个空列表,用于存储最终保留的目标框。

4.遍历目标框: 从置信度最高的目标框开始,遍历每个目标框。

5.计算重叠面积: 对于当前遍历到的目标框,计算它与之前已经保留的目标框之间的重叠面积(通常使用交并比(Intersection over Union,IoU)来衡量)。

6.剔除重叠目标框: 如果当前目标框与任何已经保留的目标框的重叠面积大于预先设定的阈值(通常为一个较小的值,如0.5),则将其剔除,否则将其保留。

7.重复此过程: 继续遍历剩余的目标框,重复上述步骤,直到所有目标框都被处理。

8.输出结果: 最终输出被保留下来的目标框,这些目标框不会与其他目标框重叠太多。

NMS 的核心思想是通过逐步筛选,去除与置信度最高的目标框有较大重叠的其他目标框,从而保留最具代表性和置信度最高的目标框。这样可以减少冗余的检测结果,提高目标检测算法的准确性和效率。

这篇关于目标检测:NMS代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1070445

相关文章

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁

精选20个好玩又实用的的Python实战项目(有图文代码)

《精选20个好玩又实用的的Python实战项目(有图文代码)》文章介绍了20个实用Python项目,涵盖游戏开发、工具应用、图像处理、机器学习等,使用Tkinter、PIL、OpenCV、Kivy等库... 目录① 猜字游戏② 闹钟③ 骰子模拟器④ 二维码⑤ 语言检测⑥ 加密和解密⑦ URL缩短⑧ 音乐播放

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

Python实现MQTT通信的示例代码

《Python实现MQTT通信的示例代码》本文主要介绍了Python实现MQTT通信的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 安装paho-mqtt库‌2. 搭建MQTT代理服务器(Broker)‌‌3. pytho

MySQL进行数据库审计的详细步骤和示例代码

《MySQL进行数据库审计的详细步骤和示例代码》数据库审计通过触发器、内置功能及第三方工具记录和监控数据库活动,确保安全、完整与合规,Java代码实现自动化日志记录,整合分析系统提升监控效率,本文给大... 目录一、数据库审计的基本概念二、使用触发器进行数据库审计1. 创建审计表2. 创建触发器三、Java

Linux系统性能检测命令详解

《Linux系统性能检测命令详解》本文介绍了Linux系统常用的监控命令(如top、vmstat、iostat、htop等)及其参数功能,涵盖进程状态、内存使用、磁盘I/O、系统负载等多维度资源监控,... 目录toppsuptimevmstatIOStatiotopslabtophtopdstatnmon

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

Java实现自定义table宽高的示例代码

《Java实现自定义table宽高的示例代码》在桌面应用、管理系统乃至报表工具中,表格(JTable)作为最常用的数据展示组件,不仅承载对数据的增删改查,还需要配合布局与视觉需求,而JavaSwing... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码