Pytorch实现语义分割指标

引言

本文主要参考了FCN论文[1]和一篇综述[2]中的指标描述,用Pytorch实现了pixel accuarcy,mean accuarcy,mean IU,以及frequency weighted IU等指标。

正文

由于FCN模型得到的数据形状为(N,NC,H,W),其中N为batch size个数,NC为类别总个数,包括背景类,高和宽为H,W。这个数据先经过softmax在dim=1处处理,然后再选择每个像素在不同类别下的最大值即得到形状为(N,H,W)的数据,在Pytorch中可由代码torch.argmax(input, dim=1)实现。
由于原本的labels为(N,C,H,W),其中C为RGB通道数,需要建立一个索引把labels转换成形状为(N,H,W)的数据,其中每个像素值范围为[0,NC),即用不同像素值来表示不同类别,本文并不涉及这个转换过程。前期准备工作完成,接下来就是用Pytorch代码进行实现,如下图所示为FCN论文当中对指标的定义:

metrics
需要说明的一点:我在计算pixel accuracy指标时并没有用到混淆矩阵,但在训练过程中,所有指标的计算都需要混淆矩阵,并且随着训练数据的增加需要不断地更新混淆矩阵中的值来计算指标。

1. pixel accuarcy

def confusion_matrix(input, target, num_classes):
    """
    input: torch.LongTensor:(N, H, W)
    target: torch.LongTensor:(N, H, W)
    num_classes: int
    results:Tensor
    """
    assert torch.max(input) < num_classes
    assert torch.max(target) < num_classes
    H, W = target.size()[-2:]
    results = torch.zeros((num_classes, num_classes), dtype=torch.long)
    for i, j in zip(target.flatten(), input.flatten()):
        results[i, j] += 1
    return results
    
def pixel_accuracy(input, target):
    """
    input: torch.FloatTensor:(N, C, H, W)
    target: torch.LongTensor:(N, H, W)
    return: Tensor
    """
    assert len(input.size()) == 4
    assert len(target.size()) == 3
    N, H, W = target.size()
    input = F.softmax(input, dim=1)
    arg_max = torch.argmax(input, dim=1)
    # (TP + TN) / (TP + TN + FP + FN)
    return torch.sum(arg_max == target) / (N * H * W)

2. mean accuarcy

def mean_pixel_accuarcy(input, target):
    """
    input: torch.FloatTensor:(N, C, H, W)
    target: torch.LongTensor:(N, H, W)
    return: Tensor
    """
    N, num_classes, H, W = input.size()
    input = F.softmax(input, dim=1)
    arg_max = torch.argmax(input, dim=1)
    confuse_matrix = confusion_matrix(arg_max, target, num_classes)
    result = 0
    for i in range(num_classes):
        result += (confuse_matrix[i, i] / torch.sum(confuse_matrix[i, :]))

    return result / num_classes

3. mean IU

def mean_iou(input, target):
    """
    input: torch.FloatTensor:(N, C, H, W)
    target: torch.LongTensor:(N, H, W)
    return: Tensor
    """
    assert len(input.size()) == 4
    assert len(target.size()) == 3
    N, num_classes, H, W = input.size()
    input = F.softmax(input, dim=1)
    arg_max = torch.argmax(input, dim=1)
    result = 0
    confuse_matrix = confusion_matrix(arg_max, target, num_classes)
    for i in range(num_classes):
        nii = confuse_matrix[i, i]
        # consider the case where the denominator is zero.
        if nii == 0:
            continue
        else:
            ti, tj = torch.sum(confuse_matrix[i, :]), torch.sum(confuse_matrix[:, i])
            result += (nii / (ti + tj - nii))

    return result / num_classes

4. frequecy weighted IU

def frequency_weighted_iou(input, target):
    """
    input: torch.FloatTensor:(N, C, H, W)
    target: torch.LongTensor:(N, H, W)
    return: Tensor
    """
    assert len(input.size()) == 4
    assert len(target.size()) == 3
    N, num_classes, H, W = input.size()
    input = F.softmax(input, dim=1)
    arg_max = torch.argmax(input, dim=1)
    # get confusion matrix
    result = 0
    confuse_matrix = confusion_matrix(arg_max, target, num_classes)
    for i in range(num_classes):
        nii = confuse_matrix[i, i]
        # consider the case where the denominator is zero.
        if nii == 0:
            continue
        else:
            ti, tj = torch.sum(confuse_matrix[i, :]), torch.sum(confuse_matrix[:, i])
            result += (ti * nii / (ti + tj - nii))

    return result / torch.sum(confuse_matrix)

