单阶段目标检测--NMS

目录

一、概念:

二、算法过程

三、代码实现


一、概念:

        在目标检测的初始结果中,同一个物体,可能对应有多个边界框 (bounding box,bb),这些边界框通常相互重叠。如何从中选择一个最合适 的(也就是与真实目标框最接近的)呢?通常采用的做法是NMS(Nonmaximum suppression),即非极大值抑制。

二、算法过程

         非极大值抑制的大体思路就像其名一样,对于多个边界框,以置信度 (class score)最大的那个框为准,其他与之重合度高的框,则认为它们检测 的是同一个物体,将其他框除掉,也就是抑制掉。给定一系列候选框,针对每 个类别,分别执行NMS,具体流程如下:

        1. 找到置信度最大的框,该框肯定是目标,得到第1个框;

        2. 依次计算其他相同类别框与第1个框的重合度(IOU值),如果大于一 定阈值,抑制掉;

        3. 剩下的框中,同样找置信度最大的框,为第2个框,抑制掉重合的框;

        4. 反复执行上述步骤,直到剩下最后一个框,此亦为目标框。

三、代码实现

#需求
#使用nms实现图像阈值参数的提取
"""
1导包
2,定义nms对象候选边框2.1 边界框2.2 边框坐标2.3 边界框的置信度2.4 选择边界框,   2.5 计算边界框的面积
3, 根据边界框置信度排序3.1   迭代边界框3.2 边界框信心指数得分最大3.3 选择信心得分最大
4 ,计算相交过并并坐标(IOU)4.1 计算交集-过并域4.2 计算交集和并集之间的比率
5,图像设置--->名称5.1 边界框5.2读取图像文件5.3复制图像作为原始5.4参数设置5.5IOU阈值5.6绘制边界框和信心得分5.7执行非max抑制算法5.8绘制非最大值抑制后的边界框和置信度得分5.9显示图像
"""
import cv2
import numpy as np
"""Non-max Suppression Algorithm@param list Object candidate bounding boxes@param list Confidence score of bounding boxes@param float IoU threshold@return Rest boxes after nms operation
"""
#定义nms对象候选边框
def nms(bounding_boxes,confidence_srore,threashold): #定义nmsif len(bounding_boxes) == 0:return [],[]boxes = np.array(bounding_boxes)# coordinates of bounding boxes 边框坐标start_x = boxes[:,0]start_y = boxes[:,1]   end_x = boxes[:,2]end_y = boxes[:,3]# Bounding boxes 边界框boxes = np.array(bounding_boxes)# Confidence scores of bounding boxes 边界框的置信度score = np.array(confidence_score)# Picked bounding boxes 选择边界框picked_boxes = []picked_score = []# Compute areas of bounding boxes 计算边界框的面积areas = (end_x - start_x + 1) * (end_y - start_y + 1)# Sort by confidence score of bounding boxes 根据边界框置
信度排序order = np.argsort(score)# Iterate bounding boxes 迭代边界框while order.size > 0:# The index of largest confidence score 边界框信心指数
得分最大index = order[-1] #未匹配到元素# Pick the bounding box with largest confidence score 
选择信心得分最大的区域picked_boxes.append(bounding_boxes[index])picked_score.append(confidence_score[index])# Compute ordinates of intersection-over-union(IOU) 计
算相交过并并坐标(IOU)x1 = np.maximum(start_x[index], start_x[order[:-1]])x2 = np.minimum(end_x[index], end_x[order[:-1]])y1 = np.maximum(start_y[index], start_y[order[:-1]])y2 = np.minimum(end_y[index], end_y[order[:-1]])# Compute areas of intersection-over-union 计算交集-过
并域w = np.maximum(0.0, x2 - x1 + 1)h = np.maximum(0.0, y2 - y1 + 1)intersection = w * h       # Compute the ratio between intersection and union 计
算交集和并集之间的比率ratio = intersection / (areas[index] + 
areas[order[:-1]] - intersection)left = np.where(ratio < threshold)order = order[left]return picked_boxes, picked_score
# Image name
image_name = '1.png'
# Bounding boxes 边界框
bounding_boxes = [(187, 82, 337, 317), (150, 67, 305, 282), 
(246, 121, 368, 304)]
confidence_score = [0.9, 0.75, 0.8]
# Read image 读取图像文件
image = cv2.imread(image_name)
# Copy image as original 复制图像作为原始
org = image.copy()
# Draw parameters 参数设置
font = cv2.FONT_HERSHEY_SIMPLEX
font_scale = 1
thickness = 2
# IoU threshold IOU阈值
threshold = 0.4
# Draw bounding boxes and confidence score 绘制边界框和信心得分
for (start_x, start_y, end_x, end_y), confidence in 
zip(bounding_boxes, confidence_score):(w, h), baseline = cv2.getTextSize(str(confidence), font, 
font_scale, thickness)cv2.rectangle(org, (start_x, start_y - (2 * baseline + 
5)), (start_x + w, start_y), (0, 255, 255), -1)cv2.rectangle(org, (start_x, start_y), (end_x, end_y), 
(0, 255, 255), 2) 第十一章, YOLO系列概述 
1.深度学习经典检测方法 (1) tow-stage(两阶段):Faster-rcnn Mask-rcnn系列:增加了区域建议网
络(RPN),即预选框
特点
速度通常较慢(5FPS),但是效果通常不错cv2.putText(org, str(confidence), (start_x, start_y), 
font, font_scale, (0, 0, 0), thickness)
# Run non-max suppression algorithm 执行非max抑制算法
picked_boxes, picked_score = nms(bounding_boxes, 
confidence_score, threshold)
# Draw bounding boxes and confidence score after non-maximum 
supression 绘制非最大值抑制后的边界框和置信度得分
for (start_x, start_y, end_x, end_y), confidence in 
zip(picked_boxes, picked_score):(w, h), baseline = cv2.getTextSize(str(confidence), font, 
font_scale, thickness)cv2.rectangle(image, (start_x, start_y - (2 * baseline + 
5)), (start_x + w, start_y), (0, 255, 255), -1)cv2.rectangle(image, (start_x, start_y), (end_x, end_y), 
(0, 255, 255), 2)cv2.putText(image, str(confidence), (start_x, start_y), 
font, font_scale, (0, 0, 0), thickness)
# Show image 显示图像
cv2.imshow('Original', org)
cv2.imshow('NMS', image)
cv2.waitKey(0)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/31194.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DATaGrip的安装与使用

