声明:本文引用吴恩达教授的DeepLearning课程内容。

滑动窗出来的目标检测会产生多个目标检测结果,非极大值抑制这个方法可以确保你的算法对每个对象只检测一次。下图为NMS过程:

看下面例子:

假设需要在这张图片里检测行人和汽车,可能会在上面放个 19×19 网格,理论上这辆车只有一个中点,所以它应该只被分配到一个格子里,左边的车子也只有一个中点,所以理论上应该只有一个格子做出有车的预测。

实践中当你运行对象分类和定位算法时,对于每个格子都运行一次,所以这个格子(编号 1)可能会认为这辆车中点应该在格子内部,这几个格子(编号 2、 3)也会这么认为。对于左边的车子也一样,所以不仅仅是这个格子,不仅这个格(编号 4)子会认为它里面有车,也许这个格子(编号 5)和这个格子(编号 6)也会,也许其他格子也会这么认为,觉得它们格子内有车。

所以,多个格子同时对同一目标预测,结果可能出现如下状况,一个目标被输出多个不同的检测结果。

接下来非极大值抑制就来解决这个问题:

非极大值抑制的方法是:先假设有6个矩形框,根据分类器的类别分类概率做排序,假设从小到大属于车辆的概率 分别为A、B、C、D、E、F。

1)从最大概率矩形框F开始,分别判断A~E与F的重叠度IOU是否大于某个设定的阈值;

2)假设B、D与F的重叠度超过阈值,那么就扔掉B、D;并标记第一个矩形框F,是我们保留下来的;

3)从剩下的矩形框A、C、E中,选择概率最大的E,然后判断E与A、C的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框。

就这样一直重复,找到所有被保留下来的矩形框。

python实现的单类别nms:py_cpu_nms.py。

import cv2
import numpy as npdef nms(bounding_boxes, confidence_score, threshold):# If no bounding boxes, return empty listif len(bounding_boxes) == 0:return [], []# Bounding boxesboxes = np.array(bounding_boxes)# coordinates of bounding boxesstart_x = boxes[:, 0]start_y = boxes[:, 1]end_x = boxes[:, 2]end_y = boxes[:, 3]# Confidence scores of bounding boxesscore = np.array(confidence_score)# Picked bounding boxespicked_boxes = []picked_score = []# Compute areas of bounding boxesareas = (end_x - start_x + 1) * (end_y - start_y + 1)# Sort by confidence score of bounding boxesorder = np.argsort(score)# Iterate bounding boxeswhile order.size > 0:# The index of largest confidence scoreindex = order[-1]# Pick the bounding box with largest confidence scorepicked_boxes.append(bounding_boxes[index])picked_score.append(confidence_score[index])# Compute ordinates of intersection-over-union(IOU)x1 = np.maximum(start_x[index], start_x[order[:-1]])x2 = np.minimum(end_x[index], end_x[order[:-1]])y1 = np.maximum(start_y[index], start_y[order[:-1]])y2 = np.minimum(end_y[index], end_y[order[:-1]])# Compute areas of intersection-over-unionw = np.maximum(0.0, x2 - x1 + 1)h = np.maximum(0.0, y2 - y1 + 1)intersection = w * h# Compute the ratio between intersection and unionratio = intersection / (areas[index] + areas[order[:-1]] - intersection)left = np.where(ratio < threshold)order = order[left]return picked_boxes, picked_score

测试代码:

def test():# Image nameimage_name = 'nms.jpg'# Bounding boxesbounding_boxes = [(176, 75, 420, 400), (150, 42, 386, 342), (204, 108, 460, 374)]confidence_score = [0.9, 0.75, 0.8]# Read imageimage = cv2.imread(image_name)# Copy image as originalorg = image.copy()# Draw parametersfont = cv2.FONT_HERSHEY_SIMPLEXfont_scale = 1thickness = 2# IoU thresholdthreshold = 0.4# Draw bounding boxes and confidence scorefor (start_x, start_y, end_x, end_y), confidence in zip(bounding_boxes, confidence_score):(w, h), baseline = cv2.getTextSize(str(confidence), font, font_scale, thickness)cv2.rectangle(org, (start_x, start_y - (2 * baseline + 5)), (start_x + w, start_y), (0, 255, 255), -1)cv2.rectangle(org, (start_x, start_y), (end_x, end_y), (0, 255, 255), 2)cv2.putText(org, str(confidence), (start_x, start_y), font, font_scale, (0, 0, 0), thickness)# Run non-max suppression algorithmpicked_boxes, picked_score = nms(bounding_boxes, confidence_score, threshold)# Draw bounding boxes and confidence score after non-maximum supressionfor (start_x, start_y, end_x, end_y), confidence in zip(picked_boxes, picked_score):(w, h), baseline = cv2.getTextSize(str(confidence), font, font_scale, thickness)cv2.rectangle(image, (start_x, start_y - (2 * baseline + 5)), (start_x + w, start_y), (0, 255, 255), -1)cv2.rectangle(image, (start_x, start_y), (end_x, end_y), (0, 255, 255), 2)cv2.putText(image, str(confidence), (start_x, start_y), font, font_scale, (0, 0, 0), thickness)# Show imagecv2.imshow('Original', org)cv2.imshow('NMS', image)cv2.waitKey(20000)

结果:

非极大值抑制的流程如下:

1、根据置信度得分进行排序;

