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

C++手写NMS

文章目录

  • 前言
  • 一、NMS是什么?
  • 二、代码展示
  • 三、代码实现思路
  • 总结


前言

目标检测模型推理后,一般都需要进行NMS操作进行多余框去重,板端部署一般不用opencv自带的NMS,所以记录下手写NMS的代码。


一、NMS是什么?

非极大值抑制(Non-Maximum Suppression,NMS)算法,用于在一组边界框(BoundingBoxes)中去除高度重叠的边界框,只保留最具代表性的一个。

二、代码展示

#include <iostream>
#include <vector>
#include <algorithm>// 边界框结构
struct BoundingBox {float x, y, w, h, confidence;// 计算边界框的面积float area() const {return w * h;}
};// 计算两个边界框之间的IoU
float iou(const BoundingBox& a, const BoundingBox& b) {const float area_a = a.area();const float area_b = b.area();// 计算重叠区域的坐标范围const float x1 = std::max(a.x, b.x);const float y1 = std::max(a.y, b.y);const float x2 = std::min(a.x + a.w, b.x + b.w);const float y2 = std::min(a.y + a.h, b.y + b.h);// 计算重叠区域的面积const float intersection_area = std::max(0.0f, x2 - x1) * std::max(0.0f, y2 - y1);// 计算并集区域的面积const float union_area = area_a + area_b - intersection_area;// 计算IoUreturn union_area > 0 ? intersection_area / union_area : 0;
}// 非极大值抑制函数
std::vector<BoundingBox> nms(std::vector<BoundingBox>& boxes, float threshold) {// 根据置信度排序std::sort(boxes.begin(), boxes.end(),[](const BoundingBox& a, const BoundingBox& b) { return a.confidence > b.confidence; });std::vector<BoundingBox> result;for (size_t i = 0; i < boxes.size(); ++i) {bool keep = true;for (size_t j = 0; j < result.size(); ++j) {if (iou(boxes[i], result[j]) > threshold) {keep = false;break;}}if (keep) {result.push_back(boxes[i]);}}return result;
}int main() {std::vector<BoundingBox> boxes;// 添加一些示例边界框数据boxes.push_back({10, 10, 20, 20, 0.9});boxes.push_back({15, 15, 25, 25, 0.8});boxes.push_back({30, 30, 20, 20, 0.7});boxes.push_back({40, 40, 15, 15, 0.85});// 运行非极大值抑制算法,保留不重叠的边界框float threshold = 0.5;std::vector<BoundingBox> result = nms(boxes, threshold);// 输出保留下来的边界框std::cout << "保留的边界框:" << std::endl;for (const BoundingBox& box : result) {std::cout << "x: " << box.x << ", y: " << box.y << ", w: " << box.w << ", h: " << box.h << ", confidence: " << box.confidence << std::endl;}return 0;
}

三、代码实现思路

iou(const BoundingBox& a, const BoundingBox& b): 这个函数计算两个边界框a和b之间的交并比(IoU,Intersection over Union)。它首先计算每个边界框的面积,然后计算它们的交集区域的坐标范围和面积。最后,它将交集区域的面积除以并集区域的面积,得到IoU值,即重叠度。

nms(std::vector<BoundingBox>& boxes, float threshold): 这个函数实现了非极大值抑制算法。它接受一个包含边界框的向量 boxes 和一个阈值 threshold 作为参数。首先,它按照边界框的置信度(confidence)对边界框进行降序排序,以便首先处理置信度最高的边界框。

然后,它遍历每个边界框,并检查它是否应该被保留。对于每个边界框,它将其与已经被保留的边界框进行比较,计算它们之间的IoU。如果IoU大于阈值 threshold,则说明两个边界框高度重叠,当前边界框不被保留;否则,当前边界框被保留。

最终,函数返回一个向量 result,其中包含经过非极大值抑制后被保留下来的边界框。


总结

NMS通常用于目标检测中,以去除重叠的检测结果,只保留最具代表性的结果,以提高检测的准确性。
如果阅读本文对你有用,欢迎点赞收藏呀!!!
2023年9月27日15:58:10
在这里插入图片描述

相关文章:

C++手写NMS

