(转)非极大抑制(Non-Maximum Suppression)

转载自非极大抑制(Non-Maximum Suppression)。

参考文章:
1. Non-Maximum Suppression for Object Detection in Python
2. NMS非极大值抑制

最近在做人脸识别的项目,其中在人脸检测算法中MTCNN算法是用到了NMS算法来筛选候选的人脸区域得到最佳的人脸位置。

这个算法其实应用非常广泛,在比较流行的检测算法中都有使用,包括RCNN、SPP-Net中,因为它主要作用就是在一堆候选区域找到最好最佳的区域。

大概原理如下:

假设从一个图像中得到了2000region proposals,通过在RCNN和SPP-net之后我们会得到2000*4096的一个特征矩阵,然后通过N的SVM来判断每一个region属于N的类的scores。其中,SVM的权重矩阵大小为4096*N,最后得到2000*N的一个score矩阵(其中,N为类别的数量)。

Non-Maximum Suppression就是需要根据score矩阵和region的坐标信息,从中找到置信度比较高的bounding box。首先,NMS计算出每一个bounding box的面积,然后根据score进行排序,把score最大的bounding box作为队列中。接下来,计算其余bounding box与当前最大score与box的IoU,去除IoU大于设定的阈值的bounding box。然后重复上面的过程,直至候选bounding box为空。最终,检测了bounding box的过程中有两个阈值,一个就是IoU,另一个是在过程之后,从候选的bounding box中剔除score小于阈值的bounding box。需要注意的是:Non-Maximum Suppression一次处理一个类别,如果有N个类别,Non-Maximum Suppression就需要执行N次。

python实现代码如下(参考自Non-Maximum Suppression for Object Detection in Python):

# import the necessary packages
import numpy as np
import cv2#  Felzenszwalb et al.
def non_max_suppression_slow(boxes, overlapThresh):# if there are no boxes, return an empty listif len(boxes) == 0:return []# initialize the list of picked indexespick = []# grab the coordinates of the bounding boxesx1 = boxes[:,0]y1 = boxes[:,1]x2 = boxes[:,2]y2 = boxes[:,3]# compute the area of the bounding boxes and sort the bounding# boxes by the bottom-right y-coordinate of the bounding boxarea = (x2 - x1 + 1) * (y2 - y1 + 1)idxs = np.argsort(y2)# keep looping while some indexes still remain in the indexes# listwhile len(idxs) > 0:# grab the last index in the indexes list, add the index# value to the list of picked indexes, then initialize# the suppression list (i.e. indexes that will be deleted)# using the last indexlast = len(idxs) - 1i = idxs[last]pick.append(i)suppress = [last]# loop over all indexes in the indexes listfor pos in xrange(0, last):# grab the current indexj = idxs[pos]# find the largest (x, y) coordinates for the start of# the bounding box and the smallest (x, y) coordinates# for the end of the bounding boxxx1 = max(x1[i], x1[j])yy1 = max(y1[i], y1[j])xx2 = min(x2[i], x2[j])yy2 = min(y2[i], y2[j])# compute the width and height of the bounding boxw = max(0, xx2 - xx1 + 1)h = max(0, yy2 - yy1 + 1)# compute the ratio of overlap between the computed# bounding box and the bounding box in the area listoverlap = float(w * h) / area[j]# if there is sufficient overlap, suppress the# current bounding boxif overlap > overlapThresh:suppress.append(pos)# delete all indexes from the index list that are in the# suppression listidxs = np.delete(idxs, suppress)# return only the bounding boxes that were pickedreturn boxes[pick]# construct a list containing the images that will be examined
# along with their respective bounding boxes
images = [("images/audrey.jpg", np.array([(12, 84, 140, 212),(24, 84, 152, 212),(36, 84, 164, 212),(12, 96, 140, 224),(24, 96, 152, 224),(24, 108, 152, 236)])),("images/bksomels.jpg", np.array([(114, 60, 178, 124),(120, 60, 184, 124),(114, 66, 178, 130)])),("images/gpripe.jpg", np.array([(12, 30, 76, 94),(12, 36, 76, 100),(72, 36, 200, 164),(84, 48, 212, 176)]))]# loop over the images
for (imagePath, boundingBoxes) in images:# load the image and clone itprint "[x] %d initial bounding boxes" % (len(boundingBoxes))image = cv2.imread(imagePath)orig = image.copy()# loop over the bounding boxes for each image and draw themfor (startX, startY, endX, endY) in boundingBoxes:cv2.rectangle(orig, (startX, startY), (endX, endY), (0, 0, 255), 2)# perform non-maximum suppression on the bounding boxespick = non_max_suppression_slow(boundingBoxes, 0.3)print "[x] after applying non-maximum, %d bounding boxes" % (len(pick))# loop over the picked bounding boxes and draw themfor (startX, startY, endX, endY) in pick:cv2.rectangle(image, (startX, startY), (endX, endY), (0, 255, 0), 2)# display the imagescv2.imshow("Original", orig)cv2.imshow("After NMS", image)cv2.waitKey(0)

效果如下图:
这里写图片描述

这里写图片描述

这里写图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/408902.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安装配置Eclipse开发PHP环境配置

文章结束给大家来个程序员笑话:[M] Eclipse发开PHP环境配置 首先准备好件软: 1. Apache,到这里找个最新本版 2. PHP,到这里下载 3. Eclipse IDE for Java EE Developers,到这里下载 4. DLTK Core Frameworks 1.0 Integration buil…

