深度学习之非极大值抑制(Non-maximum suppression,NMS)

非极大值抑制(Non-maximum suppression,NMS)是一种去除非极大值的算法,常用于计算机视觉中的边缘检测、物体识别等。

算法流程

给出一张图片和上面许多物体检测的候选框(即每个框可能都代表某种物体),但是这些框很可能有互相重叠的部分,我们要做的就是只保留最优的框。假设有N个框,每个框被分类器计算得到的分数为Si,(1<=i<=N)S_i, (1<=i<=N)Si,(1<=i<=N)

  1. 建造一个存放待处理候选框的集合H,初始化为包含全部N个框;建造一个存放最优框的集合M,初始化为空集。

  2. 将所有集合 H 中的框进行排序,选出分数最高的框 m,从集合 H 移到集合 M;

  3. 遍历集合 H 中的框,分别与框 m 计算交并比(Interection-over-union,IoU),如果高于某个阈值(一般为0~0.5),则认为此框与 m 重叠,将此框从集合 H 中去除。

  4. 回到第1步进行迭代,直到集合 H 为空。集合 M 中的框为我们所需。

需要优化的参数

IoU 的阈值是一个可优化的参数,一般范围为0~0.5,可以使用交叉验证来选择最优的参数。

示例

比如人脸识别的一个例子:
在这里插入图片描述
已经识别出了 5 个候选框,但是我们只需要最后保留两个人脸。

首先选出分数最大的框(0.98),然后遍历剩余框,计算 IoU,会发现露丝脸上的两个绿框都和 0.98 的框重叠率很大,都要去除。

然后只剩下杰克脸上两个框,选出最大框(0.81),然后遍历剩余框(只剩下0.67这一个了),发现0.67这个框与 0.81 的 IoU 也很大,去除。
在这里插入图片描述
至此所有框处理完毕。
​​在这里插入图片描述
再比如定位一个车辆,最后算法就找出了一堆的方框,我们需要判别哪些矩形框是没用的。非极大值抑制:先假设有6个矩形框,根据分类器类别分类概率做排序,从小到大分别属于车辆的概率分别为A、B、C、D、E、F。

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

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

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

就这样一直重复,找到所有被保留下来的矩形框A、E。

代码

import numpy as npdef py_cpu_nms(dets, thresh):# 单独获取各个参数,以下参数shape = (5,)x1 = dets[:,0]y1 = dets[:,1]x2 = dets[:,2]y2 = dets[:,3]scores = dets[:,4]areas = (y2-y1+1) * (x2-x1+1)print("areas.shape: {}".format(areas.shape))print("areas: {}".format(areas))keep = []# 得分按照由高到低排序的索引, index.shape = (6,)index = scores.argsort()[::-1]print("index.shape: {}".format(index.shape))print("index: {}".format(index))while index.size >0:# i为得分最高的索引i = index[0]      # 将得分最高的索引追加到列表中keep.append(i)# 计算两个box左上角点坐标的最大值x11、y11和右下角坐标的最小值x22、y22# x11、y11、x22、y22 shape = (5,)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:]])print("index[1:]: {}".format(index[1:]))print("x1[index[1:]]: {}".format(x1[index[1:]]))print("x11: {}".format(x11))print("x11.shape: {}".format(x11.shape))# 当两个方框相交时,22-11最后得到w,h是正值# 当两个方框不相交的时候,22-11最后得到w,h是负值,则设置为0# w、h shape = (5,)w = np.maximum(0, x22-x11+1)h = np.maximum(0, y22-y11+1)print("w: {}".format(w))print("w.shape: {}".format(w.shape))# 计算交集面积# overlaps.shape = (5,)overlaps = w * hprint("overlaps: {}".format(overlaps))print("overlaps.shape: {}".format(overlaps.shape))# 计算交并比# ious.shape = (5,)ious = overlaps / (areas[i] + areas[index[1:]] - overlaps)print("ious.shape: {}".format(ious.shape))print("ious: {}".format(ious))# 得到满足阈值条件的ious中的索引(ious相比index缺少第一个最大值)ious_idx = np.where(ious<=thresh)[0]print("ious<=thres idx: {}".format(ious_idx))# ious_idx+1得到在index中的索引index = index[ious_idx + 1]   # because index start from 1print("index: {}".format(index))return keepif __name__ == "__main__":boxes=np.array([[100,100,210,210,0.72], # 0[250,250,420,420,0.8],  # 1[220,220,320,330,0.92], # 2[100,100,210,210,0.72], # 3[230,240,325,330,0.81], # 4[220,230,315,340,0.9]]) # 5keep = py_cpu_nms(boxes, thresh=0.7)print("keep: {}".format(keep))

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

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