文章目录 前言一、NMS是什么&#xff1f;二、代码展示三、代码实现思路总结 前言 目标检测模型推理后&#xff0c;一般都需要进行NMS操作进行多余框去重&#xff0c;板端部署一般不用opencv自带的NMS&#xff0c;所以记录下手写NMS的代码。 一、NMS是什么&#xff1f; 非极大…...

第9讲:VUE中监听器WATCH使用详解

目录 监听器介绍 监听普通属性 监听对象属性 监听路由属性监听器watch 监听器:它是侦听属性值或者计算属性的变化,一旦发生变化可以在函数中进行相应的操作,从而达到change事件监听的效果!监听器是一个对象,以 key-value 的形式表示。key 是需要监听的表达式,value 是对…...

微信小程序开发基础(一)认识小程序

微信小程序&#xff0c;小程序的一种&#xff0c;英文名Wechat Mini Program&#xff0c;是一种不需要下载安装即可使用的应用&#xff0c;它实现了应用“触手可及”的梦想&#xff0c;用户扫一扫或搜一下即可打开应用。微信小程序是一种不用下载就能使用的应用&#xff0c;也是…...

LeetCode 1049. 最后一块石头的重量 II

1049. 最后一块石头的重量 II - 力扣&#xff08;LeetCode&#xff09; 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&am…...

Golang中的类型转换介绍

Golang中存在4种类型转换&#xff0c;分别是&#xff1a;断言、显式、隐式、强制。下面我将一一介绍每种转换使用场景和方法 一、断言类型转换 主要是判断变量是否可以转换成某一类型。断言主要用于变量是interface{}类型&#xff08;接口类型&#xff09;的情况&#xff0c;…...

本人碰到的RN项目的坑

1.路径问题 路径不能含有中文 2.下载jar\aar包超时问题 手动下载:任意位置新建个文件夹,然后点击超时的jar包链接跳转到浏览器后下载到这个文件夹内,返回报错的地方找到报错的包名(com或者org开头的),然后去这个路径下找到对应的包名 C:\Users\22560\.gradle\caches\module…...

EcmaScript标准-导入与导出-js

ECMAScript是一种由Ecma国际&#xff08;前身为欧洲计算机制造商协会&#xff0c;European Computer Manufacturers Association&#xff09;通过ECMA-262标准化的脚本程序设计语言。这种语言在万维网上应用广泛&#xff0c;它往往被称为JavaScript或JScript&#xff0c;所以它…...

如何将matlab中的mat矩阵文件在python中读取出来

先安装hdf5storage这个包 pip3 install hdf5storage 然后在当前目录下放入要读取的mat文件 # 将matlab中的mat文件读取出来 import hdf5storagedata hdf5storage.loadmat(inputWeights.mat) print(data[inputWeights])...

解释C语言中 6.18f (浮点数常量后缀)

在C语言中&#xff0c;例如6.18f &#xff0c;这是一个浮点数常量。 6.18 是一个浮点数&#xff0c;而后缀 f 表示该浮点数是单精度浮点数。 在C语言中&#xff0c;默认的浮点数常量类型是双精度浮点数&#xff0c;如果希望使用单精度浮点数&#xff0c;可以在常量后面加上 f…...

Pandas 2.1中的新改进和新功能

大家好&#xff0c;Pandas 2.1于2023年8月30日发布&#xff0c;跟随本文一起看看这个版本引入了哪些新内容&#xff0c;以及它如何帮助用户改进Pandas的工作负载&#xff0c;包含了一系列改进和一组新的弃用功能。 Pandas 2.1在Pandas 2.0中引入的PyArrow集成基础上进行了大量…...

c#static(静态)关键字

在C#中&#xff0c;static关键字有多种用途&#xff0c;可以用于声明静态成员、静态类和静态方法。 静态成员&#xff1a;使用static关键字声明的成员属于类&#xff0c;而不是类的实例。静态成员在类第一次被使用之前就被初始化&#xff0c;且只有一个副本存在于内存中&#x…...

GitHub配置SSH key

GitHub配置SSH key Git配置信息并生成密钥 设置用户名和密码 设置用户名 git config --global user.name "用户名" 设置邮箱 git confir --global user.email "邮箱" 生成密钥 ssh-keygen -t rsa -C "邮箱" 查看密钥 到密钥所保存的位置 复…...

文件审计及文件完整性监控

