栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

IOU代码详解

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

IOU代码详解

参考:

IOU代码详细解释_ning469的博客-CSDN博客_iou代码

目录

第一种python代码:

第二种python代码:


定义:

IOU为两张图片的交并比。交集/并集

第一种python代码:
1 def bb_intersection_over_union(boxA, boxB):
     #定义一个函数来计算IOU的值
2    boxA = [int(x) for x in boxA] #从boxA中提取每一个元素x,并且每一个元素均为整数
3    boxB = [int(x) for x in boxB] #..
 
4    xA = max(boxA[0], boxB[0]) #BoxA、BoxB两个宽度之间的交集的左边值,即阴影的宽度w的最左边值
5    yA = max(boxA[1], boxB[1]) #BoxA、BoxB两个高度之间的交集的上面边值,即阴影的高度h的最上边值
6    xB = min(boxA[2], boxB[2]) #BoxA、BoxB两个宽度之间的交集的左边值,即阴影的宽度w的最右边值
7    yB = min(boxA[3], boxB[3]) #BoxA、BoxB两个高度之间的交集的上面边值,即阴影的高度h的最下边值
 
     #阴影部分的面积(xB - xA) *(yB -  yA)
     #个人认为此处+1 ,是保证两张图相同时,两者最大值都为0,使算的阴影面积不为0
8    interArea = max(0, xB - xA + 1) * max(0, yB - yA + 1) 
 
9    boxAArea = (boxA[2] - boxA[0] + 1) * (boxA[3] - boxA[1] + 1) #boxA的面积
10   boxBArea = (boxB[2] - boxB[0] + 1) * (boxB[3] - boxB[1] + 1) #boxB的面积
    
11   iou = interArea / float(boxAArea + boxBArea - interArea)
 
12   return iou

 此图摘自:​​​​​​​https://blog.csdn.net/ning469/article/details/107174132/

[x1_min,y1_min,x1_max,y1_max] # box1上面的、左面、下面、右面的线所在的坐标
[x2_min,y2_min,x2_max,y2_max] # box2上面的、左面、下面、右面的线所在的坐标

第二种python代码:


 

def compute_iou(self, box1, box2):
        '''
        计算两个框的重叠率IOU
        通过两组框的联合计算交集,每个框为[x1,y1,x2,y2]。
        Compute the intersection over union of two set of boxes, each box         
        is[x1,y1,x2,y2].
        Args:
          box1: (tensor) bounding boxes, sized [N,4].
          box2: (tensor) bounding boxes, sized [M,4].
        Return:
          (tensor) iou, sized [N,M].
        '''
        N = box1.size(0)                            
        M = box2.size(0)
        
        #unsqueeze(1).expand(N,M,2) 扩展第一维,填充使形状维N,M,2
        #box1[:,:2] 交叉部分xmax,ymax和box x,y  取最大的一组
        lt = torch.max(
            box1[:,:2].unsqueeze(1).expand(N,M,2),  # [N,2] -> [N,1,2] -> [N,M,2]
            box2[:,:2].unsqueeze(0).expand(N,M,2),  # [M,2] -> [1,M,2] -> [N,M,2]
        )
        
        #取最小的一组
        rb = torch.min(
            box1[:,2:].unsqueeze(1).expand(N,M,2),  # [N,2] -> [N,1,2] -> [N,M,2]
            box2[:,2:].unsqueeze(0).expand(N,M,2),  # [M,2] -> [1,M,2] -> [N,M,2]
        )

        wh = rb - lt  # [N,M,2] 交叉部分 max-xmin    ymax-ymin
        # wh(wh<0)= 0  # clip at 0
        wh= (wh < 0).float()
        inter = wh[:,:,0] * wh[:,:,1]  # [N,M],(xmax-xmin)*(ymax-ymin)
        
        #box1的面积 (xmax-xmin)*(ymax-ymin)
        area1 = (box1[:,2]-box1[:,0]) * (box1[:,3]-box1[:,1])  # [N,] 
        #box2的面积
        area2 = (box2[:,2]-box2[:,0]) * (box2[:,3]-box2[:,1])  # [M,]
        area1 = area1.unsqueeze(1).expand_as(inter)  # [N,] -> [N,1] -> [N,M]
        area2 = area2.unsqueeze(0).expand_as(inter)  # [M,] -> [1,M] -> [N,M]

        iou = inter / (area1 + area2 - inter)
        return iou

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/580493.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号