NMS(非极大抑制)是深度学习目标检测中常用的小算法,用来过滤掉同一个物体上的那些置信度较低的bbboxes,最后只剩下该目标检测框集中最大置信度的那个。

算法原理

说它是小算法的原因是其原理很简单。

1)先对输入检测框按置信度由高到低排序

2)挑选第一个检测框(即最高置信度,记为A)和其它检测框(记为B)进行iou计算

3)如果iou大于nmsThreshold, 那就将B清除掉

4)跳转到2)从剩余得框集里面找置信度最大得框和其它框分别计算iou

5)直到所有框都过滤完。

代码实现

box的数据结构

struct Box{float left, top, right, bottom, confidence;float landmark[10];cv::Rect cvbox() const{return cv::Rect(left, top, right-left, bottom-top);}float width()    const{return std::max(0.0f, right-left);}float height()   const{return std::max(0.0f, bottom-top);}float area()     const{return width() * height();}float get_left()                {return left;}void set_left(float value)      {left = value;}float get_top()                 {return top;}void set_top(float value)       {top = value;}float get_right()               {return right;}void set_right(float value)     {right = value;}float get_bottom()              {return bottom;}void set_bottom(float value)    {bottom = value;}float get_confidence()          {return confidence;}void set_confidence(float value){confidence = value;}};

NMS算法

static void cpu_nms(std::vector<Box>& boxes, std::vector<Box>& output, float threshold){// 先把boxes的按照置信度从大到小排序std::sort(boxes.begin(), boxes.end(), [](std::vector<Box>::const_reference a, std::vector<Box>::const_reference b){return a.confidence > b.confidence;});// 清理输出的缓存output.clear();// 创建和boxes等量的bool向量,用来标记过滤,默认全为falsestd::vector<bool> remove_flags(boxes.size());// 开始遍历for(int i = 0; i < boxes.size(); ++i){// 刚开始remove_flags均为false,if(remove_flags[i]) continue;// 经过上面的排序可以知道,第0个位置一定是置信度最大的那个,是我们的候选项,因此需要删除其他的候选框auto& a = boxes[i];// 把最大的先放到输出的向量里output.push_back(a);// 继续遍历0后面的元素,所以j=i+1for(int j = i + 1; j < boxes.size(); ++j){// 第1个位置也为falseif(remove_flags[j]) continue;// 此时拿到第一个位置的数据auto& b = boxes[j];// 和第一个进行计算iou,如果iou阈值重合大于愈合iz,直接删除第1个位置的框,此时说明该框已经废弃,因此flag设置为true即可if(iou(a, b) >= threshold)remove_flags[j] = true;}}//综上,可以发现已经被废弃的box不会参与后面是循环,这样可以高性能实现nms
}

iou算法

static float iou(const Box& a, const Box& b){float cleft     = std::max(a.left, b.left);float ctop      = std::max(a.top, b.top);float cright  = std::min(a.right, b.right);float cbottom     = std::min(a.bottom, b.bottom);float c_area = std::max(cright - cleft, 0.0f) * std::max(cbottom - ctop, 0.0f);if(c_area == 0.0f)return 0.0f;float a_area = std::max(0.0f, a.right - a.left) * std::max(0.0f, a.bottom - a.top);float b_area = std::max(0.0f, b.right - b.left) * std::max(0.0f, b.bottom - b.top);return c_area / (a_area + b_area - c_area);}

