春招面试准备笔记——NMS(非极大值抑制)算法

NMS(非极大值抑制)算法非极大值抑制是用于减少物体检测算法中重叠边界框或区域的数量的技术。通过对每个类别的检测框按置信度排序,然后逐个遍历,保留置信度最高的框,并抑制与其重叠且置信度低的框,从而得到更准确和简洁的检测结果。

算法流程(举例说明)

假设我们使用一个人脸检测算法来识别一张图像中的多个人脸。该算法可能会在图像中产生多个边界框,每个边界框对应一个被检测到的人脸。然而,算法可能会产生多个重叠的边界框,每个边界框都对应同一个人脸。

在这种情况下,我们可以应用非极大值抑制来减少重叠边界框的数量,以确保最终的检测结果准确而简洁。具体步骤如下:

1、对于每个检测到的人脸边界框,计算其置信度(例如,检测得分)。

2、根据置信度对所有边界框进行排序,将置信度最高的边界框作为起始点。

3、从置信度第二高的边界框开始,逐个遍历每个边界框。

4、对于当前正在考虑的边界框,计算其与前面已选定的边界框的重叠程度(例如,使用交并比IoU)。

5、如果当前边界框与已选定的边界框重叠程度高于预设的阈值,则将其抑制(即不保留);否则保留当前边界框。

6、重复上述步骤,直到所有边界框都被处理完毕。

通过这个过程,最终每个人脸只会被保留一个最具代表性的边界框,从而避免了多个重叠边界框的情况,得到了准确而简洁的人脸检测结果。

代码实验

draw_bbox.py

在图像上绘制边界框及其置信度

import cv2

def draw_box(img, bbox, confidence=None, offset=(0, 0)):
    """
    绘制图像上的一个边界框

    :param img: 待绘制的图像
    :param bbox: 边界框坐标,必须是(xmin, ymin, xmax, ymax)的格式
    :param confidence: 边界框的置信度
    :param offset: 偏移量,用于调整绘制的边界框位置
    :return: 绘制了边界框的图像
    """
    # 将bbox转换为整数类型
    x1, y1, x2, y2 = [int(i) for i in bbox]
    
    # 根据偏移量调整边界框的位置
    x1 += offset[0]
    x2 += offset[0]
    y1 += offset[1]
    y2 += offset[1]
    
    # 边界框的颜色和置信度文本
    color = 0.5  # 边界框颜色
    label = str(confidence)  # 置信度文本
    
    # 获取文本大小
    t_size = cv2.getTextSize(label, cv2.FONT_HERSHEY_PLAIN, 1, 2)[0]
    
    # 绘制边界框
    cv2.rectangle(img, (x1, y1), (x2, y2), color, 3)  # 绘制边界框
    cv2.rectangle(img, (x1, y1), (x1 + t_size[0] + 3, y1 + t_size[1] + 4), color, -1)  # 绘制文本背景
    cv2.putText(img, label, (x1, y1 + t_size[1] + 4), cv2.FONT_HERSHEY_PLAIN, 2, [255, 255, 255], 2)  # 绘制置信度文本
    
    return img

nms.py

实现了非极大值抑制(NMS)算法,用于在目标检测任务中去除重叠的边界框

import numpy as np
import cv2

from draw_bbox import draw_box  # 导入绘制边界框的函数

def nms(bboxes, scores, iou_thresh):
    """
    非极大值抑制(NMS)算法,用于去除重叠的边界框

    :param bboxes: 边界框列表,每个边界框格式为[xmin, ymin, xmax, ymax]
    :param scores: 边界框对应的置信度列表
    :param iou_thresh: IOU(交并比)阈值,用于判断两个边界框是否重叠
    :return: 经过NMS处理后的边界框和置信度列表
    """
    # 将边界框坐标拆分为四个坐标列表
    x1 = bboxes[:, 0]
    y1 = bboxes[:, 1]
    x2 = bboxes[:, 2]
    y2 = bboxes[:, 3]
    areas = (y2 - y1) * (x2 - x1)  # 计算每个边界框的面积

    # 结果列表
    result = []
    index = scores.argsort()[::-1]  # 对置信度进行从高到低的排序,并获取对应的索引

    # 循环处理边界框,直至列表为空
    while index.size > 0:
        i = index[0]  # 取出当前置信度最高的边界框
        result.append(i)  # 将当前边界框的索引加入结果列表

        # 计算当前边界框与其他边界框的IOU
        x11 = np.maximum(x1[i], x1[index[1:]])
        y11 = np.maximum(y1[i], y1[index[1:]])
        x22 = np.minimum(x2[i], x2[index[1:]])
        y22 = np.minimum(y2[i], y2[index[1:]])
        w = np.maximum(0, x22 - x11 + 1)
        h = np.maximum(0, y22 - y11 + 1)
        overlaps = w * h
        ious = overlaps / (areas[i] + areas[index[1:]] - overlaps)

        # 仅保留IOU低于阈值的边界框索引
        idx = np.where(ious <= iou_thresh)[0]
        index = index[idx + 1]  # 更新剩余边界框的索引列表

    # 返回经过NMS处理后的边界框和置信度
    return bboxes[result], scores[result]


