赞
踩
先看看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
对于这个函数,可以在目标检测中筛选置信度低于阈值的,还进行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
第二个参数是预测中的的置信度得分,在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)
这个函数接口有点意思,直接做了两件事情,两个阈值的筛选,值得注意。
2020 4.23
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。