目录

一、Convolutionalization 卷积化

二、Upsample 上采样

2.1 Unpool反池化

2.2 Interpolation差值

2.3 Transposed Convolution转置卷积

三、Skip Architecture

3.1 特征融合

3.2 裁剪


FCN原理及实践,记录一些自己认为重要的要点,以免日后遗忘。

原始思路是,去掉全连接层,全部改为卷积操作。保持图片spatial大小做Dense Prediction,就需要做same卷积,也就是加padding。如果一直保持图片spatial大小不变,那么计算量巨大。

FCN的思路是,特征提取阶段图像spatial减小,图像分类阶段把特征通过upsample方式放大到原来图像大小。再通过融合过程中的数据(保持位置信息)来提高推断的准确率。

FCN的三个重点:Convolutionalization卷积化、Upsample上采样、Skip Architecture。

参考实现:https://github.com/wkentaro/pytorch-fcn/tree/master/torchfcn/models

自己的实现:https://github.com/Ascetics/LaneSegmentation/tree/master/nets

一、Convolutionalization 卷积化

原有的分类网络,特征提取阶段用卷积,图像分类阶段用全连接。输入的spatial大小是固定的。

以VGG16为例,输入是固定大小3×224×224,经过5个阶段的卷积、池化(每次spatial缩小一半),最终得到512×7×7的输出。这个512×7×7做flatten以后变成一维向量,再做后面全连接操作,映射到4096个神经元。

FCN特征提取阶段用卷积,不用全连接层,这就是卷积化操作。注意,卷积化得到的是Coarse Output,这并不能将图像放大到原来的大小。FCN的输入是任意大小的。

用FCN改造VGG16,如果输入图像CHW=3×224×224,经过5个阶段的卷积、池化(每次spatial缩小一半),得到512×7×7的输出。然后,不连全连接层,改为继续连接卷积操作。卷积核是7×7的,out_channel=4096,那么经过这个卷积以后得到4096×1×1的输出。考虑维数为1的维度可以移除,这样结果就和VGG16的结果是一样的。

如果输入图像的spatial比224×224更大,那么经过上述过程,最终的输出是4096××,就变成了下图第二行的情况。输出就变成了一个heatmap,heatmap的大小就是×

如果输入图像的spatial比224×224更小,那么怎么保证最后输出不小于7×7,不影响后面的卷积操作呢?办法就是第一次卷积加padding=100,这样就保证输出不小于7×7。

二、Upsample 上采样

特征提取也被称为下采样。上采样与其相反,将小的图像上采样变成大的图像。

上采样有三种方法

  1. Unpool反池化
  2. Interpolation差值
  3. Transposed Convolution转置卷积

FCN里面上采样采用Transposed Convolution转置卷积。

2.1 Unpool反池化

Unpool反池化;torch的API为

torch.nn.MaxUnpool1d
torch.nn.MaxUnpool2d
torch.nn.MaxUnpool3d

反池化操作要依赖池化操作。在池化操作的时候,要记录池化数据的位置信息(torch.nn.MaxPool2d里面的return_indices=True),在根据这个位置信息(indices)将池化数据返回到原有位置,上采样的空白位置补0,也就是说反池化只能恢复部分信息。

2.2 Interpolation差值

Interpolation差值;torch的API为

torch.nn.functional.interpolate()

差值就是用已知的点来估计未知点的值。常用线性差值、双线性差值、最近差值等……其中,线性差值就是用两个点之间的斜率来估算中间插入的点。平面上用双线性差值,也就是用周边4个点来估计插入的点,在另外一篇双线性差值博客中单独分析。差值根据斜率计算,因此不需要机器学习。

2.3 Transposed Convolution转置卷积

Transposed Convolution转置卷积;torch的API为

torch.nn.ConvTranspose1d
torch.nn.ConvTranspose2d
torch.nn.ConvTranspose3d

如果想上采样N倍,有多种实现方式。其中一种,就是ConvTranspose2d的参数设置为kernel_size=2N,stride=N,就可以上采样N倍。下面举例就是上采样32倍。

upsample = nn.ConvTranspose2d(in_channels=num_class,out_channels=num_class,kernel_size=64,stride=32,bias=False
)

先想想卷积可以做全连接操作。如图,输入4×4,经过3×3的卷积,输出2×2。将4×4的输入变成一个16×1的向量,要输出是4×1的向量,那么就是在16×1的向量上乘以一个4×16的矩阵即可,矩阵的元素就是3×3卷积的权重。

