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 26 Python
Python写的一个简单DNS服务器实例
Jun 04 Python
Python对象转JSON字符串的方法
Apr 27 Python
Python中shape计算矩阵的方法示例
Apr 21 Python
Python cookbook(数据结构与算法)将多个映射合并为单个映射的方法
Apr 19 Python
在ubuntu16.04中将python3设置为默认的命令写法
Oct 31 Python
python 判断矩阵中每行非零个数的方法
Jan 26 Python
mac系统下Redis安装和使用步骤详解
Jul 09 Python
python matplotlib如何给图中的点加标签
Nov 14 Python
python中怎么表示空值
Jun 19 Python
Python使用文件操作实现一个XX信息管理系统的示例
Jul 02 Python
Python Pandas pandas.read_sql_query函数实例用法分析
Jun 21 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 array_filter除去数组中的空字符元素
2020/06/21 PHP
简介PHP的Yii框架中缓存的一些高级用法
2016/03/29 PHP
ThinkPHP模板标签eq if 中区分0,null,false的方法
2017/03/24 PHP
firefox和IE系列的相关区别整理 以备后用
2009/12/28 Javascript
基于IE下ul li 互相嵌套时的bug,排查,解决过程以及心得介绍
2013/05/07 Javascript
JavaScript中扩展Array contains方法实例
2020/08/23 Javascript
浅谈javascript语法和定时函数
2015/05/03 Javascript
js实现图片无缝滚动特效
2020/03/19 Javascript
简单实现jQuery进度条轮播实例代码
2016/06/20 Javascript
深入解析桶排序算法及Node.js上JavaScript的代码实现
2016/07/06 Javascript
jQuery模拟Marquee实现无缝滚动效果完整实例
2016/09/29 Javascript
vue中七牛插件使用的实例代码
2017/07/28 Javascript
jQuery中extend函数简单用法示例
2017/10/11 jQuery
Vue的实例、生命周期与Vue脚手架(vue-cli)实例详解
2017/12/27 Javascript
详解关于Vue版本不匹配问题(Vue packages version mismatch)
2018/09/17 Javascript
node读写Excel操作实例分析
2019/11/06 Javascript
JS桶排序的简单理解与实现方法示例
2019/11/25 Javascript
JavaScript 浏览器对象模型BOM原理与常见用法实例分析
2019/12/16 Javascript
[01:57]2016完美“圣”典风云人物:国士无双专访
2016/12/04 DOTA
Python动态赋值的陷阱知识点总结
2019/03/17 Python
树莓派与PC端在局域网内运用python实现即时通讯
2019/06/22 Python
HTML5 拖拽批量上传文件的示例代码
2018/03/28 HTML / CSS
在html5的Canvas上绘制椭圆的几种方法总结
2013/01/07 HTML / CSS
探索HTML5本地存储功能运用技巧
2016/03/02 HTML / CSS
前端H5 Video常见使用场景简介
2020/08/21 HTML / CSS
美国精品地毯网站:Boutique Rugs
2020/03/04 全球购物
类和结构的区别
2012/08/15 面试题
建筑总经理岗位职责
2014/02/02 职场文书
演讲稿格式范文
2014/05/19 职场文书
党员学习党的群众路线思想汇报(5篇)
2014/09/10 职场文书
反四风个人对照检查材料思想汇报
2014/09/25 职场文书
工作能力自我评价2015
2015/03/05 职场文书
本科毕业论文答辩稿
2015/06/23 职场文书
创业计划书之宠物店
2019/09/19 职场文书
《西游记》读后感(3篇)
2019/09/20 职场文书
SONY AN-LP1 短波有源天线放大器
2021/04/22 无线电