python 实现非极大值抑制算法(Non-maximum suppression, NMS)


Posted in Python onOctober 15, 2020

NMS 算法在目标检测,目标定位领域有较广泛的应用。

算法原理

非极大值抑制算法(Non-maximum suppression, NMS)的本质是搜索局部极大值,抑制非极大值元素。

算法的作用

当算法对一个目标产生了多个候选框的时候,选择 score 最高的框,并抑制其他对于改目标的候选框

python 实现非极大值抑制算法(Non-maximum suppression, NMS)

适用场景

一幅图中有多个目标(如果只有一个目标,那么直接取 score 最高的候选框即可)。

算法的输入

算法对一幅图产生的所有的候选框,以及每个框对应的 score (可以用一个 5 维数组 dets 表示,前 4 维表示四个角的坐标,第 5 维表示分数),阈值 thresh

算法的输出

正确的候选框组(dets 的一个子集)。

细节

  • 起始,设所有的框都没有被抑制,所有框按照 score 从大到小排序。
  • 从第 0 个框(分数最高)开始遍历:对于每一个框,如果该框没有被抑制,就将所有与它 IoU 大于 thresh 的框设为抑制。
  • 返回没被抑制的框。

参考代码

# --------------------------------------------------------
# Fast R-CNN
# Copyright (c) 2015 Microsoft
# Licensed under The MIT License [see LICENSE for details]
# Written by Ross Girshick
# --------------------------------------------------------

import numpy as np
cimport numpy as np

cdef inline np.float32_t max(np.float32_t a, np.float32_t b):
  return a if a >= b else b

cdef inline np.float32_t min(np.float32_t a, np.float32_t b):
  return a if a <= b else b

def cpu_nms(np.ndarray[np.float32_t, ndim=2] dets, np.float thresh):
  cdef np.ndarray[np.float32_t, ndim=1] x1 = dets[:, 0]
  cdef np.ndarray[np.float32_t, ndim=1] y1 = dets[:, 1]
  cdef np.ndarray[np.float32_t, ndim=1] x2 = dets[:, 2]
  cdef np.ndarray[np.float32_t, ndim=1] y2 = dets[:, 3]
  cdef np.ndarray[np.float32_t, ndim=1] scores = dets[:, 4]

  cdef np.ndarray[np.float32_t, ndim=1] areas = (x2 - x1 + 1) * (y2 - y1 + 1)
  cdef np.ndarray[np.int_t, ndim=1] order = scores.argsort()[::-1]

  cdef int ndets = dets.shape[0]
  cdef np.ndarray[np.int_t, ndim=1] suppressed = \
      np.zeros((ndets), dtype=np.int)

  # nominal indices
  cdef int _i, _j
  # sorted indices
  cdef int i, j
  # temp variables for box i's (the box currently under consideration)
  cdef np.float32_t ix1, iy1, ix2, iy2, iarea
  # variables for computing overlap with box j (lower scoring box)
  cdef np.float32_t xx1, yy1, xx2, yy2
  cdef np.float32_t w, h
  cdef np.float32_t inter, ovr

  keep = []
  for _i in range(ndets):
    i = order[_i]
    if suppressed[i] == 1:
      continue
    keep.append(i)
    ix1 = x1[i]
    iy1 = y1[i]
    ix2 = x2[i]
    iy2 = y2[i]
    iarea = areas[i]
    for _j in range(_i + 1, ndets):
      j = order[_j]
      if suppressed[j] == 1:
        continue
      xx1 = max(ix1, x1[j])
      yy1 = max(iy1, y1[j])
      xx2 = min(ix2, x2[j])
      yy2 = min(iy2, y2[j])
      w = max(0.0, xx2 - xx1 + 1)
      h = max(0.0, yy2 - yy1 + 1)
      inter = w * h
      ovr = inter / (iarea + areas[j] - inter)
      if ovr >= thresh:
        suppressed[j] = 1

  return keep