那么,反过来,输入2×2,能否用一个3×3的卷积操作让输出4×4呢?把输入2×2变成4×1的向量,乘以16×4的矩阵,输出16×1的向量。这个16×4的矩阵元素就来自转置卷积核。

转置卷积只能恢复位置(维度)的大小,但是不能恢复信息,想要恢复信息要通过学习。

三、Skip Architecture

3.1 特征融合

实验发现,如果直接上采样效果不好,原因是多层卷积使位置信息损失太多。解决办法是,将丢失的信息补充进来。特征融合有多种方式,一种是在维度一致的情况直接相加,另一种是在spatial维度一致的情况下对channel进行concatenate。

这里就用到了Skip Architecture来做特征融合,用到的就是直接相加的方式。根据不同的融合内容可以有FCN32s、FCN16s、FCN8s和FCN4s等。这里的NNs表示上采样多少倍进行融合。

FCN32s就是不进行特征融合,直接将卷积结果上采样32倍。

FCN16s就是将卷积结果上采样2倍,加上1/16的卷积结果;融合以后再上采样16倍。

FCN8s就是将卷积结果上采样2倍,加上1/16的卷积结果;融合以后再上采样2倍,加上1/8的卷积结果;融合以后再上采样8倍。

以此类推……

实验结论是FCN8s的效果最好。为什么FCN4s融合了更浅层、信息损失更少的层,结果不应该比FCN4s更好吗?事实上,FCN4s较FCN8s的提高微乎其微,计算量却大大增加。

3.2 裁剪

特征融合实际上就是再做加法,张量加法要求维数一致才能相加。由于卷积、池化和上采样操作,导致融合时张量维数不一致的情况。为此需要对融合的部分进行剪裁,剪裁成维数一致。下表就记录了各层之间维度的计算关系。

表第一列是卷积层。

表第一行是表头,scale之前的表示每层参数,scale之后的表示上采样的模式和剪裁的大小。in表示输入图片大小;K表示该层卷积核大小;S表示该层stride;P表示该层padding大小;out表示该层卷积输出大小;pool表示该层池化输出大小;scale表示下采样是输入的多少分之一;32s、16s、8s表示FCN32s、FCN16s、FCN8s上采样输出大小,32s_crop、16s_crop、8s_crop表示上采样输出应剪裁大小(整数表示剪裁上采样,负数表示剪裁池化输出);

因为下采样只是一般卷积操作,下采样输出与输入的关系是

上采样采用转置卷积没有padding等,上采样输出与输入的关系是

我们以FCN16s为例,说明计算过程。

FCN16s下采样过程。已知下采样所有层的K、S、P、pool的大小,注意下一层输入的大小是上一层pool输出的大小,如果输入为i,经过8层卷积、池化等层,表中scale前面的内容都可以得到。

FCN16s上采样过程。输入,转置卷积上采样2倍,S=2,K=4,带入上采用公式得到输出是,spatial大小比pool输出小10。pool输出经过1×1卷积使channel与2倍上采样结果一致,pool输出两边各裁剪掉5。裁剪后入2倍上采样大小都是,相加融合。融合结果转置卷积上采样16倍,S=16,K=32,带入上采样公式输出是,spatial比输入i大54。因此,上采样结果两边各裁剪掉27。

  in K S P out pool scale 32s 32s_crop 16s 16s_crop 8s 8s_crop
conv1
conv2

↑×32

k=64

s=32

 

↑×16

k=32

s=16

 

↑×8

k=16

s=8

 
conv3    
conv4  
conv5  

↑×2

k=4

s=2

 

↑×2

k=4

s=2

 
fc6      
fc7      
fc8      

