写在前面

在上一篇博客:【计算机视觉——RCNN目标检测系列】二、边界框回归(Bounding-Box Regression)中我们主要讲解了R-CNN中边界框回归,接下来我们在这篇博客我们讲解R-CNN中另外一个比较种重要的模块——IoU与非极大抑制

在这篇博客中,我们将重点RCNN论文中另一个比较重要模块——IoU与非极大抑制。IoU是描述两个矩形框之间重合程度的指标,在RCNN中常用于衡量边界框回归算法得到的预测目标框与真实目标框之间的重合程度。非极大抑制算法(Non-Maximum Suppression,NMS)则是用于去除大量重复的候选目标框。


一、IoU

首先来看下交并比(Intersection over Union,IoU)。假定两个目标框分别为 和 ,两个矩形框的示意图如下图所示。那么两个目标框的交并比计算公式为: IoU=A∩BA∪BIoU=\frac{A \cap B}{A \cup B}IoU=A∪BA∩B​。也就是IoU是两个目标框交际与并集的比值。一般来说,在目标检测中, 可视为检测结果良好正确,如果预测器和实际边界框完美重叠,则 ,因为交集就等于并集。但一般来说只要 ,那么结果是可以接受。

python中实现IoU的代码如下:

import numpy as npdef IoU(vertice1, vertice2):"""这是计算两个矩形区域的交并比函数,verticle格式为:[xin,ymin,xmax,ymax]:param vertice1: 目标框1:param vertice2: 目标框1:return: 两个矩形区域的交并比"""# 计算区域交集的左上与右下坐标lu = np.maximum(vertice1[0:2], vertice2[0:2])rd = np.minimum(vertice1[2:], vertice2[2:])# 计算区域交集的面积intersection = np.maximum(0.0, rd - lu)inter_square = intersection[0] * intersection[1]# 计算区域并集的面积square1 = (vertice1[2] - vertice1[0]) * (vertice1[3] - vertice1[1])square2 = (vertice2[2] - vertice2[0]) * (vertice2[3] - vertice2[1])union_square = np.maximum(square1 + square2 - inter_square, 1e-10)return np.clip(inter_square / union_square, 0.0, 1.0)

二、非极大抑制

接下来,我们重点介绍非极大抑制(Non-Maximum Suppression,NMS)。顾名思义,非极大抑制就是要抑制非极大值。也可以将非极大抑制理解成搜索局部最大值。
在此我们讨论的非极大抑制主要特指用于目标检测领域中搜索木分类概率最大的目标框的非极大抑制算法,而通用的非极大抑制请阅读论文《Efficient Non-Maximum Suppression》。下面我们来看下非极大抑制的示意图。

我们常会采用分类概率与IoU作为指标来实现目标框的非极大抑制。具体算法流程如下:

  1. 首先我们按照目标框对应的分类概率进行排序,选取分类概率最大的目标框,记作current_box。
  2. 计算current_box与剩余目标框之间的IoU
  3. 将IoU大于阈值的目标框舍弃
  4. 接下来在剩余的目标框中再选出最大分类概率的目标框。按照上述流程一直循环直至条件结束。
    显然从算法流程可以看出,非极大抑制是一种贪心算法。它的主要目的就是消除多余重叠比例较高的目标框。在RCNN与Fast RCNN中,候选框主要是由选择性搜索算法获取的,为了涵盖每张图片中对各个目标,选择行搜索算法会返回将近2000个候选框,因此带来大量重叠率叫高的目标框,因此在分类和定位任务借宿后,利用非极大抑制算法进行淘汰多余重复候选框时一项十分重要的工作。

非极大抑制(NMS)算法的python实现如下:

import numpy as np  def py_cpu_nms(dets, thresh):"""这是NMS去除重复目标框的函数:param dets: 目标框数组,目标框的格式为:[xin,ymin,xmax,ymax,score]:param thresh: 阈值:return: 不重复的目标框数组在元目标框数组中的下标数组"""vertices = dets[:, 0:4]  # 目标框scores = dets[:, 4]  # bbox打分#areas = (x2 - x1 + 1) * (y2 - y1 + 1)# 打分从大到小排列,取indexorder = scores.argsort()[::-1]# keep为最后保留的边框keep = []while order.size > 0:# order[0]是当前分数最大的窗口,肯定保留i = order[0]keep.append(i)# 计算窗口i与其他所有窗口的交叠部分的面积ious = np.array([IoU(vertices[i], vertices[j]) for j in order[1:]])# inds为所有与窗口i的iou值小于threshold值的窗口的index,其他窗口此次都被窗口i吸收inds = np.where(ious <= thresh)[0]# order里面只保留与窗口i交叠面积小于threshold的那些窗口,由于ovr长度比order长度少1(不包     含i),所以inds+1对应到保留的窗口order = order[inds + 1]return keep

