图像分割-FCN全卷积神经网络(完整代码详解)

article/2025/9/16 16:46:26

目录

FCN全卷积神经网络

实现过程

全卷积

反卷积

FCN的三点创新

code

FCN全卷积神经网络

        FCN为深度学习在语义分割领域的开山之作,提出使用卷积层代替CNN中的全连接操作,生成热力图heat map而不是类别。

实现过程

图1  FCN网络结构

        包括全卷积过程以及反卷积过程。

        全卷积:使用经典的CNN网络作为骨架网络,例如:Vgg ResNet AlexNet等。本文使用Vgg16作为骨架网络,提取feature map。

        反卷积:将feature map上采样回去(通过转置卷积等上采样方式),恢复原图大小。

        然后,将预测结果和真实label的像素一一对应分类,也称为像素级分类。从而,将分割问题转化为分类问题。

全卷积

        蓝色指卷积操作,绿色为池化操作(图像宽高减半)。因此,按照图1,网络结构为:conv1(2层卷积)、pool1、conv2(2层卷积)、pool2、conv3(3层卷积)、pool3(向下输出预测的第一个分支)、conv4(3层卷积)、pool4(向下输出预测的第二个分支)、conv5(3层卷积)、pool5、conv6、conv7(向下输出的最后一个分支)。提取得到pool3 pool4 conv7,用于后面的特征融合以及反卷积操作。

反卷积

        FCN分为FCN-32S,FCN-16s,FCN-8s三种网络结构。

        FCN-8s获取过程:conv7特征进行2倍上采样,与pool4融合,将融合后的进行2倍上采样,与pool3融合,最后进行8倍上采样得到原图大小的特征图。FCN-32s获取过程:conv7直接32倍上采样得到原图大小的特征图。

        由于FCN-8s综合较多层的特征,因此效果最好;而FCN-32s只使用了最后一层conv7上采样32倍进行预测,特征图较小,丢失了很多信息。

         注意:FCN-8s  (conv7 2倍上采样 + pool4) 2倍上采样 + pool3 -> 8倍上采样

        卷积过程中,特征经过pool操作,h w为奇数时,池化后的特征图的h1 w1不一定是原来h w的1/2,因此转置卷积2倍上采样后的shape与原来的h w有区别,因此需先通过插值方式torch.nn.functional.interpolate方式调整特征图大小,确保可以和上一层的特征融合。

   

FCN的三点创新

(1)全卷积:将传统CNN最后的全连接层转化为卷积层,实现分类器变为稠密预测dense prediction(即分割)。

具体操作:把原来CNN操作中的全连接变成卷积操作(见图1中conv6、conv7),此时图像的featureMap数量改变但是图像大小依然为原图的1/32,图像不再叫featureMap而是叫heatMap。

(2)上采样:由于骨架网络提取特征的过程采取了一系列下采样(池化操作),使得特征图大小减小,为了得到和原图大小一致的预测层,采用上采样(如转置卷积操作)

(3)跳跃结构:类似于ResNet,将不同层的feature map进行融合,在分类预测时可以综合多层信息。

code

FCN-8s实现过程,其他网络结构可直接修改FCN类中的forward函数实现。

