非极大值抑制(Non-Maximum Suppression,NMS)
在目标检测任务中,一个目标可能会被多个边界框检测到,这些边界框可能会有不同的位置和大小,但表示同一个目标。非极大值抑制(Non-Maximum Suppression,NMS)是一种常用的方法,用于抑制这些重叠的边界框,只保留置信度最高的那个边界框,从而得到最终的目标检测结果。
1、NMS算法原理
- 首先,对所有的边界框按照其置信度进行排序,置信度最高的边界框排在最前面。
- 从置信度最高的边界框开始,依次遍历其余边界框。
- 对于当前遍历到的边界框,如果它与前面已经保留的边界框的重叠程度(通过计算IOU值)大于一定阈值(比如0.5),那么就将其抑制掉,不保留。
- 继续遍历下一个边界框,重复上述过程,直到所有的边界框都被处理完毕。
通过这样的处理,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表示保留全部
)
该函数的参数含义如下:
-
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
函数的具体操作如下:
- 首先,将所有边界框按照其置信度进行排序,置信度高的边界框排在前面。
- 从置信度最高的边界框开始,依次遍历其余边界框。
- 对于当前遍历到的边界框,如果其置信度低于阈值
score_threshold
,那么就将其抑制掉,不保留。 - 对于当前遍历到的边界框,计算其余所有未被抑制的边界框与它的重叠度(通过计算IOU值),如果重叠度大于阈值
nms_threshold
,那么就将当前边界框抑制掉,不保留。 - 继续遍历下一个边界框,重复上述过程,直到所有的边界框都被处理完毕。
- 如果指定了参数
top_k
,那么只保留置信度最高的前k个边界框。 - 将保留下来的边界框的索引存储在
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
\begin{aligned} &\text{for each box } i, \text{do} \\ &\qquad\text{set } \text{max}_j = i \\ &\qquad\text{for each box } j \neq i, \text{do} \\ &\qquad\qquad\text{if IoU}(i,j) > \text{NMS}_\text{threshold} \text{ then } \text{weight}_j = 0 \\ &\qquad\qquad\text{else } \text{weight}_j = \text{exp}(-\frac{(\text{IoU}(i,j))^2}{\text{eta}}) \\ &\qquad\qquad\text{if } \text{weight}_j > \text{weight}_{\text{max}_j} \text{ then set } \text{max}_j = j \\ &\qquad\text{end for} \\ &\qquad\text{if } \text{max}_j \neq i \text{ then} \\ &\qquad\qquad\text{score}_i = \text{weight}_i \text{score}_i \\ &\qquad\qquad\text{score}_{\text{max}_j} = (1-\text{weight}_i) \text{score}_{\text{max}_j} \\ &\qquad\text{end if} \\ &\text{end for} \\ \end{aligned}
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=(1−weighti)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算法的计算过程如下:文章来源:https://www.toymoban.com/news/detail-758790.html
- 输入一组边界框B={B1, B2, …, Bn},以及每个边界框的置信度score={s1, s2, …, sn},以及两个参数:NMS阈值threshold和衰减因子sigma。
- 将B中所有边界框按照置信度score从大到小排序,得到排序后的边界框序列B’= {Bp1, Bp2, …, Bpm},其中m<=n。
- 选择置信度最高的边界框Bp1,并将其加入最终的输出列表L中。
- 对于剩下的边界框B’={Bp2, Bp3, …, Bpm},计算它们与Bp1之间的IoU值,如果IoU值大于阈值threshold,则将这些边界框的置信度score降低,降低程度根据IoU值和衰减因子sigma计算得到,然后将它们重新加入B’中。
- 从B’中选择置信度最高的边界框Bp2,并将其加入输出列表L中。
- 重复步骤4和步骤5,直到B’为空,此时输出列表L中即为Soft-NMS算法的结果。
通过调整cv::dnn::NMSBoxes
中的Soft-NMS参数eta
的值,可以控制抑制程度的大小。通常情况下,eta
的取值范围为0.1—1.0之间,取值越小,抑制程度越大,取值越大,抑制程度越小。在实际应用中,需要根据具体情况来选择最优的eta
值,以达到最优的检测效果。文章来源地址https://www.toymoban.com/news/detail-758790.html
到了这里,关于【目标检测】 非极大值抑制—NMS的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!