FCN理解

FCN理解为什么需要 FCN 分类网络通常会在最后连接几层全连接层 它会将原来二维的矩阵 图片 压扁成一维的 从而丢失了空间信息 最后训练输出一个标量 这就是我们的分类标签 而图像语义分割的输出需要是个分割图 且不论尺寸大小 但是至少是二维的 所以 流行的做法是丢弃全连接层 换上全卷积层 而这就是全卷积网络了 具体定义请参看论文 FullyConvolu

为什么需要FCN?

FCN结构

  在FCN论文中,作者的FCN主要使用了三种技术:

  • 卷积化(Convolutional)
  • 上采样(Upsample)
  • 跳层连接(Skip Layer)

      卷积化即是将普通的分类网络,比如VGG16,ResNet50/101等网络丢弃全连接层,换上对应的卷积层即可。




    这里写图片描述







      上采样即是反卷积(Deconvolution)。当然关于这个名字不同框架不同,Caffe和Kera里叫Deconvolution,而tensorflow里叫conv_transpose,在信号与系统这门课上,我们学过反卷积有定义,不是这里的上采样。所以叫conv_transpose更为合适。

      众所诸知,池化会缩小图片的尺寸,比如VGG16 五次池化后图片被缩小了32倍。为了得到和原图等大的分割图,我们需要上采样/反卷积。反卷积和卷积类似,都是相乘相加的运算。只不过后者是多对一,前者是一对多。而反卷积的前向和后向传播,只用颠倒卷积的前后向传播即可。所以无论优化还是后向传播算法都是没有问题。上池化的实现主要在于池化时记住输出值的位置,在上池化时再将这个值填回原来的位置,其他位置填0。图解如下:




FCN理解








  但是,虽然文中说是可学习的反卷积,但是作者实际代码并没有让它学习,可能正是因为这个一对多的逻辑关系。代码如下:

layer { name: "upscore" type: "Deconvolution" bottom: "score_fr" top: "upscore" param { lr_mult: 0 } convolution_param { num_output: 21 bias_term: false kernel_size: 64 stride: 32 } }

可以看到lr_mult被设置为了0.

  跳层连接的作用就在于优化结果,因为如果将全卷积之后的结果直接上采样得到的结果是很粗糙的,所以作者将不同池化层的结果进行上采样之后来优化输出。具体结构如下:




FCN理解







  不同上采样得到的结果对比如下:



FCN理解






  当然,你也可以将pool1, pool2的输出再上采样输出。不过,作者说了这样得到的结果提升并不大。FCN是深度学习应用于图像语义分割的开山之作,所以得了CVPR2015的最佳论文。但是,还是有一些处理比较粗糙的地方,具体和后面对比就知道了。

FCN缺点

1、缺乏空间的一致性规整,像素的处理都是独立的!








版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/176749.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午9:08
下一篇 2026年3月26日 下午9:09


相关推荐

  • 如何从RNN起步,一步一步通俗理解LSTM

    如何从RNN起步,一步一步通俗理解LSTM如何从 RNN 起步 一步一步通俗理解 LSTM 前言提到 LSTM 之前学过的同学可能最先想到的是 ChristopherO 的博文 理解 LSTM 网络 这篇文章确实厉害 网上流传也相当之广 而且当你看过了网上很多关于 LSTM 的文章之后 你会发现这篇文章确实经典 不过呢 如果你是第一次看 LSTM 则原文可能会给你带来不少障碍

    2026年3月26日
    2
  • 体系结构 | 五段流水线 | 流水线技术

    体系结构 | 五段流水线 | 流水线技术一条经典的 5 段流水线 一条指令的执行过程分为以下 5 个周期 取指令周期 IF 指令译码 读寄存器周期 ID 执行 有效地址计算周期 EX 存储器访问 分支完成周期 MEM 写回周期 WB 一条经典的 5 段流水线介绍一条经典的 5 段 RISC 流水线每一个周期作为一个流水段 在各段之间加上锁存器 流水寄存器 一条指令的执行过程分为以下 5 个周期 取指令周期 IF 以程序计数器 PC 中的内容作为地址 从存储器中取出指令并放入指令寄存器 IR 同时 PC 值加 4

    2026年3月18日
    2
  • 使用httpclient实现http接口调用实例[通俗易懂]

    使用httpclient实现http接口调用实例[通俗易懂]使用httpclient实现http接口调用实例假设服务接口如下:接口地址:http://192.168.0.1/service/sendsms请求方式:post需要传递参数:c={“uid”:”10000″,”title”:”testatitle”,”content”:”thisisatest”}参数内容为json格式输出:{result:0,cod

    2022年5月24日
    34
  • [运算放大器系列]二、电压转4 – 20MA电流电路分析

    [运算放大器系列]二、电压转4 – 20MA电流电路分析[运算放大器系列]]二、电压转4-20MA电流电路分析偶然在网上看到一个4-20MA转换电路原理图如下:2.原理分析偶然在网上看到一个4-20MA转换电路原理图如下:2.原理分析RLR_LRL​为负载,分析电流流向如上图箭头所示可以得到假设Rloop上的压降为VlV_lVl​则:①Vi−V+R1=V+−(Vo−Vl)R2\frac{V_i-V_+}{R_1}=\frac{V_+-(V_o-V_l)}{R2}R1​Vi​−V+​​=R2V+​−(Vo​−Vl​)

    2022年5月29日
    38
  • shell输出数组元素_shell中使用数组

    shell输出数组元素_shell中使用数组数组介绍平时的定义a=1,b=2,c=3,变量如果多了,再一个一个定义很费劲,并且取变量的也费劲简单的说,数组就是相同数据类型的元素按一定顺序排列的集合数组就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们得边合。这个名字成为数组名,编号成为数组下标。组成数组的各个变量成为数组的分称为数组的元素,有时也称为下标变量数组定义与增删改查法1:array=(value1value2valu…

    2025年7月23日
    5
  • PyCharm 断点调试(Mac OS X)

    PyCharm 断点调试(Mac OS X)使用 PyCharm 进行代码断点调试的操作步骤

    2025年12月5日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号