if __name__ == '__main__':
    # 读取原始图像
    raw_img = cv2.imread('./test.png')
    
    # 原始的边界框和置信度
    bboxes = [[183, 625, 269, 865], [197, 603, 296, 853], [190, 579, 295, 864], [537, 507, 618, 713], [535, 523, 606, 687]]
    confidences = [0.7, 0.9, 0.95, 0.9, 0.6]
    
    # 绘制未经过NMS处理的原始检测结果
    img = raw_img.copy()
    for x, y in zip(bboxes, confidences):
        img = draw_box(img, x, y)
    cv2.imwrite("./org_test.png", img)  # 保存结果图像
    
    # 进行NMS处理
    bboxes, scores = nms(np.array(bboxes), np.array(confidences), 0.5)
    
    # 绘制经过NMS处理后的检测结果
    img = raw_img.copy()
    for x, y in zip(list(bboxes), list(scores)):
        img = draw_box(img, x, y)
    cv2.imwrite("./nms_test.png", img)  # 保存结果图像

实验结果

测试图片

未使用nms算法

使用nms算法

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

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

相关文章

Apache Httpd 常见漏洞解析(全)

一、Apache HTTPD 换行解析漏洞 漏洞编号&#xff1a;CVE-2017-15715 Apache HTTPD是一款HTTP服务器&#xff0c;它可以通过mod_php来运行PHP网页。 其2.4.0~2.4.29版本中存在一个解析漏洞。 在解析PHP时&#xff0c;1.php\x0A将被按照PHP后缀进行解析&#xff0c;导致绕过…

桌面备忘录怎么设置,怎么在电脑上设置提醒?

桌面备忘录怎么设置&#xff0c;怎么在电脑上设置提醒&#xff1f;如今&#xff0c;为了优质生活的需要&#xff0c;我们每天都会处理很多的事情&#xff0c;比如&#xff1a;网课时间、工作任务、生活琐事……有时候&#xff0c;真恨不得自己有个三头六臂&#xff0c;好把这一…

前端|JavaScript 基础 - 第2天(黑马笔记)

JavaScript 基础 - 第2天 目录 JavaScript 基础 - 第2天一、运算符1.算术运算符2.赋值运算符3.自增/自减运算符4.比较运算符5.逻辑运算符6.运算符优先级 二、语句1.表达式和语句2.分支语句if 分支语句if双分支语句if 多分支语句三元运算符&#xff08;三元表达式&#xff09;sw…

分治算法总结(Java)

目录 分治算法概述 快速排序 练习1&#xff1a;排序数组 练习2&#xff1a;数组中的第K个最大元素 练习3&#xff1a;最小k个数 归并排序 练习4&#xff1a;排序数组 练习5&#xff1a;交易逆序对的总数 练习6&#xff1a;计算右侧小于当前元素的个数 练习7&#xff1…

视频推拉流EasyDSS视频直播点播平台授权出现激活码无效并报错400是什么原因?

视频推拉流EasyDSS视频直播点播平台集视频直播、点播、转码、管理、录像、检索、时移回看等功能于一体&#xff0c;可提供音视频采集、视频推拉流、播放H.265编码视频、存储、分发等视频能力服务&#xff0c;在应用场景上&#xff0c;平台可以运用在互联网教育、在线课堂、游戏…

Project_Euler-06 题解

Project_Euler-06 题解 题目描述 两个公式 等差数列求和公式 i i i项&#xff1a; a i a_{i} ai​ 项数&#xff1a; n n n 公差&#xff1a; d d d 和&#xff1a; S n S_{n} Sn​ a n a 1 ( n − 1 ) d S n n ( a 1 a n ) 2 a_{n} a_{1} (n - 1)d\\ S_{n} \frac{n(a_…

在哪些领域中最需要使用 OCR 识别技术?真实场景介绍

根据我们的项目经验总结来说&#xff0c;OCR&#xff08;光学字符识别&#xff09;技术在多个领域中扮演着至关重要的角色&#xff0c;它能够将图像中的文本内容转换为机器可读的格式&#xff0c;极大地提高了数据处理的效率和准确性。以下是一些主要领域及其对应的应用场景和用…

ubuntu22.04@laptop OpenCV Get Started: 012_mouse_and_trackbar

ubuntu22.04laptop OpenCV Get Started: 012_mouse_and_trackbar 1. 源由2. mouse/trackbar应用Demo2.1 C应用Demo2.2 Python应用Demo 3. 鼠标位置跟踪注释3.1 注册回调函数3.2 回调操作3.3 效果 4. 使用轨迹栏调整图像大小4.1 初始化轨迹栏&注册回调函数4.2 回调操作4.3 效…

每期十万,等你来战|AI原生应用开发挑战赛首期精彩回顾