import torch
from torch import nn
from torchvision.models import vgg16
import torch.nn.functional as Fdef vgg_block(num_convs, in_channels, out_channels):"""vgg block: Conv2d ReLU MaxPool2d"""blk = []for i in range(num_convs):if i == 0:blk.append(nn.Conv2d(in_channels, out_channels, kernel_size=(3, 3), padding=1))else:blk.append(nn.Conv2d(out_channels, out_channels, kernel_size=(3, 3), padding=1))blk.append(nn.ReLU(inplace=True))blk.append(nn.MaxPool2d(kernel_size=(2, 2), stride=2))return blkclass VGG16(nn.Module):def __init__(self, pretrained=True):super(VGG16, self).__init__()features = []features.extend(vgg_block(2, 3, 64))features.extend(vgg_block(2, 64, 128))features.extend(vgg_block(3, 128, 256))self.index_pool3 = len(features)  # pool3features.extend(vgg_block(3, 256, 512))self.index_pool4 = len(features)  # pool4features.extend(vgg_block(3, 512, 512))  # pool5self.features = nn.Sequential(*features)  # 模型容器,有state_dict参数(字典类型)""" 将传统CNN中的全连接操作,变成卷积操作conv6 conv7 此时不进行pool操作,图像大小不变,此时图像不叫feature map而是heatmap"""self.conv6 = nn.Conv2d(512, 4096, kernel_size=1)   # conv6self.relu = nn.ReLU(inplace=True)self.conv7 = nn.Conv2d(4096, 4096, kernel_size=1)  # conv7# load pretrained params from torchvision.models.vgg16(pretrained=True)if pretrained:pretrained_model = vgg16(pretrained=pretrained)pretrained_params = pretrained_model.state_dict()  # state_dict()存放训练过程中需要学习的权重和偏置系数,字典类型keys = list(pretrained_params.keys())new_dict = {}for index, key in enumerate(self.features.state_dict().keys()):new_dict[key] = pretrained_params[keys[index]]self.features.load_state_dict(new_dict)  # load_state_dict必须传入字典对象,将预训练的参数权重加载到features中def forward(self, x):pool3 = self.features[:self.index_pool3](x)  # 图像大小为原来的1/8pool4 = self.features[self.index_pool3:self.index_pool4](pool3)  # 图像大小为原来的1/16# pool4 = self.features[:self.index_pool4](x)    # pool4的第二种写法,较浪费时间(从头开始)pool5 = self.features[self.index_pool4:](pool4)  # 图像大小为原来的1/32conv6 = self.relu(self.conv6(pool5))  # 图像大小为原来的1/32conv7 = self.relu(self.conv7(conv6))  # 图像大小为原来的1/32return pool3, pool4, conv7class FCN(nn.Module):def __init__(self, num_classes, backbone='vgg'):"""Args:num_classes: 分类数目backbone: 骨干网络 VGG"""super(FCN, self).__init__()if backbone == 'vgg':self.features = VGG16()  # 参数初始化# 1*1卷积,将通道数映射为类别数self.scores1 = nn.Conv2d(4096, num_classes, kernel_size=1)  # 对conv7操作self.relu = nn.ReLU(inplace=True)self.scores2 = nn.Conv2d(512, num_classes, kernel_size=1)   # 对pool4操作 self.scores3 = nn.Conv2d(256, num_classes, kernel_size=1)   # 对pool3操作self.upsample_8x = nn.ConvTranspose2d(num_classes, num_classes, kernel_size=8, stride=8)  # 转置卷积self.upsample_2x = nn.ConvTranspose2d(num_classes, num_classes, kernel_size=2, stride=2)def forward(self, x):b, c, h, w = x.shapepool3, pool4, conv7 = self.features(x)conv7 = self.relu(self.scores1(conv7))pool4 = self.relu(self.scores2(pool4))pool3 = self.relu(self.scores3(pool3))# 融合之前调整一下h wconv7_2x = F.interpolate(self.upsample_2x(conv7), size=(pool4.size(2), pool4.size(3)))  # conv7 2倍上采样,调整到pool4的大小s=conv7_2x+pool4  # conv7 2倍上采样与pool4融合s=F.interpolate(self.upsample_2x(s),size=(pool3.size(2),pool3.size(3)))  # 融合后的特征2倍上采样,调整到pool3的大小s = pool3 + s     # 融合后的特征与pool3融合out_8s=F.interpolate(self.upsample_8x(s) ,size=(h,w))  # 8倍上采样得到 FCN-8s,得到和原特征x一样大小的特征return out_8sif __name__=='__main__':model = FCN(num_classes=12)fake_img=torch.randn((4,3,360,480))  # B C H Woutput_8s=model(fake_img)print(output_8s.shape)

输出:

torch.Size([4, 12, 360, 480])


http://chatgpt.dhexx.cn/article/jxgHQtoC.shtml

相关文章

FCN网络学习笔记

目录 前言1. 网络结构2. 损失计算:Cross Entropy Loss参考 前言 FCN网络是首个端对端的针对像素级预测的全卷积网络。 其中,全卷积的含义是将分类网络的全连接层全部替换成了卷积层。使用了分类网络作为backbone,将会复用分类网路在ImageNet…

深度学习-全卷积神经网络(FCN)

1. 简介 全卷积神经网络(Fully Convolutional Networks,FCN)是Jonathan Long等人于2015年在Fully Convolutional Networks for Semantic Segmentation一文中提出的用于图像语义分割的一种框架,是深度学习用于语义分割领域的开山之…

FCN全卷积网络理解及代码实现(来自pytorch官方实现)

视频链接:https://www.bilibili.com/video/BV1J3411C7zd?vd_sourcea0d4f7000e77468aec70dc618794d26f 代码:https://github.com/WZMIAOMIAO/deep-learning-for-image-processing FCN是2015年提出的首个端对端的针对像素级预测的全卷积网络。 如今的pyt…

FCN网络结构解析

daily:作为深度学习图片分割第一个学习的网络结构 Q1: 为什么要用FCN? A1:应为和以前网络R-CNN,SDS相比提升比较大 Q2:与CNN什么区别? A2:使用全卷积层代替全连接层 Q3:为什么要进行…

FCN网络详解

参考视频:FCN网络结构详解(语义分割)_哔哩哔哩_bilibili FCN是首个端对端的针对像素级预测的全卷积网络 这是作者提出的网络中的输出对比图,可以看到当FCN-8s效果接近真实分割图。 普通卷积分类网络与FCN对比 在这个模型提出之前,我们来看一下…

FCN全卷积神经网络

目录 前言 一、FCN的意义 二、先验知识 1.FCN-32S,FCN-16S,FCN-8S 2.上采样,下采样 3.大体网络结构 4.与传统网络(带全连接层的网络)区别 5.传统网络VGG网络结构 三、FCN网络结构解析 1.FCN-32S 2.FCN-16S 3.FCN-8S !!!重要&…

