1.先解释什么叫IoU(intersection-over-union)。IoU表示(A∩B)/(A∪B) 即交并比。 非极大值抑制:图一 ——> 图二 ,剔除同一个目标上的重叠建议框,最终一个目标保留一个得分最高的建议框。

图一
图二

2.那么如何实现非极大值抑制呢?步骤如下(假设进行非极大值抑制的输入为2000x20的矩阵,2000表示该图像上框的个数,20表示类别数):

① 对2000×20维矩阵中每列按从大到小进行排序(每列表示一类,共20类。同一类可能有多个目标,如上图有两个人);

② 从每列最大的得分建议框开始,分别与该列后面的得分建议框进行IoU计算,若IoU>阈值,则剔除得分较小的建议框,否则认为图像中同一类物体有多个目标;[两个同类的目标的建议框基本不会有重叠,因此去掉建议框重叠较大的实际上是实现了剔除同一个目标的重叠框]

③ 从每列次大的得分建议框开始,重复步骤②;

④ 重复步骤③直到遍历完该列所有建议框;

⑤ 遍历完2000×20维矩阵所有列,即所有物体种类都做一遍非极大值抑制;

3.代码实现如下,也可以在我的github上下载:https://github.com/hiJulie/NMS

import numpy as np
import random
import cv2def non_max_suppress(predicts_dict, threshold):for object_name, bbox in predicts_dict.items():#对每一个类别分别进行NMS;一次读取一对键值(即某个类别的所有框)bbox_array = np.array(bbox, dtype=np.float)#下面分别获取框的左上角坐标(x1,y1),右下角坐标(x2,y2)及此框的置信度;这里需要注意的是图像左上角可以看做坐标点(0,0),右下角可以看做坐标点(1,1),也就是说从左往右x值增大,从上往下y值增大x1 = bbox_array[:, 0]y1 = bbox_array[:, 1]x2 = bbox_array[:, 2]y2 = bbox_array[:, 3]scores = bbox_array[:, 4]order = scores.argsort()[::-1]#argsort函数返回的是数组值从小到大的索引值,[::-1]表示取反。即这里返回的是数组值从大到小的索引值areas = (x2 - x1 + 1) * (y2 - y1 + 1)#当前类所有框的面积(python会自动使用广播机制,相当于MATLAB中的.*即两矩阵对应元素相乘);x1=3,x2=5,习惯上计算x方向长度就是x=3、4、5这三个像素,即5-3+1=3,而不是5-3=2,所以需要加1keep = []#按confidence从高到低遍历bbx,移除所有与该矩形框的IoU值大于threshold的矩形框while order.size > 0:i = order[0]keep.append(i)#保留当前最大confidence对应的bbx索引#获取所有与当前bbx的交集对应的左上角和右下角坐标,并计算IoU(注意这里是同时计算一个bbx与其他所有bbx的IoU)xx1 = np.maximum(x1[i], x1[order[1:]])#最大置信度的左上角坐标分别与剩余所有的框的左上角坐标进行比较,分别保存较大值;因此这里的xx1的维数应该是当前类的框的个数减1yy1 = np.maximum(y1[i], y1[order[1:]])xx2 = np.minimum(x2[i], x2[order[1:]])yy2 = np.minimum(y2[i], y2[order[1:]])inter = np.maximum(0.0, xx2-xx1+1) * np.maximum(0.0, yy2-yy1+1)iou = inter / (areas[i] + areas[order[1:]] - inter)#注意这里都是采用广播机制,同时计算了置信度最高的框与其余框的IoUinds = np.where(iou <= threshold)[0]#保留iou小于等于阙值的框的索引值order = order[inds + 1]#将order中的第inds+1处的值重新赋值给order;即更新保留下来的索引,加1是因为因为没有计算与自身的IOU,所以索引相差1,需要加上bbox = bbox_array[keep]predicts_dict[object_name] = bbox.tolist()#predicts_dict = predicts_dictreturn predicts_dict#下面在一张全黑图片上测试非极大值抑制的效果
img = np.zeros((600,600), np.uint8)
#predicts_dict = {'black1': [[83, 54, 165, 163, 0.8], [67, 48, 118, 132, 0.5], [91, 38, 192, 171, 0.6]]}
predicts_dict = {'black1': [[83, 54, 165, 163, 0.8], [67, 48, 118, 132, 0.5], [91, 38, 192, 171, 0.6]], 'black2': [[59, 120, 137, 368, 0.12], [54, 154, 148, 382, 0.13]] }
#在全黑的图像上画出设定的几个框
for object_name, bbox in predicts_dict.items():for box in bbox:x1, y1, x2, y2, score = box[0], box[1], box[2], box[3], box[-1]y_text = int(random.uniform(y1, y2))# uniform()是不能直接访问的,需要导入 random 模块,然后通过 random 静态对象调用该方法。uniform() 方法将随机生成下一个实数,它在 [x, y) 范围内cv2.rectangle(img, (x1, y1), (x2, y2), (255, 255, 255), 2)cv2.putText(img, str(score), (x2 - 30, y_text), 2, 1, (255, 255, 0))cv2.namedWindow("black1_roi")# 创建一个显示图像的窗口cv2.imshow("black1_roi", img)# 在窗口中显示图像;注意这里的窗口名字如果不是刚刚创建的窗口的名字则会自动创建一个新的窗口并将图像显示在这个窗口cv2.waitKey(0)# 如果不添这一句,在IDLE中执行窗口直接无响应。在命令行中执行的话,则是一闪而过。cv2.destroyAllWindows()  # 最后释放窗口是个好习惯!#在全黑图片上画出经过非极大值抑制后的框
img_cp = np.zeros((600,600), np.uint8)
predicts_dict_nms = non_max_suppress(predicts_dict, 0.1)
for object_name, bbox in predicts_dict_nms.items():for box in bbox:x1, y1, x2, y2, score = int(box[0]), int(box[1]), int(box[2]), int(box[3]), box[-1]y_text = int(random.uniform(y1, y2))# uniform()是不能直接访问的,需要导入 random 模块,然后通过 random 静态对象调用该方法。uniform() 方法将随机生成下一个实数,它在 [x, y) 范围内cv2.rectangle(img_cp, (x1, y1), (x2, y2), (255, 255, 255), 2)cv2.putText(img_cp, str(score), (x2 - 30, y_text), 2, 1, (255, 255, 0))cv2.namedWindow("black1_nms")# 创建一个显示图像的窗口cv2.imshow("black1_nms", img_cp)# 在窗口中显示图像;注意这里的窗口名字如果不是刚刚创建的窗口的名字则会自动创建一个新的窗口并将图像显示在这个窗口cv2.waitKey(0)# 如果不添这一句,在IDLE中执行窗口直接无响应。在命令行中执行的话,则是一闪而过。cv2.destroyAllWindows()  # 最后释放窗口是个好习惯!

