(话不多说上代码)
def mask_iou(mask1, mask2):
"""
mask1: [m1,n] m1 means number of predicted objects
mask2: [m2,n] m2 means number of gt objects
Note: n means image_w x image_h
"""
intersection = torch.matmul(mask1, mask2.t())
area1 = torch.sum(mask1, dim=1).view(1, -1)
area2 = torch.sum(mask2, dim=1).view(1, -1)
union = (area1.t() + area2) - intersection
iou = intersection / union
return iou
(让我们举个栗子?吧)
mask1
,mask2
import torch
a = torch.randn(3,8) #均值为0方差为1的正态分布
a.gt_(0) #二值化:大于0的数替换为1 小于0的数替换为0
b = torch.randn(5,8)
b.gt_(0)
'''
a: tensor([[1., 0., 0., 0., 0., 0., 1., 1.],
[1., 0., 1., 1., 0., 0., 1., 0.],
[1., 1., 0., 0., 0., 0., 1., 0.]])
b: tensor([[0., 1., 1., 1., 0., 1., 1., 1.],
[0., 0., 0., 1., 1., 1., 0., 0.],
[0., 0., 1., 1., 0., 0., 1., 1.],
[1., 1., 0., 0., 0., 0., 0., 0.],
[1., 0., 0., 1., 1., 0., 1., 1.]])
'''
intersection
intersection = torch.matmul(a,b.t())
#3x5 第(i,j)个数字代表a中第i行与b中第j行对应位置都为1的个数
'''
tensor([[2., 0., 2., 1., 3.],
[3., 1., 3., 1., 3.],
[2., 0., 1., 2., 2.]])
'''
union
area1 = torch.sum(a, dim=1).view(1, -1)
#[1,3]的矩阵 分别代表a中第i行1的个数
#tensor([[3., 4., 3.]])
area2 = torch.sum(b, dim=1).view(1, -1)
#[1,5]的矩阵 分别代表b中第j行1的个数
#tensor([[6., 3., 4., 2., 5.]])
union = area1.t() + area2 - intersection #利用了 ‘广播原则’
#[3,5]的矩阵 第(i,j)个数字代表a中第i行与b中第j行所有位置都为1的个数
'''
tensor([[7., 6., 5., 4., 5.],
[7., 6., 5., 5., 6.],
[7., 6., 6., 3., 6.]])
'''
iou
ret = intersection / union
# 第(i,j)个数字代表a中第i行与b中第j行的iou
'''
tensor([[0.2857, 0.0000, 0.4000, 0.2500, 0.6000],
[0.4286, 0.1667, 0.6000, 0.2000, 0.5000],
[0.2857, 0.0000, 0.1667, 0.6667, 0.3333]])
'''