结语

本文主要是用Pytorch实现了语义分割常用的一些指标,代码部分还有优化和改进的地方,欢迎大家进行交流并提出建议。

参考文献

[1] Shelhamer E, Long J, Darrell T. Fully Convolutional Networks for Semantic Segmentation. IEEE Trans Pattern Anal Mach Intell. 2017 Apr;39(4):640-651. doi: 10.1109/TPAMI.2016.2572683. Epub 2016 May 24. PMID: 27244717.
[2] Garcia-Garcia A , Orts-Escolano S , Oprea S , et al. A Review on Deep Learning Techniques Applied to Semantic Segmentation[J]. 2017.

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: PyTorch是一种广泛应用于深度学习的Python库,可以用于许多领域的人工智能应用,包括遥感图像处理。遥感语义分割是指对遥感图像进行像素级别的分类,以识别不同的物体和地物类型。 使用PyTorch进行遥感语义分割需要进行以下步骤: 第一,准备数据集。数据集应包含遥感图像以及每个像素的标签。在语义分割中,标签应用于指定每个像素所表示的地物或物体类别。 第二,构建模型。可以使用PyTorch的高级API,如torch.nn来构建自己的深度学习模型。这些模型通常基于卷积神经网络(CNN),使用卷积、池化以及其他操作来提取图像中的特征并进行分类。 第三,模型训练。在模型训练之前,需要将数据集拆分为训练、验证以及测试子集。在训练期间,使用优化器和损失函数来更新模型权重,并通过验证数据来调整超参数,如学习率和训练批次大小。 第四,模型测试。用测试数据集对模型进行评估,并计算出预测结果的精度和损失值以及其他性能指标。 整个遥感语义分割的流程涉及到数据预处理、模型训练、预测等多个步骤,需要在进行任务之前对任务需求和数据进行深入的了解和研究。其中,PyTorch的优点是具有快速迭代开发和丰富的API支持,同时也可以很好的与其他深度学习框架配合运用。 ### 回答2: PyTorch是一种用于机器学习和深度学习的Python库,它可以协助我们在计算中构建灵活的神经网络。在遥感数据分析中,语义分割是一种用于将像素点分类为不同的对象或场景的技术。它可以将遥感影像转化为具有语义信息的结果,方便进一步的分析及应用。 PyTorch在遥感语义分割中可以发挥巨大作用,它可以以端到端的方式处理大规模的遥感数据。PyTorch中存在许多现成的模型,如U-Net、FCN等,通过简单的调用,我们可以轻松地搭建和训练自己的遥感语义分割模型。在训练过程中,PyTorch可以实现数据增强、模型优化等功能,提高模型的准确率和泛化能力。 此外,PyTorch支持GPU加速,可以大幅提升训练速度和效率,避免了数据规模较大时的运算困难。同时,PyTorch也易于使用和维护,其代码可读性和灵活性是其他深度学习库无法比拟的。 总而言之,PyTorch可以为我们在遥感语义分割中提供强大的工具和支持,使我们能够更轻松地构建、训练和优化自己的模型,快速地获得准确的遥感数据分析结果。 ### 回答3: PyTorch深度学习框架之一,它在遥感语义分割领域中得到了广泛应用。遥感图像通常包含大量的地物信息,而遥感语义分割旨在将遥感图像中的每个像素分类为不同的地物类别,例如水、道路、建筑等。这对于资源管理、城市规划和灾害响应等领域非常重要。 使用PyTorch进行遥感语义分割的过程大致如下:首先,收集并准备遥感图像数据集,并对其进行预处理和标注。然后,将数据集加载到PyTorch中,并使用卷积神经网络(CNN)进行训练。在训练过程中,通过迭代反向传播并更新权重参数,来最小化损失函数。最后,使用训练好的模型对新的遥感图像进行分割。 PyTorch提供了很多有用的工具和库,例如TorchVision和TorchIO,可以帮助我们更轻松地进行数据处理和建立网络模型。此外,PyTorch还可以将模型部署到各种硬件上,例如GPU、CPU和移动设备,以提高性能和效率。 总之,使用PyTorch进行遥感语义分割是一项挑战性十足的任务,但是它可以提供准确的地物分类和高质量的地图制作,为我们的城市规划和资源管理工作提供有力支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值