在数据库开发的过程中&#xff0c;有一款专业的软件必不可少。相较于navicat&#xff0c;DataGrip功能更为齐全&#xff0c;如SQL语句编辑、数据库连接管理、数据导入和导出、数据库比较和同步等等。DataGrip支持多种数据库&#xff0c;如MySQL、PostgreSQL、Oracle、Microsoft…

Python | Leetcode Python题解之第171题Excel列表序号

题目&#xff1a; 题解&#xff1a; class Solution:def titleToNumber(self, columnTitle: str) -> int:number, multiple 0, 1for i in range(len(columnTitle) - 1, -1, -1):k ord(columnTitle[i]) - ord("A") 1number k * multiplemultiple * 26return n…

JavaScript:at()方法遇到的问题并解决

目录 第一章 前言 第二章 使用at方法 第三章 分析原因并解决问题 第一章 前言 最近上线了一个项目&#xff0c;测试过程中并没有什么问题&#xff0c;但是上线后使用的用户多了&#xff0c;结果出现了这么一个问题&#xff1a;.at方法对低版本手机的浏览器不兼容问题&#x…

信息打点-协议应用_内网资产_CDN_WAF_负载均衡_防火墙

服务信息获取-协议应用&内网资产 常见端口默认对应的服务&#xff1a; 特殊服务端口&#xff1a; 端口扫描工具&#xff1a; 旁注查询 旁注查询&#xff0c;又称为旁站查询或同服务器网站查询&#xff0c;是一种信息安全和网络侦查技术&#xff0c;主要用于发现与目标网站…

iOS APP内存泄漏的问题

iOS APP内存泄漏是指应用程序不再使用内存&#xff0c;但内存却没有被释放&#xff0c;导致应用程序占用过多的内存&#xff0c;甚至崩溃。内存泄漏是iOS开发中常见的问题&#xff0c;会严重影响应用程序的性能和稳定性。北京木奇移动技术有限公司&#xff0c;专业的软件外包开…

PMBOK® 第六版 指导与管理项目工作

目录 读后感—PMBOK第六版 目录 我们都不情愿去做重复的工作&#xff0c;也不期望只得到一个计划&#xff0c;而具体的工作任务却笼统模糊&#xff0c;需要在做的过程中一边摸索。如此一来&#xff0c;对于熟悉的事情会因反复而影响心态&#xff0c;对于不熟悉的事情则由于痛苦…

【element-ui】el-date-picker动态设置picker-options

<el-date-pickerv-model"formObj.startDate"type"date"placeholder"开始时间":picker-options"startPickerOptions"> </el-date-picker><el-date-pickerv-model"formObj.endDate"type"date"placeh…

5G/4G/北斗遥测终端机全国各省水利平台无缝对接

物联网技术的广泛应用正在深刻影响水利行业&#xff0c;计讯物联致力于推动水利技术的持续革新和服务的持续升级&#xff0c;依托国家级专业水利资质认证&#xff0c;在多个大型水利项目中展现的项目管理专长&#xff0c;为水利项目建设提供了高效的解决方案&#xff0c;持续推…

