非极大值抑制NMS与柔性非极大抑制Soft-NMS的python实现

news2024/9/22 11:25:46

非极大值抑制NMS的python实现

什么是非极大值抑制

非极大值抑制的主要目的是为了消除多余的框,找到最佳的物体检测的位置。

比如我们想要检测手的时候, RCNN网络在训练之后会给出许多个预测框(比图上的更多), 我们先通过他们的置信度筛选出一批不符合的框, 剩下如图的预测框, 还是很多, 所以通过非极大值抑制保留出个别几个最准确的框(置信度得分最高的)
在这里插入图片描述
非极大值抑制后留下最佳框
在这里插入图片描述
NMS也存在一定的问题, 它会将两个重叠在一起的物体框只保留一个, 所以柔性非极大抑制Soft-NMS在筛选框的过程中也考虑了分数的影响, 可以保留一些重叠在一起的物体
在这里插入图片描述

伪代码

  • B 表示输入的预测框列表, 其中的每个bi包含了x, y, w, h的信息
  • S 表示每个预测框的预测结果得分
  • D 存储NMS之后剩下的框
    伪代码运行流程
  • argmaxS 找到最大得分的下标m
  • bm 也就是最大得分对应的预测框从B中删除, 加入到D
  • 遍历B(预测框列表) 将其中的bi与之前选出的得分最好的预测框之间计算IOU, 如果结果大于给定的门限值, 就删除当前的bisi 意思就是说如果两个框的IOU比较高, 就认为他们预测的是同一个目标, 而得分最高的框已经取出, 所以就删除当前的框
  • 下面的部分是Soft-NMS 它以一个权重的形式,将获得的IOU取高斯指数后乘上原得分,之后重新排序, 也就是说不仅仅根据IOU来筛选框, 也会保留一些分数很高的框
    在这里插入图片描述

Python实现

用python实现伪代码, 具体注释已经写在下面了

# Author    : JokerTong
# Datetime  : 2023-02-03 16:40
# File      : NMS实现.py
import math
import numpy as np


def iou(box1, box2):
    # 计算框与框之间的IOU
    # x1, y1, x2, y2
    # 0   1   2   3
    area1 = (box1[3] - box1[1]) * (box1[2] - box1[0])  # 计算第一个框的面积
    area2 = (box2[3] - box2[1]) * (box2[2] - box2[0])  # 计算第二个框的面积
    inter_area = (min(box1[2], box2[2]) - max(box1[0], box2[0])) * \
                 (min(box1[3], box2[3]) - max(box1[1], box2[1]))  # 计算两个框重叠的面积
    return inter_area / area1 + area2 - inter_area  # 返回IOU


def spm(iou, mode='linear', sigma=0.3):
    # score penalty mechanism (soft-nms)
    if mode == 'linear':
        return 1 - iou
    elif mode == 'gaussian':
        return math.e ** (- (iou ** 2) / sigma)
    else:
        raise NotImplementedError


def NMS(lists, conf_thre, iou_thre, soft=True, soft_thre=0.001):
    # 根据阈值先过滤一批不符合要求的框
    lists = filter(lambda x: x[4] >= conf_thre, lists)
    # 将所有的预测框按分数从高大到低排序
    lists = sorted(lists, key=lambda x: x[4], reverse=True)
    keep = []

    while lists:
        m = lists.pop(0)  # 取出分数最高的框
        keep.append(m)
        for i, pred in enumerate(lists):  # 遍历剩下的框, 根据iou的值来筛选
            _iou = iou(m, pred)
            if _iou >= iou_thre:
                if soft:  # 如果采用soft-NMS, 则更新score
                    pred[4] *= spm(_iou, mode='gaussian', sigma=0.3)
                    keep.append(lists.pop(i))
                else:
                    lists.pop(i)

    if soft:
        keep = list(filter(lambda x: x[4] >= soft_thre, keep))
        keep = sorted(keep, key=lambda x: x[4], reverse=True)

    return keep


if __name__ == '__main__':
    np.random.seed(0)
    x1y1 = np.random.randint(0, 300, (300, 2)) / 600  # 初始化x1,y1坐标, 假设图像为(600*600)大小
    x2y2 = np.random.randint(300, 600, (300, 2)) / 600  # 初始化x2,y2坐标
    boxes = np.concatenate((x1y1, x2y2), 1)  # 将 x1,y1,x2,y2 拼接
    scores = np.random.rand(300, 1)  # 初始化分数

    lists = list(np.concatenate((boxes, scores), 1))
    detections = NMS(lists, conf_thre=0.1, iou_thre=0.7, soft=False, soft_thre=0.1)  # 非极大值抑制
    print(len(detections), detections)  # 输出留下的框, 以及具体的信息


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

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

相关文章

智能BI与传统报表的区别是什么?

随着企业信息化的深入, 企业的信息化系统日益增多。各个信息化系统也随着应用的逐渐深入, 随之产生大量的信息数据。面对已成几何级增长的数据量, 如何从中提取有效数据, 如何将数据转换为有价值的数据? 成为企业面临的问题之一。 其实与数据相关的工具除了传统报表还有如今火…

百度网盘普通用户如何上传单文件最大4G文件。window split命令如何分割文件上传。

普通用户使用百度网盘Web端上传文件时,单文件最大支持1G大小;使用网盘PC客户端上传文件时,单文件最大支持4G;如果您需要上传大于4G文件,可充值百度网盘会员,其中:1、百度网盘会员使用网盘PC客户…

案例:DNN进行分类

