python 实现非极大值抑制算法(Non-maximum suppression, NMS)

作者:农大鲁迅 时间:2021-01-18 21:46:20 

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

来源:https://www.jianshu.com/p/d2c7f6d9708f

标签:python,非极大值抑制算法,NMS
0
投稿

猜你喜欢

  • MYSQL教程:服务器优化和硬件优化

    2009-02-27 15:43:00
  • 用Mimer Validator检查SQL查询

    2024-01-24 17:12:01
  • python利用paramiko连接远程服务器执行命令的方法

    2021-07-19 01:07:34
  • Python+PyQt5自制监控小工具

    2023-09-14 10:52:31
  • selenium+headless chrome爬虫的实现示例

    2022-01-31 19:29:50
  • python基于watchdog库全自动化监控目录文件

    2022-04-21 19:17:47
  • django restframework serializer 增加自定义字段操作

    2023-12-17 20:36:10
  • ORACLE常用数值函数、转换函数、字符串函数

    2023-07-21 02:03:40
  • python 中关于pycharm选择运行环境的问题

    2021-09-01 21:56:10
  • asp测字符串长度及截取定长字符串汉字的处理

    2007-10-12 13:14:00
  • SQL Server数据库管理常用SQL和T-SQL语句

    2009-05-07 14:01:00
  • php中设置index.php文件为只读的方法

    2023-11-17 20:13:54
  • python实现登录与注册系统

    2022-04-26 02:32:38
  • python中pyplot直方图的绘制方式

    2023-11-20 07:58:17
  • python调用支付宝支付接口流程

    2022-01-15 14:04:45
  • 如何把URL和邮件地址自动转换为超级链接?

    2009-11-02 20:22:00
  • php floor()函数案例详解

    2023-06-14 16:13:03
  • 设计评论表单[译]

    2009-03-25 20:41:00
  • Python回文字符串及回文数字判定功能示例

    2022-05-09 21:59:30
  • Linux下为不同版本python安装第三方库

    2023-11-12 05:04:35
  • asp之家 网络编程 m.aspxhome.com