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实现简单登录验证
Apr 13 Python
Python 数据结构之堆栈实例代码
Jan 22 Python
Python中is与==判断的区别
Mar 28 Python
浅谈使用Python内置函数getattr实现分发模式
Jan 22 Python
python爬虫框架scrapy实现模拟登录操作示例
Aug 02 Python
python脚本当作Linux中的服务启动实现方法
Jun 28 Python
使用pip安装python库的多种方式
Jul 31 Python
centos7中安装python3.6.4的教程
Dec 11 Python
Tensorflow实现多GPU并行方式
Feb 03 Python
Python实现像awk一样分割字符串
Sep 15 Python
python opencv肤色检测的实现示例
Dec 21 Python
Python多个MP4合成视频的实现方法
Jul 16 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
如何删除多级目录
2006/10/09 PHP
PHP开发入门教程之面向对象
2006/12/05 PHP
简单采集了yahoo的一些数据
2007/02/14 PHP
php模拟post行为代码总结(POST方式不是绝对安全)
2012/02/22 PHP
一个经典实用的PHP图像处理类分享
2014/11/18 PHP
php操作mongoDB实例分析
2014/12/29 PHP
PHP二进制与字符串之间的相互转换教程
2016/10/14 PHP
基于ThinkPHP5.0实现图片上传插件
2017/09/25 PHP
使用js显示当前时间示例
2014/03/02 Javascript
JavaScript实现的内存数据库LokiJS介绍和入门实例
2014/11/17 Javascript
JavaScript的模块化开发框架Sea.js上手指南
2016/05/12 Javascript
jQuery配合coin-slider插件制作幻灯片效果的流程解析
2016/05/13 Javascript
初探Vue3.0 中的一大亮点Proxy的使用
2018/12/06 Javascript
基于vue实现一个神奇的动态按钮效果
2019/05/15 Javascript
Vue将页面导出为图片或者PDF
2020/08/17 Javascript
高性能js数组去重(12种方法,史上最全)
2019/12/21 Javascript
js实现弹窗效果
2020/08/09 Javascript
vue axios封装httpjs,接口公用配置拦截操作
2020/08/11 Javascript
纯js+css实现在线时钟
2020/08/18 Javascript
[01:00:52]2018DOTA2亚洲邀请赛 4.4 淘汰赛 EG vs LGD 第一场
2018/04/05 DOTA
python 用lambda函数替换for循环的方法
2018/06/09 Python
python求绝对值的三种方法小结
2019/12/04 Python
python3+opencv生成不规则黑白mask实例
2020/02/19 Python
django xadmin中form_layout添加字段显示方式
2020/03/30 Python
国际象棋商店:The Chess Store
2018/07/09 全球购物
Stokke美国官方网店:高级儿童家具、推车、汽车座椅和配件
2020/06/06 全球购物
高三体育教学反思
2014/01/29 职场文书
旅游管理毕业生自荐信范文
2014/03/19 职场文书
团日活动总结怎么写
2014/06/25 职场文书
秋冬农业生产标语
2014/10/09 职场文书
2014年人大工作总结
2014/12/10 职场文书
小班上学期幼儿评语
2014/12/30 职场文书
公司股份转让协议书范本
2015/01/28 职场文书
2015年大学生暑期实习报告
2015/07/13 职场文书
JavaScript实现复选框全选功能
2021/04/11 Javascript
PyTorch device与cuda.device用法
2022/04/03 Python