NMS 原理和c++实现,已测试通过
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++实现,已测试通过相关推荐
- SM4分组加密算法原理和c语言实现
一.前言 在之前的文章中介绍了<SM3国密杂凑值算法的原理和c语言实现>,这篇文章主要是用c语言撸一个SM4分组加密算法. 随着信息安全的普及以及等级保护等安全政策落地,国密算法越来越频繁 ...
- HTTPS原理和CA证书申请
转载自:HTTPS原理和CA证书申请(满满的干货) 众所周知,WEB服务存在http和https两种通信方式,http默认采用80作为通讯端口,对于传输采用不加密的方式,https默认采用443,对于 ...
- 机器学习笔记——2 简单线性模型及局部加权线性模型的基本原理和python实现(参数估计的两个基本角度:几何直观和概率直观。函数最值问题的两大基本算法:梯度方法与迭代方法)
简单线性模型及局部加权线性模型的基本原理和python实现(参数估计的两个基本角度:几何直观和概率直观.函数最值问题的两大基本算法:梯度方法与迭代方法) 线性模型是什么? 线性模型是监督学习的各类学习 ...
- Mybatis插件原理和PageHelper结合实战分页插件(七)
今天和大家分享下mybatis的一个分页插件PageHelper,在讲解PageHelper之前我们需要先了解下mybatis的插件原理.PageHelper 的官方网站:https://github ...
- HBase学习指南之HBase原理和Shell使用
HBase学习指南之HBase原理和Shell使用 参考资料: 1.https://www.cnblogs.com/nexiyi/p/hbase_shell.html,hbase shell 转载于: ...
- IAP的原理和stm8的IAP
一.引出(IAP的原理和stm8上实现IAP的问题) 具有IAP功能的单片机,程序可以分为两部分:IAP和APP.APP是用来实现真正功能的程序,而IAP是用来远程重新编程APP的程序.单片机上电时会 ...
- 单链表反转的原理和python代码实现
链表是一种基础的数据结构,也是算法学习的重中之重.其中单链表反转是一个经常会被考察到的知识点. 单链表反转是将一个给定顺序的单链表通过算法转为逆序排列,尽管听起来很简单,但要通过算法实现也并不是非常容 ...
- 计算机网络原理和OSI模型与TCP模型
计算机网络原理和OSI模型与TCP模型 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.计算机网络的概述 1.计算机网络的定义 计算机网络是一组自治计算机的互连的集合 2.计算机 ...
- 跑腿同学校园小程序源码-已测试
介绍: 跑腿同学校园小程序源码-已测试 1:推荐环境:coenots7+wdcp3.2 coenots7+宝塔 win2008+phpstudty2017 php版本gt;= 5.4推荐5.6 2:把 ...
最新文章
- C语言程序设计有哪几种结构,第章c语言程序设计的三种基本结构.ppt
- Oracle For Linux安装脚本
- batocera_batocera系统如何把旧电脑改造成影音游戏主机
- CF1406D:Three Sequences(贪心、构造)
- 转:什么是 Base64编码
- 使用ab进行页面的压力测试
- Clustered Data ONTAP Fundamentals课程学习(1)
- hi3559AV100上交叉编译faiss(facebook research)
- ASP.NET中 CompareValidator(比较验证)的使用
- 科学研究设计一:什么是科学
- Tahoma Arial Verdana三种字体的选择
- 物联网开发平台快速实现ModbusRTU连接
- 实验一:常用网络命令操作
- css 常用的各种中文字体
- NPV(净现值)是什么以及其对应的概念及公式是什么?使用Python计算NPV是如何实现的?
- 小程序定位,接入腾讯位置服务
- 手机直播原生源码可以搭建哪些直播app当中的功能
- cocos2d-x的面试题
- WebGL编程指南-23 光照原理、漫反射光计算、漫反射光照射下的立方体
- 【译】第三篇 SQL Server安全主体和安全对象