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实现相关推荐

  1. PyTorch实现非极大值抑制(NMS)

    NMS即non maximum suppression即非极大抑制,顾名思义就是抑制不是极大值的元素,搜索局部的极大值.在最近几年常见的物体检测算法(包括rcnn.sppnet.fast-rcnn.f ...

  2. 交并比 (IoU), mAP (mean Average Precision), 非极大值抑制 (NMS, Soft NMS, Softer NMS, IoU-Net)

    目录 目标检测的评价指标 交并比 (Intersection of Union, IoU) mAP (mean Average Precision) 其他指标 非极大值抑制 (Non-Maximum ...

  3. 【目标检测系列】非极大值抑制(NMS)的各类变体汇总

    关注上方"深度学习技术前沿",选择"星标公众号", 技术干货,第一时间送达! [导读]前面已经先后为大家详细介绍过了目标检测领域的基础知识:[目标检测基础积累] ...

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

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

  5. Opencv学习笔记(二十六)文本检测mser+非极大值抑制nms

    文章目录 mser检测 nms非极大值抑制 代码 mser检测 nms非极大值抑制 代码 import cv2 import matplotlib.pyplot as plt import numpy ...

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

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

  7. YOLOv5改进之八:非极大值抑制NMS算法改进Soft-nms

    ​前 言:作为当前先进的深度学习目标检测算法YOLOv5,已经集合了大量的trick,但是还是有提高和改进的空间,针对具体应用场景下的检测难点,可以不同的改进方法.此后的系列文章,将重点对YOLOv5 ...

  8. NMS非极大值抑制的原理

    原理 对于Bounding Box的列表B及其对应的置信度S,采用下面的计算方式.选择具有最大score的检测框M,将其从B集合中移除并加入到最终的检测结果D中.通常将B中剩余检测框中与M的IoU大于 ...

  9. yolo极大抑制_pytorch实现yolov3(4) 非极大值抑制nms

    在上一篇里我们实现了forward函数.得到了prediction.此时预测出了特别多的box以及各种class probability,现在我们要从中过滤出我们最终的预测box. 理解了yolov3 ...

最新文章

  1. Linux思维导图之shell脚本编程基础、习题
  2. Linux中查看正在使用的端口并强制删除占用端口
  3. eclipse项目导入idea部署到tomcat
  4. matlab时域转复频域,信号与系统实验(MATLAB版)实验15连续系统的复频域分析.ppt...
  5. Flume架构以及应用介绍[转]
  6. 吴恩达深度学习之三《结构化机器学习项目》学习笔记
  7. Angular 项目打包之后,部署到服务器,刷新访问404解决方法
  8. 朋友们给《Java程序员,上班那点事儿》的赠言
  9. [c++] gdiplus绘制透明异型窗口
  10. 人工智能——状态空间表示法
  11. 排队模型和排队系统仿真
  12. ACM题库,分类整理
  13. 编程语言的执行方式、静态语言和脚本语言
  14. linux下安装redis报Mmmm... it seems like you don‘t have a redis executable. Did you run make install yet?
  15. 关于 kubernetes网络(CNI规范)中Calico,NetworkPolicy(网络策略)方面的一些笔记
  16. 楼氏电子推出具有高级功能的人工智能型TWS开发套件
  17. 2021第三届长安杯检材三复盘
  18. azkaban 安装
  19. cs1.6 linux,在Ubuntu 8.04下玩CS1.6
  20. Sequence contains more than one matching element

热门文章

  1. 2018传智黑马前端视频教程
  2. Curator基本操作(Zookeeper节点增删改查)
  3. Linux IP 地址修改
  4. B860AV2.1刷机/救砖
  5. Unity 2018之ShaderGraph使用基础
  6. 如何将旧电脑数据迁移到新电脑?10 款数据迁移软件工具分享
  7. Adobe Acrobat XI 一进去就闪退;解决Acrobat的闪退问题
  8. 华为服务器2285怎么做系统,华为服务器2285进bios
  9. 美颜SDK的动态贴纸有哪些妙用?
  10. Itext 学习笔记(六) pdf的页眉页脚