2、选择置信度最高的比边界框添加到最终输出列表中,将其从边界框列表中删除;

3、计算置信度最高的边界框与其它候选框的IoU;

4、删除IoU大于阈值的边界框;

5、重复2~4过程,直至边界框列表为空。

非极大值抑制( Non-max suppression)相关推荐

  1. 非极大值抑制(Non-Maximum Suppression,NMS)(转)

    概述 非极大值抑制(Non-Maximum Suppression,NMS),顾名思义就是抑制不是极大值的元素,可以理解为局部最大搜索.这个局部代表的是一个邻域,邻域有两个参数可变,一是邻域的维数,二 ...

  2. 深度学习之非极大值抑制(Non-maximum suppression,NMS)

    非极大值抑制(Non-maximum suppression,NMS)是一种去除非极大值的算法,常用于计算机视觉中的边缘检测.物体识别等. 算法流程 给出一张图片和上面许多物体检测的候选框(即每个框可 ...

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

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

  4. 非极大值抑制(non-maximum suppression)的理解与实现

    非极大抑制(Non-Maximum Suppression) Non-Maximum Suppression for Object Detection in Python RCNN 和微软提出的 SP ...

  5. 非极大值抑制(non-maximum suppression)的理解

    最近在学习RCNN时看到了非极大值抑制,一开始有点不明白,在网上学习了之后记录一下. 非极大值抑制就是一个寻找局部最大值的过程. 在进行目标检测时一般会采取窗口滑动的方式,在图像上生成很多的候选框,然 ...

  6. Non-Maximum Suppression,NMS非极大值抑制

    Non-Maximum Suppression,NMS非极大值抑制 概述 非极大值抑制(Non-Maximum Suppression,NMS),顾名思义就是抑制不是极大值的元素,可以理解为局部最大搜 ...

  7. 下拉多选择框 实现方式_非极大值抑制Non-Maximum Suppression(NMS)一文搞定理论+多平台实现...

    这是独立于薰风读论文的投稿,作为目标检测模型的拓展阅读,目的是帮助读者详细了解一些模型细节的实现. 薰风说 Non-Maximum Suppression的翻译是非"极大值"抑制, ...

  8. 风机桨叶故障诊断(七) 滑动窗与非极大值抑制NMS

    风机桨叶故障诊断(七)滑动窗与非极大值一直NMS 到目前为止,我已经利用自编码神经网络提取特征后训练得到了BP神经网络(参见:点击打开链接),且在测试样本集上表现不错.下面我们就要应用到实际中来检验算 ...

  9. 锚框、交并比和非极大值抑制(tf2.0源码解析)

    锚框.交并比和非极大值抑制(tf2.0源码解析) 文章目录 锚框.交并比和非极大值抑制(tf2.0源码解析) 一.锚框生成 1.锚框的宽高 2.锚框的个数 3.注意点(★★★) 4.tf2.0代码 二 ...

  10. 锚框的实现-非极大值抑制预测边界框

    大家好,我是阿林.由于各种原因,阿林的组会告吹了.所以阿林的锚框的最后一期非极大值抑制预测边界框提前发布. 我们来回顾一下前两期的内容,并和第三期做一个总结吧. 第一期 我们通过提取出整张图的高宽,利 ...

最新文章

  1. 《Ansible权威指南 》一 第一篇 Part 1 基础入门篇
  2. python中int表示的数据类型是_python中的基本数据类型之 int bool str
  3. SAP HUM已知一个内部HU号码,如何得到HU号码?
  4. android 状态栏和标题栏,Android隐藏状态栏和标题栏,相当于全屏效果
  5. string和json转换的简单应用
  6. Python os模块常用介绍
  7. java foreach 跳过本次循环_【Java】对foreach循环的思考
  8. 第十一节:基于MVC5+Spring.Net+EF+Log4net 传统的一种搭建模式
  9. 计算机A级作文,关于被计算机的作文(共一篇)-疾风作文网
  10. 99 网络编程_网络工程师技能图谱,看看你会多少技能
  11. golang 生成随机数
  12. python支持complex吗_Python中complex函数有什么用?
  13. 如何使用alt键+数字键盘上的数字键打出特殊符号
  14. Scala 集合 —— Array、Map、Seq、Set
  15. 2021-10-18word2vec训练过程
  16. Python项目实战-----科比数据集分析
  17. 批处理、批量复制文件:复制文件夹及子文件下所有特定文件,并且复制存在特定文件的子文件夹
  18. 用Jmeter分布式测试——多台电脑做压力测试
  19. 开源2周年,openGauss Developer Day 2022全程亮点回顾!
  20. 深入理解 BFC、IFC、GFC、FFC

热门文章

  1. 网络协议篇之CWMP协议(二)—— CWMP(TR-069)业务流程
  2. 2019软件测试最新视频教程大合集汇总
  3. AD域管理员账号下发
  4. python有什么游戏可以开发智力_用Python解“智力游戏”,你智商够吗?
  5. 卸载IE11到IE8(降级IE)
  6. Java项目:SSM校园共享自行车出租管理系统
  7. 摩尔斯电码对照表—Morse code
  8. 80 多个免费编程字体,你喜欢哪种?
  9. 教你如何保存有妖气漫画
  10. html5图片自动轮播纯代码,HTML5的自定义data-*实现图片切换或者轮播(代码实例)...