当前位置:   article > 正文

cv2.dnn.NMSBoxes()函数的理解

cv2.dnn.nmsboxes

先看看opencv源代码对这块的解释:

def NMSBoxes(bboxes, scores, score_threshold, nms_threshold, eta=None, top_k=None): # real signature unknown; restored from __doc__
    """
    NMSBoxes(bboxes, scores, score_threshold, nms_threshold[, eta[, top_k]]) -> indices
    .   @brief Performs non maximum suppression given boxes and corresponding scores.
    .   
    .   * @param bboxes a set of bounding boxes to apply NMS.
    .   * @param scores a set of corresponding confidences.
    .   * @param score_threshold a threshold used to filter boxes by score.
    .   * @param nms_threshold a threshold used in non maximum suppression.
    .   * @param indices the kept indices of bboxes after NMS.
    .   * @param eta a coefficient in adaptive threshold formula: \f$nms\_threshold_{i+1}=eta\cdot nms\_threshold_i\f$.
    .   * @param top_k if `>0`, keep at most @p top_k picked indices.
    """
    pass

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

对于这个函数,可以在目标检测中筛选置信度低于阈值的,还进行Nms筛选,至于参数,第一个参数是输入的预测框的尺寸,注意这里得尺寸是预测框左上角和右下角的尺寸,类似yolov3这种最后预测的坐标是中心点和长宽,那么要转化一下,下面提供一个转化函数:

'''author:nike hu'''
# 接下来将x,y,w,h转化为左上角和右下角
def change_to_conner(image_array):
    print(image_array.shape)
    change_array = torch.zeros_like(image_array)
    change_array[:,0] = image_array[:,0] - image_array[:,2] / 2 # 左上角x
    change_array[:,1] = image_array[:,1] - image_array[:,3] / 2 # 左上角y
    change_array[:,2] = image_array[:,0] + image_array[:,2] / 2 # 右下角x
    change_array[:,3] = image_array[:,1] + image_array[:,3] / 2 # 右下角y
    return change_array

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

第二个参数是预测中的的置信度得分,在yolov3中,使用opencv接口来使用yolov3最后输出的维度为[n, 85],其中n是预测的标签框的总数,85分别对应x,y,w,h,置信度,以及各个类别对应的可能性,我们使用的是coco数据集,coco数据集有80个类别,所以假设输出的参数为pred_box,那么第一个参数为pred_box[:,:4],第二个参数为pred_box[:, 4],第三个参数和第四个参数就是置信度阈值和nms阈值了,自己设置,后面两个参数一般用不上,指的注意的是,第一个参数和第二个参数对应的数据类型为List,而且第二个参数还得为float类型的List,最后输出的是pre_box列表中符合要求的下标。举例如下:

boxes_id = cv2.dnn.NMSBoxes(pred_box[:, :4].tolist(), pred_box[:, 4].tolist(), 0.5, 0.5)
  • 1

这个函数接口有点意思,直接做了两件事情,两个阈值的筛选,值得注意。

2020 4.23

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

闽ICP备14008679号