非极大抑制(NMS)和Threshold实践

关于NMS的理论分析介绍请参考文章:

非极大值抑制(Non-Maximum Suppression,NMS)_tugouxp的专栏-CSDN博客结束https://blog.csdn.net/tugouxp/article/details/121725807这里主要针对YOLOV3后处理的实践,结合一份白嫖来的YOLOV3后处理代码,来感性的了解NMS是做什么的,怎么用。

首先看一下这份代码,在后处理参数的初始化过程中, 可以看到有对NMS参数的初始化,NMS一般设置在0.3-0.5之间,他是对IOU的一种计量,这里设置为0.45。

输入图片是416*416的,经过后处理后,得到的画框图像如下图所示:

接下来,我们将其值设置为0,最大化的关闭NMS的功能:

 重新测试:

可以看到很明显的区别。

放在一起对比:

通过这里的例子,可以比较明显的看出NMS参数的影响方式。

问题:

关于每个框的选择范围,最终的范围是几个被选框的并集么?比如最后留下三个框,每个框框了物体的一个部分,最终的范围是三个框并了的范围?

不是,从中选个最优的。

所以最后的框一开始就在候选框集合中是吧,不是几个框并成的?

是的。

以C语言实现版本为例,NMS的实现如下:

我的问题是,比如说NMS前有A,B,C,D,E,F,G几个匡,最终显示出来的,NMS后的框,是A,B,C,D,E,F,G这其中的某些个,还是A,B,C,D,E,F,G这些框的处理后的结果?
说白了,就是显示出来的框,是NMS之前的集合中的某个么?还是NMS前的匡,经过某些运算得到的?
回答:一般是这几个框中置信度最高的那个.
一般是这几个框中置信度最高的那个,像yolo的是这么做的,其他网络除非设计网络的时候是需要做类似合并处理,不然一般不会做合并,像yolo的是这么做的,其他网络除非设计网络的时候是需要做类似合并处理,不然一般不会做合并
我刚刚找到一份代码,确实想你说的那样,输出的匡是其中一个置信度比较高的直接输出,这里的判断IOU大就忽略这个匡的逻辑是什么,是不是因为如果IOU过大,就表示这可能是同一个object?IOU大,算法认为是同一个Object,保留置信度高的那个就可以了,再接着找下一个
回答:这里的nms-comparater应该出来是置信度从大到小排列的,然后从置信度大的开始跟其他比较,发展iou较大就把小的那个删掉,对,就是说iou大于阈值,就判断为同一个obj,一通循环下来,就把iou大的(太近的)框删掉只剩一个,iou小的(较远的)框保留.
OK,所以不同类别的Object也排在一起,感觉同类别的一起排是不是好一点?

回答:类别应该分开的,看下它里面每次只比较第k类,删也是删掉第k类的prob,应该说每个类别比较的时候,也没真的删det,只是把当前类别的筛选出重叠的去掉,我记得是这样,然后代码看起来也是这个逻辑,可以跟一下。

80类的YOLOV3.

Threshold修改:

修改496行和534行,得到如下检测结果,对比两幅图,threshold和NMS设置不合理的表现是不同的。

YOLO层简单分析:

首先看YOLO1,输出前它没有经过全连接层,而是直接卷积层输出,并且最后一层是1X1卷积,目的是进行通道合并,因为有255个卷积核,将前级的1024个通道变为输出的255个输出通道。

其它两个输出通道同理:

结束!

猜你喜欢

转载自blog.csdn.net/tugouxp/article/details/121806084