MTCNN中的重叠度IOU和非极大值抑制NMS原理及Python实现
MTCNN中的重叠度IOU和非极大值抑制NMS原理及Python实现
一.重叠度iou
从在一张照片上框人脸时,因为图像金字塔的原因可能会把人脸框两次以上,每个框的坐标为[X1,Y1X2,Y2,C],其中X1,Y1是框左上角的点,X2,Y2是框右下角的点,C是置信度:这个框正确框到人脸的程度。在MTCNN中,iou包含两种:最小框iou、并集iou。
原理
1.并集iou
如下图所示,并集iou为交集面积除以并集面积,并集iou用在MTCNN中的P、R网络中
2.最小框iou
如果是大框包含小框的情况,就要用最小框iou,最小框iou表示交集面积除以最小框的面积,用在MTCNN中的O网络中
二.非极大值抑制NMS
如下图所示,NMS顾名思义,就是把正确框到人脸的框留下来,误差比较大的框删去
原理
下面的图片里有两张人脸,每张人脸上面有框,数字是置信度C,置信度C越大说明框到整个人脸的概率越大。那有人说直接留下两个置信度C最大的不就行了嘛?很明显,0.9和0.81最大,但是是在一张人脸上,这个方法不行,那下面介绍正确方法
如下图所示:
1.先按照置信度C排序
2.从最大的开始,依次往后计算iou,设置一个阈值,大于该阈值不保留小于该阈值保留
3.由2,排除0.81,还剩下0.8,0.7,0.6三个框再以0.8开始,往后依次计算iou
4.最后只剩下了0.9,0.8两个框
三.程序实现
1.
iou
首先,我随便画了几个框,坐标是
[[100,100,150,150,4],
[50,50,200,200,6],
[120,120,250,250,3],
[300,50,400,150,1],
[380,130,500,250,5],
[380,25,450,95,2]]
随便找一张背景图,并把框画在图上
定义iou函数,计算第一个框和后面所有框的面积:注意切片的用法
def iou(box,boxes,isMin=False):#box格式[x1,y1,x2,y2,c]#一个框面积box_area=(box[2]-box[0])*(box[3]-box[1])#多个框面积boxes_area=(boxes[:,2]-boxes[:,0])*(boxes[:,3]-boxes[:,1])
这是计算交集之前的技巧,计算交集先要找构成交集的点,总计四句话:
较大的左上角的横坐标,
较大的左下角的纵坐标,
较小的右下角的横坐标,
较小的右下角的纵坐标。
#找交集xx1=np.maximum(box[0],boxes[:,0])yy1 = np.maximum(box[1], boxes[:, 1])xx2 = np.minimum(box[2], boxes[:, 2])yy2 = np.minimum(box[3], boxes[:, 3])
计算之前先要判断是否有交集
#判断是否有交集w=np.maximum(0,xx2-xx1)h=np.maximum(0,yy2-yy1)
计算交集面积并计算iou,有两种iou
inter=w*h#iouif isMin:#最小面积iouover=np.true_divide(inter,np.minimum(box_area,boxes_area))else:#交集除以并集iouover=np.true_divide(inter,(box_area+boxes_area-inter))return over
2.
NMS
定义NMS函数,设一个阈值thresh,并按照置信度排序
def nms(boxes,thresh=0.05,isMin=False):#根据置信度对框排序_boxes=boxes[(-boxes[:,4]).argsort()]r_boxes=[]
分别取排完序的第一个框和剩余的框,计算iou,保留较小iou的框
while _boxes.shape[0]>1:#取出第一个框a_box=_boxes[0]#取出剩余的框b_boxes=_boxes[1:]#保留第一个框r_boxes.append(a_box)#比较iou后保留iou小的框index=np.where(iou(a_box,b_boxes,isMin)<thresh)_boxes=b_boxes[index]
下面就是主函数,自己设定了几个框,a.jpg是背景图,先把框画到背景图上,然后调用前面的NMS函数,计算完成之后得到的框再画出来,效果在下面
if __name__ == '__main__':bs=np.array([[100,100,150,150,4],[50,50,200,200,6],[120,120,250,250,3],[300,50,400,150,1],[380,130,500,250,5],[380,25,450,95,2]])# NMS之前img = image.open("a.jpg")draw = imgdraw.Draw(img)for i in range(bs.shape[0]):ai=bs[i, :4]draw.rectangle((ai[0], ai[1], ai[2],ai[3]), outline="red")img.show()img1 = image.open("a.jpg")draw1 = imgdraw.Draw(img1)b=nms(bs)#NMS之后for i in range(b.shape[0]):bi=b[i,:4]draw1.rectangle((bi[0], bi[1], bi[2], bi[3]), outline="red")img1.show()
结果:有一个框没有排除掉,不知道是哪里的问题,你知道的话可以留言
所有程序
import PIL.ImageDraw as imgdraw
import PIL.Image as image
import numpy as np
#iou
def iou(box,boxes,isMin=False):#box格式[x1,y1,x2,y2,c]#一个框面积box_area=(box[2]-box[0])*(box[3]-box[1])#多个框面积boxes_area=(boxes[:,2]-boxes[:,0])*(boxes[:,3]-boxes[:,1])#找交集xx1=np.maximum(box[0],boxes[:,0])yy1 = np.maximum(box[1], boxes[:, 1])xx2 = np.minimum(box[2], boxes[:, 2])yy2 = np.minimum(box[3], boxes[:, 3])#判断是否有交集w=np.maximum(0,xx2-xx1)h=np.maximum(0,yy2-yy1)#交集面积inter=w*h#iouif isMin:#最小面积iouover=np.true_divide(inter,np.minimum(box_area,boxes_area))else:#交集除以并集iouover=np.true_divide(inter,(box_area+boxes_area-inter))return over#NMS
def nms(boxes,thresh=0.05,isMin=False):#根据置信度对框排序_boxes=boxes[(-boxes[:,4]).argsort()]r_boxes=[]while _boxes.shape[0]>1:#取出第一个框a_box=_boxes[0]#取出剩余的框b_boxes=_boxes[1:]#保留第一个框r_boxes.append(a_box)#比较iou后保留iou小的框index=np.where(iou(a_box,b_boxes,isMin)<thresh)_boxes=b_boxes[index]if _boxes.shape[0]>0:r_boxes.append(_boxes[0])return np.stack(r_boxes)#stack:组装为矩阵
if __name__ == '__main__':bs=np.array([[100,100,150,150,4],[50,50,200,200,6],[120,120,250,250,3],[300,50,400,150,1],[380,130,500,250,5],[380,25,450,95,2]])# NMS之前img = image.open("a.jpg")draw = imgdraw.Draw(img)for i in range(bs.shape[0]):ai=bs[i, :4]draw.rectangle((ai[0], ai[1], ai[2],ai[3]), outline="red")img.show()img1 = image.open("a.jpg")draw1 = imgdraw.Draw(img1)b=nms(bs)#NMS之后for i in range(b.shape[0]):bi=b[i,:4]draw1.rectangle((bi[0], bi[1], bi[2], bi[3]), outline="red")img1.show()
转载或引用请注明来源!
MTCNN中的重叠度IOU和非极大值抑制NMS原理及Python实现相关推荐
- PyTorch实现非极大值抑制(NMS)
NMS即non maximum suppression即非极大抑制,顾名思义就是抑制不是极大值的元素,搜索局部的极大值.在最近几年常见的物体检测算法(包括rcnn.sppnet.fast-rcnn.f ...
- 交并比 (IoU), mAP (mean Average Precision), 非极大值抑制 (NMS, Soft NMS, Softer NMS, IoU-Net)
目录 目标检测的评价指标 交并比 (Intersection of Union, IoU) mAP (mean Average Precision) 其他指标 非极大值抑制 (Non-Maximum ...
- 【目标检测系列】非极大值抑制(NMS)的各类变体汇总
关注上方"深度学习技术前沿",选择"星标公众号", 技术干货,第一时间送达! [导读]前面已经先后为大家详细介绍过了目标检测领域的基础知识:[目标检测基础积累] ...
- 非极大值抑制(nms)算法详解[python]
一.起源 目标检测在使用了基于深度学习的端到端模型后效果斐然.目前,常用的目标检测算法,无论是One-stage的SSD系列算法.YOLO系列算法还是Two-stage的基于RCNN系列的算法,非极大 ...
- Opencv学习笔记(二十六)文本检测mser+非极大值抑制nms
文章目录 mser检测 nms非极大值抑制 代码 mser检测 nms非极大值抑制 代码 import cv2 import matplotlib.pyplot as plt import numpy ...
- 风机桨叶故障诊断(七) 滑动窗与非极大值抑制NMS
风机桨叶故障诊断(七)滑动窗与非极大值一直NMS 到目前为止,我已经利用自编码神经网络提取特征后训练得到了BP神经网络(参见:点击打开链接),且在测试样本集上表现不错.下面我们就要应用到实际中来检验算 ...
- YOLOv5改进之八:非极大值抑制NMS算法改进Soft-nms
前 言:作为当前先进的深度学习目标检测算法YOLOv5,已经集合了大量的trick,但是还是有提高和改进的空间,针对具体应用场景下的检测难点,可以不同的改进方法.此后的系列文章,将重点对YOLOv5 ...
- NMS非极大值抑制的原理
原理 对于Bounding Box的列表B及其对应的置信度S,采用下面的计算方式.选择具有最大score的检测框M,将其从B集合中移除并加入到最终的检测结果D中.通常将B中剩余检测框中与M的IoU大于 ...
- yolo极大抑制_pytorch实现yolov3(4) 非极大值抑制nms
在上一篇里我们实现了forward函数.得到了prediction.此时预测出了特别多的box以及各种class probability,现在我们要从中过滤出我们最终的预测box. 理解了yolov3 ...
最新文章
- Linux思维导图之shell脚本编程基础、习题
- Linux中查看正在使用的端口并强制删除占用端口
- eclipse项目导入idea部署到tomcat
- matlab时域转复频域,信号与系统实验(MATLAB版)实验15连续系统的复频域分析.ppt...
- Flume架构以及应用介绍[转]
- 吴恩达深度学习之三《结构化机器学习项目》学习笔记
- Angular 项目打包之后,部署到服务器,刷新访问404解决方法
- 朋友们给《Java程序员,上班那点事儿》的赠言
- [c++] gdiplus绘制透明异型窗口
- 人工智能——状态空间表示法
- 排队模型和排队系统仿真
- ACM题库,分类整理
- 编程语言的执行方式、静态语言和脚本语言
- linux下安装redis报Mmmm... it seems like you don‘t have a redis executable. Did you run make install yet?
- 关于 kubernetes网络(CNI规范)中Calico,NetworkPolicy(网络策略)方面的一些笔记
- 楼氏电子推出具有高级功能的人工智能型TWS开发套件
- 2021第三届长安杯检材三复盘
- azkaban 安装
- cs1.6 linux,在Ubuntu 8.04下玩CS1.6
- Sequence contains more than one matching element