非极大值抑制详细原理(NMS含代码及详细注释)
作者主页:爱笑的男孩。的博客_CSDN博客-深度学习,YOLO,活动领域博主爱笑的男孩。擅长深度学习,YOLO,活动,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.
https://blog.csdn.net/Code_and516?type=collect
个人介绍:打工人。
分享内容:机器学习、深度学习、python相关内容、日常BUG解决方法及Windows&Linux实践小技巧。
如发现文章有误,麻烦请指出,我会及时去纠正。有其他需要可以私信我或者发我邮箱:zhilong666@foxmail.com
目录
非极大值抑制原理
NMS源码含注释
需要的依赖包
nms算法
绘图
全部代码
效果图
非极大值抑制原理
非极大值抑制(Non-Maximum Suppression,NMS)是一种图像处理中的技术。它通常用于目标检测中,其主要作用是去除检测出来的冗余框,只保留最有可能包含目标物体的框,保留最优的检测结果。
在目标检测中,我们通常使用一个检测器来检测出可能存在的物体,并给出其位置和大小的预测框。然而,同一个物体可能会被多次检测出来,从而产生多个预测框。这时,我们就需要使用NMS来去除掉这些重叠的框,只保留最优的一个。
其基本原理是先在图像中找到所有可能包含目标物体的矩形区域,并按照它们的置信度进行排列。然后从置信度最高的矩形开始,遍历所有的矩形,如果发现当前的矩形与前面任意一个矩形的重叠面积大于一个阈值,则将当前矩形舍去。使得最终保留的预测框数量最少,但同时又能够保证检测的准确性和召回率。具体的实现方法包括以下几个步骤:
-
对于每个类别,按照预测框的置信度进行排序,将置信度最高的预测框作为基准。
-
从剩余的预测框中选择一个与基准框的重叠面积最大的框,如果其重叠面积大于一定的阈值,则将其删除。
-
对于剩余的预测框,重复步骤2,直到所有的重叠面积都小于阈值,或者没有被删除的框剩余为止。
通过这样的方式,NMS可以过滤掉所有与基准框重叠面积大于阈值的冗余框,从而实现检测结果的优化。值得注意的是,NMS的阈值通常需要根据具体的数据集和应用场景进行调整,以兼顾准确性和召回率。
总结来说,非极大值抑制原理是通过较高置信度的目标框作为基准,筛选出与其重叠度较低的目标框,从而去除掉冗余的目标框,提高目标检测的精度和效率。
NMS源码含注释
需要的依赖包
import numpy as np import matplotlib.pyplot as plt #安装 #pip install numpy==1.19.5 -i https://pypi.tuna.tsinghua.edu.cn/simple/ #pip install matplotlib==3.2.2 -i https://pypi.tuna.tsinghua.edu.cn/simple/
nms算法
#nms 算法
def py_cpu_nms(dets, thresh):#边界框的坐标x1 = dets[:, 0]#所有行第一列y1 = dets[:, 1]#所有行第二列x2 = dets[:, 2]#所有行第三列y2 = dets[:, 3]#所有行第四列#计算边界框的面积areas = (y2 - y1 + 1) * (x2 - x1 + 1) #(第四列 - 第二列 + 1) * (第三列 - 第一列 + 1)#执行度,包围盒的信心分数scores = dets[:, 4]#所有行第五列keep = []#保留#按边界框的置信度得分排序 尾部加上[::-1] 倒序的意思 如果没有[::-1] argsort返回的是从小到大的index = scores.argsort()[::-1]#对所有行的第五列进行从大到小排序,返回索引值#迭代边界框while index.size > 0: # 6 > 0, 3 > 0, 2 > 0i = index[0] # every time the first is the biggst, and add it directly每次第一个是最大的,直接加进去keep.append(i)#保存#计算并集上交点的纵坐标(IOU)x11 = np.maximum(x1[i], x1[index[1:]]) # calculate the points of overlap计算重叠点y11 = np.maximum(y1[i], y1[index[1:]]) # index[1:] 从下标为1的数开始,直到结束x22 = np.minimum(x2[i], x2[index[1:]])y22 = np.minimum(y2[i], y2[index[1:]])#计算并集上的相交面积w = np.maximum(0, x22 - x11 + 1) # the weights of overlap重叠权值、宽度h = np.maximum(0, y22 - y11 + 1) # the height of overlap重叠高度overlaps = w * h# 重叠部分、交集#IoU:intersection-over-union的本质是搜索局部极大值,抑制非极大值元素。即两个边界框的交集部分除以它们的并集。# 重叠部分 / (面积[i] + 面积[索引[1:]] - 重叠部分)ious = overlaps / (areas[i] + areas[index[1:]] - overlaps)#重叠部分就是交集,iou = 交集 / 并集print("ious", ious)# ious <= 0.7idx = np.where(ious <= thresh)[0]#判断阈值print("idx", idx)index = index[idx + 1] # because index start from 1 因为下标从1开始return keep #返回保存的值
绘图
#画图函数
def plot_bbox(dets, c='k'):#c = 颜色 默认黑色# 边界框的坐标x1 = dets[:, 0] # 所有行第一列y1 = dets[:, 1] # 所有行第二列x2 = dets[:, 2] # 所有行第三列y2 = dets[:, 3] # 所有行第四列plt.plot([x1, x2], [y1, y1], c)#绘图plt.plot([x1, x1], [y1, y2], c)#绘图plt.plot([x1, x2], [y2, y2], c)#绘图plt.plot([x2, x2], [y1, y2], c)#绘图plt.title("nms")#标题
全部代码
#导入数组包
import numpy as np
import matplotlib.pyplot as plt#画图包#画图函数
def plot_bbox(dets, c='k'):#c = 颜色 默认黑色# 边界框的坐标x1 = dets[:, 0] # 所有行第一列y1 = dets[:, 1] # 所有行第二列x2 = dets[:, 2] # 所有行第三列y2 = dets[:, 3] # 所有行第四列plt.plot([x1, x2], [y1, y1], c)#绘图plt.plot([x1, x1], [y1, y2], c)#绘图plt.plot([x1, x2], [y2, y2], c)#绘图plt.plot([x2, x2], [y1, y2], c)#绘图plt.title("nms")#标题#nms 算法
def py_cpu_nms(dets, thresh):#边界框的坐标x1 = dets[:, 0]#所有行第一列y1 = dets[:, 1]#所有行第二列x2 = dets[:, 2]#所有行第三列y2 = dets[:, 3]#所有行第四列#计算边界框的面积areas = (y2 - y1 + 1) * (x2 - x1 + 1) #(第四列 - 第二列 + 1) * (第三列 - 第一列 + 1)#执行度,包围盒的信心分数scores = dets[:, 4]#所有行第五列keep = []#保留#按边界框的置信度得分排序 尾部加上[::-1] 倒序的意思 如果没有[::-1] argsort返回的是从小到大的index = scores.argsort()[::-1]#对所有行的第五列进行从大到小排序,返回索引值#迭代边界框while index.size > 0: # 6 > 0, 3 > 0, 2 > 0i = index[0] # every time the first is the biggst, and add it directly每次第一个是最大的,直接加进去keep.append(i)#保存#计算并集上交点的纵坐标(IOU)x11 = np.maximum(x1[i], x1[index[1:]]) # calculate the points of overlap计算重叠点y11 = np.maximum(y1[i], y1[index[1:]]) # index[1:] 从下标为1的数开始,直到结束x22 = np.minimum(x2[i], x2[index[1:]])y22 = np.minimum(y2[i], y2[index[1:]])#计算并集上的相交面积w = np.maximum(0, x22 - x11 + 1) # the weights of overlap重叠权值、宽度h = np.maximum(0, y22 - y11 + 1) # the height of overlap重叠高度overlaps = w * h# 重叠部分、交集#IoU:intersection-over-union的本质是搜索局部极大值,抑制非极大值元素。即两个边界框的交集部分除以它们的并集。# 重叠部分 / (面积[i] + 面积[索引[1:]] - 重叠部分)ious = overlaps / (areas[i] + areas[index[1:]] - overlaps)#重叠部分就是交集,iou = 交集 / 并集print("ious", ious)# ious <= 0.7idx = np.where(ious <= thresh)[0]#判断阈值print("idx", idx)index = index[idx + 1] # because index start from 1 因为下标从1开始return keep #返回保存的值def main():# 创建数组boxes = np.array([[100, 100, 210, 210, 0.72],[250, 250, 420, 420, 0.8],[220, 220, 320, 330, 0.92],[100, 100, 210, 210, 0.72],[230, 240, 325, 330, 0.81],[220, 230, 315, 340, 0.9]])show(boxes)def show(boxes):plt.figure(1) # 画图窗口、图形plt.subplot(1, 2, 1) # 子图plot_bbox(boxes, 'k') # before nms 使用nms(非极大抑制)算法前plt.subplot(1, 2, 2) # 子图keep = py_cpu_nms(boxes, thresh=0.7) # nms(非极大抑制)算法print(keep)plot_bbox(boxes[keep], 'r') # after nms 使用nms(非极大抑制)算法后plt.show() # 显示图像if __name__ == '__main__':main()
效果图
相关文章:

非极大值抑制详细原理(NMS含代码及详细注释)
作者主页:爱笑的男孩。的博客_CSDN博客-深度学习,YOLO,活动领域博主爱笑的男孩。擅长深度学习,YOLO,活动,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typecollect 个…...
女朋友说总是记不住Git命令,怎么办?安排!
如果你也和我女朋友一样总是忘记Git命令,觉得记忆Git命令是很枯燥和麻烦的事情。我写了一个包含了40 条常用Git命令的清单。你一定要收藏起来,当你忘记Git命令的时候,就可以打开来查看啦!!! 1.初始化本地仓…...

【ChatGLM】本地版ChatGPT ?6G显存即可轻松使用 !ChatGLM-6B 清华开源模型本地部署教程
目录 感谢B站秋葉aaaki大佬 前言 部署资源 部署流程 实机演示 ChatGML微调(人格炼成)(个人感觉蛮有趣的地方) 分享有趣の微调人格 实机演示(潘金莲人格) 感谢B站秋葉aaaki大佬 秋葉aaaki的个人空间…...
【MySQL】练习六 关系数据理论及数据库设计
文章目录 主要内容练习题一、选择题二、填空题三、判断题四、简答题主要内容 一个不好的关系模式可能存在的问题;函数依赖及三种函数依赖的定义:完全、部分、传递范式及1NF/2NF/3NF/BCNF的判定模式分解数据库设计的基本步骤概念设计(E-R图)逻辑模型(E-R图转换为逻辑模型的…...

UG NX二次开发(C++)-建模-修改NXObject或者Feature的颜色(一)
文章目录 1、前言2、在UG NX中修改Feature的颜色操作3、采用NXOpen(C)实现3.1 创建修改特征的方法3.2 调用ModifyFeatureColor方法3.3 测试结果 1、前言 在UG NX中,改变NXObject和Feature的操作是不相同的,所以其二次开发的代码也不一样,我们…...
全球天气weather.com的icon汇总表 天气现象代码枚举
全球天气weather.com的icon汇总表 天气现象代码枚举 Icon代码天气情况(列举常见情况,不包含全部)3大暴雨、大暴雨伴有风4大雷雨、强雷雨、雷雨、雷雨伴有风5雨或雪、雨伴有阵雪6雨夹冰粒、雨夹冰粒伴有风7雨夹雪、小雨夹雪、雪伴有冰粒和风、小雨夹雪伴有风、雪伴有冰粒8冻毛雨…...
【Python】【进阶篇】16、settings.py配置文件详解
目录 settings.py配置文件详解1. settings.py文件介绍1) BASE_DIR2) SECRET_KEY3) DEBUG4) ALLOWED_HOSTS5) INSTALLED_APPS6) MIDDLEWARE7) ROOT_URLCONF8) TEMPLATES9) WSGI_APPLICATION10) DATABASES11) AUTH_PASSWORD_VALIDATORS12) LANGUAGE_CODE和TIME_ZONE13) USE_118N和…...
【华为机试】HJ1 字符串最后一个单词的长度
【华为机试】 HJ1 字符串最后一个单词的长度 描述 计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000。(注:字符串末尾不以空格为结尾) 输入描述: 输入一行,代表要计算的字符串…...