随着大模型技术的飞速发展&#xff0c;2024年将会成为AI原生应用爆发的元年&#xff0c;引领千行百业的创新变革。在这一时代背景下&#xff0c;百度智能云重磅推出千帆杯AI原生应用开发挑战赛&#xff0c;旨在激发广大开发者的创意潜能&#xff0c;推动AI原生应用在中国市场的…

16:00面试,16:09就出来了 ,问的实在是太...

从外包出来&#xff0c;没想到算法死在另一家厂子 自从加入这家公司&#xff0c;每天都在加班&#xff0c;钱倒是给的不少&#xff0c;所以也就忍了。没想到8月一纸通知&#xff0c;所有人不许加班&#xff0c;薪资直降30%&#xff0c;顿时有吃不起饭的赶脚。 好在有个兄弟内…

STM32 TIM2重映射

STM32定时器 文章目录 STM32定时器[TOC](文章目录) 前言一、问题分析二、代码 前言 最近想弄一个多路输出PWM&#xff0c;但是发现TIM2不能用&#xff0c;根据手册也对它进行重映射了&#xff0c;但是还是不能用&#xff0c;用示波器发现驱动能力比较弱&#xff0c;然后禁用jt…

羊大师讲解,羊奶奶源是如何影响羊奶品质的呢?

羊大师讲解&#xff0c;羊奶奶源是如何影响羊奶品质的呢&#xff1f; 1.营养成分和口感&#xff1a;由于奶源地的不同&#xff0c;土壤、气候和牧草种类等自然条件的差异会导致羊奶的营养成分和口感有所差异。高品质的奶源地能够提供丰富的营养和优质的牧草&#xff0c;因此羊…

wo-gradient-card是一款采用uniapp实现的透明辉光动画卡片

采用uniapp-vue3实现&#xff0c;透明辉光动画卡片&#xff0c;卡片内容包含标签、标题、副标题、图片 支持H5、微信小程序&#xff08;其他小程序未测试过&#xff0c;可自行尝试&#xff09; 可用于参考学习 可到插件市场下载尝试&#xff1a; https://ext.dcloud.net.cn/plu…

刷LeetCode541引起的java数组和字符串的转换问题

起因是今天在刷下面这个力扣题时的一个报错 541. 反转字符串 II - 力扣&#xff08;LeetCode&#xff09; 这个题目本身是比较简单的&#xff0c;所以就不讲具体思路了。问题出在最后方法的返回值处&#xff0c;要将字符数组转化为字符串&#xff0c;第一次写的时候也没思考直…

VIO第3讲:基于优化的IMU与视觉信息融合之IMU预积分

VIO第3讲&#xff1a;基于优化的IMU与视觉信息融合之IMU预积分 文章目录 VIO第3讲&#xff1a;基于优化的IMU与视觉信息融合之IMU预积分1 IMU预积分1.1 IMU常规积分—连续时间—不适用1.2 预积分形式① 定义② 如何推导出预积分定义③ 用预积分表达IMU积分公式④ 预积分误差&am…

APP要做哪些测试?APP测试要注意哪些问题?

APP要做哪些测试&#xff1f;APP测试要注意哪些问题&#xff1f;对于移动测试&#xff0c;测试员不得不基于用户移动使用模式考虑移动相关的功能。而针对手机应用软件APP的系统测试&#xff0c;我们通常从如下几个角度开展&#xff1a;功能测试(流程测试、功能点测试)、兼容性测…

WEB APIs (3)

事件对象 事件对象有事件触发时的相关信息&#xff0c;如点击事件中事件对象储存了鼠标点在哪个位置的信息 场景&#xff1a; 用户按下了哪个键&#xff0c;按下回车键可以发布新闻 鼠标点击了哪个元素&#xff0c;从而做哪些操作 参数e为事件对象 常用属性 type 获取当前…

枚举类(enum)

优质博文&#xff1a;IT-BLOG-CN ​ 枚举类&#xff1a; 就是对象的实例个数是确定的&#xff08;例如&#xff1a;单例模式&#xff09;&#xff0c;也就说我们在创建枚举类的时候&#xff0c;会对构造器进行设置 一、自定义创建枚举类 为什么需要枚举类&#xff1f; 【1】…

前端开发,Vue的双向数据绑定的原理

目录 一、什么是前端 二、Vue.JS框架 三、双向数据绑定 四、Vue的双向数据绑定的原理 一、什么是前端 前端通常指的是网页或应用程序中用户直接交互和感知的部分&#xff0c;也称为客户端。前端开发涉及使用HTML、CSS和JavaScript等技术来构建用户界面和交互功能。前端开发…

[WebDav] WebDav基础知识

文章目录 什么是WebDavWebDav常用命令WebDav常用命令的测试&#xff08;代码&#xff09;PROPFIND 方法测试PUT 方法测试GET 方法测试PROPPATCH方法 WebDav缓存Cache-ControlEtag测试 强制重新验证不需要缓存 WebDav的锁WebDav的状态码WebDav身份验证WebDav版本控制WebDav和FTP…