非极大抑制

NMS的英文是Non-maximum suppression的缩写。

简单的说,就是模型给出了多个重叠在一起的候选框,我们只需要保留一个就可以了。其他的重叠的候选框就删掉了,效果可见下图:

交并比

IoU的英文全称Interp over Union,就是两个候选框区域的交集面积比上并集的面积,用下图可以理解:

hard-NMS

hard-nms其实就是经典版本的NMS的方法。就是根据模型给出每个box的置信度从大到小进行排序,然后保留最大的,删除所以与这个最大置信度的候选框的IoU大于阈值的其他候选框。

举个例子吧,现在有4个候选框:(box1,0.8),(box2,0.9), (box3,0.7),(box4,0.5)

我们把这四个候选框按照置信度从大到小排序:box2>box1>box3>box4

现在我们保留置信度最大的候选框box2,然后计算剩下三个box与box2之间的IoU,如果IoU大于一个事先设置的阈值,那么就删除这个box。假设,阈值是0.5:

IoU(box1,box2)=0.1<0.5,保留;

IoU(box3,box2)=0.7<0.5,删除;

IoU(box4,box2)=0.2<0.5,保留;

现在还有box1和box4,然后再重复上面的过程,排序,然后删除。

下面是python实现的hard-NMS:

def hard_nms(box_scores, iou_threshold, top_k=-1, candidate_size=200):"""Args:box_scores (N, 5): box的集合,N为框的数量,5即4(位置信息)+1(可能为物体的概率)iou_threshold: 我们用IOU标准去除多余检测框的阈值top_k: 保留多少个计算后留下来的候选框,如果为-1则全保留candidate_size: 参与计算的boxes数量Returns:picked: 经过nms计算后保留下来的box"""scores = box_scores[:, -1]                # 首先我们取出box中的最后一个元素也就是当前box检测到物体的概率boxes = box_scores[:, :-1]                # 取出box中的四个坐标(左上、右下)picked = []  _, indexes = scores.sort(descending=True) # 按照降序排列所有的物体的概率,得到排序后在原数组中的索引信息 indexesindexes = indexes[:candidate_size]        # 只保留前 candidate_size 个 boxes 其余的不考虑了while len(indexes) > 0:current = indexes[0]                  # 每次取出当前在 indexes 中 检测到物体概率最大的一个 picked.append(current.item())         # 将这个最大的存在结果中if 0 < top_k == len(picked) or len(indexes) == 1:breakcurrent_box = boxes[current, :]       # 当前第一个也就是最高概率的boxindexes = indexes[1:]                rest_boxes = boxes[indexes, :]        # 剩下其余的boxiou = iou_of(                         # 将当前的box与剩下其余的boxes用IOU标准进行筛选rest_boxes,current_box.unsqueeze(0),)indexes = indexes[iou <= iou_threshold]# 保留与当前box的IOU小于一定阈值的boxes,return box_scores[picked, :]

如何计算iou的面积呢?实现方法在下面:

def area_of(left_top, right_bottom) -> torch.Tensor:"""Compute the areas of rectangles given two corners.Args:left_top (N, 2): left top corner.right_bottom (N, 2): right bottom corner.Returns:area (N): return the area."""hw = torch.clamp(right_bottom - left_top, min=0.0)return hw[..., 0] * hw[..., 1]def iou_of(boxes0, boxes1, eps=1e-5):"""Return interp-over-union (Jaccard index) of boxes.Args:boxes0 (N, 4): ground truth boxes.boxes1 (N or 1, 4): predicted boxes.eps: a small number to avoid 0 as denominator.Returns:iou (N): IoU values."""overlap_left_top = torch.max(boxes0[..., :2], boxes1[..., :2])overlap_right_bottom = torch.min(boxes0[..., 2:], boxes1[..., 2:])overlap_area = area_of(overlap_left_top, overlap_right_bottom)area0 = area_of(boxes0[..., :2], boxes0[..., 2:])area1 = area_of(boxes1[..., :2], boxes1[..., 2:])return overlap_area / (area0 + area1 - overlap_area + eps)

