CV02-FCN笔记
目录
一、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 上采样
特征提取也被称为下采样。上采样与其相反,将小的图像上采样变成大的图像。
上采样有三种方法
- Unpool反池化
- Interpolation差值
- 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笔记相关推荐
- 【FCN】Fully Convolutional Networks for Semantic Segmentation学习
论文翻译 又是一个看不懂原文,又看不懂翻译的论文. semantic segmentation 图像语义分割 就是预测每个像素所属的对象类别 语义分割是指像素级地识别图像,即标注出图像中每个像素所属的 ...
- 全卷积(FCN)论文阅读笔记:Fully Convolutional Networks for Semantic Segmentation
论文阅读笔记:Fully Convolutional Networks forSemantic Segmentation 这是CVPR 2015拿到best paper候选的论文. 论文下载地址:Fu ...
- 深度学习与TensorFlow:FCN论文学习笔记
七月 上海 | 高性能计算之GPU CUDA培训 7月27-29日三天密集式学习 快速带你入门阅读全文> 正文共1708个字,5张图,预计阅读时间8分钟. 这篇文章陆陆续续看了快两周,其中也遇 ...
- FCN(Fully Convolutional Network)全卷积网络笔记
FCN(Fully Convolutional Network)全卷积网络笔记 本文只是个人学习笔记 参考自: 全卷积网络FCN详细讲解(超级详细哦) 转置卷积(Transposed Convolut ...
- 【图像分割】FCN学习笔记小整理
目录 理论 代码 理论 CNN的平移不变性是什么? https://blog.csdn.net/ytusdc/article/details/107666902 基础的卷积.池化这些操作是满足 ...
- 论文笔记(FCN网络,语义分割):Fully Convolutional Networks for Semantic Segmentation
FCN论文笔记:Fully Convolutional Networks for Semantic Segmentation 语义分割模型结构时序: FCN SegNet Dilated Convol ...
- 全卷积神经网络(FCN)论文笔记
全卷积神经网络(FCN)论文笔记 Fully Convolutional Networks for Semantic Segmentation Abstract 卷积网络是一种功能强大的视觉模型,可以 ...
- Udacity机器人软件工程师课程笔记(二十九) - 全卷积网络(FCN)
全卷积网络(FCN) 1.全卷积神经网络介绍 FCN对图像进行像素级的分类,从而解决了语义级别的图像分割(semantic segmentation)问题.与经典的CNN在卷积层之后使用全连接层得到固 ...
- matlab 图像语义分割,笔记︱图像语义分割(FCN、CRF、MRF)、论文延伸(Pixel Objectness、)...
图像语义分割的意思就是机器自动分割并识别出图像中的内容,我的理解是抠图- 之前在Faster R-CNN中借用了RPN(region proposal network)选择候选框,但是仅仅是候选框,那 ...
- 最详细的FCN论文笔记
个人博客:http://www.chenjianqu.com/ 原文链接:http://www.chenjianqu.com/show-81.html 文:Jonathan Long,Evan She ...
最新文章
- Effective STL 50条有效使用STL的经验笔记
- java高级知识点_JAVA高级阶段知识点汇总
- 数据结构-常用的排序算法
- 前端学习(1389):多人管理项目9登录功能具体实现
- 商家笑了 设计师哭了,京东+英特尔的AI这招太绝
- 如何用Pygame写游戏(十一)
- python pip下载本地依赖包,并在离线环境中安装,并解决报错ERROR: Could not find a version that satisfies the requirement报错
- chrome 无法抓屏的问题
- 语义分割之PointRend论文与源码解读
- 《Java编程思想》读书笔记(14)
- [HNOI2013] 切糕
- 最小生成树:朴素版prim、kruskal(附例题)
- 离线语音控制系统 唤醒词.命令字
- 利用WebSphere Edge Server构建冷轧系统负载均衡
- 防止cookie 欺骗
- LncMirNet:基于核糖核酸序列深度学习预测LncRNA miRNA相互作用
- System.BadImageFormatException: 未能加载文件或程序集
- Google Chrome 谷歌浏览器如何设置在新标签页打开地址栏的网址
- 最近发现有很多人一直在问苹果ID双重认证怎么关闭。
- AI教育公司北极星获数千万Pre-A 轮融资,估值2.5亿元