赞
踩
在目标检测任务中,一个目标可能会被多个边界框检测到,这些边界框可能会有不同的位置和大小,但表示同一个目标。非极大值抑制(Non-Maximum Suppression,NMS)是一种常用的方法,用于抑制这些重叠的边界框,只保留置信度最高的那个边界框,从而得到最终的目标检测结果。
通过这样的处理,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
,那么就将其抑制掉,不保留。nms_threshold
,那么就将当前边界框抑制掉,不保留。top_k
,那么只保留置信度最高的前k个边界框。indices
中,以便后续使用。通过调用cv::dnn::NMSBoxes
函数,可以很方便地执行NMS操作,并得到最终保留下来的边界框的索引。这些索引可以用于获取相应的边界框位置和置信度等信息,从而得到最终的目标检测结果。
需要注意的是,NMS操作会抑制掉一部分重叠的边界框,因此可能会导致一些目标被误判为背景或被漏检。因此,在应用NMS操作时,需要根据具体应用场景和需求来调整阈值,以达到最优的检测效果。
此外,cv::dnn::NMSBoxes
函数还提供了参数eta
,用于进行Soft-NMS操作。Soft-NMS与传统的NMS操作类似,但是不是直接抑制掉与当前边界框重叠度高的边界框,而是通过降低其置信度来减少其对后续边界框的影响,从而提高目标检测的精度。下面我们来继续讲解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
其中,IoU(i, j)
表示第i
个边界框和第j
个边界框之间的IoU值,NMS_threshold
表示NMS阈值,weight_j
表示第j
个边界框的权重,eta
是Soft-NMS的参数。在每次迭代中,对于每个边界框i
,都会计算它和其他边界框之间的IoU值,并根据IoU值计算出它们之间的权重。最终,Soft-NMS会根据这些权重对置信度进行加权,从而得到最终的目标检测结果。
Soft-NMS算法的计算过程如下:
通过调整cv::dnn::NMSBoxes
中的Soft-NMS参数eta
的值,可以控制抑制程度的大小。通常情况下,eta
的取值范围为0.1—1.0之间,取值越小,抑制程度越大,取值越大,抑制程度越小。在实际应用中,需要根据具体情况来选择最优的eta
值,以达到最优的检测效果。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。