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 相关文章推荐
python3.3教程之模拟百度登陆代码分享
Jan 16 Python
通过C++学习Python
Jan 20 Python
Python下的twisted框架入门指引
Apr 15 Python
Python中使用haystack实现django全文检索搜索引擎功能
Aug 26 Python
TensorFlow实现简单卷积神经网络
May 24 Python
详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)
Jul 01 Python
Python使用线程来接收串口数据的示例
Jul 02 Python
Django RBAC权限管理设计过程详解
Aug 06 Python
python如何基于redis实现ip代理池
Jan 17 Python
pycharm中选中一个单词替换所有重复单词的实现方法
Nov 17 Python
Python的信号库Blinker用法详解
Dec 31 Python
python源码剖析之PyObject详解
May 18 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
利用static实现表格的颜色隔行显示的代码
2007/09/02 PHP
基于PHP的简单采集数据入库程序
2014/07/30 PHP
常见php数据文件缓存类汇总
2014/12/05 PHP
Linux系统中为php添加pcntl扩展
2016/08/28 PHP
JQuery index()方法使用代码
2010/06/02 Javascript
用JQuery实现表格隔行变色和突出显示当前行的代码
2012/02/10 Javascript
javascript真的不难-回顾一下基础知识
2013/01/15 Javascript
jQuery实现的登录浮动框效果代码
2015/09/26 Javascript
jQuery中serializeArray()与serialize()的区别实例分析
2015/12/09 Javascript
在线引用最新jquery文件的实现方法
2016/08/26 Javascript
JS IOS/iPhone的Safari浏览器不兼容Javascript中的Date()问题如何解决
2016/11/11 Javascript
前端编码规范(3)JavaScript 开发规范
2017/01/21 Javascript
JavaScript的setter与getter方法
2017/11/29 Javascript
angularjs请求数据的方法示例
2019/08/06 Javascript
electron踩坑之dialog中的callback解决
2020/10/06 Javascript
vue3+typescript实现图片懒加载插件
2020/10/26 Javascript
Python set集合类型操作总结
2014/11/07 Python
Python字符串替换实例分析
2015/05/11 Python
基于python脚本实现软件的注册功能(机器码+注册码机制)
2016/10/09 Python
Python3.6正式版新特性预览
2016/12/15 Python
Python中实例化class的执行顺序示例详解
2018/10/14 Python
python调用其他文件函数或类的示例
2019/07/16 Python
django框架创建应用操作示例
2019/09/26 Python
CSS3弹性盒模型开发笔记(一)
2016/04/26 HTML / CSS
socket.io 和canvas 实现的共享画板功能
2019/05/22 HTML / CSS
EVE LOM英国官网:全世界最好的洁面膏
2017/10/30 全球购物
标签和贴纸印刷:Lightning Labels
2018/03/22 全球购物
美国家居装饰和豪华家具购物网站:One Kings Lane
2018/12/24 全球购物
美国花园雕像和家居装饰网上商店:Design Toscano
2019/03/09 全球购物
No7 Beauty美国官网:英国国民护肤品牌
2019/10/31 全球购物
.NET程序员的几道面试题
2012/06/01 面试题
网络工程师的自我评价
2013/10/02 职场文书
大学生标准自荐书
2014/06/15 职场文书
2015年行政人事部工作总结
2015/05/13 职场文书
运动会口号霸气押韵
2015/12/24 职场文书
Python 第三方库 openpyxl 的安装过程
2022/12/24 Python