NMS非极大值抑制疑问,bbox和当前最高分框的重叠面积(IOU)小于一定阈值 那这些框该怎么处理呢?

下面是NMS的基本的算法流程,

(1)将所有框的得分排序,选中最高分及其对应的框 
(2)遍历其余的框,如果和当前最高分框的重叠面积(IOU)大于一定阈值,我们就将框删除。 
(3)从未处理的框中继续选一个得分最高的,重复上述过程。

 

我的疑问是: 步骤(2)中遍历其余的框,如果和当前最高分框的重叠面积(IOU)小于一定阈值 那这些该怎么处理呢?谢谢?

例如对于人脸检测出了2个bbox,分别为A,B,其置信率分别为0.9,0.3,但是他们两个bbox没有交集或者交集小于NMS规定的阈值,那请问最后是取那个框作为检测框呢?

我想我应该表述清楚我的疑问了,谢谢大家的解答~!

非极大值抑制(Non-Maximum Suppression, NMS)是一种用于去除重叠检测的算法。在YOLOv8中,NMS的实现可以参考以下的代码: ```python def non_max_suppression(prediction, conf_thres=0.25, iou_thres=0.45, classes=None, agnostic=False, multi_label=False, labels=(), max_det=300, nms_kind="greedy", beta_nms=0.6): # prediction是网络输出,包含了检测的位置和置信度等信息 # conf_thres是置信度的阈值,低于该阈值的检测会被忽略 # iou_thres是IoU阈值重叠度高于该阈值的检测会被合并 # classes是要保留的类别,如果为None,则保留所有类别 # agnostic表示是否忽略检测的类别 # multi_label表示是否允许一个物体被多个检测到 # labels是给定的标签列表,只有这些标签的检测会被保留 # max_det是最多保留的检测数量 # nms_kind表示采用哪种NMS算法,可以是"greedy"或"soft" # beta_nms是软NMS算法中的参数 # ... # 对每个图像进行处理,假设prediction的shape为(batch_size, num_anchors, num_classes+5) for i, (pred, im_labels, _) in enumerate(zip(prediction, labels, image_sizes)): # ... # 获取置信度大于阈值的检测 pred = pred[pred[:, 4] > conf_thres] # 如果没有符合要求的检测,则跳过 if not pred.size(0): continue # 根据置信度从大到小排序 pred = pred[(-pred[:, 4]).argsort()] # 如果指定了类别,则只保留该类别的检测 if classes is not None: pred = pred[pred[:, 5].long() == classes] # 如果指定了标签,则只保留包含该标签的检测 if len(im_labels): pred = pred[np.array([all(x in p for x in im_labels) for p in pred[:, -1]])] # 如果没有符合要求的检测,则跳过 if not pred.size(0): continue # 获取检测的坐标和置信度 pred_boxes = pred[:, :4] pred_scores = pred[:, 4] # 计算检测面积 pred_areas = (pred_boxes[:, 2] - pred_boxes[:, 0]) * (pred_boxes[:, 3] - pred_boxes[:, 1]) # 初始化被保留的检测 keep = [] # 采用不同的NMS算法进行处理 if nms_kind == "greedy": # 采用贪心NMS算法 while pred.size(0): # 保留置信度最大的检测 i = pred_scores.argmax() keep.append(i) # 计算当前检测与其他检测IoU ious = bbox_iou(pred_boxes[i:i+1], pred_boxes) # 找出IoU大于阈值的检测,删除它们 idx = (ious > iou_thres).nonzero(as_tuple=False).squeeze() pred = np.delete(pred, idx, axis=0) # 删除已经处理过的检测 mask = np.array([i not in idx for i in range(len(pred))]) pred_boxes = pred_boxes[mask] pred_scores = pred_scores[mask] pred_areas = pred_areas[mask] elif nms_kind == "soft": # 采用软NMS算法 while pred.size(0): # 保留置信度最大的检测 i = pred_scores.argmax() keep.append(i) # 计算当前检测与其他检测IoU ious = bbox_iou(pred_boxes[i:i+1], pred_boxes) # 采用指数函数进行权重调整 weights = np.exp(-(ious * ious) / beta_nms) # 更新置信度 pred_scores *= weights # 删除置信度小于阈值的检测 idx = (pred_scores < conf_thres).nonzero(as_tuple=False).squeeze() pred = np.delete(pred, idx, axis=0) # 删除已经处理过的检测 mask = np.array([i not in idx for i in range(len(pred))]) pred_boxes = pred_boxes[mask] pred_scores = pred_scores[mask] pred_areas = pred_areas[mask] # 只保留前max_det个检测 keep = keep[:max_det] # 更新预测结果 prediction[i] = prediction[i][keep] return prediction ``` 该函数的输入参数包括网络输出(prediction)、置信度阈值(conf_thres)、IoU阈值(iou_thres)、要保留的类别(classes)、是否忽略检测的类别(agnostic)、是否允许一个物体被多个检测到(multi_label)、给定的标签列表(labels)、最多保留的检测数量(max_det)、采用哪种NMS算法(nms_kind)和软NMS算法中的参数(beta_nms)等。在函数内部,首先根据置信度阈值和类别过滤掉一部分检测,然后按照置信度从大到小排序。接着,分别采用贪心NMS算法和软NMS算法对每个图像的检测进行处理,最终得到被保留的检测。最后,将保留下来的检测更新到预测结果中,返回更新后的预测结果。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值