【深度学习】——非极大值抑制(nms/soft-nms)

目录

一、相关概念

1、iou

1)理论计算

2)Python代码(代码参考yolov3模型util.py文件)

2、nms

1)基本思路

2)标准nms和soft-nms

3)Python代码实现(yolov3中util.py文件,增加了注释)

4)标准nms的缺点


一、相关概念

1、iou

1)理论计算

参考:https://blog.csdn.net/zouxiaolv/article/details/107400193

                        

物体检测需要定位出物体的bounding box,就像上面的图片一样,我们不仅要定位出车辆的bounding box 我们还要识别出bounding box 里面的物体就是车辆。

对于bounding box的定位精度,有一个很重要的概念,那就是定位精度评价公式:IOU。

IOU表示了bounding box 与 ground truth 的重叠度,如下图所示:

这里写图片描述

矩形框A、B的一个重合度IOU计算公式为:

                                                                 IOU=Area(A∩B)/Area(A∪B)

就是矩形框A、B的重叠面积占A、B并集的面积比例:

                                                                 IOU=SI/(SA+SB-SI)

如何计算IOU(交并比)

                                

首先求出重合面积:

     选取两个矩形框左顶角的横,纵坐标的最大值,x21,y21;选取两个矩形框右下边角的横纵坐标的最小值,x12,y12;

重合面积计算:

                             inter=    | x12-x21 *| y12-y21 |

并集的面积计算:

                               b = | x12-x21  |*| y12-y21 |+ | x21-x22 || y21-y22  | - inter

计算IOU:

                                   IOU=inter/b

2)Python代码(代码参考yolov3模型util.py文件)

def bboxes_iou(boxes1, boxes2):'''两个都是数组,注意两个box的维度必须一致,一般是二维box:[[xmin,ymin,xmax,ymax],[xmin,ymin,xmax,ymax],...]'''boxes1 = np.array(boxes1)# (1,4)boxes2 = np.array(boxes2) # (n,4)# 计算两个box的面积boxes1_area = (boxes1[..., 2] - boxes1[..., 0]) * (boxes1[..., 3] - boxes1[..., 1]) # (1,1)boxes2_area = (boxes2[..., 2] - boxes2[..., 0]) * (boxes2[..., 3] - boxes2[..., 1]) # (n,1)left_up       = np.maximum(boxes1[..., :2], boxes2[..., :2])right_down    = np.minimum(boxes1[..., 2:], boxes2[..., 2:])inter_section = np.maximum(right_down - left_up, 0.0)inter_area    = inter_section[..., 0] * inter_section[..., 1] # 重叠区域union_area    = boxes1_area + boxes2_area - inter_area # 全部面积ious          = np.maximum(1.0 * inter_area / union_area, np.finfo(np.float32).eps) # iousreturn ious

2、nms

非极大值抑制(Non-Maximum Suppression,NMS),顾名思义就是抑制不是极大值的元素,用于目标检测中,就是提取置信度高的目标检测框,而抑制置信度低的误检框。一般来说,用在当解析模型输出到目标框时,目标框会非常多,具体数量由anchor数量决定,其中有很多重复的框定位到同一个目标,nms用来去除这些重复的框,获得真正的目标框。如下图所示,人、马、车上有很多框,通过nms,得到唯一的检测框。

1)基本思路

所谓非极大值抑制:先假设有6个矩形框,根据分类器类别分类概率做排序,从小到大分别属于车辆的概率分别为A<B<C<D<E<F。

(1) 从最大概率矩形框F开始,分别判断A、B、C、D、E与F的重叠度IOU是否大于某个设定的阈值;

(2) 假设B、D与F的重叠度超过阈值,那么就扔掉B、D;并标记第一个矩形框F,是我们保留下来的。

(3) 从剩下的矩形框A、C、E中,选择概率最大的E,然后判断A、C与E的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框。

(4) 重复这个过程,找到所有被保留下来的矩形框。

2)标准nms和soft-nms

参考:https://zhuanlan.zhihu.com/p/89426063

bi为待处理BBox框,B为待处理BBox框集合,sibi框更新得分,Nt是NMS的阈值,D集合用来放最终的BBox,f是置信度得分的重置函数。 bi和M的IOU越大,bi的得分si就下降的越厉害。

经典的NMS算法将IOU大于阈值的窗口的得分全部置为0,可表述如下:

这种是加权线性的

具体其他的可以参考:https://zhuanlan.zhihu.com/p/89426063

3)Python代码实现(yolov3中util.py文件,增加了注释)

