NMS
NMS广泛应用于目标检测算法中。其目的是为了消除多余的候选框,找到最佳的物体检测位置。
现在假设有有一个候选的boxes的集合B和其对应的scores集合S:
1. 找出分数最高的M;
2. 将M对应的box从B中删除;
3. 将删除的box添加到集合D中;
4. 从B中删除与M对应的box重叠区域大于阈值Nt的其他框;
5. 重复上述步骤1-4。
伪代码如下:
其中si可表述为:
Mask RCNN中的Python实现:
def non_max_suppression(boxes, scores, threshold):
"""执行non-maximum suppression并返回保留的boxes的索引.
boxes: [N, (y1, x1, y2, x2)].注意(y2, x2)可以会超过box的边界.
scores: box的分数的一维数组.
threshold: Float型. 用于过滤IoU的阈值.
"""
assert boxes.shape[0] > 0
if boxes.dtype.kind != "f":
boxes = boxes.astype(np.float32)
#计算box面积
y1 = boxes[:, 0]
x1 = boxes[:, 1]
y2 = boxes[:, 2]
x2 = boxes[:, 3]
area = (y2 - y1) * (x2 - x1)
#获取根据分数排序的boxes的索引(最高的排在对前面)
ixs = scores.argsort()[::-1]
pick = []
while len(ixs) > 0:
#选择排在最前的box,并将其索引加到列表中
i = ixs[0]
pick.APPend(i)
#计算选择的box与剩下的box的IoU
iou = compute_iou(boxes[i], boxes[ixs[1:]], area[i], area[ixs[1:]])
#确定IoU大于阈值的boxes. 这里返回的是ix[1:]之后的索引,
#所以为了与ixs保持一致,将结果加1
remove_ixs = np.where(iou > threshold)[0] + 1
#将选择的box和重叠的boxes的索引删除.
ixs = np.delete(ixs, remove_ixs)
ixs = np.delete(ixs, 0)
return np.array(pick, dtype=np.int32)
相关阅读
在本系列上、中两篇,我们分别探讨了“小我”和“大我”型的广告,今天要和大家探讨并分享“无我型”的广告案例。什么是“无我型”的
非医疗新闻源推广套餐包含的软文广告推广媒体有东南之窗、闽南之窗 、泰州新闻网、湛江新闻网 、绍兴新闻网、广佛都市网、孝感新
A5创业网(公众号:iadmin5)5月28日报道,近日,@优酷在微博发布致歉声明,对电影《无问西东》推送中使用的不当词汇向网友和章子怡道歉。在
继传统BBS社区相继倒下,被人熟知的猫扑近日也传出了将要“卖身”的消息。根据Bianews报道,猫扑社区目前正在寻求出售,或出
2019年1月1日凌晨,罗振宇的第四次《时间的朋友》跨年演讲收官。相比于往年,今年这场演讲收获了更高的关注度和话题度。从收视率来看