全卷积网络FCN详解与代码实现

本文详细介绍了全卷积网络FCN,包括FCN与CNN的区别、结构、实现方式以及FCN的优缺点。通过将VGG网络FCN化,实现了像素级别的图像分割。FCN通过多层特征融合提升分割准确性,但其结果仍存在不够精细的问题。
摘要由CSDN通过智能技术生成


先附上 FCN论文
Pytorch实现 https://github.com/wkentaro/pytorch-fcn

一、学习目标

1、理解FCN原理
2、掌握FCN的关键技术
3、掌握FCN的实现

二、CNN 与 FCN 的区别

  FCN与CNN的区域在把于CNN最后的全连接层换成卷积层
  对于一般的分类CNN网络,如VGG和Resnet,都会在网络的最后加入一些全连接层,经过softmax后就可以获得类别概率信息。但是这个概率信息是1维的,即只能标识整个图片的类别,不能标识每个像素点的类别,所以这种全连接方法不适用于图像分割。
  而FCN提出可以把后面几个全连接都换成卷积,这样就可以获得一张2维的feature map,后接softmax获得每个像素点的分类信息,从而解决了分割问题,如下图。
在这里插入图片描述
  经过多次卷积和pooling以后,得到的图像越来越小,分辨率越来越低。其中图像到 最小的一层时,所产生图叫做heatmap热图,热图就是我们最重要的高维特诊图,得到高维特征的heatmap之后就是最重要的一步也是最后的一步对原图像进行upsampling,把图像进行放大到原图像的大小。
在这里插入图片描述
  最后的输出是1000张heatmap经过upsampling变为原图大小的图片,为了对每个像素进行分类预测label成最后已经进行语义分割的图像,这里有一个小trick,就是最后通过逐个像素地求其在1000张图像该像素位置的最大数值描述(概率)作为该像素的分类。因此产生了一张已经分类好的图片,如上图右侧有狗猫图。

三、FCN结构

1、image经过多个conv和+一个max pooling变为pool1 feature,宽高变为1/2
2、pool1 feature再经过多个conv+一个max pooling变为pool2 feature,宽高变为1/4
3、pool2 feature再经过多个conv+一个max pooling变为pool3 feature,宽高变为1/8
4、pool3 feature再经过多个conv+一个max pooling变为pool4 feature,宽高变为1/16
5、直到pool5 feature,宽高变为1/32。
在这里插入图片描述
1、对于FCN-32s,直接对pool5 feature进行32倍上采样获得32x upsampled feature,再对32x upsampled feature每个点做softmax prediction获得32x upsampled feature prediction(即分割图)。
2、对于FCN-16s,首先对pool5 feature进行2倍上采样获得2x upsampled feature,再把pool4 feature和2x upsampled feature逐点相加,然后对相加的feature进行16倍上采样,并softmax prediction,获得16x upsampled feature prediction。
3、对于FCN-8s,首先进行pool4+2x upsampled feature逐点相加,然后又进行pool3+2x upsampled逐点相加,即进行更多次特征融合。具体过程与16s类似,不再赘述。

在这里插入图片描述
关于Skip Architecture 注意点
1、维度一致才能相加:spatial/channel
2、1 x 1 Convolution

  作者在原文种给出3种网络结果对比,明显可以看出效果:FCN-32s < FCN-16s < FCN-8s,即使用多层feature融合有利于提高分割准确性。

在这里插入图片描述

四、FCN缺点

1、FCN-8s的结果还是不够精细
2、没有充分考虑像素之间的关系

五、VGG网络的FCN化

import math
import torch 
import torch.nn as nn
import torch.nn.init as init
# 建立block
class Block(nn.Module):

  def __init__(self, in_ch, out_ch):
    super(Block, self).__init__()
    self.conv1 = nn.Conv2d(in_ch, out_ch, kernel_size=3, padding=1)
    self.bn1 = nn.BatchNorm2d(out_ch)
    self.relu1 = nn.ReLU(inplace=True)

  def forward</
  • 4
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值