以上就是python 实现非极大值抑制算法(Non-maximum suppression, NMS)的详细内容,更多关于python 非极大值抑制算法的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python 错误和异常小结
Oct 09 Python
python按照多个字符对字符串进行分割的方法
Mar 17 Python
Python实现小数转化为百分数的格式化输出方法示例
Sep 20 Python
selenium+python 对输入框的输入处理方法
Oct 11 Python
python+opencv实现霍夫变换检测直线
Oct 23 Python
在python中利用最小二乘拟合二次抛物线函数的方法
Dec 29 Python
Python利用lxml模块爬取豆瓣读书排行榜的方法与分析
Apr 15 Python
Python 正则表达式 re.match/re.search/re.sub的使用解析
Jul 22 Python
python通过opencv实现图片裁剪原理解析
Jan 19 Python
Python 执行矩阵与线性代数运算
Aug 01 Python
Python实现http接口自动化测试的示例代码
Oct 09 Python
pd.drop_duplicates删除重复行的方法实现
Jun 16 Python
解决pip安装的第三方包在PyCharm无法导入的问题
Oct 15 #Python
python实现粒子群算法
Oct 15 #Python
如何将anaconda安装配置的mmdetection环境离线拷贝到另一台电脑
Oct 15 #Python
Python3.7安装PyQt5 运行配置Pycharm的详细教程
Oct 15 #Python
python利用faker库批量生成测试数据
Oct 15 #Python
如何利用python检测图片是否包含二维码
Oct 15 #Python
用python实现一个简单计算器(完整DEMO)
Oct 14 #Python
You might like
使用PHP和XSL stylesheets转换XML文档
2006/10/09 PHP
用PHP和ACCESS写聊天室(五)
2006/10/09 PHP
PHP 加密与解密的斗争
2009/04/17 PHP
php统计时间和内存使用情况示例分享
2014/03/13 PHP
php实现的微信红包算法分析(非官方)
2015/09/25 PHP
php分页原理 分页代码 分页类制作教程
2016/09/23 PHP
popdiv
2006/07/14 Javascript
javascript addBookmark 加入收藏 多浏览器兼容
2009/08/15 Javascript
使用indexOf等在JavaScript的数组中进行元素查找和替换
2013/09/18 Javascript
node.js入门教程迷你书、node.js入门web应用开发完全示例
2014/04/06 Javascript
推荐25个超炫的jQuery网格插件
2014/11/28 Javascript
判断浏览器的内核及版本号方法汇总
2015/01/05 Javascript
JS实现的自定义右键菜单实例二则
2015/09/01 Javascript
AngularJS ng-repeat指令中使用track by子语句解决重复数据遍历错误问题
2017/01/21 Javascript
JavaScript基本类型值-Number类型
2017/02/24 Javascript
jacascript DOM节点——元素节点、属性节点、文本节点
2017/04/18 Javascript
详解nodejs异步I/O和事件循环
2017/06/07 NodeJs
解决layui追加或者动态修改的表单元素“没效果”的问题
2019/09/18 Javascript
jQuery使用jsonp实现百度搜索的示例代码
2020/07/08 jQuery
js定时器出现第一次延迟的原因及解决方法
2021/01/04 Javascript
Python random模块(获取随机数)常用方法和使用例子
2014/05/13 Python
简单使用Python自动生成文章
2014/12/25 Python
Python中asyncio模块的深入讲解
2019/06/10 Python
Python类中的装饰器在当前类中的声明与调用详解
2020/04/15 Python
Python3压缩和解压缩实现代码
2021/03/01 Python
Luxplus丹麦:香水和个人护理折扣
2018/04/23 全球购物
一套.net面试题及答案
2016/11/02 面试题
搞笑获奖感言
2014/01/30 职场文书
司机检讨书
2014/02/13 职场文书
大学军训感言1000字
2014/02/25 职场文书
保送生自荐信
2015/03/06 职场文书
2015年科研工作总结范文
2015/05/13 职场文书
感恩老师主题班会
2015/08/12 职场文书
Python+uiautomator2实现自动刷抖音视频功能
2021/04/29 Python
JS如何使用剪贴板操作Clipboard API
2021/05/17 Javascript
总结Python变量的相关知识
2021/06/28 Python