【深度学习实战(29)】后处理之NMS(非极大值抑制)

一、NMS工作原理

NMS 的工作原理:

  1. 置信度排序:对于每个类别,NMS 首先根据每个边界框的置信度(即预测框中含有目标的概率)进行排序。
  2. 选择最高置信度框:从置信度最高的边界框开始,将其作为当前考虑的“最大”候选。
  3. 计算交并比(IoU):计算当前最大候选与所有其他边界框的交并比(Intersection over Union)。IoU 是两个边界框交集面积与并集面积的比值,用于衡量边界框之间的重叠程度。
  4. 抑制重叠框:如果某个边界框与当前最大候选的 IoU 高于预设的阈值(例如,0.5),则认为它们检测到的是同一个目标,因此将该边界框从候选列表中移除。
  5. 更新候选列表:移除所有被抑制的边界框后,从剩余的边界框中选择置信度最高的作为新的“最大”候选。
  6. 迭代过程:重复步骤3-5,直到所有边界框都被处理完毕。

二、NMS C++代码实现

#include <vector>
#include <iostream>
#include <algorithm>

struct BBox 
{
	float x, y, w, h, conf;
	float getArea() const { return w* h; }
};


float iou(const BBox a, const BBox b)
{
	float area_a = a.getArea();
	float area_b = b.getArea();

	float x1 = std::max(a.x - a.w / 2, b.x - b.w / 2);
	float y1 = std::max(a.y - a.h / 2, b.y - b.h / 2);
	float x2 = std::min(a.x + a.w / 2, b.x + b.w / 2);
	float y2 = std::min(a.y + a.h / 2, b.y + b.h / 2);
	std::cout << "x1 = " << x1 << std::endl;
	std::cout << "y1 = " << y1 << std::endl;
	std::cout << "x2 = " << x2 << std::endl;
	std::cout << "y2 = " << y2 << std::endl;

	//有可能没有交集
	float area_jiao = std::max(0.f,(x2 - x1))*std::max(0.f,(y2 - y1));
	std::cout << "area_jiao = " << area_jiao << std::endl;


	//并集
	float area_bing = area_a + area_b - area_jiao;
	std::cout << "area_jiao / area_bing = " << area_jiao / area_bing << std::endl;

	float iou_ = area_jiao > 0 ? area_jiao / area_bing : 0;

	std::cout << "iou_ = " << iou_ << std::endl;


	return area_jiao > 0 ? area_jiao / area_bing : 0;

}


std::vector<BBox> nms(std::vector<BBox> &in_box, float thres)
{
	//按置信度排序
	std::sort(in_box.begin(), in_box.end(), [](const BBox & a, const BBox & b)
	{
		return a.conf < b.conf;
	});

	std::vector<BBox> results;
	for (size_t i = 0; i < in_box.size(); i++)
	{
		bool keep = true;
		for (size_t j = 0; j < results.size(); j++)
		{
			//如果当前BBox和results中BBox重叠度大于阈值,就抑制
			//否则,就放入results中
			if (iou(in_box[i], results[j]) > thres)
			{
				keep = false;
			}
			//抑制掉,就结束本次results遍历
			break;
		}

		if (keep)
		{
			results.push_back(in_box[i]);
		}
	}
	return results;
}

int main() {

	//设置一些BBox
	std::vector<BBox> boxes;
	boxes.push_back({ 100, 100, 50, 50, 0.9 });
	boxes.push_back({ 102, 101, 50, 50, 0.8 });
	boxes.push_back({ 98, 98, 50, 50, 0.7 });
	boxes.push_back({ 102, 98, 50, 50, 0.85 });

	//nms
	float thres = 0.82;
	std::vector<BBox> ret = nms(boxes, thres);

	//输出
	for (size_t i = 0; i < ret.size(); i++)
	{
		std::cout << "x=" << ret[i].x << "y=" << ret[i].y << "w=" << ret[i].w << "h=" << ret[i].h << "conf=" << ret[i].conf << std::endl;
	}

	system("pause");
	return 0;

}

run
在这里插入图片描述

三、soft NMS介绍

