论文笔记:FCN_class balancing-程序员宅基地

技术标签: 论文阅读  FCN  深度学习  论文笔记  

原文:Fully Convolutional Networks for Semantic Segmentation

FCN

1、四个问题

  1. 要解决什么问题?
    • 语义分割。
  2. 用了什么方法解决?
    • 提出了“全卷积神经网络”,可以接收任意尺寸的输入,并给出对应大小的输出。
      • 使用一些图像分类模型(如:AlexNet、VGG、GoogLeNet)等做迁移学习。
      • 使用skip architecture的结构,结合深层的较粗糙的信息和浅层的较精细的信息,得到更精确的结果。
      • 使用反卷积做上采样。
  3. 效果如何?
    • 在PASCAL VOC 2012、NYUD v2、 SIFT Flow等数据集上取得了当时(2015年)领先的效果。并且在PASCAL VOC 2012上取得了62.2%的mean IU,比之前的最优方法提高了20%。
    • 文中的FCN网络对每张图片处理耗时为0.2s。
  4. 还存在什么问题?
    • FCN是深度学习用于语义分割任务的开山之作,现在来说效果不能算很好。

2、论文概述

2.1、几个知识点总结

  1. 语义分割:我的理解是,像素级别的分类,判断每个像素属于哪个类(即语义)。
  2. end-to-end:端到端。很好理解,一个端到端网络的输入是你的原始数据,输出就是你想要的预测结果。中间过程不需要对数据另外做处理。
  3. deconvolution
    1. 有的地方翻译成“反卷积”,有的地方翻译成“转置卷积”(见如何理解深度学习中的deconvolution networks?)。直观上来说,我觉得“反卷积”更合适;不过从数学形式上来说“转置卷积”更贴切。怎么叫的顺口就怎么叫吧。
    2. 特征图进过普通的卷积层后,输出的特征图尺寸通常都会缩小,相当于一个下采样的过程;而反卷积就是与卷积相反的过程,会让输出的尺寸增大,相当于一个上采样的过程。这篇文章中有可视化的例子,有助于理解。
    3. 论文中解释是:卷积(convolution)的forward、backward过程相互对调,就是反卷积(deconvolution)。

2.2、FCN结构

2.2.1、将分类用于dense prediction
  • 作者指出,全连接层可以修正维度并会丢弃空间坐标关系。然而这些全连接层本身也可以看做是覆盖了整个feature map的卷积核组成的卷积层。
  • 使用卷积层替代全连接层。实质上全连接层也可以看做 1 ∗ 1 1 * 1 11的卷积。
    • 以图中的网络为例:
      1. 普通的全连接层:假设最后倒数第二个卷积层的feature map为 7 ∗ 7 ∗ 256 7 * 7 * 256 77256,我们令最后一个卷积层的卷积核尺寸为 7 ∗ 7 ∗ 256 ∗ 4096 7 * 7 * 256 * 4096 772564096,得到的结果是 1 ∗ 1 ∗ 4096 1 * 1 * 4096 114096。将结果flatten,展开成1维的向量,随后接全连接操作。
      2. 使用 1 ∗ 1 1 * 1 11卷积替代全连接:与前面一样,倒数第二个卷积层的feature map为 7 ∗ 7 ∗ 256 7 * 7 * 256 77256,最后一个卷积层的卷积核尺寸为 7 ∗ 7 ∗ 256 ∗ 4096 7 * 7 * 256 * 4096 772564096,得到的结果是 1 ∗ 1 ∗ 4096 1 * 1 * 4096 114096。下面接上 1 ∗ 1 1 * 1 11卷积,卷积核为 1 ∗ 1 ∗ 4096 ∗ 4096 1 * 1 * 4096 * 4096 1140964096,其实还是等价于全连接。
      3. 1 ∗ 1 1*1 11卷积操作取代全连接,其实就是对将卷积核上同一点的所有channel进行FC操作。
  • 对示例图的解释:
    1. 上面的网络是一个在ImageNet上预训练的CNN网络,输入一个 224 ∗ 224 224 * 224 224224的图像,跑完全部的卷积层后输出应该正好是 1 ∗ 1 ∗ 4096 1* 1 * 4096 114096,随后flatten得到4096维的神经元,之后再接上全连接层,输出1000维的softmax。这里为止都是常规套路。
    2. 将全连接替换成 1 ∗ 1 1 * 1 11卷积。
    3. 上面的网络中处理的图片是下面的图片中的一部分。那么推广到处理下面这副同时有"猫狗"的图像的情况下,可以看作从中取出了 m ∗ n m * n mn 227 ∗ 227 227 * 227 227227的patch,分别送到FCN中,每个patch都会有一个1000维的输出。那么这些patch的输出拼在一起就可以构成一个heatmap了。
    4. 就以tabby cat这个例子来看,再对应tabby cat的那个通道,只要patch里面包含了猫,那么输出的概率应该都会比较高,而其他patch则会较低,最后结果应该会像图中所示,有猫的区域在heatmap中的值明显更大吧。)
  • 我个人的看法是,直接将分类网络的全连接层改为 1 ∗ 1 1 * 1 11卷积,从下图中已经可以在一定程度上进行语义分割了(见heatmap),只要再进行微调不难取得相对精确的效果。

