【深度学习】【实例分割】mask的IoU的代码分析

实例分割中mask的IoU的代码分析)

(话不多说上代码)

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]])
'''

你可能感兴趣的:(深度学习,深度学习)