当物体密集时,传统NMS方法可能会错误地移除一些正确的检测框。而Soft-NMS考虑了所有可能的检测框,因此可以更准确地处理这种情况。soft-nms的核心就是降低置信度。比如一张人脸上有3个重叠的bounding box, 置信度分别为0.9, 0.7, 0.85 。选择得分最高的建议框,经过第一次处理过后,得分变成了0.9, 065, 0.55(此时将得分最高的保存在D中)。这时候再选择第二个bounding box作为得分最高的,处理后置信度分别为0.65, 0.45(这时候3个框也都还在),最后选择第三个,处理后得分不改变。最终经过soft-nms抑制后的三个框的置信度分别为0.9, 0.65, 0.45。最后设置阈值,将得分si小于阈值的去掉。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

# 从浅入深 学习 SpringCloud 微服务架构(七)Hystrix(2)

从浅入深 学习 SpringCloud 微服务架构&#xff08;七&#xff09;Hystrix&#xff08;2&#xff09; 一、Hystrix&#xff1a;基于 RestTemplate 的统一降级配置 1、Hystrix&#xff1a;基于 RestTemplate 的统一降级配置 步骤&#xff1a; 1&#xff09;在项目的 pom.xml …

前端 CSS

目录 选择器 复合选择器 伪类-超链接 结构伪装选择器 伪元素选择器 画盒子 字体属性 CSS三大属性 Emmet写法 背景属性 显示模式 盒子模型 盒子模型-组成 盒子模型-向外溢出 盒子模型-圆角 盒子模型-阴影 flex position定位 CSS小精灵 字体图标 垂直对齐方式…

《R语言与农业数据统计分析及建模》学习——logistic回归和poisson回归

普通线性回归通常用来描述变量y与x之间的线性关系&#xff1a; 普通线性模型的假设是&#xff1a;响应变量y是连续型变量而且&#xff0c;服从正态分布分布。但在很多现实情况y并不是正态分布&#xff0c;如&#xff1a;二值问题/多分类问题&#xff0c;计次问题等&#xff0c;…

防火墙远程桌面端口号修改,如何用防火箱修改远程桌面的端口号

在网络安全日益重要的今天&#xff0c;修改远程桌面服务的默认端口号已成为提高系统安全性的重要手段。通过修改端口号&#xff0c;可以有效防止潜在的恶意攻击者通过扫描常见端口来发现并利用系统的漏洞。本文将详细介绍如何在Windows系统中修改远程桌面服务的端口号&#xff…

2024 五一杯高校数学建模邀请赛(C题)| 煤矿深部开采冲击地压危险预测 |建模秘籍文章代码思路大全

铛铛&#xff01;小秘籍来咯&#xff01; 小秘籍团队独辟蹊径&#xff0c;构建了这一题的详细解答哦&#xff01; 为大家量身打造创新解决方案。小秘籍团队&#xff0c;始终引领着建模问题求解的风潮。 抓紧小秘籍&#xff0c;我们出发吧~ 让我们看看五一杯的C题&#xff01; 完…

动静态库(完结版)

文章目录 接上篇完成blog第三方库安装演示动态库加载原理一二三四 接上篇完成blog 上篇链接 第三方库安装演示 sudo yum install -y ncurses-devel下载完成之后 在系统目录下面一定能找到对应的头文件和库文件 此时使用第三方库: 编译之后按错误提示是对应的函数找不到,所以链…

C语言 | Leetcode C语言题解之第60题排列序列

题目&#xff1a; 题解&#xff1a; char* getPermutation(int n, int k) {int factorial[n];factorial[0] 1;for (int i 1; i < n; i) {factorial[i] factorial[i - 1] * i;}--k;char* ans malloc(n 1);ans[n] \0;int valid[n 1];for (int i 0; i < n; i) {val…

“云卷数潮”云原生数据库分论坛亮点回顾!

4月29日&#xff0c;2024中国移动算力网络大会“云卷数潮”云原生数据库分论坛在江苏苏州举行。本次论坛不仅是技术交流的盛宴&#xff0c;更是行业发展趋势的风向标。论坛汇聚了众多企业领袖、专家学者及行业精英&#xff0c;共话云原生数据库技术发展&#xff0c;探讨行业最新…

git 配置相关

问题一&#xff1a;ssh-keygen -t ed25519 -C "Gitee SSH Key" 这个命令中的 ed25519 字符是什么意思&#xff1f; ssh-keygen 是一个用于生成SSH密钥的工具&#xff0c;SSH&#xff08;Secure Shell&#xff09;是一种网络协议&#xff0c;用于加密方式远程登录和其…