什么是文件审核 对文件服务器中发生的所有事件的检查称为文件审核。这包括监视文件访问&#xff0c;其中包含谁访问了什么文件、何时以及从何处访问的详细信息;对访问最多和修改的文件的分析;成功和失败的文件访问尝试;等等。文件服务器审核过程的主要目标是跟踪在配置的服务器…...

华为智能企业远程办公安全解决方案(1)

华为智能企业远程办公安全解决方案&#xff08;1&#xff09; 课程地址方案背景需求分析企业远程办公业务概述企业远程办公安全风险分析企业远程办公环境搭建需求分析 方案设计组网架构设备选型方案亮点 课程地址 本方案相关课程资源已在华为O3社区发布&#xff0c;可按照以下…...

k8s中常用命令总结

文章目录 进入pod容器的命令pod中只有1个用户容器pod中只有2个&#xff08;含&#xff09;以上用户容器 yaml中的字段不清楚后面跟什么&#xff0c;通过explain来查看查看pod内指定容器的日志Pod内各个容器的服务端口不能相同资源对象的创建方式一方式二 查看pod的详细信息查看…...

Logistic map混沌掩盖信号

开学接触了一些有关混沌知识的学习&#xff0c;阅读量一些混沌通信的论文&#xff0c;对于混沌掩盖信号以确保加密通信有一定的兴趣。混沌的产生我选用的是logistic map映射产生混沌&#xff0c;主要就是一个递推公式&#xff1a; 对于这样一个式子&#xff0c;可以看出&#x…...

外包干了2个月,技术有明显退步...

先说一下自己的情况&#xff0c;本科生&#xff0c;18年通过校招进入广州某软件公司&#xff0c;干了接近3年的功能测试&#xff0c;今年国庆&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!可我已经在一个企业干了3年的功能测试&…...

顺序表和链表

顺序表和链表 一.线性表二.顺序表三.链表链表的分类单链表的实现双链表的实现 四.顺序表和链表的区别和联系 一.线性表 常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串 线性表在逻辑上是线性结构&#xff0c;也就说是连续的一条直线&#xff0c;但是在物理结构上并不…...

k8s--架构基础--云控制器管理器

具体来说&#xff0c;云控制器管理器允许用户将集群与云服务提供商的 API 进行连接&#xff0c;以获取与云平台相关的信息和资源。通过这种连接&#xff0c;Kubernetes 可以利用云服务提供商的功能和特性&#xff0c;例如虚拟机、负载均衡器、对象存储等。与此同时&#xff0c;…...

OpenAI 更新 ChatGPT:支持图片和语音输入【附点评】

一、消息正文 9月25日消息,近日OpenAI宣布其对话AI系统ChatGPT进行升级,添加了语音输入和图像处理两个新功能。据OpenAI透露,这些新功能将在未来两周内面向ChatGPT Plus付费用户推出,免费用户也将很快可以使用这些新功能。这标志着ChatGPT继续朝着多模态交互的方向发展,为用户提…...

数据结构:堆的简单介绍

目录 堆的介绍:(PriorityQueue) 大根堆:根节点比左右孩子节点大 小根堆:根节点比左右孩子节点小 堆的存储结构: 为什么二叉树在逻辑上用满二叉树结构,而不是普通二叉树呢? 因为如果是普通二叉树会造成资源的浪费​编辑 堆的介绍:(PriorityQueue) 堆又称优先级队列,何为优先…...

【LeetCode-中等题】654.最大二叉树

文章目录 题目方法一&#xff1a;递归 题目 方法一&#xff1a;递归 class Solution {int[] num null; public TreeNode constructMaximumBinaryTree(int[] nums) {num nums;return myTree(0,num.length-1);}public TreeNode myTree( int begin , int end){if(begin > end…...

基于微信小程序的刷题考试系统设计与实现(适用于各类考试类、答题类程序)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…...

用Java打印长方形、平行四边形 、三角形、菱形、空心菱形

今天复习使用嵌套for来完成一些任务&#xff0c;于是想着打印一些图形来练习 思考感悟 长方形 行数 和 每行的星星数嵌套遍历即可 平行四边形 核心&#xff1a;每行空格数总行数-行数 行数空格数132231 三角形 核心&#xff1a;每行星星数2*当前行数-1 行数星星数1123…...

es6模块化,怎么判断当前文件使用的是es6的模块化还是commenjs的模块化

es6的模块化&#xff0c;文件中的this,指向undefined,不是指向window import.meta - JavaScript | MDN...

