非极大值抑制_OpenCV非极大值抑制bug
更多内容请关注『机器视觉CV』公众号
我们上次分享过 YOLO 实现目标检测,但是,当笔者今天再测试时发现里面竟然存在一个有趣的 BUG
但我重新运行目标检测的程序时,测试了以下这只可爱的猫咪:
此时我就在想,目标检测不是要经过一步 NMS(非极大值抑制)吗,才能得到最后的输出框,那么我可不可以在还没有经过 NMS 时,把所有的锚框都绘制出来呢,那就动手吧
BUG 分析
WHAT,怎么还有个 bed (上图左上角那个蓝色框框)给画出来,但是预测的时候却没有呢,于是我又回顾了一遍 非极大值抑制(NMS)算法:从输出结果中提取最有可能的对象和其对应的边界框。流程如下:
- 1.设置一个 Score 的阈值,一个 IOU 的阈值(overlap);
- 2.对于每类对象,遍历属于该类的所有候选框,① 过滤掉 Score 低于 Score 阈值的候选框;② 找到剩下的候选框中最大 Score 对应的候选框,添加到输出列表;③ 进一步计算剩下的候选框与 ② 中输出列表中每个候选框的 IOU,若该 IOU 大于设置的 IOU 阈值,将该候选框过滤掉(大于一定阈值,代表重叠度比较高),否则加入输出列表中;④ 最后输出列表中的候选框即为图片中该类对象预测的所有边界框
- 3.返回步骤 2 继续处理下一类对象。
看着没毛病是吧,那我们就看看 OpenCV 的非极大值抑制是怎么实现的吧
咦!不是说对每类的对象执行非极大值抑制操作吗,怎么没有各个类别的参数输入???
难道是 OpenCV 的 BUG(/兴奋脸)?还是另有所用?
既然遇见了这个问题,那么,我们就把这个 BUG 给填上呗!
先上代码
其实很简单,我们只要先把每个类别对应的框框找出来,然后对其进行 NMS 操作,最后,将各个类别经过 NMS 操作的结果合并起来输出即可。
写好了代码,我们测试一下我们的结果呗,用一张目标检测的常用测试图进行实验。
首先,我们设置一下我们实验的参数:
- nms_thre= 0.5 overlap 即 IoU 值
- confidence_thre = 0.5 边框属于某个类别的分数的阈值
我们分别使用 OpenCV 自带的 NMS 操作和自己写的 MNS 操作进行对比,即:
得到的结果是一样的,因为图中 dog 区域在 bicycle 区域的 IoU 大概是 0.255,我们实验的值是 nms_thre=0.5 自然得到的结果是一样的
此时,我们改变实验的参数时:
- nms_thre= 0.2 overlap 即 IoU 值
- confidence_thre = 0.5 边框属于某个类别的分数的阈值
这时,OpenCV 自带的 NMS 得到的结果如下图,原因是 dog 的分数比较高,在 OpenCV 进行 NMS 操作时(即不考虑类别时),会把分数较高的 dog 保留下来,而分数较低的 bicycle 给滤出掉
而使用我们自己写的 NMS 操作(考虑类别时)得到的结果还是同上面一样
思考:
- 一张好的测试图片是如此的重要,要是没有那张可爱的猫咪图片,我也发现不了这个问题
- 现成的框架不一定是正确的,可能也得根据你的需求进行更改
- 多发现,对每步的处理知根知底
要有打破沙锅问到底的决心
完整的程序在 https://github.com/FLyingLSJ/Computer_Vision_Project 上,欢迎 Fork Star。
非极大值抑制_OpenCV非极大值抑制bug相关推荐
- python 非_Python函数的非固定参数
一.概述 在原来的文章中我已经写了,位置参数和关键字参数,下面我们来谈谈默认参数和参数组 二.默认参数 默认参数指的是,我们在传参之前,先给参数制定一个默认的值.当我们调用函数时,默认参数是非必须传递 ...
- 技术非中立,语言非同质:机器翻译正被用于维护文化障碍
作者:王晔 转载自:AI科技评论 原文链接: 技术非中立,语言非同质:机器翻译正被用于维护文化障碍mp.weixin.qq.com/s/t72b7um6FcKWoe3vvAigDw 当今世界随着大数 ...
- python非阻塞输入_python_非阻塞套接字及I/O流
首先,我们要明确2个问题: 普通套接字实现的服务端有什么缺陷吗? 有,一次只能服务一个客户端! 这种缺陷是如何造成的? accept阻塞:当没有套接字连接请求过来的时候会一直等待着 recv阻塞:当连 ...
- MYSQL的全表扫描,主键索引(聚集索引、第一索引),非主键索引(非聚集索引、第二索引),覆盖索引四种不同查询的分析...
文章出处:http://inter12.iteye.com/blog/1430144 MYSQL的全表扫描,主键索引(聚集索引.第一索引),非主键索引(非聚集索引.第二索引),覆盖索引四种不同查询的分 ...
- java 非静态 初始化_Java非静态代码块和实例初始化过程
1 非静态代码块 非静态代码块特点 ①可以为实例变量(非静态的属性)初始化 ②每次创建对象的时候,都会执行一次,且先于构造器执行 ③若有多个非静态的代码块,那么按照定义的顺序从上到下依次执行 ④代码块 ...
- 子串、真子串、非空子串、非空真子串的求解方法(数据结构)
** 字串.真子串.非空子串.非空真子串的求解方法 ** Eg:串S="software" 子串的求解方法 n(n+1)/2 +1 此处n为8,所以串S的子串为37 真子串的求解方 ...
- SBM模型测算代码,matlab,可算 sbm,超效率sbm,非期望sbm,非期望超效率sbm
SBM模型测算代码,matlab,可算 sbm,超效率sbm,非期望sbm,非期望超效率sbm, 非导向非径向, 有规模不变和规模可变两个选项 操作视频 已经通过多次计算证明与Maxdea专业版软件算 ...
- 非编网 制作服务器,电视台后期制作网非编系统机房非编工作站
产品介绍: 目前,一套非线性编辑的功能往往集录制.编辑特技.字幕.动画等 多种功能于一身,而且可以不按照时间顺序编辑,它可以非常方便地对素材进行预览.查找.定位.设置出点.入点:具有丰富的特技功能.可 ...
- Java中匿名子类 的 匿名对象、匿名子类 的 非匿名对象、非匿名类 的 匿名对象、非匿名类 的 非匿名对象
/*** @Author: YuShiwen* @Date: 2020/11/18 2:06 PM* @Version: 1.0*/ public class AnonymousTest {publi ...
最新文章
- 解决softmax后列和不为1的bug记录 :问题原因为 s为1维的,来除torch.exp(x)(64x10)时候,维数不对应,需要将s也要转换为2维的即维数为(64x1),才可以广播按行对应相除
- postgres 支持的线程数_为什么 Java 坚持多线程不选择协程?
- 百度网盘7.3.1.10版本增加工作空间功能,可实现百度网盘与电脑文件夹同步
- Rails不用localhost访问的时候很慢
- BGP/MPLS *** Option B 跨域研究实验
- Strust2 Mysql数据库,sql语句分页,JSP显示
- Python基础知识3: if判断语句
- vector容器动态申请内存的过程_记录一次自定义Allocator profile的过程
- 《原神》移动端总收入达8.74亿美元
- Python+pandas填充缺失值的几种方法
- 《移动App测试的22条军规》—App测试综合案例分析23.5节测试微信App的用户体验...
- 用 O(1) 时间检测整数 n 是否是 2 的幂次。
- 算法(algorithm):#include<algorithm>
- Anaconda下载安装
- 2021年JRebel最新激活方式
- 【计算机英语】期末复习笔记
- 华为老员工谈华为终端的来龙去脉
- 美颜换妆之BeautyGAN
- 安卓开发问题之 Unable to instantiate application com.android.tools.fd.runtime.BootstrapApplication
- 湖南无线数字电服务器,戴尔服务器搭建湖南省高校数字化图书馆
热门文章
- 磁盘及网络测试工具(iperf hdparm dd)
- openSUSE12.1安装及基本设置
- CSS中expression怎么用? CSS expression详解
- LaTeX tikz初探——利用emoji画GPS卫星2D分布图(2)
- 二次函数计算机课件,《二次函数的应用》课件
- 如何调整金格电子章服务器印章_电子签章赋能勘察设计新动力
- 电脑dns_女生也能学会的修电脑技巧
- gvim 命令行粘贴_vi/vim复制粘贴命令
- 《为何爱会伤人》-读书笔记
- win10专业版虚拟机配置服务器,如何在Win10专业版中添加Hyper-V虚拟机?