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中的__init__ 、__new__、__call__小结
Apr 25 Python
Python struct模块解析
Jun 12 Python
Python实现代码统计工具(终极篇)
Jul 04 Python
浅谈python中的变量默认是什么类型
Sep 11 Python
Python中文分词工具之结巴分词用法实例总结【经典案例】
Apr 15 Python
Python拼接字符串的7种方法总结
Nov 01 Python
Python3对称加密算法AES、DES3实例详解
Dec 06 Python
Python设计模式之外观模式实例详解
Jan 17 Python
tensorflow之tf.record实现存浮点数数组
Feb 17 Python
python将字典内容写入json文件的实例代码
Aug 12 Python
通过Django Admin+HttpRunner1.5.6实现简易接口测试平台
Nov 11 Python
python超详细实现完整学生成绩管理系统
Mar 17 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操作redis缓存方法分享
2015/06/03 PHP
PHP简单生成缩略图相册的方法
2015/07/29 PHP
前端必学之PHP语法基础
2016/01/01 PHP
php字符串函数 str类常见用法示例
2020/05/15 PHP
BOOM vs RR BO5 第二场 2.14
2021/03/10 DOTA
jquery ajax提交整个表单元素的快捷办法
2013/03/27 Javascript
js获取GridView中行数据的两种方法 分享
2013/07/13 Javascript
返回上一页并自动刷新的JavaScript代码
2014/02/19 Javascript
js 定义对象数组(结合)多维数组方法
2016/07/27 Javascript
原生JS实现匀速图片轮播动画
2016/10/18 Javascript
JSP防止网页刷新重复提交数据的几种方法
2016/11/19 Javascript
nodejs操作mongodb的增删改查功能实例
2017/11/09 NodeJs
iView-admin 动态路由问题的解决方法
2018/10/03 Javascript
JavaScript this使用方法图解
2020/02/04 Javascript
JavaScript实现网页tab栏效果制作
2020/11/20 Javascript
[40:03]RNG vs VG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
python下函数参数的传递(参数带星号的说明)
2010/09/19 Python
python中实现php的var_dump函数功能
2015/01/21 Python
简单的Python的curses库使用教程
2015/04/11 Python
详解设计模式中的工厂方法模式在Python程序中的运用
2016/03/02 Python
python实现redis三种cas事务操作
2017/12/19 Python
解决reload(sys)后print失效的问题
2020/04/25 Python
Python如何将字符串转换为日期
2020/07/31 Python
如何编写python的daemon程序
2021/01/07 Python
经济实惠的豪华背包和行李袋:Packs Project
2018/10/17 全球购物
中职生自荐信
2013/10/13 职场文书
电子装配专业毕业生求职信
2014/04/23 职场文书
负责人任命书范本
2014/06/04 职场文书
学前班幼儿评语大全
2014/12/29 职场文书
同事欢送会致辞
2015/07/31 职场文书
小学教师教学随笔
2015/08/14 职场文书
子女赡养老人协议书
2016/03/23 职场文书
2019广播稿怎么写
2019/04/17 职场文书
一篇合格的广告文案,其主要目的是什么?
2019/07/12 职场文书
MySQL 自定义变量的概念及特点
2021/05/13 MySQL
Python中else的三种使用场景
2021/06/16 Python