相关文章

148. 颜色分类

给定一个包含红&#xff0c;白&#xff0c;蓝且长度为 n 的数组&#xff0c;将数组元素进行分类使相同颜色的元素相邻&#xff0c;并按照红、白、蓝的顺序进行排序。 我们可以使用整数 0&#xff0c;1 和 2 分别代表红&#xff0c;白&#xff0c;蓝。 注意事项 不能使用代码库中…

vue项目token放在哪里_关于vue动态菜单的那点事

vue-element-admin4.0国内节点访问地址&#xff1a;https://panjiachen.gitee.io/vue-element-admin-site/zh/本此使用的是https://github.com/PanJiaChen/vue-element-admin/tree/i18n 国际化分支的版本。说是除了国际化其他都一样。本文主要介绍前台动态的使用资源权限。后台…

H264学习方法历程资料

我的H.264学习历程 半年前&#xff0c;我知道了H.264这个名词。那个时候决定学习H.264&#xff0c;可是我连资料都不知道如何收集。而且整个学校就只有我一个人在学习H.264&#xff0c; 找不到人交流&#xff0c;所以那个时候学得真的是举步维艰&#xff0c;很痛苦&#xff0c…

深度学习之 ROI Pooling

什么是ROI&#xff1f; ROI是 Region of interest 的简写&#xff0c;指的是 Faster R-CNN 结构中&#xff0c;经过 RPN 层后&#xff0c;产生的 proposal 对应的 box 框。 ROI Pooling 顾名思义&#xff0c;是 pooling 层的一种&#xff0c;而且是针对 ROIs 的 pooling。整个…

KD树小结

很久之前我就想过怎么快速在二维平面上查找一个区域的信息&#xff0c;思考许久无果&#xff0c;只能想到几种优秀一点的暴力。 KD树就是干上面那件事的。 别的不多说&#xff0c;赶紧把自己的理解写下来&#xff0c;免得凉了。 KD树的组成 以维护k维空间(x,y,……)内的KD树为例…

多元函数求极值中的a_多元函数的条件极值和拉格朗日乘数法

、条件极值、拉格朗日乘数法1. 转化为无条件极值在讨论多元函数极值问题时&#xff0c;如果遇到除了在定义域中寻求驻点(可能的极值点)外&#xff0c;对自变量再无别的限制条件&#xff0c;我们称这类问题为函数的无条件极值。如求的极值&#xff0c;就是无条件极值问题。然而在…

深度学习之 RPN(RegionProposal Network)- 区域候选网络

anchor boxes基本概念与作用: feature map 上的一个点可以映射回输入图片上的一个点&#xff0c;以特征图上这个点为中心&#xff0c;预先人为设定 k 个 boxes&#xff0c;这些 boxes 就称为在这个点上生成的 k 个 anchor boxes&#xff08;所有anchor boxes的中心点坐标是一样…

h264的码率控制 JVT-G012

开始看h264的码率控制&#xff0c;很多地方都提到 G012&#xff0c;拿来做为参考比较&#xff0c;看来很有必要研究清楚。 偶这人&#xff0c;E文文档不翻译的话&#xff0c;看过就忘了&#xff0c;于是草草翻译了下&#xff0c;因为不打算做B帧&#xff0c;也不准备在同一帧中…

Android RecyclerView嵌套EditView实时更新Item数据

一、场景&#xff08;例如&#xff1a;购物车&#xff09; 1、当我们需要以列表样式管理某些数据时&#xff0c;可能需要列表项的某个字段可编辑 2、编辑Item上的某个字段后可能还要更新相关字段的值 二、可能遇到的问题 1、列表滑动导致输入框中的数据错位&#xff08;或者焦点…

workbench拓扑优化教程_优化技术在水泵水力设计的应用(上篇)