数据库(MySQL)—— DML语句

数据库&#xff08;MySQL&#xff09;—— DML语句 什么是DML语句添加数据给全部字段添加数据批量添加数据 修改数据删除数据 什么是DML语句 在MySQL中&#xff0c;DML&#xff08;Data Manipulation Language&#xff0c;数据操纵语言&#xff09;语句主要用于对数据库中的数…

http的basic 认证方式

写在前面 本文看下http的basic auth认证方式。 1&#xff1a;什么是basic auth认证 basic auth是一种http协议规范中的一种认证方式&#xff0c;即一种证明你就是你的方式。更进一步的它是一种规范&#xff0c;这种规范是这样子&#xff0c;如果是服务端使用了basic auth认证…

java:EasyExcel使用(一)读excel

java&#xff1a;EasyExcel使用&#xff08;一&#xff09;读excel 1 前言 EasyExcel相比于传统使用poi进行excel文件读写&#xff0c;编程使用操作上更加方便快捷&#xff0c;且对于内存溢出进行了优化处理。本文是EasyExcel读excel操作。 Java解析、生成Excel比较有名的框…

24.什么是跨域?解决方案有哪些?

为什么会出现跨域问题 存在浏览器同源策略&#xff0c;所以才会有跨域问题。那么浏览器是出于何种原因会有跨域的限制呢。其实不难想到&#xff0c;跨域限制主要的目的就是为了用户的上网安全。 同源策略导致的跨域是浏览器单方面拒绝响应数据&#xff0c;服务器端是处理完毕…

【C++】学习笔记——string_3

文章目录 六、string类5. string类的操作6. string类的转换7. string类的模拟实现 未完待续 搭配文档食用 六、string类 5. string类的操作 上面的函数中&#xff0c;有些是不常用的&#xff0c;咱们只挑几个重要的进行讲解。 c_str 就是将字符串转换成 C语言 字符串的格式。…

(附源码)超级简单的SSM图书交易系统,包含技术栈、架构图、设计图、教程

先看首页效果&#xff0c;包含买家、卖家、管理员三个端口。启动有问题可以联系我解决&#xff0c;微信&#xff1a;keepgoing4u 架构图&#xff1a; 用到软件 Jdk1.8 Mysql IntelliJ IDEA Maven 项目技术&#xff1a; Spring Boot SSM JSP mybatis Maven B/S模式 配置…

区块链技术:DAPP开发

随着科技的飞速发展&#xff0c;区块链技术逐渐渗透到各个领域&#xff0c;其中DAPP&#xff08;去中心化应用&#xff09;的发展尤为引人注目。作为一种新型的应用程序&#xff0c;DAPP正在重塑未来商业生态&#xff0c;其潜力无可估量。 一、DAPP的定义和特点 DAPP是指基于…

CSS高级选择器

一、属性选择器 以value开头的att属性的E元素&#xff1a;E[att^"value"]{ ;} a[href^http]{background-color"red";} css a[href^http]{background-color"red"; } html <!DOCTYPE html> <html lang"en"> <head&…

运营版游戏陪玩平台源码/tt语音聊天/声优服务/陪玩系统源码开黑/约玩源码

简述 一个人的游戏叫孤独&#xff0c;一群人的游戏才是乐趣&#xff0c;随着电竞产业在国内的快速发展&#xff0c;游戏陪练行业也迅速成长&#xff0c;现在很多游戏玩家为了追求更高质量的游戏体验感&#xff0c;往往会在玩游戏的过程中找陪练&#xff0c;通过陪玩系统进行预…

前端开发工程师——Vue

Vue学习笔记&#xff08;尚硅谷天禹老师&#xff09;_尚硅谷天禹老师vue2021讲课笔记下载-CSDN博客 模板语法 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" co…

Springboot+Vue+小程序+基于微信小程序电影票网购系统

Java电影票购买管理系统&#xff0c;Maven管理工具&#xff0c;MyBatis数据库操作&#xff0c;idea平台开发&#xff0c;后台的前端为Vue&#xff0c;前台客户端为小程序&#xff0c;功能丰富&#xff0c;还有电影周边购买功能&#xff0c;请在最下方二维码处联系我即可&#x…