CV02-FCN笔记相关推荐

  1. 【FCN】Fully Convolutional Networks for Semantic Segmentation学习

    论文翻译 又是一个看不懂原文,又看不懂翻译的论文. semantic segmentation 图像语义分割 就是预测每个像素所属的对象类别 语义分割是指像素级地识别图像,即标注出图像中每个像素所属的 ...

  2. 全卷积(FCN)论文阅读笔记:Fully Convolutional Networks for Semantic Segmentation

    论文阅读笔记:Fully Convolutional Networks forSemantic Segmentation 这是CVPR 2015拿到best paper候选的论文. 论文下载地址:Fu ...

  3. 深度学习与TensorFlow:FCN论文学习笔记

    七月 上海 | 高性能计算之GPU CUDA培训 7月27-29日三天密集式学习  快速带你入门阅读全文> 正文共1708个字,5张图,预计阅读时间8分钟. 这篇文章陆陆续续看了快两周,其中也遇 ...

  4. FCN(Fully Convolutional Network)全卷积网络笔记

    FCN(Fully Convolutional Network)全卷积网络笔记 本文只是个人学习笔记 参考自: 全卷积网络FCN详细讲解(超级详细哦) 转置卷积(Transposed Convolut ...

  5. 【图像分割】FCN学习笔记小整理

    目录 理论 代码 理论     CNN的平移不变性是什么? https://blog.csdn.net/ytusdc/article/details/107666902 基础的卷积.池化这些操作是满足 ...

  6. 论文笔记(FCN网络,语义分割):Fully Convolutional Networks for Semantic Segmentation

    FCN论文笔记:Fully Convolutional Networks for Semantic Segmentation 语义分割模型结构时序: FCN SegNet Dilated Convol ...

  7. 全卷积神经网络(FCN)论文笔记

    全卷积神经网络(FCN)论文笔记 Fully Convolutional Networks for Semantic Segmentation Abstract 卷积网络是一种功能强大的视觉模型,可以 ...

  8. Udacity机器人软件工程师课程笔记(二十九) - 全卷积网络(FCN)

    全卷积网络(FCN) 1.全卷积神经网络介绍 FCN对图像进行像素级的分类,从而解决了语义级别的图像分割(semantic segmentation)问题.与经典的CNN在卷积层之后使用全连接层得到固 ...

  9. matlab 图像语义分割,笔记︱图像语义分割(FCN、CRF、MRF)、论文延伸(Pixel Objectness、)...

    图像语义分割的意思就是机器自动分割并识别出图像中的内容,我的理解是抠图- 之前在Faster R-CNN中借用了RPN(region proposal network)选择候选框,但是仅仅是候选框,那 ...

  10. 最详细的FCN论文笔记

    个人博客:http://www.chenjianqu.com/ 原文链接:http://www.chenjianqu.com/show-81.html 文:Jonathan Long,Evan She ...

最新文章

  1. Effective STL 50条有效使用STL的经验笔记
  2. java高级知识点_JAVA高级阶段知识点汇总
  3. 数据结构-常用的排序算法
  4. 前端学习(1389):多人管理项目9登录功能具体实现
  5. 商家笑了 设计师哭了,京东+英特尔的AI这招太绝
  6. 如何用Pygame写游戏(十一)
  7. python pip下载本地依赖包,并在离线环境中安装,并解决报错ERROR: Could not find a version that satisfies the requirement报错
  8. chrome 无法抓屏的问题
  9. 语义分割之PointRend论文与源码解读
  10. 《Java编程思想》读书笔记(14)
  11. [HNOI2013] 切糕
  12. 最小生成树:朴素版prim、kruskal(附例题)
  13. 离线语音控制系统 唤醒词.命令字
  14. 利用WebSphere Edge Server构建冷轧系统负载均衡
  15. 防止cookie 欺骗
  16. LncMirNet:基于核糖核酸序列深度学习预测LncRNA miRNA相互作用
  17. System.BadImageFormatException: 未能加载文件或程序集
  18. Google Chrome 谷歌浏览器如何设置在新标签页打开地址栏的网址
  19. 最近发现有很多人一直在问苹果ID双重认证怎么关闭。
  20. AI教育公司北极星获数千万Pre-A 轮融资,估值2.5亿元

热门文章

  1. oracle存储空间管理,Oracle存储空间管理
  2. hibernate 复合主键 根据主键删除_hibernate封装Utils工具类
  3. 【js】实现分页查询操作的步骤
  4. 【jquery】$.each的使用方法
  5. 软件测试实验--性能测试工具LoadRunner
  6. Java中的Map集合遍历总结(详尽版)
  7. html脱机不显示图片,Python绘图脱机图表嵌入HTML(不工作)
  8. 微信小程序用户未授权bug解决方法,微信小程序获取用户信息失败解决方法
  9. 【iOS】NSDate分类,获得中国农历
  10. 洛谷 P1816 忠诚