引言

本文主要参考了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论文当中对指标的定义:


需要说明的一点:我在计算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: intresults:Tensor"""assert torch.max(input) < num_classesassert torch.max(target) < num_classesH, 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] += 1return resultsdef pixel_accuracy(input, target):"""input: torch.FloatTensor:(N, C, H, W)target: torch.LongTensor:(N, H, W)return: Tensor"""assert len(input.size()) == 4assert len(target.size()) == 3N, 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 = 0for 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()) == 4assert len(target.size()) == 3N, num_classes, H, W = input.size()input = F.softmax(input, dim=1)arg_max = torch.argmax(input, dim=1)result = 0confuse_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:continueelse: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()) == 4assert len(target.size()) == 3N, num_classes, H, W = input.size()input = F.softmax(input, dim=1)arg_max = torch.argmax(input, dim=1)# get confusion matrixresult = 0confuse_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:continueelse: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.

Pytorch实现语义分割指标相关推荐

  1. 如何用PyTorch进行语义分割?

    木易 发自 凹非寺  量子位 报道 | 公众号 QbitAI 很久没给大家带来教程资源啦. 正值PyTorch 1.7更新,那么我们这次便给大家带来一个PyTorch简单实用的教程资源:用PyTorc ...

  2. 如何用PyTorch进行语义分割?一个教程教会你|资源

    木易 发自 凹非寺  量子位 报道 | 公众号 QbitAI 很久没给大家带来教程资源啦. 正值PyTorch 1.7更新,那么我们这次便给大家带来一个PyTorch简单实用的教程资源:用PyTorc ...

  3. python实现语义分割_如何用PyTorch进行语义分割?一文搞定

    很久没给大家带来教程资源啦. 正值PyTorch 1.7更新,那么我们这次便给大家带来一个PyTorch简单实用的教程资源:用PyTorch进行语义分割. 图源:stanford 该教程是基于2020 ...

  4. pytorch 归一化_用PyTorch进行语义分割

    点击上方"机器学习与生成对抗网络",关注"星标" 获取有趣.好玩的前沿干货! 木易 发自 凹非寺  量子位 报道 | 公众号 QbitAI 很久没给大家带来教程 ...

  5. 使用PyTorch进行语义分割

    本篇文章使用进行pytorch进行语义分割的实验. 1.什么是语义分割? 语义分割是一项图像分析任务,我们将图像中的每个像素分类为对应的类. 这类似于我们人类在默认情况下一直在做的事情.每当我们看到某 ...

  6. 三个优秀的PyTorch实现语义分割框架

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx 使用的VOC数据集链接开放在文章中,预训练模型已上传Github,环境我使用Colab pro ...

  7. Pytorch可视化语义分割特征图

    简介 深度学习中有时候可视化特征图是必要的,特别是对于语义分割任务,合理分析特征图也许能够发现新的idea!接下来讲解一种Pytorch框架下的可视化方法,这里采取的网络模型为Deeplabv3+,首 ...

  8. 语义分割指标---MIoU详细介绍(原理及代码)

    一.IOU理解 在语义分割的问题中,交并比就是该类的真实标签和预测值的交和并的比值 单类的交并比可以理解为下图: TP: 预测正确,真正例,模型预测为正例,实际是正例 FP: 预测错误,假正例,模型预 ...

  9. 【Pytorch神经网络实战案例】27 MaskR-CNN内置模型实现语义分割

    1 PyTorch中语义分割的内置模型 在torchvision库下的models\segmentation目录中,找到segmentation.Py文件.该文件中存放着PyTorch内置的语义分割模 ...

  10. pytorch 语义分割loss_vedaseg:基于pytorch的开源语义分割工具库,更多模型支持,更易拓展...

    加入极市专业CV交流群,与6000+来自腾讯,华为,百度,北大,清华,中科院等名企名校视觉开发者互动交流!更有机会与李开复老师等大牛群内互动! 同时提供每月大咖直播分享.真实项目需求对接.干货资讯汇总 ...

最新文章

  1. 企业想独立完成网站建设也不是不可以
  2. php 最大文件,php读取大文件最好的实现方法
  3. ABAP数字类型合法性检查函数NUMERIC_CHECK
  4. Pyramid Attention Network for Semantic Segmentation
  5. Spark配置参数详解
  6. Android 8.0(29)---Android 8.0 获取当前的activity
  7. img src 文件流_Java中的IO流之输出流|乐字节
  8. BroadcastReceiver广播接受者简单使用
  9. 借助离散数学解决“哈弗大学智商测试”一题 --编程算法
  10. Atitit work remote solu 远程办公解决方案 Atitit6 远程办公四件套 目录 1. Ati标准四件套 2 1.1. Gmail Google 日历和 2 1.2.
  11. [公告]积分算法问题改正
  12. adb 安卓模拟器 进程端口_Frida初体验安卓CTF逆向
  13. 苦逼的草根站长屡战屡败,屡败屡战是因为爱网站
  14. matlab在机械中的应用,MATLAB在机械工程控制基础中的应用
  15. 微信小程序如何使用阿里巴巴矢量图标库彩色图标
  16. AC97 与 HD audio的区别
  17. VPC Peering 具有特定路由的配置
  18. INVECAS发布全球首创的HDMI(R)2.1,搭载HDCP2.3芯片和IP解决方案,适用于电视、AVR、条形音响和机顶盒
  19. 关卡 动画 蓝图 运行_虚幻4 UE4 蓝图之关卡蓝图实现自动开关门
  20. darknetYolov3图片的分类计数、置信度以及输出xmin,xmax,ymin,ymax的结果

热门文章

  1. Xampp的apache无法启动时的解决办法
  2. [贴图]博客园T恤男士版
  3. 【C语言】17-预处理指令3-文件包含
  4. TensorFlow实战minist数据集 softmax回归分类(一)
  5. java集合复习笔记-java集合继承关系图
  6. python调用darknet
  7. 流水线的效率_自动化生产流水线的使用注意事项
  8. 没有任何基础学编程从哪开始_学plc编程先学什么?零基础自学plc编程怎么入门?有没有好...
  9. kibana是什么_三千字带你搞懂什么是ELK
  10. 3D图形原理和一些基本概念