【小知识】IoU的计算实现详解(基于Python)

1. 交并比(IoU)

具体来说,它是两边界框相交部分面积与相并部分面积之比,如下所示:
在这里插入图片描述
也就是两个框的交集和两个框的并集之比。

2.原理

这里详细解释一下计算的原理:
一般来说我们给定框的坐标有两种形式:
[x,y,w,h] (或者说是[x,y,h,w] 原理一样) 其中这里的x,y代表框的中心坐标,w代表宽,h代表高度。那么我们用中心坐标分别加上(减去)w/2和h/2就能把框四个角的坐标求出来。
[x1,y1,x2,y2] x1,y1代表左上角的顶点坐标,x2,y2代表右下角的坐标。也就是把对角的两个坐标给出。两种形式计算IoU的区别不大,以第一种形式为例子:
在这里插入图片描述
我们想要把两个框相交区域的面积(即深蓝色区域)S求出来,那么就要知道这个区域的宽和高,也就是图中的w和h。首先,我们根据给的[x,y,w,h] 坐标框可以把两个框的所有坐标计算出来:
在这里插入图片描述

看上图的两个虚线框,虚线框将两个框的上边线(下边线)框在了一起,要求h,我们只需要看Y轴方向,两条上边线的Y坐标分别是4(篮框)和3(黄框),两者取小即Ymax=3,同理下边线要取大即Ymin=2,很明显:
h=Ymax-Ymin=1,w同理。总结就是上取小下取大,右取小左取大在这里插入图片描述

3.代码实现

import numpy as np
class calculate_iou():
    
    def __init__(self,box1,box2):
        self.box1=box1
        self.box2=box2

    #以中心坐标格式为例
    def center_iou(self):
        x1,y1,w1,h1=self.box1
        x2,y2,w2,h2=self.box2
        
        #计算每个框的上下左右边线的坐标
        y1_max=y1+h1/2
        x1_max=x1+w1/2
        y1_min=y1-h1/2
        x1_min=x1-w1/2
    
        y2_max=y2+h2/2
        x2_max=x2+w2/2
        y2_min=y2-h2/2
        x2_min=x2-w2/2
        
        #上取小下取大,右取小左取大
        xx1 = np.max([x1_min, x2_min])
        yy1 = np.max([y1_min, y2_min])
        xx2 = np.min([x1_max, x2_max])
        yy2 = np.min([y1_max, y2_max])
        
        #计算各个框的面积
        area1 = (x1_max-x1_min) * (y1_max-y1_min) 
        area2 = (x2_max-x2_min) * (y2_max-y2_min)
        
        #计算相交的面积
        inter_area = (np.max([0, xx2-xx1])) * (np.max([0, yy2-yy1]))
        #计算IoU
        iou = inter_area / (area1+area2-inter_area)
        return iou
    
#传入目标框的坐标
a=calculate_iou([2,2,2,2],[3,3,2,2])

print(1/7)  # 根据公式手动计算的IoU:0.14285714285714285
a.center_iou()  # 0.14285714285714285

猜你喜欢

转载自blog.csdn.net/m0_46412065/article/details/127702426