在这里插入图片描述

2.2.2、基本结构

在这里插入图片描述

  • 假设使用的预训练网络是VGG-16,整个FCN网络中除了最后deconv的部分都与VGG一样。
  • 以图中的网络为例,FCN网络的conv7输出的heatmap,通过deconv进行上采样32倍得到第一个预测结果FCN-32s。
  • 接着作者使用了skip layers将几个pooling层输出的结果结合起来:
    • 先将pool4的输出接上 1 ∗ 1 1 * 1 11卷积层,然后对conv7的输出使用deconv进行2倍上采样,随后两个输出相加。最后再接上stride为16的deconv层进行16倍上采样。得到第二个预测结果FCN-16s。
    • 同理,将pool3的输出接上 1 ∗ 1 1 * 1 11卷积与pool4以及conv7的输出组合起来,最后可以得到第三个预测结果FCN-8s。
2.2.3、训练细节
  1. 在整个网络上微调,包括预训练模型(如VGG)的全部参数。
  2. 作者实验结果表明,采样多个patch进行训练和直接使用原始图片训练,发现基本上没有太大差别,并且采样patch还更费时。所以,不进行采样,直接使用整幅图片进行训练。
  3. 样本均衡(class balancing),影响不大,不做处理。
  4. 数据增强,给训练数据加入镜像和抖动,性能没有太大提高。
2.2.4、度量指标

在这里插入图片描述

2.3、其他

在这里插入图片描述

  1. 为了给数据引入深度信息,作者最先训练了一个4通道输入(RGB-D)的网络。发现效果并没有好多少,可能是由于模型内具有此类信息的梯度较难传递。后来,尝试了对深度信息进行三位HHA编码,仅仅利用这部分的深度信息进行训练一个网络。另外使用RGB图像数据训练一个网络,最后将这两个网络的结果进行融合,效果有较大的提高。这个方法可能也可以用来处理RGB-D的一些其他任务。
  2. 其他上采样方法:关于FCN 论文中的 Shift-and-stitch 的详尽解释

3、资料

  1. 译文
  2. 关于FCN 论文中的 Shift-and-stitch 的详尽解释
  3. https://zhuanlan.zhihu.com/p/35370022
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hongbin_xu/article/details/83382678

智能推荐

FastDFS的配置、部署与API使用解读(4)FastDFS配置详解之Client配置-程序员宅基地

文章浏览阅读78次。一种方式是通过调用ClientGlobal类的初始化方法对配置文件进行加载,另一种是通过调用API逐一设置配置参数。后一种方式对于使用Zookeeper等加载属性的方式很方便。 1. 加载配置文件: StringconfigFileName="con...

解决torch.from_numpy报错 (ValueError)-程序员宅基地

文章浏览阅读3.9k次。在使用torch.from_numpy函数时报错:ValueError: At least one stride in the given numpy array is negative, and tensors with negative strides are not currently supported. (You can probably work around this by making a copy of your array with array.copy().)

内存分配方式,堆区,栈区,new/delete/malloc/free_java栈堆方法区常量区规则-程序员宅基地

文章浏览阅读1.1w次,点赞7次,收藏50次。1.内存分配方式内存分配方式有三种:[1]从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。[2]在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。[3]从堆上分配_java栈堆方法区常量区规则

GO-程序员宅基地

文章浏览阅读150次。2007年,受够了C++煎熬的Google首席软件工程师Rob Pike纠集Robert Griesemer和Ken Thompson两位牛人,决定创造一种新语言来取代C++, 这就是Golang。出现在21世纪的GO语言,虽然不能如愿对C++取而代之,但是其近C的执行性能和近解析型语言的开发效率以及近乎于完美的编译速度,已经风靡全球。特别是在云项目中,大部分都使用了Golang来开发,不得不说,...

封装集合Stream常用功能,让代码更简洁,不依赖任何第三方,复制即用_steam流封装集合-程序员宅基地