Spring DI简介及依赖注入方式和依赖注入类型
目录 一、什么是依赖注入 二、依赖注入方式 1. Setter注入 2. 构造方法注入 3. 自动注入 三、依赖注入类型 1. 注入bean类型 2. 注入基本数据类型 3. 注入List集合 4. 注入Set集合 5. 注入Map集合 6. 注入Properties对象 往期专栏&文章相关导读 1. Maven系…...
ES6栈方法和队列方法
在 JavaScript 这门语言中,栈和队列是非常重要的数据结构,它们可以帮助我们更好地组织和管理数据。我们可以使用 ES6 标准中新增的方法来实现栈和队列的操作。这篇文章将介绍 ES6 中数组的栈方法和队列方法。 栈(Stack) 栈是一种后进先出(L…...

EventBus(事件总线)的使用和源码的简单解析
Google Guava EventBus(事件总线)的使用和源码的简单解析 什么是EventBus? 事件总线(EventBus)是一种广泛用于软件架构中的设计模式,用于实现解耦和松散耦合的通信机制。它可以帮助组织和管理应用程序中不同组件之间的通信&…...

《汇编语言》- 读书笔记 - 第2章-寄存器
《汇编语言》- 读书笔记 - 第2章-寄存器 2.0 8086CPU 寄存器段地址:偏移地址 2.1 通用寄存器2.2 字在寄存器中的存储2.3 几条汇编指令表2.1汇编指令举例表2.2 程序段中指令的执行情况之一问题 2.1表2.3 程序段中指令的执行情况之二问题 2.2 检测点 2.12.4 物理地址2.5 16位结构…...

English Learning - L3 综合练习 1 VOA-Color 2023.04.26 周三
English Learning - L3 综合练习 1 VOA-Color 2023.04.26 周三 主题整体听一遍精听句子 1扩展 way of doing | way to do sth 句子 2扩展 Expression扩展 base 句子 3句子 4扩展 red-hot 句子 5句子 6扩展 fiery 句子 7句子 8句子 9句子 10句子 11扩展 born 句子 12句子 13句子…...

50道web前端工程师面试题及答案解析,你学会了吗
简介:本文包含了50个实用的前端面试题及答案解析,涵盖了HTML、CSS、JavaScript、DOM、Ajax、MVC、模块化、ES6、SPA、Webpack、Babel、Virtual DOM、响应式设计、移动优先设计、响应式图片、CSS 预处理器、后处理器、模块化、布局、盒模型、浮动、定位、…...

【链表OJ题 1】反转链表
目录 题目来源: 代码实现 1、方法一 1.1分析 2、方法二 2.1 分析 题目来源: 力扣 题目描述: 代码实现 1、方法一 struct ListNode* reverseList(struct ListNode* head) {struct ListNode* prev NULL, * cur head;while (cur){st…...
【华为OD机试真题】计算网络信号 (javaC++python)100%通过率 超详细代码注释
计算网络信号 知识点广搜数组 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 网络信号经过传递会逐层衰减,且遇到阻隔物无法直接穿透,在此情况下需要计算某个位置的网络信号值,注意:网络信号可以绕过阴隔物array[m][n]的一维数组代表网格地图,array[i][j]=0代表i…...

Tomcat8和Tomcat9乱码问题
今天新开了一个小项目,我丢,乱码了,咋回事,好久没遇到过了,都忘了咋回事。今天必须记录下来,避免继续踩坑 Tomcat 8 不需要进行任何配置即可,它默认的是GBK,而win10 win7 默认的也是…...

Lesson13 IP协议
IP: 提供一种能力,将数据从A主机送到B主机的能力,但不一定会成功 主机 : 配有 IP 地址 , 但是不进行路由控制的设备 ; 路由器: 即配有 IP 地址 , 又能进行路由控制 ; 节点 : 主机和路由器的统称; 协议头格式 如何封装和解包: 定长报头 自描述字段 如何交付(分用) : 8…...
【每日一题Day192】LC1033移动石子直到连续 | 分类讨论 贪心
移动石子直到连续【LC1033】 三枚石子放置在数轴上,位置分别为 a,b,c。 每一回合,你可以从两端之一拿起一枚石子(位置最大或最小),并将其放入两端之间的任一空闲位置。形式上,假设这…...

2023年软件测试常见面试题100%问必背全套教程
随着数字化时代的到来,软件测试越来越受到重视。在未来的几年里,软件测试将继续成为信息技术领域中的热门职业之一。如果你是一名正在寻找或准备进入软件测试行业的人,那么这套常见面试题全套教程对你来说会非常有用。 这套教程旨在帮助你了…...

手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...

云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...