参考博客:

非极大值抑制(nms)算法功能及python实现 - CSDN博客

目标定位和检测系列(3):交并比(IOU)和非极大值抑制(NMS)的python实现 - CSDN博

array python 交集_NMS原理(非极大值抑制)+python实现相关推荐

  1. MNS(非极大值抑制)python实现

    理论参考:https://blog.csdn.net/a1103688841/article/details/89711120 源码: import numpy as npdef py_cpu_nms ...

  2. 非极大值抑制(Non-maximum suppression)在物体检测领域的应用

    转载自:http://blog.csdn.net/pb09013037/article/details/45477591 一.Nms主要目的 在物体检测非极大值抑制应用十分广泛,主要目的是为了消除多余 ...

  3. MTCNN中的重叠度IOU和非极大值抑制NMS原理及Python实现

    MTCNN中的重叠度IOU和非极大值抑制NMS原理及Python实现 一.重叠度iou 从在一张照片上框人脸时,因为图像金字塔的原因可能会把人脸框两次以上,每个框的坐标为[X1,Y1X2,Y2,C], ...

  4. 目标定位和检测系列:交并比(IOU)和非极大值抑制(NMS)的python与C/C++实现

    Python实现 交并比(Intersection over Union)和非极大值抑制是(Non-Maximum Suppression)是目标检测任务中非常重要的两个概念.例如在用训练好的模型进行 ...

  5. Shi-tomasi角点检测python实现及基于opencv实现 (角点检测、非极大值抑制)

    写在前面: 已经是七月中旬,黄宁然,你依然在这里. 参考文献镇楼: [1]龚思宇宙,基于平面模板的摄像机标定及相关技术研究 [2]汪洋,扫地机器人定位算法设计与嵌入式系统实现 [3]Denny#,[o ...

  6. 非极大值抑制(nms)算法详解[python]

    一.起源 目标检测在使用了基于深度学习的端到端模型后效果斐然.目前,常用的目标检测算法,无论是One-stage的SSD系列算法.YOLO系列算法还是Two-stage的基于RCNN系列的算法,非极大 ...

  7. 在Python中用cupy实现IoU(交并比)和NMS(非极大值抑制)的GPU加速

    1. 前言 IoU(交并比)和NMS(非极大值抑制)的计算在目标检测任务中可以说是必不可少的,但是当需要计算的bounding box的数量级很大的时候,cpu就吃不消了.例如在对Faster RCN ...

  8. Susan角点检测python实现 (边缘检测、角点检测、重心计算、非极大值抑制)

    Susan角点检测(边缘检测.角点检测.重心计算.非极大值抑制) 写在前面 黄宁然--看过你看过的算法,觉得好难. 参考文献镇楼 [1]https://blog.csdn.net/tostq/arti ...

  9. NMS(非极大值抑制)的python,cpu,gpu实现

    必要性 NMS(非极大值抑制)是目标检测中用来确定最佳检测框的手段,根据目标检测流程,若果没有NMS步骤,其每个检测框都会有大量重叠度很高的预测框表示同一个目标.如下图: 左图为经过NMS的预测结果, ...

