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类的基础入门知识
Nov 24 Python
详细解析Python中__init__()方法的高级应用
May 11 Python
Python环境下安装使用异步任务队列包Celery的基础教程
May 07 Python
Python3.x对JSON的一些操作示例
Sep 01 Python
Python之web模板应用
Dec 26 Python
Python实现的爬取网易动态评论操作示例
Jun 06 Python
python 自动批量打开网页的示例
Feb 21 Python
Python使用Pandas库实现MySQL数据库的读写
Jul 06 Python
Python实现代码统计工具
Sep 19 Python
Django中文件上传和文件访问微项目的方法
Apr 27 Python
Python实现删除某列中含有空值的行的示例代码
Jul 20 Python
python3.9之你应该知道的新特性详解
Apr 29 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
SONY SRF-40W电路分析
2021/03/02 无线电
PHP脚本数据库功能详解(下)
2006/10/09 PHP
ezSQL PHP数据库操作类库
2010/05/16 PHP
PHP函数preg_match_all正则表达式的基本使用详细解析
2013/08/31 PHP
destoon常用的安全设置概述
2014/06/21 PHP
浅析PHP中Session可能会引起并发问题
2015/07/23 PHP
PHP读取大文件的几种方法介绍
2016/10/27 PHP
对laravel的session获取与存取方法详解
2019/10/08 PHP
php 命名空间(namespace)原理与用法实例小结
2019/11/13 PHP
JS延迟加载(setTimeout) JS最后加载
2010/07/15 Javascript
关于this和self的使用说明
2010/08/01 Javascript
基于jquery跨浏览器显示的file上传控件
2011/10/24 Javascript
Javascript中的getUTCDay()方法使用详解
2015/06/10 Javascript
jQuery插件jquery.kxbdmarquee.js实现无缝滚动效果
2017/02/15 Javascript
对layui中表单元素的使用详解
2018/08/15 Javascript
Node.js动手撸一个静态资源服务器的方法
2019/03/09 Javascript
JS document内容及样式操作完整示例
2020/01/14 Javascript
十个Python程序员易犯的错误
2015/12/15 Python
Python入门_浅谈数据结构的4种基本类型
2017/05/16 Python
完美解决安装完tensorflow后pip无法使用的问题
2018/06/11 Python
Python OpenCV处理图像之图像直方图和反向投影
2018/07/10 Python
Python3 利用requests 库进行post携带账号密码请求数据的方法
2018/10/26 Python
安装docker-compose的两种最简方法
2019/07/30 Python
Python 解析pymysql模块操作数据库的方法
2020/02/18 Python
opencv+pyQt5实现图片阈值编辑器/寻色块阈值利器
2020/11/13 Python
日本高端护肤品牌:Tatcha
2016/08/29 全球购物
2014年创卫实施方案
2014/02/18 职场文书
商务日语专业毕业生自荐信
2014/03/27 职场文书
英语教研活动总结
2014/07/02 职场文书
乡镇党的群众路线教育实践活动总结报告
2014/10/30 职场文书
2014年行政部工作总结
2014/11/19 职场文书
专家推荐信怎么写
2015/03/25 职场文书
飞越疯人院观后感
2015/06/09 职场文书
幼儿园保教工作总结2015
2015/10/15 职场文书
python中redis包操作数据库的教程
2022/04/19 Python
vue 把二维或多维数组转一维数组
2022/04/24 Vue.js