更多内容请关注『机器视觉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相关推荐

  1. python 非_Python函数的非固定参数

    一.概述 在原来的文章中我已经写了,位置参数和关键字参数,下面我们来谈谈默认参数和参数组 二.默认参数 默认参数指的是,我们在传参之前,先给参数制定一个默认的值.当我们调用函数时,默认参数是非必须传递 ...

  2. 技术非中立,语言非同质:机器翻译正被用于维护文化障碍

    作者:王晔 转载自:AI科技评论 原文链接: 技术非中立,语言非同质:机器翻译正被用于维护文化障碍​mp.weixin.qq.com/s/t72b7um6FcKWoe3vvAigDw 当今世界随着大数 ...

  3. python非阻塞输入_python_非阻塞套接字及I/O流

    首先,我们要明确2个问题: 普通套接字实现的服务端有什么缺陷吗? 有,一次只能服务一个客户端! 这种缺陷是如何造成的? accept阻塞:当没有套接字连接请求过来的时候会一直等待着 recv阻塞:当连 ...

  4. MYSQL的全表扫描,主键索引(聚集索引、第一索引),非主键索引(非聚集索引、第二索引),覆盖索引四种不同查询的分析...

    文章出处:http://inter12.iteye.com/blog/1430144 MYSQL的全表扫描,主键索引(聚集索引.第一索引),非主键索引(非聚集索引.第二索引),覆盖索引四种不同查询的分 ...

  5. java 非静态 初始化_Java非静态代码块和实例初始化过程

    1 非静态代码块 非静态代码块特点 ①可以为实例变量(非静态的属性)初始化 ②每次创建对象的时候,都会执行一次,且先于构造器执行 ③若有多个非静态的代码块,那么按照定义的顺序从上到下依次执行 ④代码块 ...

  6. 子串、真子串、非空子串、非空真子串的求解方法(数据结构)

    ** 字串.真子串.非空子串.非空真子串的求解方法 ** Eg:串S="software" 子串的求解方法 n(n+1)/2 +1 此处n为8,所以串S的子串为37 真子串的求解方 ...

  7. SBM模型测算代码,matlab,可算 sbm,超效率sbm,非期望sbm,非期望超效率sbm

    SBM模型测算代码,matlab,可算 sbm,超效率sbm,非期望sbm,非期望超效率sbm, 非导向非径向, 有规模不变和规模可变两个选项 操作视频 已经通过多次计算证明与Maxdea专业版软件算 ...

  8. 非编网 制作服务器,电视台后期制作网非编系统机房非编工作站

    产品介绍: 目前,一套非线性编辑的功能往往集录制.编辑特技.字幕.动画等 多种功能于一身,而且可以不按照时间顺序编辑,它可以非常方便地对素材进行预览.查找.定位.设置出点.入点:具有丰富的特技功能.可 ...

  9. Java中匿名子类 的 匿名对象、匿名子类 的 非匿名对象、非匿名类 的 匿名对象、非匿名类 的 非匿名对象

    /*** @Author: YuShiwen* @Date: 2020/11/18 2:06 PM* @Version: 1.0*/ public class AnonymousTest {publi ...

最新文章

  1. 解决softmax后列和不为1的bug记录 :问题原因为 s为1维的,来除torch.exp(x)(64x10)时候,维数不对应,需要将s也要转换为2维的即维数为(64x1),才可以广播按行对应相除
  2. postgres 支持的线程数_为什么 Java 坚持多线程不选择协程?
  3. 百度网盘7.3.1.10版本增加工作空间功能,可实现百度网盘与电脑文件夹同步
  4. Rails不用localhost访问的时候很慢
  5. BGP/MPLS *** Option B 跨域研究实验
  6. Strust2 Mysql数据库,sql语句分页,JSP显示
  7. Python基础知识3: if判断语句
  8. vector容器动态申请内存的过程_记录一次自定义Allocator profile的过程
  9. 《原神》移动端总收入达8.74亿美元
  10. Python+pandas填充缺失值的几种方法
  11. 《移动App测试的22条军规》—App测试综合案例分析23.5节测试微信App的用户体验...
  12. 用 O(1) 时间检测整数 n 是否是 2 的幂次。
  13. 算法(algorithm):#include<algorithm>
  14. Anaconda下载安装
  15. 2021年JRebel最新激活方式
  16. 【计算机英语】期末复习笔记
  17. 华为老员工谈华为终端的来龙去脉
  18. 美颜换妆之BeautyGAN
  19. 安卓开发问题之 Unable to instantiate application com.android.tools.fd.runtime.BootstrapApplication
  20. 湖南无线数字电服务器,戴尔服务器搭建湖南省高校数字化图书馆

热门文章

  1. 磁盘及网络测试工具(iperf hdparm dd)
  2. openSUSE12.1安装及基本设置
  3. CSS中expression怎么用? CSS expression详解
  4. LaTeX tikz初探——利用emoji画GPS卫星2D分布图(2)
  5. 二次函数计算机课件,《二次函数的应用》课件
  6. 如何调整金格电子章服务器印章_电子签章赋能勘察设计新动力
  7. 电脑dns_女生也能学会的修电脑技巧
  8. gvim 命令行粘贴_vi/vim复制粘贴命令
  9. 《为何爱会伤人》-读书笔记
  10. win10专业版虚拟机配置服务器,如何在Win10专业版中添加Hyper-V虚拟机?