def nms(bboxes, iou_threshold, sigma=0.3, method='nms'):""":param bboxes: (xmin, ymin, xmax, ymax, score, class),是一个数组,关于(n,6),n是检测出的box个数Note: soft-nms, https://arxiv.org/pdf/1704.04503.pdfhttps://github.com/bharatsingh430/soft-nms"""classes_in_img = list(set(bboxes[:, 5])) # 得到不同类别标签的列表,如[0,1,2],标签号best_bboxes = [] # 存放最好的boxfor cls in classes_in_img: # 遍历类别号列表cls_mask = (bboxes[:, 5] == cls) # 这里返回的是一个True or False的掩模列表,True则表示bboxes中对应索引号的box是属于这个类cls_bboxes = bboxes[cls_mask] # 根据掩模获得属于那一类的box,依旧是二维数组while len(cls_bboxes) > 0: # 这里一直在循环,直到box列表为空max_ind = np.argmax(cls_bboxes[:, 4]) # 获得这类得分最高的box索引best_bbox = cls_bboxes[max_ind] # 将分数最高的box作为最佳boxbest_bboxes.append(best_bbox) # 添加# 从box列表中去除最佳boxcls_bboxes = np.concatenate([cls_bboxes[: max_ind], cls_bboxes[max_ind + 1:]])# 计算得到两个box之间的iou(重叠部分除以一起共同的面积),下面这里其实进行了批量操作,将最佳box和剩下的box进行了计算# np.newaxies,表示增加一个维度iou = bboxes_iou(best_bbox[np.newaxis, :4], cls_bboxes[:, :4])weight = np.ones((len(iou),), dtype=np.float32)  # 置信度,当iou大于0.7,说明重叠的部分很大,可以视为一个框,故丢弃assert method in ['nms', 'soft-nms']if method == 'nms': # 标准nmsiou_mask = (iou > iou_threshold) # 得到一个掩模,iou大于设定阈值的设置为TRUEweight[iou_mask] = 0.0 #大于阈值的box的置信度置为0if method == 'soft-nms': # soft-nms,不直接丢弃大于阈值的boxweight = np.exp(-(1.0 * iou ** 2 / sigma)) # sigma为惩罚因子,这个越小,置信度越小,越容易被抛弃cls_bboxes[:, 4] = cls_bboxes[:, 4] * weight # 这里是将剩下的box的得分乘以了iou置信度,与bestbox重叠的丢弃了score_mask = cls_bboxes[:, 4] > 0. # 取大于0的也就是丢弃了重叠的,这也是掩模cls_bboxes = cls_bboxes[score_mask] # 根据掩模跟新剩下的box,进行下一轮的nmsreturn best_bboxes

4)标准nms的缺点

1、NMS算法中的最大问题就是它将相邻检测框的分数均强制归零(即将重叠部分大于重叠阈值Nt的检测框移除)。在这种情况下,如果一个真实物体在重叠区域出现,则将导致对该物体的检测失败并降低了算法的平均检测率。

2、NMS的阈值也不太容易确定,设置过小会出现误删,设置过高又容易增大误检。

3、NMS一般只能使用CPU计算,无法使用GPU计算。

 

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

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

相关文章

移动服务安全现状分析!

2019独角兽企业重金招聘Python工程师标准>>> 由于Android开源的环境&#xff0c;导致Android的整体环境都存在很多不安全的因素&#xff0c;同时用户在移动APP客户端的便捷应用&#xff0c;也给用户带来了巨大的安全隐患。未经过移动服务安全加固的APP存在被静态反编…

MyEclipse连接MySQL

在官网http://www.mysql.com/downloads/下载数据库连接驱动 本文中使用驱动版本为mysql-connector-java-5.1.40 一、创建一个java测试项目MySQLConnectorsTest 在项目下穿件一个lib文件夹用来存放MySQL驱动包。 右键驱动包build path进行add添加操作&#xff0c;打开Referenced…

在Windows系统中配置Google AddressSanitizer

Google AddressSanitizer简介 AddressSanitizer (ASan) 是 C 和 C 的内存错误检测软件&#xff0c;它可以检测&#xff1a; 释放指针后继续使用堆缓冲区溢出栈缓冲区溢出全局缓冲区溢出返回后继续使用在范围之外继续使用初始化顺序的bug内存泄漏 在 Windows 系统中&#xff…

【剑指offer】——求出一个正整数的质数因子(Python)

目录 一、题目描述 二、思路 1、短除法 2、平方根法 一、题目描述 功能:输入一个正整数&#xff0c;按照从小到大的顺序输出它的所有质因子&#xff08;重复的也要列举&#xff09;&#xff08;如180的质因子为2 2 3 3 5 &#xff09; 最后一个数后面也要有空格 输入描述…

C++ STL实现的优先队列( priority_queue )

本文参考的源码版本&#xff1a;gcc version 8.1.0 (x86_64-posix-seh-rev0, Built by MinGW-W64 project)。 priority_queue 本质是容器适配器&#xff0c;它对内部容器的元素有自己的管理方式&#xff0c;而 priority_queue 实际维护的是一个二叉堆。STL中 priority_queue 的…

生成相关矩阵

U是X&#xff08;差异矩阵&#xff09;各列向量取方向后形成的矩阵&#xff0c;CU^T * U 即相关矩阵&#xff0c;即各列向量两两的夹角&#xff0c;&#xff08;夹角越小说明关联度越高&#xff09; clc avg_e66;avg_m66;avg_s76; x1[61 63 78 65 63] -avg_e; x2[53 73 61 84 5…

Java关于Properties用法的总结(一)

