• 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
  • 相关阅读:
    学生HTML静态网页基础水平制作DIV+CSS+JavaScript技术制作美食网页——美食城6页面
    C++的强制类型转换简介
    过去式-ed的发音规则
    20、matlab信号波形生成:狄利克雷函数、高斯脉冲和高斯脉冲序列
    C# 中的委托
    实验三 利用flask框架和Echarts实现电影榜单可视化
    GBase 8c系统表-pg_amproc
    Elasticsearch节点及存储规划建议
    基于声卡实现的音频存储示波器,可作为电磁学实验的测量仪表
    创建线程池执行java代码逻辑
  • 原文地址:https://blog.csdn.net/m0_46412065/article/details/127702426