密码算法中iv值是什么_?标检测中的?极?值抑制算法(nms):python代码解析
⾮极⼤值抑制(Non-Maximum Suppression)原理
⾮极⼤值抑制,顾名思义,找出极⼤值,抑制⾮极⼤值。这种思路和算法在各个领域中应⽤⼴泛,⽐如边缘检测算法canny算⼦中就使⽤了该⽅法。本⽂主要讨论nms在⽬标检测中的应⽤。⽬标检测过程中,模型在同⼀⽬标的位置上经常会产⽣⼤量的候选框,如下图是赫本的⼈脸检测结果。可以看出这些候选框之间的重叠度⾮常⾼,此时就需要利⽤nms找到最佳⽬标,消除冗余的边界框。
奥黛丽赫本-⼈脸检测示意图
nms的原理很简单,主要分为如下⼏步:
- 将候选框按照置信度进⾏排序
- 计算置信度最⾼的候选框与其它候选框的IoU(交并⽐)
- 删除IoU⼤于设定阈值的候选框
- 重复上述过程,直⾄候选框列表为空
这里的IoU指的是Intersection over Union,代表候选区域之间的交并比,计算如下图所示。
IOU计算示意图
python代码解析
nms的开源代码很多,初学者往往被各种复杂代码⾥花式的写法迷惑,但其实nms的代码很好写,完全不需要很复杂的数据结构及算法,这⾥笔者用numpy尽量写了⼀个最精简、最易读的版本,⼀共30⾏,供⼤家参考。
def nms_rect(box, iou): keep_ = [] if len(box) > 1: x1 = box[:, 0] y1 = box[:, 1] x2 = box[:, 2] y2 = box[:, 3] score = box[:, 4] area = (y2 - y1 + 1) * (x2 - x1 + 1) while len(score) > 1: order = score.argsort()[::-1] i = order[0] xx1 = np.maximum(x1[i], x1[order[1:]]) yy1 = np.maximum(y1[i], y1[order[1:]]) xx2 = np.minimum(x2[i], x2[order[1:]]) yy2 = np.minimum(y2[i], y2[order[1:]]) w = np.maximum(0., xx2 - xx1) h = np.maximum(0., yy2 - yy1) inter = w * h ovr = inter / (area[i] + area[order[1:]] - inter) inds = np.where(ovr > iou) + np.array([1]) inds = np.append(inds, 0) keep_.append([x1[i], y1[i], x2[i], y2[i], score[i]]) x1 = np.delete(x1, order[inds]) y1 = np.delete(y1, order[inds]) x2 = np.delete(x2, order[inds]) y2 = np.delete(y2, order[inds]) area = np.delete(area, order[inds]) score = np.delete(score, order[inds]) return keep_
结果展示
从左到右依次是原图、nms处理前、nms处理后,可以看出效果很明显。
nms效果图
写在最后
nms是算法研究⼈员⼗分常⽤的算法,笔者在⼯作⾯试中也经常会出这道题,因此还是很有必要掌握的,接下来的⽂章也会持续分享⼯作期间总结的论⽂、笔记和代码。欢迎关注与转发。
密码算法中iv值是什么_?标检测中的?极?值抑制算法(nms):python代码解析相关推荐
- nms python代码_?标检测中的?极?值抑制算法(nms):python代码解析
⾮极⼤值抑制(Non-Maximum Suppression)原理 ⾮极⼤值抑制,顾名思义,找出极⼤值,抑制⾮极⼤值.这种思路和算法在各个领域中应⽤⼴泛,⽐如边缘检测算法canny算⼦中就使⽤了该⽅法 ...
- 【Android 逆向】使用 Python 代码解析 ELF 文件 ( PyCharm 中进行断点调试 | ELFFile 实例对象分析 )
文章目录 一.PyCharm 中进行断点调试 二.ELFFile 实例对象分析 一.PyCharm 中进行断点调试 在上一篇博客 [Android 逆向]使用 Python 代码解析 ELF 文件 ( ...
- 假定在使用CSMA/CD协议的10Mb/s以太网中某个站在发送数据时检测到碰撞,执行退避算法时选择了随机数r=100。试问这个站需要等待多长时间后才能再次发送数据?如果是100Mb
假定在使用CSMA/CD协议的10Mb/s以太网中某个站在发送数据时检测到碰撞,执行退避算法时选择了随机数r=100.试问这个站需要等待多长时间后才能再次发送数据?如果是100Mb/s的以太网呢? 以 ...
- otsu自适应阈值分割的算法描述和opencv实现,及其在肤色检测中的应用
from:http://blog.csdn.net/onezeros/article/details/6136770 otsu算法选择使类间方差最大的灰度值为阈值,具有很好的效果 算法具体描述见ots ...
- 刷网课会被检测出来吗_目标检测中的Precision和Recall
目标检测中常用的性能评价指标有Precision,Recall和F1 score. 当面对不同的任务时,该如何提高recall和precision? 思考:对于Precision值,其代表的是你所预测 ...
- excel中显示隐藏的行_在Excel中显示或隐藏用户提示
excel中显示隐藏的行 When you set up a worksheet for other people to use, data validation messages can help ...
- java中随机数怎么定义类_浅析Java中的随机数类
Java中的随机数是否可以重复?Java中产生的随机数能否可以用来产生数据库主键?带着这个问题,我们做了一系列测试. 1.测试一: 使用不带参数的Random()构造函数 * @author Carl ...
- mfc 静态框接收tab焦点_目标检测中焦点损失的入门指南
介绍 对象检测是计算机视觉社区中研究最广泛的主题之一.它已经进入了各个行业,涉及从图像安全,监视,自动车辆系统到机器检查的用例. 当前,基于深度学习的对象检测可以大致分为两类: 两级检测器,例如基于区 ...
- vue判断列表中包含某一项_判断字符串中是否包含某个字符串
String对象的方法 1. indexOf() indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置. 如果要检索的 字符串值没有出现,则该方法返回 -1. var str='你 ...
最新文章
- myeclipse安装svn插件
- Dynamics CRM 同一实体多个Form显示不同的Ribbon按钮
- 【坐在马桶上看算法】算法4:队列——解密QQ号
- phpstudy页面不存在_网站的404页面对于SEO的重要作用
- Java8系列之重新认识HashMap
- HTTP状态码:400\500 错误代码
- Object C语法快速入门
- Play framework 2.0 -应用程序全局设置(转)
- 数据实验室:让您的数据获得真正的价值
- 成功解决 AttributeError: module ‘neat’ has no attribute ‘Config’解决方式
- 若变量已正确定义并赋值,不符合c语言语法的表达式是____.,若变量已正确定义并赋值,表达式______不符合C语言语法.A、a*b/c; B、3.14%2 C、2,b D、a/b/...
- USB3014-应用程序开发(2)
- python抠图教程视频_3行Python代码实现8秒抠图的AI神器,根本无需PS(附视频教程)...
- 接口请求 Provisional headers are shown
- python爬虫读后感-学习爬虫的感想和心得
- steam linux 安装目录,如何在Ubuntu中安装Steam | MOS86
- 【全文翻译】Membership Inference Attacks Against Machine Learning Models
- 拥塞窗口cwnd的理解
- SD卡pin引脚说明及PCB layout指导
- hook:实现简单的键盘记录器