参考:
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