最近项目中有一个这样的需求&#xff0c;要做一个定时任务功能&#xff0c;定时备份数据库的操表&#xff0c;将表数据写入txt文件。因为文件的读写路径可能需要随时改动&#xff0c;所以写死或者写成静态变量都不方便&#xff0c;就考虑使用配置文件&#xff0c;这里总结些配置…

【tensorflow】——tensorboard可视化计算图以及参数曲线图loss图

参考文献&#xff1a; https://zhuanlan.zhihu.com/p/71328244 目录 1.可视化计算图 2.可视化参数 3. 远程tensorboard 4、报错 真是出来混迟早是要还的&#xff0c;之前一直拒绝学习Tensorboard&#xff0c;因为实在是有替代方案&#xff0c;直到发现到了不得不用的地步…

jQuery学习- 位置选择器

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>位置选择器</title><script src"js/jquery.js"></script><script type"text/javascript">$(function(){//获取第一个li$(&quo…

Vue3、TypeScript 实现图片数量及大小随宽度自适应调整

前言 过了这么久&#xff0c;想起自己还有个博客&#xff0c;更点内容吧&#xff01; 来&#xff0c;上需求&#xff01; 最近在做个前端界面&#xff0c;要求在一行中展示一些图片&#xff0c;展示的图片数量随着窗口宽度大小进行变化&#xff0c;除此之外还有以下要求&…

苹果Iphone/Ipad--L2T虚拟教程

1 Iphone和Ipad同为IOS&#xff0c;设置方法相同。首先进入IOS系统的“设置”程序。 2 点击“通用”进入通用设置&#xff0c;点击“”; 3 选择"添加设置 "&#xff1b; 4 选择L2TP方式&#xff0c;填写必要信息&#xff1a;描述、服务器地址 、您注册充值的账号及密…

记忆化搜索的应用

记忆化搜索的应用 一般来说&#xff0c;动态规划总要遍历所有的状态&#xff0c;而搜索可以排除一些无效状态。更重要的是搜索还可以剪枝&#xff0c;可能剪去大量不必要的状态&#xff0c;因此在空间开销上往往比动态规划要低很多。 如何协调好动态规划的高效率与高消费之间的…

Veebot-自动静脉抽血机器人

Veebot-自动静脉抽血机器人 我们可能都有过被抽血的经验。护士让你握紧拳头&#xff0c;用一根橡皮条压住你上臂的血管&#xff0c;在你的肘部内侧寻找你的静脉&#xff0c;有时还需要拍打几下&#xff0c;摸到隆起的静脉血管&#xff0c;一针下去。有时候碰到技术好的护士&…

idea 转普通项目为maven 项目

1、项目上右键 Add Framework Support。 2、选择maven&#xff0c;点击OK。 转载于:https://www.cnblogs.com/mayanze/p/8042489.html

【深度学习之ResNet】——深度残差网络—ResNet总结

目录 论文名称&#xff1a;Deep Residual Learning for Image Recognition 摘要&#xff1a; 1、引言 2、为什么会提出ResNet残差网络呢&#xff1f; 3、深度残差网络结构学习&#xff08;Deep Residual learning&#xff09; &#xff08;1&#xff09;残差单元 &#xf…

关于SafeMove White Paper功能

ABB机器人网站有一个 Safemove 功能的介绍&#xff0c;在Overview页面右半版有一篇文档是 SafeMove White Paper &#xff0c;在45页的 pdf 文档中&#xff0c;详细了介绍工业机器人的安全原则&#xff0c;以及ABB工业机器人自身 EPS (Electronic Position Switches) 和 SafeMo…

面试疑难点解析

List,Set,Map,有什么区别&#xff1f; List和Set实际上市实现了Collection接口&#xff0c;那么Collection接口的原理你能简单描述一下吗&#xff1f; List接口可以插入多个NULL值&#xff0c;并且重复值&#xff0c;而且LIST是一个有序的集合。 Set是一个不可重复的集合&#…

主机无法访问虚拟机的httpd服务

症状&#xff1a;虚拟机装的centos6.3 通过桥接的方式与主机连接 虚拟机通过yum安装httpd服务 在主机浏览器中输入 虚拟机ip 无法访问虚拟机Apache 虚拟机和主机可以相互ping通 解决&#xff1a;关掉虚拟机的防火墙就可以了 命令setup进入防火墙管理 按空格键取消防火墙启用 转…

2017-2018-1 20155229 《信息安全系统设计基础》第十三周学习总结

2017-2018-1 20155229 《信息安全系统设计基础》第十三周学习总结 对“第二章 信息的表示和处理”的深入学习 这周的任务是选一章认为最重要的进行学习&#xff0c;我选择了第二章。当今的计算机存储和处理信息基本上是由二进制&#xff08;位&#xff09;组成&#xff0c;二进…

【VOC格式xml文件解析】——Python

#!/usr/bin/env python # -*- coding: utf-8 -*- # Time : 2021/4/26 12:49 # Author : linlianqin # Site : # File : test1.py # Software: PyCharm # description: import xml.etree.ElementTree as ETdef xmli(xmlpath):xmlTree ET.parse(xmlpath) # 解析xml文…