nms剔除包含的bbox

nms剔除包含的bbox,第1张

nms剔除包含的bbox

https://blog.csdn.net/qq_39852676/article/details/111066575

def nms(bboxes):
    """非极大抑制过程
    :param bboxes: 同类别候选框坐标
    :return:
    """

    bboxes = np.array(bboxes.cpu())
    # 取出n个的极坐标点
    x1 = bboxes[:, 0]
    y1 = bboxes[:, 1]
    x2 = bboxes[:, 2]
    y2 = bboxes[:, 3]
    scores = bboxes[:, 4] * bboxes[:, 5]
    # 2、对候选框进行NMS筛选
    # 从大到小排列,取index
    order = scores.argsort()[::-1]
    areas = (x2 - x1) * (y2 - y1)
    # 2、对候选框进行NMS筛选
    # 返回的框坐标和分数
    picked_boxes = []
    while order.size > 0:
        # 将当前置信度最大的框加入返回值列表中
        index = order[-1]
        picked_boxes.append(bboxes[index])

        # 获取当前置信度最大的候选框与其他任意候选框的相交面积
        x11 = np.maximum(x1[index], x1[order[:-1]])
        y11 = np.maximum(y1[index], y1[order[:-1]])
        x22 = np.minimum(x2[index], x2[order[:-1]])
        y22 = np.minimum(y2[index], y2[order[:-1]])

        # 计算当前矩形框与其余框的比值
        rate = areas[index] / areas[order[:-1]]
        # 计算其余框于u当前框的比值
        rate1 = areas[order[:-1]] / areas[index]

        w = np.maximum(0.0, x22 - x11)
        h = np.maximum(0.0, y22 - y11)
        intersection = w * h

        # 利用相交的面积和两个框自身的面积计算框的交并比, 保留大于阈值的框
        ratio = intersection / (areas[index] + areas[order[:-1]] - intersection)

        # rate==ratio表示包含关系,保留不为包含关系的框
        #修改2
        keep_boxes_indics = np.where(abs(ratio - rate)>0.01)
        keep_boxes_indics1 = np.where(abs(ratio - rate1)>0.01)
        # 修改1  
        if keep_boxes_indics[0].__len__() < keep_boxes_indics1[0].__len__():
            order = order[keep_boxes_indics]
        else:
            order = order[keep_boxes_indics1]


    return picked_boxes

计算两个bbox相交的面积站两个面积和的比值
计算1个bbox站其他的比值
如果两个比值相等,那么完全包含。我写的是相比小于0.01 就是两个比值很相似也算是包含。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5572107.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存