C++ 输入一行未知个数的整数

最近笔试的时候&#xff0c;编程题遇到这样要求的输入&#xff0c;需要输入一行整数&#xff0c;个数未知&#xff0c;然后整数之间用空格间隔&#xff0c;如下所示&#xff1a; 11 22 333 45 62 代码如下所示&#xff1a; int main() {vector<int> inputs;int n 0, …

[原]好玩的Linux,关于时间cal命令

我们都知道&#xff0c;在Linux中&#xff0c;可以通过cal命令来查看日历。Cal怎么用呢&#xff0c;我们可以man一下&#xff0c;可以看到如下结果&#xff1a; 我们可以看到cal命令的基本用法如下&#xff1a;cal [-smjy13] [[[day] month] year] 当然如果不加指定参数的话&a…

python appium自动化测试平台开发,Python+Appium实现自动化测试

一、环境准备1.脚本语言&#xff1a;Python3.x IDE&#xff1a;安装Pycharm2.安装Java JDK 、Android SDK3.adb环境&#xff0c;path添加E:\Software\Android_SDK\platform-tools4.安装Appium for windows&#xff0c;官网地址http://appium.io/点击下载按钮会到GitHub的下载…

基于CNN的增量学习论文的读后感

最近在阅读几篇基于CNN的增量学习的论文。 《INCREMENTAL LEARNING WITH PRE-TRAINED CONVOLUTIONAL NEURAL NETWORKS AND BINARY ASSOCIATIVE MEMORIES》 09-19 阅读 第一篇论文是《INCREMENTAL LEARNING WITH PRE-TRAINED CONVOLUTIONAL NEURAL NETWORKS AND BINARY ASSOC…

卷积神经网络(CNN)介绍

简单介绍和总结卷积神经网络&#xff08;Convolutional Neural Networks&#xff09;的基本组成网络层和常用的网络结构。 参考文章/书籍&#xff1a; An Intuitive Explanation of Convolutional Neural Networks对CNN中pooling的理解《深度学习轻松学&#xff1a;核心算法与…

CC2540低功耗的内幕

一、概述 1、BLE蓝牙协议栈结构 附图6 BLE蓝牙协议栈结构图 分为两部分&#xff1a;控制器和主机。对于4.0以前的蓝牙&#xff0c;这两部分是分开的。所有profile&#xff08;姑且称为剧本吧&#xff0c;用来定义设备或组件的角色&#xff09;和应用都建构在GAP或GATT之上。下面…

前端开发怎么用php,做web前端开发怎么样?

前端工程师是互联网时代软件产品研发中不可缺少的一种专业研发角色。从狭义上讲&#xff0c;前端工程师使用 HTML、CSS、JavaScript 等专业技能和工具将产品UI设计稿实现成网站产品&#xff0c;涵盖用户PC端、移动端网页&#xff0c;处理视觉和交互问题。从广义上来讲&#xff…

机器学习入门系列(1)--机器学习概览(上)

最近打算系统学习和整理机器学习方面的知识&#xff0c;会将之前看的 Andrew Ng 在 course 课程笔记以及最近看的书籍《hands-on-ml-with-sklearn-and-tf》结合起来&#xff0c;简单总结下机器学习的常用算法&#xff0c;由于数学功底有限&#xff0c;所以可能不会也暂时不能过…

oracle 安装display,Linux安装Oracle 11时报错DISPLAY解决方案

在Linux上安装Oracle时&#xff0c;经常会报以下错误&#xff1a;无法使用命令 /usr/X11R6/bin/xdpyinfo 自动检查显示器颜色。请检查是否设置了DISPLA在Linux上安装Oracle时&#xff0c;经常会报以下错误&#xff1a;无法使用命令 /usr/X11R6/bin/xdpyinfo 自动检查显示器颜色…

机器学习入门系列(2)--机器学习概览(下)

这是本系列的第二篇&#xff0c;也是机器学习概览的下半部分&#xff0c;主要内容如下所示&#xff1a; 文章目录1. 机器学习的主要挑战1.1 训练数据量不足1.2 没有代表性的训练数据1.3 低质量的数据1.4 不相关的特征1.5 过拟合1.6 欠拟合2. 测试和评估3. 小结1. 机器学习的主要…

[实战] 图片转素描图

本文大约 2000 字&#xff0c;阅读大约需要 6 分钟 我们知道图片除了最普通的彩色图&#xff0c;还有很多类型&#xff0c;比如素描、卡通、黑白等等&#xff0c;今天就介绍如何使用 Python 和 Opencv 来实现图片变素描图。 主要参考这篇文章来实现–How to create a beautifu…

[实战]制作简单的公众号二维码关注图

本文大约 1933 字&#xff0c;阅读大约需要 6 分钟 最近刚刚更换了公众号名字&#xff0c;然后自然就需要更换下文章末尾的二维码关注图&#xff0c;但是之前是通过 windows 自带的画图软件做的&#xff0c;但是之前弄的时候其实还是比较麻烦的&#xff0c;所以我就想作为一名程…

linux初始化进程ppid号,linux基础(十一)--系统初始化的简谈

我们在深入学习linux之前呢首先要了解其的引导加载过程&#xff0c;这样我们就可以在判断一些在系统初始化过程的出现问题的来源&#xff0c;并及时做出处理。这个过程大概分为【开机】——【BIOS】(CMOS)——【grub或者其他引导程序】——【kernel boot】(initrd文件)——【in…