NMS 原理和c++实现,已测试通过相关推荐

  1. SM4分组加密算法原理和c语言实现

    一.前言 在之前的文章中介绍了<SM3国密杂凑值算法的原理和c语言实现>,这篇文章主要是用c语言撸一个SM4分组加密算法. 随着信息安全的普及以及等级保护等安全政策落地,国密算法越来越频繁 ...

  2. HTTPS原理和CA证书申请

    转载自:HTTPS原理和CA证书申请(满满的干货) 众所周知,WEB服务存在http和https两种通信方式,http默认采用80作为通讯端口,对于传输采用不加密的方式,https默认采用443,对于 ...

  3. 机器学习笔记——2 简单线性模型及局部加权线性模型的基本原理和python实现(参数估计的两个基本角度:几何直观和概率直观。函数最值问题的两大基本算法:梯度方法与迭代方法)

    简单线性模型及局部加权线性模型的基本原理和python实现(参数估计的两个基本角度:几何直观和概率直观.函数最值问题的两大基本算法:梯度方法与迭代方法) 线性模型是什么? 线性模型是监督学习的各类学习 ...

  4. Mybatis插件原理和PageHelper结合实战分页插件(七)

    今天和大家分享下mybatis的一个分页插件PageHelper,在讲解PageHelper之前我们需要先了解下mybatis的插件原理.PageHelper 的官方网站:https://github ...

  5. HBase学习指南之HBase原理和Shell使用

    HBase学习指南之HBase原理和Shell使用 参考资料: 1.https://www.cnblogs.com/nexiyi/p/hbase_shell.html,hbase shell 转载于: ...

  6. IAP的原理和stm8的IAP

    一.引出(IAP的原理和stm8上实现IAP的问题) 具有IAP功能的单片机,程序可以分为两部分:IAP和APP.APP是用来实现真正功能的程序,而IAP是用来远程重新编程APP的程序.单片机上电时会 ...

  7. 单链表反转的原理和python代码实现

    链表是一种基础的数据结构,也是算法学习的重中之重.其中单链表反转是一个经常会被考察到的知识点. 单链表反转是将一个给定顺序的单链表通过算法转为逆序排列,尽管听起来很简单,但要通过算法实现也并不是非常容 ...

  8. 计算机网络原理和OSI模型与TCP模型

    计算机网络原理和OSI模型与TCP模型 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.计算机网络的概述 1.计算机网络的定义 计算机网络是一组自治计算机的互连的集合 2.计算机 ...

  9. 跑腿同学校园小程序源码-已测试

    介绍: 跑腿同学校园小程序源码-已测试 1:推荐环境:coenots7+wdcp3.2 coenots7+宝塔 win2008+phpstudty2017 php版本gt;= 5.4推荐5.6 2:把 ...

最新文章

  1. C语言程序设计有哪几种结构,第章c语言程序设计的三种基本结构.ppt
  2. Oracle For Linux安装脚本
  3. batocera_batocera系统如何把旧电脑改造成影音游戏主机
  4. CF1406D:Three Sequences(贪心、构造)
  5. 转:什么是 Base64编码
  6. 使用ab进行页面的压力测试
  7. Clustered Data ONTAP Fundamentals课程学习(1)
  8. hi3559AV100上交叉编译faiss(facebook research)
  9. ASP.NET中 CompareValidator(比较验证)的使用
  10. 科学研究设计一:什么是科学
  11. Tahoma Arial Verdana三种字体的选择
  12. 物联网开发平台快速实现ModbusRTU连接
  13. 实验一:常用网络命令操作
  14. css 常用的各种中文字体
  15. NPV(净现值)是什么以及其对应的概念及公式是什么?使用Python计算NPV是如何实现的?
  16. 小程序定位,接入腾讯位置服务
  17. 手机直播原生源码可以搭建哪些直播app当中的功能
  18. cocos2d-x的面试题
  19. WebGL编程指南-23 光照原理、漫反射光计算、漫反射光照射下的立方体
  20. 【译】第三篇 SQL Server安全主体和安全对象

热门文章

  1. 运维自动化之使用PHP+MYSQL+SHELL打造私有监控系统
  2. 机器学习笔记-XGBoost
  3. 机器学习笔记-基于逻辑回归的分类预测
  4. 深度学习推荐模型-NFM
  5. webview 禁用横竖屏切换_X5内核WebView横屏切换崩溃
  6. react 打包体积过大_解决 webpack 打包文件体积过大
  7. 九小时九个人九扇门(01背包)
  8. linux oracle bin目录在哪,linux 安装软件装完后在哪个目录
  9. Hive内部表和外部表
  10. spyder里import tensorflow报错显示没有tensorflow模块解决