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中__call__方法示例分析
Oct 11 Python
python爬虫爬取快手视频多线程下载功能
Feb 28 Python
Django框架实现的简单分页功能示例
Dec 04 Python
python3 http提交json参数并获取返回值的方法
Dec 19 Python
详解python中递归函数
Apr 16 Python
PyTorch的深度学习入门之PyTorch安装和配置
Jun 27 Python
Python3 tkinter 实现文件读取及保存功能
Sep 12 Python
python 实现二维列表转置
Dec 02 Python
Python super()方法原理详解
Mar 31 Python
Python如何把字典写入到CSV文件的方法示例
Aug 23 Python
python 多线程中join()的作用
Oct 29 Python
利用python进行文件操作
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
Terran历史背景
2020/03/14 星际争霸
超外差式晶体管收音机的组装与统调
2021/03/01 无线电
php Undefined index的问题
2009/06/01 PHP
PHP 文件缓存的性能测试
2010/04/25 PHP
php小技巧 把数组的键和值交换形成了新的数组,查找值取得键
2011/06/02 PHP
给WordPress的编辑后台添加提示框的代码实例分享
2015/12/25 PHP
PHP基于单例模式实现的mysql类
2016/01/09 PHP
PHP遍历目录文件的常用方法小结
2017/02/03 PHP
PHP 对象继承原理与简单用法示例
2020/04/21 PHP
js获取电脑分辨率的思路及操作
2013/11/22 Javascript
JavaScript实现鼠标滑过图片变换效果的方法
2015/04/16 Javascript
jQuery实现弹出窗口中切换登录与注册表单
2015/06/05 Javascript
js实现上传并压缩图片效果
2018/01/10 Javascript
vue中使用iview自定义验证关键词输入框问题及解决方法
2018/03/26 Javascript
JavaScript设计模式之观察者模式(发布订阅模式)原理与实现方法示例
2018/07/27 Javascript
详解基于Vue,Nginx的前后端不分离部署教程
2018/12/04 Javascript
vue eslint简要配置教程详解
2019/07/26 Javascript
jQuery冲突问题解决方法
2021/01/19 jQuery
python实现bucket排序算法实例分析
2015/05/04 Python
Appium+python自动化怎么查看程序所占端口号和IP
2019/06/14 Python
Python实现疫情通定时自动填写功能(附代码)
2020/05/27 Python
pandas按照列的值排序(某一列或者多列)
2020/12/13 Python
Spartoo瑞典:鞋子、包包和衣服
2018/09/15 全球购物
Linux面试经常问的文件系统操作命令
2016/10/04 面试题
建筑专业自荐信
2013/10/18 职场文书
银行会计业务的个人自我评价
2013/11/02 职场文书
党员干部一句话承诺
2014/05/30 职场文书
2014年销售经理工作总结
2014/12/01 职场文书
2014年质量管理工作总结
2014/12/01 职场文书
工艺技术员岗位职责
2015/02/04 职场文书
质量保证书格式
2015/02/27 职场文书
2015年房产销售工作总结范文
2015/05/22 职场文书
学校元旦晚会开场白
2015/05/29 职场文书
家庭聚会祝酒词
2015/08/11 职场文书
医学生自荐信范文(2016精选篇)
2016/01/28 职场文书