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代码来绘制彭罗斯点阵的教程
Apr 03 Python
Python和Perl绘制中国北京跑步地图的方法
Mar 03 Python
python3批量删除豆瓣分组下的好友的实现代码
Jun 07 Python
对python过滤器和lambda函数的用法详解
Jan 21 Python
python opencv判断图像是否为空的实例
Jan 26 Python
在python image 中安装中文字体的实现方法
Aug 22 Python
python多线程高级锁condition简单用法示例
Nov 07 Python
简单了解python元组tuple相关原理
Dec 02 Python
Python.append()与Python.expand()用法详解
Dec 18 Python
完美解决TensorFlow和Keras大数据量内存溢出的问题
Jul 03 Python
windows安装python超详细图文教程
May 21 Python
基于PyTorch实现一个简单的CNN图像分类器
May 29 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 mysql索引问题
2008/06/07 PHP
PHP编码转换
2012/11/05 PHP
CL vs ForZe BO5 第二场 2.13
2021/03/10 DOTA
IE8下关于querySelectorAll()的问题
2010/05/13 Javascript
Jquery数独游戏解析(一)-页面布局
2010/11/05 Javascript
JS实现简单的顶部定时关闭层效果
2014/06/15 Javascript
Firefox下无法正常显示年份的解决方法
2014/09/04 Javascript
Jquery实现仿腾讯微博发表广播
2014/11/17 Javascript
javascript设计模式之中介者模式Mediator
2014/12/30 Javascript
用js判断是否为360浏览器的实现代码
2015/01/15 Javascript
javascript实现随时变化着的背景颜色
2015/04/02 Javascript
jQuery实现根据滚动条位置加载相应内容功能
2016/07/18 Javascript
js检测离开或刷新页面时表单数据是否更改的方法
2016/08/02 Javascript
jQuery绑定事件的四种方式介绍
2016/10/31 Javascript
Vue实现路由跳转和嵌套
2017/06/20 Javascript
javascript实现遮罩层动态效果实例
2019/05/14 Javascript
layui 关闭open弹出框 刷新table表格页面的方法
2019/09/16 Javascript
javascript 原型与原型链的理解及实例分析
2019/11/23 Javascript
jQuery实现聊天对话框
2020/02/08 jQuery
[01:06:32]DOTA2上海特级锦标赛D组资格赛#1 EG VS VP第一局
2016/02/28 DOTA
用pickle存储Python的原生对象方法
2017/04/28 Python
Python实现公历(阳历)转农历(阴历)的方法示例
2017/08/22 Python
Python爬虫_城市公交、地铁站点和线路数据采集实例
2018/01/10 Python
用pycharm开发django项目示例代码
2018/10/24 Python
python 输入一个数n,求n个数求乘或求和的实例
2018/11/13 Python
Python3爬虫爬取英雄联盟高清桌面壁纸功能示例【基于Scrapy框架】
2018/12/05 Python
eclipse创建python项目步骤详解
2019/05/10 Python
python使用布隆过滤器的实现示例
2020/08/20 Python
写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度
2015/11/18 面试题
什么是属性访问器
2015/10/26 面试题
大唐面试试题(CPU,UNIX等等)
2012/01/11 面试题
股权转让协议书范本
2014/04/12 职场文书
厨师个人自我鉴定范文
2014/04/19 职场文书
安全责任协议书
2014/04/21 职场文书
如何书写先进事迹材料?
2019/07/02 职场文书
提高系统的吞吐量解决数据库重复写入问题
2022/04/23 MySQL