最新文章

  1. DeepSpeed超大规模模型训练工具
  2. Docker入门简介
  3. 关联规则算法php,科学网—加权关联规则权值的计算 - 叶文菁的博文
  4. ssm提交post_我用spring mvc做,用post方式提交,后台获取不到参数值,用get方式就可以,什么问题...
  5. asp.net core 从 3.0 到 3.1
  6. IDEA Maven 聚合项目(多模块)搭建--最精简
  7. phantom物料 issue
  8. html静态页面实现微信分享思路
  9. Python套接字编程(1)——socket模块与套接字编程
  10. java做航空购票系统_基于JAVA的航空订票系统
  11. SpringBoot整合Selenium
  12. [1034]安装Xposed框架+JustTrustMe
  13. 如何快速成为数据分析师
  14. QC1.0、QC2.0、QC3.0、QC4.0协议介绍
  15. win+shift+s截图保存在哪_用惯了QQ/微信截图,你不知道的截图神器还有这个
  16. 一篇文章带你入门python基础开发
  17. java中为什么要用json_Java中json的使用和解析
  18. Requirement already satisfied问题
  19. 贴出最新整理的英语谚语大全(3267条)
  20. 运动蓝牙耳机哪个品牌最好、运动蓝牙耳机排行榜推荐

热门文章

  1. 浅谈工作流引擎的几个关键因素
  2. ubuntu 编译安装php mysql_ubuntu编译安装php5 mysql nginx
  3. python中的join函数连接dataframe_python pandas DataFrame.join用法及代码示例
  4. 使用iso升级_华佗品牌战略升级 彰显百年品质-产经要闻
  5. html任务清单源码,JavaScript jQuery 任务清单 ToDoList
  6. 【UWB】数学建模 E 题目个人解题答案 - 2021年第十八届华为杯
  7. 【S操作】综合利用腾讯文档、OneDrive、印象笔记evernote、有道云笔记等各种云工具,轻松实现数据云存储及多重备份...
  8. andy the android ppt,新概念同步测试1.ppt
  9. 【声源定位】 球面散乱数据插值方法/似然估计hybrid spherical interpolation/maximum likelihood (SI/ML) 麦克风阵列声源定位
  10. dyld: Library not loaded: @rpath/Alamofire.framework/Alamofire