暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

目标检测中的IoU+PyTorch实现

南极Python 2021-05-06
1681

IoU 理论讲解

在计算机中,图像的坐标系是以左上角为原点,原点向右(x轴)和向下(y轴)分别作为两个坐标轴构成的,分别代表图像的宽度(width)和高度(height)。

下面的图片中,红色框是标注好的框(Ground Truth),蓝色框是预测出来的。

那么这两个框的交集就是下面黄色填充的区域:

而两个框的并集,就是把两个框的区域合并(重叠部分+不重叠部分),就像下面这样:

IoU就是交集区域面积与并集区域面积的比值,其计算公式如下:

假设已知每个框的左上角坐标和右下角坐标,具体地,用[x1,y1,x2,y2]代表蓝色框的坐标,用[xx1,yy1,xx2,yy2]代表红色框的坐标:

现在来确定交集的左上角和右下角的坐标:

左上角坐标为右下角坐标为

那么两者的交集区域面积为:

当两者无交集时,上式的乘法中有一项为负数,我们可以规定,只要出现负数,就取成0,即此时两者无交集,交集区域面积为0。下面这张图是无交集时的一种情况:

PyTorch实现IoU

有了以上的理论讲解,代码实现起来就很简单了,直接上代码:

import torch
def insert_over_union(boxes_preds,boxes_labels):
    #预测框的左上角和右下角坐标
    box1_x1=boxes_preds[...,0:1]
    box1_y1=boxes_preds[...,1:2]
    box1_x2=boxes_preds[...,2:3]
    box1_y2=boxes_preds[...,3:4]#shape:[N,1]
    #实际框的左上角和右下角坐标
    box2_x1=boxes_labels[...,0:1]
    box2_y1=boxes_labels[...,1:2]
    box2_x2=boxes_labels[...,2:3]
    box2_y2=boxes_labels[...,3:4]
    #交集区域的左上角和右下角坐标
    x1=torch.max(box1_x1,box2_x1)
    y1=torch.max(box1_y1,box2_y1)
    x2=torch.min(box1_x2,box2_x2)
    y2=torch.min(box1_y2,box2_y2)
    #计算交集区域的面积,clamp用于无交集的情况
    intersection=(x2-x1).clamp(0)*(y2-y1).clamp(0)
    #计算预测框区域的面积
    box1_area=abs((box1_x2-box1_x1)*(box1_y1-box1_y2))
    #计算实际框区域的面积
    box2_area=abs((box2_x2-box2_x1)*(box2_y1-box2_y2))
    #返回的结果即为iou
    return intersection/(box1_area+box2_area-intersection+1e-6)

测试一下:

参考:

  • https://www.youtube.com/watch?v=XXYG5ZWtjj0&t=503s


重磅!南极Python交流群已成立,添加下方微信,备注加群即可进群。


                             感谢点赞,分享和在看的你!

文章转载自南极Python,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论