soft-NMS

在密集目标检测任务中,hard-NMS会有一些问题,看下面的例子:两个物体重叠起来了,但是根据hard-NMS绿色的框会被掉。

Soft-NMS就改动了一个地方。 在判断最高的置信度的box和其他box的IoU的时候增加了一个系数,可以更好的选择哪些才是多余的box。

对于hard-NMS来说,  的时候,保留,大于等于的时候删除,  表示置信度:

对于soft-NMS来说,  的时候,保留,大于的时候削减:

可以看出来,hard-NMS对于IoU大于阈值的候选框,直接把其置信度变成0,这样就相当于删除了这个box;但是soft-NMS的会根据IoU的大小,去适当的削减置信度,从而留下一些余地。

【如何削减】这里有两种方法来降低重叠候选框的置信度:

  1. 简单的线性衰减;

  2. 指数衰减。其中sigma是常数,一般是0.5.

第二种方法更为常见。


下面是python来实现的soft-NMS,其实跟hard-NMS相比,就多了一行代码罢了:

def soft_nms(box_scores, score_threshold, sigma=0.5, top_k=-1):"""Soft NMS implementation.References:https://arxiv.org/abs/1704.04503https://github.com/facebookresearch/Detectron/blob/master/detectron/utils/cython_nms.pyxArgs:box_scores (N, 5): boxes in corner-form and probabilities.score_threshold: boxes with scores less than value are not considered.sigma: the parameter in score re-computation.scores[i] = scores[i] * exp(-(iou_i)^2 / simga)top_k: keep top_k results. If k <= 0, keep all the results.Returns:picked_box_scores (K, 5): results of NMS."""picked_box_scores = []while box_scores.size(0) > 0:max_score_index = torch.argmax(box_scores[:, 4])cur_box_prob = torch.tensor(box_scores[max_score_index, :])picked_box_scores.append(cur_box_prob)if len(picked_box_scores) == top_k > 0 or box_scores.size(0) == 1:breakcur_box = cur_box_prob[:-1]box_scores[max_score_index, :] = box_scores[-1, :]box_scores = box_scores[:-1, :]ious = iou_of(cur_box.unsqueeze(0), box_scores[:, :-1])# 以下这句是新加的,如果没有这句就是Hard-NMS了box_scores[:, -1] = box_scores[:, -1] * torch.exp(-(ious * ious) / sigma) box_scores = box_scores[box_scores[:, -1] > score_threshold, :]if len(picked_box_scores) > 0:return torch.stack(picked_box_scores)else:return torch.tensor([])

往期精彩回顾适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载机器学习的数学基础专辑获取一折本站知识星球优惠券,复制链接直接打开:https://t.zsxq.com/yFQV7am本站qq群1003271085。加入微信群请扫码进群:

【深度学习】一分钟速学 | NMS, IOU 与 SoftMax相关推荐

  1. 王川: 深度学习有多深, 学了究竟有几分?

    上一篇文章提到了数据挖掘.机器学习.深度学习的区别:http://www.cnblogs.com/charlesblc/p/6159355.html 深度学习具体的内容可以看这里: 参考了这篇文章:h ...

  2. 斯坦福深度学习CS230课程cheatsheet学后总结笔记(1)

    斯坦福深度学习CS230课程cheatsheet学后总结提纲1 Marshal Zheng 2019-04-12 文章目录 斯坦福深度学习CS230课程cheatsheet学后总结提纲1 Overvi ...

  3. 知乎Live上线-学深度学习我们到底在学什么

    文章首发于微信公众号<有三AI> 知乎Live上线-学深度学习我们到底在学什么 文/编辑 | 言有三 很简单,今天就是预告一下我的知乎Live,将在3-30 12:00开讲,地址如下: h ...

  4. 精准医学中的深度学习和影像组学

    影像科正在经历一种范式转变,即使用人工智能与机器集成以及深度学习与影像组学更好地定义组织特征,从而实现计算机科学与影像学的共生关系.研究的目标是使用集成的深度学习和具有影像学参数的影像组学来为患者进行 ...

  5. xml建模包括以下_建模干货,1分钟速学,Photoscan空三结果完美导入CC

    ​关注公众号"三维前沿",获取更多倾斜摄影.激光点云资讯. 相信大家都经历过 有时CC空三总是失败或错误 最崩溃的是 一顿操作猛如虎,定睛一看原地杵 此时 Photoscan空三能 ...

  6. 深度学习入门笔记(十四):Softmax

    欢迎关注WX公众号:[程序员管小亮] 专栏--深度学习入门笔记 声明 1)该文章整理自网上的大牛和机器学习专家无私奉献的资料,具体引用的资料请看参考文献. 2)本文仅供学术交流,非商用.所以每一部分具 ...

  7. 深度学习难分样本挖掘(Hard Mining)

    来源:深度学习这件小事 本文约1500字,论文复现了一遍建议阅读5分钟 本文为你介绍关于难分样本的挖掘,如何将难分样本抽取出来. 最近看了几篇文章关于难分样本的挖掘,如何将难分样本抽取出来,通过训练, ...

  8. 机器学习和深度学习为什么感觉越学越不会,怎么解决这个问题?

    编辑 | Leo 转载自知乎 本文仅作学术交流,如有侵权,请联系后台删除. 曲終人不散回答: 我的研一我记得是先找了一本比较薄的,通俗易懂的深度学习书,内容浅尝辄止,但很基础,主要介绍全连接层,反向传 ...

  9. 动手学习深度学习-跟李沐学AI-自学笔记(1)

    个人学习笔记,如有错误欢迎指正! 预备课 课程必备网站:[课程主页][https://courses.d2l.ai/zh-v2],[教材][https://zh-v2.d2l.ai/],[课程论坛讨论 ...

最新文章

  1. 林园投资体系+嘴巴经济+病从口入+老龄化
  2. windows 7系统搭建PHP网站环境
  3. 使用Identity Server 4建立Authorization Server (4)
  4. Cannot find executable for CFBundle 解决办法
  5. Tricks(十七) —— 数组与字典(map)
  6. lambda表达式不使用委托(delegate) 用FUNC
  7. JSF使用HTML5的custom attribute
  8. 北京地区中波频率表2015版 (转载)
  9. 给2011年的MacBook Pro和MacBook Air升级到最新系统和做双系统时遇到的问题
  10. Flask + vue 前后端分离的 二手书App
  11. 利用Opencv+Qt打开摄像头
  12. Serdes series # skew
  13. 罗马数字到底是怎么组成的(内容详细)
  14. 智能家居Homekit系列一智能插座
  15. 群控代理、2016年很火的云豹群控代理
  16. command-codes
  17. access数据库应用系统客观题_Access数据库选择题练习与答案
  18. spring mvc框架、mvc框架模式
  19. 20亿人数据再被盗取,波及40多个国家和地区
  20. mysql 表如何分区数据恢复,如何从格式化的分区中恢复数据-万兴恢复专家

热门文章

  1. 201771010118马昕璐《面向对象程序设计java》第八周学习总结
  2. JVM-运行时数据区
  3. 怎么在VS监视DataSet类型的数据
  4. Linq To Sql 练习
  5. 学术好帮手Publons使用指南
  6. java jdk 观察者模式_java观察者模式实现和java观察者模式演化
  7. 页面怎么把关键字保留下来_怎么做seo优化,以及网站SEO优化计划!
  8. java填空题 在非静态成员方法中_Java程序设计填空和改错题(参考答案)
  9. __stdcall、__cdecl 、CALLBACK 几种函数修饰符
  10. 2011计算机2级,全国计算机等级考试四合一过关训练:2级C语言程序设计(2011版)...