关于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个输出通道。
其它两个输出通道同理: