图像语义分割 FCN图像分割网络详解

news2024/11/25 6:56:40

图像语义分割 FCN图像分割网络详解

  • 0、介绍
  • 1、VGG16网络结构
  • 2、转置卷积
  • 3、FCN-32S、FCN-16S,FCN-8S网络结构
  • 4、损失函数
  • 5、膨胀卷积
  • 6、FCN(Backbone-ResNet-50)
    • 6.1 项目框架
    • 6.2 ResNet50网络结构
    • 6.3 FCN(Backbone-ResNet-50)网络结构
    • 6.4 FCN(Backbone-ResNet-50)模型搭建流程演示图
  • 7、评价指标
  • 8、数据集
    • 8.1 数据集预处理
  • 9、Loss损失函数
  • 10、学习策略
  • 11、测试效果

0、介绍

在这里插入图片描述

1、VGG16网络结构

在这里插入图片描述

2、转置卷积

采用转置卷积的目的就是实现上采样,不过在FCN代码中采用的是双线性插值法
查看另一篇博文:
转置卷积部分

3、FCN-32S、FCN-16S,FCN-8S网络结构

在这里插入图片描述
在这里插入图片描述
FCN-16S网络使用到了Maxpool4 feature map作为融合特征 ↑↑↑↑
在这里插入图片描述
FCN-16S网络使用到了Maxpool4 feature mapMaxpool3 feature map作为融合特征 ↑↑↑↑
网络中的使用转置卷积的模块,在代码中实际采用的上采样模块实现

4、损失函数

损失函数采用Cross Entropy Loss
在这里插入图片描述

5、膨胀卷积

在进行语义分割过程中,通常需要分类网络作为网络的backbone进行一系列的下采样,再通过一系列的上采样还原回图像的原始尺寸;存在问题是在下采样过程中,如果采样倍率过大则对还原回原图是有很大影响的

膨胀卷积的优点:

  • 增大感受野
  • 保持原输入特征图的W、H
    在这里插入图片描述
    在这里插入图片描述
    特征图中像素间的间隔数=dilation rate - 1
    在这里插入图片描述
    上图为空洞卷积的实现,参数填写为padding=dilation,dilation=dilation
    即:dilation=dilation为空洞数
    如果想保证输入特征图尺寸等于输出特征图尺寸,则需要padding=dilation,dilation=dilation
    在这里插入图片描述
    在这里插入图片描述
    膨胀卷积的缺陷问题:
    在这里插入图片描述
    在这里插入图片描述
    Gridding Effect问题↑↑↑↑↑

避免Gridding Effect的策略是:不要连续的使用膨胀卷积或将膨胀因子设置成锯齿结构
在这里插入图片描述
将膨胀因子设置成锯齿结构↑↑↑↑↑

6、FCN(Backbone-ResNet-50)

6.1 项目框架

在这里插入图片描述

6.2 ResNet50网络结构

在这里插入图片描述

6.3 FCN(Backbone-ResNet-50)网络结构

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

搭建主网络
在这里插入图片描述
make_bolck
在这里插入图片描述
bottlneck
在这里插入图片描述

6.4 FCN(Backbone-ResNet-50)模型搭建流程演示图

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

7、评价指标

在这里插入图片描述
上图中假设类别为n_class=4(包含背景类别)
第一步:假定真实的GT标签为GT=[0,1,1,2,2,3,1,2,3]
真是标签列表索引为GT_inds=[0,1,2,3,4,5,6,7,8,9]
第二步:将类别数n_class x GT + Predict (得到对应像素在混淆矩阵展平后的位置)
得到location=[1,5,5,10,11,15,5,10,15]
第三步:在用统计直方图的方法统计location中每一个数值出现的频次

torch.bincount(inds, minlength=n**2).reshape(n, n)

得到混淆矩阵:
在这里插入图片描述
求得每一类别对应的准确率:
在这里插入图片描述
计算每个类别预测与真实目标的iou
在这里插入图片描述

代码实现:

class ConfusionMatrix(object):
    def __init__(self, num_classes):
        self.num_classes = num_classes
        self.mat = None

    def update(self, a, b):
        n = self.num_classes   # gqr:其包含背景类别
        if self.mat is None:
            # 创建混淆矩阵
            self.mat = torch.zeros((n, n), dtype=torch.int64, device=a.device)
        with torch.no_grad():
            # 寻找GT中为目标的像素索引
            k = (a >= 0) & (a < n)   # gqr:利用(a < n)忽略掉值为255的像素
            # 统计像素真实类别a[k]被预测成类别b[k]的个数(这里的做法很巧妙)
            inds = n * a[k].to(torch.int64) + b[k]
            self.mat += torch.bincount(inds, minlength=n**2).reshape(n, n)

    def reset(self):
        if self.mat is not None:
            self.mat.zero_()

    def compute(self):
        h = self.mat.float()
        # 计算全局预测准确率(混淆矩阵的对角线为预测正确的个数)
        acc_global = torch.diag(h).sum() / h.sum()
        # 计算每个类别的准确率
        acc = torch.diag(h) / h.sum(1)
        # 计算每个类别预测与真实目标的iou
        iu = torch.diag(h) / (h.sum(1) + h.sum(0) - torch.diag(h))
        return acc_global, acc, iu

    def reduce_from_all_processes(self):
        if not torch.distributed.is_available():
            return
        if not torch.distributed.is_initialized():
            return
        torch.distributed.barrier()
        torch.distributed.all_reduce(self.mat)

    def __str__(self):
        acc_global, acc, iu = self.compute()
        return (
            'global correct: {:.1f}\n'
            'average row correct: {}\n'
            'IoU: {}\n'
            'mean IoU: {:.1f}').format(
                acc_global.item() * 100,
                ['{:.1f}'.format(i) for i in (acc * 100).tolist()],
                ['{:.1f}'.format(i) for i in (iu * 100).tolist()],
                iu.mean().item() * 100)
[epoch: 183]
train_loss: 0.3513
lr: 0.000010
global correct: 92.7
average row correct: ['97.1', '84.3', '70.9', '81.5', '67.0', '82.2', '77.7', '89.9', '93.2', '59.5', '50.4', '69.8', '80.4', '62.5', '86.1', '95.0', '70.8', '78.9', '62.9', '83.2', '88.4']
IoU: ['93.7', '82.7', '58.1', '75.1', '61.4', '69.4', '74.8', '77.8', '76.2', '37.3', '47.8', '57.7', '57.7', '56.9', '77.3', '87.9', '60.7', '63.9', '45.8', '71.9', '70.0']
mean IoU: 66.9

在这里插入图片描述
在这里插入图片描述

8、数据集

参照博文:
PASCAL VOC2012数据集详细介绍-5、语义分割任务
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8.1 数据集预处理

在这里插入图片描述
Random Resize
在这里插入图片描述
在对mask图像进行缩放时,必须采用最邻近插值法,以为如果采用双线性插值,回出现引入杂乱的像素值

RandomHorizontalFlip
在这里插入图片描述
RandomCrop
在这里插入图片描述
在这里插入图片描述
ToTensor
在这里插入图片描述
Normalize
在这里插入图片描述

9、Loss损失函数

采用交叉熵损失函数
在这里插入图片描述

10、学习策略

采用warm up热身训练,
在这里插入图片描述

11、测试效果

在这里插入图片描述
多GPU训练指令

python -m torch.distributed.launch --nproc_per_node=2 --use_env train_multi_GPU.py

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1048665.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于SpringBoot的大学生就业招聘系统的设计与实现

目录 前言 一、技术栈 二、系统功能介绍 求职信息管理 首页 招聘信息管理 岗位申请管理 岗位分类 企业管理 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息互联网信息的飞速发展&#xff0c;大学生就业成为一个难题&#xff0c;好多公司都舍不…

【RV1103】Luckfox Pico RV1103 开发记录

文章目录 对比uboot的差别Linux的差别其他差别编译命令对比板级配置选择spi-nand flashemmc/SD 卡spinand flash烧录差别由于没有原理图--引脚分析 对比 linux defconfiglinux dtsuboot defconfiguboot fragmentluckfox-picosd/tf (emmc)luckfox_rv1106_linux_defconfigrv1103…

澳大利亚海运价格下半年走势

随着全球疫情的逐渐缓解&#xff0c;国际贸易开始逐步恢复。在这个过程中&#xff0c;澳大利亚作为全球重要的贸易伙伴&#xff0c;其海运价格也成为了市场关注的焦点。本文将从下半年的市场预期、影响因素以及行业动态等方面&#xff0c;对澳大利亚海运价格走势进行分析展望。…

祝贺莱佛士学生在ASDA2023设计大赛中获得最高奖项

莱佛士一直主张学生们积极参与各种国际知名的设计大赛&#xff0c;也会竭尽所能为学生们的参赛提供途径与指导&#xff0c;本次的American Standard Design Award&#xff08;ASDA&#xff09;2023设计大赛也不例外。 ASDA2023设计大赛&#xff0c;推广以用户为中心的设计理念…

极简非凡react hooks+arcoDesign+vite后台管理模板

最近捣鼓了一个vite4搭建react18后台模板&#xff0c;搭载了字节团队react组件库Arco Design&#xff0c;整体编译运行顺滑衔接。支持多种模板布局、暗黑/亮色模式、国际化、权限验证、多级路由菜单、tabview标签栏快捷菜单、全屏控制等功能。 使用技术 "arco-design/web…

攀登数字化高峰,中小企业如何找“搭子”?

相信大多数人都认可&#xff0c;中小企业数字化&#xff0c;是一条充满未知和艰辛的征程。 这个过程&#xff0c;不是租几台云服务器、开发几个APP那么简单&#xff0c;而是一个对组织架构、业务环节、基础设施、商业模式等进行量身定制、长期迭代的体系化工程&#xff0c;需要…

船用白炽照明灯具

声明 本文是学习GB-T 3027-2012 船用白炽照明灯具. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了船用白炽照明灯具(以下简称灯具)的要求、试验方法、检验规则、标识、包装和储 存等。 本标准适用于电源电压在250V 以下的交流…

uni-app使用iconfont字体图标

先iconfont选择好自己需要的图标 添加至项目 下载字体文件到本地 将下载的文件解压缩到工程目录static文件夹下 定义好iconfont.css文件的font-face声明,修改好引入的url地址 打开App.vue文件 ,引入static下刚才修改的iconfont.css字体图标文件 完成上线的步骤后就可以全局使用…

matplotlib绘图实现中文宋体的两种方法(亲测)

方法一&#xff1a;这种方法我没有测试。 第一步 找宋体字体 &#xff08;win11系统&#xff09; 2.matplotlib字体目录&#xff0c;如果不知道的话&#xff0c;可以通过以下代码查询&#xff1a; matplotlib.matplotlib_fname() 如果你是Anaconda3 安装的matplotlib&#x…

不同组合地下管线的地质雷达响应特征分析

不同组合地下管线的地质雷达响应特征分析 前言 以混凝土管线为例&#xff0c;建立水平相邻管线电性模型&#xff0c;管径为60cm&#xff0c;中心埋深为70cm&#xff0c;管线长度为150cm&#xff0c;分别建立管线圆心相距150cm的两根相邻双管线和三管线模型&#xff0c;进行二…

SQL血缘解析原理

根据sql解析获取到表到表, 字段到字段间的关系,即血缘关系。实际上这是从sql文本获取到数据流的过程。 大致步骤如下&#xff1a; 1.sql文本进行词法分析 2.sql语法分析获取到AST抽象语法树 3.访问AST抽象语法树根据语法结构推测出数据的流向,例如create as select from 这种结…

使用x64dbg手动脱UPX壳(UPX4.1.0)

本文选用的壳是4.1.0的UPX壳 将加壳的exe文件拖入x64dbg 打开符号&#xff0c;进入第一个sample.exe 进入后在第一个位置下断点&#xff0c;按下F9运行 继续按下F9 单步运行到此处&#xff0c;发现只有RSP变红&#xff0c;根据ESP定律&#xff0c;进行下面的操作 所谓定律就像…

【配置conda环境】新版pycharm导入新版anaconda环境

最近下载了新版pycharm和新版anaconda&#xff0c;并且在命令行创建了环境&#xff0c;想着在pycharm里面导入环境。结果现在的导入方式发生了变化。 之前是通过导入Python.exe进行的。 现在&#xff1a; 当我们点击进去之后&#xff0c;会发现找不到python.exe了。 具体什么…

设置基站IP及设置基站连接服务器

基站状态指示灯 基站正常连接上服务器&#xff0c;基站指示灯如下&#xff0c; 第一个灯是电源指示灯常亮&#xff1b; 第二个灯为运行指示灯&#xff0c;程序正常运行第二个灯一直闪烁&#xff1b; 第三个灯为为网络指示灯&#xff0c;网络连接正常会常亮&#xff0c;网络…

B树和B+树的介绍和对比,以及MySQL为何选择B+树

在计算机科学中&#xff0c;B树和B树是常用的数据结构&#xff0c;用于在大规模数据集上进行高效的插入、删除和查找操作。它们在数据库管理系统、文件系统等许多实际应用中发挥着重要作用。本文将深入介绍B树和B树的结构特点、实际应用方面以及它们的优缺点&#xff0c;并最后…

Vue安装并使用Vue-CLI构建SPA项目并实现路由

目录 前言 一、Vue CLI简介 1.什么是Vue CLI 2.Vue CLI的特点 二、SPA项目搭建 1.安装Vue CLI 2.使用脚手架vue-cli来构建项目 ​编辑 3.项目结构说明 4.什么是*.vue文件 三、基于SPA完成路由并嵌套路由 1.基于SPA完成路由 1. 1在src下的components 创建自定义组件…

今天面了个腾讯拿38K的人,让我见识到了测试的天花板

6年测试经验&#xff0c;技术应该是能达到资深测试的水准&#xff0c;不仅能熟练地开发业务&#xff0c;而且还能熟悉项目开发&#xff0c;测试&#xff0c;调试和发布的流程&#xff0c;还应该能全面掌握数据库等方面的技能&#xff0c;如果技能再高些的话&#xff0c;甚至熟悉…

【小余送书第一期】《数据要素安全流通》参与活动,即有机会中奖哦!!

目录 1、背景介绍 2、本书编撰背景 3、本书亮点 4、本书主要内容 5、活动须知 1、背景介绍 随着大数据、云计算、人工智能等新兴技术的迅猛发展&#xff0c;数据已经成为我国经济社会发展的五大生产要素之一&#xff0c;《网络安全法》《个人信息保护法》《数据安全法》的…

新品上市 | 纳米级分选磁珠重磅来袭~(含试用福利)

细胞疗法在近年医药研发中发展十分迅速&#xff0c;是一种全新的药物开发模式&#xff0c;在癌症、传染病和自身免疫等疾病的治疗方面显示出了巨大的潜力。今年6月30日&#xff0c;中国药监局&#xff08;NMPA&#xff09;批准了由南京驯鹿生物申报&#xff0c;驯鹿生物和信达生…

VBA 将TXT的多行文本文件进行处理,以ID为单位处理成 一行

VBA 将TXT的多行文本文件进行处理&#xff0c;以ID为单位处理成 一行 序言 由于需要将TXT文件与Excel文件进行对比&#xff0c;但两种文件格式差异比较大&#xff0c;于是通过VBA写了一下小工具&#xff0c;以便日后方便使用。 TXT文件如下 VBA代码如下 ********************…