非极大值抑制


一、基本原理

在这里插入图片描述

二、代码

1.计算IOU

代码如下(示例):

def compute_iou(box1:tuple,box2:tuple)->int:
    """
    :param x1: box1的坐标
    :param x2: box2的坐标
    :return: 计算的交并比
    """
    #计算两个框的面积
    x1min, y1min, x1max, y1max = box1[0], box1[1], box1[2], box1[3]
    x2min, y2min, x2max, y2max = box2[0], box2[1], box2[2], box2[3]
    #计算相交部分的坐标
    iner_xmin=max(x1min,x2min)
    iner_ymin=max(y1min,y2min)
    iner_xmax=min(x1max,x2max)
    iner_ymax=min(y1max,y2max)

    iner_area=max((iner_xmax-iner_xmin+1)*(iner_ymax-iner_ymin+1),0)
    box1_area=(x1max-x1min+1)*(y1max-y1min+1)
    box2_area = (x2max-x2min + 1) * ( y2max-y2min+ 1)

    iou=iner_area/(box1_area+box2_area-iner_area)
    return iou

2.非极大值抑制

代码如下(示例):

def num(score:list,bounding_box:list,threshold:int):
    """
    :param score: 预测的分数,列表形式
    :param bounding_box: 每个预测框对应的坐标值:列表内的每个元素为预测框的坐标(左上角横坐标,左上角纵坐标,右下角横坐标,右下角纵坐标)
    :return: 返回挑选后的score和bounding_box列表
    """
    picked_score=[]
    picked_boundingbox=[]
    if len(bounding_box)==0:
        return picked_score,picked_boundingbox
    sortscore=[index for index,value in sorted(enumerate(score),key=lambda x:x[1])]
    picked_score.append(score[sortscore[-1]])
    picked_boundingbox.append(bounding_box[sortscore[-1]])
    del score[sortscore[-1]]
    del bounding_box[sortscore[-1]]
    for i,box in enumerate(bounding_box):
        iou=compute_iou(picked_boundingbox[0],box)
        if iou>threshold:
            picked_score.append(score[i])
            picked_boundingbox.append(box)
    return picked_score,picked_boundingbox

3.测试用例

bounding_boxes = [(600, 40, 437, 227), (510, 47, 305, 182), (561, 35, 418, 304)]
confidence_score = [0.9, 0.75, 0.8]
picked_score,picked_boundingbox=num(confidence_score,bounding_boxes,0.4)
print(picked_score,picked_boundingbox)

3.整体代码

def compute_iou(box1:tuple,box2:tuple)->int:
    """
    :param x1: box1的坐标
    :param x2: box2的坐标
    :return: 计算的交并比
    """
    #计算两个框的面积
    x1min, y1min, x1max, y1max = box1[0], box1[1], box1[2], box1[3]
    x2min, y2min, x2max, y2max = box2[0], box2[1], box2[2], box2[3]
    #计算相交部分的坐标
    iner_xmin=max(x1min,x2min)
    iner_ymin=max(y1min,y2min)
    iner_xmax=min(x1max,x2max)
    iner_ymax=min(y1max,y2max)

    iner_area=max((iner_xmax-iner_xmin+1)*(iner_ymax-iner_ymin+1),0)
    box1_area=(x1max-x1min+1)*(y1max-y1min+1)
    box2_area = (x2max-x2min + 1) * ( y2max-y2min+ 1)

    iou=iner_area/(box1_area+box2_area-iner_area)
    return iou


def num(score:list,bounding_box:list,threshold:int):
    """
    :param score: 预测的分数,列表形式
    :param bounding_box: 每个预测框对应的坐标值:列表内的每个元素为预测框的坐标(左上角横坐标,左上角纵坐标,右下角横坐标,右下角纵坐标)
    :return: 返回挑选后的score和bounding_box列表
    """
    picked_score=[]
    picked_boundingbox=[]
    if len(bounding_box)==0:
        return picked_score,picked_boundingbox
    sortscore=[index for index,value in sorted(enumerate(score),key=lambda x:x[1])]
    picked_score.append(score[sortscore[-1]])
    picked_boundingbox.append(bounding_box[sortscore[-1]])
    del score[sortscore[-1]]
    del bounding_box[sortscore[-1]]
    for i,box in enumerate(bounding_box):
        iou=compute_iou(picked_boundingbox[0],box)
        if iou>threshold:
            picked_score.append(score[i])
            picked_boundingbox.append(box)
    return picked_score,picked_boundingbox

bounding_boxes = [(600, 40, 437, 227), (510, 47, 305, 182), (561, 35, 418, 304)]
confidence_score = [0.9, 0.75, 0.8]
picked_score,picked_boundingbox=num(confidence_score,bounding_boxes,0.4)
print(picked_score,picked_boundingbox)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值