Ubuntu 基础配置

源配置 源路径&#xff1a; /etc/apt/sources.list aliyun源 20.04 deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse deb http://mirrors.a…...

CISSP学习笔记:人员安全和风险管理概念

第二章 人员安全和风险管理概念 2.1 促进人员安全策略 职责分离: 把关键的、重要的和敏感工作任务分配给若干不同的管理员或高级执行者&#xff0c;防止共谋工作职责:最小特权原则岗位轮换:提供知识冗余&#xff0c;减少伪造、数据更改、偷窃、阴谋破坏和信息滥用的风险&…...

ubuntu18.04 OpenGL开发(显示YUV)

源码参考&#xff1a;https://download.csdn.net/download/weixin_55163060/88382816 安装opengl库 sudo apt install libglu1-mesa-dev freeglut3-dev mesa-common-dev 安装opengl工具包 sudo apt install mesa-utils 检查opengl版本信息&#xff08;桌面终端执行&#xff09…...

React(react18)中组件通信06——redux-toolkit + react-redux

React&#xff08;react18&#xff09;中组件通信06——redux-toolkit react-redux 1 前言1.1 redux 和 react-redux1.2 关于redux-toolkit1.2.1 官网1.2.2 为什么要用Redux Toolkit&#xff1f; 1.3 安装 Redux Toolkit1.4 Redux Toolkit相关API 2. 开始例子——官网例子2.1 …...

第七章 查找 九、B+树

目录 一、定义 二、B树需要满足的条件 三、重要考点 一、定义 1、B树是一种常用的数据结构&#xff0c;用于实现关系型数据库中的索引。 2、其特点是可以在磁盘等外存储器上高效地存储大量数据&#xff0c;并支持快速的查询、插入、删除等操作。 3、B树的结构类似于二叉搜…...

网站根目录 设置/首页关键词优化价格

分享一个大牛的人工智能教程。零基础&#xff01;通俗易懂&#xff01;风趣幽默&#xff01;希望你也加入到人工智能的队伍中来&#xff01;请点击http://www.captainbed.net 两个对象&#xff0c;一个是静态区的“xyz”&#xff0c;一个是用new创建在堆上的对象。...

建设手机网站/百度客户端官网

相信钓鱼邮件对于邮件管理员都不陌生&#xff0c;诸如此类那么怎么才能杜绝此类邮件呢&#xff1f;这里简单新建一条规则命名为 钓鱼邮件&#xff0c; 只要是包含 “升”“邮”“箱”“配”“额”这几个字的&#xff0c;统统重定向给管理员&#xff0c;并追加 Cheat Mail &…...

什么叫做门户网站/网络科技

1、按顺序安装如下包&#xff1a;中文支持fonts-chinese-3.02-12.el5.noarch.rpmm17n-db-common-cjk-1.3.3-46.el5.noarch.rpmm17n-db-chinese-1.3.3-46.el5.noarch.rpm中文输入法scim-libs-1.4.4-39.el5.i386.rpmscim-1.4.4-39.el5.i386.rpmscim-chinese-standard-0.0.2-1.el5…...

长沙建网站设计/做销售记住这十句口诀

2019独角兽企业重金招聘Python工程师标准>>> package com.dir;/**编号1,2, ... n个人围坐一圈&#xff0c;约定编号为k(1<k<n)的人从1开始报数&#xff0c;数到m的那个人出列&#xff0c;它的下一个人从1依次报数&#xff0c;数到m的人又出列&#xff0c;直到…...

杭州投资公司自适应网站/dw网页制作教程

SpringBoot入门一 推荐&#xff1a; Spring Boot系列文章Spring Boot基础教程Spring Boot参考指南springboottutorial 项目属性配置 参考&#xff1a; Spring Boot属性配置文件详解 可以使用properties文件&#xff0c;YAML文件配置。YAML文件相对来说更简洁一点。 如下…...

网站开发会议议程范文/营销传播服务

设计稿尽量提供偶数切图之前预先定义好标准(常用标签的样式,公用样式)上下文元素之间尽量保持同级更新不频繁的使用背景图片(logo)先做需求确定部分内容(头/尾部)设置颜色尽量不使用英文,使用色码时多用3位,少用6位转载于:https://blog.51cto.com/suyanzhu/1878191...