【R-CNN目标检测系列】三、IoU与非极大抑制相关推荐

  1. 非极大值抑制_【计算机视觉——RCNN目标检测系列】三、IoU与非极大抑制

    写在前面 在上一篇博客:[计算机视觉-RCNN目标检测系列]二.边界框回归(Bounding-Box Regression)( 戴璞微:[计算机视觉-RCNN目标检测系列]二.边界框回归(Boundi ...

  2. sklearn逻辑回归 极大似然 损失_收藏!攻克目标检测难点秘籍二,非极大值抑制与回归损失优化之路...

    点击上方"AI算法修炼营",选择加星标或"置顶" 标题以下,全是干货 前面的话 在前面的秘籍一中,我们主要关注了模型加速之轻量化网络,对目标检测模型的实时性难点 ...

  3. 论文阅读 || 目标检测系列 —— RCNN详解

    目录 1. 相关概念 2 R-CNN的结构 2.1 候选框的提取 2.2 缩放候选区域 2.3 通过CNN提取特征向量 2.4 目标种类分类器 2.5 修正bbox 1) 候选框P 到预测框G'的平移 ...

  4. 如何使用CNN进行物体识别和分类_基于CNN目标检测方法(RCNN系列,YOLO,SSD)

    转载自:基于CNN目标检测方法(RCNN,Fast-RCNN,Faster-RCNN,Mask-RCNN,YOLO,SSD)行人检测 一.研究意义 卷积神经网络(CNN)由于其强大的特征提取能力,近年 ...

  5. 深度学习目标检测系列:一文弄懂YOLO算法|附Python源码

    在之前的文章中,介绍了计算机视觉领域中目标检测的相关方法--RCNN系列算法原理,以及Faster RCNN的实现.这些算法面临的一个问题,不是端到端的模型,几个构件拼凑在一起组成整个检测系统,操作起 ...

  6. python目标识别算法_深度学习目标检测系列:一文弄懂YOLO算法|附Python源码

    摘要: 本文是目标检测系列文章--YOLO算法,介绍其基本原理及实现细节,并用python实现,方便读者上手体验目标检测的乐趣. 在之前的文章中,介绍了计算机视觉领域中目标检测的相关方法--RCNN系 ...

  7. 目标检测(降低误检测率及小目标检测系列笔记)

    深度学习中,为了提高模型的精度和泛化能力,往往着眼于两个方面:(1)使用更多的数据(2)使用更深更复杂的网络. ** 一.什么是负样本 ** 负样本是指不包含任务所要识别的目标的图像,也叫负图像(Ne ...

  8. 目标检测中的Iou与map指标详细介绍(零基础)

    目标检测中的Iou与map指标详细介绍(零基础) 最近在算法岗实习,更新的频率会低一点,希望在实习过程中学到更多有用的视觉知识. IOU指标 下图中Ground truth为标记的正确框,Predic ...

  9. 目标检测系列--YOLO V4

    写在前面 本文运行在GitHub上下载的YOLOv4代码,使用pytorch框架,在文章尾部贴出运行结果. 关于YOLO V4 YOLOV4是YOLOV3的改进,相对于YOLOV3来说,YOLOV4做 ...

最新文章

  1. 道理我都懂,但是神经网络反向传播时的梯度到底怎么求?
  2. 有时觉得自己拥有很多,有时又觉得一无所有
  3. 小熊派4G cat1模块体验测试报告,AT命令发送短信拨号无脑教程,cat1移动网速测试...
  4. ios mdm更新应用_因使用MDM下架的家长控制应用OurPact重返App Store
  5. mybatis中使用mysql的模糊查询字符串拼接(like)
  6. 【渝粤题库】陕西师范大学202801 中国古代文学(五) 作业
  7. videojs插件使用
  8. ofo悄然搬离中关村,联合创始人出走,千万用户的押金还能退回来吗?
  9. 2017 Multi-University Training Contest - Team 1
  10. listView的最简单的使用方法
  11. 本地组策略编辑器计算机配置,如何打开本地组策略编辑器_打开组策略编辑器方法-win7之家...
  12. heartbeat高可用详解
  13. 1118:铺地毯(C C++)
  14. 拆书帮第14期训练营——作业一:如何进行有目的的练习
  15. 幼儿园计算机基础知识培训总结,幼儿园园本培训工作总结
  16. 给定C语言数据结构,给定C语言的数据结构struct T { int w; union T { char c;int i;double d;)U; };...
  17. 为什么录像都是用.avi而不是.mp4?
  18. 在sagemath中安装第三方库
  19. java-net-php-python-ssh学生信息管理系统录像演示录像2019计算机毕业设计程序
  20. STM32F103C8T6移植uc/OS

热门文章

  1. 【软件定义汽车】【中间件】iceoryx冰羚
  2. Win10打印机使用异常?windows系统如何删除更新补丁解决方案
  3. Centos7.x上安装cerebro
  4. excel怎么合并数据?
  5. MATLAB 2018b 安装教程(图解)Mac Win Linux下均可安装
  6. Serdes基础知识汇总
  7. [附源码]java毕业设计病历管理系统
  8. RTP协议解析及H264/H265 音视频RTP打包分析
  9. 【奇技淫巧】Linux | 时光之主-date
  10. 车载系统升级、“特饭”会员品牌上线,解读新特背后的互联网产品逻辑