文章浏览阅读684次,点赞3次,收藏3次。提前最大家,牛年大吉,代码无Bugimport java.util.*;import java.util.function.*;import java.util.stream.Collectors;import java.util.stream.Stream;/** * @Author: 小胖 * @Version: 1.0 * @Description: 集合流工具类 * @Date: 2021/02/09 09:10 **/@SuppressWarnings("all")pu_steam流封装集合

BZOJ2085[Poi2010] Hamsters-程序员宅基地

文章浏览阅读491次。BZOJ2085[Poi2010] Hamsters Description Tz养了一群仓鼠,他们都有英文小写的名字,现在Tz想用一个字母序列来表示他们的名字,只要他们的名字是字母序列中的一个子串就算,出现多次可以重复计算。现在Tz想好了要出现多少个名字,请你求出最短的字母序列的长度是多少。 Input 输入:第一行n(1<=n<=

随便推点

博主教您如何免费获得斐讯K2—1200M千兆家用双频智能无线路由器wifi穿墙(亲测有效)...-程序员宅基地

文章浏览阅读519次。前言 上个月3月3号的时候,同事推荐说买可以0元购买斐讯K2路由器,看办公室人员有几个买了,博主也半信半疑的尝试买了一个,试试看是不是真的能返还钱 截止今天,钱终于退回来了。所以才敢给大家推荐,顺便给大家详细介绍下流程。 看斐讯官网描述,现在还有活动,京东上面斐赛克斯专卖店可以。..._斐讯k2如何连接千兆

seaborn可视化学习之categorial visualization-程序员宅基地

文章浏览阅读313次。seaborn是一个做数据可视化效果很棒的库。在看了官方tutorial之后,尝试用Iris鸢尾花数据集实践一下categorical visualization,也就是数据按类别进行可视化。首先介绍一下Iris鸢尾花数据集,内容摘自百度百科:Iris数据集是常用的分类实验数据集,由Fisher, 1936收集整理。“Iris也称鸢尾花卉数据集,是一类多重变量分析的数据集。数据集包含150个数...

ionic3 实现拍照与从相册选择功能-程序员宅基地

文章浏览阅读1.7k次。参考了很多网上的资料,但是每个人遇到的问题都不一样,我这里出现的问题,可能是node版本,还有插件版本之类的问题,问题以及解决方式可以看这个图。一、插件依赖引入 (1)配置相机在控制行输入命令:ionic cordova plugin add cordova-plugin-cameranpm install --save @ionic-native/camera在ap...

如何在交叉表中隐藏列-程序员宅基地

文章浏览阅读422次。下面介绍一下如何在交叉表中隐藏一列:例如:我要隐藏下面的交叉表中的这一列:首先,设置该列的box type属性为none:但是,设置之后表样却成了参差不齐的样子:这个时候,我们应该怎么办呢?第一步:隐藏交叉表左上角的表头,同样是将box type 设置成none:设置完成后,显示如下:然后再将一个Crosstab Space(或Crosstab Space with f...

iPhone电池健康度是什么_iphone电池健康度是什么意思-程序员宅基地

文章浏览阅读2k次。当你的iPhone特别耗电,使用没多久就开始低电量警告时,说明你的设备可能电池老化了,也就是到了该更换iPhone电池时候。但很多时候大家都会要求先看iPhone电池健康度,这又要怎么确认呢?iPhone循环次数怎么算?苹果对电池健康度描述为:“当经过500次完整充电循环后,电池蓄电量可维持达原有容量的80%”。也就是说,除了要注意循环次数以外,通过查询iPhone电池健康度即可得知设备的电池是否需要更换。需要注意的是,如果你的设备还在一年保修范围内可免费更换瑕疵电池。如果超过..._iphone电池健康度是什么意思

使用火焰图(FlameGraph)分析程序性能-程序员宅基地

文章浏览阅读1.9w次,点赞18次,收藏89次。火焰图概念火焰图(FlameGraph)是 svg 格式的矢量图,是先通过 perf 工具分析得到的结果,并将其生成的具有不同层次且支持互动的图片,看起来就像是火焰,这也正是它的名字的由来。其表现形式大概如下所示:需要有以下几点注意:纵向(Y 轴)高低不平,表示的是函数调用栈的深度。每一层都是一个函数。调用栈越深,火焰就越高,顶部就是正在执行的函数,下方都是它的父函数。横向(X 轴)表示该函数执行消耗的时间,横向上会按照字母顺序排序,而且如果是同样的调用会做合并(注意:如果一个函数在 X