NodeJs 连接本地 mySql 数据库获取数据

写在前面 今天把 nodejs 连接本地数据库的坑简单的踩一下&#xff0c;为后续写接口做个铺垫 安装 mySql &#xff08;mac举例子&#xff09; 安装地址 安装完成大概这个样子&#xff0c;起动起来就行 安装本地数据库连接工具&#xff08;navicat举例子&#xff09; 安装地…

自定义模板DIY专属CSDN个人主页!HTML+CSS个性化全攻略

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 &#x1f4af;如何通过HTMLCSS自定义模板diy出自己的个性化csdn主页&#x…

单链表经典算法题2

&#x1f339;个人主页&#x1f339;&#xff1a;喜欢草莓熊的bear &#x1f339;专栏&#x1f339;&#xff1a;数据结构 前言 这次介绍的题会比上次更有难度哦&#xff0c;宝宝们系好安全带。咱们出发了&#xff01; 一、合并两个有序链表 1.1思路 创建一个新链表来接收合并…

基于FPGA的Cordic向量模式原理及设计

目录 一、向量模式 1、向量模式原理 1.1 1.2 2、向量模式的MATLAB仿真 3、向量模式的FPGA实现 3.1 预处理 3.2 迭代 3.3 结果计算 一、向量模式 1、向量模式原理 已知直角坐标下一点&#xff08;x&#xff0c;y&#xff09;&#xff0c;如何求该点在极坐标系的坐标&a…

2024华为OD机试真题- 计算三叉搜索树的高度-(C++/Python)-C卷D卷-100分

2024华为OD机试题库-(C卷+D卷)-(JAVA、Python、C++) 题目描述 定义构造三叉搜索树规则如下: 每个节点都存有一个数,当插入一个新的数时,从根节点向下寻找,直到找到一个合适的空节点插入。查找的规则是: 1.如果数小于节点的数减去500,则将数插入节点的左子树 2.如果数大于…

T200HSA单路SDI/HDMI+1路3.5音频高清万能采集卡

产品简介&#xff1a; 同三维T200HSA单路高清万能采集卡&#xff0c;可以采集1路SDI/HDMI高清信号1路3.5音频信号&#xff0c;卡上有1个是HDMI接口1个是SDI接口1个3.5音频口&#xff0c;配件有&#xff1a; 1个小档板&#xff0c;PCI-E2.0 X1&#xff0c;分辨率最高可以达到10…

机器学习模型评估之校准曲线

模型校准曲线&#xff08;Calibration Curve&#xff09;&#xff0c;也称为可靠性曲线&#xff08;Reliability Curve&#xff09;或概率校准曲线&#xff08;Probability Calibration Curve&#xff09;&#xff0c;是一种评估分类模型输出概率准确性的图形工具。它可以帮助我…

【python数据可视化】利用Python爬取天气数据并实现数据可视化,绘制天气轮播图

用Python爬虫抓取全年天气数据并绘制天气轮播图 一、运行结果&#xff1a; 二、代码展示&#xff1a; 由csv文件生成↓ 接下来是绘制天气轮播图 运行结果&#xff1a; 完整代码请看这里↓&#x1f447; 提醒制作这个项目你需要执行以下几个步骤&#xff1a; 确定数据源&#x…

OTN分层结构变成什么样了?

传统OTN的三层架构包括光传输段层&#xff08;OTS&#xff09;、光复用段层&#xff08;OMS&#xff09;和光通道层&#xff08;OCh&#xff09;&#xff0c;它们共同构成了OTN的三层结构。 其中&#xff1a; 光传输段层&#xff08;OTS&#xff09;&#xff1a;OTS是OTN中最高…

鸿蒙 Web组件的生命周期(api10、11、12)

概述 开发者可以使用Web组件加载本地或者在线网页。 Web组件提供了丰富的组件生命周期回调接口&#xff0c;通过这些回调接口&#xff0c;开发者可以感知Web组件的生命周期状态变化&#xff0c;进行相关的业务处理。 Web组件的状态主要包括&#xff1a;Controller绑定到Web组…

力扣SQL50 平均售价 ifnull SUM 连表查询

Problem: 1251. 平均售价 &#x1f468;‍&#x1f3eb; 参考题解&#xff08;题目数据增强&#xff0c;代码只能过90%的点&#xff09; &#x1f37b; AC code SELECT p.product_id, ROUND(ifnull(SUM(units * price) / SUM(units), 0),2) AS average_price FROM prices a…

初学51单片机之数字秒表

不同数据类型间的相互转换 在C语言中&#xff0c;不同数据类型之间是可以混合运算的。当表达式中的数据类型不一致时&#xff0c;首先转换为同一类型&#xff0c;然后再进行计算。C语言有两种方式实现类型转换。一是自动类型转换&#xff0c;另外一种是强制类型转换。 转换的主…