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 相关文章推荐
pygame学习笔记(1):矩形、圆型画图实例
Apr 15 Python
5款非常棒的Python工具
Jan 05 Python
Python基于pandas实现json格式转换成dataframe的方法
Jun 22 Python
pygame游戏之旅 载入小车图片、更新窗口
Nov 20 Python
python numpy 按行归一化的实例
Jan 21 Python
Python实现TCP通信的示例代码
Sep 09 Python
Python numpy.zero() 初始化矩阵实例
Nov 27 Python
nginx搭建基于python的web环境的实现步骤
Jan 03 Python
Python列表操作方法详解
Feb 09 Python
Python日期格式和字符串格式相互转换的方法
Feb 18 Python
Python是什么 Python的用处
May 26 Python
变长双向rnn的正确使用姿势教学
May 31 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
十大感人催泪爱情动漫 第一名至今不忍在看第二遍
2020/03/04 日漫
php排序算法(冒泡排序,快速排序)
2012/10/09 PHP
PHP CURL获取cookies模拟登录的方法
2013/11/04 PHP
php阿拉伯数字转中文人民币大写
2015/12/21 PHP
解决laravel 表单提交-POST 异常的问题
2019/10/15 PHP
javascript 出生日期和身份证判断大全
2008/11/13 Javascript
JavaScript几种形式的树结构菜单
2010/05/10 Javascript
网页打开自动最大化的js代码
2012/08/22 Javascript
JS中的prototype与面向对象的实例讲解
2013/05/22 Javascript
JSCode all of Brower 全局屏蔽网页右键功能 具体实现
2013/06/05 Javascript
Microsfot .NET Framework4.0框架 安装失败的解决方法
2013/08/14 Javascript
javascript动画算法实例分析
2015/07/31 Javascript
jQuery插件ajaxFileUpload使用详解
2017/01/10 Javascript
纯js实现图片匀速淡入淡出效果
2017/08/22 Javascript
JavaScript requestAnimationFrame动画详解
2017/09/14 Javascript
vueJs实现DOM加载完之后自动下拉到底部的实例代码
2018/08/31 Javascript
IDEA配置jQuery, $符号不再显示黄色波浪线的问题
2020/10/09 jQuery
python以环状形式组合排列图片并输出的方法
2015/03/17 Python
python获取点击的坐标画图形的方法
2019/07/09 Python
python科学计算之scipy——optimize用法
2019/11/25 Python
Python中实现输入超时及如何通过变量获取变量名
2020/01/18 Python
django模型动态修改参数,增加 filter 字段的方式
2020/03/16 Python
15款Python编辑器的优缺点,别再问我“选什么编辑器”啦
2020/10/19 Python
日本必酷网络直营店:Biccamera
2019/03/23 全球购物
意大利和国际奢侈品牌购物网站:Suitnegozi.com
2021/01/15 全球购物
商场端午节活动方案
2014/01/29 职场文书
同事吵架检讨书
2014/02/05 职场文书
超市重阳节活动方案
2014/02/10 职场文书
《在大海中永生》教学反思
2014/02/24 职场文书
禁止酒驾标语
2014/06/25 职场文书
建筑安全生产责任书
2014/07/22 职场文书
岳麓书院导游词
2015/02/03 职场文书
教师求职简历自我评价
2015/03/10 职场文书
中学生运动会广播稿
2015/08/19 职场文书
《孙子兵法》:欲成大事者,需读懂这些致胜策略
2019/08/23 职场文书
解决golang在import自己的包报错的问题
2021/04/29 Golang