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的几种开发工具介绍
Mar 07 Python
python通过urllib2爬网页上种子下载示例
Feb 24 Python
Python常用模块用法分析
Sep 08 Python
Python异常学习笔记
Feb 03 Python
python使用clear方法清除字典内全部数据实例
Jul 11 Python
Python实现批量压缩图片
Jan 25 Python
python脚本执行CMD命令并返回结果的例子
Aug 14 Python
Python3.9 beta2版本发布了,看看这7个新的PEP都是什么
Jun 10 Python
零基础学Python之前需要学c语言吗
Jul 21 Python
Python正则re模块使用步骤及原理解析
Aug 18 Python
Django利用elasticsearch(搜索引擎)实现搜索功能
Nov 26 Python
python中round函数保留两位小数的方法
Dec 04 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
DISCUZ在win2003环境下 Unable to access ./include/common.inc.php in... 的问题终极解决方案
2011/11/21 PHP
ThinkPHP实现非标准名称数据表快速创建模型的方法
2014/11/29 PHP
PHP flush 函数使用注意事项
2016/08/26 PHP
解决Yii2邮件发送结果返回成功,但接收不到邮件的问题
2017/05/23 PHP
Docker搭建自己的PHP开发环境
2018/02/24 PHP
PHP+mysql防止SQL注入的方法小结
2019/04/27 PHP
解决laravel id非自增 模型取回为0 的问题
2019/10/11 PHP
HTML页面如何象ASP一样接受参数
2007/02/07 Javascript
JS控制图片翻转示例代码(兼容firefox,ie,chrome)
2013/12/19 Javascript
jquery让指定的元素闪烁显示的方法
2015/03/17 Javascript
页面内容排序插件jSort使用方法
2015/10/10 Javascript
jQuery+jsp下拉框联动获取本地数据的方法(附源码)
2015/12/03 Javascript
详解javascript的变量与标识符
2016/01/04 Javascript
实例讲解JS中setTimeout()的用法
2016/01/28 Javascript
JavaScript蒙板(model)功能的简单实现代码
2016/08/04 Javascript
如何使用vuejs实现更好的Form validation?
2017/04/07 Javascript
JavaScript在控件上添加倒计时功能的实现代码
2017/07/04 Javascript
Vue.js项目模板搭建图文教程
2017/09/20 Javascript
JS实现横向轮播图(初级版)
2020/06/24 Javascript
解决Vue项目中tff报错的问题
2020/10/21 Javascript
[51:06]DOTA2-DPC中国联赛 正赛 Elephant vs Aster BO3 第二场 1月26日
2021/03/11 DOTA
Python获取电脑硬件信息及状态的实现方法
2014/08/29 Python
python实现域名系统(DNS)正向查询的方法
2016/04/19 Python
python实现搜索文本文件内容脚本
2018/06/22 Python
Python实现微信自动好友验证,自动回复,发送群聊链接方法
2019/02/21 Python
python tornado修改log输出方式
2019/11/18 Python
谈一谈数组拼接tf.concat()和np.concatenate()的区别
2020/02/07 Python
英国著名的茶叶品牌:Whittard of Chelsea
2016/09/22 全球购物
韩国11街:11STREET
2018/03/27 全球购物
BookOutlet加拿大:在网上书店购买廉价折扣图书和小说
2018/10/05 全球购物
初三学习决心书
2014/03/11 职场文书
新教师岗前培训方案
2014/06/05 职场文书
2019年个人工作总结范文
2019/03/25 职场文书
HashMap实现保存两个key相同的数据
2021/06/30 Java/Android
SQL CASE 表达式的具体使用
2022/03/21 SQL Server
《艾尔登法环》Boss腐烂树灵很有可能是《黑暗之魂3》的一个废案
2022/04/11 其他游戏