7.2 案例:DNN进行分类 学习目标 目标 知道tf.data.Dataset的API使用知道tf.feature_columnAPI使用知道tf.estimatorAPI使用应用 无 7.2.1 数据集介绍 对鸢尾花进行分类:概览 本文档中的示例程序构建并测试了一个模型,此模型根据鸢尾花的花…

《MFC编程》:MFC程序执行流程

《MFC编程》:MFC程序启动《MFC编程》:MFC程序启动入口函数执行流程CWinApp的成员视频链接《MFC编程》:MFC程序启动 入口函数 MFC程序的入口函数与win32程序一样,都是从WinMain入口。 但是MFC库已经实现了WinMain函数&#xff0…

ORA-65096: invalid common user or role 解决方法

问题描述 oracle 12C 创建数据库时报错: ORA-65096: invalid common user or role name例如: SQL> create user rui identified by oracle;create user rui identified by oracle* ERROR at line 1: ORA-65096: invalid common user or role name原…

记录1-两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案…

分享111个JS图片切换特效,总有一款适合您

分享111个图片切换,总有一款适合您 下面是文件的名字,我放了一些图片,文章里不是所有的图主要是放不下..., 111个图片切换下载链接:https://pan.baidu.com/s/1iGzOzU3WZbjBF21dZzoH9w?pwdqi5u 提取码:qi…

Linux常见指令大全(二)

🌹作者:云小逸 📝个人主页:云小逸的主页 📝Github:云小逸的Github 🤟motto:要敢于一个人默默的面对自己,强大自己才是核心。不要等到什么都没有了,才下定决心去做。种一颗树,最好的时间是十年前…

2023年第一篇来谈谈效率

晚上临走的时候和同事聊了聊关于效率的问题,暂且称呼为A同学。借着和A同学的这次畅谈记录下这段时间的所负责的数据迁移过程。 数据迁移的整体内容并不复杂。主要内容如下 我们在做事情的时候总会遇到这件事情所关联的其他问题。 不要带着情绪去工作 书写脚本的时候…

【HBase高级】6. HBase数据结构(下)——LSM树数据结构、布隆过滤器、StoreFiles(HFile)结构

5.3 LSM树数据结构 1、简介 传统关系型数据库,一般都选择使用B树作为索引结构,而在大数据场景下,HBase、Kudu这些存储引擎选择的是LSM树。LSM树,即日志结构合并树(Log-Structured Merge-Tree)。 LSM树主要目标是快速建立索引B树…

redis加锁的几种方法

1. redis加锁分类 redis能用的的加锁命令分表是INCR、SETNX、SET 2. 第一种锁命令INCR 这种加锁的思路是, key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作进行加一。 然后其它用户在执行 INCR 操作进行加一时,…

3.4 内部类

文章目录1.概述2.特点3.内部类入门案例4.成员内部类4.1 被private修饰4.2 被static修饰5.局部内部类6.匿名内部类1.概述 如果一个类存在的意义就是为指定的另一个类,可以把这个类放入另一个类的内部。 就是把类定义在类的内部的情况就可以形成内部类的形式。 A类中…

【内网安全】——CS操作指南(二)

作者名:白昼安全主页面链接: 主页传送门创作初心: 一切为了她座右铭: 不要让时代的悲哀成为你的悲哀专研方向: web安全,后渗透技术每日emo:关心和细节吗?注意:我这里的cs…

Android MVI框架的使用

AndroidMviFrame AndroidMviFrame 是一个Android简单易用的项目框架 文档下面会对框架中所使用的一些核心技术进行阐述。该框架作为技术积累的产物,会一直更新维护,如果有技术方面的谈论或者框架中的错误点,可以在 GitHub 上提 Issues&…

DAMA认证(CDGA/CDGP)证书好考吗

随着数字化经济的不断发展,企业对数据重视程度越来越高,致使越来越多得数字人关注到DAMA认证。很多小伙伴都会有这样的疑问,DAMA认证(CDGA/CDGP认证)好考吗?通过率怎么样?今天小编就在这里做一下简单的说明…

UniRx之操作符详解-Linq语法

前言 UniRx中由很多操作符,注意要分为三类 Linq操作符,和Linq语法风格一致Rx操作符,从Rx.Net库继承下来的操作符。UniRx操作符,UniRx针对Unity的独有操作符。 Rx和Linq Linq是微软的一项技术,新增一种自然查询的SQ…

时间序列预测

问题简介 简单来说,时间序列是按照时间顺序,按照一定的时间间隔取得的一系列观测值,比如我们上边提到的国内生产总值,消费者物价指数,利率,汇率,股票价格等等。时间间隔可以是日,周…

数字IC设计 Synopsys EDA Tools的安装补充

数字IC Synopsys 七件套的Ubuntu安装步骤 推荐大佬的安装教程,本人亲测可用,在这里表示十分感谢! 数字IC设计的第一步——Synopsys EDA Tools的安装 跟着大佬的教程仔细点可以一步到位的! 在这里备忘本人遇到的几个粗心导致的问…

浅谈Spring IoC容器

目录 1.IoC容器 2.依赖注入 1.IoC容器 IOC: Inversion of Control,是一种设计思想。 在spring框架中,Spring 通过IoC容器进行管理所有Java对象的实例化和初始化,控制对象与对象之间的依赖关系。 IoC管理的对象称为Bean,它与使…

“华为杯”研究生数学建模竞赛2005年-【华为杯】A题:行车时间估计和最优路线选择(附获奖论文)

赛题描述 A: Highway Traveling time Estimate and Optimal Routing Ⅰ Highway traveling time estimate is crucial to travelers. Hence, detectors are mounted on some of the US highways. For instance, detectors are mounted on every two-way six-lane highways o…