FCN算法详解

基于全卷积网络的语义分割 1. 摘要 卷积网络是一种强大的视觉模型,可产生特征的层次结构。卷积网络在语义分割方面的应用已超过了最先进的水平。本文关键是建立“全卷积”网络,它接受任意大小的输入,并通过有效的前向传播产生相应大小的输出。本文定义并详细描述了全卷积网…

FCN网络(Fully Convolutional Networks)

首个端到端的针对像素级预测的全卷积网络 原理:将图片进行多次卷积下采样得到chanel为21的特征层,再经过上采样得到和原图一样大的图片,最后经过softmax得到类别概率值 将全连接层全部变成卷积层:通常的图像分类网络最后几层是全…

FCN网络(Fully Convolutional Networks for Semantic Segmentation)

一.概述 FCN是深度学习应用在图像分割的代表作, 是一种端到端(end to end)的图像分割方法, 让网络做像素级别的预测直接得出label map。因为FCN网络中所有的层都是卷积层,故称为全卷积网络。 全卷积神经网络主要使用了三种技术: 卷积化(Con…

FCN的代码解读

目录 模型初始化 VGG初始化 FCN初始化 图片的预处理 图片处理 图片编码 计算相关参数 模型训练 一个小问题 完整代码 参考 最近浅研究了一下关于图像领域的图像分割的相关知识,发现水还是挺深的,因为FCN差不多也是领域的开山鼻祖,所以就先从…

FCN网络介绍

目录 前言一.FCN网络二.网络创新点 前言 在图像分割领域,有很多经典的网络,如MASK R-CNN,U-Net,SegNet,DeepLab等网络都是以FCN为基础进行设计的。我们这里简单介绍一下这个网络。 一.FCN网络 FCN 即全卷积网络&#…

FCN简单理解

文章目录 整体把握卷积层替换全连接层的意义卷积层替换全连接层的具体方法网络结构中“放大”、“缩小”跳级的思想损失函数 整体把握 FCN的论文主要集中于语义分割,当然这种结构现在已经运用在计算机视觉的各种任务中。FCN创造性的将传统CNN的全连接层都转换成了卷…

全卷积神经网络(FCN)

目录 卷积化上采样跳跃结构卷积化上采样跳跃结构 卷积化 上采样 跳跃结构 论文:Fully Convolutional Networks for Semantic Segmentation(2015) 参考:https://zhuanlan.zhihu.com/p/80715481 全卷积神经网络(Fully Convolutional Networks…

全卷积网络(FCN)实战:使用FCN实现语义分割

全卷积网络(FCN)实战:使用FCN实现语义分割 FCN对图像进行像素级的分类,从而解决了语义级别的图像分割(semantic segmentation)问题。与经典的CNN在卷积层之后使用全连接层得到固定长度的特征向量进行分类&…

FCN

转载自: http://blog.csdn.net/taigw/article/details/51401448 在上述原文的基础上结合自己理解做出了部分修改。 从图像分类到图像分割 卷积神经网络(CNN)自2012年以来,在图像分类和图像检测等方面取得了巨大的成就和广泛的应用。 CNN的强大…

FCN的理解

直观展现网络结构:http://ethereon.github.io/netscope/#/editor 卷积与逆卷积的动图https://github.com/vdumoulin/conv_arithmetic 【原文图】“Fully convolutional networks for semantic segmentation.” 上图中,32x即为扩大32倍。 Pool5扩…

FCN(全卷积网络)详解

FCN详解 全卷积网络就是在全连接网络的基础上,通过用卷积网络替换全连接网络得到的。 首先看一下什么是全连接网络,以及全连接网络的缺点。 通常的CNN网络中,在最后都会有几层全连接网络来融合特征信息,然后再对融合后的特征信…

FCN的学习及理解(Fully Convolutional Networks for Semantic Segmentation)

论文Fully Convolutional Networks for Semantic Segmentation 是图像分割的milestone论文。 理清一下我学习过程中关注的重点。 fcn开源代码 github下载地址https://github.com/shelhamer/fcn.berkeleyvision.org 核心思想 该论文包含了当下CNN的三个思潮 - 不含全连接层(…

FCN详解

FCN(fully convolution net) FCN对图像进行像素级的分类,从而解决了语义级别的图像分割(semantic segmentation)问题。与经典的CNN在卷积层之后使用全连接层得到固定长度的特征向量进行分类(全连接层+softmax输出)不同,FCN可以接受任意尺寸的输入图像(为什么?因为全连…

FCN(全卷积神经网络)详解

文章目录 1. 综述简介核心思想 2. FCN网络2.1 网络结构2.2 上采样 Upsampling2.3 跳级结构 3 FCN训练4. 其它4.1 FCN与CNN4.2 FCN的不足4.3 答疑 【参考】 1. 综述 简介 全卷积网络(Fully Convolutional Networks,FCN)是Jonathan Long等人于…