文章来源&#xff1a;安世亚太官方订阅号&#xff08;搜索&#xff1a;Peraglobal&#xff09;CFD技术在泵的内流数值模拟、研究泵内部流动规律和结构方面已广泛应用&#xff0c;取得了很多成果。但是初步设计的产品如果通过CFD仿真得到的性能曲线不能满足使用要求&#xff0c;…

深度学习之 TensorRT

1 简介 TensorRT是一个高性能的深度学习推理&#xff08;Inference&#xff09;优化器&#xff0c;可以为深度学习应用提供低延迟、高吞吐率的部署推理。TensorRT可用于对超大规模数据中心、嵌入式平台或自动驾驶平台进行推理加速。TensorRT现已能支持TensorFlow、Caffe、Mxne…

H.264笔记

H.264标准写得比较繁复&#xff0c;所以考虑在浏览完Whitepaper之后就开始研读X264代码。X264代码风格还是比较清晰简洁的。根据对标准得理解&#xff0c;Picture Order Count在Slice解码的一开始就被提及&#xff1a;I0 B1 B2 P3 B4 B5 P6I0 P3 B1 B2 P6 B4 B5于是I0的POC是0&…

进制转换中dbho是什么意思_什么是网段?二进制十进制如何互相转换?看完这篇,你就全明白了...

之前的文章讲了ip&#xff0c;子网掩码&#xff0c;网关的关系&#xff0c;今天着重讲一下网段。我们用傻瓜交换机通讯时&#xff0c;一个网段的设备才能互相通讯&#xff0c;怎么能判断两个ip是同一个网段呢&#xff1f;今天就简单的说一下。(这篇文章用语音听可以起到催眠作用…

【网络流24题】星际转移问题(最大流)

【网络流24题】星际转移问题&#xff08;最大流&#xff09; 题面 Cogs 题解 因为天数是未知的&#xff0c;所以我们要想办法处理天数 可以选择二分或者依次累加天数 因为数据范围较小&#xff0c;使用二分可能反而复杂度会增高 所以使用不断累加天数 那么&#xff0c;把所有的…

使用 gunicorn 部署flask项目

1、WSGI协议 Web框架致力于如何生成HTML代码&#xff0c;而Web服务器用于处理和响应HTTP请求。Web框架和Web服务器之间的通信&#xff0c;需要一套双方都遵守的接口协议。WSGI协议就是用来统一这两者的接口的。 2、WSGI容器 常用的WSGI容器有Gunicorn和uWSGI&#xff0c;但G…

软件需求与问题解决

&#xff08;一&#xff09; 小满当上项目经理后不久&#xff0c;参与了一个大项目。当时市场签下来的时候&#xff0c;公司里面是欢天喜地的。项目做了一年多。到了交付的时候&#xff0c;用户却很不满意&#xff0c;当初说好的东西&#xff0c;好多都变了卦。用户是上帝&…

flex 换主轴后子元素占满_Chrome72 嵌套 flex 布局修改,你的网站可能会发生布局错乱...

起源2019 年 1 月 29 日&#xff0c;Chrome72 正式版(72.0.3626.81)发布&#xff0c;本次发布带来了一个改变&#xff0c;且没有在更新日志中提及&#xff0c;该改变导致某些网站发生了布局错乱。该改变主要针对的是嵌套的flex布局&#xff0c;下面我们一起看下是怎么回事。问题…

使用 Django + Wusgi + Nginx 部署 Django

如何在生产上部署Django? Django的部署可以有很多方式&#xff0c;采用 nginxuwsgi 的方式是其中比较常见的一种方式。 uwsgi介绍 uWSGI是一个Web服务器&#xff0c;它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。 WSGI / …

网络学习网址

网络之路博客 http://ccieh3c.com/ 转载于:https://www.cnblogs.com/changha0/p/8179801.html

路由到另外一个页面_Nextjs使用解读一(项目搭建与路由系统)

文章说明&#xff1a;1. 之前想搭建个人博客&#xff0c;由于学习的是react技术栈&#xff0c;所以就到处搜罗资料学了nextjs&#xff0c;配合koa就把博客搭起来了。该系列文章基于我的学习笔记&#xff0c;重新整理了一遍&#xff0c;如果有错误之处&#xff0c;还请指正。2. …