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 相关文章推荐
python3抓取中文网页的方法
Jul 28 Python
python实现将内容分行输出
Nov 05 Python
Python语言实现获取主机名根据端口杀死进程
Mar 31 Python
Python基于Socket实现的简单聊天程序示例
Aug 05 Python
python 不以科学计数法输出的方法
Jul 16 Python
Python发送邮件功能示例【使用QQ邮箱】
Dec 04 Python
pandas dataframe的合并实现(append, merge, concat)
Jun 24 Python
Django在pycharm下修改默认启动端口的方法
Jul 26 Python
Django框架中序列化和反序列化的例子
Aug 06 Python
Django 拆分model和view的实现方法
Aug 16 Python
python 二维矩阵转三维矩阵示例
Nov 30 Python
python实现单机五子棋
Aug 28 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框架的优缺点对比分析
2014/12/25 PHP
thinkphp多层MVC用法分析
2015/12/30 PHP
Zend Framework实现Zend_View集成Smarty模板系统的方法
2016/03/05 PHP
php+ajax+json 详解及实例代码
2016/12/12 PHP
php的PDO事务处理机制实例分析
2017/02/16 PHP
PHP绕过open_basedir限制操作文件的方法
2018/06/10 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
2020/02/27 PHP
JavaScript splice()方法详解
2020/09/22 Javascript
js中的布尔运算符使用介绍
2013/11/20 Javascript
js写的方法实现上传图片之后查看大图
2014/03/05 Javascript
html5+javascript制作简易画板附图
2014/04/25 Javascript
JavaScript中连接操作Oracle数据库实例
2015/04/02 Javascript
jquery实现的Banner广告收缩效果代码
2015/09/02 Javascript
表单验证插件Validation应用的实例讲解
2015/10/10 Javascript
javascript中checkbox使用方法简单实例演示
2015/11/17 Javascript
js+html5操作sqlite数据库的方法
2016/02/02 Javascript
jQuery实现输入框邮箱内容自动补全与上下翻动显示效果【附demo源码下载】
2016/09/20 Javascript
python重试装饰器示例
2014/02/11 Python
Python BeautifulSoup中文乱码问题的2种解决方法
2014/04/22 Python
python中lambda函数 list comprehension 和 zip函数使用指南
2014/09/28 Python
Python运算符重载用法实例
2015/05/28 Python
python实现二维码扫码自动登录淘宝
2016/12/27 Python
老生常谈Python startswith()函数与endswith函数
2017/09/08 Python
python skimage 连通性区域检测方法
2018/06/21 Python
对python中的try、except、finally 执行顺序详解
2019/02/18 Python
详解Django定时任务模块设计与实践
2019/07/24 Python
使用Python实现Wake On Lan远程开机功能
2020/01/22 Python
python实现井字棋小游戏
2020/03/04 Python
为什么是 Python -m
2020/06/19 Python
python正则表达式的懒惰匹配和贪婪匹配说明
2020/07/13 Python
多重CSS背景动画实现方法示例
2014/04/04 HTML / CSS
德国最大的网上足球商店:11teamsports
2019/09/11 全球购物
如何清空Session
2015/02/23 面试题
初入社会应届生求职信
2013/11/18 职场文书
物业保安岗位职责
2014/07/02 职场文书
《英雄联盟》2022日蚀、月蚀皮肤演示 黑潮亚索曝光
2022/04/13 其他游戏