当前位置:   article > 正文

【目标检测】 非极大值抑制—NMS

【目标检测】 非极大值抑制—NMS

非极大值抑制(Non-Maximum Suppression,NMS)

目标检测任务中,一个目标可能会被多个边界框检测到,这些边界框可能会有不同的位置和大小,但表示同一个目标。非极大值抑制(Non-Maximum Suppression,NMS)是一种常用的方法,用于抑制这些重叠的边界框,只保留置信度最高的那个边界框,从而得到最终的目标检测结果。

1、NMS算法原理

  1. 首先,对所有的边界框按照其置信度进行排序,置信度最高的边界框排在最前面。
  2. 从置信度最高的边界框开始,依次遍历其余边界框。
  3. 对于当前遍历到的边界框,如果它与前面已经保留的边界框的重叠程度(通过计算IOU值)大于一定阈值(比如0.5),那么就将其抑制掉,不保留。
  4. 继续遍历下一个边界框,重复上述过程,直到所有的边界框都被处理完毕。

通过这样的处理,NMS可以抑制掉大量重叠的边界框,只保留最好的那个边界框,从而得到最终的目标检测结果。这种方法虽然简单,但是在实践中非常有效,已经被广泛应用于各种目标检测任务中。

2、opencv中的NMS算法实现

cv::dnn::NMSBoxes是OpenCV中提供的一个函数,用于执行非极大值抑制(Non-Maximum Suppression,NMS)操作,以得到最终的目标检测结果。

cv::dnn::NMSBoxes函数的定义如下:

void cv::dnn::NMSBoxes(
    const std::vector<cv::Rect>& bboxes,   // 输入的边界框
    const std::vector<float>& scores,      // 对应的置信度
    const float score_threshold,           // 置信度阈值
    const float nms_threshold,             // NMS阈值
    std::vector<int>& indices,             // 输出的保留下来的边界框的索引
    const float eta = 1.0,                 // Soft-NMS的参数
    const int top_k = 0                    // 保留的最大边界框数量,0表示保留全部
)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

该函数的参数含义如下:

  • boxes:表示检测出的所有边界框的位置和大小,类型为std::vector<cv::Rect>
  • scores:表示每个边界框的置信度,类型为std::vector<float>
  • score_threshold:表示置信度的阈值,低于该阈值的边界框会被忽略。
  • nms_threshold:表示NMS的阈值,重叠度高于该阈值的边界框会被抑制。
  • indices:表示保留下来的边界框的索引,类型为std::vector<int>
  • eta:表示应用Soft-NMS时的参数,用于调整抑制程度。默认值为1.0,表示不使用Soft-NMS。
  • top_k:表示保留置信度最高的前k个边界框,如果为0,则表示保留所有边界框。

cv::dnn::NMSBoxes函数的具体操作如下:

  1. 首先,将所有边界框按照其置信度进行排序,置信度高的边界框排在前面。
  2. 从置信度最高的边界框开始,依次遍历其余边界框。
  3. 对于当前遍历到的边界框,如果其置信度低于阈值score_threshold,那么就将其抑制掉,不保留。
  4. 对于当前遍历到的边界框,计算其余所有未被抑制的边界框与它的重叠度(通过计算IOU值),如果重叠度大于阈值nms_threshold,那么就将当前边界框抑制掉,不保留。
  5. 继续遍历下一个边界框,重复上述过程,直到所有的边界框都被处理完毕。
  6. 如果指定了参数top_k,那么只保留置信度最高的前k个边界框。
  7. 将保留下来的边界框的索引存储在indices中,以便后续使用。

通过调用cv::dnn::NMSBoxes函数,可以很方便地执行NMS操作,并得到最终保留下来的边界框的索引。这些索引可以用于获取相应的边界框位置和置信度等信息,从而得到最终的目标检测结果。

需要注意的是,NMS操作会抑制掉一部分重叠的边界框,因此可能会导致一些目标被误判为背景或被漏检。因此,在应用NMS操作时,需要根据具体应用场景和需求来调整阈值,以达到最优的检测效果。

此外,cv::dnn::NMSBoxes函数还提供了参数eta,用于进行Soft-NMS操作。Soft-NMS与传统的NMS操作类似,但是不是直接抑制掉与当前边界框重叠度高的边界框,而是通过降低其置信度来减少其对后续边界框的影响,从而提高目标检测的精度。下面我们来继续讲解Soft-NMS

3、soft-NMS

Soft-NMS与传统的NMS相比,其抑制程度更加柔和,可以更好地处理重叠较多的边界框。在实际应用中,如果检测结果中存在很多重叠的边界框,可以考虑使用Soft-NMS来提高检测效果。

Soft-NMS算法的计算公式如下:

在这里插入图片描述

Soft-NMS算法的伪代码实现如下:
for each box  i , do set  max j = i for each box  j ≠ i , do if IoU ( i , j ) > NMS threshold  then  weight j = 0 else  weight j = exp ( − ( IoU ( i , j ) ) 2 eta ) if  weight j > weight max j  then set  max j = j end for if  max j ≠ i  then score i = weight i score i score max j = ( 1 − weight i ) score max j end if end for

for each box i,doset maxj=ifor each box ji,doif IoU(i,j)>NMSthreshold then weightj=0else weightj=exp((IoU(i,j))2eta)if weightj>weightmaxj then set maxj=jend forif maxji thenscorei=weightiscoreiscoremaxj=(1weighti)scoremaxjend ifend for
for each box i,doset maxj=ifor each box j=i,doif IoU(i,j)>NMSthreshold then weightj=0else weightj=exp(eta(IoU(i,j))2)if weightj>weightmaxj then set maxj=jend forif maxj=i thenscorei=weightiscoreiscoremaxj=(1weighti)scoremaxjend ifend for
其中,IoU(i, j)表示第i个边界框和第j个边界框之间的IoU值,NMS_threshold表示NMS阈值,weight_j表示第j个边界框的权重,eta是Soft-NMS的参数。在每次迭代中,对于每个边界框i,都会计算它和其他边界框之间的IoU值,并根据IoU值计算出它们之间的权重。最终,Soft-NMS会根据这些权重对置信度进行加权,从而得到最终的目标检测结果。

Soft-NMS算法的计算过程如下:

  1. 输入一组边界框B={B1, B2, …, Bn},以及每个边界框的置信度score={s1, s2, …, sn},以及两个参数:NMS阈值threshold和衰减因子sigma。
  2. 将B中所有边界框按照置信度score从大到小排序,得到排序后的边界框序列B’= {Bp1, Bp2, …, Bpm},其中m<=n。
  3. 选择置信度最高的边界框Bp1,并将其加入最终的输出列表L中。
  4. 对于剩下的边界框B’={Bp2, Bp3, …, Bpm},计算它们与Bp1之间的IoU值,如果IoU值大于阈值threshold,则将这些边界框的置信度score降低,降低程度根据IoU值和衰减因子sigma计算得到,然后将它们重新加入B’中。
  5. 从B’中选择置信度最高的边界框Bp2,并将其加入输出列表L中。
  6. 重复步骤4和步骤5,直到B’为空,此时输出列表L中即为Soft-NMS算法的结果。

通过调整cv::dnn::NMSBoxes中的Soft-NMS参数eta的值,可以控制抑制程度的大小。通常情况下,eta的取值范围为0.1—1.0之间,取值越小,抑制程度越大,取值越大,抑制程度越小。在实际应用中,需要根据具体情况来选择最优的eta值,以达到最优的检测效果。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/599338
推荐阅读
相关标签
  

闽ICP备14008679号